@opengsd/gsd-core 1.7.0-rc.2 → 1.7.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/GEMINI.md +25 -23
  4. package/README.ja-JP.md +4 -3
  5. package/README.ko-KR.md +4 -3
  6. package/README.md +7 -6
  7. package/README.pt-BR.md +4 -3
  8. package/README.zh-CN.md +4 -3
  9. package/agents/gsd-advisor-researcher.md +1 -1
  10. package/agents/gsd-ai-researcher.md +1 -1
  11. package/agents/gsd-code-fixer.md +1 -1
  12. package/agents/gsd-debug-session-manager.md +1 -1
  13. package/agents/gsd-debugger.md +1 -1
  14. package/agents/gsd-domain-researcher.md +1 -1
  15. package/agents/gsd-eval-auditor.md +1 -1
  16. package/agents/gsd-executor.md +4 -4
  17. package/agents/gsd-intel-updater.md +1 -1
  18. package/agents/gsd-mempalace-curator.md +1 -1
  19. package/agents/gsd-phase-researcher.md +2 -2
  20. package/agents/gsd-plan-checker.md +1 -1
  21. package/agents/gsd-planner.md +2 -2
  22. package/agents/gsd-project-researcher.md +2 -2
  23. package/agents/gsd-research-synthesizer.md +1 -1
  24. package/agents/gsd-ui-researcher.md +2 -2
  25. package/agents/gsd-verifier.md +2 -2
  26. package/bin/install.js +132 -464
  27. package/commands/gsd/map-codebase.md +4 -4
  28. package/commands/gsd/mempalace-capture.md +1 -1
  29. package/commands/gsd/mempalace-recall.md +9 -5
  30. package/commands/gsd/next.md +29 -0
  31. package/commands/gsd/ns-project.md +2 -1
  32. package/commands/gsd/ns-workflow.md +5 -2
  33. package/commands/gsd/onboard.md +46 -0
  34. package/gsd-core/bin/ensure-runtime-build.cjs +246 -0
  35. package/gsd-core/bin/gsd-tools.cjs +72 -3
  36. package/gsd-core/bin/lib/capability-registry.cjs +684 -264
  37. package/gsd-core/bin/lib/capability-state.cjs +117 -18
  38. package/gsd-core/bin/lib/capability-writer.cjs +11 -1
  39. package/gsd-core/bin/lib/check-command-router.cjs +111 -1
  40. package/gsd-core/bin/lib/claude-orchestration-command-router.cjs +136 -0
  41. package/gsd-core/bin/lib/claude-orchestration.cjs +404 -0
  42. package/gsd-core/bin/lib/clusters.cjs +2 -0
  43. package/gsd-core/bin/lib/command-aliases.cjs +8 -0
  44. package/gsd-core/bin/lib/config.cjs +19 -1
  45. package/gsd-core/bin/lib/core-utils.cjs +41 -0
  46. package/gsd-core/bin/lib/external-job.cjs +287 -0
  47. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +151 -0
  48. package/gsd-core/bin/lib/graphify.cjs +41 -9
  49. package/gsd-core/bin/lib/init-command-router.cjs +4 -0
  50. package/gsd-core/bin/lib/init.cjs +25 -69
  51. package/gsd-core/bin/lib/install-engine.cjs +8 -5
  52. package/gsd-core/bin/lib/install-profiles.cjs +2 -0
  53. package/gsd-core/bin/lib/loop-resolver.cjs +7 -1
  54. package/gsd-core/bin/lib/milestone.cjs +7 -1
  55. package/gsd-core/bin/lib/model-resolver.cjs +69 -4
  56. package/gsd-core/bin/lib/onboard-projection.cjs +309 -0
  57. package/gsd-core/bin/lib/phase.cjs +14 -2
  58. package/gsd-core/bin/lib/plan-scan.cjs +9 -1
  59. package/gsd-core/bin/lib/profile-output.cjs +1 -1
  60. package/gsd-core/bin/lib/prohibition-enforcement.cjs +21 -19
  61. package/gsd-core/bin/lib/roadmap.cjs +17 -2
  62. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +18 -13
  63. package/gsd-core/bin/lib/runtime-name-policy.cjs +11 -11
  64. package/gsd-core/bin/lib/shell-command-projection.cjs +12 -8
  65. package/gsd-core/bin/lib/smart-entry.cjs +521 -0
  66. package/gsd-core/bin/lib/surface.cjs +63 -33
  67. package/gsd-core/bin/lib/update-context.cjs +0 -5
  68. package/gsd-core/bin/shared/config-schema.manifest.json +1 -0
  69. package/gsd-core/bin/shared/model-catalog.json +5 -5
  70. package/gsd-core/bin/shared/runtime-aliases.manifest.json +0 -5
  71. package/gsd-core/references/gates.md +1 -1
  72. package/gsd-core/references/gsd-run-resolver.md +8 -0
  73. package/gsd-core/references/planning-config.md +1 -1
  74. package/gsd-core/templates/project.md +1 -1
  75. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  76. package/gsd-core/workflows/add-backlog.md +1 -1
  77. package/gsd-core/workflows/add-phase.md +1 -1
  78. package/gsd-core/workflows/add-tests.md +1 -1
  79. package/gsd-core/workflows/add-todo.md +1 -1
  80. package/gsd-core/workflows/ai-integration-phase.md +1 -1
  81. package/gsd-core/workflows/audit-fix.md +1 -1
  82. package/gsd-core/workflows/audit-milestone.md +1 -1
  83. package/gsd-core/workflows/audit-uat.md +1 -1
  84. package/gsd-core/workflows/autonomous.md +1 -1
  85. package/gsd-core/workflows/check-todos.md +1 -1
  86. package/gsd-core/workflows/cleanup.md +1 -1
  87. package/gsd-core/workflows/code-review-fix.md +1 -1
  88. package/gsd-core/workflows/code-review.md +1 -1
  89. package/gsd-core/workflows/complete-milestone.md +1 -1
  90. package/gsd-core/workflows/debug.md +1 -1
  91. package/gsd-core/workflows/diagnose-issues.md +1 -1
  92. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  93. package/gsd-core/workflows/discuss-phase/modes/auto.md +1 -1
  94. package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
  95. package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
  96. package/gsd-core/workflows/discuss-phase.md +2 -2
  97. package/gsd-core/workflows/do.md +5 -4
  98. package/gsd-core/workflows/docs-update.md +1 -1
  99. package/gsd-core/workflows/edit-phase.md +1 -1
  100. package/gsd-core/workflows/eval-review.md +1 -1
  101. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
  102. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  103. package/gsd-core/workflows/execute-phase.md +4 -5
  104. package/gsd-core/workflows/execute-plan.md +1 -1
  105. package/gsd-core/workflows/explore.md +1 -1
  106. package/gsd-core/workflows/extract-learnings.md +1 -1
  107. package/gsd-core/workflows/forensics.md +1 -1
  108. package/gsd-core/workflows/graduation.md +1 -1
  109. package/gsd-core/workflows/health.md +1 -1
  110. package/gsd-core/workflows/help/modes/brief.md +2 -1
  111. package/gsd-core/workflows/help/modes/default.md +2 -1
  112. package/gsd-core/workflows/help/modes/full.md +25 -1
  113. package/gsd-core/workflows/help/modes/topic.md +2 -1
  114. package/gsd-core/workflows/import.md +1 -1
  115. package/gsd-core/workflows/ingest-docs.md +1 -1
  116. package/gsd-core/workflows/insert-phase.md +1 -1
  117. package/gsd-core/workflows/list-seeds.md +1 -1
  118. package/gsd-core/workflows/list-workspaces.md +1 -1
  119. package/gsd-core/workflows/manager.md +1 -1
  120. package/gsd-core/workflows/map-codebase.md +1 -1
  121. package/gsd-core/workflows/milestone-summary.md +1 -1
  122. package/gsd-core/workflows/mvp-phase.md +1 -1
  123. package/gsd-core/workflows/new-milestone.md +1 -1
  124. package/gsd-core/workflows/new-project.md +1 -1
  125. package/gsd-core/workflows/new-workspace.md +1 -1
  126. package/gsd-core/workflows/next.md +1 -1
  127. package/gsd-core/workflows/onboard.md +277 -0
  128. package/gsd-core/workflows/pause-work.md +1 -1
  129. package/gsd-core/workflows/plan-milestone-gaps.md +1 -1
  130. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
  131. package/gsd-core/workflows/plan-phase.md +9 -2
  132. package/gsd-core/workflows/plan-review-convergence.md +1 -1
  133. package/gsd-core/workflows/plant-seed.md +1 -1
  134. package/gsd-core/workflows/pr-branch.md +1 -1
  135. package/gsd-core/workflows/profile-user.md +1 -1
  136. package/gsd-core/workflows/progress.md +1 -1
  137. package/gsd-core/workflows/quick.md +21 -1
  138. package/gsd-core/workflows/reapply-patches.md +1 -1
  139. package/gsd-core/workflows/remove-phase.md +1 -1
  140. package/gsd-core/workflows/remove-workspace.md +1 -1
  141. package/gsd-core/workflows/resume-project.md +1 -1
  142. package/gsd-core/workflows/review.md +43 -7
  143. package/gsd-core/workflows/scan.md +1 -1
  144. package/gsd-core/workflows/secure-phase.md +1 -1
  145. package/gsd-core/workflows/settings-advanced.md +3 -1
  146. package/gsd-core/workflows/settings-integrations.md +1 -1
  147. package/gsd-core/workflows/settings.md +1 -1
  148. package/gsd-core/workflows/ship.md +1 -1
  149. package/gsd-core/workflows/sketch-wrap-up.md +1 -1
  150. package/gsd-core/workflows/sketch.md +1 -1
  151. package/gsd-core/workflows/smart-entry.md +120 -0
  152. package/gsd-core/workflows/spec-phase.md +8 -6
  153. package/gsd-core/workflows/spike-wrap-up.md +1 -1
  154. package/gsd-core/workflows/spike.md +1 -1
  155. package/gsd-core/workflows/stats.md +1 -1
  156. package/gsd-core/workflows/thread.md +1 -1
  157. package/gsd-core/workflows/transition.md +1 -1
  158. package/gsd-core/workflows/ui-phase.md +1 -1
  159. package/gsd-core/workflows/ui-review.md +1 -1
  160. package/gsd-core/workflows/ultraplan-phase.md +1 -1
  161. package/gsd-core/workflows/update.md +3 -6
  162. package/gsd-core/workflows/validate-phase.md +1 -1
  163. package/gsd-core/workflows/verify-phase.md +1 -1
  164. package/gsd-core/workflows/verify-work.md +62 -4
  165. package/package.json +3 -5
  166. package/scripts/ci-test-scope.cjs +19 -1
  167. package/scripts/gen-golden-install-parity-zcode.cjs +77 -0
  168. package/scripts/generate-package-identity.cjs +27 -2
  169. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -148
  170. package/scripts/lint-regression-test-names.allowlist.json +1 -273
  171. package/scripts/lint-test-file-count.allowlist.json +7 -91
  172. package/scripts/research-profiles.cjs +6 -6
  173. package/scripts/run-tests.cjs +18 -3
  174. package/scripts/slurm-adapter.cjs +269 -0
  175. package/scripts/sync-manifest-versions.cjs +3 -2
  176. package/scripts/sync-runtime-launcher.cjs +20 -2
  177. package/skills/gsd-map-codebase/SKILL.md +3 -3
  178. package/skills/gsd-mempalace-capture/SKILL.md +1 -1
  179. package/skills/gsd-mempalace-recall/SKILL.md +9 -5
  180. package/skills/gsd-next/SKILL.md +30 -0
  181. package/skills/gsd-ns-project/SKILL.md +1 -0
  182. package/skills/gsd-ns-workflow/SKILL.md +4 -1
  183. package/skills/gsd-onboard/SKILL.md +46 -0
  184. package/gemini-extension.json +0 -6
