feat(#1951): reversibility tagging — gate one-way-door decisions (#2471)

* test(#1951): add failing-first tests for reversibility tagging

Red phase for issue #1951 (reversibility tagging: classify decisions by
undo cost, gate one-way doors behind a checkpoint:decision).

Tests assert, per the issue's acceptance criteria:
- discuss-phase CONTEXT.md template records a **Reversibility:** field with
  a rationale on captured decisions, and states it is optional
- gsd-planner @-references planner-reversibility.md and stays under the
  49152-char agent cap (LARGE_CAP, tests/agent-size-budget.test.cjs)
- a one-way rating inserts a checkpoint:decision before the dependent task;
  reversible inserts none; costly is flagged but never blocks
- the taxonomy defaults to reversible when unsure (checkpoint-fatigue guard)
  and inserting a checkpoint implies autonomous: false
- docs/reference/plan-md.md documents <reversibility> as optional with all
  three ratings
- --no-reversibility-gates parses to REVERSIBILITY_GATES=false, is injected
  into the planner prompt, and is advertised in the command argument-hint
  and help full mode (argument-hint parity)
- the override suppresses the gate but still persists the rating
- cmdVerifyPlanStructure accepts every rating and the absent case
  (additive-validator guarantee, behavioral via runGsdTools)
- parity: thinking-models-planning.md #4 adopts the canonical three-level
  taxonomy and the binary REVERSIBLE/IRREVERSIBLE vocabulary is gone
- no content loss from the planner extraction made to fit under the cap

Prose-contract assertions are Red until the implementation lands. The
behavioral validator assertions pass immediately — regression guards
proving the validator already accepts unknown optional tags.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(#1951): reversibility tagging — gate one-way-door decisions

Classify planning decisions by what undoing them would cost, and give a
one-way door a human beat before the agent walks through it (issue #1951,
The Pragmatic Programmer Topic 15 'Reversibility'; Bezos's one-way/two-way
door framing).

Acceptance criteria met:
- discuss-phase records an optional reversibility rating with a rationale
  on <decisions> entries in the phase CONTEXT.md template. Unrated
  decisions are treated as reversible, so existing phases are unaffected.
- a one-way rating makes gsd-planner insert a checkpoint:decision before
  the task that implements the decision, reusing the existing checkpoint
  mechanism -- no new checkpoint machinery.
- reversible ratings trigger no checkpoint; costly ratings are flagged in
  the plan but never block.
- the rating persists on the task as the optional <reversibility rating=>
  element. cmdVerifyPlanStructure accepts every rating and the absent
  case; the structural validator does not reject unknown optional tags.
- --no-reversibility-gates (REVERSIBILITY_GATES=false) suppresses
  checkpoint insertion for intentionally-unattended runs while still
  recording ratings -- the override changes what stops the run, not what
  the plan remembers.

Single taxonomy, not two: references/thinking-models-planning.md #4
already shipped a binary REVERSIBLE/IRREVERSIBLE classification and is
loaded by both gsd-planner and gsd-plan-checker. It is rewritten onto the
canonical three-level vocabulary and now points at planner-reversibility.md
as the taxonomy owner, with a parity test that fails if the surfaces
diverge (DEFECT.GENERATIVE-FIX-DIVERGENCE).

agents/gsd-planner.md sat 47 chars under the 49152 LARGE_CAP, so the
checkpoint DO/DON'T guidance was relocated verbatim into
planner-antipatterns.md -- already @-referenced from the same section for
the same topic, so the planner still loads it and nothing was dropped. A
test guards the relocation against content loss.

Files: gsd-core/references/planner-reversibility.md (NEW, canonical
taxonomy + emission rules + anti-patterns), gsd-planner.md, plan-phase
workflow/command/help (flag wiring + parity), plan-md.md schema,
discuss-phase context template, CONTEXT.md glossary, INVENTORY + manifest,
size baselines, install goldens, plugin skills regen, changeset.

Closes #1951

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#1951): address orthogonal review findings

Two isolated reviewers (correctness + security), neither of which authored
the change. Every finding fixed:

Security — the rationale is untrusted input (ADR-1577). It originates in
conversation and flows CONTEXT.md -> planner -> PLAN.md -> executor, each
hop an LLM reading the previous hop's output, with no validation on the
path. planner-reversibility.md and the discuss-phase template now state
it is data and never instructions, and name the </reversibility>
early-termination hazard explicitly -- a rationale that closes its own
element injects sibling structure the executor reads as real tasks.
Four tests guard it.

Correctness 1 — nothing machine-enforced the feature's own promise: a task
rated one-way with no preceding checkpoint:decision validated as fully
clean, so a planner error silently reopened the gap this feature exists to
close. cmdVerifyPlanStructure now warns on an ungated one-way rating. A
warning, not an error: <reversibility> stays additive and the plan stays
valid. Four tests cover ungated (warns), gated (silent), still-valid, and
reversible/costly never flagged.

Correctness 2 — pass-always test. The --no-reversibility-gates parse test
substring-matched the whole workflow file, and plan-phase.md prose mentions
both tokens in one sentence, so it passed with the bash conditional
deleted: it was testing the documentation, not the parser. Now scoped to
the fenced bash blocks and matched as one physical line, with a negative
control confirming prose alone cannot satisfy it.

Correctness 3 — costly had no itemized emission rule, only one-way did, so
two agents could diverge on whether to tag costly at all.

Correctness 4 — template convention break: the example ratings were bare
while every sibling field uses [...] to signal substitution, inviting an
LLM to copy one-way/costly forward as boilerplate. Now bracketed.

Correctness 5 — latent false-green: .includes('reversible') also matches
inside irreversible/irreversibility, which appear in anti-pattern
prose, so a surface that dropped the real taxonomy entry would still pass.
Now word-boundary matched.

ADR-857 phase-6 ceiling — the first gsd-test run caught plan-phase.md
1216 bytes over its frozen 94519 ceiling (it had 49 bytes of headroom on
next). The ceiling may only rise for privileged host machinery, and
reversibility gating is optional-feature logic, so the wiring was slimmed
to its minimum and the explanatory prose moved to the reference files the
planner already loads. plan-phase.md is now 94400 bytes -- 119 under the
ceiling and 70 bytes SMALLER than on next, so the host loop shrank while
gaining the feature, which is what phase 6 ratchets toward. The tracer
contract (tests/tracer-bullet.test.cjs) is unchanged.

Lint — fixed an unnecessary non-null assertion in verify.cts and a
CRLF-fragile bare \n regex in the new test (DEFECT.WINDOWS-CRLF-TEST-
PORTABILITY, the #1658/#1668/#2206/#2449/#2450 class).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(#1951): checkpoint fixture must carry the common task elements

The gated-one-way fixture built a checkpoint:decision task from the
abbreviated skeleton in gsd-planner.md, which shows only the
checkpoint-specific elements (<decision>/<context>/<resume-signal>).
cmdVerifyPlanStructure requires <name> and <action> on EVERY task
regardless of type, so the fixture failed validation for reasons that had
nothing to do with reversibility:

  errors: ["Task missing <name> element", "Task 'unnamed' missing <action>"]

Caught by gsd-test on 14d14a39 (2 failures, both this fixture).

The canonical shape is in tests/verify.test.cjs:266 — a checkpoint task
carries <name>/<files>/<action>/<verify> like any other. Fixture corrected
to match. Verified behaviorally against the real gsd-tools CLI across all
four cases: gated one-way (valid, silent), ungated one-way (valid, warns),
costly (valid, silent), absent (valid, silent).

Not a product defect: the validator's every-task contract is intentional
and pre-existing, and docs/reference/plan-md.md scopes its required-element
list to type=auto/tracer only because those are the elements a planner must
author, not because checkpoints are exempt from <name>.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* chore(#1951): backfill changeset pr number to 2471

* fix(#1951): CodeQL incomplete-sanitization + prompt-injection scan collision

Both CI failures were real defects in code this PR added, not false
positives.

CodeQL js/incomplete-sanitization (high), reversibility-tagging.test.cjs:46 —
the namesRating helper built its regex with `rating.replace(/[-]/g, '\\-')`,
which escapes the hyphen but not backslash, so the escape was incomplete.
It was also unnecessary: `-` carries no special meaning outside a character
class. Replaced with a complete metacharacter escape (backslash included).
Word-boundary behavior verified unchanged across all three ratings — notably
that "irreversible" prose still does not satisfy a "reversible" match, which
is the false-green this helper exists to prevent.

Prompt injection scan — the checkpoint fixture used the human-verification
child element inside <verify>. That tag name is a fake-instruction-boundary
pattern in scripts/prompt-injection-scan.sh, and the scan runs over changed
files, so copying the shape from tests/verify.test.cjs (unflagged only
because it is not in this diff) tripped the gate. Switched to the documented
plain-prose <verify> form.

The first attempt at that fix failed the same gate a second time: the
comment explaining the collision quoted the offending tag literally. The
comment now names it in prose instead — the scanner does not care whether a
match is code or commentary, which is the whole point of the
DEFECT.PROMPT-INJECTION-SCAN-COLLISION note in CLAUDE.md.

Verified locally before push: scan reports 0 findings across 57 changed
files, eslint clean, and both fixtures still validate as designed (gated
one-way silent, ungated one-way warns, neither errors).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(#1951): record measured cost and halve gsd-tools spawns

The Windows shard 1/3 job timeout was traced to the sharding layer, not to
this PR's assertions — see #2472. Two contributing factors were this file's
own, and are fixed here.

1. tests/test-timings.json had no entry for reversibility-tagging.test.cjs,
   so scripts/run-tests.cjs weighted it at the table's median fallback
   (~315ms) for LPT chunk packing. It actually measures 5595ms — an 18x
   under-weight. Recorded the measured value from the green gsd-test run
   (max across the node22/node24 lanes, per gen-test-timings.cjs's
   convention). Only this one entry: a full regen churns 634 entries of
   run-to-run drift, and the table is explicitly advisory and un-gated, so
   a 637-line diff does not belong in a feature PR.

2. Each verifyPlan() spawns gsd-tools, which dominates this file's cost.
   Spawns cut from 9 to 6 with no coverage lost:
   - the ungated-one-way warning and its stays-valid assertion now share
     one plan instead of building the same plan twice;
   - the reversible/costly never-flagged-as-ungated test was strictly
     subsumed by the additive suite, which already runs those two ratings
     ungated and asserts no /reversibilit/ warning at all — and the gate
     warning's text contains both "reversibility" and "one-way", so the
     broader assertion catches it. It only re-spawned gsd-tools twice to
     prove the same thing.

Both are symptom fixes. The shard imbalance itself (19/11/10 minutes
against a 20-minute cap, from a cost-blind round-robin partition that also
reshuffles downstream files whenever one is inserted) is tracked in #2472.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(#1951): checkpoint fixture adopts the #2444 type-branched contract

Surfaced by rebasing onto next, which gained #2444 (branch plan-structure
validation on task type=checkpoint:*) while this PR was in review.

cmdVerifyPlanStructure no longer applies one required-element set to every
task. A checkpoint:decision now requires <name> + <resume-signal> +
<decision> + <options>, and is exempt from the <action>/<verify>/<done>/
<files> set that auto and tracer tasks carry. The gated-one-way fixture
predated that split and failed on the new requirement:

  errors: ["Task 'Task 0: Confirm the on-disk format' missing <options>"]

Fixture rewritten to mirror the checkpoint:decision contract exactly — real
<options> with two <option> children — rather than padding it with fields
checkpoints no longer need. That also drops the plain-prose <verify> the
earlier revision carried purely to dodge the prompt-injection scan; a
checkpoint task has no <verify> requirement at all, so the workaround is
moot.

Verified against the real gsd-tools CLI across all four cases: gated one-way
(valid, silent), ungated one-way (valid, warns), costly (valid, silent),
absent (valid, silent).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-07-21 10:44:55 -04:00
committed by GitHub
parent 04a0eb8d63
commit c5e0371775
57 changed files with 984 additions and 151 deletions

View File

@@ -23,7 +23,7 @@
"gsd-pattern-mapper.md": 12487,
"gsd-phase-researcher.md": 40866,
"gsd-plan-checker.md": 44780,
"gsd-planner.md": 49294,
"gsd-planner.md": 49327,
"gsd-project-researcher.md": 22242,
"gsd-research-synthesizer.md": 13847,
"gsd-roadmapper.md": 22273,

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "e62ee90d39084802",
"agents/gsd-phase-researcher.md": "cff1196c8e8bb4fa",
"agents/gsd-plan-checker.md": "dd1e7cdc837d8f3e",
"agents/gsd-planner.md": "e2ad6fa2952fe88f",
"agents/gsd-planner.md": "c7ba1adfe2b1975d",
"agents/gsd-project-researcher.md": "85de7f562872ee9b",
"agents/gsd-research-synthesizer.md": "18a2e1b30ff7ae3a",
"agents/gsd-roadmapper.md": "7a8465ac6d4dd29e",
@@ -108,7 +108,7 @@
"gsd-core/references/model-profiles.md": "6568ca29b6ee00d8",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-antipatterns.md": "88a0cd714d33fe34",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md": "90cb2ecd1f3eb4d8",
"gsd-core/references/planner-mvp-mode.md": "cdac9dde7cd8fa84",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -145,7 +146,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "2e476a78c8dab51b",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -239,7 +240,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "96822b22c42d75e8",
"gsd-core/workflows/discuss-phase/modes/text.md": "c384c22ffff4dc02",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/context.md": "da6bf5281bf7d2bf",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4",
"gsd-core/workflows/do.md": "6be997df35e9e82b",
"gsd-core/workflows/docs-update.md": "16acb903dbe2bcbe",
@@ -261,7 +262,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0",
"gsd-core/workflows/help/modes/full.md": "80d03a09b561766b",
"gsd-core/workflows/help/modes/full.md": "e0f631355c010bdd",
"gsd-core/workflows/help/modes/topic.md": "0bf9ab39d7044d69",
"gsd-core/workflows/import.md": "7778705ca6c3bc23",
"gsd-core/workflows/inbox.md": "923bf25e18a71698",
@@ -283,7 +284,7 @@
"gsd-core/workflows/onboard.md": "af12b0573b14ce7f",
"gsd-core/workflows/pause-work.md": "564de32981a24337",
"gsd-core/workflows/plan-milestone-gaps.md": "dd6a4b3a8b05ab6e",
"gsd-core/workflows/plan-phase.md": "4488a41ec68c9da4",
"gsd-core/workflows/plan-phase.md": "6d62f201811c1299",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "ab0b22244c3389aa",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261",
@@ -409,7 +410,7 @@
"skills/gsd-onboard/SKILL.md": "1447665c64c8ade8",
"skills/gsd-pause-work/SKILL.md": "9d3cc6bd70b03df1",
"skills/gsd-phase/SKILL.md": "00676bbea61410bf",
"skills/gsd-plan-phase/SKILL.md": "03a8f71d4385a50d",
"skills/gsd-plan-phase/SKILL.md": "84e89f076dc6bef3",
"skills/gsd-plan-review-convergence/SKILL.md": "79d264b132ca360d",
"skills/gsd-pr-branch/SKILL.md": "5e050db73988f9a8",
"skills/gsd-profile-user/SKILL.md": "10f2ff4be2e7d55f",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "43c6021cf7caabfa",
"agents/gsd-phase-researcher.md": "f1f6fd6a3e67c7a8",
"agents/gsd-plan-checker.md": "bf1a4e636f2390de",
"agents/gsd-planner.md": "86f6cfd300125965",
"agents/gsd-planner.md": "f0195f37cafb303b",
"agents/gsd-project-researcher.md": "4531b7cc8f5e5f7d",
"agents/gsd-research-synthesizer.md": "4a4f68e6c75b133a",
"agents/gsd-roadmapper.md": "bb2f57695dbab32c",
@@ -79,7 +79,7 @@
"commands/gsd-onboard.md": "1e8acf7be31834be",
"commands/gsd-pause-work.md": "4fb032f72238fe33",
"commands/gsd-phase.md": "4920d15d779329eb",
"commands/gsd-plan-phase.md": "6b05898d574f3666",
"commands/gsd-plan-phase.md": "e6c1bcd1da345fa5",
"commands/gsd-plan-review-convergence.md": "4523045c95d4cd52",
"commands/gsd-pr-branch.md": "e168fcd545d72d0d",
"commands/gsd-profile-user.md": "ffd9c2feb4c69f11",
@@ -179,7 +179,7 @@
"gsd-core/references/model-profiles.md": "e067ad3df6770db1",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "d75786c2d3e6ff5c",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -216,7 +217,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
@@ -310,7 +311,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "90df4f1fe248cdf3",
"gsd-core/workflows/docs-update.md": "b5cdf1c35043cf7b",
@@ -332,7 +333,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0",
"gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50",
"gsd-core/workflows/help/modes/full.md": "110608f0352bb0a3",
"gsd-core/workflows/help/modes/full.md": "d1bbc72fe912a70c",
"gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d",
"gsd-core/workflows/import.md": "31a0f3a33154939f",
"gsd-core/workflows/inbox.md": "a7d439981775bc29",
@@ -354,7 +355,7 @@
"gsd-core/workflows/onboard.md": "f29c4fbef3b473fd",
"gsd-core/workflows/pause-work.md": "f2b33bba5593d422",
"gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc",
"gsd-core/workflows/plan-phase.md": "32703b6b822f44c0",
"gsd-core/workflows/plan-phase.md": "5453f154e344926e",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5",
@@ -500,7 +501,7 @@
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "f259f089a8d07a54",
"skills/gsd-ns-workflow/skills/next/SKILL.md": "e7409245f1a0f9de",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "fe5b26417ee466be",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "0dda686ce26d9171",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "3e0237a7433e99b0",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "32b4344ec427afce",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "68bda87136db9fb3",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "014dec52d85dcb0e",

View File

@@ -24,7 +24,7 @@
"agents/gsd-pattern-mapper.md": "b45b5e106775bec1",
"agents/gsd-phase-researcher.md": "4772d9eada32e8bd",
"agents/gsd-plan-checker.md": "75851b147f35354a",
"agents/gsd-planner.md": "44a04bdebe044114",
"agents/gsd-planner.md": "352243b5b6c87c36",
"agents/gsd-project-researcher.md": "d7f355894519f9fe",
"agents/gsd-research-synthesizer.md": "1c738df9932d325a",
"agents/gsd-roadmapper.md": "453e9471ad27c7ea",
@@ -78,7 +78,7 @@
"commands/gsd-onboard.md": "d0d9405bc73899bd",
"commands/gsd-pause-work.md": "01dbaebfefacd252",
"commands/gsd-phase.md": "e8c226d2694692a5",
"commands/gsd-plan-phase.md": "7d14158eb377a248",
"commands/gsd-plan-phase.md": "a893b7e30eaed754",
"commands/gsd-plan-review-convergence.md": "cb6a8e074c0ab0cd",
"commands/gsd-pr-branch.md": "382c23a6a644c0e4",
"commands/gsd-profile-user.md": "adbc5b025b30e836",
@@ -178,7 +178,7 @@
"gsd-core/references/model-profiles.md": "c249163663bbea53",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -188,6 +188,7 @@
"gsd-core/references/planner-load-graph-context.md": "add55e135dd968da",
"gsd-core/references/planner-mvp-mode.md": "98bcd2020c30cbd2",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -215,7 +216,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ea15fb1a274ed7c4",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -309,7 +310,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "dfcf239382e9bd67",
"gsd-core/workflows/discuss-phase/modes/text.md": "b62c9085d4dc2963",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "0f7b639ff37660b5",
"gsd-core/workflows/docs-update.md": "99908189254c0131",
@@ -331,7 +332,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0",
"gsd-core/workflows/help/modes/full.md": "2388596fd5bcbd07",
"gsd-core/workflows/help/modes/full.md": "945d73a489286605",
"gsd-core/workflows/help/modes/topic.md": "6e42db16f1568be9",
"gsd-core/workflows/import.md": "5b78323f7538abb6",
"gsd-core/workflows/inbox.md": "47e718a37c7a738f",
@@ -353,7 +354,7 @@
"gsd-core/workflows/onboard.md": "f7d0dbcfd94ab130",
"gsd-core/workflows/pause-work.md": "da902807d2213204",
"gsd-core/workflows/plan-milestone-gaps.md": "7679fac068d1009d",
"gsd-core/workflows/plan-phase.md": "50fad2ee2017f9e9",
"gsd-core/workflows/plan-phase.md": "56ac305f59d49bf7",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "b810f9f2374e23a5",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261",

View File

@@ -24,7 +24,7 @@
"agents/gsd-pattern-mapper.md": "b45b5e106775bec1",
"agents/gsd-phase-researcher.md": "85217c69c1ed2ac6",
"agents/gsd-plan-checker.md": "c70134c61b969589",
"agents/gsd-planner.md": "0ec11dd0d673f828",
"agents/gsd-planner.md": "1ded63b1c2b85729",
"agents/gsd-project-researcher.md": "f468e96f8339d1e0",
"agents/gsd-research-synthesizer.md": "7be02e47f4fd901b",
"agents/gsd-roadmapper.md": "8a7f1f1256a6aed5",
@@ -107,7 +107,7 @@
"gsd-core/references/model-profiles.md": "c249163663bbea53",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -117,6 +117,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -144,7 +145,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -238,7 +239,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "b62c9085d4dc2963",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "97a456ceda9d4513",
"gsd-core/workflows/docs-update.md": "e94d48c979be0211",
@@ -260,7 +261,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0",
"gsd-core/workflows/help/modes/full.md": "3d55c7266241f79d",
"gsd-core/workflows/help/modes/full.md": "be0f1d8d79a53b49",
"gsd-core/workflows/help/modes/topic.md": "6e42db16f1568be9",
"gsd-core/workflows/import.md": "171471150be5a722",
"gsd-core/workflows/inbox.md": "e47920b4495b019a",
@@ -282,7 +283,7 @@
"gsd-core/workflows/onboard.md": "0f0af11294d31715",
"gsd-core/workflows/pause-work.md": "5716362557f44ce4",
"gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e",
"gsd-core/workflows/plan-phase.md": "9a274b986f3a28e5",
"gsd-core/workflows/plan-phase.md": "6d80183e2dfee9dd",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261",
@@ -407,7 +408,7 @@
"skills/gsd-onboard/SKILL.md": "46460b479b7524bf",
"skills/gsd-pause-work/SKILL.md": "35e8a148e44f5361",
"skills/gsd-phase/SKILL.md": "00be96e7ae36c6f0",
"skills/gsd-plan-phase/SKILL.md": "f64953d1af7b0f34",
"skills/gsd-plan-phase/SKILL.md": "295e3211497cb5a8",
"skills/gsd-plan-review-convergence/SKILL.md": "53242a6abe90c405",
"skills/gsd-pr-branch/SKILL.md": "c5e26f2c6dff1355",
"skills/gsd-profile-user/SKILL.md": "894eb2850ecd2dde",

View File

@@ -28,7 +28,7 @@
"agents/gsd-pattern-mapper.md": "b526065fd2efa19c",
"agents/gsd-phase-researcher.md": "c507db2ba66038f4",
"agents/gsd-plan-checker.md": "a609245dbdc4ef2b",
"agents/gsd-planner.md": "6f390cd0f07473a7",
"agents/gsd-planner.md": "5249eb5808e67a6a",
"agents/gsd-project-researcher.md": "049f816c6caa4316",
"agents/gsd-research-synthesizer.md": "2f7dcbff50371d4c",
"agents/gsd-roadmapper.md": "bbb23d3097911516",
@@ -111,7 +111,7 @@
"gsd-core/references/model-profiles.md": "1794ad3d9854129e",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
@@ -121,6 +121,7 @@
"gsd-core/references/planner-load-graph-context.md": "e469016f2d51b5bc",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "d75786c2d3e6ff5c",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -148,7 +149,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
@@ -242,7 +243,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "e38583ffc6743580",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "6b3cad91b3bd1419",
"gsd-core/workflows/docs-update.md": "4bcb3d9630d6bb10",
@@ -264,7 +265,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0",
"gsd-core/workflows/help/modes/default.md": "86f7a14ad06e2f6f",
"gsd-core/workflows/help/modes/full.md": "e4f1ae9d0902dda0",
"gsd-core/workflows/help/modes/full.md": "60956d6dcc7b3533",
"gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d",
"gsd-core/workflows/import.md": "d24be8c61759b593",
"gsd-core/workflows/inbox.md": "2e584f45e52f26f5",
@@ -286,7 +287,7 @@
"gsd-core/workflows/onboard.md": "f29c4fbef3b473fd",
"gsd-core/workflows/pause-work.md": "3530607514b0ac00",
"gsd-core/workflows/plan-milestone-gaps.md": "bafdc6945cd2bd87",
"gsd-core/workflows/plan-phase.md": "cdb95e556e63cb09",
"gsd-core/workflows/plan-phase.md": "b571602c5d1fa051",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "4b0a2cb0f4f28179",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "090c31e22b1508fe",
@@ -404,7 +405,7 @@
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "6c2beccceb46fda1",
"skills/gsd-ns-workflow/skills/next/SKILL.md": "3856471d0f64bf09",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "4e1363db6013a1e5",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "5796e8744314dcf5",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "90d3631e4ed4204f",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "a7be67e1bd14b5fb",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "493f467c22d55b6b",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "605e596c680cbb1c",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "92cfa2e6c2a06bf3",
"agents/gsd-phase-researcher.md": "6338474da1a5d65e",
"agents/gsd-plan-checker.md": "e704c083b02e8c35",
"agents/gsd-planner.md": "50f9d7d12d8268af",
"agents/gsd-planner.md": "4b0e9f592f31bc1d",
"agents/gsd-project-researcher.md": "e43c59f7f1f2f37a",
"agents/gsd-research-synthesizer.md": "87955470c3c129b2",
"agents/gsd-roadmapper.md": "20b69eff61a7a9fa",
@@ -79,7 +79,7 @@
"commands/gsd-onboard.md": "63283b90aa671229",
"commands/gsd-pause-work.md": "6caa75a7c2b4dd2d",
"commands/gsd-phase.md": "e3ca4958ea20a935",
"commands/gsd-plan-phase.md": "ad988a271bf20e9c",
"commands/gsd-plan-phase.md": "4646767cfd0c240a",
"commands/gsd-plan-review-convergence.md": "da885320edff822b",
"commands/gsd-pr-branch.md": "f5be514b9f69eaf5",
"commands/gsd-profile-user.md": "7a9289910719d828",
@@ -179,7 +179,7 @@
"gsd-core/references/model-profiles.md": "e067ad3df6770db1",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "d75786c2d3e6ff5c",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -216,7 +217,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
@@ -310,7 +311,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "90df4f1fe248cdf3",
"gsd-core/workflows/docs-update.md": "b5cdf1c35043cf7b",
@@ -332,7 +333,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0",
"gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50",
"gsd-core/workflows/help/modes/full.md": "5eefc87999cde1a6",
"gsd-core/workflows/help/modes/full.md": "f2b14b5fb009d1ff",
"gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d",
"gsd-core/workflows/import.md": "31a0f3a33154939f",
"gsd-core/workflows/inbox.md": "a7d439981775bc29",
@@ -354,7 +355,7 @@
"gsd-core/workflows/onboard.md": "f29c4fbef3b473fd",
"gsd-core/workflows/pause-work.md": "f2b33bba5593d422",
"gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc",
"gsd-core/workflows/plan-phase.md": "ef07de99f05cb223",
"gsd-core/workflows/plan-phase.md": "31d65fb2372cc25d",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5",
@@ -479,7 +480,7 @@
"skills/gsd-onboard/SKILL.md": "6ad789a03124cd4f",
"skills/gsd-pause-work/SKILL.md": "e2de20b7539e78d4",
"skills/gsd-phase/SKILL.md": "f87211f779315ced",
"skills/gsd-plan-phase/SKILL.md": "5f00d90224127bd5",
"skills/gsd-plan-phase/SKILL.md": "ae3f6a76c08f7782",
"skills/gsd-plan-review-convergence/SKILL.md": "1b1526f5d7a34306",
"skills/gsd-pr-branch/SKILL.md": "87bb3306488565fb",
"skills/gsd-profile-user/SKILL.md": "ee8e8547298006b8",

View File

@@ -43,7 +43,7 @@
".agents/skills/gsd-onboard/SKILL.md": "f42fc2edebeda671",
".agents/skills/gsd-pause-work/SKILL.md": "b379469eed78a196",
".agents/skills/gsd-phase/SKILL.md": "25477edc97a90c91",
".agents/skills/gsd-plan-phase/SKILL.md": "0a7a22d226bcec30",
".agents/skills/gsd-plan-phase/SKILL.md": "14b7a4f76825a5c2",
".agents/skills/gsd-plan-review-convergence/SKILL.md": "c7d8a4db99e4f4b9",
".agents/skills/gsd-pr-branch/SKILL.md": "6901da15e321913e",
".agents/skills/gsd-profile-user/SKILL.md": "6259fabfb6afe7be",
@@ -120,8 +120,8 @@
"agents/gsd-phase-researcher.toml": "44a3d510cd0ce3bd",
"agents/gsd-plan-checker.md": "e7f02c10ea788aee",
"agents/gsd-plan-checker.toml": "6f8ceb421d0ad721",
"agents/gsd-planner.md": "19969475e4e38175",
"agents/gsd-planner.toml": "f5f4f3876767d323",
"agents/gsd-planner.md": "ef417468fecb841f",
"agents/gsd-planner.toml": "4c9feaf9e76d6655",
"agents/gsd-project-researcher.md": "959f2e57c3d69ed8",
"agents/gsd-project-researcher.toml": "f395e8e8c4baf1ed",
"agents/gsd-research-synthesizer.md": "497f85adf53259ef",
@@ -214,7 +214,7 @@
"gsd-core/references/model-profiles.md": "bd90862f68007f2e",
"gsd-core/references/mvp-concepts.md": "23201c8118fb074a",
"gsd-core/references/phase-argument-parsing.md": "531176f66da49c98",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-antipatterns.md": "88a0cd714d33fe34",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "ccd62140264bed71",
@@ -224,6 +224,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "c23fee2f4c9bd9a9",
"gsd-core/references/planner-reviews.md": "7889bfa28e82156b",
"gsd-core/references/planner-revision.md": "2ebf1a714d1ec4bf",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -251,7 +252,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "347c33b2d5646c93",
@@ -345,7 +346,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2",
"gsd-core/workflows/discuss-phase/modes/text.md": "6e1c6f4d8fdd0be3",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/context.md": "da6bf5281bf7d2bf",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4",
"gsd-core/workflows/do.md": "b30d5b8eca60ef79",
"gsd-core/workflows/docs-update.md": "70ad463cdad599c9",
@@ -367,7 +368,7 @@
"gsd-core/workflows/help.md": "08e1349950c5602a",
"gsd-core/workflows/help/modes/brief.md": "da44b130d1afe556",
"gsd-core/workflows/help/modes/default.md": "4bb3082d28026eea",
"gsd-core/workflows/help/modes/full.md": "9a512db0dce1a315",
"gsd-core/workflows/help/modes/full.md": "cb714f34a3b15557",
"gsd-core/workflows/help/modes/topic.md": "b7c7e4a8800bc3ea",
"gsd-core/workflows/import.md": "5b0076b667b15c01",
"gsd-core/workflows/inbox.md": "ddb6832b7e0ad46b",
@@ -389,7 +390,7 @@
"gsd-core/workflows/onboard.md": "f022a379ede13512",
"gsd-core/workflows/pause-work.md": "a217770ecafcb2e0",
"gsd-core/workflows/plan-milestone-gaps.md": "73d46f77c50a0690",
"gsd-core/workflows/plan-phase.md": "422cea035ea5c515",
"gsd-core/workflows/plan-phase.md": "7e435c998a22bc52",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "d838b87563feedf6",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "f10975692cbd036e",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "f5edc589cab52a7b",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.agent.md": "b1f488b0fa6a2395",
"agents/gsd-phase-researcher.agent.md": "03cfb510a766fe93",
"agents/gsd-plan-checker.agent.md": "c50a5b008ddcbfad",
"agents/gsd-planner.agent.md": "1721f5ace5c95434",
"agents/gsd-planner.agent.md": "defa418d75a9b3e9",
"agents/gsd-project-researcher.agent.md": "d73bdbe986ffa8a6",
"agents/gsd-research-synthesizer.agent.md": "f03eed4aa89e47c5",
"agents/gsd-roadmapper.agent.md": "322048cf8ddcb4e5",
@@ -109,7 +109,7 @@
"gsd-core/references/model-profiles.md": "6568ca29b6ee00d8",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-antipatterns.md": "88a0cd714d33fe34",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -119,6 +119,7 @@
"gsd-core/references/planner-load-graph-context.md": "641b6c1ce4dd0c8c",
"gsd-core/references/planner-mvp-mode.md": "355d8a9ff2b2b67e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -146,7 +147,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "c37eebe8fbf89b1c",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -240,7 +241,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "9c97731f22d7bce9",
"gsd-core/workflows/discuss-phase/modes/text.md": "c384c22ffff4dc02",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/context.md": "da6bf5281bf7d2bf",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "2b56ec2868cbddb4",
"gsd-core/workflows/do.md": "ba9dd204343ab48b",
"gsd-core/workflows/docs-update.md": "fddba4a71268a33f",
@@ -262,7 +263,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0",
"gsd-core/workflows/help/modes/full.md": "fb46abb57e525863",
"gsd-core/workflows/help/modes/full.md": "d06191d895d70380",
"gsd-core/workflows/help/modes/topic.md": "0bf9ab39d7044d69",
"gsd-core/workflows/import.md": "ae33f4683e7b69e9",
"gsd-core/workflows/inbox.md": "2f4edb2681b84d9c",
@@ -284,7 +285,7 @@
"gsd-core/workflows/onboard.md": "357b7ae1367560dd",
"gsd-core/workflows/pause-work.md": "9ce66367be6c40db",
"gsd-core/workflows/plan-milestone-gaps.md": "5cf589802d08bdf3",
"gsd-core/workflows/plan-phase.md": "27ea81d0be74a2ee",
"gsd-core/workflows/plan-phase.md": "6f06400e21cc3515",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "bb052483744f0a6d",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261",
@@ -382,7 +383,7 @@
"skills/gsd-onboard/SKILL.md": "4d325f3033df2d37",
"skills/gsd-pause-work/SKILL.md": "4f0caa008a8001ff",
"skills/gsd-phase/SKILL.md": "d38c7f9b1d0d2360",
"skills/gsd-plan-phase/SKILL.md": "d1ba21e500bf62a8",
"skills/gsd-plan-phase/SKILL.md": "19d47df062dfc220",
"skills/gsd-plan-review-convergence/SKILL.md": "29e903e25047ebd1",
"skills/gsd-pr-branch/SKILL.md": "9cd9740db385d95a",
"skills/gsd-profile-user/SKILL.md": "052a8e17ecda40f1",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "1229c215677f740d",
"agents/gsd-phase-researcher.md": "982d59921bed463d",
"agents/gsd-plan-checker.md": "ba51999876d40cf2",
"agents/gsd-planner.md": "71c6e41403d6bc63",
"agents/gsd-planner.md": "a39e021ed91064bc",
"agents/gsd-project-researcher.md": "beeac940d3a10e76",
"agents/gsd-research-synthesizer.md": "6315f016d55176f4",
"agents/gsd-roadmapper.md": "d28e7d4bac46dde2",
@@ -79,7 +79,7 @@
"commands/gsd-onboard.md": "d9e52f558fc2b90f",
"commands/gsd-pause-work.md": "59630f05f95fff68",
"commands/gsd-phase.md": "9a073dcd0f934f90",
"commands/gsd-plan-phase.md": "d9bdd3726e9c3dff",
"commands/gsd-plan-phase.md": "a80206719884ab3b",
"commands/gsd-plan-review-convergence.md": "ea3bec0ae494ecc8",
"commands/gsd-pr-branch.md": "ef2eedb0ed4295da",
"commands/gsd-profile-user.md": "0e99de36619c3b7d",
@@ -179,7 +179,7 @@
"gsd-core/references/model-profiles.md": "5452b2e19e19f77e",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e562947d1bf5c5a4",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -216,7 +217,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -310,7 +311,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2",
"gsd-core/workflows/discuss-phase/modes/text.md": "adec29a0217b6664",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73",
"gsd-core/workflows/do.md": "53839c6429ae1234",
"gsd-core/workflows/docs-update.md": "817776e1a5f87b39",
@@ -332,7 +333,7 @@
"gsd-core/workflows/help.md": "08e1349950c5602a",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "b88ff431fffe40ae",
"gsd-core/workflows/help/modes/full.md": "9ae8b1e8908c7ead",
"gsd-core/workflows/help/modes/full.md": "186472a5e0c6c022",
"gsd-core/workflows/help/modes/topic.md": "cee80e0adfa3b06c",
"gsd-core/workflows/import.md": "5d6b58c9b6048e03",
"gsd-core/workflows/inbox.md": "07404a616a95fe6c",
@@ -354,7 +355,7 @@
"gsd-core/workflows/onboard.md": "7d0c7449b84c7997",
"gsd-core/workflows/pause-work.md": "5716362557f44ce4",
"gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e",
"gsd-core/workflows/plan-phase.md": "74dd1ac212c945da",
"gsd-core/workflows/plan-phase.md": "c06c9440118fe559",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "3bed01c3c906ac52",
@@ -457,7 +458,7 @@
"skills/gsd-onboard/SKILL.md": "c7f216749ba4c09c",
"skills/gsd-pause-work/SKILL.md": "7d310e7329b7ae7d",
"skills/gsd-phase/SKILL.md": "49fca93e5f2ccc70",
"skills/gsd-plan-phase/SKILL.md": "c5e1a4ab2ede399a",
"skills/gsd-plan-phase/SKILL.md": "848d571bd385a0f4",
"skills/gsd-plan-review-convergence/SKILL.md": "3e13dd1bf82f74c0",
"skills/gsd-pr-branch/SKILL.md": "a8f8838a6aa5e1dd",
"skills/gsd-profile-user/SKILL.md": "3be8d50399836ef2",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "cea092600aeb3978",
"agents/gsd-phase-researcher.md": "2bd0402f33d757ca",
"agents/gsd-plan-checker.md": "4b4e2b475bf5b5c3",
"agents/gsd-planner.md": "5f5fa906f62643b6",
"agents/gsd-planner.md": "07bd1760e8861253",
"agents/gsd-project-researcher.md": "425a7df7f37a5c06",
"agents/gsd-research-synthesizer.md": "9d31c87fc2c87ffa",
"agents/gsd-roadmapper.md": "64dce5d5f9fa5654",
@@ -108,7 +108,7 @@
"gsd-core/references/model-profiles.md": "6012c3b53473f04f",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md": "8f598e08696843c0",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -145,7 +146,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -239,7 +240,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "e6d930e2b6769e49",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "b30d1efcb0297580",
"gsd-core/workflows/docs-update.md": "de614d940b6f64ff",
@@ -261,7 +262,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "8874dac94eb68ae6",
"gsd-core/workflows/help/modes/full.md": "a9351cf72f580a87",
"gsd-core/workflows/help/modes/full.md": "4562e56c736127a1",
"gsd-core/workflows/help/modes/topic.md": "6e42db16f1568be9",
"gsd-core/workflows/import.md": "c1c19d52b9637113",
"gsd-core/workflows/inbox.md": "20159d4f9a1fca7f",
@@ -283,7 +284,7 @@
"gsd-core/workflows/onboard.md": "0f0af11294d31715",
"gsd-core/workflows/pause-work.md": "ae2d5789a95f70fe",
"gsd-core/workflows/plan-milestone-gaps.md": "c86cdc1964256b98",
"gsd-core/workflows/plan-phase.md": "6bafababd9a71291",
"gsd-core/workflows/plan-phase.md": "9bad20e7f9ae09b1",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "9607e6d03e93c1c2",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "62f8e4f3b475fe5f",
@@ -430,7 +431,7 @@
"skills/gsd/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "0804dfd4124526ba",
"skills/gsd/gsd-ns-workflow/skills/next/SKILL.md": "1d30cf6061d15168",
"skills/gsd/gsd-ns-workflow/skills/phase/SKILL.md": "610bd06d71198849",
"skills/gsd/gsd-ns-workflow/skills/plan-phase/SKILL.md": "e564bd88707a0e69",
"skills/gsd/gsd-ns-workflow/skills/plan-phase/SKILL.md": "20c30f2aa80a6145",
"skills/gsd/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "9f67e59967b3f5eb",
"skills/gsd/gsd-ns-workflow/skills/progress/SKILL.md": "6ec0e4715dde7ee2",
"skills/gsd/gsd-ns-workflow/skills/quick/SKILL.md": "65e377345e9c49a8",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "6a5408fd11d70391",
"agents/gsd-phase-researcher.md": "94818f28c498bb26",
"agents/gsd-plan-checker.md": "56164206242c8caf",
"agents/gsd-planner.md": "282aa34e2e8bc267",
"agents/gsd-planner.md": "739c1b66005be087",
"agents/gsd-project-researcher.md": "60573a38d3dfd9fe",
"agents/gsd-research-synthesizer.md": "1f7cd286c5783c86",
"agents/gsd-roadmapper.md": "277e0a3252553ab7",
@@ -79,7 +79,7 @@
"command/gsd-onboard.md": "3e87a21c9c04f0d7",
"command/gsd-pause-work.md": "04e993b1c9f8322b",
"command/gsd-phase.md": "8f0e98dc6c223229",
"command/gsd-plan-phase.md": "8c39408407b6bf9f",
"command/gsd-plan-phase.md": "7a7f244d9523bc55",
"command/gsd-plan-review-convergence.md": "b957f86414b6c73f",
"command/gsd-pr-branch.md": "68e724607de3c480",
"command/gsd-profile-user.md": "9704158b2d79cad2",
@@ -179,7 +179,7 @@
"gsd-core/references/model-profiles.md": "6568ca29b6ee00d8",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-antipatterns.md": "88a0cd714d33fe34",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -216,7 +217,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -310,7 +311,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "daf23a04b101ab38",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/context.md": "da6bf5281bf7d2bf",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275",
"gsd-core/workflows/do.md": "ea068f5a797f2178",
"gsd-core/workflows/docs-update.md": "6bca7d8fda0d1d54",
@@ -332,7 +333,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0",
"gsd-core/workflows/help/modes/full.md": "08101a965254f10e",
"gsd-core/workflows/help/modes/full.md": "1c502caa8c65dfd3",
"gsd-core/workflows/help/modes/topic.md": "0bf9ab39d7044d69",
"gsd-core/workflows/import.md": "9e9e83e5549eaf0f",
"gsd-core/workflows/inbox.md": "f2b38be09a2dee08",
@@ -354,7 +355,7 @@
"gsd-core/workflows/onboard.md": "c8d9795021d4fce6",
"gsd-core/workflows/pause-work.md": "a6e5336c409fdc8b",
"gsd-core/workflows/plan-milestone-gaps.md": "1b43d12812f7bc1e",
"gsd-core/workflows/plan-phase.md": "d16b1c70ec0022a1",
"gsd-core/workflows/plan-phase.md": "52ba4ad489bad757",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "f10975692cbd036e",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261",
@@ -481,7 +482,7 @@
"skills/gsd-onboard/SKILL.md": "0e3cc902f44b41b8",
"skills/gsd-pause-work/SKILL.md": "34366b18a392a717",
"skills/gsd-phase/SKILL.md": "64a241d4f8665aa2",
"skills/gsd-plan-phase/SKILL.md": "c95d9376440c4725",
"skills/gsd-plan-phase/SKILL.md": "163fb90e26285762",
"skills/gsd-plan-review-convergence/SKILL.md": "db311b1dbb0024d1",
"skills/gsd-pr-branch/SKILL.md": "a80da6aa95efc50d",
"skills/gsd-profile-user/SKILL.md": "4ac2c5ea45d17a9d",

View File

@@ -79,7 +79,7 @@
"agents/subagents/gsd-phase-researcher.yaml": "7633c8e82617e7cc",
"agents/subagents/gsd-plan-checker.md": "bd302afc01ed40f0",
"agents/subagents/gsd-plan-checker.yaml": "8295181071121db8",
"agents/subagents/gsd-planner.md": "285c6a21227787f9",
"agents/subagents/gsd-planner.md": "28172805a3e78163",
"agents/subagents/gsd-planner.yaml": "2e83ee194bcd7fbd",
"agents/subagents/gsd-project-researcher.md": "39bc2ec5a8b18283",
"agents/subagents/gsd-project-researcher.yaml": "ce12586b0347e2dc",
@@ -172,7 +172,7 @@
"gsd-core/references/model-profiles.md": "e067ad3df6770db1",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
@@ -182,6 +182,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "d75786c2d3e6ff5c",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -209,7 +210,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
@@ -303,7 +304,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "90df4f1fe248cdf3",
"gsd-core/workflows/docs-update.md": "b5cdf1c35043cf7b",
@@ -325,7 +326,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0",
"gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50",
"gsd-core/workflows/help/modes/full.md": "91e115f058b6d3cf",
"gsd-core/workflows/help/modes/full.md": "4e99773be20a97e2",
"gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d",
"gsd-core/workflows/import.md": "31a0f3a33154939f",
"gsd-core/workflows/inbox.md": "a7d439981775bc29",
@@ -347,7 +348,7 @@
"gsd-core/workflows/onboard.md": "f29c4fbef3b473fd",
"gsd-core/workflows/pause-work.md": "f2b33bba5593d422",
"gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc",
"gsd-core/workflows/plan-phase.md": "a41a135a82c2f307",
"gsd-core/workflows/plan-phase.md": "3d7655de200ce3f7",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5",
@@ -444,7 +445,7 @@
"skills/gsd-onboard/SKILL.md": "fd66b3c5b9c6a871",
"skills/gsd-pause-work/SKILL.md": "95017c70ae9dca0d",
"skills/gsd-phase/SKILL.md": "31578c329cc2583e",
"skills/gsd-plan-phase/SKILL.md": "83362394f648deeb",
"skills/gsd-plan-phase/SKILL.md": "fc4464af5649282f",
"skills/gsd-plan-review-convergence/SKILL.md": "fcac3c24e566438e",
"skills/gsd-pr-branch/SKILL.md": "67f468db29ff2cf1",
"skills/gsd-profile-user/SKILL.md": "19a1d3aba57f6c7c",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "7c6d1d9817a9c1e7",
"agents/gsd-phase-researcher.md": "9874110700b41f48",
"agents/gsd-plan-checker.md": "28ca3dc43669894f",
"agents/gsd-planner.md": "5234ac4f1afce5dc",
"agents/gsd-planner.md": "b2ea0c457376ac3e",
"agents/gsd-project-researcher.md": "dae210ae0b3c6e2b",
"agents/gsd-research-synthesizer.md": "e02c6ad5d1b74171",
"agents/gsd-roadmapper.md": "1658a40b20d8b575",
@@ -79,7 +79,7 @@
"commands/gsd-onboard.md": "3aafaeb5d3941efe",
"commands/gsd-pause-work.md": "bb5bf91a2e3e480e",
"commands/gsd-phase.md": "6bcda1539f949d5a",
"commands/gsd-plan-phase.md": "4e19ddc0ca22fbf6",
"commands/gsd-plan-phase.md": "cbb349ad7520db85",
"commands/gsd-plan-review-convergence.md": "348d02775fd62977",
"commands/gsd-pr-branch.md": "31fca4f1d6c4ee62",
"commands/gsd-profile-user.md": "725c14ae7203b5b6",
@@ -179,7 +179,7 @@
"gsd-core/references/model-profiles.md": "6568ca29b6ee00d8",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "2459c40bfc8a0ea8",
"gsd-core/references/planner-antipatterns.md": "88a0cd714d33fe34",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md": "97f6e67b56c072c1",
"gsd-core/references/planner-mvp-mode.md": "35d30284ea9110c0",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -216,7 +217,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "fc00fd23895d4535",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -310,7 +311,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "799fc7e1283b568f",
"gsd-core/workflows/discuss-phase/modes/text.md": "daf23a04b101ab38",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "9804674fccada405",
"gsd-core/workflows/discuss-phase/templates/context.md": "da6bf5281bf7d2bf",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "04e4feee14772275",
"gsd-core/workflows/do.md": "532afe82bbf9f775",
"gsd-core/workflows/docs-update.md": "4c7ea896438d9d45",
@@ -332,7 +333,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "be05e56b2c5ee2c0",
"gsd-core/workflows/help/modes/full.md": "7e68200aeb086535",
"gsd-core/workflows/help/modes/full.md": "a3705cc4e0360f1c",
"gsd-core/workflows/help/modes/topic.md": "0bf9ab39d7044d69",
"gsd-core/workflows/import.md": "15d09b825badf7ed",
"gsd-core/workflows/inbox.md": "7e46f5d6b0694074",
@@ -354,7 +355,7 @@
"gsd-core/workflows/onboard.md": "ca3a59a2e36b829a",
"gsd-core/workflows/pause-work.md": "70c72beca55c080a",
"gsd-core/workflows/plan-milestone-gaps.md": "0a9dacd422cd9533",
"gsd-core/workflows/plan-phase.md": "9dc1b4d1e7c0878f",
"gsd-core/workflows/plan-phase.md": "47b59b9e6f022538",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "3a09141de7f3dedb",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "e9de7a96bbfff261",
@@ -481,7 +482,7 @@
"skills/gsd-onboard/SKILL.md": "ea0b1217e5ecae23",
"skills/gsd-pause-work/SKILL.md": "c7e9ba4f242c4648",
"skills/gsd-phase/SKILL.md": "ee78c0c56c814d84",
"skills/gsd-plan-phase/SKILL.md": "4b65f0a9d7d42ec7",
"skills/gsd-plan-phase/SKILL.md": "7490d949e7e14028",
"skills/gsd-plan-review-convergence/SKILL.md": "8338cb7e018e3713",
"skills/gsd-pr-branch/SKILL.md": "8fa5a8fa217fe913",
"skills/gsd-profile-user/SKILL.md": "3e6155a64523d59f",

View File

@@ -75,7 +75,7 @@
"gsd-core/references/model-profiles.md": "e067ad3df6770db1",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
@@ -85,6 +85,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "d75786c2d3e6ff5c",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -112,7 +113,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
@@ -206,7 +207,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "90df4f1fe248cdf3",
"gsd-core/workflows/docs-update.md": "b5cdf1c35043cf7b",
@@ -228,7 +229,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0",
"gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50",
"gsd-core/workflows/help/modes/full.md": "99d5387021de656f",
"gsd-core/workflows/help/modes/full.md": "f44724d908fd6bd3",
"gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d",
"gsd-core/workflows/import.md": "31a0f3a33154939f",
"gsd-core/workflows/inbox.md": "a7d439981775bc29",
@@ -250,7 +251,7 @@
"gsd-core/workflows/onboard.md": "f29c4fbef3b473fd",
"gsd-core/workflows/pause-work.md": "f2b33bba5593d422",
"gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc",
"gsd-core/workflows/plan-phase.md": "2b7d29129452a804",
"gsd-core/workflows/plan-phase.md": "3547ee091be19160",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "83c66c7722e8b165",
"agents/gsd-phase-researcher.md": "284e55a86ae46d7f",
"agents/gsd-plan-checker.md": "c8a8fcc8ed38eff0",
"agents/gsd-planner.md": "c38e99d7be01a728",
"agents/gsd-planner.md": "e85ed2535f6a7624",
"agents/gsd-project-researcher.md": "b5baac64a15c85e2",
"agents/gsd-research-synthesizer.md": "6cd9b501dc97bd50",
"agents/gsd-roadmapper.md": "c357a77ab919e9e5",
@@ -108,7 +108,7 @@
"gsd-core/references/model-profiles.md": "0b7e06ed2e4abac8",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md": "3f6f5ee62d86f72d",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -145,7 +146,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -239,7 +240,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "6914c661b95859ee",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "2e784b2d6a02ea94",
"gsd-core/workflows/docs-update.md": "db6e70dddaf019ad",
@@ -261,7 +262,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "7ca77077085452f5",
"gsd-core/workflows/help/modes/full.md": "6022991e0f56fd1d",
"gsd-core/workflows/help/modes/full.md": "dfb0f1fd3d1f2a2e",
"gsd-core/workflows/help/modes/topic.md": "6e42db16f1568be9",
"gsd-core/workflows/import.md": "3bcc9194fffcd259",
"gsd-core/workflows/inbox.md": "e8a5db7443c524d6",
@@ -283,7 +284,7 @@
"gsd-core/workflows/onboard.md": "0f0af11294d31715",
"gsd-core/workflows/pause-work.md": "be33f84dc1d4822f",
"gsd-core/workflows/plan-milestone-gaps.md": "d98e98486123eb97",
"gsd-core/workflows/plan-phase.md": "9b436899cbc7bbca",
"gsd-core/workflows/plan-phase.md": "61ab4c96566668da",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "4099ef6d0868de60",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "c22ff5ea46de665a",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "d050d8d551ed1756",
@@ -429,7 +430,7 @@
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "f9a1348c6c297579",
"skills/gsd-ns-workflow/skills/next/SKILL.md": "13e394affe675498",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "1ed640e5f06c7be6",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "ff46b5450c9c4313",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "1206a0878a082581",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "53242a6abe90c405",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "943538c4ac6bde19",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "bd5e4cb79bc41611",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "b5d7a4abb1baecb9",
"agents/gsd-phase-researcher.md": "2256f1f82212c757",
"agents/gsd-plan-checker.md": "523119bd5d6599fe",
"agents/gsd-planner.md": "ddfd810f17d39eb6",
"agents/gsd-planner.md": "dbec071e8a52ebd4",
"agents/gsd-project-researcher.md": "ddf7794e81300032",
"agents/gsd-research-synthesizer.md": "a124b00271748d07",
"agents/gsd-roadmapper.md": "493ef92b42b12cf4",
@@ -108,7 +108,7 @@
"gsd-core/references/model-profiles.md": "b4527b0f255d193f",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e562947d1bf5c5a4",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md": "9a9383599893ea7e",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -145,7 +146,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -239,7 +240,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2",
"gsd-core/workflows/discuss-phase/modes/text.md": "e1043e27b50a5e18",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "6b56aa4a44ca61fc",
"gsd-core/workflows/docs-update.md": "141185e54648df02",
@@ -261,7 +262,7 @@
"gsd-core/workflows/help.md": "08e1349950c5602a",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "ed7368e0d1b8644a",
"gsd-core/workflows/help/modes/full.md": "01a34fdde96bf138",
"gsd-core/workflows/help/modes/full.md": "bc2c13a06dbbc7bc",
"gsd-core/workflows/help/modes/topic.md": "8a5344e56fa64ab9",
"gsd-core/workflows/import.md": "9ebddd4142200a3e",
"gsd-core/workflows/inbox.md": "1abe5a3114bbf1c3",
@@ -283,7 +284,7 @@
"gsd-core/workflows/onboard.md": "015695a7e9cf59bc",
"gsd-core/workflows/pause-work.md": "c20d267e28ce92f0",
"gsd-core/workflows/plan-milestone-gaps.md": "26db7b9329b7ddc8",
"gsd-core/workflows/plan-phase.md": "5209ca67d77d19e3",
"gsd-core/workflows/plan-phase.md": "77942a8f1cdc4e3f",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "778b73a8db6f7c32",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "619946c879f33b9d",
@@ -401,7 +402,7 @@
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "fef8178c9920c2dd",
"skills/gsd-ns-workflow/skills/next/SKILL.md": "faadd9e2817e7324",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "df3efcd61f7cc796",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "31962f06bc124c89",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "c6c607b03b043eb1",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "b27aad9196476875",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "37a37d2cdfba46ea",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "6fd1b96274b23a9f",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "ada0c169daa2f0ec",
"agents/gsd-phase-researcher.md": "2a45ebde829555ec",
"agents/gsd-plan-checker.md": "33fbf70b7b24eb1e",
"agents/gsd-planner.md": "f98cfbc92bfff334",
"agents/gsd-planner.md": "8b59834f86f84d31",
"agents/gsd-project-researcher.md": "f6697b316b5995ba",
"agents/gsd-research-synthesizer.md": "04036f38c1d373ea",
"agents/gsd-roadmapper.md": "fb62e1e3de84b5f9",
@@ -108,7 +108,7 @@
"gsd-core/references/model-profiles.md": "09aa53e3f1764a41",
"gsd-core/references/mvp-concepts.md": "3464783eaaef5c10",
"gsd-core/references/phase-argument-parsing.md": "e562947d1bf5c5a4",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "1ed614dfba72f2a3",
@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md": "18d50b6d12db830e",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "74acbf4a873a01e4",
"gsd-core/references/planner-reviews.md": "da39eace09a10743",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -145,7 +146,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "827c1badf3e6df41",
@@ -239,7 +240,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "55b61b7dc83a58b2",
"gsd-core/workflows/discuss-phase/modes/text.md": "aeb56fe7b95dd786",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "cd5d01c9ef84ab73",
"gsd-core/workflows/do.md": "c2ee0bb845bc1cf1",
"gsd-core/workflows/docs-update.md": "a7b78ce2f5404160",
@@ -261,7 +262,7 @@
"gsd-core/workflows/help.md": "08e1349950c5602a",
"gsd-core/workflows/help/modes/brief.md": "fa2675516b40e2e3",
"gsd-core/workflows/help/modes/default.md": "6a253f1756f74e95",
"gsd-core/workflows/help/modes/full.md": "670392a80cbcbd7d",
"gsd-core/workflows/help/modes/full.md": "fb22cd27f4478ee2",
"gsd-core/workflows/help/modes/topic.md": "cee80e0adfa3b06c",
"gsd-core/workflows/import.md": "3df83dccd78ae0a6",
"gsd-core/workflows/inbox.md": "556b5a10c580ebad",
@@ -283,7 +284,7 @@
"gsd-core/workflows/onboard.md": "7d0c7449b84c7997",
"gsd-core/workflows/pause-work.md": "93fcc1c845da6396",
"gsd-core/workflows/plan-milestone-gaps.md": "7880866ee1caf923",
"gsd-core/workflows/plan-phase.md": "870aff8ccfe7b1a4",
"gsd-core/workflows/plan-phase.md": "3bd23960110db934",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "e06ccd4d4c0703fb",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "80b1ba493a9a967f",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "3fed4740a91d0443",

View File

@@ -25,7 +25,7 @@
"agents/gsd-pattern-mapper.md": "68ecefd60811a669",
"agents/gsd-phase-researcher.md": "2235f61764d8e969",
"agents/gsd-plan-checker.md": "bb38f345d3d41edc",
"agents/gsd-planner.md": "1e904e38cccc5dc4",
"agents/gsd-planner.md": "4b7405292d3866ad",
"agents/gsd-project-researcher.md": "f572892f138734ff",
"agents/gsd-research-synthesizer.md": "29949bf3f049a8f1",
"agents/gsd-roadmapper.md": "840ac933e3b094f9",
@@ -79,7 +79,7 @@
"commands/gsd-onboard.md": "a35340ce39334fc7",
"commands/gsd-pause-work.md": "40a953fcddbedb5d",
"commands/gsd-phase.md": "5dd3d40e3461a973",
"commands/gsd-plan-phase.md": "d6ba79bf0ede5bcd",
"commands/gsd-plan-phase.md": "8ab637314511ea88",
"commands/gsd-plan-review-convergence.md": "f3aab422e0708dae",
"commands/gsd-pr-branch.md": "ab1fcffe92129061",
"commands/gsd-profile-user.md": "37c9ef202669bfd3",
@@ -179,7 +179,7 @@
"gsd-core/references/model-profiles.md": "e067ad3df6770db1",
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
"gsd-core/references/planner-antipatterns.md": "7ed54ec1e2cc54ac",
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
"gsd-core/references/planner-reversibility.md": "d75786c2d3e6ff5c",
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
@@ -216,7 +217,7 @@
"gsd-core/references/tdd.md": "e4708ede157478b6",
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
"gsd-core/references/thinking-models-planning.md": "7e19462313fa028f",
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
@@ -310,7 +311,7 @@
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
"gsd-core/workflows/discuss-phase/templates/context.md": "6cd929e989fe2b0f",
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
"gsd-core/workflows/do.md": "90df4f1fe248cdf3",
"gsd-core/workflows/docs-update.md": "b5cdf1c35043cf7b",
@@ -332,7 +333,7 @@
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
"gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0",
"gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50",
"gsd-core/workflows/help/modes/full.md": "dda8f6d101b0870d",
"gsd-core/workflows/help/modes/full.md": "6e01ecd0da6f1848",
"gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d",
"gsd-core/workflows/import.md": "31a0f3a33154939f",
"gsd-core/workflows/inbox.md": "a7d439981775bc29",
@@ -354,7 +355,7 @@
"gsd-core/workflows/onboard.md": "f29c4fbef3b473fd",
"gsd-core/workflows/pause-work.md": "f2b33bba5593d422",
"gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc",
"gsd-core/workflows/plan-phase.md": "f05af110cc6b0eb5",
"gsd-core/workflows/plan-phase.md": "e7d0ef2b78660739",
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072",
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2",
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5",
@@ -472,7 +473,7 @@
"skills/gsd-ns-workflow/skills/mvp-phase/SKILL.md": "3455ea7562a447a2",
"skills/gsd-ns-workflow/skills/next/SKILL.md": "63659cd48a0276f9",
"skills/gsd-ns-workflow/skills/phase/SKILL.md": "b377b03d13db8573",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "4564f415845d6c15",
"skills/gsd-ns-workflow/skills/plan-phase/SKILL.md": "a0b43b907671a98e",
"skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md": "84af9aa192ec349f",
"skills/gsd-ns-workflow/skills/progress/SKILL.md": "fb24eab4a0e5f6a3",
"skills/gsd-ns-workflow/skills/quick/SKILL.md": "48629fef2b9ac5b0",

View File

@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -188,6 +188,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -117,6 +117,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -121,6 +121,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -224,6 +224,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -119,6 +119,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -182,6 +182,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -85,6 +85,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -118,6 +118,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -189,6 +189,7 @@
"gsd-core/references/planner-load-graph-context.md",
"gsd-core/references/planner-mvp-mode.md",
"gsd-core/references/planner-preconditions.md",
"gsd-core/references/planner-reversibility.md",
"gsd-core/references/planner-reviews.md",
"gsd-core/references/planner-revision.md",
"gsd-core/references/planner-source-audit.md",

View File

@@ -0,0 +1,577 @@
// allow-test-rule: source-text-is-the-product [#1951]
// Agent .md, workflow .md, command .md, reference .md and docs/reference/*.md —
// their text IS what the runtime loads, so asserting they document the
// reversibility contract tests the deployed surface, not derived behavior.
// Per the CONTRIBUTING.md exception matrix. The behavioral half
// (cmdVerifyPlanStructure) asserts the structural validator stays additive.
// Issue #1951.
'use strict';
const { describe, test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const { runGsdTools, createTempProject, cleanup } = require('./helpers.cjs');
const ROOT = path.resolve(__dirname, '..');
const PLANNER = path.join(ROOT, 'agents', 'gsd-planner.md');
const PLAN_MD_DOC = path.join(ROOT, 'docs', 'reference', 'plan-md.md');
const REVERSIBILITY_REF = path.join(ROOT, 'gsd-core', 'references', 'planner-reversibility.md');
const ANTIPATTERNS_REF = path.join(ROOT, 'gsd-core', 'references', 'planner-antipatterns.md');
const THINKING_MODELS = path.join(ROOT, 'gsd-core', 'references', 'thinking-models-planning.md');
const PLAN_PHASE_WORKFLOW = path.join(ROOT, 'gsd-core', 'workflows', 'plan-phase.md');
const PLAN_PHASE_CMD = path.join(ROOT, 'commands', 'gsd', 'plan-phase.md');
const HELP_FULL = path.join(ROOT, 'gsd-core', 'workflows', 'help', 'modes', 'full.md');
const DISCUSS_CONTEXT_TEMPLATE = path.join(
ROOT, 'gsd-core', 'workflows', 'discuss-phase', 'templates', 'context.md',
);
/** The canonical three-level taxonomy. Single source of truth for this suite. */
const RATINGS = ['reversible', 'costly', 'one-way'];
/** Agent-file hard red line (tests/agent-size-budget.test.cjs LARGE_CAP). */
const LARGE_CAP = 49152;
function read(file) {
return fs.readFileSync(file, 'utf-8').replace(/\r\n/g, '\n').replace(/\r/g, '\n');
}
/**
* Word-boundary rating match. A plain `.includes('reversible')` also matches
* inside "irreversible"/"irreversibility", which appear in anti-pattern prose —
* so a surface that dropped the real taxonomy entry could still pass.
*/
function namesRating(text, rating) {
// Escape every regex metacharacter, backslash included — a partial escape is
// js/incomplete-sanitization (CodeQL, high). `-` needs no escaping outside a
// character class, so the previous `-`-only replace was both incomplete and
// unnecessary.
const escaped = rating.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
return new RegExp(`\\b${escaped}\\b`).test(text);
}
/** The fenced ```bash blocks of a workflow file, so prose cannot satisfy a
* test that claims to assert on the parser. */
function bashBlocks(md) {
return [...md.matchAll(/```bash\r?\n([\s\S]*?)```/g)].map((m) => m[1]);
}
// ─── Acceptance #1: discuss-phase decisions carry a rating + rationale ───────
describe('#1951 discuss-phase: decisions carry a reversibility rating', () => {
test('CONTEXT.md template documents a Reversibility field on decisions', () => {
const tpl = read(DISCUSS_CONTEXT_TEMPLATE);
assert.match(
tpl,
/\*\*Reversibility:\*\*/,
'discuss-phase/templates/context.md must document a **Reversibility:** field on captured decisions',
);
});
test('template names all three ratings', () => {
const tpl = read(DISCUSS_CONTEXT_TEMPLATE);
for (const rating of RATINGS) {
assert.ok(
namesRating(tpl, rating),
`context.md template must name the "${rating}" rating`,
);
}
});
test('template pairs the rating with a rationale', () => {
const tpl = read(DISCUSS_CONTEXT_TEMPLATE);
assert.match(
tpl,
/\*\*Reversibility:\*\*[^\n]*rationale/i,
'the rating must be recorded together with its rationale, not bare',
);
});
test('rating is optional — decisions without one stay valid (back-compat)', () => {
const tpl = read(DISCUSS_CONTEXT_TEMPLATE);
assert.match(
tpl,
/reversibilit\w*[^\n]*optional|optional[^\n]*reversibilit/i,
'context.md template must state the reversibility field is optional',
);
});
});
// ─── Acceptance #2 + #3: planner checkpoint-insertion rules ─────────────────
describe('#1951 gsd-planner: one-way inserts a checkpoint, reversible does not', () => {
test('planner @-references the reversibility reference file', () => {
assert.ok(
read(PLANNER).includes('planner-reversibility.md'),
'gsd-planner.md must @-reference planner-reversibility.md (progressive disclosure)',
);
});
test(`planner stays under the ${LARGE_CAP}-char agent cap`, () => {
const planner = read(PLANNER);
assert.ok(
planner.length < LARGE_CAP,
`gsd-planner.md is ${planner.length} chars, must be < ${LARGE_CAP} (LF-normalized). `
+ 'Crossing the cap means EXTRACT to a reference file, not bump.',
);
});
test('planner states that a one-way decision inserts a checkpoint:decision', () => {
const planner = read(PLANNER);
assert.match(
planner,
/one-way[^\n]*checkpoint:decision|checkpoint:decision[^\n]*one-way/,
'gsd-planner.md must state that a one-way rating inserts a checkpoint:decision',
);
});
test('reference file states the checkpoint precedes the dependent task', () => {
const ref = read(REVERSIBILITY_REF);
assert.match(
ref,
/before[^\n]*(dependent|the task)/i,
'planner-reversibility.md must state the checkpoint is inserted BEFORE the dependent task',
);
});
test('reference file states reversible decisions insert no checkpoint', () => {
const ref = read(REVERSIBILITY_REF);
assert.match(
ref,
/reversible[^\n]*no checkpoint|no checkpoint[^\n]*reversible/i,
'planner-reversibility.md must state reversible ratings do NOT trigger a checkpoint',
);
});
test('reference file states costly is flagged but not blocking', () => {
const ref = read(REVERSIBILITY_REF);
assert.match(
ref,
/costly[^\n]*(flag|visible)[^\n]*not (block|gat)/i,
'planner-reversibility.md must state costly ratings are flagged in the plan but never block',
);
});
test('reference file requires autonomous:false when a checkpoint is inserted', () => {
const ref = read(REVERSIBILITY_REF);
assert.match(
ref,
/autonomous:\s*false/,
'inserting a checkpoint flips the plan out of autonomous mode — the reference must say so',
);
});
test('reference file defaults to reversible when unsure (checkpoint-fatigue guard)', () => {
const ref = read(REVERSIBILITY_REF);
assert.match(
ref,
/default[^\n]*reversible|when (unsure|in doubt)[^\n]*reversible/i,
'the taxonomy must default to reversible when unsure, or every decision becomes a gate',
);
});
});
// ─── Acceptance #4: the rating is persisted to the plan ─────────────────────
describe('#1951 plan-md.md documents the <reversibility> element', () => {
test('plan-md.md documents the element', () => {
assert.match(
read(PLAN_MD_DOC),
/<reversibility/,
'docs/reference/plan-md.md must document the <reversibility> task element',
);
});
test('plan-md.md documents all three ratings', () => {
const doc = read(PLAN_MD_DOC);
for (const rating of RATINGS) {
assert.ok(
namesRating(doc, rating),
`plan-md.md must document the "${rating}" rating`,
);
}
});
test('plan-md.md states the element is optional', () => {
const doc = read(PLAN_MD_DOC);
assert.match(
doc,
/<reversibility[\s\S]{0,600}?optional|optional[\s\S]{0,600}?<reversibility/,
'plan-md.md must describe <reversibility> as an optional element',
);
});
});
// ─── Acceptance #5: the override ────────────────────────────────────────────
describe('#1951 --no-reversibility-gates override', () => {
// Asserted against the fenced bash blocks, NOT the whole file: the workflow's
// own prose mentions `--no-reversibility-gates` and `REVERSIBILITY_GATES=false`
// in one sentence, so a whole-file substring check would still pass with the
// conditional deleted — it would be testing the documentation, not the parser.
test('plan-phase workflow defaults REVERSIBILITY_GATES to true (in bash)', () => {
assert.ok(
bashBlocks(read(PLAN_PHASE_WORKFLOW)).some((b) => /^REVERSIBILITY_GATES=true$/m.test(b)),
'a bash block in plan-phase.md must assign REVERSIBILITY_GATES=true',
);
});
test('plan-phase workflow parses --no-reversibility-gates to false (in bash)', () => {
// One physical line: `if [[ ... --no-reversibility-gates ... ]]; then REVERSIBILITY_GATES=false; fi`
const conditional = /^if \[\[.*--no-reversibility-gates.*\]\];\s*then\s+REVERSIBILITY_GATES=false;\s*fi\s*$/m;
assert.ok(
bashBlocks(read(PLAN_PHASE_WORKFLOW)).some((b) => conditional.test(b)),
'a bash block in plan-phase.md must contain the --no-reversibility-gates -> '
+ 'REVERSIBILITY_GATES=false conditional (prose mentioning both tokens is not the parser)',
);
});
test('plan-phase workflow injects REVERSIBILITY_GATES into the planner prompt', () => {
assert.match(
read(PLAN_PHASE_WORKFLOW),
/\*\*REVERSIBILITY_GATES:\*\* \$\{REVERSIBILITY_GATES\}/,
'plan-phase.md must inject **REVERSIBILITY_GATES:** ${REVERSIBILITY_GATES} into the planner prompt',
);
});
test('command argument-hint advertises the flag', () => {
const md = read(PLAN_PHASE_CMD);
const argHint = (md.match(/^argument-hint:.*$/m) || [''])[0];
assert.ok(
argHint.includes('--no-reversibility-gates'),
'commands/gsd/plan-phase.md argument-hint must list --no-reversibility-gates',
);
});
test('command documents the flag in its flag list', () => {
assert.match(
read(PLAN_PHASE_CMD),
/- `--no-reversibility-gates` —/,
'commands/gsd/plan-phase.md must document --no-reversibility-gates in its flag list',
);
});
test('help full mode lists the flag (argument-hint ↔ help parity)', () => {
assert.ok(
read(HELP_FULL).includes('--no-reversibility-gates'),
'workflows/help/modes/full.md must list --no-reversibility-gates',
);
});
test('override suppresses the gate but NOT the rating', () => {
const ref = read(REVERSIBILITY_REF);
assert.match(
ref,
/REVERSIBILITY_GATES=false[\s\S]{0,400}?(still|record|persist|emit)/i,
'the override must suppress checkpoint insertion while still persisting the rating — '
+ 'the signal survives an unattended run',
);
});
});
// ─── Behavioral: the structural validator stays additive ────────────────────
//
// cmdVerifyPlanStructure checks for PRESENCE of required tags and must not
// reject the new optional element. Covers every rating plus the absent case
// (the enum-boundary analog: each valid value, and the omitted value).
function planWith({ reversibility = null, precedingCheckpoint = false } = {}) {
const task = [];
if (precedingCheckpoint) {
task.push(
// Per #2444, cmdVerifyPlanStructure branches on task type: a
// checkpoint:decision requires <name> + <resume-signal> + <decision> +
// <options>, and is exempt from the <action>/<verify>/<done>/<files> set
// that auto/tracer tasks carry. This fixture mirrors that contract
// exactly rather than padding it with fields checkpoints do not need.
'<task type="checkpoint:decision" gate="blocking">',
' <name>Task 0: Confirm the on-disk format</name>',
' <decision>Pick the on-disk format</decision>',
' <context>Later phases read this file.</context>',
' <options>',
' <option id="option-a">',
' <name>Newline-delimited JSON</name>',
' <pros>Streamable, appendable, greppable</pros>',
' <cons>Larger on disk than a binary frame</cons>',
' </option>',
' <option id="option-b">',
' <name>Length-prefixed binary</name>',
' <pros>Compact, fast to seek</pros>',
' <cons>Opaque to standard tooling</cons>',
' </option>',
' </options>',
' <resume-signal>Select: option-a or option-b</resume-signal>',
'</task>',
'',
);
}
task.push(
'<task type="auto">',
' <name>Task 1: Test</name>',
);
if (reversibility !== null) {
task.push(` <reversibility rating="${reversibility}">rationale text</reversibility>`);
}
task.push(
' <files>src/x.ts</files>',
' <action>Do the thing.</action>',
' <verify><automated>echo ok</automated></verify>',
' <done>Done</done>',
'</task>',
'',
);
return [
'---',
'phase: 01-test',
'plan: 01',
'type: execute',
'wave: 1',
'depends_on: []',
'files_modified: [src/x.ts]',
// A plan containing any checkpoint must declare autonomous: false — the
// validator already errors otherwise, and inserting a reversibility gate
// is precisely what flips this field.
`autonomous: ${precedingCheckpoint ? 'false' : 'true'}`,
'must_haves:',
' truths:',
' - "something is true"',
'---',
'',
'<tasks>',
'',
...task,
'</tasks>',
].join('\n');
}
function verifyPlan(tmpDir, content) {
const rel = path.join('.planning', 'phases', '01-test', '01-01-PLAN.md');
fs.mkdirSync(path.join(tmpDir, '.planning', 'phases', '01-test'), { recursive: true });
fs.writeFileSync(path.join(tmpDir, rel), content);
const result = runGsdTools(`verify plan-structure ${rel}`, tmpDir);
assert.ok(result.success, `verify plan-structure failed to run: ${result.error}`);
return JSON.parse(result.output);
}
describe('#1951 cmdVerifyPlanStructure accepts <reversibility> (additive)', () => {
for (const rating of RATINGS) {
test(`plan with rating="${rating}" passes structural validation`, (t) => {
const tmp = createTempProject();
t.after(() => cleanup(tmp));
// one-way needs its gate present, or the ungated-one-way warning fires
// (that path is asserted separately below).
const out = verifyPlan(tmp, planWith({
reversibility: rating,
precedingCheckpoint: rating === 'one-way',
}));
assert.strictEqual(
out.valid, true,
`plan with rating="${rating}" must be valid, errors: ${JSON.stringify(out.errors)}`,
);
assert.deepStrictEqual(out.errors, [], 'no validation path may reject a <reversibility> task');
assert.ok(
!(out.warnings || []).some((w) => /reversibilit/i.test(w)),
`a well-formed rating="${rating}" task must not be flagged`,
);
});
}
test('plan without <reversibility> still passes (back-compat)', (t) => {
const tmp = createTempProject();
t.after(() => cleanup(tmp));
const out = verifyPlan(tmp, planWith({ reversibility: null }));
assert.strictEqual(
out.valid, true,
`plan without <reversibility> must be valid (back-compat), errors: ${JSON.stringify(out.errors)}`,
);
assert.ok(
!(out.warnings || []).some((w) => /reversibilit/i.test(w)),
'an unrated plan must not be flagged',
);
});
});
// ─── The gate is machine-detectable, not prose-only ─────────────────────────
//
// The feature's whole promise is that a one-way door gets confirmed before it
// is walked through. A planner that emits the rating but skips the checkpoint
// silently reopens exactly the gap this feature closes, so the validator says
// so. It warns rather than errors: <reversibility> stays additive and the plan
// stays valid.
// Each verifyPlan() spawns gsd-tools, which is the dominant cost of this file
// (measured 5.6s, the 18x-under-median entry that motivated adding it to
// tests/test-timings.json). Assertions are grouped per distinct plan shape so
// the suite spawns once per shape rather than once per assertion.
describe('#1951 ungated one-way rating is flagged', () => {
test('one-way with NO preceding checkpoint:decision warns, and stays valid', (t) => {
const tmp = createTempProject();
t.after(() => cleanup(tmp));
const out = verifyPlan(tmp, planWith({ reversibility: 'one-way', precedingCheckpoint: false }));
assert.ok(
(out.warnings || []).some((w) => /one-way/.test(w) && /checkpoint:decision/.test(w)),
`an ungated one-way rating must warn; got warnings: ${JSON.stringify(out.warnings)}`,
);
assert.strictEqual(
out.valid, true,
`an ungated one-way rating must warn, never error; errors: ${JSON.stringify(out.errors)}`,
);
});
test('one-way WITH a preceding checkpoint:decision does not warn', (t) => {
const tmp = createTempProject();
t.after(() => cleanup(tmp));
const out = verifyPlan(tmp, planWith({ reversibility: 'one-way', precedingCheckpoint: true }));
assert.ok(
!(out.warnings || []).some((w) => /one-way/.test(w)),
`a gated one-way rating must not warn; got warnings: ${JSON.stringify(out.warnings)}`,
);
});
// `reversible` and `costly` are covered by the additive suite above: those
// ratings run there with precedingCheckpoint=false (ungated) and assert no
// /reversibilit/ warning at all. The gate warning's text contains both
// "reversibility" and "one-way", so that assertion strictly subsumes a
// separate never-flagged-as-ungated check — which would only re-spawn
// gsd-tools twice to prove the same thing.
});
// ─── Parity: one taxonomy, not two ──────────────────────────────────────────
//
// DEFECT.GENERATIVE-FIX-DIVERGENCE. thinking-models-planning.md #4 shipped a
// BINARY REVERSIBLE/IRREVERSIBLE classification before this feature existed.
// Two overlapping taxonomies in files both loaded by gsd-planner is the exact
// divergence class this guard exists to prevent.
describe('#1951 taxonomy parity: a single three-level vocabulary', () => {
test('the Reversibility Test thinking model uses the canonical three ratings', () => {
const tm = read(THINKING_MODELS);
const section = (tm.match(/## \d+\. Reversibility Test[\s\S]*?(?=\n## |$)/) || [''])[0];
assert.ok(section.length > 0, 'thinking-models-planning.md must retain a Reversibility Test model');
for (const rating of RATINGS) {
assert.ok(
namesRating(section, rating),
`the Reversibility Test model must use the canonical "${rating}" rating`,
);
}
});
test('the legacy binary IRREVERSIBLE vocabulary is gone', () => {
const section = (read(THINKING_MODELS).match(/## \d+\. Reversibility Test[\s\S]*?(?=\n## |$)/) || [''])[0];
assert.ok(
!/IRREVERSIBLE/.test(section),
'the binary REVERSIBLE/IRREVERSIBLE vocabulary must be replaced by the three-level taxonomy, '
+ 'not shipped alongside it',
);
});
test('thinking model points at the canonical taxonomy owner', () => {
const section = (read(THINKING_MODELS).match(/## \d+\. Reversibility Test[\s\S]*?(?=\n## |$)/) || [''])[0];
assert.ok(
section.includes('planner-reversibility.md'),
'the thinking model must point at planner-reversibility.md as the taxonomy owner',
);
});
test('plan-md.md and planner-reversibility.md agree on the canonical tag spelling', () => {
assert.ok(read(PLAN_MD_DOC).includes('<reversibility'), 'plan-md.md must spell <reversibility');
assert.ok(read(REVERSIBILITY_REF).includes('<reversibility'), 'planner-reversibility.md must spell <reversibility');
});
test('every surface naming a rating uses the same three values', () => {
const surfaces = {
'planner-reversibility.md': read(REVERSIBILITY_REF),
'plan-md.md': read(PLAN_MD_DOC),
'context.md template': read(DISCUSS_CONTEXT_TEMPLATE),
};
for (const [name, text] of Object.entries(surfaces)) {
for (const rating of RATINGS) {
assert.ok(namesRating(text, rating), `${name} must name the "${rating}" rating`);
}
}
});
});
// ─── Untrusted-input boundary on the rationale (ADR-1577) ───────────────────
//
// The rationale originates in conversation and flows CONTEXT.md -> planner ->
// PLAN.md -> executor, each hop an LLM reading the previous hop's output. Both
// authoring surfaces must say the text is data, and must name the closing-tag
// hazard specifically — a rationale that terminates its own element injects
// sibling structure the executor reads as real tasks.
describe('#1951 rationale is treated as untrusted data', () => {
test('reference file forbids following directives inside a rationale', () => {
const ref = read(REVERSIBILITY_REF);
assert.match(
ref,
/never follow[^\n]*directives|rationale is data, never instructions/i,
'planner-reversibility.md must state a rationale is data, not instructions to follow',
);
});
test('reference file names the closing-tag injection hazard', () => {
const ref = read(REVERSIBILITY_REF);
assert.ok(
ref.includes('</reversibility>'),
'planner-reversibility.md must name the </reversibility> early-termination hazard explicitly',
);
});
test('reference file cites the untrusted-input boundary standard', () => {
const ref = read(REVERSIBILITY_REF);
assert.match(
ref,
/ADR-1577|untrusted-input-boundary/,
'the guidance must cite the repo standard (ADR-1577 / untrusted-input-boundary.md), not invent its own',
);
});
test('discuss-phase template carries the same boundary instruction', () => {
const tpl = read(DISCUSS_CONTEXT_TEMPLATE);
assert.match(
tpl,
/never as an instruction|as data, never/i,
'context.md template must instruct the discuss agent to record the rationale as data',
);
assert.ok(
tpl.includes('</reversibility>'),
'context.md template must name the plan-tag stripping requirement explicitly',
);
});
});
// ─── No content loss from the planner extraction ────────────────────────────
//
// Making room under the agent cap relocated the checkpoint DO/DON'T guidance
// into planner-antipatterns.md (already @-referenced by gsd-planner.md, so the
// planner still loads it). Guard that the relocation preserved the guidance
// rather than dropping it.
describe('#1951 planner checkpoint guidance survived the extraction', () => {
test('relocated DO/DON\'T guidance lives in planner-antipatterns.md', () => {
const ref = read(ANTIPATTERNS_REF);
for (const phrase of [
'Automate everything before',
'mix multiple verifications',
'before automation completes',
]) {
assert.ok(
ref.includes(phrase),
`planner-antipatterns.md must carry the relocated guidance: "${phrase}"`,
);
}
});
test('gsd-planner.md still reaches that guidance via its @-reference', () => {
assert.ok(
read(PLANNER).includes('planner-antipatterns.md'),
'gsd-planner.md must keep the @-reference that loads the relocated guidance',
);
});
});

View File

@@ -6,7 +6,7 @@
"test-events-linux-node22.jsonl",
"test-events-linux-node24.jsonl"
],
"file_count": 637,
"file_count": 638,
"timings": {
"active-workstream-store.test.cjs": 102,
"active-workstream-store.unit.test.cjs": 332,
@@ -510,6 +510,7 @@
"research-store.property.test.cjs": 326,
"research-store.test.cjs": 405,
"resolution.test.cjs": 37,
"reversibility-tagging.test.cjs": 5595,
"review-default-reviewers-config.test.cjs": 6391,
"review-default-reviewers-resolution.test.cjs": 81,
"review-default-reviewers-workflow.test.cjs": 128,

View File

@@ -53,7 +53,7 @@
"onboard.md": 8877,
"pause-work.md": 14441,
"plan-milestone-gaps.md": 11809,
"plan-phase.md": 94470,
"plan-phase.md": 94400,
"plan-review-convergence.md": 26285,
"plant-seed.md": 12150,
"pr-branch.md": 15963,