create-agent-rig 0.9.0 → 0.10.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 (237) hide show
  1. package/CHANGELOG.md +466 -3
  2. package/README.md +267 -299
  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 +151 -54
  7. package/packages/cli/dist/commands/integrations.js +468 -0
  8. package/packages/cli/dist/commands/memory.js +63 -4
  9. package/packages/cli/dist/commands/setup-wizard.js +61 -0
  10. package/packages/cli/dist/commands/uninstall.js +1223 -0
  11. package/packages/cli/dist/commands/upgrade.js +489 -89
  12. package/packages/cli/dist/index.js +657 -49
  13. package/packages/cli/dist/integrations/declaration.js +158 -0
  14. package/packages/cli/dist/integrations/doctor-guards.js +126 -0
  15. package/packages/cli/dist/integrations/doctor-workflow.js +25 -0
  16. package/packages/cli/dist/integrations/mcp-json.js +107 -0
  17. package/packages/cli/dist/integrations/memory-doctor.js +124 -0
  18. package/packages/cli/dist/integrations/registry.js +22 -0
  19. package/packages/cli/dist/integrations/spawn.js +228 -0
  20. package/packages/cli/dist/integrations/spec-kit.js +280 -0
  21. package/packages/cli/dist/integrations/verify.js +193 -0
  22. package/packages/cli/dist/integrations/windows-job.js +275 -0
  23. package/packages/cli/dist/lib/elevated-paths.js +74 -0
  24. package/packages/cli/dist/lib/install-set.js +1 -44
  25. package/packages/cli/dist/lib/manifest.js +86 -9
  26. package/packages/cli/dist/lib/prompts.js +0 -23
  27. package/packages/cli/dist/lib/safe-path.js +193 -2
  28. package/packages/cli/dist/lib/safe-text.js +78 -0
  29. package/packages/cli/dist/lib/substitute.js +1 -52
  30. package/packages/cli/dist/lib/summary.js +5 -5
  31. package/packages/cli/dist/templates.js +4 -14
  32. package/scripts/prepare.mjs +28 -12
  33. package/templates/agent-os/subagent-routing.json +4 -4
  34. package/templates/agent-os/universal/.agents/skills/check-premises/SKILL.md +13 -9
  35. package/templates/agent-os/universal/.agents/skills/loop/SKILL.md +31 -6
  36. package/templates/agent-os/universal/.agents/skills/new-invariant/SKILL.md +5 -5
  37. package/templates/agent-os/universal/.agents/skills/pr-ship/SKILL.md +1 -1
  38. package/templates/agent-os/universal/.agents/skills/worktree-task/SKILL.md +3 -3
  39. package/templates/agent-os/universal/.claude/agents/code-reviewer.md +8 -6
  40. package/templates/agent-os/universal/.claude/agents/implementation-agent.md +41 -0
  41. package/templates/agent-os/universal/.claude/agents/prose-reviewer.md +8 -4
  42. package/templates/agent-os/universal/.claude/agents/security-scanner.md +4 -2
  43. package/templates/agent-os/universal/.claude/agents/test-writer.md +2 -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 +47 -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/core.mjs +43 -0
  53. package/templates/agent-os/universal/.claude/scripts/queue/jira.mjs +18 -1
  54. package/templates/agent-os/universal/.claude/scripts/queue/state.mjs +2 -2
  55. package/templates/agent-os/universal/.claude/scripts/reconcile-external-prs.mjs +273 -35
  56. package/templates/agent-os/universal/.claude/scripts/revalidate.mjs +16 -0
  57. package/templates/agent-os/universal/.claude/settings.json +0 -8
  58. package/templates/agent-os/universal/.claude/skills/check-premises/SKILL.md +13 -9
  59. package/templates/agent-os/universal/.claude/skills/loop/SKILL.md +31 -6
  60. package/templates/agent-os/universal/.claude/skills/new-invariant/SKILL.md +5 -5
  61. package/templates/agent-os/universal/.claude/skills/pr-ship/SKILL.md +1 -1
  62. package/templates/agent-os/universal/.claude/skills/worktree-task/SKILL.md +3 -3
  63. package/templates/agent-os/universal/.codex/agents/code-reviewer.toml +2 -2
  64. package/templates/agent-os/universal/.codex/agents/implementation-agent.toml +6 -0
  65. package/templates/agent-os/universal/.codex/agents/prose-reviewer.toml +2 -2
  66. package/templates/agent-os/universal/.codex/agents/security-scanner.toml +1 -1
  67. package/templates/agent-os/universal/.codex/agents/test-writer.toml +1 -1
  68. package/templates/agent-os/universal/.codex/hooks.json +0 -10
  69. package/templates/agent-os/universal/AGENTS.md +208 -107
  70. package/templates/agent-os/universal/CLAUDE.md +15 -162
  71. package/templates/agent-os/universal/PLAN.md +17 -10
  72. package/templates/agent-os/universal/docs/decisions/agents-md-canonical.md +313 -0
  73. package/templates/agent-os/universal/docs/decisions/codex-adapter.md +15 -10
  74. package/templates/agent-os/universal/docs/decisions/review-lanes.md +12 -8
  75. package/templates/agent-os/universal/docs/decisions/session-start-wire-format.md +206 -0
  76. package/templates/agent-os/universal/docs/decisions/subagent-routing.md +6 -3
  77. package/templates/agent-os/universal/docs/decisions/workflow-layer-split.md +235 -0
  78. package/templates/agent-os/universal/layers.json +25 -30
  79. package/templates/hash-history.json +73 -24
  80. package/templates/release-ledger.json +3 -1
  81. package/packages/cli/dist/lib/composition.js +0 -20
  82. package/packages/cli/dist/lib/targets.js +0 -28
  83. package/packages/cli/dist/policy/benchmark/corpus.js +0 -165
  84. package/packages/cli/dist/policy/core/adapter.js +0 -18
  85. package/packages/cli/dist/policy/core/coverage.js +0 -253
  86. package/packages/cli/dist/policy/core/decision-record.js +0 -287
  87. package/packages/cli/dist/policy/core/declaration.js +0 -127
  88. package/packages/cli/dist/policy/core/evidence-matrix.js +0 -94
  89. package/packages/cli/dist/policy/core/probe.js +0 -442
  90. package/packages/cli/dist/policy/core/registry.js +0 -115
  91. package/packages/cli/dist/policy/core/validation.js +0 -275
  92. package/packages/cli/dist/policy/core/vocabulary.js +0 -123
  93. package/packages/cli/dist/policy/harness/claude.js +0 -47
  94. package/packages/cli/dist/policy/harness/codex.js +0 -87
  95. package/packages/cli/dist/policy/harness/index.js +0 -15
  96. package/packages/cli/dist/policy/harness/shared-hooks.js +0 -28
  97. package/packages/cli/dist/policy/index.js +0 -17
  98. package/templates/agent-os/init/AGENTS.md +0 -201
  99. package/templates/agent-os/init/CLAUDE.md +0 -201
  100. package/templates/agent-os/stack/aws-cdk/.agents/skills/post-deploy-verify/SKILL.md +0 -105
  101. package/templates/agent-os/stack/aws-cdk/.agents/skills/ro-debug/SKILL.md +0 -117
  102. package/templates/agent-os/stack/aws-cdk/.claude/agents/cdk-diff-reviewer.md +0 -89
  103. package/templates/agent-os/stack/aws-cdk/.claude/rules/aws-cdk.md +0 -105
  104. package/templates/agent-os/stack/aws-cdk/.claude/skills/post-deploy-verify/SKILL.md +0 -105
  105. package/templates/agent-os/stack/aws-cdk/.claude/skills/ro-debug/SKILL.md +0 -117
  106. package/templates/agent-os/stack/aws-cdk/.codex/agents/cdk-diff-reviewer.toml +0 -6
  107. package/templates/agent-os/stack/node-ts/.claude/hooks/dod-checks.json +0 -1
  108. package/templates/agent-os/stack/node-ts/.claude/rules/node-ts.md +0 -85
  109. package/templates/agent-os/universal/.claude/hooks/guard-core-purity.mjs +0 -89
  110. package/templates/agent-os/universal/.claude/hooks/guard-web-boundary.mjs +0 -68
  111. package/templates/agent-os/universal/.claude/rules/architecture.md +0 -81
  112. package/templates/skeleton/aws-serverless/.github/workflows/ci.yml +0 -28
  113. package/templates/skeleton/aws-serverless/.github/workflows/deploy.yml +0 -90
  114. package/templates/skeleton/aws-serverless/README.md +0 -181
  115. package/templates/skeleton/aws-serverless/apps/web/next.config.mjs +0 -17
  116. package/templates/skeleton/aws-serverless/apps/web/package.json +0 -19
  117. package/templates/skeleton/aws-serverless/apps/web/src/app/layout.tsx +0 -17
  118. package/templates/skeleton/aws-serverless/apps/web/src/app/page.tsx +0 -96
  119. package/templates/skeleton/aws-serverless/apps/web/src/lib/api.ts +0 -36
  120. package/templates/skeleton/aws-serverless/apps/web/src/lib/validate.ts +0 -23
  121. package/templates/skeleton/aws-serverless/apps/web/test/shared-validation.test.ts +0 -38
  122. package/templates/skeleton/aws-serverless/apps/web/tsconfig.json +0 -14
  123. package/templates/skeleton/aws-serverless/eslint.config.mjs +0 -20
  124. package/templates/skeleton/aws-serverless/gitignore +0 -56
  125. package/templates/skeleton/aws-serverless/infra/bin/app.ts +0 -79
  126. package/templates/skeleton/aws-serverless/infra/cdk.json +0 -3
  127. package/templates/skeleton/aws-serverless/infra/lib/app-stack.ts +0 -248
  128. package/templates/skeleton/aws-serverless/infra/lib/web-stack.ts +0 -45
  129. package/templates/skeleton/aws-serverless/infra/package.json +0 -18
  130. package/templates/skeleton/aws-serverless/infra/test/allowed-origins.test.ts +0 -301
  131. package/templates/skeleton/aws-serverless/infra/test/app-composition.test.ts +0 -137
  132. package/templates/skeleton/aws-serverless/infra/test/app-stack.test.ts +0 -120
  133. package/templates/skeleton/aws-serverless/infra/test/web-stack.test.ts +0 -44
  134. package/templates/skeleton/aws-serverless/package.json +0 -30
  135. package/templates/skeleton/aws-serverless/packages/core/package.json +0 -11
  136. package/templates/skeleton/aws-serverless/packages/core/src/events.ts +0 -14
  137. package/templates/skeleton/aws-serverless/packages/core/src/index.ts +0 -15
  138. package/templates/skeleton/aws-serverless/packages/core/src/note.ts +0 -69
  139. package/templates/skeleton/aws-serverless/packages/core/test/events.test.ts +0 -23
  140. package/templates/skeleton/aws-serverless/packages/core/test/note.test.ts +0 -101
  141. package/templates/skeleton/aws-serverless/packages/db/package.json +0 -14
  142. package/templates/skeleton/aws-serverless/packages/db/src/client.ts +0 -17
  143. package/templates/skeleton/aws-serverless/packages/db/src/index.ts +0 -2
  144. package/templates/skeleton/aws-serverless/packages/db/src/note-model.ts +0 -52
  145. package/templates/skeleton/aws-serverless/packages/db/test/note-model.test.ts +0 -91
  146. package/templates/skeleton/aws-serverless/packages/shared/package.json +0 -11
  147. package/templates/skeleton/aws-serverless/packages/shared/src/env.ts +0 -17
  148. package/templates/skeleton/aws-serverless/packages/shared/src/errors.ts +0 -33
  149. package/templates/skeleton/aws-serverless/packages/shared/src/index.ts +0 -3
  150. package/templates/skeleton/aws-serverless/packages/shared/src/logger.ts +0 -20
  151. package/templates/skeleton/aws-serverless/packages/shared/test/env.test.ts +0 -26
  152. package/templates/skeleton/aws-serverless/packages/shared/test/errors.test.ts +0 -28
  153. package/templates/skeleton/aws-serverless/packages/shared/test/logger.test.ts +0 -19
  154. package/templates/skeleton/aws-serverless/pnpm-lock.yaml +0 -2855
  155. package/templates/skeleton/aws-serverless/pnpm-workspace.yaml +0 -14
  156. package/templates/skeleton/aws-serverless/services/api/package.json +0 -15
  157. package/templates/skeleton/aws-serverless/services/api/src/adapters/sqs-publisher.ts +0 -26
  158. package/templates/skeleton/aws-serverless/services/api/src/handlers/create-note.ts +0 -69
  159. package/templates/skeleton/aws-serverless/services/api/src/handlers/list-notes.ts +0 -37
  160. package/templates/skeleton/aws-serverless/services/api/src/list-main.ts +0 -12
  161. package/templates/skeleton/aws-serverless/services/api/src/main.ts +0 -21
  162. package/templates/skeleton/aws-serverless/services/api/src/usecases/create-note.ts +0 -41
  163. package/templates/skeleton/aws-serverless/services/api/src/usecases/list-notes.ts +0 -14
  164. package/templates/skeleton/aws-serverless/services/api/test/create-note.handler.test.ts +0 -211
  165. package/templates/skeleton/aws-serverless/services/api/test/create-note.usecase.test.ts +0 -45
  166. package/templates/skeleton/aws-serverless/services/api/test/list-notes.test.ts +0 -122
  167. package/templates/skeleton/aws-serverless/services/api/test/sqs-publisher.test.ts +0 -22
  168. package/templates/skeleton/aws-serverless/services/worker/package.json +0 -12
  169. package/templates/skeleton/aws-serverless/services/worker/src/handlers/note-created.ts +0 -15
  170. package/templates/skeleton/aws-serverless/services/worker/src/main.ts +0 -7
  171. package/templates/skeleton/aws-serverless/services/worker/src/usecases/process-note-created.ts +0 -37
  172. package/templates/skeleton/aws-serverless/services/worker/test/note-created.test.ts +0 -61
  173. package/templates/skeleton/aws-serverless/tsconfig.base.json +0 -15
  174. package/templates/skeleton/aws-serverless/tsconfig.json +0 -16
  175. package/templates/skeleton/aws-serverless/vitest.config.ts +0 -14
  176. package/templates/skeleton/node-service/.github/workflows/ci.yml +0 -27
  177. package/templates/skeleton/node-service/.github/workflows/deploy.yml +0 -29
  178. package/templates/skeleton/node-service/README.md +0 -104
  179. package/templates/skeleton/node-service/apps/web/next.config.mjs +0 -17
  180. package/templates/skeleton/node-service/apps/web/package.json +0 -19
  181. package/templates/skeleton/node-service/apps/web/src/app/layout.tsx +0 -17
  182. package/templates/skeleton/node-service/apps/web/src/app/page.tsx +0 -96
  183. package/templates/skeleton/node-service/apps/web/src/lib/api.ts +0 -29
  184. package/templates/skeleton/node-service/apps/web/src/lib/validate.ts +0 -23
  185. package/templates/skeleton/node-service/apps/web/test/shared-validation.test.ts +0 -38
  186. package/templates/skeleton/node-service/apps/web/tsconfig.json +0 -14
  187. package/templates/skeleton/node-service/eslint.config.mjs +0 -20
  188. package/templates/skeleton/node-service/gitignore +0 -54
  189. package/templates/skeleton/node-service/package.json +0 -30
  190. package/templates/skeleton/node-service/packages/core/package.json +0 -11
  191. package/templates/skeleton/node-service/packages/core/src/events.ts +0 -14
  192. package/templates/skeleton/node-service/packages/core/src/index.ts +0 -15
  193. package/templates/skeleton/node-service/packages/core/src/note.ts +0 -69
  194. package/templates/skeleton/node-service/packages/core/test/events.test.ts +0 -23
  195. package/templates/skeleton/node-service/packages/core/test/note.test.ts +0 -101
  196. package/templates/skeleton/node-service/packages/db/package.json +0 -12
  197. package/templates/skeleton/node-service/packages/db/src/index.ts +0 -1
  198. package/templates/skeleton/node-service/packages/db/src/note-store.ts +0 -100
  199. package/templates/skeleton/node-service/packages/db/test/note-store.test.ts +0 -100
  200. package/templates/skeleton/node-service/packages/shared/package.json +0 -11
  201. package/templates/skeleton/node-service/packages/shared/src/env.ts +0 -17
  202. package/templates/skeleton/node-service/packages/shared/src/errors.ts +0 -33
  203. package/templates/skeleton/node-service/packages/shared/src/index.ts +0 -3
  204. package/templates/skeleton/node-service/packages/shared/src/logger.ts +0 -20
  205. package/templates/skeleton/node-service/packages/shared/test/env.test.ts +0 -26
  206. package/templates/skeleton/node-service/packages/shared/test/errors.test.ts +0 -28
  207. package/templates/skeleton/node-service/packages/shared/test/logger.test.ts +0 -19
  208. package/templates/skeleton/node-service/pnpm-lock.yaml +0 -2402
  209. package/templates/skeleton/node-service/pnpm-workspace.yaml +0 -13
  210. package/templates/skeleton/node-service/scripts/build-artifact.mjs +0 -34
  211. package/templates/skeleton/node-service/services/api/package.json +0 -17
  212. package/templates/skeleton/node-service/services/api/src/adapters/spool-publisher.ts +0 -23
  213. package/templates/skeleton/node-service/services/api/src/handlers/create-note.ts +0 -40
  214. package/templates/skeleton/node-service/services/api/src/handlers/list-notes.ts +0 -23
  215. package/templates/skeleton/node-service/services/api/src/main.ts +0 -40
  216. package/templates/skeleton/node-service/services/api/src/server.ts +0 -172
  217. package/templates/skeleton/node-service/services/api/src/static-dir.ts +0 -20
  218. package/templates/skeleton/node-service/services/api/src/usecases/create-note.ts +0 -30
  219. package/templates/skeleton/node-service/services/api/src/usecases/list-notes.ts +0 -14
  220. package/templates/skeleton/node-service/services/api/test/artifact.test.ts +0 -92
  221. package/templates/skeleton/node-service/services/api/test/create-note.handler.test.ts +0 -64
  222. package/templates/skeleton/node-service/services/api/test/create-note.usecase.test.ts +0 -43
  223. package/templates/skeleton/node-service/services/api/test/list-notes.test.ts +0 -48
  224. package/templates/skeleton/node-service/services/api/test/package-manager.test.ts +0 -40
  225. package/templates/skeleton/node-service/services/api/test/package-manager.ts +0 -51
  226. package/templates/skeleton/node-service/services/api/test/server.test.ts +0 -208
  227. package/templates/skeleton/node-service/services/api/test/spool-publisher.test.ts +0 -32
  228. package/templates/skeleton/node-service/services/api/test/static-dir.test.ts +0 -29
  229. package/templates/skeleton/node-service/services/worker/package.json +0 -16
  230. package/templates/skeleton/node-service/services/worker/src/main.ts +0 -28
  231. package/templates/skeleton/node-service/services/worker/src/spool.ts +0 -60
  232. package/templates/skeleton/node-service/services/worker/src/usecases/process-note-created.ts +0 -38
  233. package/templates/skeleton/node-service/services/worker/test/process-note-created.test.ts +0 -34
  234. package/templates/skeleton/node-service/services/worker/test/spool.test.ts +0 -76
  235. package/templates/skeleton/node-service/tsconfig.base.json +0 -15
  236. package/templates/skeleton/node-service/tsconfig.json +0 -13
  237. package/templates/skeleton/node-service/vitest.config.ts +0 -12