@@ -29,7 +29,7 @@ Then verify each level against the actual codebase.
29
29
  Load phase operation context:
30
30
 
31
31
  ```bash
32
- _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
32
+ _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
33
33
  INIT=$(gsd_run query init.phase-op "${PHASE_ARG}")
34
34
  if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
35
35
  ```
@@ -37,7 +37,7 @@ No Pass/Fail buttons. No severity questions. Just: "Here's what should happen. D
37
37
  If $ARGUMENTS contains a phase number, load context:
38
38
 
39
39
  ```bash
40
- _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
40
+ _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
41
41
  GSD_WS=""
42
42
  echo "$ARGUMENTS" | grep -qE -- '--ws[[:space:]]+[^[:space:]]+' && GSD_WS=$(echo "$ARGUMENTS" | grep -oE -- '--ws[[:space:]]+[^[:space:]]+')
43
43
  PHASE_ARG=$(echo "$ARGUMENTS" | sed -E 's/--ws[[:space:]]+[^[:space:]]+//g' | xargs)
@@ -372,6 +372,28 @@ reason: "{verbatim user response}"
372
372
 
373
373
  Note: Blocked tests do NOT go into the Gaps section (they aren't code issues — they're prerequisite gates).
374
374
 
375
+ **If response indicates a deferred follow-up (NOT a current-phase blocker):**
376
+ - "later", "future", "follow-up", "next version", "out of scope", "nice to have", "not now", "defer", "down the road", "separate phase", "phase 2"
377
+
378
+ These are future-work ideas, not code issues for the current phase. Capture them WITHOUT creating a gap plan (#1921 — a deferred follow-up must never become a blocking gap or spawn a fix plan):
379
+
380
+ Update Tests section:
381
+ ```
382
+ ### {N}. {name}
383
+ expected: {expected}
384
+ result: skipped
385
+ reason: "Deferred follow-up: {verbatim user response}"
386
+ ```
387
+
388
+ Append to UAT.md `## Deferred Follow-Ups` (create the section if absent):
389
+ ```yaml
390
+ - test: {N}
391
+ idea: "{verbatim user response}"
392
+ deferred_at: {today}
393
+ ```
394
+
395
+ Do NOT append to `## Gaps` — deferred follow-ups are not blocking gaps. Continue to the next test.
396
+
375
397
  **If response is anything else:**
