name: docs-strategy-update description: Gate + apply changes to the strategy docs (lean-canvas, hypotheses, theory-of-change, definitions, progress) when strategy shifts — runs 8 anti-drift gates before writing. Owns the strategy-doc layer; /kdd owns decisions.md. when_to_use: "Before editing docs/lean-canvas.md, docs/hypotheses.md, docs/theory-of-change.md, docs/definitions.md, or docs/progress.md — especially after a strategic pivot in conversation. Sync mode (a described change) or audit mode (no arg). NOT for decisions.md (that's /kdd) or CLAUDE.md (that's /slava:maintain:claude-md)." version: 1.2.0
/slava:maintain:docs-strategy-update
Gate + apply changes to ClarityPledge's five strategy docs — lean-canvas.md, hypotheses.md, theory-of-change.md, definitions.md, progress.md — so a strategic shift gets written down without the recurring drift failures: premature-fact, reversal-churn, cross-doc contradiction, unpruned bloat, claim-without-disproof, fragile refs, competing single-valued directives.
Announce at start: "Running /docs-strategy-update."
This skill owns the strategy-doc layer. /kdd owns decisions.md + meta-reflection. /slava:maintain:claude-md owns CLAUDE.md and .claude/rules/.
When to use this vs other skills
| Situation | Skill |
|---|---|
| A strategic shift must land in lean-canvas / hypotheses / theory-of-change / definitions / progress | /docs-strategy-update ← here |
| Capture a decision + run session meta-reflection | /kdd (writes decisions.md) |
| Change CLAUDE.md or a .claude/rules/ file | /slava:maintain:claude-md |
| Output is a tracked feature, not a strategy-doc change | /slava:build:create-spec |
Modes (auto-detected — no flags)
- Sync (invoked with a described strategic shift): apply it across the relevant docs, running every gate.
- Audit (invoked with no argument): scan the four docs for accumulated violations; produce a punch list. No writes.
Workflow
Step 0 — Resolve branch + load state + record base
- Resolve branch FIRST — before any write (Step 3 writes decisions.md). Strategy docs and their decision entry land on
mainor a dedicated docs branch, never an unrelated feature/fix branch. Rungit branch --show-current; if it is notmainor a docs branch, switch first using the.claude/rules/skills.mdBranch Guard wip-pattern. Doing this before Step 3 keeps the decision entry and the doc edits on the same correctly-placed branch. - Read all five docs in full:
lean-canvas.md,hypotheses.md,theory-of-change.md,definitions.md,progress.md.- Doc routing map:
docs/CHARTER.md— one fact, one home (the strategy docs are homes 4–8). Read it when unsure where a fact belongs; this skill references it rather than restating the 9-way tree. - Launch/GTM posture source:
docs/goals.mdis the public, git-versioned home of tactical GTM/funnel execution (CHARTER rule 7) — read it for the current posture..private/docs/gtm-launch-icp-worksheet.mdholds only the named residue (private — contains names; reference by name only, never copy into public docs).goals.mdis NOT in this skill's charter (ungated/tactical): this skill reads it to detect drift, never writes it.
- Doc routing map:
- Read the most recent ~50 lines of
decisions.mdfor live context — and widen the read if Gate 2'sgit log -Slater surfaces an older relevant decision. - Record the base commit:
git rev-parse HEAD— used in Step 4 to detect concurrent drift before applying. - Resolve mode: argument present → Sync; absent → Audit.
Step 1 — State the delta (Sync) / scope the scan (Audit)
- Sync: in 1–3 sentences, state the strategic change and exactly which docs + sections it touches. A pivot from conversation must be expressible as "X was true; now Y, because <evidence>." If you cannot name the evidence, stop — that is Gate 5/7 failing before you start.
- Audit: skip to Step 2 against current doc contents.
Step 2 — Run the 8 gates
Run each gate against the proposed edit (Sync) or current docs (Audit). Produce a gate report (PASS / FIX / WARN per gate). A FIX blocks the write until resolved. Every gate that runs a grep or command must quote its actual output in the report (matched lines, the anchor checked, or "0 matches") — a verdict with no quoted artifact is treated as not-run, not PASS.
Fix the axis before the gates — two orthogonal dimensions, neither is epistemic status, neither pre-blocks a write (this argument has recurred 3+ times; decisions.md 2026-07-03 [process]):
- Edit permission (may I change this box?): destructive-vs-additive (Gate 1 / Gate 4; decisions.md 2026-06-30). Additive,
UNTESTED-labeled, falsifier-carrying content is always recordable — validation is NOT a precondition. - Routing (which doc holds it?): structural/durable vs tactical/volatile — the structural bet (customer, value-prop, mechanism, and the channel bet of who delivers, e.g. coaches; change = pivot) → strategy docs; tactical mechanics (funnel choreography, prices, per-step targets, event run-of-show — including channel mechanics like a specific webinar format; change = every experiment) → decisions.md / goals.md / .private. Reason = churn-isolation, NOT epistemic rank. Advisory, and it never withholds content: default is to RECORD it (with a Gate-5 falsifier + honest
UNTESTEDlabel — that requirement is the churn/scope brake, so "record freely" is not "dump anything"); routing is a non-blocking note on which doc, never a reason to not write. If a piece is genuinely ambiguous between structural and tactical, record it where the founder wants and move on — do not argue placement (that argument IS the recurrence).
STOP — retired axis. If you are about to keep content OUT of a strategy doc because it is "unvalidated," "unrun," or "not yet validated" — that axis is DEAD (decisions.md 2026-06-30 + 2026-07-03). Everything in the strategy docs is an unvalidated bet. The only questions are destructive-vs-additive (edit permission) and structural-vs-tactical (routing). Recording is never blocked, only routed — and routing is advisory. Excluding on structural grounds is ALSO not a block: if the founder wants it in the canvas, it goes; a routing recommendation is a note, not a veto, and must never read to the founder as a refusal to record. Do not re-derive this; do not re-litigate it with the founder.
Gate 1 — Premature-fact (per-doc source of truth). Scope (read first): this gate governs the accuracy of epistemic status labels and numbers, not whether reasoned-but-untested content may be recorded at all. A box MAY be rewritten with a deductively-reasoned model so long as it is honestly labeled (UNTESTED / hypothesis) and carries a falsifier (Gate 5) — recording it is permitted; mislabeling it as Validated / Active / proven is what this gate blocks. The discriminator for may I update this box is destructive-vs-additive, NOT validated-vs-untested (decisions.md 2026-06-30 [process]) — empirical validation is not a precondition for recording. With that scope set: every status word (Active, Validated, proven, ✅) and hard number (price, R₀, %, count) must trace to real evidence:
lean-canvas.md/theory-of-change.md→ must agree with that doc's Validation Status block.hypotheses.md→ must agree with the hypothesis's evidence rows / Transform-if.definitions.md→ no status words at all (it is a glossary). Flag any.progress.md→ numbers live ONLY inside the<!-- AUTO -->block and regenerate via./scripts/progress-refresh.sh --write; a hand-edited number anywhere in the doc is a FIX. Bets-and-kills rows must agree withhypotheses.mdstatus + Transform-if. The human-stamped self-discipline line (untested-hypothesis date) must be re-checked against hypotheses.md on every sync.- A milestone label (e.g.
C1) is NOT a customer. Unvalidated → label "theory / untested bet", never "Active". - A doc with no Validation block to check against → WARN (never a silent pass).
- Agreeing with the Validation block is necessary but not sufficient — Gate 7 still requires an external source. If a number is internally consistent but unsourced, Gate 7 wins (label it "unverified").
Gate 2 — Reversal-lock. Before rewriting a named construct or settled position, grep for a structural lock marker (case-sensitive + boundary-anchored, so unlocked / Unblocked don't false-match):
grep -rnE '(^|[^[:alnum:]])(LOCKED|DECISION-LOCK):' docs/lean-canvas.md docs/hypotheses.md docs/theory-of-change.md docs/definitions.md docs/progress.md
git log -S "<construct phrase>" --oneline -- docs/ | head
As of this skill's creation the docs carry no lock markers, so expect zero grep hits — that means "no lock present, proceed", not "gate failed". The git log -S pass applies regardless of markers: if it surfaces a commit that settled this construct the other way, read that commit before reversing. If a lock exists and this edit reverses it, the edit + the decision entry (Step 3) must name the new evidence (not new phrasing) that justifies overriding it. When you settle a position you expect to hold, write LOCKED: <date> — <reason> next to it so future runs can see it.
Gate 3 — Cross-doc. (a) Every anchor/section this edit links to must still exist — grep the target heading; a link to a missing heading is a FIX. (b) No sibling doc may assert the negation of what you're writing. Don't grep your new sentence — a contradiction is rarely a near-duplicate. Instead: list 3–5 key nouns in the new claim (e.g. coach, distribution, spread), then for each run grep -rniE '(not|without|never|no|isn.?t) .{0,30}<noun>' docs/ and read every hit in full. Fix or remove the contradiction in the same edit. (This is what catches theory-of-change "spreads NOT through coaches" vs a coach-distribution pivot — grepping the literal new wording never surfaces it.)
Gate 4 — Bloat (propose-only deletion). An addition that supersedes an existing dated block must delete or merge that block — but:
- Never auto-delete. Show each proposed cut; get confirmation.
- A block is "superseded" only if the newer block carries explicit supersede intent OR the user confirms it. Blocks marked as deliberate alternates ("alternates, not a sequence") are kept.
- Never delete a block containing a falsifier / Transform-if — that content is load-bearing by Gate 5.
- Additive
UNTESTEDupdates are NOT bloat. Rewriting a box with current best thinking is permitted (see Gate 1 scope); only the destruction of a revivable fallback is a FIX. Do not block an additive, honestly-labeled rewrite. - Active-on-top / dormant-below check (mechanical FIX). When a box's active content is relabeled to a new (
UNTESTED) market/construct, the prior version must survive as a### Dormant (...)sibling in the same box. Grep the box for aDormantheading: a box carrying a new active framing but no dormant-below sibling for a construct that previously had one = FIX (revivable fallback destroyed — the one thing the discriminator still guards). Quote the grep result ("0 matches" where one is expected IS the FIX). - Erosion guard (WARN). If across syncs the count of
UNTESTED-labeled active blocks climbs while none are promoted (validated) or pruned, flag WARN — the label may be laundering scrutiny rather than carrying honest epistemic weight (the failure mode in decisions.md 2026-06-30 [process] falsifier). - (A coarse, line-granular net-bloat count is also flagged in
scripts/pre-commit-checks.sh— a hygiene signal that over-counts multi-line blocks, not this gate's judgment.)
Gate 5 — Disproof. Every strategic claim being written carries a one-line falsifier — "how we'd know this is wrong" or a Transform-if. lean-canvas positioning claims are the usual offender; hypotheses.md is the model to copy.
Gate 6 — Fragile refs. No file.md:NNN or L123 line-number cross-references — use quoted-phrase anchors. (Also enforced mechanically in scripts/pre-commit-checks.sh.)
Gate 7 — Numbers cite a source. Any prod number (R₀, count, %, conversion, price-as-validated) must cite an evidence source — a Mixpanel query, a prod row, a dated session note — not "a number mentioned this turn." No source → label "unverified", never "Validated". Internal consistency is not truth.
Gate 8 — Single-valued-slot reconciliation. A single-valued slot is a strategy-doc heading that must hold exactly one current answer (the page hero, the active channel bet, the active market focus) — as opposed to a bet-list like hypotheses.md, where accumulation is correct. Gates 1/4 are blind to this: three "lead the page with X" directives can each be UNTESTED-labeled (Gate 1 pass), carry a falsifier (Gate 5 pass), and not negate each other (Gate 3's negation-grep misses non-contradicting directives) — so they silently pile up (the §UVP drift: 2026-07-04 "Get to PMF faster" + 2026-07-11 "divergent-AI hook" both marked "lead"). This gate is deterministic because single-valued slots are tagged in the doc:
<!-- SINGLE-VALUE: page-lead -->
placed immediately under the heading (convention documented in docs/CHARTER.md). A single-valued directive is a standalone dated blockquote callout > **Name (2026-07-04, …).** …; a > - **…** list bullet is an elaboration of the one answer, not a competing lead (excluded).
Run it:
python3 scripts/check-single-value-slots.py docs/lean-canvas.md docs/hypotheses.md docs/theory-of-change.md docs/definitions.md docs/progress.md
It counts unreconciled dated directive callouts under each SINGLE-VALUE marker (a callout carrying a structured SUPERSEDED / FALLBACK / dormant / parked / demoted token on its lead-in is treated as reconciled/subordinate, not counted). Exit 2 = a slot has ≥2 competing leads. Quote the script output (per this skill's "verdict with no artifact = not-run" rule).
On exit 2 → FIX: surface the competing directives as an A/B/C reconcile-to-one for the founder (never auto-resolve — "never fill in positioning without being told"), then mark the losers with [SUPERSEDED <date> → …] or subordinate them explicitly (primary + [FALLBACK …]). Adding a new directive to a SINGLE-VALUE slot without superseding/subordinating the incumbent is the exact FIX this gate blocks. This is the same logic the pre-commit check-single-value-slots.py canary enforces at commit time (defense-in-depth).
Step 3 — Precondition: record the decision (Sync only)
Before writing any strategy-doc change, the decision + its falsifier must exist in decisions.md (on the branch resolved in Step 0). /kdd is user-triggered and cannot auto-fire, so a "capture it later" hand-off orphans the doc edit — it asserts a position with no recorded kill-condition (the exact failure Gate 5 prevents).
- Already in decisions.md → cite it.
- Not yet → write the entry now (the user invoked this skill = authorization), using
/kdd's decisions.md format with a[product]tag and a one-line falsifier./kdd's deeper meta-reflection still runs separately when the user calls it.
Step 4 — Apply (Sync) / report (Audit)
- Concurrency check: re-run
git rev-parse HEADandgit status --short docs/; if the four docs changed since Step 0's base, re-read before editing — a concurrent/kdd-at-merge or co-tenant edit must not be clobbered. - Sync — two classes of change (the auto-vs-surface contract):
- Mechanical → apply automatically: fix fragile line-refs (Gate 6), add falsifiers (Gate 5), merge exact-duplicate framings, and apply the spine already settled in the Step-3 decision entry.
- Judgment → surface to the founder as A/B/C options, never resolve silently (the "Founder decisions" rule — never fill in positioning / category / pricing without being told): every contradiction (Gate 3), every stale-fact / status reframe (Gate 1), every deletion (Gate 4, propose-only), and any positioning wording. Present each as: current text · why it's stale/contradictory · 2–3 resolution options; apply only the chosen one. Update the Validation Status block with the new evidence once resolved.
- Audit: output the punch list grouped by gate, one line per violation in the shape
<gate> | <doc> | "<quoted phrase or anchor>" | <suggested action>(matching the precision pre-commit Gate F already prints). A bare count is not actionable for a 50-item bloat list. No writes.
Step 5 — Self-check
Branch placement was resolved in Step 0 (decision + docs on main / a docs branch); confirm it held. Then verify every gate before writing.
Self-check (each box must cite its gate-report artifact — a ticked box with no quoted evidence counts as not-done):
- [ ] Branch resolved before any write (Step 0.1) — decision + docs on main / docs branch
- [ ] All four docs read this session (Step 0)
- [ ] Sync delta expressible as "X was true; now Y, because <evidence>"
- [ ] Gate 1: no unsourced status word / number; definitions.md carries none
- [ ] Gate 2: lock grep run (output quoted); any override names new evidence
- [ ] Gate 3: negation greps run (terms quoted); no anchor broken, no contradiction left standing
- [ ] Gate 4: every deletion shown + confirmed; no falsifier-bearing block cut; relabeled box has a
Dormantsibling (active-on-top check, grep quoted) - [ ] Gate 5: every new claim has a one-line falsifier
- [ ] Gate 6: no line-number cross-refs introduced
- [ ] Gate 7: every number cites a source or is labeled unverified
- [ ] Gate 8:
check-single-value-slots.pyrun (exit code + output quoted); noSINGLE-VALUEslot has ≥2 unreconciled leads - [ ] Decision + falsifier recorded in decisions.md (Step 3)
- [ ] Concurrency re-check passed (Step 4)
Step 6 — Confirm + hand off
Report: docs touched, gate report (pass/fix/warn with artifacts), the decision entry written, and the next step (/kdd for meta-reflection; /slava:maintain:claude-md if CLAUDE.md needs a pointer).
GTM-drift detect (read-only — this skill NEVER writes goals.md). After applying, compare the active channel/posture in lean-canvas.md (the structural channel bet) against docs/goals.md §Active (the tactical funnel). If they name different active channels (e.g. the canvas says founder-direct while goals still runs coaches-first) that is drift — flag it, quoting the two active-channel phrases you compared. Hand off, don't fix: goals.md and .private/docs/gtm-launch-icp-worksheet.md are outside this skill's charter (CHARTER rules 7 + 1 — no skill owns them). If a GTM posture changed, say so explicitly: "goals.md + the private residue need updating to match the strategy docs — no gated skill does this; update them directly."
Template (gate report + decision stub)
docs-strategy-update — <SYNC|AUDIT>
Branch: <main | docs-branch> Base: <sha>
Delta: <X was true; now Y, because <evidence>> # sync only
Docs touched: <list>
Gate report (every verdict cites its artifact — grep output, anchor, or "0 matches"):
1 premature-fact ........ PASS|FIX|WARN <status words/numbers + evidence row>
2 reversal-lock ......... PASS|FIX|WARN <lock grep result; git log -S result>
3 cross-doc ............. PASS|FIX|WARN <negation greps run (terms) + anchors + hits read>
4 bloat (prune) ......... PASS|FIX|WARN <proposed cuts, each confirmed y/n>
5 disproof .............. PASS|FIX|WARN <each new claim + its falsifier>
6 fragile-refs .......... PASS|FIX|WARN <line-ref grep result>
7 numbers-cite-source ... PASS|FIX|WARN <each number + its cited source>
8 single-value-slot ..... PASS|FIX|WARN <check-single-value-slots.py exit code + any competing leads>
Decision recorded (decisions.md):
## <date> [product]: <title>
Decision: <Y>
Falsifier: <how we'd know this is wrong>
Applied: <files> | Punch list: <n items> (audit)
Next: /kdd (meta-reflection) · /slava:maintain:claude-md (if CLAUDE.md pointer)
Quality Gates (Agent Self-Review)
- [ ] Ran in the correct mode (sync vs audit) — auto-detected, not asked
- [ ] Branch resolved before the decision write (Step 0.1)
- [ ] Gate report produced with a verdict + quoted artifact per gate (no gate silently skipped or rubber-stamped)
- [ ] No status word / number written without an evidence source (Gates 1, 7; Gate 7 wins ties)
- [ ] No block deleted without showing it first (Gate 4 propose-only)
- [ ] Judgment calls (contradictions, stale-fact / positioning reframes) surfaced as A/B/C options — never silently resolved; only mechanical cleanup applied automatically
- [ ] Decision + falsifier in decisions.md before the doc write (Step 3)
Related Skills
/kdd— owns decisions.md + meta-reflection; this skill writes the decision stub as a precondition,/kdddoes the deeper pass/slava:maintain:claude-md— gate for CLAUDE.md /.claude/rules/changes/slava:build:create-spec— when the output is a tracked feature, not a strategy-doc change/slava:think:falsify— when a strategic claim itself needs first-principles stress-testing before it is written
API Documentation Generator
Documentation
Automatically generates OpenAPI/Swagger API documentation.
Technical Writer
Documentation
Writes clear technical documentation following top style guides.
Diataxis Documentation Framework
Documentation
Create comprehensive, user-focused documentation using the Diataxis framework. Identify the right documentation type (tutorials, how-to guides, references, explanations) and apply best practices for each.