@@ -11,7 +11,9 @@
11
11
  "0.6.2",
12
12
  "0.7.0",
13
13
  "0.7.1",
14
- "0.8.0"
14
+ "0.8.0",
15
+ "0.9.0",
16
+ "0.9.1"
15
17
  ],
16
18
  "files": {
17
19
  ".agents/skills/check-premises/SKILL.md": {
@@ -29,7 +31,8 @@
29
31
  "57f6add0504db45e7577474f97705fe474310e4cd3310cdb348a2c64eabe88cd",
30
32
  "18f4300de4c4c7ea380d726fb109fa224da950ef0a4cea5015ab1d408b823be5",
31
33
  "0a1b6575f6df8139766c8e71ba7320e14d2a5a5ed8ab26b6b43f7a006153d37d",
32
- "a0d11ca1745095cc5b68777915161f16a6d1602c21f6d273f475d1d07c4b8546"
34
+ "a0d11ca1745095cc5b68777915161f16a6d1602c21f6d273f475d1d07c4b8546",
35
+ "b47bdf0d7a2f6c5b2034b8f6d683ad2b3c83bd65d15baf7de9b58cc4689d0ab1"
33
36
  ]
34
37
  },
35
38
  ".agents/skills/new-invariant/SKILL.md": {
@@ -83,7 +86,8 @@
83
86
  "hashes": [
84
87
  "2286fbc01c0342b9bac9909890876c079615db5b398e3499a0f2fddb1a334098",
85
88
  "4c6241da56060b44e77f9b5f7a8cde7d2923bd605b8b9bae70d00329784c35be",
86
- "03f87fbc976d8d65287b032ae3612511fc8f7e57772470b2282b660343fc32db"
89
+ "03f87fbc976d8d65287b032ae3612511fc8f7e57772470b2282b660343fc32db",
90
+ "5ec51bc08c9a934bfcbb2077fc7edce48c0e0cc3ed117d7dfc8a2895f2d9c01b"
87
91
  ]
88
92
  },
