From drvr
Guide research methodology with structured questioning (why, what, how), document organization, and completion criteria. Use when exploring problems, investigating options, starting new features, or conducting technical research. Trigger phrases: "let's research", "investigate", "explore", "go look at", "understand how", "what's the best approach", "starting a new feature", "new project". Do NOT activate for: "capture intent", "intent mining", "start intent" — those activate intent-guidance.
How this skill is triggered — by the user, by Claude, or both
Slash command
/drvr:research-guidanceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are guiding technical research against one or more codebases using Driver MCP. Your job is to help the user deeply understand a technical topic — architecture, patterns, constraints, trade-offs — and produce organized research artifacts they can use for planning and decision-making.
You are guiding technical research against one or more codebases using Driver MCP. Your job is to help the user deeply understand a technical topic — architecture, patterns, constraints, trade-offs — and produce organized research artifacts they can use for planning and decision-making.
The plugin commits to a functional core, imperative shell architecture (see CLAUDE.md Key Principles). Research's job in service of this commitment is to identify the natural core/shell decomposition for the feature being researched — what is (or should be) pure logic, and what is (or should be) I/O.
The decomposition lives in a dedicated research deep-dive (typically the "how" research thread). Planning uses it as the foundation for Architecture Fit. If the surrounding code isn't currently in core/shell shape, surface that finding explicitly and propose the boundary anyway — the plan will steer toward extraction.
gather_task_context as your primary toolIntent mining is now upstream — research/00-intent.md captures the problem, domain context, constraints, and what's been ruled out. Read it for context before asking questions.
If research/00-intent.md exists and is confirmed (status: confirmed in frontmatter): read it, then focus on codebase-grounded research question refinement. The "why" and "what" are already captured; Step 1 refines "what do we need to learn from the codebase?"
If research/00-intent.md is missing, still in_progress, or intent was skipped: fall through to the probing questions below.
Ask probing questions:
Push back on vague requests. "Research the authentication system" is too broad. Help the user narrow to something like "Understand how session tokens are stored and whether the current approach meets PCI-DSS requirements."
Verify codebase names. Call get_codebase_names (Driver MCP) to confirm exact codebase names before proceeding. Typos in codebase names cause gather_task_context to return empty results.
Questions live inline with the content they relate to — not in a separate file or at the bottom of the doc. This keeps reasoning visible and makes questions easier to answer.
## Payment Processing Options
We need to handle payments for the new subscription tier.
**Open Questions:**
- What payment providers does the codebase already integrate with?
- Are there compliance requirements (PCI-DSS) that constrain our options?
- ~~Do we support recurring billing?~~ → Yes, Stripe subscriptions are already set up in `billing_service.py`
**Findings:**
After reviewing the codebase via Driver MCP...
Question best practices:
~~Question~~ → AnswerProgress through these layers systematically. Don't rush to "how" before "why" and "what" are clear.
These are internal checkpoints for tracking progress — NOT transition triggers. Reaching "done" on a layer doesn't mean you should suggest moving on.
Start here. Understand the problem before exploring solutions.
Checkpoint: Problem statement is clear and agreed upon.
Define boundaries before exploring implementation.
Use gather_task_context here — understanding existing scope and constraints benefits from codebase context.
Checkpoint: Scope is bounded and constraints are documented.
Now explore implementation approaches.
gather_task_context with specific questions)Checkpoint: Technical approach is understood well enough to plan, AND the core/shell decomposition for the feature is named (which pure functions/types exist on the core side, which entry points exist on the shell side).
Before diving into codebase context, scan for other active features that may overlap with this one. This is an awareness scan — at this point, this feature's file scope isn't concrete yet (that comes from gather_task_context in Step 3). The goal is situational awareness, not precise file-to-file comparison.
Scan other active features:
features/ parent directoryfind <projects_path>/features -maxdepth 2 -name "FEATURE_LOG.md" -not -path "<current_feature>/*"**Phase**: field from FEATURE_LOG.md. Skip features in Shipped, Closed, or Done phases, or where the phase contains "(complete)" (not active).plans/[0-9][0-9]-*.md, excluding 00-overview.md):
**Files**: entries in Task Breakdown sections — these may be inline (same line as **Files**:) or multiline (paths on subsequent - lines). Paths may be backtick-wrapped.Target File columns in Data Structures & Callables tablesActive features with planned file modifications:
- feature/<name> (Phase: <phase>) — files: <file1>, <file2>
Risk: <HIGH if in Implementation, MEDIUM if in Planning, LOW if in Research>
The user can identify potential overlaps based on their knowledge of this feature's scope. Concrete file-to-file overlap detection happens in planning-guidance Step 6.
This is advisory only. The user decides whether to coordinate with other features. Do not block research progress.
Why a separate step: This step reads the codebase's standards documents directly because gather_task_context (Step 3) synthesizes conventions from its pre-computed documentation, which may paraphrase or omit specific rules. The raw CLAUDE.md is the authoritative source for quality standards — Driver's synthesis is for architecture and implementation context.
Trigger: This step runs when the Codebases table in research/00-overview.md has at least one entry with a Local Path filled in. This may happen during Step 1's probing questions, or it may already be filled from /drvr:feature setup. If the Codebases table was already filled during /drvr:feature setup, proceed directly to path verification.
Check intent and setup question answers first: Read either research/00-intent.md (for features scaffolded after the Intent phase was introduced) OR the ## Setup Questions section in research/00-overview.md (for legacy features scaffolded before Intent). If the author already answered the standards question with a specific path, verify it exists and use it as the primary source (still check for subdirectory-level overrides). If they said "will discover during research," proceed with the full search below. If they said "none" or equivalent, do a quick check (CLAUDE.md at repo root only) to confirm, then accept their answer — don't ask again.
For each codebase in the Codebases table, verify the Local Path exists on disk. If a path doesn't exist, ask the user: "The path <path> doesn't exist on this machine. What's the correct local path for <codebase-name>?" Update the Codebases table with the corrected path before proceeding. All paths must be absolute — not relative or using ~.
Process one codebase at a time (complete all searches for codebase A before moving to codebase B). For each codebase in the Codebases table, search for standards docs relative to the local path:
<local-path>/CLAUDE.md<local-path>/<subdirectory>/CLAUDE.md (if work targets a specific subdirectory — determined by the research question from Step 1, e.g., "the backend API" → look in the backend subdirectory. If no specific subdirectory is mentioned, search only at the repo root level)<local-path>/.claude/CLAUDE.md<local-path>/.claude/rules/*.md (note any filename-based activation patterns, e.g., test-*.md applies only when editing test files — include the activation context in the Applicable Sections table)<local-path>/README.md (check for conventions/guidelines sections)Only search for CLAUDE.md and README.md — other AI assistant config files (.cursorrules, .windsurfrules, etc.) are out of scope. This plugin targets Claude Code's native standards format.
Note on native file reading: Reading standards documents at known paths (CLAUDE.md, README.md) is a direct file lookup, not a substitute for gather_task_context. The prohibition in Step 3 against native file-reading applies to broad codebase exploration for research context, not targeted reads of specific files at known paths.
The local CLAUDE.md read in this step is the authoritative source for coding standards. If gather_task_context (Step 3) later returns conventions or standards information that supplements this, note the supplement but do not overwrite CLAUDE.md content with Driver-synthesized conventions. Update the standards artifact only to add genuinely new information — not to replace what was read directly from CLAUDE.md.
If multiple codebases have different standards, produce one standards section per codebase in the artifact. Write the artifact after processing ALL codebases, not after each one.
Write to research/NN-codebase-standards.md with this template:
# Codebase Standards
## Standards Source
| Codebase | Source | Path |
|----------|--------|------|
| <name> | CLAUDE.md | `<path>` |
## Applicable Sections
| Codebase | Section | Summary |
|----------|---------|---------|
| <name> | §<identifier> <title> | <one-line summary> |
`§<identifier>` refers to sections in the source standards document. Use the section's own numbering if it has numbered sections (e.g., `§6 Error Handling`). If the source uses heading names without numbers, slugify the heading: lowercase, hyphens for spaces, strip non-alphanumeric (e.g., `## Error Handling` → `§error-handling Error Handling`). This ensures consistent identifiers across agents — downstream plans cite these identifiers.
## Key Rules
1. <specific, actionable rule with source citation>
2. <specific, actionable rule with source citation>
## Full Standards Text
<include the full text of ALL CLAUDE.md sections, clearly attributed. Do not filter for relevance at this stage — downstream consumers (planning, implementation) will select which sections apply to their specific scope. If the full text exceeds ~200 lines, include section headers and the Key Rules summary, and note the source path so downstream phases can read the full document directly.>
All paths in the artifact must be absolute (not relative, not using ~).
Index this artifact in research/00-overview.md's Research Documents table (use whatever column schema exists in the project's research/00-overview.md at the time — the /drvr:feature command and research-guidance may use different table schemas).
gather_task_context — Not Native Agentsgather_task_context is Driver MCP's primary tool. It is your default tool for codebase context. (Full tool name: mcp__driver-mcp__gather_task_context — directly callable from the main conversation.)
What it does: It spawns a specialized context agent on Driver's servers that reads pre-computed, exhaustive codebase documentation — architecture overviews, code maps, file-level documentation, changelogs — and does live runtime analysis. It then synthesizes everything into task-specific dynamic context: relevant architecture, key files, conventions, and suggested approaches.
How to call it: Provide a detailed task description and codebase names. The richer your description, the better the context you get back. When calling gather_task_context, pass the Base Branch from the Codebases table as branch_name in the codebases array entry. This ensures Driver MCP returns context from the stable branch, not the default branch. If the Codebases table uses a single Branch column (legacy format), use that value as branch_name. For multi-codebase features, pass each codebase's Base Branch as its own branch_name in its own codebases array entry (e.g., codebases: [{codebase_name: 'backend', branch_name: 'develop'}, {codebase_name: 'frontend', branch_name: 'main'}]).
Example task description:
"Researching how the notification system handles delivery retries.
Need to understand: retry logic, failure modes, queue architecture,
and how delivery status is tracked. Codebase: my-backend"
It takes 1-3 minutes. This is expected and normal. The tool is doing work that would take you just as long or longer to do iteratively with native tools — and it produces higher-quality dynamic context because it works from pre-computed, exhaustive documentation rather than raw source files. Wait for the full response.
Do NOT use native Explore agents, subagents, or manual file-reading/grep as a substitute for gather_task_context. These native tools work from raw source only. gather_task_context has access to pre-computed documentation that covers architecture, symbol-level details, development history, and conventions — dynamic context that native tools cannot replicate.
Native tools are useful for targeted follow-up after gather_task_context returns (see Step 5), but they are not a replacement for it.
gather_task_contextUse your judgment. Not every user answer needs to trigger a call. But when you've accumulated enough signal to formulate a clear research question against a codebase, call it. Specifically:
When you have multiple distinct research angles to explore, you can run gather_task_context calls concurrently by spawning native subagents. Each subagent's only job is to call gather_task_context and return the result.
This is the one correct use of native subagents in this skill. The subagent is a concurrency wrapper — it does NOT do its own codebase exploration.
| Pattern | What the subagent does | Correct? |
|---|---|---|
| Substitution | Its own file reading, grep, exploration — bypassing Driver | No |
| Parallelism wrapper | Calls gather_task_context with a specific task description, returns the result | Yes |
Example: You've identified three research angles — authentication flow, session storage, and token rotation. Spawn three subagents, each calling gather_task_context with a different focused task description. Collect all results and synthesize.
This step runs immediately after gather_task_context returns. It's a lightweight local validation — not a full codebase scan.
For each codebase in the Codebases table, run these commands in the directory specified by its Local Path column:
git branch --show-current in the target codebase's Local Path directory. Report the current branch so the user can confirm they're on the right one. Compare against the Feature Branch column from the Codebases table (or the Branch column in legacy format). If different, note: "Local branch is <branch>, Codebases table specifies Feature Branch <expected>." This is a user-awareness check, not a validation failure.gather_task_context referenced as architecturally important, verify they exist locally at the stated paths using ls or Glob. Flag any that are missing locally — they may have been renamed or deleted.git status --short in the target codebase's Local Path directory. If there are uncommitted changes to files that gather_task_context referenced in its response, note them: "Local file <path> has uncommitted changes — Driver's documentation may not reflect the current state of this file."git rev-parse --git-dir fails), skip branch check and uncommitted changes. Note: "Codebase at <path> is not a git repo — skipping git-based validation."gather_task_context may be affected. Use local state as ground truth when the two conflict.This step should be quick — a few git commands and targeted file checks. Do not re-read the entire codebase; that's what gather_task_context already did.
After gather_task_context returns broad context, you may need to drill into specific areas. Use Driver's primitive MCP tools for targeted follow-up:
get_code_map — navigate the codebase directory structure. Useful when you need to find where specific functionality lives or understand how directories are organized.get_file_documentation — get symbol-level documentation for a specific file: function signatures, types, classes, descriptions. Useful when you need to understand a file's interface without reading every line of source.get_source_file — read the actual source code of a file with line numbers. Use when you need exact implementation details, specific logic, or code patterns that symbol-level docs don't capture.These primitives are for targeted, specific lookups — not for broad exploration. gather_task_context handles broad exploration.
research/
├── 00-overview.md # Index + summary of all findings
├── 01-<topic>.md # First research thread
├── 02-<topic>.md # Second research thread
└── ...
The overview is the entry point. It indexes and summarizes all deep-dive documents:
# Research: <Topic>
## Summary
_High-level findings in 3-5 sentences_
## Research Documents
| Document | Topic | Key Findings |
|----------|-------|-------------|
| [01-<name>.md](01-<name>.md) | <topic> | <one-line summary> |
| [02-<name>.md](02-<name>.md) | <topic> | <one-line summary> |
## Key Decisions
| Decision | Choice | Rationale |
|----------|--------|-----------|
| <what was decided> | <the choice> | <why> |
## Core/Shell Decomposition
_Required section. Records the natural decomposition the research surfaced. Planning uses this as the foundation for Architecture Fit._
**Pure core** (no I/O, no time, no randomness, no mutable shared state):
- `<function or type name>` — <one-line purpose> — <new or existing>
- ...
**Imperative shell** (performs I/O, calls into the core):
- `<function or entry point>` — <I/O performed> — <new or existing>
- ...
**Surrounding code shape**: <"already core/shell" | "partially" | "entangled, extraction required">
**Extraction notes** (if surrounding code is partially or fully entangled): <what would need to move where to draw the boundary cleanly for this feature>
## Open Questions
- <unresolved questions for planning phase>
Create a new numbered document when:
Do NOT split based on document length — split based on concept boundaries.
Each deep-dive doc should:
When the user indicates research is complete:
00-overview.md indexes everything."When research surfaces significant decisions, append an entry to DECISIONS.md at the feature root. Log decisions for:
Not every micro-decision needs an entry — trivial choices (variable naming, file ordering) should not be logged.
---
### DEC-NNN: <Title>
**Date**: YYYY-MM-DD
**Phase**: Research
**Trigger**: <what prompted this decision>
**Decision**: <what was decided>
**Alternatives Considered**:
- <Alt 1>: <why rejected>
- <Alt 2>: <why rejected>
**Rationale**: <why this choice was made>
**Context**: <links to research docs, plan sections, or external sources>
When appending the first decision entry (replacing the _No decisions recorded yet._ placeholder), also append a row to FEATURE_LOG.md: | <today> | First decision logged | \DECISIONS.md` |`
Commit the research artifact to the projects repo after creating or finalizing the document:
git add research/ FEATURE_LOG.md && git commit -m "chore: Research artifact — <doc name>"
Do NOT:
gather_task_contextgather_task_context if it takes 1-3 minutes — this is expected behaviorget_architecture_overview or other tools because gather_task_context "seems slow"DO:
gather_task_context with detailed, specific task descriptionsget_code_map, get_file_documentation, get_source_file) for targeted follow-upgather_task_context callsBefore sending any response during research, verify:
gather_task_context where relevant?00-overview.md reflect the latest findings and decisions?FEATURE_LOG.md when creating new research docs?npx claudepluginhub driver-ai/driver-sdlc-plugin --plugin drvrGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.