From claudecode-research-harness-workflow
Generates a single-file HTML plan brief for non-engineer stakeholders before implementation. Searches project memory for past decisions and patterns, then renders understanding, options, risks, and acceptance criteria.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claudecode-research-harness-workflow:harness-plan-brief [task-description][task-description]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
A skill for non-engineer clients and producers that presents Claude's plan for an upcoming task as a **single HTML page**.
A skill for non-engineer clients and producers that presents Claude's plan for an upcoming task as a single HTML page. Used at cognitive load peak (1): the plan comprehension stage.
| Scope | This skill's responsibility |
|---|---|
| Search | Current project only (always specify project: <current>, strict_project: true) |
| Cross-project | Not performed (opt-in via --cross-project-group <name> flag from Phase 65.3 onward) |
| Write | Not performed (memory write after Plan Brief approval is the responsibility of plan-brief-record-decision.sh) |
| Confidence calculation | Delegated to scripts/plan-brief-compile.sh implemented in 65.1.3 |
Pass the user's request as the [task-description] argument.
If no argument is provided, accept interactively.
| Output | Path | Format |
|---|---|---|
| Plan Brief HTML | .claude/state/views/plan-brief-<timestamp>.html | Self-contained HTML (no server, no JS framework) |
| Plan Brief context JSON | .claude/state/views/plan-brief-<timestamp>.context.json | plan-brief-context.v1 schema |
plan-brief-context.v1{
"schema": "plan-brief-context.v1",
"user_request": "string (original user request text)",
"my_understanding": "string (Claude's understanding in 1-3 paragraphs)",
"options": [
{ "name": "string", "summary": "string", "pros": ["string"], "cons": ["string"] }
],
"risks": [
{ "kind": "string", "severity": "info|warn|critical", "description": "string", "mitigation": "string" }
],
"acceptance_criteria": [
{ "id": "string", "description": "string", "verifiable_by": "string" }
],
"tdd_required": "yes|no|skip:<reason>",
"confidence": 0,
"confidence_evidence": ["string"],
"related_decisions": [
{ "id": "string", "title": "string", "relevance": "string" }
],
"similar_past_plans": [
{ "archive_path": "string", "phase": "string", "outcome": "cc:done|cc:WIP|cc:TODO|skipped", "relevance": "string" }
],
"project": "string",
"generated_at": "ISO8601"
}
Full schema: see schemas/plan-brief-context.v1.schema.json.
When the skill is invoked, Claude operates in the following steps.
PROJECT_NAME="$(basename "$(git rev-parse --show-toplevel)")"
Use current as the default if PROJECT_NAME is empty (outside git).
When the --cross-project-group <name> flag is absent (default behavior):
Call mcp__harness__harness_mem_search with the following parameters:
project: <PROJECT_NAME>
strict_project: true
query: <user request>
expand_links: true
limit: 5
Important: The
projectparameter is required. Never pass an empty string ornull. Specifystrict_project: trueand never perform cross-project searches. You may filter bytagsfordecision/pattern, butprojectis fixed.
Retrieve up to 5 similar cases from past decisions (D1-D41) / patterns (P1-P33) / 28 Plans archive entries.
Only when the --cross-project-group <name> flag is present:
Follow D43 Option α (MCP N-call) to perform cross-project search:
# (a) Resolve group → member projects (yaml SSOT)
MEMBERS_JSON="$(bash scripts/load-cross-project-groups.sh --group "<name>" 2>/dev/null)" || {
echo "ERROR: cross-project group not found: <name>" >&2
exit 1
}
# MEMBERS_JSON is a JSON array in ["proj1","proj2",...] format
If MEMBERS_JSON is [] (empty array), show a warning and fall back to default single project search.
If MEMBERS_JSON is non-empty, issue one MCP search per member project:
for each project in MEMBERS_JSON:
mcp__harness__harness_mem_search(
project: <member>,
strict_project: true,
query: <user request>,
expand_links: true,
limit: 5
)
Merge, dedupe (by id), and sort by relevance_score descending on the client side, then narrow to a maximum of 5 entries. Note that the total number of calls increases (e.g., 5 calls if the group has 5 projects), so latency will increase.
Basis for D43 Decision 1: The MCP tool schema does not expose
projects: [array]orstrict_project: false, so client-side N-calls are the only option for cross-project search. For details, see "Phase 65.3 Implementation Decisions (D43)" in.claude/rules/cross-repo-handoff.md.
Cross-project results must pass through Layer 2/3 (Phase 65.3.2-65.3.4) redaction:
bash scripts/render-html.sh ... --with-redaction when rendering HTMLUse scripts/plan-brief-compile.sh (implemented in Phase 65.1.3) to construct JSON conforming to the plan-brief-context.v1 schema from the mem search results.
Until 65.1.3 is implemented, Claude builds it directly with jq:
jq -n \
--arg req "$USER_REQUEST" \
--arg proj "$PROJECT_NAME" \
--arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
'{
schema: "plan-brief-context.v1",
user_request: $req,
my_understanding: "(not yet started)",
options: [],
risks: [],
acceptance_criteria: [],
confidence: 0,
confidence_evidence: ["(stub) calculation logic to be implemented in 65.1.3"],
tdd_required: "no",
related_decisions: [],
similar_past_plans: [],
project: $proj,
generated_at: $ts
}' > "$CONTEXT_JSON"
Call scripts/render-html.sh (Phase 65.1.1) with templates/html/plan-brief.html.template:
Display the TDD judgment as a single line in the HTML.
The format must be one of: tdd_required: yes, tdd_required: no, or tdd_required: skip:<reason>.
bash scripts/render-html.sh \
--template plan-brief \
--data "$CONTEXT_JSON" \
--out "$HTML_OUT"
OS-specific dispatch via scripts/plan-brief-open.sh:
bash scripts/plan-brief-open.sh "$HTML_OUT"
When the BROWSER=true env is set (CI environment), opening is skipped and only the path is output via printf.
Confirm "Is it okay to proceed with implementation based on this understanding?"
Memory write after approval is the responsibility of a separate skill (plan-brief-record-decision.sh in Phase 65.1.4).
| Failure | Behavior |
|---|---|
mcp__harness__harness_mem_search unreachable | Show warning and continue with related_decisions / similar_past_plans as empty arrays |
git rev-parse --show-toplevel fails | Continue with PROJECT_NAME=current |
render-html.sh fails | Output error to stderr and exit 1 |
plan-brief-open.sh fails | Only output HTML path to stdout and exit 0 (browser open is best-effort) |
scripts/render-html.sh (Phase 65.1.1) — HTML template enginescripts/plan-brief-compile.sh (Phase 65.1.3) — context compilationscripts/plan-brief-record-decision.sh (Phase 65.1.4) — approval memory writeharness-accept skill (Phase 65.2.1) — acceptance decision skill (counterpart structure)harness-progress skill (Phase 65.4.1) — progress management skill (counterpart structure)npx claudepluginhub maxwell2732/claudecode-research-harness-workflow --plugin claudecode-research-harness-workflowGenerates a single-file Plan Brief HTML that summarizes understanding, options, risks, and acceptance criteria for non-engineer stakeholders before implementation. Searches project memory for past decisions and patterns, then renders an artifact that can be opened in a browser.
Loads plan-review.md to review project plans, architecture decisions, and implementation strategies before coding begins.
Creates structured plans for multi-step tasks including software features, implementations, research, or projects. Deepens plans via interactive sub-agent reviews.