create-agent-rig 0.9.1 → 0.10.1

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 (235) hide show
  1. package/CHANGELOG.md +462 -3
  2. package/README.md +267 -305
  3. package/package.json +8 -14
  4. package/packages/cli/dist/commands/create.js +56 -88
  5. package/packages/cli/dist/commands/doctor.js +213 -0
  6. package/packages/cli/dist/commands/init.js +111 -50
  7. package/packages/cli/dist/commands/integrations.js +468 -0
  8. package/packages/cli/dist/commands/setup-wizard.js +61 -0
  9. package/packages/cli/dist/commands/uninstall.js +1223 -0
  10. package/packages/cli/dist/commands/upgrade.js +508 -101
  11. package/packages/cli/dist/index.js +658 -47
  12. package/packages/cli/dist/integrations/declaration.js +158 -0
  13. package/packages/cli/dist/integrations/doctor-guards.js +126 -0
  14. package/packages/cli/dist/integrations/doctor-workflow.js +25 -0
  15. package/packages/cli/dist/integrations/mcp-json.js +107 -0
  16. package/packages/cli/dist/integrations/memory-doctor.js +124 -0
  17. package/packages/cli/dist/integrations/registry.js +22 -0
  18. package/packages/cli/dist/integrations/spawn.js +228 -0
  19. package/packages/cli/dist/integrations/spec-kit.js +280 -0
  20. package/packages/cli/dist/integrations/verify.js +193 -0
  21. package/packages/cli/dist/integrations/windows-job.js +275 -0
  22. package/packages/cli/dist/lib/elevated-paths.js +74 -0
  23. package/packages/cli/dist/lib/install-set.js +1 -44
  24. package/packages/cli/dist/lib/manifest.js +64 -5
  25. package/packages/cli/dist/lib/prompts.js +0 -23
  26. package/packages/cli/dist/lib/safe-path.js +193 -2
  27. package/packages/cli/dist/lib/safe-text.js +78 -0
  28. package/packages/cli/dist/lib/substitute.js +1 -52
  29. package/packages/cli/dist/lib/summary.js +5 -5
  30. package/packages/cli/dist/templates.js +4 -14
  31. package/scripts/prepare.mjs +28 -12
  32. package/templates/agent-os/subagent-routing.json +4 -4
  33. package/templates/agent-os/universal/.agents/skills/check-premises/SKILL.md +45 -12
  34. package/templates/agent-os/universal/.agents/skills/loop/SKILL.md +31 -6
  35. package/templates/agent-os/universal/.agents/skills/new-invariant/SKILL.md +5 -5
  36. package/templates/agent-os/universal/.agents/skills/pr-ship/SKILL.md +1 -1
  37. package/templates/agent-os/universal/.agents/skills/worktree-task/SKILL.md +3 -3
  38. package/templates/agent-os/universal/.claude/agents/code-reviewer.md +8 -6
  39. package/templates/agent-os/universal/.claude/agents/implementation-agent.md +41 -0
  40. package/templates/agent-os/universal/.claude/agents/prose-reviewer.md +8 -4
  41. package/templates/agent-os/universal/.claude/agents/security-scanner.md +4 -2
  42. package/templates/agent-os/universal/.claude/agents/test-writer.md +2 -2
  43. package/templates/agent-os/universal/.claude/hooks/gate-stop-dod.mjs +4 -2
  44. package/templates/agent-os/universal/.claude/hooks/inject-rules.mjs +83 -4
  45. package/templates/agent-os/universal/.claude/rules/autonomy.md +55 -27
  46. package/templates/agent-os/universal/.claude/rules/invariants.md +9 -8
  47. package/templates/agent-os/universal/.claude/rules/workflow.md +59 -22
  48. package/templates/agent-os/universal/.claude/scripts/decision-router.mjs +1 -1
  49. package/templates/agent-os/universal/.claude/scripts/detect-missed-gate.mjs +12 -9
  50. package/templates/agent-os/universal/.claude/scripts/doctor.mjs +100 -2
  51. package/templates/agent-os/universal/.claude/scripts/lib/claim-records.mjs +236 -6
  52. package/templates/agent-os/universal/.claude/scripts/queue/state.mjs +2 -2
  53. package/templates/agent-os/universal/.claude/scripts/reconcile-external-prs.mjs +4 -3
  54. package/templates/agent-os/universal/.claude/scripts/revalidate.mjs +16 -0
  55. package/templates/agent-os/universal/.claude/settings.json +0 -8
  56. package/templates/agent-os/universal/.claude/skills/check-premises/SKILL.md +45 -12
  57. package/templates/agent-os/universal/.claude/skills/loop/SKILL.md +31 -6
  58. package/templates/agent-os/universal/.claude/skills/new-invariant/SKILL.md +5 -5
  59. package/templates/agent-os/universal/.claude/skills/pr-ship/SKILL.md +1 -1
  60. package/templates/agent-os/universal/.claude/skills/worktree-task/SKILL.md +3 -3
  61. package/templates/agent-os/universal/.codex/agents/code-reviewer.toml +2 -2
  62. package/templates/agent-os/universal/.codex/agents/implementation-agent.toml +6 -0
  63. package/templates/agent-os/universal/.codex/agents/prose-reviewer.toml +2 -2
  64. package/templates/agent-os/universal/.codex/agents/security-scanner.toml +1 -1
  65. package/templates/agent-os/universal/.codex/agents/test-writer.toml +1 -1
  66. package/templates/agent-os/universal/.codex/hooks.json +0 -10
  67. package/templates/agent-os/universal/AGENTS.md +208 -107
  68. package/templates/agent-os/universal/CLAUDE.md +15 -162
  69. package/templates/agent-os/universal/PLAN.md +17 -10
  70. package/templates/agent-os/universal/docs/decisions/agents-md-canonical.md +313 -0
  71. package/templates/agent-os/universal/docs/decisions/codex-adapter.md +15 -10
  72. package/templates/agent-os/universal/docs/decisions/review-lanes.md +12 -8
  73. package/templates/agent-os/universal/docs/decisions/session-start-wire-format.md +206 -0
  74. package/templates/agent-os/universal/docs/decisions/subagent-routing.md +6 -3
  75. package/templates/agent-os/universal/docs/decisions/workflow-layer-split.md +235 -0
  76. package/templates/agent-os/universal/layers.json +25 -30
  77. package/templates/hash-history.json +112 -40
  78. package/templates/release-ledger.json +3 -1
  79. package/packages/cli/dist/lib/composition.js +0 -20
  80. package/packages/cli/dist/lib/targets.js +0 -28
  81. package/packages/cli/dist/policy/benchmark/corpus.js +0 -165
  82. package/packages/cli/dist/policy/core/adapter.js +0 -18
  83. package/packages/cli/dist/policy/core/coverage.js +0 -253
  84. package/packages/cli/dist/policy/core/decision-record.js +0 -287
  85. package/packages/cli/dist/policy/core/declaration.js +0 -127
  86. package/packages/cli/dist/policy/core/evidence-matrix.js +0 -94
  87. package/packages/cli/dist/policy/core/probe.js +0 -442
  88. package/packages/cli/dist/policy/core/registry.js +0 -115
  89. package/packages/cli/dist/policy/core/validation.js +0 -275
  90. package/packages/cli/dist/policy/core/vocabulary.js +0 -123
  91. package/packages/cli/dist/policy/harness/claude.js +0 -47
  92. package/packages/cli/dist/policy/harness/codex.js +0 -87
  93. package/packages/cli/dist/policy/harness/index.js +0 -15
  94. package/packages/cli/dist/policy/harness/shared-hooks.js +0 -28
  95. package/packages/cli/dist/policy/index.js +0 -17
  96. package/templates/agent-os/init/AGENTS.md +0 -201
  97. package/templates/agent-os/init/CLAUDE.md +0 -201
  98. package/templates/agent-os/stack/aws-cdk/.agents/skills/post-deploy-verify/SKILL.md +0 -105
  99. package/templates/agent-os/stack/aws-cdk/.agents/skills/ro-debug/SKILL.md +0 -117
  100. package/templates/agent-os/stack/aws-cdk/.claude/agents/cdk-diff-reviewer.md +0 -89
  101. package/templates/agent-os/stack/aws-cdk/.claude/rules/aws-cdk.md +0 -105
  102. package/templates/agent-os/stack/aws-cdk/.claude/skills/post-deploy-verify/SKILL.md +0 -105
  103. package/templates/agent-os/stack/aws-cdk/.claude/skills/ro-debug/SKILL.md +0 -117
  104. package/templates/agent-os/stack/aws-cdk/.codex/agents/cdk-diff-reviewer.toml +0 -6
  105. package/templates/agent-os/stack/node-ts/.claude/hooks/dod-checks.json +0 -1
  106. package/templates/agent-os/stack/node-ts/.claude/rules/node-ts.md +0 -85
  107. package/templates/agent-os/universal/.claude/hooks/guard-core-purity.mjs +0 -89
  108. package/templates/agent-os/universal/.claude/hooks/guard-web-boundary.mjs +0 -68
  109. package/templates/agent-os/universal/.claude/rules/architecture.md +0 -81
  110. package/templates/skeleton/aws-serverless/.github/workflows/ci.yml +0 -28
  111. package/templates/skeleton/aws-serverless/.github/workflows/deploy.yml +0 -90
  112. package/templates/skeleton/aws-serverless/README.md +0 -181
  113. package/templates/skeleton/aws-serverless/apps/web/next.config.mjs +0 -17
  114. package/templates/skeleton/aws-serverless/apps/web/package.json +0 -19
  115. package/templates/skeleton/aws-serverless/apps/web/src/app/layout.tsx +0 -17
  116. package/templates/skeleton/aws-serverless/apps/web/src/app/page.tsx +0 -96
  117. package/templates/skeleton/aws-serverless/apps/web/src/lib/api.ts +0 -36
  118. package/templates/skeleton/aws-serverless/apps/web/src/lib/validate.ts +0 -23
  119. package/templates/skeleton/aws-serverless/apps/web/test/shared-validation.test.ts +0 -38
  120. package/templates/skeleton/aws-serverless/apps/web/tsconfig.json +0 -14
  121. package/templates/skeleton/aws-serverless/eslint.config.mjs +0 -20
  122. package/templates/skeleton/aws-serverless/gitignore +0 -56
  123. package/templates/skeleton/aws-serverless/infra/bin/app.ts +0 -79
  124. package/templates/skeleton/aws-serverless/infra/cdk.json +0 -3
  125. package/templates/skeleton/aws-serverless/infra/lib/app-stack.ts +0 -248
  126. package/templates/skeleton/aws-serverless/infra/lib/web-stack.ts +0 -45
  127. package/templates/skeleton/aws-serverless/infra/package.json +0 -18
  128. package/templates/skeleton/aws-serverless/infra/test/allowed-origins.test.ts +0 -301
  129. package/templates/skeleton/aws-serverless/infra/test/app-composition.test.ts +0 -137
  130. package/templates/skeleton/aws-serverless/infra/test/app-stack.test.ts +0 -120
  131. package/templates/skeleton/aws-serverless/infra/test/web-stack.test.ts +0 -44
  132. package/templates/skeleton/aws-serverless/package.json +0 -30
  133. package/templates/skeleton/aws-serverless/packages/core/package.json +0 -11
  134. package/templates/skeleton/aws-serverless/packages/core/src/events.ts +0 -14
  135. package/templates/skeleton/aws-serverless/packages/core/src/index.ts +0 -15
  136. package/templates/skeleton/aws-serverless/packages/core/src/note.ts +0 -69
  137. package/templates/skeleton/aws-serverless/packages/core/test/events.test.ts +0 -23
  138. package/templates/skeleton/aws-serverless/packages/core/test/note.test.ts +0 -101
  139. package/templates/skeleton/aws-serverless/packages/db/package.json +0 -14
  140. package/templates/skeleton/aws-serverless/packages/db/src/client.ts +0 -17
  141. package/templates/skeleton/aws-serverless/packages/db/src/index.ts +0 -2
  142. package/templates/skeleton/aws-serverless/packages/db/src/note-model.ts +0 -52
  143. package/templates/skeleton/aws-serverless/packages/db/test/note-model.test.ts +0 -91
  144. package/templates/skeleton/aws-serverless/packages/shared/package.json +0 -11
  145. package/templates/skeleton/aws-serverless/packages/shared/src/env.ts +0 -17
  146. package/templates/skeleton/aws-serverless/packages/shared/src/errors.ts +0 -33
  147. package/templates/skeleton/aws-serverless/packages/shared/src/index.ts +0 -3
  148. package/templates/skeleton/aws-serverless/packages/shared/src/logger.ts +0 -20
  149. package/templates/skeleton/aws-serverless/packages/shared/test/env.test.ts +0 -26
  150. package/templates/skeleton/aws-serverless/packages/shared/test/errors.test.ts +0 -28
  151. package/templates/skeleton/aws-serverless/packages/shared/test/logger.test.ts +0 -19
  152. package/templates/skeleton/aws-serverless/pnpm-lock.yaml +0 -2855
  153. package/templates/skeleton/aws-serverless/pnpm-workspace.yaml +0 -14
  154. package/templates/skeleton/aws-serverless/services/api/package.json +0 -15
  155. package/templates/skeleton/aws-serverless/services/api/src/adapters/sqs-publisher.ts +0 -26
  156. package/templates/skeleton/aws-serverless/services/api/src/handlers/create-note.ts +0 -69
  157. package/templates/skeleton/aws-serverless/services/api/src/handlers/list-notes.ts +0 -37
  158. package/templates/skeleton/aws-serverless/services/api/src/list-main.ts +0 -12
  159. package/templates/skeleton/aws-serverless/services/api/src/main.ts +0 -21
  160. package/templates/skeleton/aws-serverless/services/api/src/usecases/create-note.ts +0 -41
  161. package/templates/skeleton/aws-serverless/services/api/src/usecases/list-notes.ts +0 -14
  162. package/templates/skeleton/aws-serverless/services/api/test/create-note.handler.test.ts +0 -211
  163. package/templates/skeleton/aws-serverless/services/api/test/create-note.usecase.test.ts +0 -45
  164. package/templates/skeleton/aws-serverless/services/api/test/list-notes.test.ts +0 -122
  165. package/templates/skeleton/aws-serverless/services/api/test/sqs-publisher.test.ts +0 -22
  166. package/templates/skeleton/aws-serverless/services/worker/package.json +0 -12
  167. package/templates/skeleton/aws-serverless/services/worker/src/handlers/note-created.ts +0 -15
  168. package/templates/skeleton/aws-serverless/services/worker/src/main.ts +0 -7
  169. package/templates/skeleton/aws-serverless/services/worker/src/usecases/process-note-created.ts +0 -37
  170. package/templates/skeleton/aws-serverless/services/worker/test/note-created.test.ts +0 -61
  171. package/templates/skeleton/aws-serverless/tsconfig.base.json +0 -15
  172. package/templates/skeleton/aws-serverless/tsconfig.json +0 -16
  173. package/templates/skeleton/aws-serverless/vitest.config.ts +0 -14
  174. package/templates/skeleton/node-service/.github/workflows/ci.yml +0 -27
  175. package/templates/skeleton/node-service/.github/workflows/deploy.yml +0 -29
  176. package/templates/skeleton/node-service/README.md +0 -104
  177. package/templates/skeleton/node-service/apps/web/next.config.mjs +0 -17
  178. package/templates/skeleton/node-service/apps/web/package.json +0 -19
  179. package/templates/skeleton/node-service/apps/web/src/app/layout.tsx +0 -17
  180. package/templates/skeleton/node-service/apps/web/src/app/page.tsx +0 -96
  181. package/templates/skeleton/node-service/apps/web/src/lib/api.ts +0 -29
  182. package/templates/skeleton/node-service/apps/web/src/lib/validate.ts +0 -23
  183. package/templates/skeleton/node-service/apps/web/test/shared-validation.test.ts +0 -38
  184. package/templates/skeleton/node-service/apps/web/tsconfig.json +0 -14
  185. package/templates/skeleton/node-service/eslint.config.mjs +0 -20
  186. package/templates/skeleton/node-service/gitignore +0 -54
  187. package/templates/skeleton/node-service/package.json +0 -30
  188. package/templates/skeleton/node-service/packages/core/package.json +0 -11
  189. package/templates/skeleton/node-service/packages/core/src/events.ts +0 -14
  190. package/templates/skeleton/node-service/packages/core/src/index.ts +0 -15
  191. package/templates/skeleton/node-service/packages/core/src/note.ts +0 -69
  192. package/templates/skeleton/node-service/packages/core/test/events.test.ts +0 -23
  193. package/templates/skeleton/node-service/packages/core/test/note.test.ts +0 -101
  194. package/templates/skeleton/node-service/packages/db/package.json +0 -12
  195. package/templates/skeleton/node-service/packages/db/src/index.ts +0 -1
  196. package/templates/skeleton/node-service/packages/db/src/note-store.ts +0 -100
  197. package/templates/skeleton/node-service/packages/db/test/note-store.test.ts +0 -100
  198. package/templates/skeleton/node-service/packages/shared/package.json +0 -11
  199. package/templates/skeleton/node-service/packages/shared/src/env.ts +0 -17
  200. package/templates/skeleton/node-service/packages/shared/src/errors.ts +0 -33
  201. package/templates/skeleton/node-service/packages/shared/src/index.ts +0 -3
  202. package/templates/skeleton/node-service/packages/shared/src/logger.ts +0 -20
  203. package/templates/skeleton/node-service/packages/shared/test/env.test.ts +0 -26
  204. package/templates/skeleton/node-service/packages/shared/test/errors.test.ts +0 -28
  205. package/templates/skeleton/node-service/packages/shared/test/logger.test.ts +0 -19
  206. package/templates/skeleton/node-service/pnpm-lock.yaml +0 -2402
  207. package/templates/skeleton/node-service/pnpm-workspace.yaml +0 -13
  208. package/templates/skeleton/node-service/scripts/build-artifact.mjs +0 -34
  209. package/templates/skeleton/node-service/services/api/package.json +0 -17
  210. package/templates/skeleton/node-service/services/api/src/adapters/spool-publisher.ts +0 -23
  211. package/templates/skeleton/node-service/services/api/src/handlers/create-note.ts +0 -40
  212. package/templates/skeleton/node-service/services/api/src/handlers/list-notes.ts +0 -23
  213. package/templates/skeleton/node-service/services/api/src/main.ts +0 -40
  214. package/templates/skeleton/node-service/services/api/src/server.ts +0 -172
  215. package/templates/skeleton/node-service/services/api/src/static-dir.ts +0 -20
  216. package/templates/skeleton/node-service/services/api/src/usecases/create-note.ts +0 -30
  217. package/templates/skeleton/node-service/services/api/src/usecases/list-notes.ts +0 -14
  218. package/templates/skeleton/node-service/services/api/test/artifact.test.ts +0 -92
  219. package/templates/skeleton/node-service/services/api/test/create-note.handler.test.ts +0 -64
  220. package/templates/skeleton/node-service/services/api/test/create-note.usecase.test.ts +0 -43
  221. package/templates/skeleton/node-service/services/api/test/list-notes.test.ts +0 -48
  222. package/templates/skeleton/node-service/services/api/test/package-manager.test.ts +0 -40
  223. package/templates/skeleton/node-service/services/api/test/package-manager.ts +0 -51
  224. package/templates/skeleton/node-service/services/api/test/server.test.ts +0 -208
  225. package/templates/skeleton/node-service/services/api/test/spool-publisher.test.ts +0 -32
  226. package/templates/skeleton/node-service/services/api/test/static-dir.test.ts +0 -29
  227. package/templates/skeleton/node-service/services/worker/package.json +0 -16
  228. package/templates/skeleton/node-service/services/worker/src/main.ts +0 -28
  229. package/templates/skeleton/node-service/services/worker/src/spool.ts +0 -60
  230. package/templates/skeleton/node-service/services/worker/src/usecases/process-note-created.ts +0 -38
  231. package/templates/skeleton/node-service/services/worker/test/process-note-created.test.ts +0 -34
  232. package/templates/skeleton/node-service/services/worker/test/spool.test.ts +0 -76
  233. package/templates/skeleton/node-service/tsconfig.base.json +0 -15
  234. package/templates/skeleton/node-service/tsconfig.json +0 -13
  235. package/templates/skeleton/node-service/vitest.config.ts +0 -12