89
93
  ".claude/agents/code-reviewer.md": {
@@ -93,7 +97,8 @@
93
97
  "be3d2992d1f278dde46b555df1840b02f91403db1ec2fd4d489fb5efa940f019",
94
98
  "ec403373ef6bc0575d61c6ca11f82792817b272221fad8317ef6c45388b52628",
95
99
  "f125cfbce848cdaa91fd81e961808b4dbde452287959ec2cf10b905ee3ede789",
96
- "8ede9297480c889ec6d6caf8d076e7d69111fb472933dcf5a48b9a8425fe50c2"
100
+ "8ede9297480c889ec6d6caf8d076e7d69111fb472933dcf5a48b9a8425fe50c2",
101
+ "f12cb04871578eca3c9c36a1c2d60f5ae15a0e9094ecfc7c704c341756de4e3e"
97
102
  ]
98
103
  },
99
104
  ".claude/agents/prose-reviewer.md": {
@@ -102,7 +107,8 @@
102
107
  "8d5762849afd328fdc1aabf053ad207f2e306e013665e3ff934b06cbb1bbda38",
103
108
  "0e4307cd9cf8ef723d79e98b1af46a34c6912a6aa925e2179d939cb83c8f2a44",
104
109
  "7e8eaa2b4af9d65e1d10bf50c32c1d138fb2f8b9ba6e6d0880cade0524324d9d",
105
- "ed1c05d3938c0b4f277f1bf4af8641460def830569049ff0697c9bda14518b78"
110
+ "ed1c05d3938c0b4f277f1bf4af8641460def830569049ff0697c9bda14518b78",
111
+ "7aed3bfc955efc94bbeda3f866d25e2b253c88facaa2beed73939182a9f845b2"
106
112
  ]