376
398
  - Treat as issue description
377
399
 
@@ -393,7 +415,8 @@ severity: {inferred}
393
415
 
394
416
  Append to Gaps section (structured YAML for plan-phase --gaps):
395
417
  ```yaml
396
- - truth: "{expected behavior from test}"
418
+ - gap_id: G-{phase}-{N} # Stable id (phase + test number) — gap-closure plans tag it in their frontmatter so verify-work can reconcile resolved gaps on resume (#1921).
419
+ truth: "{expected behavior from test}"
397
420
  status: failed
398
421
  reason: "User reported: {verbatim user response}"
399
422
  severity: {inferred}
@@ -411,9 +434,35 @@ If more tests remain → Update Current Test, go to `present_test`
411
434
  If no more tests → Go to `complete_session`
412
435
  </step>
413
436
 
437
+ <step name="reconcile_gaps">
438
+ **Reconcile diagnosed gaps against completed gap-closure plans (#1921):**
439
+
440
+ When verify-work resumes after `/gsd:execute-phase --gaps-only`, the UAT `## Gaps` entries still read `status: failed` even though their fix plans have executed. Without reconciliation verify-work re-diagnoses them as fresh blockers and spawns new gap plans — losing the verification state. This step closes the loop.
441
+
442
+ Read the UAT `## Gaps` section and the phase dir `*-PLAN.md` frontmatter. For each gap with `status: failed`:
443
+ 1. Find a `*-PLAN.md` whose frontmatter `gap_ids` includes the gap's `gap_id` (`G-{phase}-{N}`).
444
+ 2. If such a plan exists AND has a matching `*-SUMMARY.md` in the phase dir (the plan was executed by `--gaps-only`), the gap is **resolved** — update its YAML in place:
445
+ ```yaml
446
+ - gap_id: G-{phase}-{N}
447
+ status: resolved # was: failed
448
+ resolved_by: {plan basename}
449
+ resolved_at: {today}
450
+ ```
451
+ 3. If no plan references the `gap_id`, or the plan has no SUMMARY, leave the gap `status: failed` (still open).
452
+
453
+ Read plan frontmatter directly in-context — do not pipe it through a shell parser. After reconciliation, announce:
454
+ ```
455
+ Reconciled gap-closure state: {resolved_count} gap(s) resolved by executed plans, {open_count} still open.
456
+ ```
457
+
458
+ Resolved gaps are NOT re-diagnosed and do NOT spawn new gap plans. If the user later reports the same behavior as still broken, treat it as a new issue (a regression) with a fresh `gap_id`.
459
+ </step>
460
+
414
461
  <step name="resume_from_file">
415
462
  **Resume testing from UAT file:**
416
463
 
