Strategy — interview-driven product anchor, honest by construction
strategy runs a sharp interview and writes one durable anchor: the operating repo's STRATEGY.md (peer of README.md). It pins intent with a VS preamble, pushes back on weak answers instead of transcribing them, and resumes in place when the file already exists. It writes exactly one surface — STRATEGY.md at the operating repo root — and nothing else.
Rigor lives in the questions, not the headings. Section names are plain English; the interview enforces the discipline. Short is a feature — the template is constrained on purpose.
Op: of every run is extend: the anchor is a load-bearing capability added or sharpened, never a refactor of existing prose.
Adapted from EveryInc/compound-engineering-plugin (MIT).
Auto-invoke
When to Apply
- Starting or redirecting a product — no
STRATEGY.md exists and the same framing keeps getting relitigated.
- An existing
STRATEGY.md has gone stale, or a section reads as a slogan.
plan or ideate need upstream grounding and find no anchor.
When NOT to Apply
- The user wants an implementation design →
plan. Strategy says what the product is; plan says how to build a slice.
- The user wants directions or options generated →
ideate. Strategy pins one intent; ideate diverges.
- The ask is a feature spec, backlog priority, or schedule — those live in the tracker, not the anchor.
- No human is available to answer and be pushed back on. An interview with no interviewee produces fabrication — exit.
Reject-by-default gate
A section earns its place in STRATEGY.md only if it clears, in order:
- Specific, not vague. Names a concrete situation or choice, and is falsifiable. Reject "better tools for X" and "be the market leader" — they survive any product.
- Connected. Approach answers the target problem; tracks serve the approach; metrics could plausibly regress. A disconnected section is a slogan, not strategy.
- The user's, not yours. Captured in the user's own language after pushback — not auto-completed by the agent. A fabricated strategy is worse than none.
Push back at most twice per section; then capture what the user gave and mark the section worth revisiting. If the required sections (target problem, approach, persona, metrics, tracks) can't clear the gate, write nothing, commit nothing, and say so in one line. A clean "not enough to anchor yet" is a valid, correct result.
Support files — read on demand
Don't bulk-load. Read each at the step that needs it.
references/interview.md — the question bank, per-section quality bar, and pushback rules for all eight sections. Load before any interview turn; improvising the pushback from memory degrades into transcription.
assets/strategy-template.md — the locked section skeleton and post-write checklist. Read when assembling the draft.
Workflow
Phase 0 — Pin intent, then route by file state
- VS preamble. Before the interview, run a short Verbalized Sampling preamble (the
askme skill) to surface the distinct things the user could mean by "strategy" here, and pin one. Skip only when the user already stated a single unambiguous intent. Pinning the wrong frame wastes the whole interview.
- Route by file state. Resolve the operating repo root once with
git rev-parse --show-toplevel; the anchor is exactly $root/STRATEGY.md and nothing nested or recursively discovered. Read that one path with the native file-read tool — a not-found result is the existence signal:
- Absent → first run. Announce "No STRATEGY.md — let's write it." Go to Phase 1.
- Present, argument names a section → targeted update. Go to Phase 2.
- Present, no argument → ask which section(s) to revisit, then Phase 2.
Phase 1 — First-run interview
Read references/interview.md. Run the eight sections in document order: target problem, approach, persona, metrics, tracks, then optional milestones, non-goals, marketing. For each: ask the opening question, apply the reject-by-default gate, push back at most twice on a weak answer, then capture it in the user's own words. Required sections are 1–5; optional sections default to skip — never invent them.
Phase 2 — Resume-in-place update
Read the existing STRATEGY.md in full. Summarize current state in 3–5 lines so the user sees what's on file. Re-interview only the targeted or stale sections with full pushback — do not rubber-stamp existing weak content because it's already written. Preserve every untouched section byte-for-byte. Update, don't clobber.
Phase 3 — Write, read back, commit
- Gate check. Required sections cleared → proceed. Not cleared → write nothing, commit nothing, say so in one line, exit.
- Read
assets/strategy-template.md; fill it with captured answers in the user's language. Delete unused optional sections — no empty headers. Set last_updated to today's ISO date.
- Present the full draft in chat; offer one edit round.
- Write
$root/STRATEGY.md (the path resolved in Phase 0).
- Read the file back to confirm it landed as intended.
- Commit. Stage only the resolved anchor:
git -C "$root" add STRATEGY.md — never git add -A. Commit with an Op: extend trailer. Publish by the operating repo's normal flow.
- Note in one line that
plan and ideate read it as optional grounding on their next run.
Constitutional Rules (Non-Negotiable)
- Anchor, not plan. Strategy is what the product is and why. Features →
ideate/plan; schedules → the tracker. Reject creep.
- Rigor in the questions, not the headings. Headers stay plain English; the interview carries the discipline.
- Pushback is the skill. Transcribing a weak answer is the failure mode. Reject vague answers, quote the user back, cap at two rounds.
- Short is a feature. The template is locked. Adding a section costs more than it looks — don't.
- No interviewee, no doc. The gate fails closed: a trigger grants evaluation, never fabrication. Gate fails → no write, no commit.
- One surface. Writes only
STRATEGY.md at the operating repo root, and stages only that file.
Validation Gates
| Gate |
Pass criteria |
Blocking |
| Intent pinned |
A single intent fixed via VS preamble, or stated unambiguously |
Yes |
| Required sections |
Target problem, approach, persona, metrics, tracks each clear the reject-by-default gate |
Yes — no write on failure |
| Connection |
Approach answers the problem; tracks serve the approach; metrics can regress |
Yes |
| Read-back |
Written STRATEGY.md re-read and matches intent |
Yes |
| Staging |
git -C "$root" add STRATEGY.md only; working tree otherwise untouched |
Yes |
Commits
One anchor per commit. Stage only the resolved anchor: git -C "$root" add STRATEGY.md — never git add -A. Both first-run and resume-in-place carry Op: extend: a new or sharpened anchor is load-bearing capability. A resume that repairs a stale section is still additive — the strategy evolved with the product, so there is no prior invariant to cite in a Restores: trailer, which is what would make it correct. Publish by the operating repo's normal flow.
Anti-patterns
- Transcribing weak answers. Capturing "we want to be the market leader" verbatim. The gate exists to reject it.
- Fabricating to look productive. Auto-firing on a trigger and inventing a strategy the user never gave.
git add -A. Sweeping unrelated dirty files into the strategy commit. Stage STRATEGY.md alone.
- Clobbering on resume. Regenerating the whole doc when one section was stale. Update in place.
- Section creep. Adding headings the template lacks because a section "felt thin." Push the rigor into the question instead.
Disambiguation
- vs
plan — plan designs implementation: decisions and units for building a slice, read-only over the codebase. strategy anchors what the product is and why. plan reads STRATEGY.md as optional grounding.
- vs
ideate — ideate generates many directions and filters them. strategy pins one intent. Diverge with ideate; converge and anchor with strategy. ideate reads STRATEGY.md as optional grounding.
- vs
askme — askme runs the Verbalized Sampling protocol to explore intent. strategy invokes it as the Phase 0 preamble, then writes the durable doc. askme asks; strategy records.
Operating surface
strategy writes exactly one surface: the operating repo's STRATEGY.md. No other files, no git add -A, no writes to undefined locations.
1---2name: strategy-23description: Interview-driven product anchor — pin intent with a VS preamble, push back on weak answers, and write or maintain STRATEGY.md (target problem, approach, persona, metrics, tracks, milestones, non-goals, marketing) at the operating repo root. Use when the user says "/strategy", "define the strategy", "what's our north star", "set our product strategy", or starts or redirects a product. Fires automatically on strategy-framing phrases; the reject-by-default gate, not the trigger, decides whether a doc is written. `plan` designs implementation and `ideate` generates directions — `strategy` anchors what the product is and reads as optional grounding for both.4---5
6# Strategy — interview-driven product anchor, honest by construction
7
8`strategy` runs a sharp interview and writes one durable anchor: the operating repo's `STRATEGY.md` (peer of `README.md`). It pins intent with a VS preamble, pushes back on weak answers instead of transcribing them, and resumes in place when the file already exists. It writes exactly **one** surface — `STRATEGY.md` at the operating repo root — and nothing else.
9
10Rigor lives in the questions, not the headings. Section names are plain English; the interview enforces the discipline. Short is a feature — the template is constrained on purpose.
11
12`Op:` of every run is `extend`: the anchor is a load-bearing capability added or sharpened, never a refactor of existing prose.
13
14Adapted from EveryInc/compound-engineering-plugin (MIT).
15
16## Auto-invoke
17
18<auto_invoke>
19<trigger_phrases>
20- "what's our north star"
21- "define the strategy"
22- "set our product strategy"
23- "what are we actually building"
24</trigger_phrases>
25Fire automatically on a trigger phrase or when the user starts or redirects a product. The reject-by-default gate below decides whether a doc is actually written — auto-firing is permission to evaluate, not permission to fabricate a strategy the user never gave.
26<manual_override>`/strategy [section]` runs immediately without waiting for a trigger phrase; an argument names a section to revisit (`approach`, `metrics`, `tracks`).</manual_override>
27</auto_invoke>
28
29## When to Apply
30
31- Starting or redirecting a product — no `STRATEGY.md` exists and the same framing keeps getting relitigated.
32- An existing `STRATEGY.md` has gone stale, or a section reads as a slogan.
33- `plan` or `ideate` need upstream grounding and find no anchor.
34
35## When NOT to Apply
36
37- The user wants an implementation design → `plan`. Strategy says what the product is; plan says how to build a slice.
38- The user wants directions or options generated → `ideate`. Strategy pins one intent; ideate diverges.
39- The ask is a feature spec, backlog priority, or schedule — those live in the tracker, not the anchor.
40- No human is available to answer and be pushed back on. An interview with no interviewee produces fabrication — exit.
41
42## Reject-by-default gate
43
44A section earns its place in `STRATEGY.md` only if it clears, in order:
45
461. **Specific, not vague.** Names a concrete situation or choice, and is falsifiable. Reject "better tools for X" and "be the market leader" — they survive any product.
472. **Connected.** Approach answers the target problem; tracks serve the approach; metrics could plausibly regress. A disconnected section is a slogan, not strategy.
483. **The user's, not yours.** Captured in the user's own language after pushback — not auto-completed by the agent. A fabricated strategy is worse than none.
49
50Push back at most twice per section; then capture what the user gave and mark the section worth revisiting. **If the required sections (target problem, approach, persona, metrics, tracks) can't clear the gate, write nothing, commit nothing, and say so in one line.** A clean "not enough to anchor yet" is a valid, correct result.
51
52## Support files — read on demand
53
54Don't bulk-load. Read each at the step that needs it.
55
56- `references/interview.md` — the question bank, per-section quality bar, and pushback rules for all eight sections. Load before any interview turn; improvising the pushback from memory degrades into transcription.
57- `assets/strategy-template.md` — the locked section skeleton and post-write checklist. Read when assembling the draft.
58
59## Workflow
60
61### Phase 0 — Pin intent, then route by file state
62
631. **VS preamble.** Before the interview, run a short Verbalized Sampling preamble (the `askme` skill) to surface the distinct things the user could mean by "strategy" here, and pin one. Skip only when the user already stated a single unambiguous intent. Pinning the wrong frame wastes the whole interview.
642. **Route by file state.** Resolve the operating repo root once with `git rev-parse --show-toplevel`; the anchor is exactly `$root/STRATEGY.md` and nothing nested or recursively discovered. Read that one path with the native file-read tool — a not-found result is the existence signal:
65 - **Absent** → first run. Announce "No STRATEGY.md — let's write it." Go to Phase 1.
66 - **Present, argument names a section** → targeted update. Go to Phase 2.
67 - **Present, no argument** → ask which section(s) to revisit, then Phase 2.
68
69### Phase 1 — First-run interview
70
71Read `references/interview.md`. Run the eight sections in document order: target problem, approach, persona, metrics, tracks, then optional milestones, non-goals, marketing. For each: ask the opening question, apply the reject-by-default gate, push back at most twice on a weak answer, then capture it in the user's own words. Required sections are 1–5; optional sections default to skip — never invent them.
72
73### Phase 2 — Resume-in-place update
74
75Read the existing `STRATEGY.md` in full. Summarize current state in 3–5 lines so the user sees what's on file. Re-interview only the targeted or stale sections with full pushback — do not rubber-stamp existing weak content because it's already written. **Preserve every untouched section byte-for-byte.** Update, don't clobber.
76
77### Phase 3 — Write, read back, commit
78
791. **Gate check.** Required sections cleared → proceed. Not cleared → write nothing, commit nothing, say so in one line, exit.
802. Read `assets/strategy-template.md`; fill it with captured answers in the user's language. Delete unused optional sections — no empty headers. Set `last_updated` to today's ISO date.
813. Present the full draft in chat; offer one edit round.
824. Write `$root/STRATEGY.md` (the path resolved in Phase 0).
835. **Read the file back** to confirm it landed as intended.
846. **Commit.** Stage only the resolved anchor: `git -C "$root" add STRATEGY.md` — never `git add -A`. Commit with an `Op: extend` trailer. Publish by the operating repo's normal flow.
857. Note in one line that `plan` and `ideate` read it as optional grounding on their next run.
86
87## Constitutional Rules (Non-Negotiable)
88
891. **Anchor, not plan.** Strategy is what the product is and why. Features → `ideate`/`plan`; schedules → the tracker. Reject creep.
902. **Rigor in the questions, not the headings.** Headers stay plain English; the interview carries the discipline.
913. **Pushback is the skill.** Transcribing a weak answer is the failure mode. Reject vague answers, quote the user back, cap at two rounds.
924. **Short is a feature.** The template is locked. Adding a section costs more than it looks — don't.
935. **No interviewee, no doc.** The gate fails closed: a trigger grants evaluation, never fabrication. Gate fails → no write, no commit.
946. **One surface.** Writes only `STRATEGY.md` at the operating repo root, and stages only that file.
95
96## Validation Gates
97
98| Gate | Pass criteria | Blocking |
99|------|---------------|----------|
100| Intent pinned | A single intent fixed via VS preamble, or stated unambiguously | Yes |
101| Required sections | Target problem, approach, persona, metrics, tracks each clear the reject-by-default gate | Yes — no write on failure |
102| Connection | Approach answers the problem; tracks serve the approach; metrics can regress | Yes |
103| Read-back | Written `STRATEGY.md` re-read and matches intent | Yes |
104| Staging | `git -C "$root" add STRATEGY.md` only; working tree otherwise untouched | Yes |
105
106## Commits
107
108One anchor per commit. Stage only the resolved anchor: `git -C "$root" add STRATEGY.md` — never `git add -A`. Both first-run and resume-in-place carry `Op: extend`: a new or sharpened anchor is load-bearing capability. A resume that repairs a stale section is still additive — the strategy evolved with the product, so there is no prior invariant to cite in a `Restores:` trailer, which is what would make it `correct`. Publish by the operating repo's normal flow.
109
110## Anti-patterns
111
112- **Transcribing weak answers.** Capturing "we want to be the market leader" verbatim. The gate exists to reject it.
113- **Fabricating to look productive.** Auto-firing on a trigger and inventing a strategy the user never gave.
114- **`git add -A`.** Sweeping unrelated dirty files into the strategy commit. Stage `STRATEGY.md` alone.
115- **Clobbering on resume.** Regenerating the whole doc when one section was stale. Update in place.
116- **Section creep.** Adding headings the template lacks because a section "felt thin." Push the rigor into the question instead.
117
118## Disambiguation
119
120- **vs `plan`** — `plan` designs implementation: decisions and units for building a slice, read-only over the codebase. `strategy` anchors what the product is and why. `plan` reads `STRATEGY.md` as optional grounding.
121- **vs `ideate`** — `ideate` generates many directions and filters them. `strategy` pins one intent. Diverge with `ideate`; converge and anchor with `strategy`. `ideate` reads `STRATEGY.md` as optional grounding.
122- **vs `askme`** — `askme` runs the Verbalized Sampling protocol to explore intent. `strategy` invokes it as the Phase 0 preamble, then writes the durable doc. `askme` asks; `strategy` records.
123
124## Operating surface
125
126`strategy` writes exactly one surface: the operating repo's `STRATEGY.md`. No other files, no `git add -A`, no writes to undefined locations.