Help us improve
Share bugs, ideas, or general feedback.
From harness-claude
Runs an interview to write or update a root-level STRATEGY.md, enforcing pushback rules against fluff, goals-as-strategy, and feature-lists. Validates existing strategy files and offers repair paths.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeHow this skill is triggered — by the user, by Claude, or both
Slash command
/harness-claude:harness-strategyThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Repo-root strategic anchor. **Phase 2 of the strategic-anchor spec ships the skill**: a first-run interview that writes a valid `STRATEGY.md`, plus an update flow that re-interviews one section at a time with pushback against fluff, goals-as-strategy, and feature-lists-as-strategy. Downstream wiring (init, brainstorming, roadmap-pilot, ideate, knowledge graph) ships in spec Phases 3-7.
Guides users through a structured strategy interview using the kernel framework (diagnosis, guiding policy, coherent action). Helps think through company, product, team, career, or initiative strategy via conversation.
Guides design-first workflow: explores ambiguous problems, gathers context from STRATEGY.md, and produces a spec document for human approval before any implementation.
Generates structured project plans and PRDs with three modes (new, feature, retro) using a researched Q&A engine that dispatches parallel Explore agents.
Share bugs, ideas, or general feedback.
Repo-root strategic anchor. Phase 2 of the strategic-anchor spec ships the skill: a first-run interview that writes a valid
STRATEGY.md, plus an update flow that re-interviews one section at a time with pushback against fluff, goals-as-strategy, and feature-lists-as-strategy. Downstream wiring (init, brainstorming, roadmap-pilot, ideate, knowledge graph) ships in spec Phases 3-7.
STRATEGY.md is absent and the user invokes /harness:strategySTRATEGY.md exists and the user wants to update one section (the user picks which one; nothing is auto-rewritten)docs/roadmap.md (kept deliberately separate; see proposal Decision 1)harness-brainstorming's job; this skill only writes STRATEGY.mdThe skill never writes STRATEGY.md without explicit user confirmation of the assembled doc, and never silently accepts an answer that fails a pushback rule on the FIRST round. The 2-round cap is the capitulation point, not the bypass point — round 1 must always fire when a rule matches.
STRATEGY.md at repo root. Use path.join(process.cwd(), 'STRATEGY.md').validate_strategy({ path: process.cwd() }) via the harness MCP server. It returns { present, valid, error? }. The MCP server already has @harness-engineering/core loaded, so the project does not need it installed.
{ present: false } → proceed to Phase 1 (first-run interview).{ present: true, valid: true } → proceed to Phase 2 (update run).{ present: true, valid: false, error } → surface error verbatim, then offer three paths via emit_interaction (or numbered chat options when MCP is unavailable):
STRATEGY.md.bak.<YYYY-MM-DD-HHmm> and run Phase 1 fresh.The skill MUST NOT auto-overwrite a present-but-invalid STRATEGY.md — that's the user's prior work, even if broken. The three-path offer is the contract.
Read references/interview.md for the three pushback rules and the 2-round cap. Both are mandatory.
Walk sections in template order — never out of order, because each section informs the next:
Target problem. Open with: "In 2-4 sentences: what is specifically broken in the world that this product addresses? Not the goal — the diagnosis." Capture. Apply Fluff detection and Goal-as-strategy rules.
Our approach. Open with: "What is your distinctive bet on how to solve the target problem? The choice you're making about HOW, not WHAT you're building." Apply all three rules (Fluff, Goal-as-strategy, Feature-list-as-strategy) — this is where feature-list answers live.
Who it's for. Open with: "Specific persona — who is the person, what context are they in, what alternatives are they currently using? 'Developers' is not a specific persona." Apply Fluff detection.
Key metrics. Open with: "What 1-5 metrics, measured where, would tell you the bet is paying off? Each metric is a bullet line: - <name>: <how measured, where it lives>." Apply Fluff detection per bullet.
Tracks. Open with: "What 1-5 tracks of work are you currently investing in to advance the bet? Each track is a bullet line: - <track name>: <one-sentence current investment>." Apply Feature-list-as-strategy per bullet (a "track" should be an investment direction, not a feature name).
Optional sections. Ask once whether to add Milestones, Not working on, and/or Marketing. If yes, walk each with the same rules. If no, skip — they remain absent (the schema allows omission).
Assemble. Show the full proposed doc. Ask explicitly: "Write this to STRATEGY.md?" Wait for yes/no.
Write. Call write_strategy({ path: process.cwd(), doc }) via the harness MCP server. The doc argument is the assembled StrategyDoc shape: { frontmatter: { name, last_updated, version }, sections: [{ name, body }, ...] }. Set last_updated to today's ISO date; version to 1 for first run. The MCP tool validates against StrategyDocSchema and refuses to touch disk on schema failure. Passing the doc as a JSON parameter (not through a shell) means user-supplied prose never crosses the shell tokenizer — no quoting, backtick, or $VAR hazard. Fallback for environments without the MCP server: shell out to node -e "import('@harness-engineering/core').then(m => m.writeStrategyDoc(JSON.parse(require('fs').readFileSync(0, 'utf-8')), { cwd: process.cwd() }))" with the doc piped on stdin — but only when @harness-engineering/core is resolvable from the project's node_modules.
Validate. Run harness validate to confirm the file passes StrategyDocSchema. On failure, surface the error and stop (do not retry).
read_strategy({ path: process.cwd() }) on the harness MCP server. It returns { present: true, valid: true, doc } with the parsed StrategyDoc shape; the server runs validateStrategy + parseStrategyDoc + asStrategyDoc internally so the project does not need @harness-engineering/core installed.name, last_updated, version), then the first sentence of each present section. This is the "what's there now" view the user needs to choose what to revisit.none (exit) or multiple (sequential re-interviews).last_updated to today's ISO date. Increment version by 1.write_strategy (same pattern as Phase 1.8). The writer preserves the user's H1 line and writes a .bak only if no .bak exists yet (idempotent — the original pre-strategy file is the rollback target).harness validate.After Phase 1 or Phase 2 completes successfully, print this short note (3-5 lines):
STRATEGY.md written. Downstream skills that pick this up as grounding:
- harness-brainstorming (Phase 5 of strategic-anchor spec — reads STRATEGY.md in Phase 1 EXPLORE)
- harness-ideate (Phase 4 of spec — generates ranked candidates grounded in STRATEGY.md)
- harness-roadmap-pilot (Phase 6 of spec — strategy-alignment tiebreaker)
- BusinessKnowledgeIngestor (Phase 7 of spec — strategy domain → business_fact nodes)
Soft-fail when absent; no downstream skill blocks on STRATEGY.md's presence.
The handoff exists to set the user's expectation about why they just answered those questions. It is short by design — this is not a section to grow.
harness validate — Run after write_strategy; the existing validateStrategy helper (Phase 1 of this spec) catches schema violations.@harness-engineering/core in the project's node_modules):
validate_strategy({ path }) — Phase 0's routing oracle. Returns { present, valid, error? }.read_strategy({ path }) — Phase 2's read path. Returns { present, valid, doc?, error? }.write_strategy({ path, doc, skipBackup? }) — atomic disk write with .bak on first overwrite. Validates against StrategyDocSchema before touching disk.@harness-engineering/core primitives the MCP tools wrap (only directly relevant when developing inside the monorepo or when the MCP server is unavailable):
validateStrategy(cwd), parseStrategyDoc(raw) + asStrategyDoc(parsed), writeStrategyDoc(doc, { cwd, skipBackup? }), serializeStrategyDoc(doc, opts?), StrategyDocSchema.harness-pulse — Pulse reads STRATEGY.md to seed metric names; strategy writes it. Pulse NEVER writes to STRATEGY.md (Decision 6 of the feedback-loops spec). Strategy NEVER touches harness.config.json.harness-brainstorming — Brainstorming consumes STRATEGY.md as grounding context; this skill produces it. Phase 5 of the strategic-anchor spec wires the brainstorming read path.docs/roadmap.md is tactical phase tracking; STRATEGY.md is the strategic anchor. They never merge. Documented in references/interview.md.<2-4 sentences. ...>) still in it FAILS validation. The skill never writes placeholder text; the writer validates before touching disk.STRATEGY.md, the first-run interview produces a valid STRATEGY.md ≤ 100 lines that passes harness validate.STRATEGY.md enters Phase 2 (update), preserves sections the user did not touch verbatim, bumps version, and updates last_updated.Fluff detection, Goal-as-strategy, Feature-list-as-strategy) fire on at least one canonical anti-pattern fixture in references/interview.md.harness validate passes.STRATEGY.md.bak is written on the first overwrite of an existing file, but NOT clobbered on subsequent overwrites (idempotency).validate_strategy returns { present: false, valid: true }; route to Phase 1."engineering teams want to be the best at shipping". Fluff detection fires: "be the best at" is empty-modifier vocabulary. Repair suggestion: "Replace be the best at shipping with a concrete diagnosis." User revises: "engineering teams ship without a strategic anchor; brainstorming starts mid-stream". Accepted.write_strategy writes the file; no .bak written (fresh create).harness validate passes.validate_strategy returns { present: true, valid: true }; route to Phase 2.name: Acme, last_updated: 2026-05-01, version: 3 and 5 required sections.Tracks for revisit."add features X, Y, Z to the dashboard". Feature-list-as-strategy fires: 3+ feature names. Repair suggestion: "What's the coherent action these features are instances of?" User revises: "- Dashboard track: collapse 3 separate widgets into one explorable surface". Accepted.last_updated: 2026-06-02, version: 4.write_strategy writes the file; .bak already exists from a prior overwrite — NOT clobbered.harness validate passes.validate_strategy returns an error like section "Key metrics": unfilled template placeholder detected (- <metric 1>: <how it's measured, where it lives>). Surface verbatim.Key metrics pre-selected. User answers; skill writes the file."deliver value". Fluff detection fires. Round 1: suggest repair. User answers "deliver maximum value". Round 2: suggest repair again. User answers "deliver excellent value". Cap reached — skill captures the answer verbatim AND emits a flag in the doc summary: "⚠ Target problem: flagged for revisit — pushback cap reached without concrete diagnosis." Continue to the next section.STRATEGY.md without explicit user confirmation of the assembled or updated doc.write_strategy (or writeStrategyDoc when invoked directly) is the only sanctioned write path. Do not hand-edit STRATEGY.md. The writer is the layer that validates against the schema, preserves the H1, writes the .bak, and does the atomic rename.harness validate must pass before exit of Phase 1 or Phase 2. A malformed STRATEGY.md silently breaks the downstream grounding reads (Phases 5/6/7 of the spec).write_strategy returns { written: false, error } (or writeStrategyDoc throws a schema error directly): Report the error verbatim. Do not retry without user fix. The most common cause is a section body that's empty or still contains template placeholder text.