464
+ **First run `reconcile_gaps`** (above) so gaps already fixed by `/gsd:execute-phase --gaps-only` are marked `resolved` before testing resumes (#1921).
465
+
417
466
  Read the full UAT file.
418
467
 
419
468
  Find first test with `result: [pending]`.
@@ -652,7 +701,7 @@ Display:
652
701
 
653
702
  Spawn gsd-planner in --gaps mode:
654
703
 
655
- ```
704
+ ````
656
705
  Agent(
657
706
  prompt="""
658
707
  <planning_context>
@@ -673,13 +722,22 @@ ${AGENT_SKILLS_PLANNER}
673
722
  <downstream_consumer>
674
723
  Output consumed by /gsd:execute-phase
675
724
  Plans must be executable prompts.
725
+
726
+ **Gap linkage (#1921):** each created `*-PLAN.md` MUST list the UAT gap ids it addresses in its frontmatter:
727
+ ```yaml
728
+ ---
729
+ gap_closure: true
730
+ gap_ids: [G-{phase}-{N}, ...] # the ## Gaps gap_id values this plan fixes
731
+ ---
732
+ ```
733
+ This lets `/gsd:verify-work` reconcile resolved gaps on resume (a gap whose plan has a matching `*-SUMMARY.md` is marked `status: resolved`, not re-diagnosed as a fresh blocker).
676
734
  </downstream_consumer>
677
735
  """,
678
736
  subagent_type="gsd-planner",
679
737
  model="{planner_model}",
680
738
  description="Plan gap fixes for Phase {phase}"
681
739
  )
682
- ```
740
+ ````
683
741
 
684
742
  > **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
685
743
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengsd/gsd-core",
3
- "version": "1.7.0-rc.2",
3
+ "version": "1.7.0-rc.4",
4
4
  "description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.",
5
5
  "main": ".opencode/plugins/gsd-core.js",
6
6
  "bin": {
@@ -18,7 +18,6 @@
18
18
  "agents",
19
19
  ".claude-plugin",
20
20
  ".opencode",
21
- "gemini-extension.json",
22
21
  "GEMINI.md",
23
22
  "hooks",
24
23
  "scripts"
@@ -30,8 +29,6 @@
30
29
  "meta-prompting",
31
30
  "context-engineering",
32
31
  "spec-driven-development",
33
- "gemini",
34
- "gemini-cli",
35
32
  "codex",
36
33
  "codex-cli"
37
34
  ],
@@ -97,7 +94,7 @@
97
94
  "pretest:coverage": "npm run build:lib && npm run lint:skill-deps",
98
95
  "lint": "eslint . --cache --cache-location node_modules/.cache/eslint/",
99
96
  "lint:fix": "eslint . --fix",
100
- "lint:ci": "npm run lint && npm run lint:skill-deps && node scripts/lint-test-file-count.cjs && node scripts/lint-command-contract.cjs && node scripts/lint-pr-check-project-dir.cjs && npm run lint:legacy-name && node scripts/lint-regression-test-names.cjs && node scripts/lint-allow-test-rule-refs.cjs && node scripts/lint-resolution-provenance.cjs",
97
+ "lint:ci": "npm run lint && npm run lint:skill-deps && npm run lint:generated-sync && node scripts/lint-test-file-count.cjs && node scripts/lint-command-contract.cjs && node scripts/lint-pr-check-project-dir.cjs && npm run lint:legacy-name && node scripts/lint-regression-test-names.cjs && node scripts/lint-allow-test-rule-refs.cjs && node scripts/lint-resolution-provenance.cjs",
101
98
  "lint:allow-test-rule-refs": "node scripts/lint-allow-test-rule-refs.cjs",
102
99
  "lint:regression-names": "node scripts/lint-regression-test-names.cjs",
103
100
  "lint:descriptions": "node scripts/lint-descriptions.cjs",
@@ -105,6 +102,7 @@
105
102
  "lint:test-file-count": "node scripts/lint-test-file-count.cjs",
106
103
  "lint:pr-checks": "node scripts/lint-pr-check-project-dir.cjs",
107
104
  "lint:changeset": "node scripts/changeset/lint.cjs",
105
+ "lint:generated-sync": "node scripts/gen-capability-registry.cjs --check && node scripts/gen-loop-host-contract.cjs --check && node scripts/gen-capability-matrix.cjs --check && node scripts/sync-manifest-versions.cjs --check && node scripts/gen-inventory-manifest.cjs --check && node scripts/generate-package-identity.cjs --check && node scripts/gen-plugin-skills.cjs --check",
108
106
  "lint:docs": "node scripts/lint-docs-required.cjs",
109
107
  "lint:legacy-name": "node scripts/lint-legacy-dir-name.cjs",
110
108
  "ci:test-scope": "node scripts/ci-test-scope.cjs",
@@ -133,7 +133,14 @@ const RULES = [
133
133
  'tests/install-regressions.test.cjs',
134
134
  'tests/install-runtime-artifacts.test.cjs',
135
135
  'tests/install-path-detection.test.cjs',
136
- 'tests/release-tarball-smoke.install.test.cjs',
136
+ // NOTE: release-tarball-smoke.install.test.cjs is intentionally NOT here.
137
+ // It is a 3–6 min `npm pack` + `npm install -g` integration test with its
138
+ // OWN dedicated workflow (.github/workflows/install-smoke.yml, triggered on
139
+ // the production install paths). Running it in the scoped/targeted lane too
140
+ // is redundant and blows the per-chunk Windows timeout when a broad PR
141
+ // bundles it with many other changed test files (epic #1969). See the
142
+ // SCOPED_LANE_EXCLUDE guard below, which also drops it when it is itself a
143
+ // changed test file.
137
144
  'tests/runtime-artifact-layout.test.cjs',
138
145
  'tests/golden-install-parity.test.cjs', // any src/installer change can alter emitted install artifacts → re-verify golden install parity (drift guard)
139
146
  ],
@@ -398,6 +405,17 @@ function classify(files) {
398
405
  }
399
406
  }
400
407
 
408
+ // Heavy integration tests that own a dedicated workflow must never run in the
409
+ // scoped/targeted lane — they carry a multi-minute cost that overruns the
410
+ // per-chunk timeout (worst on Windows) when a broad PR bundles them with many
411
+ // other changed test files, and their production paths already trigger their
412
+ // own workflow. Drop them however they entered (matched rule OR changed-file).
413
+ const SCOPED_LANE_EXCLUDE = new Set([
414
+ // covered by .github/workflows/install-smoke.yml
415
+ 'tests/release-tarball-smoke.install.test.cjs',
416
+ ]);
417
+ for (const f of SCOPED_LANE_EXCLUDE) { targeted.delete(f); windows.delete(f); }
418
+
401
419
  // code_changed: true when product/pipeline OR inert CI changed.
402
420
  // Docs-only PRs (neither flag set) get code_changed=false → full matrix skip.
