@event4u/agent-config 14.12.0 → 14.14.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 (521) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +118 -155
  5. package/CONTRIBUTING.md +38 -0
  6. package/CREDITS.md +135 -0
  7. package/NOTICE +13 -0
  8. package/README.md +8 -6
  9. package/dist/agent-src/commands/analyze/inbox.md +145 -2
  10. package/dist/agent-src/commands/feature/dev.md +7 -2
  11. package/dist/agent-src/commands/ghostwriter/write.md +5 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  14. package/dist/agent-src/commands/orchestrate.md +2 -2
  15. package/dist/agent-src/commands/post-as/me.md +5 -1
  16. package/dist/agent-src/commands/pr/merge.md +19 -6
  17. package/dist/agent-src/commands/roadmap/process-full.md +19 -5
  18. package/dist/agent-src/commands/tdd/red.md +12 -2
  19. package/dist/agent-src/commands/work.md +1 -1
  20. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
  21. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
  22. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
  23. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
  24. package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
  25. package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
  26. package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
  27. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  28. package/dist/agent-src/rules/broken-access-control.md +4 -0
  29. package/dist/agent-src/rules/code-comment-discipline.md +6 -0
  30. package/dist/agent-src/rules/code-provenance.md +4 -0
  31. package/dist/agent-src/rules/design-fidelity.md +1 -1
  32. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  33. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  34. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  35. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  36. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  37. package/dist/agent-src/rules/laravel-routing.md +1 -1
  38. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  39. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  40. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  41. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  42. package/dist/agent-src/rules/symfony-routing.md +1 -1
  43. package/dist/agent-src/rules/token-efficiency.md +14 -0
  44. package/dist/agent-src/rules/tool-safety.md +4 -0
  45. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  46. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
  47. package/dist/agent-src/scripts/guarded_baseline.ts +343 -0
  48. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  49. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  50. package/dist/agent-src/scripts/stubs_due.ts +516 -0
  51. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  52. package/dist/agent-src/scripts/update_roadmap_progress.ts +16 -12
  53. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  54. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  55. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  56. package/dist/agent-src/skills/database/SKILL.md +8 -0
  57. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  58. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  59. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  60. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  61. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  62. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  63. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  64. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  65. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  66. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  67. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  68. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  69. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  70. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  71. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  72. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  73. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  74. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  75. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  76. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  77. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  78. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  79. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  80. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  81. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  82. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  83. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  84. package/dist/agent-src/templates/roadmaps.md +97 -3
  85. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  86. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  87. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  88. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  93. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  94. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  95. package/dist/cli/commands/uiAudit.js +124 -5
  96. package/dist/cli/registry.js +2 -0
  97. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  98. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  99. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  100. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  101. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  102. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  103. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  104. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  105. package/dist/cli-delegate/cmd_conformance.js +80 -11
  106. package/dist/cli-delegate/cmd_doctor.js +3 -3
  107. package/dist/cli-delegate/cmd_export.js +3 -2
  108. package/dist/cli-delegate/cmd_fleet.js +2 -2
  109. package/dist/cli-delegate/cmd_handoff.js +1 -1
  110. package/dist/cli-delegate/cmd_preflight.js +2 -2
  111. package/dist/cli-delegate/cmd_prune.js +3 -2
  112. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  113. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  114. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  115. package/dist/cli-delegate/cmd_sync.js +3 -2
  116. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  117. package/dist/cli-delegate/cmd_validate.js +3 -2
  118. package/dist/discovery/deprecation-report.md +1 -1
  119. package/dist/discovery/discovery-manifest.json +58 -58
  120. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  121. package/dist/discovery/discovery-manifest.summary.md +1 -1
  122. package/dist/discovery/dormancy-report.md +1 -1
  123. package/dist/discovery/orphan-report.md +1 -1
  124. package/dist/discovery/packs.json +2 -2
  125. package/dist/discovery/trust-report.md +1 -1
  126. package/dist/discovery/workspaces.json +2 -2
  127. package/dist/hooks/dispatch.js +2900 -1049
  128. package/dist/install/claudeRuleRewrite.js +254 -0
  129. package/dist/install/detect.js +29 -16
  130. package/dist/install/detect_php_shape.js +159 -0
  131. package/dist/install/install.mjs +634 -428
  132. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  133. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  134. package/dist/mcp/registry-manifest.json +3 -3
  135. package/dist/mcp/server.json +3 -3
  136. package/dist/mcp/server.mjs +4895 -2627
  137. package/dist/server/schemas/settings.js +3 -0
  138. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  139. package/dist/ui/index.html +1 -1
  140. package/docs/MIGRATION.md +1 -1
  141. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  142. package/docs/contracts/provider-lifecycle.md +1 -1
  143. package/docs/contracts/settings-classes.md +10 -4
  144. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  145. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  146. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  147. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  148. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  149. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  150. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  151. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  152. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  153. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  154. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  155. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  156. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  157. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  158. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  159. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  160. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  161. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  162. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  163. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  164. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  165. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  166. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  167. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  168. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  169. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  170. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  171. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  172. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  173. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  174. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  175. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  176. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  177. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  178. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  179. package/docs/guidelines/augment-portability-patterns.md +6 -4
  180. package/docs/guidelines/code-clarity.md +18 -0
  181. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  182. package/docs/guidelines/cross-role-handoff.md +2 -2
  183. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  184. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  185. package/docs/guidelines/php/database.md +90 -7
  186. package/docs/guidelines/prompt-templates.md +7 -7
  187. package/llms.txt +2 -2
  188. package/package.json +5 -2
  189. package/src/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
  190. package/src/agent-src/scripts/guarded_baseline.ts +343 -0
  191. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  192. package/src/agent-src/scripts/stub_queue.ts +82 -0
  193. package/src/agent-src/scripts/stubs_due.ts +516 -0
  194. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  195. package/src/agent-src/scripts/update_roadmap_progress.ts +16 -12
  196. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  197. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  198. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  199. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  202. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  203. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  204. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  205. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  206. package/src/config/agent-settings.template.yml +32 -3
  207. package/src/config/assurance-capability-registry.json +21 -9
  208. package/src/config/canonical-terms.yml +119 -0
  209. package/src/config/capability-native-outcome-bars.json +81 -0
  210. package/src/config/ci-local-parity.yml +80 -0
  211. package/src/config/drafting-channels.yml +43 -0
  212. package/src/config/estate-count-budget.json +57 -36
  213. package/src/config/evaluator-budgets.json +14 -14
  214. package/src/config/gate-coverage.yml +729 -63
  215. package/src/config/gate-reachability-exemptions.json +21 -0
  216. package/src/config/gate-violation-baselines.json +42 -19
  217. package/src/config/harness-evolution-budget.json +25 -0
  218. package/src/config/lapsed-beta-baseline.json +96 -0
  219. package/src/config/memory-twin-verdicts.yml +129 -0
  220. package/src/config/metric-registry.yml +124 -0
  221. package/src/config/pack-size-budget.json +16 -15
  222. package/src/config/preamble-payload-budget.json +12 -4
  223. package/src/config/profiles/balanced.ini +27 -0
  224. package/src/config/profiles/full.ini +27 -0
  225. package/src/config/profiles/minimal.ini +27 -0
  226. package/src/config/publish-surface.json +9 -2
  227. package/src/config/routing-coverage-seed.json +16 -2
  228. package/src/config/rule-stub-ceilings.json +133 -112
  229. package/src/config/turnaround-budget.json +66 -0
  230. package/src/install/claudeRuleRewrite.ts +288 -0
  231. package/src/install/detect.ts +60 -17
  232. package/src/install/detect_php_shape.ts +191 -0
  233. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  234. package/src/scripts/_dispatch.bash +23 -0
  235. package/src/scripts/_lib/activation_ladder.ts +255 -0
  236. package/src/scripts/_lib/activation_receipt_producer.ts +341 -0
  237. package/src/scripts/_lib/activation_states.ts +88 -0
  238. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  239. package/src/scripts/_lib/adr_frontmatter.ts +26 -0
  240. package/src/scripts/_lib/arith_claims.ts +181 -0
  241. package/src/scripts/_lib/arm_ranking.ts +62 -0
  242. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  243. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  244. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  245. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  246. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  247. package/src/scripts/_lib/candidate_pair_delta.ts +349 -0
  248. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  249. package/src/scripts/_lib/candidate_record.ts +601 -0
  250. package/src/scripts/_lib/capture_rate.ts +319 -0
  251. package/src/scripts/_lib/carrier_status.ts +118 -0
  252. package/src/scripts/_lib/cascade_stage_enumeration.ts +92 -0
  253. package/src/scripts/_lib/collector_denominator.ts +771 -0
  254. package/src/scripts/_lib/collector_record.ts +340 -0
  255. package/src/scripts/_lib/collector_store.ts +664 -0
  256. package/src/scripts/_lib/collector_supervision.ts +827 -0
  257. package/src/scripts/_lib/concern_estate.ts +77 -0
  258. package/src/scripts/_lib/config_chain.ts +477 -0
  259. package/src/scripts/_lib/config_cost.ts +209 -0
  260. package/src/scripts/_lib/corpus_manifest.ts +726 -0
  261. package/src/scripts/_lib/council_settings_block.ts +6 -0
  262. package/src/scripts/_lib/curator_ops.ts +172 -0
  263. package/src/scripts/_lib/delivery_arm_experiment.ts +282 -0
  264. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  265. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  266. package/src/scripts/_lib/empty_cycles.ts +88 -0
  267. package/src/scripts/_lib/estate_carrier_cases.ts +72 -0
  268. package/src/scripts/_lib/eval_publication.ts +354 -0
  269. package/src/scripts/_lib/evaluation_cascade.ts +452 -0
  270. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  271. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  272. package/src/scripts/_lib/evidence_basis.ts +118 -0
  273. package/src/scripts/_lib/evolution_roi.ts +562 -0
  274. package/src/scripts/_lib/exec_evidence.ts +8 -0
  275. package/src/scripts/_lib/experience_card.ts +272 -0
  276. package/src/scripts/_lib/experience_report.ts +151 -0
  277. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  278. package/src/scripts/_lib/generated_by.ts +66 -0
  279. package/src/scripts/_lib/harness_evolution_guards.ts +239 -0
  280. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  281. package/src/scripts/_lib/host_denominator.ts +687 -0
  282. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  283. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  284. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  285. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  286. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  287. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  288. package/src/scripts/_lib/lexical_shortlist.ts +215 -0
  289. package/src/scripts/_lib/llm_candidate_proposer.ts +461 -0
  290. package/src/scripts/_lib/llm_proposer_transport.ts +153 -0
  291. package/src/scripts/_lib/loop_guards.ts +299 -0
  292. package/src/scripts/_lib/loss_class.ts +129 -0
  293. package/src/scripts/_lib/machine_wake.ts +51 -0
  294. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  295. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  296. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  297. package/src/scripts/_lib/orchestration_record.ts +253 -5
  298. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  299. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  300. package/src/scripts/_lib/paired_stats.ts +245 -0
  301. package/src/scripts/_lib/paired_verdict.ts +226 -0
  302. package/src/scripts/_lib/pathology_archive.ts +393 -0
  303. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  304. package/src/scripts/_lib/privacy_class.ts +47 -0
  305. package/src/scripts/_lib/promotion_capability.ts +315 -0
  306. package/src/scripts/_lib/promotion_evidence.ts +414 -0
  307. package/src/scripts/_lib/promotion_review.ts +294 -0
  308. package/src/scripts/_lib/prompt_shape.ts +92 -0
  309. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  310. package/src/scripts/_lib/release_highlights.ts +70 -1
  311. package/src/scripts/_lib/release_material.ts +125 -2
  312. package/src/scripts/_lib/repeated_failure.ts +105 -0
  313. package/src/scripts/_lib/repo_root.ts +111 -0
  314. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  315. package/src/scripts/_lib/role_split.ts +338 -0
  316. package/src/scripts/_lib/routing_corpus.ts +307 -0
  317. package/src/scripts/_lib/routing_index_input.ts +104 -0
  318. package/src/scripts/_lib/rule_injection.ts +22 -1
  319. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  320. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  321. package/src/scripts/_lib/semantic_noop.ts +167 -0
  322. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  323. package/src/scripts/_lib/source_digest.ts +200 -0
  324. package/src/scripts/_lib/source_redact.ts +260 -0
  325. package/src/scripts/_lib/source_shape.ts +502 -0
  326. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  327. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  328. package/src/scripts/_lib/strip_comments.mjs +65 -0
  329. package/src/scripts/_lib/test_red_state.ts +154 -0
  330. package/src/scripts/_lib/trigger_shift.ts +144 -0
  331. package/src/scripts/_lib/untrusted_content.ts +82 -7
  332. package/src/scripts/activation_receipt.ts +258 -0
  333. package/src/scripts/adoption_report.ts +1 -1
  334. package/src/scripts/adr/evidence_census.ts +1 -1
  335. package/src/scripts/adr/regenerate_index.ts +26 -2
  336. package/src/scripts/adr_cite_check.ts +164 -1
  337. package/src/scripts/ai_council/blind_review.ts +11 -1
  338. package/src/scripts/ai_council/clients.ts +4 -0
  339. package/src/scripts/ai_council/config.ts +3 -0
  340. package/src/scripts/ai_council/consensus.ts +28 -8
  341. package/src/scripts/ai_council/consensus_round.ts +226 -0
  342. package/src/scripts/ai_council/cross_exam.ts +128 -0
  343. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  344. package/src/scripts/ai_council/explain_route.ts +157 -0
  345. package/src/scripts/ai_council/information_gain.ts +293 -0
  346. package/src/scripts/ai_council/inline_findings.ts +340 -0
  347. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  348. package/src/scripts/ai_council/leakage_corpus.ts +385 -0
  349. package/src/scripts/ai_council/leakage_patterns.ts +453 -0
  350. package/src/scripts/ai_council/minority_retention.ts +171 -0
  351. package/src/scripts/ai_council/orchestrator.ts +16 -203
  352. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  353. package/src/scripts/ai_council/pricing.ts +106 -0
  354. package/src/scripts/ai_council/prompts.ts +74 -7
  355. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  356. package/src/scripts/ai_council/py_format.ts +14 -3
  357. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  358. package/src/scripts/ai_council/recouncil_savings.ts +299 -0
  359. package/src/scripts/ai_council/replay_route.ts +223 -0
  360. package/src/scripts/ai_council/response_record.ts +50 -0
  361. package/src/scripts/ai_council/reviewer_assignment.ts +279 -0
  362. package/src/scripts/ai_council/routing_training_row.ts +197 -0
  363. package/src/scripts/ai_council/synthesis_strategy.ts +159 -0
  364. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  365. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  366. package/src/scripts/asset_delivery_ledger.ts +157 -0
  367. package/src/scripts/attest_artifact.ts +193 -0
  368. package/src/scripts/audit_auto_rules.ts +2 -1
  369. package/src/scripts/audit_command_surface.ts +1 -1
  370. package/src/scripts/audit_mcp_tools.ts +2 -2
  371. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  372. package/src/scripts/audit_user_type_axis.ts +2 -1
  373. package/src/scripts/bench_ab_clone.ts +215 -10
  374. package/src/scripts/bench_ab_integrity.ts +119 -5
  375. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  376. package/src/scripts/build_archive_index.ts +1 -1
  377. package/src/scripts/build_linear_digest.ts +1 -1
  378. package/src/scripts/build_proof.ts +11 -4
  379. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  380. package/src/scripts/build_source_digests.ts +157 -0
  381. package/src/scripts/cache_realization_report.ts +103 -0
  382. package/src/scripts/check_adr_frontmatter.ts +131 -10
  383. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  384. package/src/scripts/check_beta_review_markers.ts +235 -6
  385. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  386. package/src/scripts/check_claims.ts +576 -6
  387. package/src/scripts/check_composite_arming.ts +35 -0
  388. package/src/scripts/check_concern_admissions.ts +365 -0
  389. package/src/scripts/check_enforcement_coverage.ts +28 -0
  390. package/src/scripts/check_estate_count.ts +347 -25
  391. package/src/scripts/check_gate_reachability.ts +383 -0
  392. package/src/scripts/check_host_loadability.ts +104 -0
  393. package/src/scripts/check_loss_class_declared.ts +308 -0
  394. package/src/scripts/check_md_language.ts +15 -98
  395. package/src/scripts/check_memory_proposal.ts +18 -11
  396. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  397. package/src/scripts/check_no_external_sources.ts +281 -6
  398. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  399. package/src/scripts/check_pack_size.ts +59 -2
  400. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  401. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  402. package/src/scripts/check_publish_surface.ts +10 -1
  403. package/src/scripts/check_references.ts +24 -1
  404. package/src/scripts/check_release_highlights.ts +96 -13
  405. package/src/scripts/check_roadmap_trackable.ts +17 -2
  406. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  407. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  408. package/src/scripts/check_score_contract.ts +26 -3
  409. package/src/scripts/check_static_parity.ts +285 -0
  410. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  411. package/src/scripts/check_suppression_hygiene.ts +15 -0
  412. package/src/scripts/ci_settle.ts +39 -2
  413. package/src/scripts/code_graph/build.ts +60 -3
  414. package/src/scripts/code_graph/extract.ts +44 -0
  415. package/src/scripts/code_graph/types.ts +24 -0
  416. package/src/scripts/collector_daemon.ts +714 -0
  417. package/src/scripts/config_cost_report.ts +302 -0
  418. package/src/scripts/consumer_matrix.ts +74 -1
  419. package/src/scripts/corpus_manifest.ts +235 -0
  420. package/src/scripts/cost/budget.mjs +10 -3
  421. package/src/scripts/cost/track.mjs +10 -3
  422. package/src/scripts/council_cli.ts +37 -54
  423. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  424. package/src/scripts/evolution_lab.ts +1153 -0
  425. package/src/scripts/external_sources_denylist.json +5 -18
  426. package/src/scripts/extract_audit_patterns.ts +21 -0
  427. package/src/scripts/fold_intake.ts +12 -1
  428. package/src/scripts/gen_discovery_baseline.ts +1 -1
  429. package/src/scripts/generate_capabilities_index.ts +12 -5
  430. package/src/scripts/generate_capability_matrix.ts +3 -3
  431. package/src/scripts/generate_command_flows.ts +2 -2
  432. package/src/scripts/generate_cookbook.ts +2 -2
  433. package/src/scripts/generate_index.ts +8 -1
  434. package/src/scripts/generate_knowledge_index.ts +2 -1
  435. package/src/scripts/generate_ownership_matrix.ts +2 -1
  436. package/src/scripts/generate_pack_manifests.ts +10 -2
  437. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  438. package/src/scripts/generate_settings_reference.ts +1 -1
  439. package/src/scripts/git_authorization_hook.ts +22 -1
  440. package/src/scripts/grade_target_readiness.ts +48 -5
  441. package/src/scripts/hook_effect_doctor.ts +261 -0
  442. package/src/scripts/hook_manifest.json +1 -1
  443. package/src/scripts/hook_manifest.yaml +125 -16
  444. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  445. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  446. package/src/scripts/hooks/comment_discipline_hook.ts +146 -0
  447. package/src/scripts/hooks/concern_registry.ts +6 -0
  448. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  449. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  450. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  451. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  452. package/src/scripts/hooks/shims/install.sh +61 -0
  453. package/src/scripts/hooks/shims/php +101 -0
  454. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  455. package/src/scripts/hooks/turn_end_gate_hook.ts +9 -1
  456. package/src/scripts/hot_context_hook.ts +16 -0
  457. package/src/scripts/install-hooks.sh +20 -5
  458. package/src/scripts/install.ts +17 -35
  459. package/src/scripts/inventory_frontmatter.ts +2 -1
  460. package/src/scripts/language_mirror_hook.ts +14 -2
  461. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  462. package/src/scripts/lint_canonical_terms.ts +604 -0
  463. package/src/scripts/lint_carrier_integrity.ts +820 -0
  464. package/src/scripts/lint_code_comments.ts +643 -0
  465. package/src/scripts/lint_composition_review.ts +619 -0
  466. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  467. package/src/scripts/lint_eval_specs.ts +593 -0
  468. package/src/scripts/lint_hook_manifest.ts +19 -0
  469. package/src/scripts/lint_host_portability.ts +373 -0
  470. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  471. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  472. package/src/scripts/lint_metric_consumers.ts +355 -0
  473. package/src/scripts/lint_plan_risk_register.ts +39 -19
  474. package/src/scripts/lint_promotion_paths.ts +779 -0
  475. package/src/scripts/lint_skill_descriptions.ts +18 -1
  476. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  477. package/src/scripts/lint_skill_link_reach.ts +252 -0
  478. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  479. package/src/scripts/lint_ticket_buildable.ts +17 -1
  480. package/src/scripts/llm_propose.ts +256 -0
  481. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  482. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  483. package/src/scripts/measure_delivery_sets.ts +361 -0
  484. package/src/scripts/measure_docs_dead_links.ts +348 -0
  485. package/src/scripts/measure_host_capture.ts +461 -0
  486. package/src/scripts/measure_routing_signal.ts +307 -0
  487. package/src/scripts/migration_status.ts +3 -3
  488. package/src/scripts/model_rule_injection.ts +76 -0
  489. package/src/scripts/orchestration_record.ts +14 -0
  490. package/src/scripts/preamble_byte_census.ts +139 -10
  491. package/src/scripts/prepack-check.mjs +4 -1
  492. package/src/scripts/probe_council_retention.ts +495 -0
  493. package/src/scripts/probe_turnaround.ts +384 -0
  494. package/src/scripts/probe_unblocked_ask.ts +279 -0
  495. package/src/scripts/release.ts +21 -37
  496. package/src/scripts/release_drill.ts +143 -0
  497. package/src/scripts/release_env.ts +35 -0
  498. package/src/scripts/release_publication.ts +84 -0
  499. package/src/scripts/render_benchmark_md.ts +1 -1
  500. package/src/scripts/rule_activation_census.ts +70 -9
  501. package/src/scripts/rule_backlinks.ts +1 -1
  502. package/src/scripts/run_lifecycle_suite.ts +208 -0
  503. package/src/scripts/run_skill_evals.ts +40 -0
  504. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  505. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  506. package/src/scripts/schemas/evals.schema.json +24 -1
  507. package/src/scripts/schemas/rule.schema.json +52 -1
  508. package/src/scripts/schemas/skill.schema.json +17 -2
  509. package/src/scripts/skill_overlap.ts +7 -1
  510. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  511. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  512. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  513. package/src/scripts/skill_usage_report.ts +2 -1
  514. package/src/scripts/stubs_due.ts +211 -0
  515. package/src/scripts/sweep_source_surfaces.ts +678 -0
  516. package/src/scripts/sync_pr_branch.ts +3 -3
  517. package/src/scripts/trigger_eval_grandfather.json +202 -222
  518. package/src/scripts/utilization_report.ts +22 -2
  519. package/src/server/schemas/settings.ts +5 -0
  520. package/src/templates/marketing-copy.yml +1 -1
  521. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -0,0 +1,258 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * `activation_receipt` — observe how far a shipped artefact climbed the
