Imported from blackrabbit74/michele-ai-work-system-builder (
skills/subagent-driven-harness-development/SKILL.md). Install upstream withnpx skills add blackrabbit74/michele-ai-work-system-builder --skill subagent-driven-harness-development. Copyright stays with the author.
Subagent-Driven Harness Development
Execute a harness build plan by dispatching a fresh implementer subagent (the role writing-harness-plans calls the harness builder) per task, a task review (spec compliance + harness quality) after each, and a broad whole-branch harness review at the end.
Why subagents: You delegate tasks to specialized agents with isolated context. By precisely crafting their instructions and context, you ensure they stay focused and succeed at their task. They should never inherit your session's context or history — you construct exactly what they need. This also preserves your own context for coordination work.
Core principle: Fresh subagent per task + task review (spec + quality) + broad final review = high-quality harness, fast iteration
Narration: between tool calls, narrate at most one short line — the ledger and the tool results carry the record.
Continuous execution: Do not pause to check in with your human partner between tasks. Execute all tasks from the build plan without stopping. The only reasons to stop are: BLOCKED status you cannot resolve, ambiguity that genuinely prevents progress, or all tasks complete. "Should I continue?" prompts and progress summaries waste their time — they asked you to execute the plan, so execute it.
When to Use
digraph when_to_use {
"Have harness build plan?" [shape=diamond];
"Tasks mostly independent?" [shape=diamond];
"Stay in this session?" [shape=diamond];
"subagent-driven-harness-development" [shape=box];
"executing-harness-plans" [shape=box];
"Manual execution or brainstorm first" [shape=box];
"Have harness build plan?" -> "Tasks mostly independent?" [label="yes"];
"Have harness build plan?" -> "Manual execution or brainstorm first" [label="no"];
"Tasks mostly independent?" -> "Stay in this session?" [label="yes"];
"Tasks mostly independent?" -> "Manual execution or brainstorm first" [label="no - tightly coupled"];
"Stay in this session?" -> "subagent-driven-harness-development" [label="yes"];
"Stay in this session?" -> "executing-harness-plans" [label="no - parallel session"];
}
vs. Executing Harness Plans (parallel session):
- Same session (no context switch)
- Fresh subagent per task (no context pollution)
- Review after each task (spec compliance + harness quality), broad review at the end
- Faster iteration (no human-in-loop between tasks)
The Process
digraph process {
rankdir=TB;
subgraph cluster_per_task {
label="Per Task";
"Dispatch implementer subagent (./implementer-prompt.md)" [shape=box];
"Implementer subagent asks questions?" [shape=diamond];
"Answer questions, provide context" [shape=box];
"Implementer subagent builds artifacts, runs evals, commits, self-reviews" [shape=box];
"Write diff file, dispatch task reviewer subagent (./task-reviewer-prompt.md)" [shape=box];
"Task reviewer reports spec ✅ and quality approved?" [shape=diamond];
"Dispatch fix subagent for Critical/Important findings" [shape=box];
"Mark task complete in todo list and progress ledger" [shape=box];
}
"Read build plan, note context and global constraints, create todos" [shape=box];
"More tasks remain?" [shape=diamond];
"Dispatch final harness reviewer subagent (../requesting-harness-review/harness-reviewer.md)" [shape=box];
"Use meta-harness:finishing-a-harness-branch" [shape=box style=filled fillcolor=lightgreen];
"Read build plan, note context and global constraints, create todos" -> "Dispatch implementer subagent (./implementer-prompt.md)";
"Dispatch implementer subagent (./implementer-prompt.md)" -> "Implementer subagent asks questions?";
"Implementer subagent asks questions?" -> "Answer questions, provide context" [label="yes"];
"Answer questions, provide context" -> "Dispatch implementer subagent (./implementer-prompt.md)";
"Implementer subagent asks questions?" -> "Implementer subagent builds artifacts, runs evals, commits, self-reviews" [label="no"];
"Implementer subagent builds artifacts, runs evals, commits, self-reviews" -> "Write diff file, dispatch task reviewer subagent (./task-reviewer-prompt.md)";
"Write diff file, dispatch task reviewer subagent (./task-reviewer-prompt.md)" -> "Task reviewer reports spec ✅ and quality approved?";
"Task reviewer reports spec ✅ and quality approved?" -> "Dispatch fix subagent for Critical/Important findings" [label="no"];
"Dispatch fix subagent for Critical/Important findings" -> "Write diff file, dispatch task reviewer subagent (./task-reviewer-prompt.md)" [label="re-review"];
"Task reviewer reports spec ✅ and quality approved?" -> "Mark task complete in todo list and progress ledger" [label="yes"];
"Mark task complete in todo list and progress ledger" -> "More tasks remain?";
"More tasks remain?" -> "Dispatch implementer subagent (./implementer-prompt.md)" [label="yes"];
"More tasks remain?" -> "Dispatch final harness reviewer subagent (../requesting-harness-review/harness-reviewer.md)" [label="no"];
"Dispatch final harness reviewer subagent (../requesting-harness-review/harness-reviewer.md)" -> "Use meta-harness:finishing-a-harness-branch";
}
Harness Generation Model — Stamp the Core, Fill the Domain Layer
Before the per-task loop below touches a single file, know what kind of building this is. A generated harness is not authored skill-by-skill from a blank page — it is stamped, then filled:
-
Stamp the fixed core. Copy
templates/generated-harness-skeleton/into the new harness package verbatim. This brings the runtime (hooks,.claude-plugin/plugin.json,.claude-plugin/marketplace.json), the bootstrapusing-__domain__-harnessskill, and the ~10 generic core skill templates (__domain__-review,acceptance-driven-__domain__-testing,finalizing-__domain__,subagent-driven-__domain__-execution,systematic-__domain__-debugging,verification-before-completion,writing-__domain__-plans,__domain__-suitability-gate,final-output-definition, and their prompts/scripts). Then stamp-substitute two things and nothing else:- (a) Rename every
__domain__-named directory to the actual domain slug (e.g.__domain__-intake-and-brainstormingbecomessales-opportunity-intake-and-brainstorming). The slug token is__domain__(not<domain>) precisely because it appears in file and directory names:<and>are illegal on Windows, so an angle-bracket token in a path makesgit clonefail its checkout on Windows. Keep any placeholder that can land in a filename free of< > : " | ? *. - (b) Replace every placeholder throughout the copied tree — the domain
set (
<DOMAIN>,<ARTIFACT>,<USER>,<HARNESS_NAME>) and the manifest set the two.claude-plugin/*.jsonfiles require (<AUTHOR_NAME>,<AUTHOR_EMAIL>,<HARNESS_REPOSITORY_URL>,<LICENSE>). After stamping, no<…>token may remain inplugin.jsonormarketplace.json.
The fixed core's control structure — its gates, its review loops, its red flags — is not re-authored. Only names and placeholders change. If a task asks you to "improve" or "rewrite" one of these stamped skills instead of renaming/substituting it, that is a plan defect: raise it, do not silently author around the skeleton.
- (a) Rename every
-
Fill the domain layer. For each domain intermediate skill that
workflow-transfer-mappingexpanded in the build plan, author it by fillingtemplates/deliverable-skill-template.md— Output Contract, Edge Rubric, Worked Example, Reject Conditions. Never invoke a skill-authoring skill to do this — one does not exist in Michele anymore. The template itself is the authoring discipline: an implementer fills its four sections for the domain skill at hand the same way it would fill any other task brief. There is no meta-step where a skill writes a skill. -
Generate agents / templates / references. Fill the skeleton's empty domain directories —
agents/,templates/,references/— including the instantiatedharness-output-contract.md(this harness's Final Output Contract) and the instantiatednon-harnessable-task-rubric.md(this harness's suitability gate). -
Fill the trace pack from
templates/trace-pack/(source-skill-map.yaml,traceability-matrix.md,design-decisions.md,rejected-scope.md,emergent-findings.md,verification-log.md,final-handoff-certificate.md) — the evidence that each delivered file maps to a source principle, a domain transfer, and an acceptance scenario.
Two efficiency directives (these fix measured bugs — real generation runs re-authored the stamped core from scratch and reloaded heavy skills per artifact, both expensive and both a source of drift):
- Parallelize domain-layer authoring wherever the expanded domain skills are independent (disjoint files, no shared interface still being decided). Wire in meta-harness:dispatching-parallel-harness-agents for that fan-out — dispatch the independent fills concurrently, integrate the results centrally, and keep the per-task implementer→reviewer→fix loop below unchanged for how each individual result gets checked in.
- Load doctrine once. Read the deliverable-skill template, the design spec sections that govern this build, and the stamped core's reference docs a single time per session, not once per artifact. Subagents that need this doctrine get it via the file-handoff paths described below (task brief, report file), not via re-reading the source skills themselves.
The hard rule, stated plainly: the generation pipeline never invokes a skill-authoring skill. The fixed core is stamped, never regenerated — which means its constraints cannot be overwritten by a subagent's judgment call, a shortcut under pressure, or a plan that asks for "just this once." This is the renovation's core fix: previously a skill-authoring skill re-authored core skills per build and quietly eroded their gates; the stamp model makes that erosion structurally impossible because there is nothing left that re-authors the core.
Everything from here on — Pre-Flight Plan Review through the Red Flags table — governs how each task (whether it is a stamp-and-rename task or a fill-the-template task) moves through the implementer → reviewer → fix loop. The generation model above governs what gets built; it does not replace or shorten that loop.
Pre-Flight Plan Review
Before dispatching Task 1, scan the build plan once for conflicts:
- tasks that contradict each other or the plan's Global Constraints
- anything the plan explicitly mandates that the review rubric treats as a defect (a behavioral eval that asserts nothing, verbatim duplication of a prompt block across artifacts)
Present everything you find to your human partner as one batched question — each finding beside the plan text that mandates it, asking which governs — before execution begins, not one interrupt per discovery mid-plan. If the scan is clean, proceed without comment. The review loop remains the net for conflicts that only emerge from building.
Model Selection
Use the least powerful model that can handle each role to conserve cost and increase speed.
Mechanical build tasks (a single hook or skill file, clear specs, 1-2 artifacts): use a fast, cheap model. Most build tasks are mechanical when the plan is well-specified.
Integration and judgment tasks (multi-artifact coordination, matching the target team's existing conventions, diagnosing a harness behavior defect): use a standard model.
Architecture and design tasks (agent role boundaries, workflow maps): use the most capable available model. The final whole-branch review is one of these — dispatch it on the most capable available model, not the session default.
Review tasks: choose the model with the same judgment, scaled to the diff's size, complexity, and risk. A small mechanical diff does not need the most capable model; a subtle change to permission boundaries or escalation routing does.
Always specify the model explicitly when dispatching a subagent. An omitted model inherits your session's model — often the most capable and most expensive — which silently defeats this section.
Turn count beats token price. Wall-clock and context cost scale with how many turns a subagent takes, and the cheapest models routinely take 2-3× the turns on multi-step work — costing more overall. Use a mid-tier model as the floor for reviewers and for implementers working from prose descriptions. When the task's plan text contains the complete artifact text to produce, the work is transcription plus eval runs: use the cheapest tier for that implementer. Single-artifact mechanical fixes also take the cheapest tier.
Task complexity signals (build tasks):
- Touches 1-2 artifacts with a complete spec → cheap model
- Touches multiple artifacts with integration concerns (shared routing rules, cross-referenced prompts) → standard model
- Requires design judgment or broad understanding of the target team's operating environment → most capable model
Handling Implementer Status
Implementer subagents report one of four statuses. Handle each appropriately:
DONE: Generate the review package (scripts/review-package BASE HEAD, from this skill's directory — it prints the unique file path it wrote; BASE is the commit you recorded before dispatching the implementer — never HEAD~1, which silently drops all but the last commit of a multi-commit task), then dispatch the task reviewer with the printed path.
DONE_WITH_CONCERNS: The implementer completed the work but flagged doubts. Read the concerns before proceeding. If the concerns are about correctness or scope, address them before review. If they're observations (e.g., "this skill file is getting large"), note them and proceed to review.
NEEDS_CONTEXT: The implementer needs information that wasn't provided. Provide the missing context and re-dispatch.
BLOCKED: The implementer cannot complete the task. Assess the blocker:
- If it's a context problem, provide more context and re-dispatch with the same model
- If the task requires more reasoning, re-dispatch with a more capable model
- If the task is too large, break it into smaller pieces
- If the build plan itself is wrong, escalate to the human
Never ignore an escalation or force the same model to retry without changes. If the implementer said it's stuck, something needs to change.
Handling Reviewer ⚠️ Items
The task reviewer may report "⚠️ Cannot verify from diff" items — requirements that live in unchanged artifacts or span tasks. These do not block the rest of the review, but you must resolve each one yourself before marking the task complete: you hold the build plan and cross-task context the reviewer lacks. If you confirm an item is a real gap, treat it as a failed spec review — send it back to the implementer and re-review.
Constructing Reviewer Prompts
Per-task reviews are task-scoped gates. The broad review happens once, at the final whole-branch review. When you fill a reviewer template:
- Do not add open-ended directives like "check every skill in the harness" or "run extra pressure scenarios if useful" without a concrete, task-specific reason
- Do not ask a reviewer to re-run evals the implementer already ran on the same artifacts — the implementer's report carries the eval evidence
- Do not pre-judge findings for the reviewer — never instruct a reviewer to ignore or not flag a specific issue. If you believe a finding would be a false positive, let the reviewer raise it and adjudicate it in the review loop. If the prompt you are writing contains "do not flag," "don't treat X as a defect," "at most Minor," or "the plan chose" — stop: you are pre-judging, usually to spare yourself a review loop.
- The global-constraints block you hand the reviewer is its attention lens. Copy the binding requirements verbatim from the plan's Global Constraints section or the Harness Brief: exact values, exact formats, and the stated relationships between artifacts ("same tone rules as the triage skill", "matches the brief's permission table"). The reviewer's template already carries the process rules (YAGNI, eval hygiene, review method) — the constraints block is for what THIS harness's brief demands.
- Hand the reviewer its diff as a file: run this skill's
scripts/review-package BASE HEADand pass the reviewer the file path it prints (or, without bash:git log --oneline,git diff --stat, andgit diff -U10for the range, redirected to one uniquely named file). The output never enters your own context, and the reviewer sees the commit list, stat summary, and full diff with context in one Read call. Use the BASE you recorded before dispatching the implementer — neverHEAD~1, which silently truncates multi-commit tasks. - A dispatch prompt describes one task, not the session's history. Do not paste accumulated prior-task summaries ("state after Tasks 1-3") into later dispatches — a real session's dispatch hit 42k chars of which 99% was pasted history. A fresh subagent needs its task, the artifacts and interfaces it touches, and the global constraints. Nothing else.
- Dispatch fix subagents for Critical and Important findings. Record Minor findings in the progress ledger as you go, and point the final whole-branch review at that list so it can triage which must be fixed before merge. A roll-up nobody reads is a silent discard.
- A finding labeled plan-mandated — or any finding that conflicts with what the plan's text requires — is the human's decision, like any plan contradiction: present the finding and the plan text, ask which governs. Do not dismiss the finding because the plan mandates it, and do not dispatch a fix that contradicts the plan without asking.
- The final whole-branch review gets a package too: run
scripts/review-package MERGE_BASE HEAD(MERGE_BASE = the commit the branch started from, e.g.git merge-base main HEAD) and include the printed path in the final review dispatch, so the final reviewer reads one file instead of re-deriving the branch diff with git commands. - Every fix dispatch carries the implementer contract: the fix subagent re-runs the evals covering its change and reports the results. Name the covering eval files in the dispatch — a one-line fix does not need the whole eval suite. Before re-dispatching the reviewer, confirm the fix report contains the covering evals, the command run, and the output; dispatch the re-review once all three are present.
- If the final whole-branch review returns findings, dispatch ONE fix subagent with the complete findings list — not one fixer per finding. Per-finding fixers each rebuild context and re-run eval suites; a real session's final-review fix wave cost more than all its tasks combined.
File Handoffs
Everything you paste into a dispatch prompt — and everything a subagent prints back — stays resident in your context for the rest of the session and is re-read on every later turn. Hand artifacts over as files:
- Task brief: before dispatching an implementer, run this skill's
scripts/task-brief PLAN_FILE N— it extracts the task's full text to a uniquely named file and prints the path. Compose the dispatch so the brief stays the single source of requirements. Your dispatch should contain: (1) one line on where this task fits in the harness being built; (2) the brief path, introduced as "read this first — it is your requirements, with the exact values to use verbatim"; (3) interfaces and decisions from earlier tasks that the brief cannot know; (4) your resolution of any ambiguity you noticed in the brief; (5) the report-file path and report contract. Exact values (numbers, magic strings, exact prompt wording, eval cases) appear only in the brief. - Report file: name the implementer's report file after the brief
(brief
…/task-N-brief.md→ report…/task-N-report.md) and put it in the dispatch prompt. The implementer writes the full report there and returns only status, commits, a one-line eval summary, and concerns. - Reviewer inputs: the task reviewer gets three paths — the same brief file, the report file, and the review package — plus the global constraints that bind the task.
- Fix dispatches append their fix report (with eval results) to the same report file and return a short summary; re-reviews read the updated file.
Durable Progress
Conversation memory does not survive compaction. In real sessions, controllers that lost their place have re-dispatched entire completed task sequences — the single most expensive failure observed. Track progress in a ledger file, not only in todos.
- At skill start, check for a ledger:
cat "$(git rev-parse --show-toplevel)/.meta-harness/sdd/progress.md". Tasks listed there as complete are DONE — do not re-dispatch them; resume at the first task not marked complete. - When a task's review comes back clean, append one line to the ledger in
the same message as your other bookkeeping:
Task N: complete (commits <base7>..<head7>, review clean). - The ledger is your recovery map: the commits it names exist in git even
when your context no longer remembers creating them. After compaction,
trust the ledger and
git logover your own recollection. git clean -fdxwill destroy the ledger (it's git-ignored scratch); if that happens, recover fromgit log.
Prompt Templates
- implementer-prompt.md - Dispatch implementer subagent
- task-reviewer-prompt.md - Dispatch task reviewer subagent (spec compliance + harness quality)
- Final whole-branch review: use meta-harness:requesting-harness-review's harness-reviewer.md
Example Workflow
You: I'm using Subagent-Driven Harness Development to execute this build plan.
[Read plan file once: docs/meta-harness/plans/2026-07-04-support-team-harness.md]
[Create todos for all tasks]
Task 1: Escalation-policy hook for the support-team harness
[Run task-brief for Task 1; dispatch implementer with brief + report paths + context]
Implementer: "Before I begin - should the escalation hook fire on every inbound ticket, or only on flagged ones?"
You: "Only tickets tagged urgent or SLA-breach (the Harness Brief's escalation policy governs)"
Implementer: "Got it. Building now..."
[Later] Implementer:
- Built hooks/escalate-urgent + registered it in the harness config
- Added behavioral evals, 5/5 pressure scenarios passing
- Self-review: Found I missed the SLA-breach trigger, added it
- Committed
[Run review-package, dispatch task reviewer with the printed path]
Task reviewer: Spec ✅ - required behavior present, nothing forbidden, nothing extra.
Strengths: Realistic pressure scenarios, lean hook. Issues: None. Task quality: Approved.
[Mark Task 1 complete]
Task 2: Refund-approval skill for the support-team harness
[Run task-brief for Task 2; dispatch implementer with brief + report paths + context]
Implementer: [No questions, proceeds]
Implementer:
- Added refund-approval skill with denial reply template
- 8/8 behavioral evals passing
- Self-review: All good
- Committed
[Run review-package, dispatch task reviewer with the printed path]
Task reviewer: Spec ❌:
- Missing: Escalation path in denial replies (brief says "every denial names the escalation path")
- Extra: Added auto-approve fast path under $5 (Harness Brief forbids refunds without human approval)
Issues (Important): Approval threshold duplicated across two prompts
[Dispatch fix subagent with all findings]
Fixer: Removed auto-approve fast path, added escalation path to denial template, moved threshold to one config value both prompts reference
[Task reviewer reviews again]
Task reviewer: Spec ✅. Task quality: Approved.
[Mark Task 2 complete]
...
[After all tasks]
[Dispatch final harness reviewer]
Final reviewer: All requirements met, harness ready to merge
Done!
Advantages
vs. Manual execution:
- Subagents follow eval-driven harness development naturally
- Fresh context per task (no confusion)
- Parallel-safe (subagents don't interfere)
- Subagent can ask questions (before AND during work)
vs. Executing Harness Plans:
- Same session (no handoff)
- Continuous progress (no waiting)
- Review checkpoints automatic
Efficiency gains:
- Controller curates exactly what context is needed; bulk artifacts move as files, not pasted text
- Subagent gets complete information upfront
- Questions surfaced before work begins (not after)
Quality gates:
- Self-review catches issues before handoff
- Task review carries two verdicts: spec compliance and harness quality
- Review loops ensure fixes actually work
- Spec compliance prevents over/under-building
- Harness quality ensures each artifact is well-built
Cost:
- More subagent invocations (implementer + reviewer per task)
- Controller does more prep work (extracting all tasks upfront)
- Review loops add iterations
- But catches issues early (cheaper than diagnosing a misbehaving harness later)
Red Flags
Never:
- Start building on main/master branch without explicit user consent
- Skip task review, or accept a report missing either verdict (spec compliance AND task quality are both required)
- Proceed with unfixed issues
- Dispatch multiple implementer subagents in parallel (conflicts)
- Make a subagent read the whole build plan file (hand it its task brief —
scripts/task-brief— instead) - Skip scene-setting context (subagent needs to understand where task fits)
- Ignore subagent questions (answer before letting them proceed)
- Accept "close enough" on spec compliance (reviewer found spec issues = not done)
- Skip review loops (reviewer found issues = implementer fixes = review again)
- Let implementer self-review replace actual review (both are needed)
- Tell a reviewer what not to flag, or pre-rate a finding's severity in the dispatch prompt ("treat it as Minor at most") — the plan's example artifact text is a starting point, not evidence that its weaknesses were chosen
- Dispatch a task reviewer without a diff file — generate it first
(
scripts/review-package BASE HEAD) and name the printed path in the prompt - Move to next task while the review has open Critical/Important issues
- Re-dispatch a task the progress ledger already marks complete — check
the ledger (and
git log) after any compaction or resume
If subagent asks questions:
- Answer clearly and completely
- Provide additional context if needed
- Don't rush them into building
If reviewer finds issues:
- Implementer (same subagent) fixes them
- Reviewer reviews again
- Repeat until approved
- Don't skip the re-review
If subagent fails task:
- Dispatch fix subagent with specific instructions
- Don't try to fix manually (context pollution)
Integration
Required workflow skills:
- meta-harness:using-harness-workspaces - Ensures isolated harness build workspace (creates one or verifies existing)
- meta-harness:writing-harness-plans - Creates the harness build plan this skill executes
- meta-harness:requesting-harness-review - Harness review template for the final whole-branch review
- meta-harness:finishing-a-harness-branch - Complete the harness production branch after all tasks
Subagents should use:
- meta-harness:eval-driven-harness-development - Subagents follow eval-driven harness development for each task
Alternative workflow:
- meta-harness:executing-harness-plans - Use for parallel session instead of same-session execution