403
421
  const codeChanged = productOrPipelineChanged || inertCiChanged;
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * Standalone golden-fixture generator for tests/golden-install-parity.
5
+ *
6
+ * This is a BUILD-TIME generation script — NOT a test run. It replicates the
7
+ * buildParityManifest logic from tests/golden-install-parity.test.cjs and
8
+ * captures the zcode fixture so the parity test (which the gsd-test gate runs)
9
+ * has a committed artifact to compare against. The authoritative test gate
10
+ * remains `gsd-test run`, never a local `node --test`.
11
+ *
12
+ * Usage: node scripts/gen-golden-install-parity-zcode.cjs
13
+ */
14
+ const fs = require('node:fs');
15
+ const path = require('node:path');
16
+ const crypto = require('node:crypto');
17
+
18
+ const ROOT = path.resolve(__dirname, '..');
19
+ const { walk, runMinimalInstall, RUNTIME_META } = require(path.join(ROOT, 'tests', 'helpers', 'install-shared.cjs'));
20
+ const PKG_VERSION = require(path.join(ROOT, 'package.json')).version;
21
+ const FIXTURE_DIR = path.join(ROOT, 'tests', 'fixtures', 'golden-install-parity');
22
+
23
+ const VOLATILE_FILES = new Set([
24
+ 'gsd-file-manifest.json',
25
+ 'gsd-install-state.json',
26
+ '.gsd-source',
27
+ 'gsd-core/CHANGELOG.md',
28
+ ]);
29
+ const HOOK_CONFIG_FILES = new Set(['settings.json', 'hooks.json']);
30
+ const EXCLUDED_PREFIXES = ['gsd-core/bin/lib/'];
31
+
32
+ function buildParityManifest(configDir, root) {
33
+ const allFiles = walk(configDir);
34
+ const unsorted = {};
35
+ for (const full of allFiles) {
36
+ const rel = path.relative(configDir, full).split(path.sep).join('/');
37
+ if (VOLATILE_FILES.has(rel)) continue;
38
+ if (HOOK_CONFIG_FILES.has(path.basename(rel))) continue;
39
+ if (EXCLUDED_PREFIXES.some((p) => rel.startsWith(p))) continue;
40
+ const content = fs.readFileSync(full);
41
+ const normalized = content.toString('utf8').split(root).join('<HOME>').split(PKG_VERSION).join('<VERSION>');
42
+ const hash = crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);
43
+ unsorted[rel] = hash;
44
+ }
45
+ const sorted = {};
46
+ for (const key of Object.keys(unsorted).sort()) sorted[key] = unsorted[key];
47
+ return sorted;
48
+ }
49
+
50
+ function cleanup(root) {
51
+ try { fs.rmSync(root, { recursive: true, force: true }); } catch { /* best effort */ }
52
+ }
53
+
54
+ // Regenerate the fixture for every runtime in RUNTIME_META. Needed when a
55
+ // SHARED gsd-core payload file (e.g. model-catalog.json, capability-registry)
56
+ // changes content — its hash appears in every runtime's manifest, so all
57
+ // fixtures must be recaptured together. Usage:
58
+ // node scripts/gen-golden-install-parity-zcode.cjs [runtime ...]
59
+ // With no args, regenerates ALL runtimes. With args, only the named runtimes.
60
+ const targets = process.argv.slice(2).length > 0 ? process.argv.slice(2) : Object.keys(RUNTIME_META);
61
+ fs.mkdirSync(FIXTURE_DIR, { recursive: true });
62
+ for (const runtime of targets) {
63
+ if (!Object.prototype.hasOwnProperty.call(RUNTIME_META, runtime)) {
64
+ process.stderr.write(`[gen] unknown runtime '${runtime}' (not in RUNTIME_META) — skipping\n`);
65
+ continue;
66
+ }
67
+ const { configDir, root } = runMinimalInstall({ runtime, scope: 'global' });
68
+ let actual;
69
+ try {
70
+ actual = buildParityManifest(configDir, root);
71
+ } finally {
72
+ cleanup(root);
73
+ }
74
+ const fixturePath = path.join(FIXTURE_DIR, `${runtime}.json`);
75
+ fs.writeFileSync(fixturePath, JSON.stringify(actual, null, 2) + '\n', 'utf8');
76
+ process.stdout.write(`[gen] ${runtime}: wrote ${Object.keys(actual).length} file hashes -> ${fixturePath}\n`);
77
+ }
@@ -114,12 +114,37 @@ function render(identity) {
114
114
  function main() {
115
115
  const fs = require('node:fs');
116
116
  const path = require('node:path');
117
+ const args = process.argv.slice(2);
118
+ const check = args.includes('--check');
117
119
  const pkg = require(path.join(__dirname, '..', 'package.json'));
118
120
  const out = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'package-identity.cjs');
119
- fs.writeFileSync(out, render(deriveIdentity(pkg)));
121
+ const rendered = render(deriveIdentity(pkg));
122
+ if (check) {
123
+ // Compare normalized content so a CRLF checkout (Windows, no .gitattributes
124
+ // eol rule) does not register as stale. Mirrors the in-process check the
125
+ // unit suite used to perform (issue #498) and the convention used by the
126
+ // other gen-* --check generators.
127
+ const norm = (s) => s.replace(/\r\n/g, '\n');
128
+ let committed = '';
129
+ try {
130
+ committed = fs.readFileSync(out, 'utf8');
131
+ } catch (e) {
132
+ if (e.code !== 'ENOENT') throw e;
133
+ }
134
+ if (norm(committed) !== norm(rendered)) {
135
+ process.stderr.write('package-identity.cjs is stale — run: node scripts/generate-package-identity.cjs\n');
136
+ return 1;
137
+ }
138
+ return 0;
139
+ }
140
+ fs.writeFileSync(out, rendered);
120
141
  process.stdout.write(`wrote ${path.relative(path.join(__dirname, '..'), out)}\n`);
142
+ return 0;
121
143
  }
122
144
 
123
- if (require.main === module) main();
145
+ if (require.main === module) {
146
+ const code = main();
147
+ if (typeof code === 'number' && code !== 0) process.exitCode = code;
148
+ }
124
149
 
125
150
  module.exports = { deriveIdentity, parseRepoSlug, slugifyPackageName, formatManualInstall, render, main };
@@ -14,120 +14,6 @@
14
14
  "tests/autonomous-decomposition.test.cjs :: source-text-is-the-product",
15
15
  "tests/autonomous-interactive.test.cjs :: source-text-is-the-product",
16
16
  "tests/autonomous-to-flag.test.cjs :: source-text-is-the-product",