107
113
  },
108
114
  ".claude/agents/security-scanner.md": {
@@ -110,13 +116,15 @@
110
116
  "hashes": [
111
117
  "43e5d59315483e369ad19f3070175f146e88deabd3a12dc09339ac4fac0f2aee",
112
118
  "e01467a38a0183be46ba45b05d44f663fbf4b139ceaecb91b5d096f3286a3fcd",
113
- "844e215af7d80bd85f62ca937c79bea59c8d8cd7c97353937ce62f7747eb9df7"
119
+ "844e215af7d80bd85f62ca937c79bea59c8d8cd7c97353937ce62f7747eb9df7",
120
+ "7c0bc189521955f2d126bac0ff97ab4fa252b05067692a5a3bb6cda232ddfaa3"
114
121
  ]
115
122
  },
116
123
  ".claude/agents/test-writer.md": {
117
124
  "since": "0.2.0",
118
125
  "hashes": [
119
- "333feef12383dea51791ae4923c44ba542438de793f0792fb51d96aa15b8b1b8"
126
+ "333feef12383dea51791ae4923c44ba542438de793f0792fb51d96aa15b8b1b8",
127
+ "fce976938fdd1154641e405a557b67161daa34cf84de9ad35fa14287d13b7f9c"
120
128
  ]
121
129
  },
122
130
  ".claude/hooks/block-no-verify.mjs": {
@@ -180,6 +188,12 @@
180
188
  "5bf2896ec5e5f94fab20b52cd22418a4392778b40744602a087e320eeca3f688"
181
189
  ]
182
190
  },
191
+ ".claude/hooks/guard-subagent-model.mjs": {
192
+ "since": "0.9.0",
193
+ "hashes": [
194
+ "345cbd5f43171adb01cd46ad485fb61299f7135c00ff4217765993551aca3b38"
195
+ ]
196
+ },
183
197
  ".claude/hooks/guard-web-boundary.mjs": {
184
198
  "since": "0.2.0",
185
199
  "hashes": [
@@ -202,7 +216,8 @@
202
216
  "hashes": [
203
217
  "4f836bc3ff75a868ffe035b179ac9e7dc1ad7715d520677ff9f6aa5bfdb200eb",
204
218
  "0c191d326a7bb0bbfc110e2210f44b4aa39276e8db3779aaa4545cffd4e11863",
205
- "572c671f8f2cad190fe2f144071954ac4d3b1357cab80a19bad584dd3b3768c8"
219
+ "572c671f8f2cad190fe2f144071954ac4d3b1357cab80a19bad584dd3b3768c8",
220
+ "6695698d2b38c79a12292601048dd0082a0cd18bf9e69c047d47679c2e6ecf67"
206
221
  ]
207
222
  },
208
223
  ".claude/hooks/lib/hook-input.mjs": {
@@ -212,6 +227,12 @@
212
227
  "3be3d4af4a25536d2a2bac0441a1370be7efafb5f8aa737b195bdce77db0091b"
213
228
  ]
214
229
  },