package/CHANGELOG.md CHANGED
@@ -14,6 +14,466 @@ second recorded departure; its own entry states the direction and the reason,
14
14
  and this paragraph deliberately does not restate them — a numbering rule with
15
15
  two copies of its exceptions is the shape 0.8.0 exists to remove.
16
16
 
17
+ ## 0.10.1
18
+
19
+ **A fixes-only patch on 0.10.0.** Every entry corrects existing behaviour or
20
+ states a rule the rulebook already follows; nothing is added to what `create`,
21
+ `init` or `upgrade` install beyond the corrected files, and no agent, skill,
22
+ hook or routing row is new.
23
+
24
+ ### Fixed
25
+
26
+ - **`upgrade` no longer crashes on a directory where a rig-owned file
27
+ belongs.** A tracked path that is a directory or another non-regular entry
28
+ is reported as a conflict with a reason and left untouched, in `--dry-run`
29
+ and `--yes` alike, instead of ending in an `EISDIR` stack trace (RP-189).
30
+ - **`upgrade` re-checks a leftover `AGENTS.md.rig-new` before removing it.**
31
+ The file is removed only while it still holds exactly the rendered
32
+ `AGENTS.md` bytes, so one edited after the plan was shown is kept, one
33
+ removed in the meantime no longer crashes the run, and the closing notice
34
+ reports a removal only when one happened (RP-202).
35
+ - **`upgrade --dry-run` exits 1 where the real run refuses** a non-file at
36
+ `AGENTS.md.rig-new`, instead of 0 (RP-202).
37
+ - **The Stop gate's budget is measured on the monotonic clock.**
38
+ `gate-stop-dod` computed its shared deadline from the wall clock, so a clock
39
+ step lengthened or shortened it (RP-204).
40
+
41
+ ### Rulebook
42
+
43
+ - `workflow.md` states the review-findings rule as a Core section of its own:
44
+ a blocking finding closes by a fix the reviewer reads again, or by evidence
45
+ the reviewer can re-check that its premise is false — with or without the
46
+ opt-in workflow layer (RP-194).
47
+ - `check-premises` treats a claim about an external API, CLI or library as a
48
+ premise: backed by a four-part record (version, authoritative source, date,
49
+ quote or pointer), it holds or is `PREMISE FALSE`; without one it stays
50
+ `UNVERIFIABLE` (RP-194).
51
+
52
+ ### Generator repository (not a rig-facing change)
53
+
54
+ - `packages/cli/src/commands/integrations.ts` is a declared elevated path.
55
+ - `scripts/memory-conformance.mjs` names why a rig spawn failed — exit code or
56
+ signal plus the child's error code — instead of a bare "exit 1" (RP-188).
57
+ - `docs/decisions/agent-roles-1.0.md` records the 1.0 agent-role targets; it
58
+ is repository-local and not shipped.
59
+
60
+ ## 0.10.0
61
+
62
+ Platforms: the packed release candidate is accepted on Linux, Windows and
63
+ macOS on Apple silicon (`scripts/release-acceptance.mjs`, dispatched on the
64
+ exact release commit; `e2e.yml` gains a `macos-e2e` job for it). Every CI job
65
+ now runs on a GitHub-hosted image; `e2e.yml` no longer has a runner switch.
66
+ On Windows, Spec Kit 1.0.8 rewrites `.claude/settings.json` and `.codex/config.toml` with CRLF line endings, so
67
+ `doctor` reports `rig-owned-files` as `warn` after Spec Kit setup there.
68
+ Ownership hashes cover exact bytes (`docs/decisions/raw-byte-ownership.md`), so
69
+ where a Codex MCP provider is also wired, `doctor` reports that wiring as
70
+ `drift` and a later `setup` change to a Codex MCP provider refuses with the
71
+ managed fragment for a manual merge instead of overwriting the file.
72
+
73
+ `doctor [--json]` aggregates Rig file integrity, installed guards, optional
74
+ workflow mechanisms, MCP wiring, pinned offline Spec Kit status and the
75
+ machine's custom Memory diagnosis. It preserves the existing versioned
76
+ `ok`/`warn`/`fail` contract and keeps connectivity and trust unobserved.
77
+
78
+ A new project gets an `implementation-agent` for the Green step of TDD, pinned
79
+ like the other roles (`claude-sonnet-5` / `gpt-5.6-terra`, `high`) in
80
+ `.claude/agents/` and `.codex/agents/`. Ordinary implementation no longer falls
81
+ to the unnamed general-purpose subagent, which remains for ad-hoc work.
82
+
83
+ Basic Memory is available as an optional, wiring-only MCP preview for Claude Code
84
+ and Codex. Rig records only its project MCP wiring; it never installs, updates,
85
+ inspects, synchronizes, or removes Basic Memory data. `uvx` remains a launcher
86
+ observation rather than a runtime, connectivity, or trust verification.
87
+
88
+ `setup` now offers a provider/harness wizard and delegates Spec Kit setup to
89
+ the pinned official CLI after an explicit plan and consent. Existing external
90
+ installations use `setup add spec-kit --adopt`; updates and removal use the
91
+ official integration lifecycle without destructive force. Spec Kit retains
92
+ its files and manifests; Rig records intent after authoritative status succeeds.
93
+
94
+ `setup apply` and `setup remove` manage explicitly selected Figma and Atlassian
95
+ MCP configuration through Claude Code's documented project config. Dry-run and
96
+ consent apply before changes; existing user entries are preserved. Ownership
97
+ hashes live alongside provider selection in `.rig/integrations.json`.
98
+ Authorization stays with the provider and harness. Codex uses whole-file
99
+ rendering from the installed release baseline and a rolling intent hash; a
100
+ manual edit refuses rather than being merged or overwritten.
101
+
102
+ **`AGENTS.md` is now the canonical rulebook; `CLAUDE.md` is a short
103
+ compatibility shim.** A new project gets the full rulebook text in
104
+ `AGENTS.md` and a `CLAUDE.md` that is just an `@AGENTS.md` import (Claude
105
+ Code's own import syntax) plus Claude-Code-specific notes — never a second
106
+ copy of the rulebook. This is not a claim that Claude Code always reads
107
+ `AGENTS.md` on its own: that support is version- and configuration-dependent,
108
+ and the shim exists precisely for the sessions where it is not active (see
109
+ `docs/decisions/agents-md-canonical.md` for what is verified and what is
110
+ not). Provider-specific wiring (`.claude/settings.json`, `.claude/agents/`,
111
+ `.codex/hooks.json`, `.codex/config.toml`) is unaffected.
112
+
113
+ Migrating an existing rig: `upgrade` treats both files as the ordinary
114
+ manifest-tracked paths they always were, with one deliberate coupling. An
115
+ untouched pair is replaced with the new shim/canonical split. A `CLAUDE.md`
116
+ or `AGENTS.md` the user edited is reported as a conflict and kept exactly as
117
+ edited, never force-shimmed or overwritten — and if the kept CLAUDE.md is not
118
+ already the `@AGENTS.md` shim, the reason also says it **shadows AGENTS.md**
119
+ (by Claude Code's own default, a `CLAUDE.md` is read _instead of_ `AGENTS.md`,
120
+ not alongside it) and names the fix. A file the user deleted stays deleted.
121
+ **Security fix, content-based since round 5:** CLAUDE.md is held back —
122
+ kept as its old, still-readable content, never replaced with the shim —
123
+ only when the on-disk AGENTS.md genuinely cannot serve as the rulebook:
124
+ absent, or present but carrying no non-empty `elevated-paths` block. A
125
+ CUSTOMISED AGENTS.md that still carries a readable block lets the shim
126
+ through — the shim then imports the user's own rulebook, which is the whole
127
+ point of it — and AGENTS.md itself stays a perfectly ordinary, quiet
128
+ conflict, because a customised `elevated-paths` block is this project's own
129
+ designed steady state, not a broken rulebook (an earlier version of this
130
+ rule keyed on AGENTS.md's verdict alone, which could not tell the two
131
+ apart). Without the hold at all, an unreadable AGENTS.md combined with an
132
+ untouched CLAUDE.md would silently install a shim over a rulebook that may
133
+ carry no `elevated-paths` declaration at all. Holding CLAUDE.md back
134
+ re-vouches it for its own current bytes — the same mechanism that lets a
135
+ later `upgrade` resolve cleanly — which means a later `uninstall` reads it
136
+ as rig-owned and unedited and **removes it**, not "leaves it in place" the
137
+ way an ordinary, never-vouched conflict does; the decision record's
138
+ uninstall column and a dedicated test cover this.
139
+
140
+ The one always-reachable remedy for a genuinely unreadable AGENTS.md:
141
+ `upgrade` WRITES the already-rendered content to a real sibling file,
142
+ `AGENTS.md.rig-new` (never recorded in the manifest, and appearing ONLY in
143
+ the genuinely held-back state — never for an ordinary, readable conflict),
144
+ instead of printing it to stdout for a verbatim paste — measured (gate cycle
145
+ 3, round 3's own remedy) not to survive a real copy-paste byte-for-byte. Its
146
+ status (`would-write` / `identical` / `differs` / `unsafe`) is decided
147
+ entirely at plan time, so a dry run and a real run agree, and a symlink or
148
+ directory at the path is refused BEFORE anything else is written. `mv
149
+ AGENTS.md.rig-new AGENTS.md` is printed only for bytes this run wrote or
150
+ verified — for a pre-existing, differing rescue file the remedy is `rm` (or
151
+ restoring AGENTS.md some other way), never `mv`, since that file is not this
152
+ run's bytes. The instruction is the short, delimited, LAST thing the run
153
+ prints, not buried between the plan and the consent prompt. Once AGENTS.md
154
+ resolves and the rig is no longer held back, a leftover matching rescue file
155
+ is cleaned up and the run says so; unrelated clutter at the path (a stray
156
+ directory or symlink) on an otherwise healthy rig is never touched and never
157
+ mentioned. **Round 4, security disclosure:** `uninstall` removing CLAUDE.md
158
+ or AGENTS.md while the other of the pair is not a clean removal now says so,
159
+ naming which file stays and as what — a bare `- CLAUDE.md` line previously
160
+ did not. See `docs/decisions/agents-md-canonical.md`, "The remedy that
161
+ actually works", for what was measured and what did not work.
162
+
163
+ Pinned by `packages/cli/test/upgrade.test.ts`'s describe block "RP-186:
164
+ AGENTS.md becomes canonical, CLAUDE.md becomes its shim" (untouched pair,
165
+ edited/deleted each side, the shadow-note cases, the held-back cases, the
166
+ rescue-file state machine, the held-back uninstall case, and the re-derived
167
+ 4×3 pristine/edited-with-block/edited-without-block/deleted grid across both
168
+ files), `packages/cli/test/uninstall.test.ts`'s pair-disclosure and
169
+ rescue-file tests, `packages/cli/test/cli-report.test.ts`'s CLI-boundary
170
+ tests for the rescue file (an independent oracle, never `plan.contents`) and
171
+ for the quiet, customised-AGENTS.md conflict, and
172
+ `test/e2e/agents-md-migration.test.ts` (the same migration, including the
173
+ rescue-file remedy end to end and the customised-rulebook case, against a
174
+ rig built from the actual pre-RP-186 payload).
175
+
176
+ **Breaking: the application skeletons are removed, exactly as 0.9.0
177
+ announced.** `create <dir>` no longer takes `--target` and no longer
178
+ scaffolds `aws-serverless` or `node-service` — there is one payload, the same
179
+ one `init` installs, and `create` is now a thin wrapper: `mkdir` → `git init`
180
+ → that install → the pristine baseline commit. The product is a package
181
+ manager for repository-scoped Claude Code and Codex configuration, never an
182
+ application generator (owner ruling, 2026-09-13). The universal layer's
183
+ create-only "architecture group" (`.claude/rules/architecture.md`,
184
+ `guard-core-purity`, `guard-web-boundary`, and the monorepo-shaped
185
+ `CLAUDE.md`/`AGENTS.md` map) is retired along with it — it was an
186
+ application-shape promise a harness configurator has no business making.
187
+ `templates/agent-os/stack/*` (the node-ts and aws-cdk overlays) and
188
+ `templates/agent-os/init/*` (the override layer `init` used to shadow
189
+ `universal` with) are deleted; the init flavour's map and process-only scope
190
+ _is_ the universal layer now.
191
+
192
+ Migration for a repository this tool already generated: nothing breaks.
193
+ `upgrade` still recognises your rig, still refreshes the files it installed
194
+ and you did not touch, and still leaves your application code alone — it was
195
+ never part of any install set, before or after this release. A path from a
196
+ retired layer (an aws-cdk or node-ts rule, an architecture hook) gets a new
197
+ verdict, `retired`: never written, never deleted, dropped from the manifest,
198
+ and reported as no longer shipped — it is yours now. `upgrade`'s `--dry-run`
199
+ output and its summary line both show a `retired` count when there is one.
200
+ The full pre-0.10 migration path is pinned in `test/e2e/upgrade.test.ts` ›
201
+ "retires the deleted stack overlay, and preserves the application and the
202
+ process layer".
203
+
204
+ **Fixed: Codex rejected the `SessionStart` rules refresh.** `inject-rules`
205
+ printed plain text opening with `[agent-os]`, and Codex 0.154.0 was measured
206
+ failing the hook with `hook returned invalid session start JSON output`, so
207
+ that session started without the autonomy rules. The hook now prints one JSON object —
208
+ `hookSpecificOutput.additionalContext`, the shape both harnesses document —
209
+ carrying the same text, character for character, that Claude Code received
210
+ before. It also waits for that write to finish instead of exiting over it,
211
+ and a stdout failure other than an abandoned reader is reported on stderr
212
+ with a non-zero exit rather than looking like a healthy session
213
+ (`docs/decisions/session-start-wire-format.md`). That decision record now
214
+ ships with the hook that cites it — the process layer's manifest
215
+ (`layers.json`) had omitted it, so a generated rig received the hook's
216
+ citation but not the file it pointed at.
217
+
218
+ **Breaking: the workflow layer (queue/loop/pr-ship/run-state/journal/
219
+ revalidation/claim-records/PR-lifecycle helpers) is now an experimental,
220
+ opt-in install (RP-180).** A default `init`/`create` installs Lean Core only
221
+ — rules, gates, stop rules, the review-gate agents and their hooks — and
222
+ never the autonomous, cooperative multi-session machinery on top of it. Pass
223
+ `--layer workflow` to `init` or to `create-agent-rig <dir>` to install it too;
224
+ a rig that already has it keeps it on a plain re-run of `init` with no flag.
225
+ `RigManifest` gains a `layers` field recording the choice, and `upgrade`
226
+ refreshes only the layer(s) a rig recorded. Migration for an existing rig:
227
+ nothing breaks and nothing is deleted — a manifest written before this field
228
+ existed carries no `layers` key, and that absence is read as "every layer,"
229
+ exactly what every release before this one installed, so `upgrade` keeps
230
+ managing the workflow files a rig already has. Revalidation and claim-records
231
+ keep their existing behavior unchanged (RP-53's freeze through the RP-26 gate
232
+ on 2026-10-27) — this release only relocates their install-time layer.
233
+ `uninstall` (RP-181) needs no layer awareness of its own: it walks
234
+ `manifest.files` and `manifest.kept` directly, and those two records already
235
+ reflect exactly what a given install wrote, by construction — a Core-only
236
+ rig's manifest simply has no workflow-layer entries in `files` for
237
+ `uninstall` to find, and an inherited pre-0.10 rig's workflow files are
238
+ recorded in `files` exactly as every other installed path is (its manifest
239
+ carries no `layers` key, read as "every layer" the same way `upgrade` reads
240
+ it), so `uninstall` removes them under the same byte-hash check as anything
241
+ else it owns. Nothing about the layer split widens or narrows what
242
+ `uninstall` was already willing to remove.
243
+
244
+ **This repository's own node-ts conventions move out of the shipped
245
+ package**, into `scripts/dogfood/` — a repo-local overlay `sync-agent-os.mjs`
246
+ composes into this repository's own rulebook, same as before, just no longer
247
+ a template any generated rig receives.
248
+
249
+ ### Added
250
+
251
+ - **Setup MCP ownership (RP-22)** uses one schema-v1
252
+ `.rig/integrations.json` for intent and Claude entry hashes. The
253
+ `list | add | apply | remove` commands replace the intermediate receipt
254
+ and `setup verify` surface. See `docs/command-contract.md`,
255
+ "setup integrations", and the command-level regressions in
256
+ `packages/cli/test/integrations-intent.test.ts`. The published
257
+ `setup --memory-root` interface remains compatible.
258
+ - **`uninstall [dir] [--dry-run] [--yes] [--json]`** removes what a rig
259
+ installed, file by file, against the evidence `.claude/.rig-manifest.json`
260
+ carries and nothing else: a path is removed only when its bytes on disk
261
+ still match the recorded hash exactly (compared as raw bytes, never a
262
+ UTF-8-decoded string — ADR-RP-003), the path is a plain file the whole way
263
+ down from the repository root (never a symlinked ancestor or a symlink
264
+ itself), and the path is itself one of the EXACT paths this release
265
+ actually installs — a boundary drawn at a top-level directory would let a
266
+ manifest pair almost any path under `.claude/`, `.rig/`, `docs/` or
267
+ `journal/` with its true hash and have it removed. Anything under `.git` is
268
+ refused outright, for the whole run, for any segment that NORMALISES to
269
+ `.git` (case folded, a Windows alternate-data-stream suffix stripped,
270
+ trailing dots and spaces stripped) at any depth — not only a literal
271
+ top-level `.git` — regardless of the hash a manifest pairs it with; the same
272
+ refusal covers a manifest that lists one path under both `files` and
273
+ `kept`, which this tool's own writer never produces. An edited,
274
+ already-deleted, foreign, `init`-kept, or otherwise unrecognised file is
275
+ reported and left in place, and so is modified hook wiring
276
+ (`.claude/settings.json`, `.codex/hooks.json`), which names the hooks still
277
+ referenced — and so is a hook file such wiring still calls, even when that
278
+ hook file's own bytes are pristine, naming the wiring file that holds it, so
279
+ a kept settings file is never left pointing at a hook `uninstall` just
280
+ deleted. The manifest itself is read, and later removed, through the same
281
+ symlink-safe per-segment check every other manifest-owned path gets, never
282
+ a plain lexical one. It prints the plan, then asks before removing anything
283
+ — `--yes` up front, a prompt on a terminal, an outright refusal off one, and
284
+ always required with `--json`, which never prompts, never deletes
285
+ unattended, and reports an unplanned filesystem error (not only its own
286
+ refusals) as the same one JSON object rather than a bare stack trace. The
287
+ manifest is deleted last, and only once nothing was preserved: a CRLF
288
+ checkout, an edit, or any other conflict keeps the manifest even after
289
+ every removal that WAS planned succeeded, because the rig still owns bytes
290
+ it did not remove and the manifest is the only record naming them. A run
291
+ interrupted partway also keeps it and reports what finished and what a
292
+ re-run still owes — including the manifest itself, whenever a clean re-run
293
+ really would go on to delete it — so a repeat run is safe, and a repeat run
294
+ that finds no manifest at all is a no-op, exit 0. `.rig/` itself is never
295
+ removed, empty or not; the one manifest-owned file the rig installs
296
+ directly inside it is removed like any other file when it is pristine.
297
+ `--json` prints one JSON object and nothing else on stdout — `removed` is
298
+ always what was actually deleted, and `planned` carries the plan's own
299
+ answer regardless of outcome — documented next to the other command
300
+ contracts in `docs/command-contract.md` ("## uninstall (RP-181)"). A
301
+ successful removal names its own next step (`git add -A` and a commit) —
302
+ `uninstall` never touches git history itself. Selected MCP wiring and
303
+ delegated Spec Kit removal have their own lifecycle, `setup remove`;
304
+ `uninstall` touches only files the Rig manifest names (RP-181).
305
+ - **`uninstall` re-verifies bytes twice more, and gains `--detach`.** A plan
306
+ can go stale in the window a confirmation prompt sits in: each `remove`
307
+ action now carries the plan's own recorded hash, re-read and compared
308
+ immediately before that one file's removal — a mismatch skips that file
309
+ (reported `preserved`, reason "changed since planning"), never aborts the
310
+ run, and never deletes it. The manifest's own bytes are checked the same
311
+ way at two points: once before the first removal (a mismatch refuses the
312
+ whole apply, nothing removed) and once immediately before the manifest's
313
+ own deletion (a mismatch keeps the manifest and reports an honest partial
314
+ result — what finished, and that the manifest is what a re-run still owes).
315
+ `--json`'s payload now names which of three outcomes a completed,
316
+ non-dry-run reached — `uninstalled`, `partial`, `detached`; a `--dry-run`
317
+ preview names none of them, since it has no end state to name — and folds
318
+ any
319
+ changed-since-planning path into `preserved` rather than a separate,
320
+ easy-to-miss list. **`--detach`** performs the identical safe cleanup and
321
+ then removes the manifest anyway, leaving every preserved (or
322
+ changed-since-planning) path for the user and printing the complete
323
+ handover list — it never forces away a conflicting or modified file, and
324
+ there is no `--force`. A hook file a wiring file still calls survives even
325
+ when that protection is only discoverable at apply time — a symlinked
326
+ wiring file (whose referenced hooks cannot be safely read, so every owned
327
+ hook is protected instead of a guessed subset) or one edited inside the
328
+ confirmation-prompt window, re-checked immediately before the first hook
329
+ removal, since hook files sort ahead of the wiring that references them.
330
+ **Protection also now follows a hook's own imports to a fixed point**: a
331
+ wired hook is not self-contained (`guard-bash.mjs` imports
332
+ `.claude/hooks/lib/hook-input.mjs`, `.claude/scripts/stop-flag.mjs`,
333
+ `.claude/scripts/lib/shell-tools.mjs`, …), and protecting only the
334
+ directly-named hook while deleting what it imports left every one of
335
+ those dying at module resolution with exit 1 — silently inert, since a
336
+ `PreToolUse` hook that exits non-2 is non-blocking. Every REAL read this
337
+ walk performs is gated by the same symlink-safe check every other read in
338
+ this command gets, not the purely lexical containment alone: a hook file
339
+ swapped for a symlink to an unbounded or blocking special file — reachable
340
+ from nothing worse than `git clone`ing a hostile branch, before consent —
341
+ no longer makes the walk's own read hang or exhaust the heap; the file
342
+ stays protected regardless, since that is recorded before the read is
343
+ attempted. A `kept` wiring file (a pre-existing `.claude/settings.json`
344
+ `init` never took ownership of — the ordinary "starts from an existing
345
+ repository" path) now protects its hooks too: it used to protect NONE of
346
+ them, silently, because the pass that decides this read only `files`'
347
+ hashes and a `kept` path has none. **The reason a protected hook reports
348
+ now names WHY its wiring file survives, not only THAT it does** — a `kept`
349
+ wiring file's hook used to say "which was preserved as edited" too, which
350
+ is false (nobody edited it; the rig never wrote it), and told a
351
+ contradictory story two lines apart from `.claude/settings.json`'s own
352
+ "user-owned (kept by init)" verdict in the same report. It now reads
353
+ "which init found already in place and never took ownership of"; a hook
354
+ whose wiring file could not be safely read at all (itself a symlink) now
355
+ says so ("which could not be safely read…") instead of "edited" too. A
356
+ file reached only through another protected file's own import, rather
357
+ than named by the wiring file directly, now gets its own reason wording
358
+ naming the immediate importer, since the wiring file itself may never
359
+ mention it at all. **A hook file that cannot itself be safely read (a
360
+ symlink) now protects the conservative superset of every owned `.mjs`
361
+ path, not only itself.** Two dependencies in the shipped tree have exactly
362
+ ONE hook that imports them — `.claude/scripts/lib/secrets.mjs` (only
363
+ `guard-secret-file.mjs`) and `.claude/scripts/unattended-flag.mjs` (only
364
+ `guard-rulebook.mjs`) — so symlinking that one seeder used to drop the
365
+ dependency's protection entirely: measured end to end through a real
366
+ `git commit` and a fresh `git clone`, the credential guard went from
367
+ blocking a credential write (exit 2) to dying at module resolution (exit 1,
368
+ non-blocking for `PreToolUse`) once its own import was gone, wiring still
369
+ in place and still claiming to enforce it. **The sweep that protects a
370
+ dependency it could not trace now says so, instead of claiming it as a
371
+ confirmed reference.** Reusing the "still referenced by … which was
372
+ preserved as edited" wording for a swept-in path made the sentence that
373
+ sounds most certain describe the files the command was least sure about:
374
+ in one reproduced run, of 84 owned paths under one preserved wiring file,
375
+ only ~7 were genuinely referenced by it, and ~30 were swept in by caution
376
+ alone — including a test fixture no hook could ever import — all reported
377
+ with the identical, fully-confident wording. A fifth reason string now
378
+ names the file whose own unreadability triggered the sweep instead
379
+ ("protected because `<file>` could not be read…"), and the plain-text
380
+ summary adds a one-line roll-up — how many `preserved` paths were
381
+ genuinely traced versus kept only as a precaution — once any are.
382
+ Which wording a hook gets does not depend on where the unreadable file
383
+ sits in the wiring file's own order: a hook the wiring names, or one a
384
+ readable file imports, is reported as referenced or imported whether the
385
+ precaution sweep ran before or after the command reached it. The sweep
386
+ itself is also
387
+ now narrower: it fires on a file that could not be SAFELY READ, never on one that is simply gone. Sweeping on absence bought
388
+ nothing (an absent file has no imports that can fail to resolve, because
389
+ the module that would make them is itself gone) and cost a real one: an
390
+ ordinary "I turned this hook off by hand" deletion, with the wiring still
391
+ naming it, used to turn 83 planned removals into 40 planned / 43
392
+ preserved on a repository that had done nothing hostile at all. Two other
393
+ apply-time-only fixes in the same area: the removal loop now re-reads a
394
+ wiring file's bytes fresh, immediately before that file's own removal,
395
+ instead of reusing a copy `protectedHooksFor` read before the loop even
396
+ started (an edit landing in that window was previously missed); and a
397
+ filesystem error surfacing from the new apply-time hook-protection re-check
398
+ itself is now caught the same way `planUninstall`'s own errors are, so
399
+ `--json` still gets its one promised object rather than a bare stack trace.
400
+ A manifest key with more path segments than any real path this release ever
401
+ installs no longer reaches the native path-join call that segment count
402
+ could otherwise overflow — reported the same honest, per-path `preserved`
403
+ way any other unowned path is (deeper than any path this release could ever
404
+ own), rather than aborting the whole run, `--dry-run` included, through a
405
+ message that used to claim the path "resolves outside" the repository,
406
+ which was simply false for one that never left it lexically at all; the
407
+ genuine `..`/absolute escape check is unweakened and still aborts the whole
408
+ run exactly as before.
409
+ Every ancestor check now makes two independent tests per segment, not one:
410
+ the existing symlink/type classification, and a separate `realpath`
411
+ containment check that does not read that classification at all — the
412
+ second is what makes the containment guarantee hold for a Windows
413
+ directory junction (or any future reparse-point kind) by construction,
414
+ rather than resting on `isSymbolicLink()` reporting it correctly, which is
415
+ the one part of this that a Windows-only test in the `windows-e2e` lane
416
+ (`packages/cli/test/uninstall.test.ts`, gated by `onlyOnWindows`) actually
417
+ measures — this repository's own development environment cannot build a
418
+ junction to verify it directly. Also: a manifest segment with a very long
419
+ run of trailing dots or spaces no longer costs quadratic time to
420
+ normalise (a hostile committed manifest could otherwise hang
421
+ `uninstall --dry-run`); `rigOwnedPaths` reads the bare install-manifest
422
+ list rather than rendering every template's content just to learn which
423
+ paths exist.
424
+
425
+ ### Generator (not a rig-facing change)
426
+
427
+ **Generator-only (RP-178): nothing a newly scaffolded project receives changes.**
428
+ No file under `templates/` moved. This entry records what changed inside the
429
+ generator's own repository, ahead of 0.10.0.
430
+
431
+ - **The speculative policy-declaration library and its benchmark are gone.**
432
+ `packages/cli/src/policy/` (a declaration schema, registry, decision-record
433
+ format and per-harness adapters, RP-36/RP-76) and
434
+ `scripts/policy-benchmark*.mjs` (the child-process benchmark that measured
435
+ it) shipped nothing a CLI command, an installed hook, or the sync scripts
436
+ ever called — its own module header said so. Removed as dead code, along
437
+ with `contracts/session-messaging/` (its sole remaining consumer) and the
438
+ vitest `benchmark` project. RP-157, RP-160 and RP-161 are closed by
439
+ deletion rather than by fix, since all three findings were against this
440
+ unreachable surface; the consumer graph behind each deletion is on pull
441
+ request #227.
442
+ - **`docs/compatibility.md`** replaces the removed framework's claim to be a
443
+ compatibility check: a Claude Code × Codex × capability matrix — every
444
+ wired hook, the Windows command strings, skills/agents delivery, and the
445
+ optional external-subsystem contract — with one status vocabulary for the
446
+ matrix (SUPPORTED, DEGRADED, UNSUPPORTED, NOT-APPLICABLE, UNVERIFIED).
447
+ `test/template/compatibility-matrix.test.ts` refuses a status outside it,
448
+ a measured status without a test pointer, and a pointer whose test file is
449
+ gone or no longer contains the quoted test name. Windows is stated as
450
+ measured: the Claude Code wiring and most Codex `commandWindows` scripts
451
+ are UNVERIFIED there.
452
+ - **`test/template/guard-acceptance.test.ts`** invokes the retained
453
+ `PreToolUse` guards through the real `.claude/settings.json` /
454
+ `.codex/hooks.json` wiring strings on POSIX, with one allowed and one
455
+ denied fixture per guard for each harness that wires it, in the payload
456
+ shape that harness sends (Codex edits arrive as `apply_patch`); the denied
457
+ one must exit exactly 2 and name its reason. It is the wiring a generated
458
+ project actually runs, not a parallel path. The guard list is derived from
459
+ the two wiring files, so a newly wired guard with no fixture and no
460
+ reasoned exception fails the suite, and so does one without a
461
+ `docs/compatibility.md` row. `guard-subagent-model` is Claude-only and
462
+ runs through the Claude Code wiring alone.
463
+ - **Meta-tests that pinned shape instead of behaviour were removed or cut
464
+ down to the assertion that survives review as real**, each with its own
465
+ reason recorded in the pull request: a citation count nothing rereads
466
+ (RP-82, `generator-neutrality.test.ts`), an exact skip-site count that
467
+ named the deleted benchmark files, and the project-count/ordering
468
+ assertions that named the deleted `benchmark` vitest project.
469
+ - **RP-110: the CI spawn-baseline diagnostic is removed** from the
470
+ `windows-smoke` job. It measured bare `node` startup, which stayed flat
471
+ across a red run and its green rerun while their wall clocks differed by
472
+ roughly half, so it read "healthy" on the run it was built to diagnose — a
473
+ diagnostic that argues against the correct conclusion is worse than none.
474
+ No replacement baseline was added, per the ticket's own accepted
475
+ resolution.
476
+
17
477
  ## 0.9.1
18
478
 
19
479
  **A patch, numbered by the owner.** Every entry corrects existing behaviour;
@@ -150,9 +610,8 @@ and the two template checks on Linux and `windows-smoke` (the CLI's unit
150
610
  project) on Windows; in `e2e.yml`, the Linux `e2e` job — the full suite with
151
611
  the e2e installs and the benchmark — when the pull request touches the CLI,
152
612
  the templates, the e2e harness or that workflow. The full suite on Windows
153
- runs in `e2e.yml` on master, nightly and by dispatch only, and a
154
- `runner_mode` switch there selects a self-hosted fallback that no pull
155
- request can reach (`docs/runners.md`).
613
+ runs in `e2e.yml` on master, nightly and by dispatch only
614
+ (`docs/runners.md`).
156
615
 
157
616
  ## 0.8.0
158
617