17
- "tests/bug-131-release-tarball-smoke-explicit-home.test.cjs :: integration-test-input",
18
- "tests/bug-14-progress-auto-flag-dropped.test.cjs :: source-text-is-the-product",
19
- "tests/bug-17-askuserquestion-option-cap.test.cjs :: source-text-is-the-product",
20
- "tests/bug-170-workflow-fallback-install-hint.test.cjs :: workflow markdown is shipped product text; this test validates fallback hint literals across all workflow files",
21
- "tests/bug-1891-file-resolution.test.cjs :: structural-implementation-guard",
22
- "tests/bug-1924-preserve-user-artifacts.test.cjs :: source-text-is-the-product",
23
- "tests/bug-1967-cache-invalidation.test.cjs :: source-text-is-the-product",
24
- "tests/bug-211-launcher-home-fallback.test.cjs :: structural/behavioral regression for the ~/.claude fallback arm in",
25
- "tests/bug-2136-sh-hook-version.test.cjs :: structural-regression-guard",
26
- "tests/bug-214-phase-researcher-write-truncation-contract.test.cjs :: source-text-is-the-product",
27
- "tests/bug-214-writer-agents-write-truncation-contract.test.cjs :: source-text-is-the-product",
28
- "tests/bug-222-research-synthesizer-write-contract.test.cjs :: source-text-is-the-product",
29
- "tests/bug-224-pick-stdout-capture.test.cjs :: structural-implementation-guard",
30
- "tests/bug-2346-agent-read-loop-guards.test.cjs :: source-text-is-the-product",
31
- "tests/bug-2388-plan-phase-no-branch-rename.test.cjs :: source-text-is-the-product",
32
- "tests/bug-2396-makefile-test-priority.test.cjs :: source-text-is-the-product",
33
- "tests/bug-2399-commit-docs-plan-phase.test.cjs :: source-text-is-the-product",
34
- "tests/bug-2410-stream-checkpoint-heartbeats.test.cjs :: source-text-is-the-product",
35
- "tests/bug-2419-project-researcher-agent.test.cjs :: source-text-is-the-product",
36
- "tests/bug-2421-planner-grep-gate-hygiene.test.cjs :: source-text-is-the-product",
37
- "tests/bug-2424-reapply-patches-baseline-detection.test.cjs :: source-text-is-the-product",
38
- "tests/bug-2470-update-md-claude-path.test.cjs :: source-text-is-the-product",
39
- "tests/bug-2492-context-coverage-gate.test.cjs :: source-text-is-the-product",
40
- "tests/bug-2502-insert-phase-state-update.test.cjs :: source-text-is-the-product",
41
- "tests/bug-2516-inherit-model-execute-phase.test.cjs :: source-text-is-the-product",
42
- "tests/bug-2543-gsd-slash-namespace.test.cjs :: structural-regression-guard",
43
- "tests/bug-2549-2550-2552-discuss-phase-context.test.cjs :: source-text-is-the-product",
44
- "tests/bug-2559-stale-search-year.test.cjs :: source-text-is-the-product",
45
- "tests/bug-2661-roadmap-sync-parallel.test.cjs :: source-text-is-the-product",
46
- "tests/bug-2686-review-fix-worktree.test.cjs :: source-text-is-the-product",
47
- "tests/bug-2698-crlf-install.test.cjs :: source-text-is-the-product",
48
- "tests/bug-2770-annotate-deps-int-coerce.test.cjs :: source-text-is-the-product",
49
- "tests/bug-2772-gitmodules-path-intersection.test.cjs :: source-text-is-the-product",
50
- "tests/bug-2784-update-cache-clear-path.test.cjs :: structural-regression-guard",
51
- "tests/bug-279-codex-agent-mapping.test.cjs :: source-text-is-the-product [adapter header contract in bin/install.js]",
52
- "tests/bug-2808-skill-hyphen-name.test.cjs :: source-text-is-the-product",
53
- "tests/bug-2831-opencode-home-path-prefix.test.cjs :: source-text-is-the-product",
54
- "tests/bug-2839-review-fix-transactional-cleanup.test.cjs :: source-text-is-the-product",
55
- "tests/bug-2948-spike-wrap-up-dispatch.test.cjs :: source-text-is-the-product",
56
- "tests/bug-2949-sketch-wrap-up-dispatch.test.cjs :: source-text-is-the-product",
57
- "tests/bug-2954-help-md-slash-command-stubs.test.cjs :: source-text-is-the-product",
58
- "tests/bug-2973-profile-user-skills-path.test.cjs :: source-text-is-the-product. profile-user.md IS the",
59
- "tests/bug-2990-code-fixer-worktree-branch.test.cjs :: source-text-is-the-product",
60
- "tests/bug-3086-git-create-tag-config-gate.test.cjs :: workflow-markdown-is-the-runtime-contract",
61
- "tests/bug-3096-ai-integration-phase-parallel-race.test.cjs :: reads product workflow markdown (ai-integration-phase.md) to verify structural ordering contract — not a source-grep test",
62
- "tests/bug-3097-3099-executor-worktree-path-safety.test.cjs :: reads markdown product files (gsd-executor.md, worktree-path-safety.md) to verify structural protocol — not source-grep",
63
- "tests/bug-3120-secure-phase-empty-register.test.cjs :: reads product workflow markdown (secure-phase.md) to verify structural guard contract — not a source-grep test",
64
- "tests/bug-3126-global-skills-base-runtime-path.test.cjs :: last three tests read init.cjs source to verify delegation contract to runtime-homes.cjs — structural guard, no behavioral IR exposed",
65
- "tests/bug-3127-state-begin-phase-idempotent.test.cjs :: reads runtime STATE.md written to temp dir — behavioral output test, not source-grep",
66
- "tests/bug-3128-roadmap-plan-count-slug-layout.test.cjs :: reads roadmap.cjs source to verify isPlanFile pattern was adopted — structural contract prevents silent regression to old filter",
67
- "tests/bug-3129-validate-commit-git-bypass.test.cjs :: reads hook shell script to verify delegation pattern — structural contract test, not source-grep",
68
- "tests/bug-3130-update-npx-robust-invocation.test.cjs :: reads product workflow markdown (update.md) to verify structural invocation contract — not a source-grep test",
69
- "tests/bug-3135-capture-backlog-workflow.test.cjs :: source-text-is-the-product — workflow and command .md files",
70
- "tests/bug-3156-plan-phase-opencode-dispatch.test.cjs :: source-text-is-the-product",
71
- "tests/bug-3168-task-to-agent-rename.test.cjs :: source-text-is-the-product",
72
- "tests/bug-3236-capture-seed-one-shot.test.cjs :: source-text-is-the-product — workflow and command .md files",
73
- "tests/bug-3258-no-stale-gsd-intel-references.test.cjs :: source-text-is-the-product — workflow, reference, and docs .md files",
74
- "tests/bug-3290-intel-updater-layout-block.test.cjs :: source-text-is-the-product — agents/gsd-intel-updater.md IS",
75
- "tests/bug-33-settings-model-profile-adaptive.test.cjs :: source-text-is-the-product",
76
- "tests/bug-3381-verify-work-workstream.test.cjs :: source-text-is-the-product — verify-work.md is a runtime workflow contract.",
77
- "tests/bug-3384-secondary-defects.test.cjs :: source-text-is-the-product",
78
- "tests/bug-3418-progress-flag-routing.test.cjs :: source-text-is-the-product",
79
- "tests/bug-3430-planner-phase-contract.test.cjs :: source-text-is-the-product",
80
- "tests/bug-3431-debug-command-yaml.test.cjs :: source-text-is-the-product",
81
- "tests/bug-3446-resume-continue-here-discovery.test.cjs :: source-text-is-the-product",
82
- "tests/bug-3489-complete-phase-idempotent.test.cjs :: source-text-is-the-product",
83
- "tests/bug-3491-nested-git-worktree.test.cjs :: source-text-is-the-product",
84
- "tests/bug-3516-reapply-patches-gsd-update-filter.test.cjs :: source-text-is-the-product",
85
- "tests/bug-3521-quick-cleanup-cwd-pin.test.cjs :: source-text-is-the-product",
86
- "tests/bug-3523-cjs-loadconfig-branching-strategy-warning.test.cjs :: validates runtime CLI stdout/stderr warning behavior, not source grep",
87
- "tests/bug-3542-executor-git-stash-prohibition.test.cjs :: source-text-is-the-product",
88
- "tests/bug-3582-codex-skills-materialized.test.cjs :: source-text-is-the-product",
89
- "tests/bug-3605-stale-research-insert-phase-agent-refs.test.cjs :: source-text-is-the-product",
90
- "tests/bug-3628-bundled-hook-classifier-whitelist.test.cjs :: architectural-invariant",
91
- "tests/bug-3657-verify-reapply-patches-pristine-drift.test.cjs :: source-text-is-the-product.",
92
- "tests/bug-3657-verify-reapply-patches-pristine-drift.test.cjs :: source-text-is-the-product — Finding 2 reads reapply-patches.md to",
93
- "tests/bug-3677-agent-colon-namespace-leak.test.cjs :: source-text-is-the-product",
94
- "tests/bug-3678-executor-commit-docs-respect.test.cjs :: source-text-is-the-product",
95
- "tests/bug-3683-command-colon-namespace-leak.test.cjs :: source-text-is-the-product",
96
- "tests/bug-3683-command-cross-reference-invariant.test.cjs :: source-text-is-the-product",
97
- "tests/bug-3683-workflow-colon-namespace-leak.test.cjs :: source-text-is-the-product",
98
- "tests/bug-3689-resume-glob-nomatch.test.cjs :: source-text-is-the-product",
99
- "tests/bug-3691-annotate-deps-plans-block-variants.test.cjs :: source-text-is-the-product",
100
- "tests/bug-3706-ui-safety-gate-false-positives.test.cjs :: source-text-is-the-product",
101
- "tests/bug-3707-locked-worktree-cleanup.test.cjs :: source-text-is-the-product",
102
- "tests/bug-3727-code-review-fix-flag-dispatch.test.cjs :: source-text-is-the-product",
103
- "tests/bug-378-update-check-scoped-name.test.cjs :: structural assertion on hook delegation; the behavior being",
104
- "tests/bug-3784-gsd-settings-model-profile-ui-omits-adaptive.test.cjs :: source-text-is-the-product",
105
- "tests/bug-3805-fast-md-log-to-state-schema.test.cjs :: source-text-is-the-product",
106
- "tests/bug-3810-no-gsd-sdk-runtime-refs.test.cjs :: source-text-is-the-product",
107
- "tests/bug-397-state-preserve-executor-authored.test.cjs :: reads runtime STATE.md written to temp dir — behavioral output test, not source-grep",
108
- "tests/bug-444-resolver-local-claude-install.test.cjs :: structural/behavioral regression for the repo-local .claude/ install",
109
- "tests/bug-474-clock-seam-date-determinism.test.cjs :: source-text-is-the-product",
110
- "tests/bug-503-update-agent-antigravity-detection.test.cjs :: source-text-is-the-product",
111
- "tests/bug-570-codex-leak-scanner.test.cjs :: source-text-is-the-product",
112
- "tests/bug-571-doc-writer-fix-mode-edit-only.test.cjs :: source-text-is-the-product",
113
- "tests/bug-619-codebase-drift-gate-shim.test.cjs :: source-text-is-the-product",
114
- "tests/bug-621-plan-phase-gap-analysis-gsd-run.test.cjs :: source-text-is-the-product",
115
- "tests/bug-622-graphify-optional-graph-html.test.cjs :: source-text-is-the-product",
116
- "tests/bug-630-wave-cleanup-orchestrator-root.test.cjs :: source-text-is-the-product",
117
- "tests/bug-637-workflow-no-hardcoded-home-tool.test.cjs :: source-text-is-the-product",
118
- "tests/bug-685-windowshide-spawn.test.cjs :: source-text-is-the-product",
119
- "tests/bug-687-agy-timeout.test.cjs :: source-text-is-the-product",
120
- "tests/bug-704-codex-launcher-path-corruption.test.cjs :: source-text-is-the-product",
121
- "tests/bug-851-codex-quick-adapter-agent-type-fallback.test.cjs :: source-text-is-the-product",
122
- "tests/bug-891-non-claude-runtime-home-fallback.test.cjs :: structural/behavioral regression for non-Claude runtime-home",
123
- "tests/bug-924-claude-flat-skill-layout.test.cjs :: source-text-is-the-product",
124
- "tests/bug-936-no-nested-spawner-wrap.test.cjs :: source-text-is-the-product",
125
- "tests/bug-947-hermes-gsd-prefix.test.cjs :: source-text-is-the-product",
126
- "tests/bug-950-quick-summary-status-complete.test.cjs :: source-text-is-the-product",
127
- "tests/bug-967-verify-key-links-strict-paths.test.cjs :: <runtime-contract-is-the-product> the plan-md.md reference",
128
- "tests/bug-967-verify-key-links-strict-paths.test.cjs :: <runtime-contract-is-the-product> the plan-md.md reference example IS the documented authoring surface for key_links; asserting it uses a file path (not an endpoint) directly tests the documented contract.",
129
- "tests/bug-983-trae-windsurf-claude-path-leak.test.cjs :: source-text-is-the-product",
130
- "tests/bug-patterns-reference.test.cjs :: source-text-is-the-product",
131
17
  "tests/chain-flag-plan-phase.test.cjs :: source-text-is-the-product",