230
+ ".claude/hooks/warn-subagent-routing.mjs": {
231
+ "since": "0.9.0",
232
+ "hashes": [
233
+ "b95165243ebb60264c78b82ce01407669457fe33c0bf86ff2a5c117963c6bc6d"
234
+ ]
235
+ },
215
236
  ".claude/queue.json": {
216
237
  "since": "0.3.0",
217
238
  "hashes": [
@@ -267,7 +288,8 @@
267
288
  "hashes": [
268
289
  "dbe8025e10583e03fee5056e88aa6b73e4399453711d9156d82528a02d6e0402",
269
290
  "9e60d0300e856a9b3f81ab748bf2c0a9de27233ad0aa58a8c7141413fa0f3cae",
270
- "c8e9849a8fccd4e1e60b1ddc82937eb15aceb7f7c2afbd151b05e1bc966bfd2a"
291
+ "c8e9849a8fccd4e1e60b1ddc82937eb15aceb7f7c2afbd151b05e1bc966bfd2a",
292
+ "aa34a1eab572964b328ffa0044e96acb3e1c31491df0183460f06e5e6bba3b76"
271
293
  ]
272
294
  },
273
295
  ".claude/scripts/decision-router.mjs": {
@@ -352,7 +374,8 @@
352
374
  "ceb6d35fa028f9c5e5e2d5965c627095d5ba80c37191a584627b4bc645b6be15",
353
375
  "efa193dc543237d82dcb371fa1df6483ccd43c1db88d0e218f5d89769564974c",
354
376
  "bed44df40412a7edac96914de21edc796df604ddc275ff1a02764dfcc4d4ede7",
355
- "b3893c365de37ef6d9d04ab933296b9fcf09a0886197d7e12313fa63eacdbd89"
377
+ "b3893c365de37ef6d9d04ab933296b9fcf09a0886197d7e12313fa63eacdbd89",
378
+ "37eeb4bdb50d7f6b1427bd02ec9815f39ad9142f35691ffadd8c0b626c6cdb00"
356
379
  ]
357
380
  },
358
381
  ".claude/scripts/queue/as-of.mjs": {
@@ -375,13 +398,15 @@
375
398
  "d8a5916bae71efcc6a21978af713112c9ec33a7554fd07f5978bdf2c3633b560",
376
399
  "1804c2351a4f3042dc6a3fb4203f96e98ae12bec32569b99bda77d002d6ba5f2",
377
400
  "b81ae3181e02b9c1c3f0e954688490ab3db3961381c2dc397c47c651c9d07f88",
378
- "c9902da15d06de3e952352115db0288433520eae2caac1f70ee6e06753d1f444"
401
+ "c9902da15d06de3e952352115db0288433520eae2caac1f70ee6e06753d1f444",
402
+ "e31f9899d6edad127db7a2f43dafdfff2671c5c780209cccd3107e56b09c6042"
379
403
  ]
380
404
  },
381
405
  ".claude/scripts/queue/gate-rounds.mjs": {
382
406
  "since": "0.5.0",
383
407
  "hashes": [
384
- "7577674d5477cfc388594e4c301601e329d60741dfa0b2844be2cc94a3ab6283"
408
+ "7577674d5477cfc388594e4c301601e329d60741dfa0b2844be2cc94a3ab6283",
409
+ "deeb7a10772f906c7630bb3c295be1b61d7ebf0541b2a34debcb40c80e6d8f0e"
385
410
  ]
386
411
  },
387
412
  ".claude/scripts/queue/github-issues.mjs": {
@@ -401,7 +426,8 @@
401
426
  "7db3c17b781e6876b4822afd09e6affa97e46607b63d443975d987daf1f14464",
402
427
  "9edd70b5960f367958e8e7500150b4edd285c99869cca803e40e0537d2d347b0",
403
428
  "4cf917ac06708e1068dfe9f8bbebc9376c4748526bd669b9bea32929ba996d0a",
404
- "b4a0789be7ad4b401de872edb06665bca349048178b4dd6c5db848ca44f7c977"
429
+ "b4a0789be7ad4b401de872edb06665bca349048178b4dd6c5db848ca44f7c977",
430
+ "19a04cdbdfd936213cea3a9a00a583a060a4a8d0356d6a6922ae1c2f593f16f1"
405
431
  ]
406
432
  },
407
433
  ".claude/scripts/queue/jira.mjs": {
@@ -413,7 +439,8 @@
413
439
  "b8be5855809c0d44ece94858456098663296c17c5ad9abb1ea2cf1a8f48ca491",
414
440
  "3fc8ff9a06a2e22355a660a31e2943a97f50869f7e5726f768a7931d17b64b5b",
415
441
  "f44203af187e855b9f738f8dbedfd313abf9d6a5cc29182fb46cd58d70698d7a",
416
- "c2f2af8ac5eadd8d35a15bcdeffe585e32c6f99b4e6ab9ace0f9d7fd9d694943"
442
+ "c2f2af8ac5eadd8d35a15bcdeffe585e32c6f99b4e6ab9ace0f9d7fd9d694943",
443
+ "add45ea2bf2f96fbda0399afc1903bab75c251001f4d05fcbaa0b5958c8c1702"
417
444
  ]
418
445
  },
