From harness-claude
Turns a client diagram and conversation notes into a structured Business Requirements Document and gap list, seeding the inception pipeline.
How this skill is triggered — by the user, by Claude, or both
Slash command
/harness-claude:product-advisorThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Turn a client diagram + conversation into a Business Requirements Document and a resolved gap-list, then seed the harness pipeline. The pre-inception front door: gather requirements with AI, feed them in, and let the existing flow continue as it does today.
Turn a client diagram + conversation into a Business Requirements Document and a resolved gap-list, then seed the harness pipeline. The pre-inception front door: gather requirements with AI, feed them in, and let the existing flow continue as it does today.
harness-brainstorming's job. Product Advisor stops at BRD + roadmap seeding.STRATEGY.md directly — that is harness-strategy's job. This skill only reads strategy and offers to seed it.harness-brainstorming or harness-planning.Every gap is either resolved in the interview or shipped as an explicit client-facing question — never silently dropped. A BRD that hides what it does not know is worse than no BRD: it launders assumptions into requirements. If you cannot answer a gap and did not surface it in gaps.md, STOP and add it.
engagement argument, or ask the SA for a short name. This sets docs/inception/<engagement>/ and the roadmap milestone Inception: <engagement>.diagram argument (or a discoverable diagram) is present, parse it by calling ingest_source({ path, source: "diagrams" }) (harness MCP) — the shipped diagram path handles diagram-as-code (Mermaid/D2/PlantUML) and image attachments (vision analysis). Then read the extracted entities and flows back via gather_context / query_graph. Do not build a new parser — reuse ingest_source."diagram not machine-read; confirm entities and flows manually." Do not fail.notes argument or as provided. Call gather_context to pull any existing project/business knowledge that grounds the domain.{ entities[], flows[], notes }. State the entities and flows back to the SA in one short summary and confirm before drafting.docs/inception/<engagement>/brd.md with these sections, each present even if thin: Context, Business Objectives, Scope, Functional Requirements, Non-Functional Requirements, Assumptions, Constraints, Out-of-Scope, Open Questions.{ id, brdSection, question, severity: blocker|important|nice, status: open }. Do not invent facts to fill a section — an empty-because-unknown section is a gap, not a place to guess.diagram, notes, or later interview) so the SA can trace it.Ask ONE question at a time, in plain text. Order the gap queue by severity (blocker → important → nice). Ask the highest-severity open gap first, wait for the answer, then continue.
Ask directly in your reply. Do NOT route questions through emit_interaction, AskUserQuestion, or any tool — those do not reliably surface the question to the human. Plain text in your own message is the only channel that reaches the SA across every client (Claude Code, Cursor, Codex, Gemini CLI).
Present each gap as a scannable multiple-choice table where options exist, and state a recommendation:
### Gap G3 (blocker): What authenticates end users?
| | A) Client SSO (SAML/OIDC) | B) Local accounts | C) Unknown — ask client |
| ----------- | ------------------------- | ----------------- | ----------------------- |
| **Implies** | IdP integration work | Password storage | Blocks scoping |
| **Risk** | Depends on client IdP | Security burden | — |
**Recommendation:** likely A given the enterprise diagram — confirm the IdP.
Fold each answer back into the BRD. Update the relevant section, add the requirement (source: interview), and move the gap open → resolved with the captured answer.
Mark unresolvable gaps client-facing. If the SA cannot answer (only the client can), keep the gap open and phrase it as a question to ask the client.
Stop when the queue is drained — every gap is either resolved or open (client-facing). Do not loop past a drained queue inventing new questions.
gaps.md to docs/inception/<engagement>/gaps.md with two sections: Resolved (gap + captured answer) and Open / chase-with-client (each phrased as a question to ask the client)./harness:strategy, using the BRD's Business Objectives + Scope as grounding. Never write STRATEGY.md yourself — dispatch harness-strategy if the SA accepts.{ title, summary, brdRefs[], rationale }. Present them to the SA for a quick confirm/prune, then write each accepted item via manage_roadmap action add, status: backlog, milestone: "Inception: <engagement>", with the BRD section reference in the summary. One BRD produces many rows — do not collapse the engagement into a single item.emit_interaction. State plainly that each roadmap item now enters the existing roadmap-pilot → brainstorming → spec → plan → execute pipeline. Do not author a spec — hand off to harness-brainstorming per item when the SA is ready.gather_context — Phase 1: pull existing project/business knowledge to ground the domain.ingest_source (source: "diagrams") — Phase 1: parse diagrams (diagram-as-code + image vision) into the knowledge graph; read the extracted entities/flows back via gather_context / query_graph. Never reimplement the parser.read_strategy — Phase 4: read STRATEGY.md (if present) to align the BRD; never write it.manage_roadmap (action add) — Phase 4: create backlog roadmap rows from the BRD fan-out.emit_interaction — Phase 4: record the handoff transition to the roadmap/brainstorming flow.harness validate — After finalize: verify artifact placement and project health.docs/inception/<engagement>/brd.md with all required sections, none empty.gaps.md exists and separates Resolved from Open/client-facing; every open gap is phrased as a question.open → resolved).finalize created ≥1 candidate roadmap row via manage_roadmap, each linking back to a BRD section.finalize offered a STRATEGY.md seed via /harness:strategy and did not write STRATEGY.md directly.INGEST:
engagement: acme-loyalty
diagram: architecture.mmd (Mermaid) → parsed: entities [POS, Loyalty API, CRM, Rewards Engine], flows [POS→Loyalty API→CRM]
notes: kickoff-call.md → loaded. gather_context: existing "loyalty" business facts surfaced.
Confirmed entities/flows with SA. Proceed.
DRAFT-BRD: Wrote docs/inception/acme-loyalty/brd.md. 9 sections. Tagged 6 gaps:
G1 (blocker) no auth model; G2 (blocker) Rewards Engine has no defined trigger; G3 (important) no NFR for POS latency; G4 (important) CRM data residency unknown; G5 (nice) reporting cadence; G6 (blocker) "Rewards Engine" entity maps to no requirement.
GAP-INTERVIEW:
G1: "What authenticates end users? A) Client SSO B) Local C) Unknown" → SA: "A, Okta OIDC." → folded in.
G2: "When does the Rewards Engine fire? A) On transaction B) Batch nightly C) Unknown" → SA: "A." → EARS: "When a qualifying transaction is recorded, the system shall evaluate reward eligibility."
G3: "POS latency budget?" → SA: "client must confirm." → kept open, client-facing.
G4: "CRM data residency?" → SA: "client must confirm." → kept open, client-facing.
G6: resolved by G2. G5: SA: "monthly." → folded in.
FINALIZE:
Wrote gaps.md → Resolved: G1,G2,G5,G6 | Open/client-facing: G3 (latency), G4 (residency).
Offered STRATEGY.md seed → SA accepted → dispatched /harness:strategy.
Roadmap fan-out (milestone "Inception: acme-loyalty", backlog):
- "POS ↔ Loyalty API integration" (brd: Scope, FR-1)
- "Rewards Engine eligibility rules" (brd: FR-4)
- "Okta OIDC authentication" (brd: FR-2)
- "CRM sync + residency compliance" (brd: FR-5, NFR-2)
Emitted handoff → each item enters roadmap-pilot → brainstorming. No spec authored.
resolved or shipped as an open client-facing question in gaps.md. A gap that is neither = Iron Law violation; stop and fix.STRATEGY.md. This skill reads strategy and offers to seed it via /harness:strategy. Writing STRATEGY.md directly = gate violation.proposal.md = gate violation; hand off to harness-brainstorming.finalize must produce multiple roadmap rows. Collapsing an engagement into one row defeats the fan-out.blocker gap and ask the SA which source is authoritative.manage_roadmap is unavailable: Write the candidate items into gaps.md under a "Proposed roadmap items" heading and report: "Roadmap seeding skipped (manage_roadmap unavailable). Re-run finalize when MCP is restored."| Rationalization | Reality |
|---|---|
| "The diagram implies the auth model, so I'll just write it as a requirement" | An implication is not a confirmation. Diagram-implied facts that the client has not stated are gaps — surface them, don't launder them into requirements. |
| "This gap is minor, I'll leave it out of gaps.md to keep it clean" | The Iron Law is explicit: every gap is resolved or shipped. A gap you drop is an assumption the client discovers in production. nice-severity still ships. |
| "I have enough to draft a proposal, I'll just write the spec too" | Product Advisor stops at BRD + roadmap seeding. Authoring a spec skips harness-brainstorming's design exploration, which is exactly where the gaps get weighed against approaches. |
| "The BRD's objectives are clear, I'll seed STRATEGY.md directly to save a step" | This skill never writes STRATEGY.md. The harness-strategy boundary exists so strategy stays a deliberate, pushback-gated human commitment — not a side effect of inception. |
| "The engagement is really one big project, I'll make one roadmap row" | A BRD describes a solution scope that fans out into many work items. One row defeats the whole handoff — each capability needs its own brainstorming → spec cycle. |
| "The diagram won't parse, so I can't run — I'll abort" | Notes-only intake is a first-class path. Degrade, record the diagram as a gap, and continue. Aborting throws away the requirements the notes already contain. |
| Flag | Corrective Action |
|---|---|
| "I'll fill the empty NFR section with reasonable defaults" | STOP. Unknown NFRs are gaps. Defaults you invent become requirements no one agreed to. Tag it as a gap and ask. |
| "The interview is dragging; I'll batch the remaining questions into one message" | STOP. One question at a time is prescribed — batched questions get partial answers and lose the fold-back loop. Ask the next single highest-severity gap. |
| "The SA said 'just make sensible assumptions'" | STOP. Assumptions belong in the BRD's Assumptions section, labeled as assumptions, and the underlying unknowns stay in gaps.md as client-facing. Do not convert assumptions into silent requirements. |
// TODO: confirm with client left inside brd.md functional requirements | STOP. Confirmation-needed items are gaps, not requirements. Move them to gaps.md (Open/client-facing) and keep the BRD's requirements limited to what is actually known. |
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeGathers and documents business requirements, maps AS-IS/TO-BE processes, performs gap analysis, and produces BRDs with stakeholder management.
Interviews users to gather product ideas and business goals, then produces formal requirements documents including BRD, user stories, acceptance criteria, and prioritization.