From harness-claude
Guides design exploration for new features: gathers project context, identifies boundaries, asks clarifying questions, produces spec without code until human approval. Use for ambiguous problems or non-trivial scopes.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Design exploration to spec to plan. No implementation before design approval. Think first, build second.
Generates interactive specs from ideas, codebases, or docs with R-numbered requirements, testable acceptance criteria, and mandatory user approval gates.
Brainstorms feature requirements through collaborative dialogue, clarifying scope, options, and decisions before generating a right-sized requirements document for planning.
Refines rough ideas into executable specifications via collaborative questioning, alternative exploration, and incremental validation. Invoke before creative work or implementation.
Share bugs, ideas, or general feedback.
Design exploration to spec to plan. No implementation before design approval. Think first, build second.
on_new_feature trigger fires and scope is non-trivialNo implementation may begin before the design is approved by the human.
If you find yourself writing production code, tests, or scaffolding before sign-off, STOP. Brainstorming produces a spec document, not code.
When invoked by autopilot (or with explicit arguments), resolve paths before starting:
session-slug argument provided, use it for all session-scoped reads/writes ({sessionDir} = .harness/sessions/<session-slug>/). Otherwise, session-scoped paths are unavailable — fall back to global .harness/ paths.{sessionDir}/handoff.json. Otherwise write to .harness/handoff.json (deprecated fallback).When no arguments are provided (standalone invocation), the skill operates exactly as before — no session scoping, global paths only.
gather_context({ path: "<project-root>", intent: "<feature description>", skill: "harness-brainstorming", session: "<session-slug-if-known>", include: ["graph", "businessKnowledge", "sessions", "validation"] }). The graph context surfaces business_fact nodes relevant to the feature domain. The businessKnowledge context loads documented domain knowledge from docs/knowledge/. Use both to ground exploration in verified facts rather than assumptions.docs/, and relevant source files.businessKnowledge domains — if documented business rules constrain the problem, note them.Ask ONE question at a time. Ask the most important question first. Wait for the answer. Let it inform the next question. Use emit_interaction with type: 'question':
emit_interaction({
path: "<project-root>",
type: "question",
question: {
text: "For auth, which approach should we use?",
options: [
{ "label": "A) Existing JWT middleware", "pros": ["Already in codebase"], "cons": ["No refresh tokens"], "risk": "low", "effort": "low" },
{ "label": "B) OAuth2 via provider X", "pros": ["Industry standard"], "cons": ["New dependency"], "risk": "medium", "effort": "medium" },
{ "label": "C) External auth service", "pros": ["Zero maintenance"], "cons": ["Vendor lock-in", "Cost"], "risk": "medium", "effort": "low" }
],
recommendation: { "optionIndex": 0, "reason": "Sufficient for current requirements.", "confidence": "high" }
}
})
Prefer multiple choice over open-ended questions. Give 2-4 concrete options with brief tradeoff notes.
Acknowledge answers and build on them. Do not re-ask clarified points. Track decisions as they accumulate.
Apply YAGNI ruthlessly. For every proposed capability, ask: "Do we need this for the stated goal, or is this speculative?" If speculative, cut it. If the human insists, note it as a future consideration.
Continue until you have enough clarity to propose concrete approaches. Typically 3-7 questions suffice. If you need >10, the scope is too large -- decompose.
During Phase 2, extract 5-10 domain keywords for the spec frontmatter:
**Keywords:** auth, middleware, session-tokens, refresh-flow, OAuth2
These flow into handoff.json contextKeywords field. Select keywords that help a fresh agent understand the domain quickly.
Propose 2-3 concrete approaches. Each must include:
Use conventional markdown for callouts:
**[IMPORTANT]** Approach 1 trades simplicity for extensibility
**[SUGGESTION]** Consider Approach 2 if real-time requirements emerge
Be honest about tradeoffs. Do not soft-sell a preferred approach.
State your recommendation and why, but defer to the human's decision.
Wait for the human to choose. Do not proceed until an approach is selected.
Present the design section by section (not all at once). Get feedback on each section, incorporate it, then move to the next:
The Integration Points section is required in every spec. It defines how the feature connects to the existing system. Populate it with five subsections:
If the feature is a small change (bug fix, config tweak, < 3 files), the section may contain only Entry Points and Registrations Required with "None" for the others. The section must still be present.
Run soundness review. Invoke harness-soundness-review --mode spec against the draft. Do not write to docs/ until the review converges with no remaining issues.
Write the spec to docs/changes/<feature>/proposal.md.
Run skill advisor scan. After writing the spec, extract signals from its content and scan the skill index for relevant skills. Write results to docs/changes/<feature>/SKILLS.md alongside the spec.
Use the advise_skills MCP tool:
advise_skills({
"path": "<project-root>",
"specPath": "docs/changes/<feature>/proposal.md"
})
Announce findings in a brief summary (skip announcement in --fast mode):
Skill Advisor: Found N relevant skills for '<feature>'
Apply: N (skill-a, skill-b, ...)
Reference: N | Consider: N
Full list: docs/changes/<feature>/SKILLS.md
In --thorough mode, show the full skill list for human review before proceeding.
Run harness validate to verify proper placement and project health.
Request sign-off via emit_interaction:
emit_interaction({
path: "<project-root>",
type: "confirmation",
confirmation: {
text: "Approve spec at <file-path>?",
context: "<one-paragraph summary>",
impact: "Spec approval unlocks implementation planning. No code changes yet.",
risk: "low"
}
})
The human must explicitly approve before this skill is complete.
Add feature to roadmap. If docs/roadmap.md exists:
manage_roadmap with action add, status: "planned", milestone: "Current Work", and the spec path.manage_roadmap is unavailable, fall back to parseRoadmap/serializeRoadmap from core. Warn: "External sync skipped (MCP unavailable). Run manage_roadmap sync when MCP is restored."Write handoff and suggest transition. After approval:
Write handoff to the session-scoped path when a session slug is known, otherwise fall back to the global path:
.harness/sessions/<session-slug>/handoff.json.harness/handoff.json[DEPRECATED] Writing to
.harness/handoff.jsonis deprecated. When running within an autopilot session, always write to.harness/sessions/<session-slug>/handoff.json. Global writes cause cross-session contamination in parallel runs.
{
"fromSkill": "harness-brainstorming",
"phase": "VALIDATE",
"summary": "<1-sentence summary>",
"artifacts": ["<spec path>"],
"decisions": [{ "what": "<decision>", "why": "<rationale>" }],
"contextKeywords": ["<keywords from Phase 2>"],
"recommendedSkills": {
"apply": ["<skill-names>"],
"reference": ["<skill-names>"],
"consider": ["<skill-names>"],
"skillsPath": "docs/changes/<feature>/SKILLS.md"
}
}
Call emit_interaction:
{
"type": "transition",
"transition": {
"completedPhase": "brainstorming",
"suggestedNext": "planning",
"reason": "Spec approved and written to docs/",
"artifacts": ["<spec path>"],
"requiresConfirmation": true,
"summary": "<title> -- <key choices>. <N> success criteria, <N> phases.",
"qualityGate": {
"checks": [
{
"name": "spec-written",
"passed": true,
"detail": "Written to docs/changes/<feature>/proposal.md"
},
{ "name": "harness-validate", "passed": true },
{ "name": "human-approved", "passed": true }
],
"allPassed": true
}
}
}
If confirmed: invoke harness-planning with the spec path. If declined: stop. The handoff is written for future invocation.
If the design reveals larger-than-expected scope:
When activated with --party, add multi-perspective evaluation after proposing approaches.
Select 2-3 perspectives based on topic:
| Topic | Perspectives |
|---|---|
| API/backend | Backend Developer, API Consumer, Operations |
| UI/frontend | Developer, Designer, End User |
| Infra | Architect, SRE, Developer |
| Data model | Backend Dev, Data Consumer, Migration |
| Library/SDK | Library Author, Consumer, Maintainer |
| Cross-cutting | Architect, Security, Developer |
| Default | Architect, Developer, User/Consumer |
For each approach, evaluate from each perspective:
### Approach N: [name]
**[Perspective 1]:** [Assessment]. Concern: [specific or "None"].
**[Perspective 2]:** [Assessment]. Concern: [specific or "None"].
**[Perspective 3]:** [Assessment]. Concern: [specific or "None"].
**Synthesis:** [Consensus. Address concerns. Recommend proceed/revise.]
Converge on a recommendation that addresses all concerns before presenting the design.
| Section | R | W | Purpose |
|---|---|---|---|
| terminology | Y | Y | Domain terms discovered during brainstorming |
| decisions | Y | Design decisions made during exploration | |
| constraints | Y | Reads constraints to scope brainstorming | |
| risks | Y | Risks identified during brainstorming | |
| openQuestions | Y | Y | Adds new questions, resolves answered ones |
| evidence | Y | Cites sources for recommendations and prior art |
Write after each phase transition (EXPLORE->EVALUATE->PRIORITIZE->VALIDATE) so downstream skills inherit context.
Read at Phase 1 start -- terminology and constraints from session for prior context.
Technical claims about existing code, architecture, or tradeoffs MUST cite evidence:
file:line (e.g., src/services/auth.ts:42 -- "existing JWT middleware")file with description (e.g., src/utils/email.ts -- "reusable for notifications")docs/path (e.g., docs/changes/user-auth/proposal.md -- "established OAuth2 standard")manage_state append_entry to evidence section.When to cite: Phase 1 (existing code/patterns), Phase 3 (tradeoff justifications), Phase 4 (spec referencing existing implementation).
Uncited claims MUST be prefixed with [UNVERIFIED]. These are flagged during review.
harness validate -- Run after writing the spec. Verifies project health and spec placement.harness check-docs -- Verify spec does not conflict with existing docs.docs/changes/<feature>/proposal.md..harness/sessions/<slug>/handoff.json. The session directory structure is: handoff.json, state.json, artifacts.json (registry of spec/plan paths and file lists). Do not write to .harness/handoff.json in session context.manage_roadmap action add to register as planned. Skip silently if no roadmap. Duplicates ignored.emit_interaction -- End of Phase 4 to suggest transition to harness-planning (confirmed transition).When brainstorming produces requirements for planning, prefer EARS sentence patterns (see harness-planning for full reference):
Apply when output includes specific behavioral expectations.
docs/ with all required sections (overview, decisions, technical design, integration points, success criteria, implementation order)harness validate passes after spec is written| Rationalization | Reality |
|---|---|
| "I already understand the problem well enough to skip the question phase" | The Gates section is explicit: you must ask at least one clarifying question before proposing approaches. Skipping questions means making untested assumptions. |
| "There is only one viable approach, so presenting alternatives would be contrived" | The gate requires at least 2 approaches with tradeoffs. A single approach is a recommendation disguised as a decision -- the human has no real choice. |
| "I will draft the full spec and present it for review all at once to save time" | Section-dump specs are explicitly forbidden. Presenting section by section with feedback between each catches misunderstandings early. |
| "This future capability is low-cost to include now, so we should build it in" | YAGNI is a gate, not a suggestion. Every capability must trace to a stated requirement. "We might need this later" is the exact rationalization that turns focused specs into bloated ones. |
EXPLORE:
Read AGENTS.md -- TypeScript monorepo, React frontend, Express backend.
No prior notification specs. Found docs/changes/user-auth/proposal.md as naming example.
No notification code in src/services/. Found email utility in src/utils/email.ts.
Scope: single subsystem, ~1 week. Proceed.
EVALUATE:
Q1: "Notifications: (A) Email only, (B) Email + in-app, (C) Email + in-app + push?"
Human: "B -- email and in-app."
Q2: "In-app delivery: (A) Poll every 30s (simple), (B) WebSocket (real-time, more infra)?"
Human: "A -- polling is fine."
Q3: "Store permanently or expire after 30 days?"
Human: "Expire after 30 days."
PRIORITIZE:
Approach 1: Event-driven with queue
- Services emit events, worker consumes and dispatches
- Tradeoff: More infra (needs queue), but decoupled and scalable
- Complexity: Medium. Risk: Queue adds operational overhead
Approach 2: Direct service calls
- Services call NotificationService directly
- Tradeoff: Simpler, but couples services to notification logic
- Complexity: Low. Risk: Harder to add channels later, synchronous blocking
Recommendation: Approach 2 (YAGNI). Direct calls suffice for email + polling.
Human: "Agreed."
VALIDATE:
Wrote docs/changes/notification-system/proposal.md
Sections: Overview, Decisions, Technical Design, Success Criteria, Implementation Order
harness validate -- passes. Human: "Approved."
These are hard stops. Violating any gate means the process has broken down.