@opengsd/gsd-core 1.18.0 → 1.19.0

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 (257) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +2 -1
  3. package/.opencode/plugins/gsd-core.js +2 -3
  4. package/agents/gsd-code-fixer.compact.md +2 -2
  5. package/agents/gsd-code-fixer.md +4 -3
  6. package/agents/gsd-verifier.md +1 -1
  7. package/bin/install.js +422 -103
  8. package/gsd-core/bin/gsd-tools.cjs +106 -7
  9. package/gsd-core/bin/lib/agent-install-check.cjs +29 -3
  10. package/gsd-core/bin/lib/args-terminator.cjs +114 -0
  11. package/gsd-core/bin/lib/broken-windows.cjs +59 -1
  12. package/gsd-core/bin/lib/capability-lock.cjs +13 -2
  13. package/gsd-core/bin/lib/capability-registry.cjs +156 -74
  14. package/gsd-core/bin/lib/capability-state.cjs +14 -8
  15. package/gsd-core/bin/lib/capability-validator.cjs +17 -0
  16. package/gsd-core/bin/lib/config-loader.cjs +10 -0
  17. package/gsd-core/bin/lib/config.cjs +256 -58
  18. package/gsd-core/bin/lib/core-utils.cjs +34 -0
  19. package/gsd-core/bin/lib/decision-coverage-support.cjs +74 -0
  20. package/gsd-core/bin/lib/gate-context-drift.cjs +8 -3
  21. package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +6 -1
  22. package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +6 -1
  23. package/gsd-core/bin/lib/gate-evaluation-scope.cjs +134 -13
  24. package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +63 -22
  25. package/gsd-core/bin/lib/gate-ui-safety.cjs +23 -5
  26. package/gsd-core/bin/lib/git-info-exclude.cjs +57 -0
  27. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +18 -3
  28. package/gsd-core/bin/lib/health-diagnostic-types.cjs +4 -0
  29. package/gsd-core/bin/lib/health-diagnostic.cjs +52 -1
  30. package/gsd-core/bin/lib/host-integration.cjs +13 -6
  31. package/gsd-core/bin/lib/init.cjs +65 -1
  32. package/gsd-core/bin/lib/install-engine.cjs +246 -32
  33. package/gsd-core/bin/lib/install-profiles.cjs +9 -4
  34. package/gsd-core/bin/lib/installer-migration-report.cjs +2 -0
  35. package/gsd-core/bin/lib/markdown-line-diff.cjs +147 -0
  36. package/gsd-core/bin/lib/markdown-sectionizer.cjs +113 -0
  37. package/gsd-core/bin/lib/milestone-lock.cjs +8 -1
  38. package/gsd-core/bin/lib/milestone-release-map.cjs +244 -0
  39. package/gsd-core/bin/lib/milestone-release-tags.cjs +440 -0
  40. package/gsd-core/bin/lib/milestone.cjs +43 -1
  41. package/gsd-core/bin/lib/model-catalog.cjs +8 -0
  42. package/gsd-core/bin/lib/normalize-test-command.cjs +67 -0
  43. package/gsd-core/bin/lib/phase-id.cjs +21 -4
  44. package/gsd-core/bin/lib/phase-lifecycle.cjs +37 -4
  45. package/gsd-core/bin/lib/phase.cjs +115 -26
  46. package/gsd-core/bin/lib/planning-snapshot.cjs +3 -1
  47. package/gsd-core/bin/lib/planning-workspace.cjs +18 -0
  48. package/gsd-core/bin/lib/pristine-baseline.cjs +11 -3
  49. package/gsd-core/bin/lib/read-only-git-env.cjs +58 -0
  50. package/gsd-core/bin/lib/review-lane-descriptor.cjs +35 -2
  51. package/gsd-core/bin/lib/review-lane-runner.cjs +33 -4
  52. package/gsd-core/bin/lib/roadmap-parser.cjs +12 -0
  53. package/gsd-core/bin/lib/roadmap-upgrade.cjs +39 -2
  54. package/gsd-core/bin/lib/roadmap.cjs +33 -25
  55. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +381 -14
  56. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +8 -4
  57. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +60 -16
  58. package/gsd-core/bin/lib/shell-command-projection.cjs +121 -16
  59. package/gsd-core/bin/lib/smart-entry.cjs +13 -0
  60. package/gsd-core/bin/lib/state-contract.cjs +29 -9
  61. package/gsd-core/bin/lib/state-document.cjs +12 -4
  62. package/gsd-core/bin/lib/state-transition.cjs +119 -24
  63. package/gsd-core/bin/lib/state.cjs +50 -28
  64. package/gsd-core/bin/lib/surface.cjs +9 -0
  65. package/gsd-core/bin/lib/task-command-router.cjs +5 -25
  66. package/gsd-core/bin/lib/task-content-resolution.cjs +46 -1
  67. package/gsd-core/bin/lib/verification.cjs +96 -9
  68. package/gsd-core/bin/lib/verify.cjs +2 -0
  69. package/gsd-core/bin/lib/worktree-safety.cjs +22 -1
  70. package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
  71. package/gsd-core/bin/shared/config-schema.manifest.json +1 -0
  72. package/gsd-core/references/git-integration.md +11 -0
  73. package/gsd-core/references/loop-hook-dispatch.md +13 -6
  74. package/gsd-core/references/planning-config.md +2 -0
  75. package/gsd-core/references/tdd.md +2 -2
  76. package/gsd-core/templates/DEBUG.md +16 -0
  77. package/gsd-core/templates/config.json +2 -1
  78. package/gsd-core/templates/verification-report.md +1 -1
  79. package/gsd-core/workflows/audit-fix.md +2 -1
  80. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +10 -1
  81. package/gsd-core/workflows/code-review.md +61 -7
  82. package/gsd-core/workflows/complete-milestone/steps/project-md-evolution-review.md +145 -0
  83. package/gsd-core/workflows/complete-milestone/steps/release-map.md +80 -0
  84. package/gsd-core/workflows/complete-milestone.md +37 -150
  85. package/gsd-core/workflows/diagnose-issues.md +29 -5
  86. package/gsd-core/workflows/discuss-phase/modes/power.md +1 -1
  87. package/gsd-core/workflows/discuss-phase-assumptions.md +33 -2
  88. package/gsd-core/workflows/discuss-phase-power.md +19 -2
  89. package/gsd-core/workflows/discuss-phase.md +6 -10
  90. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +13 -7
  91. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +7 -2
  92. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -1
  93. package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +2 -2
  94. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +11 -2
  95. package/gsd-core/workflows/execute-phase.md +9 -5
  96. package/gsd-core/workflows/health.md +2 -1
  97. package/gsd-core/workflows/import.md +1 -1
  98. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +2 -2
  99. package/gsd-core/workflows/plan-phase.md +13 -13
  100. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +1 -1
  101. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +8 -1
  102. package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +2 -1
  103. package/gsd-core/workflows/quick.md +1 -1
  104. package/gsd-core/workflows/review.md +16 -13
  105. package/gsd-core/workflows/section-manifest.json +5 -0
  106. package/gsd-core/workflows/settings.md +1 -0
  107. package/gsd-core/workflows/ship.md +3 -4
  108. package/gsd-core/workflows/spec-phase.md +3 -6
  109. package/gsd-core/workflows/verify-work.md +4 -3
  110. package/hooks/dist/gsd-agent-isolation-guard.js +11 -1
  111. package/hooks/dist/gsd-cursor-subagent-start.js +6 -2
  112. package/hooks/dist/gsd-path-export.js +95 -0
  113. package/hooks/dist/gsd-secret-read-guard.js +172 -39
  114. package/hooks/dist/gsd-statusline.js +35 -2
  115. package/hooks/dist/gsd-windsurf-pre-write.js +28 -1
  116. package/hooks/dist/gsd-workflow-guard.js +1 -1
  117. package/hooks/dist/gsd-worktree-path-guard.js +28 -1
  118. package/hooks/dist/lib/isolation-sentinel.js +44 -0
  119. package/hooks/dist/managed-hooks-registry.cjs +1 -0
  120. package/hooks/gsd-agent-isolation-guard.js +11 -1
  121. package/hooks/gsd-cursor-subagent-start.js +6 -2
  122. package/hooks/gsd-path-export.js +95 -0
  123. package/hooks/gsd-secret-read-guard.js +172 -39
  124. package/hooks/gsd-statusline.js +35 -2
  125. package/hooks/gsd-windsurf-pre-write.js +28 -1
  126. package/hooks/gsd-workflow-guard.js +1 -1
  127. package/hooks/gsd-worktree-path-guard.js +28 -1
  128. package/hooks/hooks.json +1 -0
  129. package/hooks/lib/isolation-sentinel.js +44 -0
  130. package/hooks/managed-hooks-registry.cjs +1 -0
  131. package/package.json +13 -6
  132. package/pi/gsd.cjs +1047 -10
  133. package/pi/package-agents/gsd-advisor-researcher.md +113 -0
  134. package/pi/package-agents/gsd-ai-researcher.md +111 -0
  135. package/pi/package-agents/gsd-assumptions-analyzer.md +110 -0
  136. package/pi/package-agents/gsd-code-fixer.md +769 -0
  137. package/pi/package-agents/gsd-code-reviewer.md +402 -0
  138. package/pi/package-agents/gsd-codebase-mapper.md +850 -0
  139. package/pi/package-agents/gsd-debug-session-manager.md +416 -0
  140. package/pi/package-agents/gsd-debugger.md +1274 -0
  141. package/pi/package-agents/gsd-doc-classifier.md +269 -0
  142. package/pi/package-agents/gsd-doc-synthesizer.md +259 -0
  143. package/pi/package-agents/gsd-doc-verifier.md +212 -0
  144. package/pi/package-agents/gsd-doc-writer.md +626 -0
  145. package/pi/package-agents/gsd-dom-verifier.md +164 -0
  146. package/pi/package-agents/gsd-domain-researcher.md +144 -0
  147. package/pi/package-agents/gsd-eval-auditor.md +185 -0
  148. package/pi/package-agents/gsd-eval-planner.md +149 -0
  149. package/pi/package-agents/gsd-executor.md +894 -0
  150. package/pi/package-agents/gsd-framework-selector.md +159 -0
  151. package/pi/package-agents/gsd-integration-checker.md +476 -0
  152. package/pi/package-agents/gsd-intel-updater.md +338 -0
  153. package/pi/package-agents/gsd-mempalace-curator.md +49 -0
  154. package/pi/package-agents/gsd-nyquist-auditor.md +200 -0
  155. package/pi/package-agents/gsd-pattern-mapper.md +340 -0
  156. package/pi/package-agents/gsd-phase-researcher.md +897 -0
  157. package/pi/package-agents/gsd-plan-checker.md +1077 -0
  158. package/pi/package-agents/gsd-planner.md +1003 -0
  159. package/pi/package-agents/gsd-project-researcher.md +611 -0
  160. package/pi/package-agents/gsd-research-synthesizer.md +259 -0
  161. package/pi/package-agents/gsd-roadmapper.md +779 -0
  162. package/pi/package-agents/gsd-security-auditor.md +171 -0
  163. package/pi/package-agents/gsd-ui-auditor.md +581 -0
  164. package/pi/package-agents/gsd-ui-checker.md +417 -0
  165. package/pi/package-agents/gsd-ui-researcher.md +469 -0
  166. package/pi/package-agents/gsd-user-profiler.md +174 -0
  167. package/pi/package-agents/gsd-verifier.md +963 -0
  168. package/pi/package-agents/manifest.json +39 -0
  169. package/pi/package-skills/gsd-add-tests/SKILL.md +39 -0
  170. package/pi/package-skills/gsd-ai-integration-phase/SKILL.md +36 -0
  171. package/pi/package-skills/gsd-audit-fix/SKILL.md +34 -0
  172. package/pi/package-skills/gsd-audit-milestone/SKILL.md +40 -0
  173. package/pi/package-skills/gsd-audit-uat/SKILL.md +26 -0
  174. package/pi/package-skills/gsd-autonomous/SKILL.md +52 -0
  175. package/pi/package-skills/gsd-capture/SKILL.md +68 -0
  176. package/pi/package-skills/gsd-cleanup/SKILL.md +25 -0
  177. package/pi/package-skills/gsd-code-review/SKILL.md +71 -0
  178. package/pi/package-skills/gsd-complete-milestone/SKILL.md +147 -0
  179. package/pi/package-skills/gsd-config/SKILL.md +60 -0
  180. package/pi/package-skills/gsd-debug/SKILL.md +64 -0
  181. package/pi/package-skills/gsd-discuss-phase/SKILL.md +74 -0
  182. package/pi/package-skills/gsd-docs-update/SKILL.md +50 -0
  183. package/pi/package-skills/gsd-eval-review/SKILL.md +35 -0
  184. package/pi/package-skills/gsd-execute-phase/SKILL.md +62 -0
  185. package/pi/package-skills/gsd-explore/SKILL.md +26 -0
  186. package/pi/package-skills/gsd-extract-learnings/SKILL.md +25 -0
  187. package/pi/package-skills/gsd-fast/SKILL.md +33 -0
  188. package/pi/package-skills/gsd-forensics/SKILL.md +59 -0
  189. package/pi/package-skills/gsd-graphify/SKILL.md +210 -0
  190. package/pi/package-skills/gsd-health/SKILL.md +36 -0
  191. package/pi/package-skills/gsd-help/SKILL.md +37 -0
  192. package/pi/package-skills/gsd-import/SKILL.md +46 -0
  193. package/pi/package-skills/gsd-inbox/SKILL.md +42 -0
  194. package/pi/package-skills/gsd-ingest-docs/SKILL.md +43 -0
  195. package/pi/package-skills/gsd-manager/SKILL.md +46 -0
  196. package/pi/package-skills/gsd-map-codebase/SKILL.md +85 -0
  197. package/pi/package-skills/gsd-mempalace-capture/SKILL.md +111 -0
  198. package/pi/package-skills/gsd-mempalace-recall/SKILL.md +111 -0
  199. package/pi/package-skills/gsd-milestone-summary/SKILL.md +54 -0
  200. package/pi/package-skills/gsd-mvp-phase/SKILL.md +45 -0
  201. package/pi/package-skills/gsd-new-milestone/SKILL.md +49 -0
  202. package/pi/package-skills/gsd-new-project/SKILL.md +49 -0
  203. package/pi/package-skills/gsd-next/SKILL.md +34 -0
  204. package/pi/package-skills/gsd-ns-context/SKILL.md +31 -0
  205. package/pi/package-skills/gsd-ns-ideate/SKILL.md +30 -0
  206. package/pi/package-skills/gsd-ns-manage/SKILL.md +42 -0
  207. package/pi/package-skills/gsd-ns-project/SKILL.md +34 -0
  208. package/pi/package-skills/gsd-ns-review/SKILL.md +35 -0
  209. package/pi/package-skills/gsd-ns-workflow/SKILL.md +44 -0
  210. package/pi/package-skills/gsd-onboard/SKILL.md +46 -0
  211. package/pi/package-skills/gsd-pause-work/SKILL.md +48 -0
  212. package/pi/package-skills/gsd-phase/SKILL.md +61 -0
  213. package/pi/package-skills/gsd-plan-phase/SKILL.md +62 -0
  214. package/pi/package-skills/gsd-plan-review-convergence/SKILL.md +63 -0
  215. package/pi/package-skills/gsd-pr-branch/SKILL.md +31 -0
  216. package/pi/package-skills/gsd-profile-user/SKILL.md +48 -0
  217. package/pi/package-skills/gsd-progress/SKILL.md +51 -0
  218. package/pi/package-skills/gsd-quick/SKILL.md +179 -0
  219. package/pi/package-skills/gsd-quick-batch/SKILL.md +114 -0
  220. package/pi/package-skills/gsd-resume-work/SKILL.md +31 -0
  221. package/pi/package-skills/gsd-review/SKILL.md +50 -0
  222. package/pi/package-skills/gsd-review-backlog/SKILL.md +65 -0
  223. package/pi/package-skills/gsd-secure-phase/SKILL.md +37 -0
  224. package/pi/package-skills/gsd-settings/SKILL.md +30 -0
  225. package/pi/package-skills/gsd-ship/SKILL.md +27 -0
  226. package/pi/package-skills/gsd-sketch/SKILL.md +56 -0
  227. package/pi/package-skills/gsd-spec-phase/SKILL.md +63 -0
  228. package/pi/package-skills/gsd-spike/SKILL.md +53 -0
  229. package/pi/package-skills/gsd-stats/SKILL.md +22 -0
  230. package/pi/package-skills/gsd-surface/SKILL.md +177 -0
  231. package/pi/package-skills/gsd-thread/SKILL.md +29 -0
  232. package/pi/package-skills/gsd-ui-phase/SKILL.md +35 -0
  233. package/pi/package-skills/gsd-ui-review/SKILL.md +35 -0
  234. package/pi/package-skills/gsd-ultraplan-phase/SKILL.md +38 -0
  235. package/pi/package-skills/gsd-undo/SKILL.md +38 -0
  236. package/pi/package-skills/gsd-update/SKILL.md +51 -0
  237. package/pi/package-skills/gsd-validate-phase/SKILL.md +37 -0
  238. package/pi/package-skills/gsd-verify-work/SKILL.md +41 -0
  239. package/pi/package-skills/gsd-workspace/SKILL.md +57 -0
  240. package/pi/package-skills/gsd-workstreams/SKILL.md +73 -0
  241. package/scripts/build-hooks.js +4 -0
  242. package/scripts/command-contract-helpers.cjs +1 -1
  243. package/scripts/docs-guard-registry.cjs +20 -7
  244. package/scripts/gen-health-docs.cjs +13 -1
  245. package/scripts/gen-pi-package-skills.cjs +217 -0
  246. package/scripts/lib/macos-conformance-tier.generated.cjs +11 -1
  247. package/scripts/lib/platform-conformance-tier.generated.cjs +26 -1
  248. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +3 -3
  249. package/scripts/lint-retired-runtime-name.cjs +5 -0
  250. package/scripts/npm-audit-baseline.cjs +41 -7
  251. package/scripts/reviewed-or-maintainer-policy.cjs +181 -0
  252. package/scripts/select-docs-guards.cjs +1 -1
  253. package/scripts/self-test-report-policy.cjs +350 -0
  254. package/vscode/package.json +1 -1
  255. package/scripts/diagnose-validate-commit-in-tier.cjs +0 -270
  256. package/scripts/diagnose-validate-commit-phases.cjs +0 -348
  257. package/scripts/xtrace-phase-timing.cjs +0 -205