4
+ * activation ladder, and append the receipt to the audit ledger.
5
+ *
6
+ * `road-to-governed-evidence-production` step 1.1's PRODUCTION CALLER. The
7
+ * producer library (`_lib/activation_receipt_producer.ts`) holds the discipline;
8
+ * this file holds the three real observations and the write. It exists because
9
+ * a library nothing calls has no coverage — the same defect the roadmap kept
10
+ * open on `assertCheapestFirst`. **Corrected 2026-09-01:** that one is now half
11
+ * closed. `assertCheapestFirst` has two production callers in
12
+ * `_lib/llm_candidate_proposer.ts` (`:417`, `:446`), so it no longer polices a
13
+ * population of zero; what it still does not police is a SPENT population,
14
+ * which is what AC-3 stays open on.
15
+ *
16
+ * ## What it observes, and from where
17
+ *
18
+ * | Rung | Source | What is read |
19
+ * |---|---|---|
20
+ * | `eligible` | `source-tree` | the authored artefact under `src/` |
21
+ * | `selected` | `discovery-manifest` | `dist/discovery/discovery-manifest.json`, `install.default` |
22
+ * | `projected` | `host-projection` | the host tree under `.claude/` |
23
+ *
24
+ * `delivered`, `visible` and `adhered` have no admitted source and are therefore
25
+ * ABSENT from every receipt this writes — which the ladder reads as `unknown`
26
+ * and keeps out of every rate's denominator. That is the honest state of
27
+ * coverage today, not a placeholder to be filled with a guess.
28
+ *
29
+ * ## Costs and boundaries
30
+ *
31
+ * Zero model calls, no network, no subprocess: three `statSync` calls and one
32
+ * JSON read. Admissible under the `metered-backend-park` blocker, which forbids
33
+ * a live model harness rather than a filesystem read. Claims:
34
+ * `docs/contracts/activation-receipt-trust-boundary.md`.
35
+ */
36
+ import * as fs from 'node:fs';
37
+ import * as path from 'node:path';
38
+ import * as crypto from 'node:crypto';
39
+ import { fileURLToPath } from 'node:url';
40
+
41
+ import {
42
+ appendActivationLine,
43
+ buildActivationLine,
44
+ buildActivationReceipt,
45
+ observeProjection,
46
+ observeSelection,
47
+ observeSourceTree,
48
+ type RungObservation,
49
+ } from './_lib/activation_receipt_producer.js';
50
+ import { LADDER_RUNGS, firstStall, type ActivationReceipt } from './_lib/activation_ladder.js';
51
+
52
+ const _HERE = fileURLToPath(import.meta.url);
53
+ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
54
+
55
+ export const EXIT_OK = 0;
56
+ export const EXIT_USAGE = 2;
57
+
58
+ const USAGE = `usage: activation_receipt --rule <id> | --skill <id> [options]
59
+
60
+ --rule ID a rule artefact, e.g. commit-policy
61
+ --skill ID a skill artefact, e.g. code-review
62
+ --host DIR host projection root (default: .claude)
63
+ --root DIR repository root (default: this checkout)
64
+ --dry-run observe and print; do NOT append to the audit ledger
65
+
66
+ Observes the eligible / selected / projected rungs and appends one
67
+ audit-log-v1 line carrying an \`activation\` object. Zero model calls.
68
+ `;
69
+
70
+ /** Where the artefact lives, per kind, in each of the two trees. */
71
+ interface ArtefactPaths {
72
+ readonly id: string;
73
+ readonly sourceRel: string;
74
+ readonly hostRel: string;
75
+ }
76
+
77
+ export function artefactPaths(kind: 'rule' | 'skill', id: string): ArtefactPaths {
78
+ return kind === 'rule'
79
+ ? { id, sourceRel: path.join('rules', `${id}.md`), hostRel: path.join('rules', `${id}.md`) }
80
+ : {
81
+ id,
82
+ sourceRel: path.join('skills', id, 'SKILL.md'),
83
+ hostRel: path.join('skills', id, 'SKILL.md'),
84
+ };
85
+ }
86
+
87
+ /**
88
+ * The ids the discovery manifest admits into the DEFAULT install.
89
+ *
90
+ * Returns an EMPTY set when the manifest is missing or unreadable, and
91
+ * `observeSelection` reads an empty set as "no manifest" rather than as "the
92
+ * manifest selected nothing" — the absent/negative split again, at the one place
93
+ * a build artefact can legitimately be missing.
94
+ */
95
+ export function selectedIdsFromManifest(manifestPath: string): Set<string> {
96
+ let doc: unknown;
97
+ try {
98
+ doc = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
99
+ } catch {
100
+ return new Set();
101
+ }
102
+ const artefacts = (doc as { artefacts?: unknown }).artefacts;
103
+ if (!Array.isArray(artefacts)) return new Set();
104
+ const out = new Set<string>();
105
+ for (const a of artefacts) {
106
+ const rec = a as { path?: unknown; install?: { default?: unknown } };
107
+ if (typeof rec.path !== 'string') continue;
108
+ if (rec.install?.default !== true) continue;
109
+ out.add(artefactIdFromPath(rec.path));
110
+ }
111
+ return out;
112
+ }
113
+
114
+ /**
115
+ * The artefact id a manifest path names.
116
+ *
117
+ * `src/rules/commit-policy.md` -> `commit-policy`;
118
+ * `src/skills/code-review/SKILL.md` -> `code-review`. Any other path yields its
119
+ * basename without extension, which is not an id anything will match — a
120
+ * deliberate non-match rather than a guess.
121
+ */
122
+ export function artefactIdFromPath(p: string): string {
123
+ const parts = p.split('/');
124
+ const last = parts[parts.length - 1] ?? '';
125
+ if (last === 'SKILL.md') return parts[parts.length - 2] ?? '';
126
+ return last.replace(/\.md$/, '');
127
+ }
128
+
129
+ export interface ObserveResult {
130
+ readonly receipt: ActivationReceipt | null;
131
+ readonly errors: readonly string[];
132
+ readonly observations: readonly RungObservation[];
133
+ }
134
+
135
+ /** The three observations, in ladder order. Pure apart from the reads. */
136
+ export function observeArtefact(
137
+ root: string,
138
+ hostRoot: string,
139
+ kind: 'rule' | 'skill',
140
+ id: string,
141
+ ): ObserveResult {
142
+ const p = artefactPaths(kind, id);
143
+ const observations: RungObservation[] = [];
144
+ const eligible = observeSourceTree(path.join(root, 'src'), p.sourceRel);
145
+ if (eligible !== undefined) observations.push(eligible);
146
+ const selected = observeSelection(
147
+ selectedIdsFromManifest(path.join(root, 'dist', 'discovery', 'discovery-manifest.json')),
148
+ id,
149
+ );
150
+ if (selected !== undefined) observations.push(selected);
151
+ const projected = observeProjection(hostRoot, p.hostRel);
152
+ if (projected !== undefined) observations.push(projected);
153
+
154
+ const { receipt, errors } = buildActivationReceipt(id, observations);
155
+ return { receipt, errors, observations };
156
+ }
157
+
158
+ interface Flags {
159
+ kind?: 'rule' | 'skill';
160
+ id?: string;
161
+ host?: string;
162
+ root?: string;
163
+ dryRun: boolean;
164
+ }
165
+
166
+ function parse(argv: readonly string[]): Flags | string {
167
+ const f: Flags = { dryRun: false };
168
+ for (let i = 0; i < argv.length; i += 1) {
169
+ const a = argv[i];
170
+ if (a === '--dry-run') {
171
+ f.dryRun = true;
172
+ continue;
173
+ }
174
+ const v = argv[i + 1];
175
+ if (v === undefined || v.startsWith('--')) return `${a} requires a value`;
176
+ i += 1;
177
+ if (a === '--rule') {
178
+ f.kind = 'rule';
179
+ f.id = v;
180
+ } else if (a === '--skill') {
181
+ f.kind = 'skill';
182
+ f.id = v;
183
+ } else if (a === '--host') {
184
+ f.host = v;
185
+ } else if (a === '--root') {
186
+ f.root = v;
187
+ } else {
188
+ return `unknown option '${a}'`;
189
+ }
190
+ }
191
+ return f;
192
+ }
193
+
194
+ export function main(argv?: string[]): number {
195
+ const args = argv ?? process.argv.slice(2);
196
+ if (args.length === 0 || args.includes('-h') || args.includes('--help')) {
197
+ process.stdout.write(USAGE);
198
+ return args.length === 0 ? EXIT_USAGE : EXIT_OK;
199
+ }
200
+ const parsed = parse(args);
201
+ if (typeof parsed === 'string') {
202
+ process.stderr.write(`activation_receipt: error: ${parsed}\n${USAGE}`);
203
+ return EXIT_USAGE;
204
+ }
205
+ if (parsed.kind === undefined || parsed.id === undefined || parsed.id === '') {
206
+ process.stderr.write(`activation_receipt: error: one of --rule or --skill is required\n${USAGE}`);
207
+ return EXIT_USAGE;
208
+ }
209
+ const root = parsed.root ?? REPO_ROOT;
210
+ const hostRoot = parsed.host ?? path.join(root, '.claude');
211
+
212
+ const { receipt, errors } = observeArtefact(root, hostRoot, parsed.kind, parsed.id);
213
+ if (receipt === null) {
214
+ for (const e of errors) process.stderr.write(`activation_receipt: refused — ${e}\n`);
215
+ return 1;
216
+ }
217
+
218
+ const stall = firstStall(receipt);
219
+ const observedCount = Object.keys(receipt.rungs).length;
220
+ process.stdout.write(
221
+ `activation_receipt · ${receipt.artefact} · observed ${observedCount}/${LADDER_RUNGS.length} rung(s) · ` +
222
+ (stall === null
223
+ ? 'climbed every observed rung · family=none\n'
224
+ : `stalled at ${stall.stage} · family=${stall.family}\n`),
225
+ );
226
+
227
+ const ts = new Date().toISOString();
228
+ const { line, errors: lineErrors } = buildActivationLine({
229
+ artefact: receipt.artefact,
230
+ rungs: receipt.rungs,
231
+ ts,
232
+ id: crypto.randomUUID(),
233
+ });
234
+ if (line === null) {
235
+ for (const e of lineErrors) process.stderr.write(`activation_receipt: refused — ${e}\n`);
236
+ return 1;
237
+ }
238
+ if (parsed.dryRun) {
239
+ process.stdout.write(`${JSON.stringify(line)}\n`);
240
+ return EXIT_OK;
241
+ }
242
+ const file = appendActivationLine(root, line, ts);
243
+ process.stdout.write(`activation_receipt · appended to ${path.relative(root, file)}\n`);
244
+ return EXIT_OK;
245
+ }
246
+
247
+ function _isCliEntry(): boolean {
248
+ try {
249
+ if (process.argv[1] === undefined) return false;
250
+ return fs.realpathSync(_HERE) === fs.realpathSync(path.resolve(process.argv[1]));
251
+ } catch {
252
+ return false;
253
+ }
254
+ }
255
+
256
+ if (_isCliEntry()) {
257
+ process.exit(main());
258
+ }
@@ -259,7 +259,7 @@ function _pyTruthy(v: Json): boolean {
259
259
  export function render_report(rows: JsonObject[], weeks: number): string {
260
260
  let header =
261
261
  '# Adoption report — rolling trend\n\n' +
262
- '> Generated by `scripts/adoption_report.py` from ' +
262
+ '> Generated by `adoption_report`. Do not edit. From ' +
263
263
  '`agents/runtime/metrics/adoption-snapshots.jsonl`.\n' +
264
264
  `> Window: rolling ${weeks} weeks. Source contract: ` +
265
265
  '`docs/contracts/adoption-signal-floor.md`.\n\n';
@@ -700,7 +700,7 @@ export function renderArtifact(result: CensusResult): string {
700
700
  L.push('# ADR evidence census — proposed provenance and evidence grades');
701
701
  L.push('');
702
702
  L.push(
703
- `Generated by \`src/scripts/adr/evidence_census.ts\`. Records examined: **${String(result.scanned)}** ` +
703
+ `Generated by \`evidence_census\`. Records examined: **${String(result.scanned)}** ` +
704
704
  `(${String(result.records.filter((r) => r.surface === 'flat').length)} flat, ` +
705
705
  `${String(result.records.filter((r) => r.surface === 'area').length)} per-area).`,
706
706
  );
@@ -17,6 +17,7 @@ import * as path from 'node:path';
17
17
  import process from 'node:process';
18
18
  import { fileURLToPath, pathToFileURL } from 'node:url';
19
19
  import { readAdrAxisCells, readAdrFrontmatterScalars } from '../_lib/adr_frontmatter.js';
20
+ import { generatedByItalic } from '../_lib/generated_by.js';
20
21
 
21
22
  // ^ADR-(\d{3})-([a-z0-9-]+)\.md$
22
23
  const NAMED = /^ADR-(\d{3})-([a-z0-9-]+)\.md$/;
@@ -171,6 +172,28 @@ export function scan(d: string): [Row[], Row[], string[]] {
171
172
  return [num, leg, errs];
172
173
  }
173
174
 
175
+ /**
176
+ * A supersession cell: the refs, plus the partial-supersession scope in
177
+ * parentheses when the record declares one.
178
+ *
179
+ * The scope used to live INSIDE the ref value — `superseded_by: ADR-124
180
+ * (engine-adoption interpretation only)` — which put prose inside a
181
+ * comma-separated ref list and forced every reader to strip parentheses before
182
+ * resolving a number. `adr-layout` moved it to a sibling `*_scope` field. This
183
+ * helper is why that move costs the reader nothing: the rendered cell is
184
+ * unchanged, so a partial supersession is still visible at a glance, while the
185
+ * SOURCE stays parseable without a regex.
186
+ *
187
+ * A scope with no refs renders as `—`: a qualifier on nothing is not a
188
+ * supersession, and printing the prose alone would read as one.
189
+ */
190
+ export function supersessionCell(refs: string | undefined, scope: string | undefined): string {
191
+ const r = (refs ?? '').trim();
192
+ if (r === '' || r === '—') return '—';
193
+ const s = (scope ?? '').trim();
194
+ return s === '' || s === '—' ? r : `${r} (${s})`;
195
+ }
196
+
174
197
  /** Mirror `row(r)`. */
175
198
  export function row(r: Row): string {
176
199
  const decision = r.decision ?? r.slug ?? '—';
@@ -179,7 +202,8 @@ export function row(r: Row): string {
179
202
  return (
180
203
  `| [${label}](${r.path}) | ${title} | ${r.status ?? '—'} ` +
181
204
  `| ${r.date ?? '—'} | ${r.provenance_kind ?? '—'} | ${r.evidence_grade ?? '—'} ` +
182
- `| ${r.supersedes ?? '—'} | ${r.superseded_by ?? '—'} ` +
205
+ `| ${supersessionCell(r.supersedes, r.supersedes_scope)} ` +
206
+ `| ${supersessionCell(r.superseded_by, r.superseded_scope)} ` +
183
207
  `| ${r.amended_by ?? '—'} |`
184
208
  );
185
209
  }
@@ -243,7 +267,7 @@ export function render(num: Row[], leg: Row[], outside: OutsideRow[] = []): stri
243
267
  const out = [
244
268
  '# ADR Index',
245
269
  '',
246
- '_Auto-generated by `src/scripts/adr/regenerate_index.ts`. Do not edit._',
270
+ generatedByItalic('regenerate_index'),
247
271
  '',
248
272
  ];
249
273
  if (num.length === 0 && leg.length === 0 && outside.length === 0) {
@@ -503,6 +503,20 @@ export function verdict_for(r: Omit<CiteResult, 'verdict'>): string {
503
503
  const by = r.superseded_by !== undefined && r.superseded_by !== '—' ? ` (by ${r.superseded_by})` : '';
504
504
  return `NOT A LIVE LOCK — status is \`${status}\`${by}. Citing it as a blocker is a stale-state claim.`;
505
505
  }
506
+ if (status === 'challenged') {
507
+ // Reported DISTINCTLY from `accepted` and from `superseded`, and it is a
508
+ // LIVE lock. `challenged` records "accepted, and under active question";
509
+ // it names no successor and suspends nothing. If citing it cleared the
510
+ // lock, the status would become a way to stop obeying a decision without
511
+ // reopening it — road-to-decision-conformance 1.2 names that as the
512
+ // failure to prevent, and this branch is where it would have happened.
513
+ return (
514
+ 'LIVE, CHALLENGED — the decision is under active question and STILL BINDS. ' +
515
+ 'A challenge is not a successor: nothing has replaced this record. Read the ' +
516
+ 'challenge, then either satisfy it or route the reopening — do not treat the ' +
517
+ 'status as permission to act against the decision.'
518
+ );
519
+ }
506
520
  if (status === 'rejected') {
507
521
  return (
508
522
  'LIVE — status `rejected` records a REJECTED PROPOSAL, so the rejection is the ' +
@@ -793,18 +807,167 @@ export function selfTest(): number {
793
807
  }
794
808
  }
795
809
 
810
+ /**
811
+ * One row per ADR — the corpus survey `road-to-decision-conformance` Phase 2
812
+ * asks for. Distinct from `--cited`, which resolves every ADR *citation* and
813
+ * answers "does this reference land"; this answers "what state is the corpus
814
+ * in", which is a different denominator (186 records vs the citations that
815
+ * happen to name them).
816
+ */
817
+ export interface CorpusRow {
818
+ ref: string;
819
+ file: string;
820
+ status: string;
821
+ /** `superseded_by` when present, else `—`. */
822
+ successor: string;
823
+ /** Does the record carry a `review_trigger` at all? */
824
+ has_trigger: boolean;
825
+ /** Only meaningful when `has_trigger`; see `TRIGGER_VERDICTS`. */
826
+ trigger: 'fired' | 'not-fired' | 'indeterminate' | 'none';
827
+ reopen_policy: string;
828
+ /** Cited anywhere OUTSIDE `docs/decisions/`. */
829
+ cited_outside: boolean;
830
+ }
831
+
832
+ /**
833
+ * The three states 2.2 requires, and why a fourth exists beside them.
834
+ *
835
+ * `none` is NOT one of the three. The step asks that fired + not-fired +
836
+ * indeterminate sum to "the number of ADRs carrying a trigger", so a record
837
+ * with no trigger is outside the denominator rather than a fourth bucket
838
+ * inside it.
839
+ */
840
+ export const TRIGGER_VERDICTS = ['fired', 'not-fired', 'indeterminate'] as const;
841
+
842
+ /** Every ADR file, surveyed. */
843
+ export function corpus_survey(repo_root: string = REPO_ROOT): CorpusRow[] {
844
+ const files = adr_files(repo_root);
845
+ const cited_outside = new Set<string>();
846
+ for (const root of CITATION_ROOTS) {
847
+ for (const file of walk_citable(path.join(repo_root, root))) {
848
+ const rel = path.relative(repo_root, file);
849
+ if (rel.startsWith(path.join('docs', 'decisions'))) continue;
850
+ for (const m of fs.readFileSync(file, 'utf-8').matchAll(CITATION_RE)) {
851
+ const parsed = normalise_ref(m[0]);
852
+ if (parsed !== null) cited_outside.add(parsed.id);
853
+ }
854
+ }
855
+ }
856
+ const rows: CorpusRow[] = [];
857
+ for (const f of files) {
858
+ const text = fs.readFileSync(f, 'utf-8');
859
+ const fm = parse_frontmatter(text) ?? {};
860
+ const base = path.basename(f);
861
+ // Key on the SAME identity the citation side produces, via
862
+ // `normalise_ref`. Deriving it with a private regex here is how the two
863
+ // halves of a join silently stop matching.
864
+ const parsedSelf = normalise_ref(path.relative(repo_root, f));
865
+ const num = parsedSelf?.id ?? base;
866
+ const raw_trigger = (fm['review_trigger'] ?? '').trim();
867
+ rows.push({
868
+ ref: num,
869
+ file: path.relative(repo_root, f),
870
+ status: (fm['status'] ?? '(none)').trim(),
871
+ successor: (fm['superseded_by'] ?? '—').trim() || '—',
872
+ has_trigger: raw_trigger !== '' && raw_trigger.toLowerCase() !== 'unclassified',
873
+ trigger: trigger_state(fm),
874
+ reopen_policy: (fm['reopen_policy'] ?? 'unclassified').trim() || 'unclassified',
875
+ cited_outside: cited_outside.has(num),
876
+ });
877
+ }
878
+ return rows.sort((a, b) => a.ref.localeCompare(b.ref));
879
+ }
880
+
881
+ export interface CorpusSummary {
882
+ total: number;
883
+ by_status: Record<string, number>;
884
+ with_trigger: number;
885
+ trigger_counts: Record<string, number>;
886
+ accepted: number;
887
+ accepted_cited_outside: number;
888
+ uncited_pct: number;
889
+ reopen_policy_declared: number;
890
+ }
891
+
892
+ export function corpus_summary(rows: readonly CorpusRow[]): CorpusSummary {
893
+ const by_status: Record<string, number> = {};
894
+ for (const r of rows) by_status[r.status] = (by_status[r.status] ?? 0) + 1;
895
+ const with_trigger = rows.filter((r) => r.has_trigger).length;
896
+ const trigger_counts: Record<string, number> = { fired: 0, 'not-fired': 0, indeterminate: 0 };
897
+ for (const r of rows) {
898
+ if (!r.has_trigger) continue;
899
+ trigger_counts[r.trigger] = (trigger_counts[r.trigger] ?? 0) + 1;
900
+ }
901
+ const accepted = rows.filter((r) => r.status.toLowerCase() === 'accepted');
902
+ const cited = accepted.filter((r) => r.cited_outside).length;
903
+ return {
904
+ total: rows.length,
905
+ by_status,
906
+ with_trigger,
907
+ trigger_counts,
908
+ accepted: accepted.length,
909
+ accepted_cited_outside: cited,
910
+ uncited_pct: accepted.length === 0 ? 0 : ((accepted.length - cited) * 100) / accepted.length,
911
+ reopen_policy_declared: rows.filter((r) => r.reopen_policy !== 'unclassified').length,
912
+ };
913
+ }
914
+
915
+ function render_corpus(rows: readonly CorpusRow[], sum: CorpusSummary): string {
916
+ const out: string[] = [];
917
+ out.push(`adr corpus survey · ${String(sum.total)} decision record(s)\n`);
918
+ out.push(' status:');
919
+ for (const [k, v] of Object.entries(sum.by_status).sort()) {
920
+ out.push(` ${k.padEnd(14)} ${String(v)}`);
921
+ }
922
+ out.push('');
923
+ out.push(` review_trigger — ${String(sum.with_trigger)} record(s) carry one:`);
924
+ for (const k of TRIGGER_VERDICTS) {
925
+ out.push(` ${k.padEnd(14)} ${String(sum.trigger_counts[k] ?? 0)}`);
926
+ }
927
+ const triSum = TRIGGER_VERDICTS.reduce((a, k) => a + (sum.trigger_counts[k] ?? 0), 0);
928
+ out.push(
929
+ ` ${'sum'.padEnd(14)} ${String(triSum)}` +
930
+ (triSum === sum.with_trigger ? ' ✅ equals the carrying count' : ' ❌ DOES NOT equal the carrying count'),
931
+ );
932
+ out.push('');
933
+ out.push(
934
+ ` citation reach — ${String(sum.accepted_cited_outside)} of ${String(sum.accepted)} accepted ` +
935
+ `ADR(s) are cited outside docs/decisions/ (${sum.uncited_pct.toFixed(1)} % uncited)`,
936
+ );
937
+ out.push(
938
+ ` reopen_policy — ${String(sum.reopen_policy_declared)} of ${String(sum.total)} declare one; ` +
939
+ 'the rest resolve to `unclassified`',
940
+ );
941
+ out.push('');
942
+ out.push(' Reports only. This command decides nothing and gates nothing.');
943
+ return out.join('\n') + '\n';
944
+ }
945
+
796
946
  function main(argv: string[]): number {
797
947
  const as_json = argv.includes('--json');
798
948
  if (argv.includes('--self-test')) return selfTest();
799
949
  const corpus_mode = argv.includes('--cited');
950
+ const survey_mode = argv.includes('--all');
951
+ if (survey_mode) {
952
+ const root = scan_root();
953
+ const rows = corpus_survey(root);
954
+ const sum = corpus_summary(rows);
955
+ process.stdout.write(
956
+ as_json ? `${JSON.stringify({ summary: sum, rows }, null, 2)}\n` : render_corpus(rows, sum),
957
+ );
958
+ return 0;
959
+ }
800
960
  const explicit = argv.filter((a) => !a.startsWith('--'));
801
961
  if (!corpus_mode && explicit.length === 0) {
802
962
  process.stderr.write(
803
963
  'usage: adr_cite_check <ADR-NNN> [ADR-NNN …] [--json]\n' +
804
964
  ' adr_cite_check --cited [--json]\n' +
965
+ ' adr_cite_check --all [--json]\n' +
805
966
  ' evaluate a decision before citing it as a reason not to act\n' +
806
967
  ' --cited: resolve every ADR citation in ' +
807
- `${CITATION_ROOTS.join(', ')} (the CI gate)\n`,
968
+ `${CITATION_ROOTS.join(', ')} (the CI gate)\n` +
969
+ ' --all: one row per decision record — status, successor, trigger\n' +
970
+ ' state, reopen_policy, citation reach. Reports only.\n',
808
971
  );
809
972
  return 2;
810
973
  }
@@ -31,7 +31,17 @@ type Dict = Record<string, unknown>;
31
31
 
32
32
  // ── deterministic seeding (sha256 of the question text — no Math.random, no Date) ──
33
33
 
34
- function _sha256_hex(s: string): string {
34
+ /**
35
+ * `sha256(s)` as lowercase hex.
36
+ *
37
+ * EXPORTED since 2026-08-30 rather than copied: the re-council guard
38
+ * (`recouncil_guard.ts`) needs the question hash, and
39
+ * road-to-inbox-harvest-2026-08-e-council-topology-evidence 1A.1 requires it to
40
+ * reuse THE EXISTING one — "no second hash implementation". Two hashes of one
41
+ * question are two answers to "is this the same question", and the second one
42
+ * is the one nobody updates.
43
+ */
44
+ export function _sha256_hex(s: string): string {
35
45
  return createHash('sha256').update(s, 'utf-8').digest('hex');
36
46
  }
37
47
 
@@ -269,6 +269,8 @@ export class CouncilResponse {
269
269
  // persisted response JSON stay backward-compatible.
270
270
  model_served: string;
271
271
  text: string;
272
+ /** Pre-rewrite reply; `null` when nothing rewrote `text`. See inline_findings.ts. */
273
+ raw_text: string | null;
272
274
  input_tokens: number;
273
275
  output_tokens: number;
274
276
  // Prompt-cache accounting (Anthropic). `cache_read_input_tokens` bill at
@@ -286,6 +288,7 @@ export class CouncilResponse {
286
288
  model: string;
287
289
  model_served?: string;
288
290
  text: string;
291
+ raw_text?: string | null;
289
292
  input_tokens?: number;
290
293
  output_tokens?: number;
291
294
  cache_creation_input_tokens?: number;
@@ -298,6 +301,7 @@ export class CouncilResponse {
298
301
  this.model = opts.model;
299
302
  this.model_served = opts.model_served ?? '';
300
303
  this.text = opts.text;
304
+ this.raw_text = opts.raw_text ?? null;
301
305
  this.input_tokens = opts.input_tokens ?? 0;
302
306
  this.output_tokens = opts.output_tokens ?? 0;
303
307
  this.cache_creation_input_tokens = opts.cache_creation_input_tokens ?? 0;
@@ -359,6 +359,8 @@ export interface ConsensusScoringConfig {
359
359
  readonly strong_threshold: number;
360
360
  readonly minority_threshold: number;
361
361
  readonly lenses: readonly string[];
362
+ /** Phase 1B — see `inline_findings.ts`. Default `false` until 1B.4's gate is met. */
363
+ readonly inline_findings: boolean;
362
364
  }
363
365
 
364
366
  const _VALID_NECESSITY_MODES: ReadonlySet<string> = new Set([
@@ -1462,6 +1464,7 @@ function _build_consensus_scoring(d: Dict): ConsensusScoringConfig {
1462
1464
  strong_threshold: strong,
1463
1465
  minority_threshold: minority,
1464
1466
  lenses: lenses_raw as string[],
1467
+ inline_findings: Boolean(_pyTruthy(_get(d, 'inline_findings', false))),
1465
1468
  };
1466
1469
  }
1467
1470
 
@@ -34,9 +34,9 @@ import { pyRound } from '../_lib/value_ladder.js';
34
34
  // Python: re.compile(r"```(?:json)?\s*(\[.*?\])\s*```", re.DOTALL)
35
35
  // re.DOTALL → 's'. Python regex is not global; a fresh RegExp per call avoids
36
36
  // lastIndex carryover, and we use .exec() (first match) below.
37
- const _JSON_BLOCK_SRC = '```(?:json)?\\s*(\\[[\\s\\S]*?\\])\\s*```';
37
+ export const _JSON_BLOCK_SRC = '```(?:json)?\\s*(\\[[\\s\\S]*?\\])\\s*```';
38
38
  // Python: re.compile(r"(\[\s*\{.*?\}\s*\])", re.DOTALL)
39
- const _BARE_ARRAY_SRC = '(\\[\\s*\\{[\\s\\S]*?\\}\\s*\\])';
39
+ export const _BARE_ARRAY_SRC = '(\\[\\s*\\{[\\s\\S]*?\\}\\s*\\])';
40
40
 
41
41
  // Defaults mirror the roadmap (Phase 4 Step 4). The .agent-settings.yml
42
42
  // block overrides them at run time.
@@ -302,6 +302,22 @@ export type FindingsParseOutcome = 'parsed' | 'empty' | 'parse_failed';
302
302
  export interface FindingsExtraction {
303
303
  readonly findings: Finding[];
304
304
  readonly outcome: FindingsParseOutcome;
305
+ /**
306
+ * How many array items the parse SAW, before `_collect_findings` skipped the
307
+ * ones missing `id` or `text`.
308
+ *
309
+ * `outcome: 'parsed'` alone says only "this was a syntactically valid JSON
310
+ * array". A caller deciding whether the array is a member's own findings
311
+ * BLOCK — as opposed to some other JSON the member happened to quote —
312
+ * needs to know whether every item survived. Added 2026-08-30 after a
313
+ * completion review found the inline-findings short-circuit reading
314
+ * `'parsed'` as "this is a findings block" and silently deleting quoted
315
+ * evidence from the text peer review reads.
316
+ *
317
+ * 0 for `empty` and `parse_failed`, and 0 for the bare-`[]` branch, whose
318
+ * item count genuinely is zero.
319
+ */
320
+ readonly item_count: number;
305
321
  }
306
322
 
307
323
  /**
@@ -317,7 +333,7 @@ export function parse_findings_outcome(
317
333
  ): FindingsExtraction {
318
334
  const source = opts.source;
319
335
  if (text.trim() === '') {
320
- return { findings: [], outcome: 'empty' };
336
+ return { findings: [], outcome: 'empty', item_count: 0 };
321
337
  }
322
338
  const array = _extract_json_array(text);
323
339
  if (!array) {
@@ -335,20 +351,24 @@ export function parse_findings_outcome(
335
351
  // `parse_findings_response` and `parse_scores_response` accept, which is a
336
352
  // behaviour change this step did not ask for.
337
353
  if (/(^|[\s`])\[\s*\](\s|`|$)/.test(text)) {
338
- return { findings: [], outcome: 'parsed' };
354
+ return { findings: [], outcome: 'parsed', item_count: 0 };
339
355
  }
340
- return { findings: [], outcome: 'parse_failed' };
356
+ return { findings: [], outcome: 'parse_failed', item_count: 0 };
341
357
  }
342
358
  let parsed: unknown;
343
359
  try {
344
360
  parsed = JSON.parse(array);
345
361
  } catch {
346
- return { findings: [], outcome: 'parse_failed' };
362
+ return { findings: [], outcome: 'parse_failed', item_count: 0 };
347
363
  }
348
364
  if (!Array.isArray(parsed)) {
349
- return { findings: [], outcome: 'parse_failed' };
365
+ return { findings: [], outcome: 'parse_failed', item_count: 0 };
350
366
  }
351
- return { findings: _collect_findings(parsed, source), outcome: 'parsed' };
367
+ return {
368
+ findings: _collect_findings(parsed, source),
369
+ outcome: 'parsed',
370
+ item_count: parsed.length,
371
+ };
352
372
  }
353
373
 
354
374
  export function parse_findings_response(