132
18
  "tests/changeset-cli.test.cjs :: reads a product workflow .md file (not CJS source) to verify",
133
19
  "tests/check-update-config-dir.test.cjs :: structural-regression-guard",
@@ -165,29 +51,6 @@
165
51
  "tests/edge-probe-planner-contract.test.cjs :: runtime-contract-is-the-product — plan-phase.md's planner prompt is the deployed runtime contract under assertion",
166
52
  "tests/edge-probe-spec-phase-contract.test.cjs :: runtime-contract-is-the-product — spec-phase.md Step 5.5 is the deployed workflow runtime contract under assertion",
167
53
  "tests/edit-phase.test.cjs :: source-text-is-the-product",
168
- "tests/enh-2310-chunked-plan-phase.test.cjs :: source-text-is-the-product",
169
- "tests/enh-2380-sync-skills.test.cjs :: source-text-is-the-product",
170
- "tests/enh-2415-claude-md-link-mode.test.cjs :: source-text-is-the-product",
171
- "tests/enh-2430-learnings-consumption.test.cjs :: source-text-is-the-product",
172
- "tests/enh-2433-todo-phase-linking.test.cjs :: source-text-is-the-product",
173
- "tests/enh-2446-milestones-drift.test.cjs :: source-text-is-the-product",
174
- "tests/enh-2447-roadmap-wave-deps.test.cjs :: source-text-is-the-product",
175
- "tests/enh-2448-artifact-registry.test.cjs :: source-text-is-the-product",
176
- "tests/enh-2500-codebase-mapper-arch-rich-format.test.cjs :: source-text-is-the-product",
177
- "tests/enh-2789-description-budget.test.cjs :: source-text-is-the-product",
178
- "tests/enh-2790-skill-consolidation.test.cjs :: source-text-is-the-product",
179
- "tests/enh-2792-namespace-skills.test.cjs :: source-text-is-the-product",
180
- "tests/enh-3209-plan-phase-ingest-adr.test.cjs :: source-text-is-the-product",
181
- "tests/enh-48-cwd-drift-guard-e2e.test.cjs :: integration-test-input",
182
- "tests/enh-72-business-context.test.cjs :: source-text-is-the-product",
183
- "tests/enh-769-context-fork-effort.install.test.cjs :: integration-test-input",
184
- "tests/enh-770-claude-hook-events.test.cjs :: runtime-contract-is-the-product — hooks.json IS the",
185
- "tests/enh-770-claude-hook-events.test.cjs :: runtime-contract-is-the-product — the hookEventName is",
186
- "tests/enh-770-claude-hook-events.test.cjs :: runtime-contract-is-the-product — the stamp template token",
187
- "tests/enh-770-claude-hook-events.test.cjs :: runtime-contract-is-the-product — the stdin-read and",
188
- "tests/enh-773-codex-exec-automation-flags.test.cjs :: source-text-is-the-product",
189
- "tests/enh-778-cross-runtime-command-enrichment.test.cjs :: source-text-is-the-product",
190
- "tests/enh-789-codebuddy-commands.test.cjs :: source-text-is-the-product",
191
54
  "tests/eslint-rules.test.cjs :: <source-grep reason> must still error",