419
446
  ".claude/scripts/queue/plan-md.mjs": {
@@ -435,7 +462,8 @@
435
462
  ".claude/scripts/reconcile-external-prs.mjs": {
436
463
  "since": "0.3.0",
437
464
  "hashes": [
438
- "a326acd64ea19a50d093c91e711ad0234eb05c76d00066db5657c22f4355c190"
465
+ "a326acd64ea19a50d093c91e711ad0234eb05c76d00066db5657c22f4355c190",
466
+ "1b14ee0302932a40611011a57410d7f45d6c2d54799847b94f01f448de7c1827"
439
467
  ]
440
468
  },
441
469
  ".claude/scripts/revalidate.mjs": {
@@ -481,7 +509,8 @@
481
509
  "hashes": [
482
510
  "060b001927d8b471f1c1a8c8851fbb4266d3b2edd674cccbd6c16c44b57b91dd",
483
511
  "7721ee19fd1bcf6902be3d359def40742d79b88f5d83e7e3ca22ba45ca3211aa",
484
- "250292c9959916240bfc0fdf5987a864f6d54799de3d932dc6b85b776e62eaa9"
512
+ "250292c9959916240bfc0fdf5987a864f6d54799de3d932dc6b85b776e62eaa9",
513
+ "ad58b25f9ce30a1549b5047daa1e5b43c30352306aeceebacd638db86087e01f"
485
514
  ]
486
515
  },
487
516
  ".claude/scripts/verdict.mjs": {
@@ -498,7 +527,8 @@
498
527
  "55a6938b4d9967291a26e93301e34e5ffdef74a88f8c773a4d11b5d87d864fff",
499
528
  "713718fbb2cda132f05665b29b8f1108a6305729b5e7c789d2053d117c13e08e",
500
529
  "e588ab05bee707a099c80c9ea399008be31488e616f3db3c0598f66f3d1b3a52",
501
- "a180578d6e6de6a21900ff2f8a8ade2242170d16d2dd95574e5004435d870b9b"
530
+ "a180578d6e6de6a21900ff2f8a8ade2242170d16d2dd95574e5004435d870b9b",
531
+ "44695f83e445c7da3257556a3decc70e79ef46d19da394d4d5dd4c9268c0b429"
502
532
  ]
503
533
  },
504
534
  ".claude/skills/check-premises/SKILL.md": {
@@ -521,7 +551,8 @@
521
551
  "57f6add0504db45e7577474f97705fe474310e4cd3310cdb348a2c64eabe88cd",
522
552
  "18f4300de4c4c7ea380d726fb109fa224da950ef0a4cea5015ab1d408b823be5",
523
553
  "0a1b6575f6df8139766c8e71ba7320e14d2a5a5ed8ab26b6b43f7a006153d37d",
524
- "a0d11ca1745095cc5b68777915161f16a6d1602c21f6d273f475d1d07c4b8546"
554
+ "a0d11ca1745095cc5b68777915161f16a6d1602c21f6d273f475d1d07c4b8546",
555
+ "b47bdf0d7a2f6c5b2034b8f6d683ad2b3c83bd65d15baf7de9b58cc4689d0ab1"
525
556
  ]
526
557
  },
527
558
  ".claude/skills/new-invariant/SKILL.md": {
@@ -577,14 +608,16 @@
577
608
  "since": "0.5.0",
578
609
  "hashes": [
579
610
  "902dbace9532ec8e7a3c0cfd6ea0934227f087e345c0619923ec03512b26ba3e",
580
- "55778d7fb9f778a33213590cc0a2dcf8e01026a1a93eed1c0f811ba4f1070721"
611
+ "55778d7fb9f778a33213590cc0a2dcf8e01026a1a93eed1c0f811ba4f1070721",
612
+ "5fbbb1431833692d56cd0d15249f1d024e53bb0ab63349842910a9fc90547f6a"
581
613
  ]
582
614
  },
583
615
  ".codex/agents/code-reviewer.toml": {
584
616
  "since": "0.5.0",
585
617
  "hashes": [
586
618
  "e0e3475404c95402f33d77ebb14001e289d26bb429205a0a73bdcef99b4a62c7",
587
- "9ec92775791907f068d85ba58489236bd2bee69a8d769554ac530e8eadd5e374"
619
+ "9ec92775791907f068d85ba58489236bd2bee69a8d769554ac530e8eadd5e374",
620
+ "180c182cc909cc0b6c06cfa286f528f22b77189eee49cac067fdaaf2920f8bae"
588
621
  ]
589
622
  },
590
623
  ".codex/agents/prose-reviewer.toml": {
@@ -592,20 +625,29 @@
592
625
  "hashes": [
593
626
  "80b4631502d95c619ad060ce02cc8702b12574758ba7df8337ed63efa15d764d",
594
627
  "cfd516f72acdfd197c59ac3cbdd39d7b175976dbd3d9eef52825dfdc4f1e5b60",
595
- "8687eacf0ad707a4f887e0714e82fca23fd005fa9ec8824faedfe99ca46333e1"
628
+ "8687eacf0ad707a4f887e0714e82fca23fd005fa9ec8824faedfe99ca46333e1",
629
+ "7c37e4dbd94980bee16396d0d46d97c5079e295d3eed4b3ed8f98d701e57b10d"
596
630
  ]
597
631
  },
598
632
  ".codex/agents/security-scanner.toml": {
599
633
  "since": "0.5.0",
600
634
  "hashes": [
601
635
  "9ee408789f237a0b55aac6a2472682a08f8696e1d1ff4918ea72766ac8535499",
602
- "bc9aacca1ca3ed4ceac485f7cd1c6ff5a5405ac7be83419d6145499cc560ee91"
636
+ "bc9aacca1ca3ed4ceac485f7cd1c6ff5a5405ac7be83419d6145499cc560ee91",
637
+ "b529f02056948ff0ca179c96d9d47962c9c8064feccb68d3c970e7b1a2513fc9"
603
638
  ]
604
639
  },
605
640
  ".codex/agents/test-writer.toml": {
606
641
  "since": "0.5.0",
607
642
  "hashes": [
608
- "bb89d93f57d70885d98cfbe428caa524e9c00e1ce30da235ed3318c1ba3c9606"
643
+ "bb89d93f57d70885d98cfbe428caa524e9c00e1ce30da235ed3318c1ba3c9606",
644
+ "ec9e61b2c16c97ed26d5bdda2b0f715a41b80c0af549d0f2bbb96d6ca4c4d8d7"
645
+ ]
646
+ },
647
+ ".codex/config.toml": {
648
+ "since": "0.9.0",
649
+ "hashes": [
650
+ "c41e34ef5c3bb606852269adeaf5678ce172dc7a7937514ac879152bbddea7f2"
609
651
  ]
610
652
  },
611
653
  ".codex/hooks.json": {
@@ -659,7 +701,8 @@
659
701
  "since": "0.5.0",
660
702
  "hashes": [
661
703
  "30e55d866d9a2c7359e594181070c63b1974d9df36e000caf419229284303a2e",
662
- "ebf0ef61407944373c862d37e6a80d4965ece72304b931428c6b3fcc5d9527c4"
704
+ "ebf0ef61407944373c862d37e6a80d4965ece72304b931428c6b3fcc5d9527c4",
705
+ "46b68f9130d16a96278e03d0ddb14d99b678c5a239e4667aa79733e632e67505"
663
706
  ]
664
707
  },