@@ -55,7 +55,7 @@
55
55
  * narrow subset of guards that read it, instead of always running the
56
56
  * entire registry. Each value is a non-empty array of PATTERNS:
57
57
  *
58
- * - a plain path (e.g. `'docs/AGENTS.md'`) matches that exact file only;
58
+ * - a plain path (e.g. `'docs/reference/agents.md'`) matches that exact file only;
59
59
  * - a trailing-slash path (e.g. `'docs/adr/'`) matches any changed path
60
60
  * under that directory prefix — use this for a test that walks or
61
61
  * `readdirSync`s a whole docs/ subdirectory;
@@ -157,6 +157,8 @@ function assertNoSuiteCollision(tests) {
157
157
  * unresolvable read is recorded as `'*'`, never a narrowed guess.
158
158
  */
159
159
  const DOCS_GUARD_TESTS = {
160
+ 'tests/pi-unsupported-skill-docs.test.cjs': ['docs/how-to/start-a-gsd-workflow-from-pi.md'],
161
+ 'tests/pi-parity-matrix.test.cjs': ['docs/reference/pi-parity-matrix.md'],
160
162
  'tests/adr-15-progress-converge.test.cjs': [
161
163
  'docs/COMMANDS.md',
162
164
  'docs/how-to/run-phases-autonomously.md',
@@ -168,11 +170,14 @@ const DOCS_GUARD_TESTS = {
168
170
  // Walks docs/features/ as a directory (the fragment corpus) and asserts the
169
171
  // committed docs/FEATURES.md equals the generated projection of it (#3840).
170
172
  'tests/features-index-gate.test.cjs': ['docs/features/', 'docs/FEATURES.md'],
171
- 'tests/agent-classification-parity.test.cjs': ['docs/AGENTS.md', 'docs/INVENTORY.md'],
173
+ 'tests/agent-classification-parity.test.cjs': ['docs/reference/agents.md', 'docs/INVENTORY.md'],
172
174
  // #3683: pins the learnings feature section's agreement with the canonical
173
175
  // artifact registry (reads docs/FEATURES.md around the extract-learnings
174
176
  // entry).
175
177
  'tests/learnings.test.cjs': ['docs/FEATURES.md'],
178
+ // #5706: pins the release map statuses / tag states in docs/CONFIGURATION.md
179
+ // against the milestone-release-map module's exported enums.
180
+ 'tests/milestone-release-map.test.cjs': ['docs/CONFIGURATION.md'],
176
181
  'tests/analyze-dependencies.test.cjs': ['docs/COMMANDS.md'],
177
182
  'tests/auto-select-attribute.test.cjs': ['docs/reference/plan-md.md'],
178
183
  'tests/autonomous-converge.test.cjs': [
@@ -199,6 +204,7 @@ const DOCS_GUARD_TESTS = {
199
204
  // files without re-deriving the scan's own file-discovery logic.
200
205
  'tests/commit-files-pathspec.test.cjs': ['*'],
201
206
  'tests/compact-content-4139.test.cjs': ['docs/CONFIGURATION.md'],
207
+ 'tests/complete-milestone-release-map-routing.test.cjs': ['docs/README.md', 'docs/how-to/tag-a-multi-repo-milestone.md'],
202
208
  'tests/config-field-docs.test.cjs': ['docs/CONFIGURATION.md'],
203
209
  'tests/config.test.cjs': ['docs/CONFIGURATION.md'],
204
210
  // #4974: doc/workflow content-parity checks read docs/CONFIGURATION.md's
@@ -245,7 +251,7 @@ const DOCS_GUARD_TESTS = {
245
251
  'docs/ko-KR/reference/state-md.md',
246
252
  'docs/pt-BR/reference/state-md.md',
247
253
  ],
248
- 'tests/drift-detection.test.cjs': ['docs/CONFIGURATION.md', 'docs/AGENTS.md'],
254
+ 'tests/drift-detection.test.cjs': ['docs/CONFIGURATION.md', 'docs/reference/agents.md'],
249
255
  'tests/edge-probe-docs-fixtures.test.cjs': ['docs/adr/550-spec-phase-probe-contract.md'],
250
256
  'tests/edit-phase.test.cjs': [
251
257
  'docs/INVENTORY.md',
@@ -313,7 +319,7 @@ const DOCS_GUARD_TESTS = {
313
319
  'tests/host-integration-descriptors.test.cjs': [
314
320
  'docs/reference/host-integration-capability-matrix.md',
315
321
  ],
316
- 'tests/install.test.cjs': ['docs/AGENTS.md', 'docs/INVENTORY.md', 'docs/INVENTORY-MANIFEST.json'],
322
+ 'tests/install.test.cjs': ['docs/reference/agents.md', 'docs/INVENTORY.md', 'docs/INVENTORY-MANIFEST.json'],
317
323
  // SOURCE_DIRS includes 'docs' and walks it recursively for every .md file
318
324
  // (intel.test.cjs:1223-1228) — a generic tree walk.
319
325
  'tests/intel.test.cjs': ['*'],
@@ -321,6 +327,13 @@ const DOCS_GUARD_TESTS = {
321
327
  'tests/inventory-manifest-sync.test.cjs': ['docs/INVENTORY.md', 'docs/INVENTORY-MANIFEST.json'],
322
328
  'tests/kilo-upgrades.test.cjs': ['docs/how-to/connect-gsd-mcp-server.md'],
323
329
  'tests/live-config-guard.test.cjs': ['docs/TESTING-SUITES.md'],
330
+ // #5601: localized INVENTORY coverage notes must state no agent counts.
331
+ 'tests/localized-inventory-agent-counts.test.cjs': [
332
+ 'docs/ja-JP/',
333
+ 'docs/ko-KR/',
334
+ 'docs/pt-BR/',
335
+ 'docs/zh-CN/',
336
+ ],
324
337
  // #3726: pins the `milestone complete` synopsis (English + four localized
325
338
  // mirrors), the `--confirm` flag row and the guard-override instructions —
326
339
  // `type: Fixed` exempts that PR from the docs-required lint, so this is the
@@ -346,7 +359,7 @@ const DOCS_GUARD_TESTS = {
346
359
  'docs/README.md',
347
360
  ],
348
361
  'tests/plan-authoring-verification-gaps.test.cjs': ['docs/reference/plan-md.md'],
349
- 'tests/plan-checker-coupling.test.cjs': ['docs/AGENTS.md'],
362
+ 'tests/plan-checker-coupling.test.cjs': ['docs/reference/agents.md'],
350
363
  'tests/plan-phase-drift-guard.test.cjs': [
351
364
  'docs/CONFIGURATION.md',
352
365
  'docs/COMMANDS.md',
@@ -406,7 +419,7 @@ const DOCS_GUARD_TESTS = {
406
419
  'docs/COMMANDS.md',
407
420
  'docs/reference/plan-md.md',
408
421
  'docs/how-to/plan-a-phase.md',
409
- 'docs/AGENTS.md',
422
+ 'docs/reference/agents.md',
410
423
  ],
411
424
  'tests/ui-interaction-capture.test.cjs': ['docs/CONFIGURATION.md'],
412
425
  'tests/ui-spec-inventory-provenance.test.cjs': [
@@ -421,7 +434,7 @@ const DOCS_GUARD_TESTS = {
421
434
  'docs/pt-BR/how-to/design-a-ui-phase.md',
422
435
  ],
423
436
  'tests/verifier-behavior-unverified.test.cjs': ['docs/reference/planning-artifacts.md'],
424
- 'tests/verifier-coincidental-reliance.test.cjs': ['docs/AGENTS.md'],
437
+ 'tests/verifier-coincidental-reliance.test.cjs': ['docs/reference/agents.md'],
425
438
  'tests/verify.test.cjs': ['docs/reference/plan-md.md'],
426
439
  // #5118 V43: asserts the deleted execute-phase/steps/stale-reverification.md
427
440
  // is absent from the generated inventory manifest.
@@ -122,6 +122,13 @@ const REMEDY_ACTION_METADATA = new Map([
122
122
  risk: 'None — additive only; triggered by `--backfill` flag',
123
123
  },
124
124
  ],
125
+ [
126
+ 'repairVerificationStatus',
127
+ {
128
+ effect: 'Rewrite a known legacy verification `status` (`pass_with_caveats`) to `passed`, keeping the original as `legacy_status`',
129
+ risk: 'None — only the `status` line changes; unknown statuses are never touched',
130
+ },
131
+ ],
125
132
  ]);
126
133
 
127
134
  /** Order the Effect/Risk table renders in — matches `REMEDY_ACTION`'s own declaration order. */
@@ -132,6 +139,7 @@ const REMEDY_ACTION_ORDER = [
132
139
  'addNyquistKey',
133
140
  'addAiIntegrationPhaseKey',
134
141
  'backfillMilestones',
142
+ 'repairVerificationStatus',
135
143
  ];
136
144
 
137
145
  /**
@@ -139,7 +147,11 @@ const REMEDY_ACTION_ORDER = [
139
147
  * whose remedy is conditional on a flag the plain `Yes`/`No` can't express
140
148
  * (mirrors the hand-written table's pre-existing `W018` row: `Yes (--backfill)`).
141
149
  */
142
- const REPAIRABLE_DISPLAY_OVERRIDE = new Map([['W018', 'Yes (`--backfill`)']]);
150
+ const REPAIRABLE_DISPLAY_OVERRIDE = new Map([
151
+ ['W018', 'Yes (`--backfill`)'],
152
+ // #5291: only a known legacy status (`pass_with_caveats`) is rewritten.
153
+ ['W030', 'Yes (known legacy statuses only)'],
154
+ ]);
143
155
 
144
156
  const STATIC_NOT_REPAIRABLE_BULLETS = [
145
157
  'PROJECT.md, ROADMAP.md content',
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * gen-pi-package-skills.cjs — generates pi/package-skills/gsd-<stem>/SKILL.md,
6
+ * the Pi skill templates the Pi package (`pi install npm:@opengsd/gsd-core`)
7
+ * renders at session start.
8
+ *
9
+ * Usage:
10
+ * node scripts/gen-pi-package-skills.cjs # print summary
11
+ * node scripts/gen-pi-package-skills.cjs --write # write pi/package-skills/
12
+ * node scripts/gen-pi-package-skills.cjs --check # exit 1 if committed templates are stale
13
+ *
14
+ * #5558 (Phase 1b of epic #5556). Pi skill bodies embed the absolute path of the
15
+ * engine tree they `@`-include, and a package's install location is unknown at
16
+ * build time. So the templates are produced by running the real installer
17
+ * (`bin/install.js --pi --global --config-dir <tmp>`), then replacing the temp
18
+ * config dir with PI_ENGINE_ROOT_TOKEN. Rendering a template with a root R
19
+ * (`renderSkillTemplate`, exported for the parity test; pi/gsd.cjs carries the
20
+ * same two-line substitution) is therefore byte-identical to what the installer
21
+ * writes for config dir R.
22
+ *
23
+ * Depends on a built lib (`npm run build:lib`); must run after it in the build chain.
24
+ */
25
+
26
+ const fs = require('node:fs');
27
+ const os = require('node:os');
28
+ const crypto = require('node:crypto');
29
+ const path = require('node:path');
30
+ const { spawnSync } = require('node:child_process');
31
+ const { ExitError, runMain } = require('./lib/cli-exit.cjs');
32
+
33
+ const ROOT = path.resolve(__dirname, '..');
34
+ const OUT_DIR = path.join(ROOT, 'pi', 'package-skills');
35
+ // #5569: the converted Pi role files the package's gsd_dispatch reads (ADR-5559 amendment).
36
+ const ROLES_DIR = path.join(ROOT, 'pi', 'package-agents');
37
+ const ROLES_MANIFEST = 'manifest.json';
38
+ const INSTALLER = path.join(ROOT, 'bin', 'install.js');
39
+ const PI_ENGINE_ROOT_TOKEN = '__GSD_PI_ENGINE_ROOT__';
40
+ const INSTALL_BOUND_MS = 30000;
41
+
42
+ /** Forward-slash form of a path; the installer emits either form depending on platform. */
43
+ function toSlash(p) {
44
+ return String(p).replace(/\\/g, '/');
45
+ }
46
+
47
+ /**
48
+ * Replace every occurrence of `root` (raw and forward-slash forms) with the token.
49
+ * @param {string} content
50
+ * @param {string} root
51
+ */
52
+ function tokenizeSkill(content, root) {
53
+ // The installer may print either the path it was given or its symlink-resolved form (/private/var on macOS).
54
+ let real = root;
55
+ try { real = fs.realpathSync(root); } catch { /* removed already: only the given form */ }
56
+ const forms = [...new Set([root, toSlash(root), real, toSlash(real)])].sort((a, b) => b.length - a.length);
57
+ let out = content;
58
+ for (const form of forms) out = out.split(form).join(PI_ENGINE_ROOT_TOKEN);
59
+ return out;
60
+ }
61
+
62
+ /**
63
+ * Render a template for an engine root. The root is substituted in its
64
+ * forward-slash form, which is what the installer writes for the Pi skills.
65
+ * @param {string} template
66
+ * @param {string} engineRoot
67
+ */
68
+ function renderSkillTemplate(template, engineRoot) {
69
+ return template.split(PI_ENGINE_ROOT_TOKEN).join(toSlash(engineRoot));
70
+ }
71
+
72
+ /**
73
+ * Run the installer for Pi into a fresh temp dir and return that dir. The run
74
+ * gets a separate throwaway HOME (removed straight after): the two must differ,
75
+ * because the installer writes a config dir that equals or sits under HOME as
76
+ * `~`/`$HOME`-relative paths.
77
+ */
78
+ function installIntoTemp() {
79
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-pi-skills-'));
80
+ const home = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-pi-home-'));
81
+ const res = spawnSync(process.execPath, [INSTALLER, '--pi', '--global', '--config-dir', tmp], {
82
+ cwd: ROOT,
83
+ encoding: 'utf8',
84
+ timeout: INSTALL_BOUND_MS,
85
+ windowsHide: true,
86
+ // HOME is redirected too: the installer writes GSD's global defaults store under
87
+ // $HOME/.gsd, and a generator run must not touch the developer's real one.
88
+ // GSD_ARGS_NONCE_OFF keeps the templates canonical: they ship in the package, so a per-install
89
+ // nonce stamped here would be a build-time constant and would change on every generation.
90
+ env: { ...process.env, PI_CODING_AGENT_DIR: tmp, HOME: home, USERPROFILE: home, GSD_HOME: home, GSD_ARGS_NONCE_OFF: '1' },
91
+ });
92
+ fs.rmSync(home, { recursive: true, force: true });
93
+ if (res.status !== 0) {
94
+ fs.rmSync(tmp, { recursive: true, force: true });
95
+ throw new ExitError(
96
+ 1,
97
+ `gen-pi-package-skills: installer failed (${res.error ? res.error.message : `exit ${res.status}`}).\n` +
98
+ `${(res.stderr || res.stdout || '').slice(-1500)}\nRun \`npm run build:lib\` first.`,
99
+ );
100
+ }
101
+ return tmp;
102
+ }
103
+
104
+ /**
105
+ * The role templates and their hash manifest, from an installed `agents/` dir. Roles `@`-reference
106
+ * files under the engine root, so like the skills they ship with PI_ENGINE_ROOT_TOKEN in place of the
107
+ * install path; gsd_dispatch verifies the template bytes against this manifest, then renders the root.
108
+ * @returns {{ roles: { name: string, content: string }[], manifest: string }}
109
+ */
110
+ function collectRoles(tmp) {
111
+ const dir = path.join(tmp, 'agents');
112
+ const roles = fs.readdirSync(dir, { withFileTypes: true })
113
+ .filter((e) => e.isFile() && e.name.endsWith('.md'))
114
+ .map((e) => e.name)
115
+ .sort()
116
+ .map((name) => ({ name, content: tokenizeSkill(fs.readFileSync(path.join(dir, name), 'utf8'), tmp) }));
117
+ const files = {};
118
+ for (const { name, content } of roles) files[name] = crypto.createHash('sha256').update(content).digest('hex');
119
+ return { roles, manifest: `${JSON.stringify({ files }, null, 2)}\n` };
120
+ }
121
+
122
+ /** @returns {{ templates: { skillName: string, content: string }[], roles: { name: string, content: string }[], manifest: string }} */
123
+ function generateAll() {
124
+ const tmp = installIntoTemp();
125
+ try {
126
+ const skillsDir = path.join(tmp, 'skills');
127
+ const names = fs.readdirSync(skillsDir, { withFileTypes: true })
128
+ .filter((e) => e.isDirectory() && e.name.startsWith('gsd-'))
129
+ .map((e) => e.name)
130
+ .sort();
131
+ const templates = names.map((skillName) => ({
132
+ skillName,
133
+ content: tokenizeSkill(fs.readFileSync(path.join(skillsDir, skillName, 'SKILL.md'), 'utf8'), tmp),
134
+ }));
135
+ return { templates, ...collectRoles(tmp) };
136
+ } finally {
137
+ fs.rmSync(tmp, { recursive: true, force: true });
138
+ }
139
+ }
140
+
141
+ /** @returns {{ skillName: string, content: string }[]} sorted by skill name */
142
+ function generateTemplates() {
143
+ return generateAll().templates;
144
+ }
145
+
146
+ function main() {
147
+ const args = new Set(process.argv.slice(2));
148
+ const { templates: results, roles, manifest } = generateAll();
149
+
150
+ if (args.has('--write')) {
151
+ fs.rmSync(ROLES_DIR, { recursive: true, force: true });
152
+ fs.mkdirSync(ROLES_DIR, { recursive: true });
153
+ for (const { name, content } of roles) fs.writeFileSync(path.join(ROLES_DIR, name), content);
154
+ fs.writeFileSync(path.join(ROLES_DIR, ROLES_MANIFEST), manifest);
155
+ fs.rmSync(OUT_DIR, { recursive: true, force: true });
156
+ for (const { skillName, content } of results) {
157
+ fs.mkdirSync(path.join(OUT_DIR, skillName), { recursive: true });
158
+ fs.writeFileSync(path.join(OUT_DIR, skillName, 'SKILL.md'), content);
159
+ }
160
+ process.stdout.write(`gen-pi-package-skills: wrote ${results.length} templates to ${path.relative(ROOT, OUT_DIR)}/ and ${roles.length} roles to ${path.relative(ROOT, ROLES_DIR)}/\n`);
161
+ return 0;
162
+ }
163
+
164
+ if (args.has('--check')) {
165
+ if (!fs.existsSync(OUT_DIR)) {
166
+ throw new ExitError(1, 'gen-pi-package-skills: pi/package-skills/ missing. Run: npm run gen:pi-package-skills');
167
+ }
168
+ let stale = 0;
169
+ const expected = new Set(results.map((r) => r.skillName));
170
+ for (const { skillName, content } of results) {
171
+ const file = path.join(OUT_DIR, skillName, 'SKILL.md');
172
+ if (!fs.existsSync(file)) {
173
+ process.stderr.write(`gen-pi-package-skills: missing ${path.relative(ROOT, file)}\n`);
174
+ stale++;
175
+ } else if (fs.readFileSync(file, 'utf8') !== content) {
176
+ process.stderr.write(`gen-pi-package-skills: stale ${path.relative(ROOT, file)}\n`);
177
+ stale++;
178
+ }
179
+ }
180
+ for (const e of fs.readdirSync(OUT_DIR, { withFileTypes: true })) {
181
+ if (e.isDirectory() && !expected.has(e.name)) {
182
+ process.stderr.write(`gen-pi-package-skills: stale (no source) ${path.relative(ROOT, path.join(OUT_DIR, e.name))}\n`);
183
+ stale++;
184
+ }
185
+ }
186
+ const wantRoles = new Map([...roles.map((r) => [r.name, r.content]), [ROLES_MANIFEST, manifest]]);
187
+ const haveRoles = fs.existsSync(ROLES_DIR) ? fs.readdirSync(ROLES_DIR) : [];
188
+ for (const [name, content] of wantRoles) {
189
+ const file = path.join(ROLES_DIR, name);
190
+ if (!fs.existsSync(file) || fs.readFileSync(file, 'utf8') !== content) {
191
+ process.stderr.write(`gen-pi-package-skills: stale ${path.relative(ROOT, file)}\n`);
192
+ stale++;
193
+ }
194
+ }
195
+ for (const name of haveRoles) {
196
+ if (!wantRoles.has(name)) {
197
+ process.stderr.write(`gen-pi-package-skills: stale (no source) ${path.relative(ROOT, path.join(ROLES_DIR, name))}\n`);
198
+ stale++;
199
+ }
200
+ }
201
+ if (stale > 0) {
202
+ throw new ExitError(1, `gen-pi-package-skills: ${stale} stale template(s). Run: npm run gen:pi-package-skills`);
203
+ }
204
+ process.stdout.write(`gen-pi-package-skills: ${results.length} templates up to date\n`);
205
+ return 0;
206
+ }
207
+
208
+ process.stdout.write(
209
+ `gen-pi-package-skills: would write ${results.length} templates to ${path.relative(ROOT, OUT_DIR)}/\n` +
210
+ ' (use --write to generate, --check to verify staleness)\n',
211
+ );
212
+ return 0;
213
+ }
214
+
215
+ module.exports = { PI_ENGINE_ROOT_TOKEN, tokenizeSkill, renderSkillTemplate, toSlash, generateTemplates, generateAll };
216
+
217
+ if (require.main === module) runMain(main);
@@ -6,6 +6,7 @@
6
6
 
7
7
  module.exports = {
8
8
  MACOS_CONFORMANCE_TIER_FILES: [
9
+ "tests/5100-win32-bare-bash-sentinel.property.test.cjs",
9
10
  "tests/active-workstream-store.unit.test.cjs",
10
11
  "tests/adr-612-bracket-phase-counting.test.cjs",
11
12
  "tests/adr-index-gate.test.cjs",
@@ -16,6 +17,7 @@ module.exports = {
16
17
  "tests/agent-skills.test.cjs",
17
18
  "tests/api-coverage-gate-e2e.test.cjs",
18
19
  "tests/api-coverage.test.cjs",
20
+ "tests/args-terminator-nonce.test.cjs",
19
21
  "tests/ask-user-questions-fallback.test.cjs",
20
22
  "tests/audit-command-cutover.test.cjs",
21
23
  "tests/broken-windows.test.cjs",
@@ -38,6 +40,7 @@ module.exports = {
38
40
  "tests/check-ui-safety-gate.test.cjs",
39
41
  "tests/check-update-config-dir.test.cjs",
40
42
  "tests/chunked-planning-parallel.test.cjs",
43
+ "tests/ci-conformance-pr-gating.test.cjs",
41
44
  "tests/ci-docs-guard-registry.test.cjs",
42
45
  "tests/ci-test-scope.test.cjs",
43
46
  "tests/cline-install.test.cjs",
@@ -82,6 +85,7 @@ module.exports = {
82
85
  "tests/gap-checker.property.test.cjs",
83
86
  "tests/gate-api-coverage-verify-pre-escape.test.cjs",
84
87
  "tests/gate-codebase-drift.unit.test.cjs",
88
+ "tests/gate-evaluation-scope.test.cjs",
85
89
  "tests/gate-predicate.unit.test.cjs",
86
90
  "tests/gate-tdd-red-evidence-containment.test.cjs",
87
91
  "tests/gate-ui-plan.unit.test.cjs",
@@ -93,6 +97,7 @@ module.exports = {
93
97
  "tests/graphify-query.test.cjs",
94
98
  "tests/graphify-visualization.test.cjs",
95
99
  "tests/gsd-agent-isolation-guard.test.cjs",
100
+ "tests/gsd-path-export-hook.test.cjs",
96
101
  "tests/gsd-secret-read-guard.test.cjs",
97
102
  "tests/gsd-settings-advanced.test.cjs",
98
103
  "tests/gsd-statusline.test.cjs",
@@ -107,7 +112,6 @@ module.exports = {
107
112
  "tests/hooks-crash-policy.test.cjs",
108
113
  "tests/hooks-opt-in.test.cjs",
109
114
  "tests/host-integration.test.cjs",
110
- "tests/in-tier-commit-hook-timing.test.cjs",
111
115
  "tests/init-manager.test.cjs",
112
116
  "tests/install-minimal-hooks.test.cjs",
113
117
  "tests/install-path-detection.test.cjs",
@@ -135,6 +139,7 @@ module.exports = {
135
139
  "tests/markdown-sectionizer.test.cjs",
136
140
  "tests/mcp-catalog.test.cjs",
137
141
  "tests/milestone-archive.test.cjs",
142
+ "tests/milestone-release-tags.test.cjs",
138
143
  "tests/milestone-window-single-owner.test.cjs",
139
144
  "tests/model-catalog.unit.test.cjs",
140
145
  "tests/model-resolver.test.cjs",
@@ -163,6 +168,8 @@ module.exports = {
163
168
  "tests/phase-status.test.cjs",
164
169
  "tests/phase.platform.test.cjs",
165
170
  "tests/phase.test.cjs",
171
+ "tests/pi-dispatch.test.cjs",
172
+ "tests/pi-package.test.cjs",
166
173
  "tests/plan-authoring-verification-gaps.test.cjs",
167
174
  "tests/plan-count-single-owner.test.cjs",
168
175
  "tests/plan-document.test.cjs",
@@ -200,6 +207,7 @@ module.exports = {
200
207
  "tests/review-parallel-lanes.test.cjs",
201
208
  "tests/review-plan-coverage-manifest.test.cjs",
202
209
  "tests/review-reviewer-selection.test.cjs",
210
+ "tests/reviewed-or-maintainer-policy.test.cjs",
203
211
  "tests/reviewer-manifest-body.test.cjs",
204
212
  "tests/reviewer-step-dispatch.test.cjs",
205
213
  "tests/roadmap-mode-field.test.cjs",
@@ -214,9 +222,11 @@ module.exports = {
214
222
  "tests/runtime-launcher-parity.test.cjs",
215
223
  "tests/runtime-name-policy.test.cjs",
216
224
  "tests/security.test.cjs",
225
+ "tests/self-test-report-policy.test.cjs",
217
226
  "tests/settings-jsonc.test.cjs",
218
227
  "tests/shared-hooks-dir-resolution.test.cjs",
219
228
  "tests/shell-command-projection-dispatch.test.cjs",
229
+ "tests/shell-command-projection-md-normalize.test.cjs",
220
230
  "tests/shipped-reference-cites.test.cjs",
221
231
  "tests/skill-manifest.test.cjs",
222
232
  "tests/spawn-liveness-banner.test.cjs",
@@ -3,6 +3,7 @@
3
3
 
4
4
  module.exports = {
5
5
  CONFORMANCE_TIER_FILES: [
6
+ "tests/5100-win32-bare-bash-sentinel.property.test.cjs",
6
7
  "tests/adr-index-gate.test.cjs",
7
8
  "tests/adr857-core-without-capabilities.test.cjs",
8
9
  "tests/agent-install-check.test.cjs",
@@ -11,6 +12,7 @@ module.exports = {
11
12
  "tests/antigravity-upgrades.test.cjs",
12
13
  "tests/api-coverage-gate-e2e.test.cjs",
13
14
  "tests/api-coverage.test.cjs",
15
+ "tests/args-terminator-nonce.test.cjs",
14
16
  "tests/assumption-delta-checkpoint-e2e.test.cjs",
15
17
  "tests/assumption-delta.test.cjs",
16
18
  "tests/audit-command-cutover.test.cjs",
@@ -42,6 +44,7 @@ module.exports = {
42
44
  "tests/check-update-config-dir.test.cjs",
43
45
  "tests/check-update-fail-open.test.cjs",
44
46
  "tests/chunked-planning-parallel.test.cjs",
47
+ "tests/ci-conformance-pr-gating.test.cjs",
45
48
  "tests/ci-docs-guard-registry.test.cjs",
46
49
  "tests/ci-rebase-check.test.cjs",
47
50
  "tests/ci-test-scope.test.cjs",
@@ -67,6 +70,7 @@ module.exports = {
67
70
  "tests/commit-files-pathspec.test.cjs",
68
71
  "tests/commonjs-marker.test.cjs",
69
72
  "tests/compact-content-4139.test.cjs",
73
+ "tests/complete-milestone-release-map-routing.test.cjs",
70
74
  "tests/completion-ratio-scope-withholding.test.cjs",
71
75
  "tests/config-defaults-runtime-exclusion.test.cjs",
72
76
  "tests/config-get-default.test.cjs",
@@ -121,6 +125,7 @@ module.exports = {
121
125
  "tests/gate-tdd-red-evidence-containment.test.cjs",
122
126
  "tests/gate-tdd-review-checkpoint-hardening.test.cjs",
123
127
  "tests/gate-tdd-review-checkpoint.unit.test.cjs",
128
+ "tests/gate-tdd-review-order-5275.test.cjs",
124
129
  "tests/gate-ui-plan.unit.test.cjs",
125
130
  "tests/gate-ui-safety.unit.test.cjs",
126
131
  "tests/gate-verify-command-paths.unit.test.cjs",
@@ -129,6 +134,7 @@ module.exports = {
129
134
  "tests/gen-health-docs.test.cjs",
130
135
  "tests/gen-section-manifest.test.cjs",
131
136
  "tests/git-base-branch.test.cjs",
137
+ "tests/git-optional-locks-parity.test.cjs",
132
138
  "tests/golden-install-tree.test.cjs",
133
139
  "tests/graphify-graph-path.test.cjs",
134
140
  "tests/graphify-visualization.test.cjs",
@@ -137,6 +143,7 @@ module.exports = {
137
143
  "tests/gsd-check-update-worker-atomic-cache.test.cjs",
138
144
  "tests/gsd-check-update-worker-platform-gate.test.cjs",
139
145
  "tests/gsd-mcp-server-bin.test.cjs",
146
+ "tests/gsd-path-export-hook.test.cjs",
140
147
  "tests/gsd-statusline.test.cjs",
141
148
  "tests/gsd-validate-commit-crash-policy.test.cjs",
142
149
  "tests/gsd-validate-commit-sigpipe.test.cjs",
@@ -162,6 +169,7 @@ module.exports = {
162
169
  "tests/install-runtime-artifacts.test.cjs",
163
170
  "tests/install-write-confinement.test.cjs",
164
171
  "tests/install.test.cjs",
172
+ "tests/installer-first-install-user-skill-5522.test.cjs",
165
173
  "tests/installer-migration-antigravity-retire-confighome-artifacts.test.cjs",
166
174
  "tests/installer-migration-config-root-marker.test.cjs",
167
175
  "tests/installer-migration-pi-retire-hooks-dir.test.cjs",
@@ -171,6 +179,7 @@ module.exports = {
171
179
  "tests/intel.test.cjs",
172
180
  "tests/inventory-nested-families.test.cjs",
173
181
  "tests/io.test.cjs",
182
+ "tests/isolation-aged-none-sentinel.test.cjs",
174
183
  "tests/isolation-sentinel.test.cjs",
175
184
  "tests/kilo-upgrades.test.cjs",
176
185
  "tests/kimi-agent-converter.test.cjs",
@@ -188,6 +197,9 @@ module.exports = {
188
197
  "tests/mcp-catalog.property.test.cjs",
189
198
  "tests/mcp-catalog.test.cjs",
190
199
  "tests/milestone-archive.test.cjs",
200
+ "tests/milestone-lock.test.cjs",
201
+ "tests/milestone-release-map-archive.test.cjs",
202
+ "tests/milestone-release-tags.test.cjs",
191
203
  "tests/milestone-window-single-owner.test.cjs",
192
204
  "tests/milestone.test.cjs",
193
205
  "tests/model-resolver.test.cjs",
@@ -204,10 +216,12 @@ module.exports = {
204
216
  "tests/no-unbounded-spawn.test.cjs",
205
217
  "tests/no-unguarded-nonportable-exec.rule.test.cjs",
206
218
  "tests/node-compile-cache.test.cjs",
219
+ "tests/npm-audit-baseline-safe-directory-5659.test.cjs",
207
220
  "tests/npm-audit-baseline.test.cjs",
208
221
  "tests/npm-integrity-gate.test.cjs",
209
222
  "tests/nsegment-phase-grammar.test.cjs",
210
223
  "tests/onboard-command.test.cjs",
224
+ "tests/opencode-advisory-stderr.test.cjs",
211
225
  "tests/opencode-command-dir-plural.test.cjs",
212
226
  "tests/opencode-config-jsonc.test.cjs",
213
227
  "tests/opencode-generations.smoke.test.cjs",
@@ -228,6 +242,10 @@ module.exports = {
228
242
  "tests/phase.platform.test.cjs",
229
243
  "tests/phase6-capstone-conformance.test.cjs",
230
244
  "tests/pi-config-dir-env-override.test.cjs",
245
+ "tests/pi-dispatch-install.test.cjs",
246
+ "tests/pi-dispatch.test.cjs",
247
+ "tests/pi-hook-bridge.test.cjs",
248
+ "tests/pi-package.test.cjs",
231
249
  "tests/plan-count-single-owner.test.cjs",
232
250
  "tests/plan-phase-stall-detection.test.cjs",
233
251
  "tests/plan-pre-hook-e2e.test.cjs",
@@ -269,7 +287,9 @@ module.exports = {
269
287
  "tests/retired-artifact-cleanup.test.cjs",
270
288
  "tests/review-build-prompt-optional-sections.test.cjs",
271
289
  "tests/review-default-reviewers-config.test.cjs",
290
+ "tests/review-lane-availability.test.cjs",
272
291
  "tests/review-lane-invocation.test.cjs",
292
+ "tests/review-lane-no-redirect-5433.test.cjs",
273
293
  "tests/review-lane-runner.test.cjs",
274
294
  "tests/review-lane-windows-spawn-resolution.test.cjs",
275
295
  "tests/review-model-config.test.cjs",
@@ -280,6 +300,7 @@ module.exports = {
280
300
  "tests/revision-remediation-binding.test.cjs",
281
301
  "tests/roadmap-parser.test.cjs",
282
302
  "tests/roadmap-upgrade-bracket.test.cjs",
303
+ "tests/roadmap-upgrade.test.cjs",
283
304
  "tests/roadmap.test.cjs",
284
305
  "tests/run-tests-accounting.test.cjs",
285
306
  "tests/run-tests-harness.test.cjs",
@@ -293,11 +314,14 @@ module.exports = {
293
314
  "tests/runtime-identity.test.cjs",
294
315
  "tests/runtime-launcher-parity.test.cjs",
295
316
  "tests/schema-drift.test.cjs",
317
+ "tests/section-manifest-init-facts.test.cjs",
296
318
  "tests/security.test.cjs",
319
+ "tests/self-test-report-policy.test.cjs",
297
320
  "tests/settings-jsonc.test.cjs",
298
321
  "tests/sh-hook-paths.test.cjs",
299
322
  "tests/shared-hooks-dir-resolution.test.cjs",
300
323
  "tests/shell-command-projection-dispatch.test.cjs",
324
+ "tests/shell-command-projection-md-normalize.test.cjs",
301
325
  "tests/shell-command-projection-path-sep.test.cjs",
302
326
  "tests/ship-notes-wedged-pr.test.cjs",
303
327
  "tests/shipped-reference-cites.test.cjs",
@@ -321,6 +345,7 @@ module.exports = {
321
345
  "tests/unusable-input.test.cjs",
322
346
  "tests/update-custom-backup.test.cjs",
323
347
  "tests/user-artifact-staging.test.cjs",
348
+ "tests/user-home-isolation-5594.test.cjs",
324
349
  "tests/verification-append-audit.test.cjs",
325
350
  "tests/verification-status.test.cjs",
326
351
  "tests/verify-archive-dirs-live-path.test.cjs",
@@ -336,7 +361,7 @@ module.exports = {
336
361
  "tests/workstream.test.cjs",
337
362
  "tests/worktree-cleanup.test.cjs",
338
363
  "tests/worktree-safety.test.cjs",
364
+ "tests/worktree-subdir-effective-root-4885.test.cjs",
339
365
  "tests/worktree.test.cjs",
340
- "tests/xtrace-phase-timing.platform.test.cjs",
341
366
  ],
342
367
  };
@@ -122,10 +122,10 @@ const DOCS_GUARD_EXEMPT_DOCS_PATHS = {
122
122
  // reads that (or any) docs/ file.
123
123
  'capability-validator-task-content-resolver.test.cjs': ['docs/adr/3646-per-task-content-resolution-seam.md'],
124
124
  'ci-docs-guard-registry.test.cjs': [
125
- 'docs/AGENTS.md', 'docs/COMMANDS.md', 'docs/INVENTORY.md', 'docs/a.md', 'docs/adr',
125
+ 'docs/COMMANDS.md', 'docs/INVENTORY.md', 'docs/a.md', 'docs/adr',
126
126
  'docs/adr/0001-example.md', 'docs/adrenaline.md', 'docs/bar.md', 'docs/foo.md', 'docs/how-to/foo.md',
127
- 'docs/how-to/some-unrelated-guide.md', 'docs/how-to/x.md', 'docs/some-unrelated-file.md',
128
- 'docs/totally-unrelated.md',
127
+ 'docs/how-to/some-unrelated-guide.md', 'docs/how-to/x.md', 'docs/reference/agents.md',
128
+ 'docs/some-unrelated-file.md', 'docs/totally-unrelated.md',
129
129
  ],
130
130
  // #4641: cites docs/adr/4641-windows-selector-consolidation.md in an
131
131
  // explanatory comment describing why the retired `windows` scope must not
@@ -234,6 +234,11 @@ const ALLOWLIST_OCCURRENCES = new Map([
234
234
  { snippet: 'Google (Gemini)', reason: 'model-provider choice, not a GSD runtime' },
235
235
  { snippet: 'Committed to Gemini / Google Cloud / Vertex AI', reason: 'the same menu entry\'s description' },
236
236
  ]],
237
+ ['pi/package-agents/gsd-framework-selector.md', [
238
+ // Generated copy of agents/gsd-framework-selector.md for the Pi package (#5569).
239
+ { snippet: 'Google (Gemini)', reason: 'model-provider choice, not a GSD runtime' },
240
+ { snippet: 'Committed to Gemini / Google Cloud / Vertex AI', reason: 'the same menu entry\'s description' },
241
+ ]],
237
242
  ['agents/gsd-framework-selector.compact.md', [
238
243
  { snippet: 'Google (Gemini)', reason: 'model-provider choice, not a GSD runtime' },
239
244
  ]],