192
55
  "tests/eslint-rules.test.cjs :: pending migration",
193
56
  "tests/eslint-rules.test.cjs :: source-text-is-the-product",
@@ -200,16 +63,6 @@
200
63
  "tests/execute-phase-worktree-artifacts.test.cjs :: source-text-is-the-product",
201
64
  "tests/explore-command.test.cjs :: source-text-is-the-product",
202
65
  "tests/extract-learnings.test.cjs :: source-text-is-the-product",
203
- "tests/feat-22-surfacing-docs.test.cjs :: docs-parity",
204
- "tests/feat-2840-issue-driven-orchestration-guide.test.cjs :: structural-IR parser for a docs guide. The .includes()",
205
- "tests/feat-3039-help-tiered.test.cjs :: source-text-is-the-product",
206
- "tests/feat-3167-ship-pr-body-sections.test.cjs :: source-text-is-the-product",
207
- "tests/feat-3210-fallow-integration.test.cjs :: source-text-is-the-product",
208
- "tests/feat-3210-fallow-integration.test.cjs :: source-text-is-the-product — code-review.md IS the workflow the orchestrator",
209
- "tests/feat-3309-human-verify-mode.test.cjs :: source-text-is-the-product",
210
- "tests/feat-443-effort-install-wiring.install.test.cjs :: integration-test-input",
211
- "tests/feat-488-effort-sync.test.cjs :: structural-regression-guard — readFileSync asserts on installed agent .md files (the product under mutation) to verify dry-run safety and apply correctness; stderr.includes guards the CLI argument-rejection contract.",
212
- "tests/fix-3722-execute-phase-human-needed-checkpoint.test.cjs :: source-text-is-the-product",
213
66
  "tests/forensics.test.cjs :: source-text-is-the-product",
214
67
  "tests/frontmatter-cli.test.cjs :: source-text-is-the-product",
215
68
  "tests/gates-taxonomy.test.cjs :: source-text-is-the-product",
@@ -235,7 +88,6 @@
235
88
  "tests/ios-scaffold-safety.test.cjs :: source-text-is-the-product",
236
89
  "tests/issue-2639-codex-toml-neutralization.test.cjs :: source-text-is-the-product",
237
90
  "tests/issue-429-comment-text-gate.test.cjs :: source-text-is-the-product",
238
- "tests/issue-498-package-identity.test.cjs :: architectural-invariant",
239
91
  "tests/issue-498-update-backup-runtime-dir.test.cjs :: structural assertion on the deployed update.md backup bash;",
240
92
  "tests/issue-57-runtime-install-no-drift.test.cjs :: delegation-presence guard. Catches wholesale removal of the registry",
241
93
  "tests/issue-57-runtime-install-no-drift.test.cjs :: structural guard over bin/install.js source. Behavioral assertions",