665
708
  "docs/decisions/content-blind-revalidation.md": {
@@ -705,6 +748,12 @@
705
748
  "dc0c9f5988fc983eb5100a085e274691b1e88a3b54ab2797e00972c4d69d61c4"
706
749
  ]
707
750
  },
751
+ "docs/decisions/subagent-routing.md": {
752
+ "since": "0.9.0",
753
+ "hashes": [
754
+ "97bb882dd066a65a740780a836199ecef8887392c1ece02a92670ecf153988d3"
755
+ ]
756
+ },
708
757
  "docs/decisions/two-empty-endings.md": {
709
758
  "since": "0.5.0",
710
759
  "hashes": [
@@ -11,5 +11,7 @@
11
11
  "0.6.2": "2a1fc8e10cd2b65deb5c95d937fd7de39f2c92a2",
12
12
  "0.7.0": "6589db36e1daa63a99ec595191db1cccf7373196",
13
13
  "0.7.1": "52e879b6c103f6ba70493007b6a6466c57ea9824",
14
- "0.8.0": "870f9a3ecae2881908ece8ec3e2ac13f84f505f5"
14
+ "0.8.0": "870f9a3ecae2881908ece8ec3e2ac13f84f505f5",
15
+ "0.9.0": "c27f391e7395accaf09354f255a07e1b9e4710c1",
16
+ "0.9.1": "872f7f67f11761c17aad3cbbe26540862581795b"
15
17
  }
@@ -1,20 +0,0 @@
1
- /**
2
- * Layer-composition policy (PLAN phase 9): layers must claim disjoint paths.
3
- * A collision is refused, never resolved silently by copy order. Intended
4
- * overwrites — if one ever becomes necessary — are declared here, visibly,
5
- * not implied by ordering.
6
- */
7
- export const ALLOWED_OVERWRITES = new Set([]);
8
- export function detectCollisions(layers, allowed) {
9
- const claims = new Map();
10
- for (const layer of layers) {
11
- for (const file of layer.files) {
12
- const owners = claims.get(file) ?? [];
13
- owners.push(layer.name);
14
- claims.set(file, owners);
15
- }
16
- }
17
- return [...claims]
18
- .filter(([file, owners]) => owners.length > 1 && !allowed.has(file))
19
- .map(([file, owners]) => ({ path: file, layers: owners }));
20
- }
@@ -1,28 +0,0 @@
1
- export const TARGETS = {
2
- 'aws-serverless': {
3
- skeletonDir: 'aws-serverless',
4
- stacks: ['node-ts', 'aws-cdk'],
5
- defaultRegion: 'eu-central-1',
6
- },
7
- 'node-service': {
8
- skeletonDir: 'node-service',
9
- stacks: ['node-ts'],
10
- },
11
- };
12
- export const TARGET_NAMES = Object.keys(TARGETS);
13
- /**
14
- * The pre-selected entry in the interactive menu, and the API-level default.
15
- *
16
- * 🔴 **Not the fallback for a non-interactive run.** A run with no TTY and no
17
- * `--target` is *refused* (`index.ts`) — never prompt into a pipe, and never
18
- * guess a whole project shape for a script that did not say. This constant is
19
- * what `Enter`, an out-of-range number or an unrecognised name resolve to at the
20
- * prompt (`prompts.ts`), plus what `createProject` uses when called as a library
21
- * with no target.
22
- *
23
- * The comment this replaces said "one implicit target", which was stale from
24
- * when there was one. Its first correction claimed the CLI defaults silently in
25
- * CI — the opposite of what it does, in the file a maintainer would open to
26
- * check exactly that.
27
- */
28
- export const DEFAULT_TARGET = 'aws-serverless';
@@ -1,165 +0,0 @@
1
- import { CAPABILITY_STATES } from '../core/vocabulary.js';
2
- export const BENCHMARK_CLASSIFICATIONS = Object.freeze([
3
- 'equivalent',
4
- 'intentional-degradation',
5
- 'unsupported',
6
- ]);
7
- const MEASUREMENT_KINDS = Object.freeze([
8
- 'capability-probe',
9
- 'guard-enforcement',
10
- 'compatibility-rejection',
11
- ]);
12
- const REQUIRED_SCENARIO_IDS = [
13
- 'real-wiring',
14
- 'unwired-enforcement',
15
- 'disabled-enforcement',
16
- 'narrowed-enforcement',
17
- 'bypassed-enforcement',
18
- 'unreadable-input',
19
- 'hook-input',
20
- 'protected-rulebook',
21
- 'widening',
22
- 'foreign-major',
23
- ];
24
- const requiredScenarioIds = new Set(REQUIRED_SCENARIO_IDS);
25
- const scenario = (id, fixture, mutation, action, measurementKind, expectedStates) => Object.freeze({
26
- id,
27
- fixture,
28
- mutation,
29
- action,
30
- measurementKind,
31
- expectedStates: Object.freeze([...expectedStates]),
32
- });
33
- export const BENCHMARK_CORPUS = Object.freeze({
34
- contractMajor: 1,
35
- scenarios: Object.freeze([
36
- scenario('real-wiring', 'universal-rig', 'none', 'exercise protected write', 'capability-probe', ['SUPPORTED']),
37
- scenario('unwired-enforcement', 'universal-rig', 'remove hook registration', 'exercise protected write', 'capability-probe', ['UNSUPPORTED']),
38
- scenario('disabled-enforcement', 'universal-rig', 'disable all hooks', 'exercise protected write', 'capability-probe', ['UNSUPPORTED']),
39
- scenario('narrowed-enforcement', 'universal-rig', 'narrow matcher', 'exercise omitted protected write', 'capability-probe', ['DEGRADED']),
40
- scenario('bypassed-enforcement', 'universal-rig', 'bypass guard command', 'exercise protected write', 'capability-probe', ['INTEGRATION-FAILED']),
41
- scenario('unreadable-input', 'universal-rig', 'make snapshot unreadable', 'exercise protected write', 'capability-probe', ['INTEGRATION-FAILED']),
42
- scenario('hook-input', 'universal-rig', 'make tool_input unreadable', 'exercise protected write', 'guard-enforcement', ['SUPPORTED']),
43
- scenario('protected-rulebook', 'universal-rig', 'none', 'edit protected rulebook', 'guard-enforcement', ['SUPPORTED']),
44
- scenario('widening', 'universal-rig', 'widen authorization allow-list', 'attempt unauthorized widening', 'guard-enforcement', ['SUPPORTED']),
45
- scenario('foreign-major', 'contracts/session-messaging/v1/fixtures/negative/envelope-foreign-major.json', 'foreign schema major', 'check policy compatibility', 'compatibility-rejection', ['UNSUPPORTED']),
46
- ]),
47
- });
48
- const canonicalScenarios = new Map(BENCHMARK_CORPUS.scenarios.map((entry) => [entry.id, entry]));
49
- export const classifyCapability = (state) => {
50
- switch (state) {
51
- case 'SUPPORTED':
52
- return { classification: 'equivalent', integrationFailed: false };
53
- case 'DEGRADED':
54
- return { classification: 'intentional-degradation', integrationFailed: false };
55
- case 'UNSUPPORTED':
56
- return { classification: 'unsupported', integrationFailed: false };
57
- case 'INTEGRATION-FAILED':
58
- return { classification: 'unsupported', integrationFailed: true };
59
- default:
60
- throw new Error(`Unknown capability state: ${String(state)}`);
61
- }
62
- };
63
- const isOwnDataRecord = (value) => {
64
- if (typeof value !== 'object' || value === null || Array.isArray(value))
65
- return false;
66
- const prototype = Object.getPrototypeOf(value);
67
- if (prototype !== Object.prototype && prototype !== null)
68
- return false;
69
- return Object.values(Object.getOwnPropertyDescriptors(value)).every((descriptor) => descriptor.enumerable === true && 'value' in descriptor);
70
- };
71
- const isDataArray = (value) => {
72
- if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype)
73
- return false;
74
- for (let index = 0; index < value.length; index += 1) {
75
- const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
76
- if (descriptor === undefined || descriptor.enumerable !== true || !('value' in descriptor))
77
- return false;
78
- }
79
- return true;
80
- };
81
- const hasOnlyKeys = (value, keys) => {
82
- const actual = Object.keys(value);
83
- return actual.length === keys.length && keys.every((key) => Object.hasOwn(value, key));
84
- };
85
- const nonBlank = (value) => typeof value === 'string' && value.trim() !== '';
86
- const invalidCorpus = (reason) => {
87
- throw new Error(`Invalid benchmark corpus: ${reason}`);
88
- };
89
- export const parseBenchmarkCorpus = (input) => {
90
- if (!isOwnDataRecord(input) || !hasOnlyKeys(input, ['contractMajor', 'scenarios'])) {
91
- return invalidCorpus('must be a plain corpus with contractMajor and scenarios');
92
- }
93
- if (input.contractMajor !== 1)
94
- return invalidCorpus('unsupported contract major; expected 1');
95
- if (!isDataArray(input.scenarios))
96
- return invalidCorpus('scenarios must be a data array');
97
- if (input.scenarios.length !== REQUIRED_SCENARIO_IDS.length) {
98
- return invalidCorpus('must include every required scenario exactly once');
99
- }
100
- const ids = new Set();
101
- const scenarios = [];
102
- for (const value of input.scenarios) {
103
- if (!isOwnDataRecord(value) ||
104
- !hasOnlyKeys(value, [
105
- 'id',
106
- 'fixture',
107
- 'mutation',
108
- 'action',
109
- 'measurementKind',
110
- 'expectedStates',
111
- ])) {
112
- return invalidCorpus('each scenario must have only id, fixture, mutation, action, measurementKind, and expectedStates');
113
- }
114
- const { id, fixture, mutation, action, measurementKind, expectedStates } = value;
115
- if (!nonBlank(id) || !requiredScenarioIds.has(id))
116
- return invalidCorpus(`unknown scenario ${String(id)}`);
117
- if (ids.has(id))
118
- return invalidCorpus(`scenario ${id} is duplicated`);
119
- if (!nonBlank(fixture) || !nonBlank(mutation) || !nonBlank(action)) {
120
- return invalidCorpus(`scenario ${id} has empty metadata`);
121
- }
122
- if (typeof measurementKind !== 'string' ||
123
- !MEASUREMENT_KINDS.includes(measurementKind)) {
124
- return invalidCorpus(`scenario ${id} has an unknown measurement kind`);
125
- }
126
- if (!isDataArray(expectedStates) || expectedStates.length === 0) {
127
- return invalidCorpus(`scenario ${id} must name expected capability states`);
128
- }
129
- const states = new Set();
130
- for (const expectedState of expectedStates) {
131
- if (typeof expectedState !== 'string' ||
132
- !CAPABILITY_STATES.includes(expectedState)) {
133
- return invalidCorpus(`scenario ${id} has an unknown capability state`);
134
- }
135
- if (states.has(expectedState))
136
- return invalidCorpus(`scenario ${id} repeats a capability state`);
137
- states.add(expectedState);
138
- }
139
- const canonical = canonicalScenarios.get(id);
140
- if (fixture !== canonical.fixture ||
141
- mutation !== canonical.mutation ||
142
- action !== canonical.action ||
143
- measurementKind !== canonical.measurementKind) {
144
- return invalidCorpus(`scenario ${id} changes its canonical metadata`);
145
- }
146
- if (expectedStates.length !== canonical.expectedStates.length ||
147
- expectedStates.some((state, index) => state !== canonical.expectedStates[index])) {
148
- return invalidCorpus(`scenario ${id} changes its expected capability states`);
149
- }
150
- ids.add(id);
151
- scenarios.push(Object.freeze({
152
- id,
153
- fixture,
154
- mutation,
155
- action,
156
- measurementKind: measurementKind,
157
- expectedStates: Object.freeze([...states]),
158
- }));
159
- }
160
- for (const id of REQUIRED_SCENARIO_IDS) {
161
- if (!ids.has(id))
162
- return invalidCorpus(`required scenario ${id} is missing`);
163
- }
164
- return Object.freeze({ contractMajor: 1, scenarios: Object.freeze(scenarios) });
165
- };
@@ -1,18 +0,0 @@
1
- /**
2
- * The contract a harness adapter satisfies (RP-76).
3
- *
4
- * The core knows that a harness exists and has a hook-wiring surface; it does
5
- * not know any harness's name, event vocabulary, tool names or paths. Those
6
- * belong to the adapter, one module per harness under `../harness/`, and
7
- * adding a harness means adding one such module and registering it — pinned in
8
- * `test/template/policy-declaration.test.ts` under "adding a harness touches
9
- * adapters only", whose two tests name exactly the files that may mention each
10
- * harness. Their names carry the harness words this file may not, which is why
11
- * the describe is cited here rather than either test.
12
- *
13
- * An adapter is a mapping, not a compiler: given a declaration it names the
14
- * event, matcher and hook path the harness wires for it. The correspondence
15
- * between that answer and the snapshot the rig actually ships is a test, in
16
- * both directions, in the same file.
17
- */
18
- export {};