@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,341 @@
1
+ /**
2
+ * The activation-receipt producer — independent, append-only, zero model calls.
3
+ *
4
+ * `road-to-governed-evidence-production` step 1.1. The receipt SCHEMA
5
+ * ({@link ActivationReceipt}) and the CLASSIFIER ({@link classifyFailure}) both
6
+ * predate this module and are NOT reimplemented here; what was missing was a
7
+ * producer, so nothing ever wrote an `activation` object into an audit line and
8
+ * the receipt-bearing cascade stages had no subject.
9
+ *
10
+ * ## The claims this module is written against
11
+ *
12
+ * Stated once, in `docs/contracts/activation-receipt-trust-boundary.md`, and
13
+ * CITED here rather than restated — step 1.3's verify clause asks for exactly
14
+ * that split, and a second copy of a falsifiable claim is a second thing to
15
+ * keep true.
16
+ *
17
+ * | Claim | Where it binds in this file |
18
+ * |---|---|
19
+ * | TB-1 (no evaluation input decides a STATE) | the import list: no cascade, record, vector or verdict module appears |
20
+ * | TB-2 (an unobserved rung is absent) | {@link buildActivationReceipt} writes only the rungs it was given |
21
+ * | TB-3 (every state names an admitted source) | {@link EVIDENCE_SOURCES} + the refusal in {@link buildActivationReceipt} |
22
+ * | TB-4 (append, never rewrite) | {@link appendActivationLine} opens with `appendFileSync` and mints a fresh `id` |
23
+ * | EC-1 (zero model calls) | no transport import, no spawn, no key read — asserted by this module's test |
24
+ * | EC-3 (a missing observation is never bought) | {@link observeProjection} returns absence and does not retry |
25
+ *
26
+ * ## What is observable today, and what is not
27
+ *
28
+ * Three sources are admitted and all three ship an observer. `adhered` has no
29
+ * admitted source, so this producer CANNOT emit that rung and a real receipt
30
+ * reads `unknown` there. That is a coverage fact recorded rather than papered
31
+ * over: admitting a fourth source with no observer behind it would describe a
32
+ * capability that does not exist, which is the "population of zero" failure the
33
+ * roadmap already flags elsewhere.
34
+ */
35
+
36
+ import * as fs from 'node:fs';
37
+ import * as path from 'node:path';
38
+
39
+ import {
40
+ LADDER_RUNGS,
41
+ type ActivationReceipt,
42
+ type LadderRung,
43
+ type PrecedenceReason,
44
+ type RungState,
45
+ } from './activation_ladder.js';
46
+ import type { NoFreeForm } from './runtime_journal.js';
47
+ import { type PrivacyClass } from './privacy_class.js';
48
+
49
+ type Assert<T extends true> = T;
50
+
51
+ /**
52
+ * The closed set of evidence sources a rung state may come from (TB-3).
53
+ *
54
+ * Each entry names a surface this producer can read without consulting the
55
+ * evaluation side. A source may not be added without an observer: the set
56
+ * describes what can be observed, never what one would like to observe.
57
+ *
58
+ * - `source-tree` — the authored artefact exists under `src/`, so it can match
59
+ * at all. Reads the `eligible` rung.
60
+ * - `discovery-manifest` — the built manifest names the artefact for the active
61
+ * install, i.e. the selector kept it. Reads the `selected` rung.
62
+ * - `host-projection` — a host tree carries a file for the artefact. Reads the
63
+ * `projected` rung.
64
+ */
65
+ export const EVIDENCE_SOURCES = ['source-tree', 'discovery-manifest', 'host-projection'] as const;
66
+ export type EvidenceSource = (typeof EVIDENCE_SOURCES)[number];
67
+
68
+ /** The rung each admitted source is allowed to speak about. One source, one rung. */
69
+ export const SOURCE_RUNG: Readonly<Record<EvidenceSource, LadderRung>> = {
70
+ 'source-tree': 'eligible',
71
+ 'discovery-manifest': 'selected',
72
+ 'host-projection': 'projected',
73
+ };
74
+
75
+ /** Rungs no admitted source covers today. Present so the gap is enumerable. */
76
+ export const UNOBSERVED_RUNGS: readonly LadderRung[] = LADDER_RUNGS.filter(
77
+ (r) => !Object.values(SOURCE_RUNG).includes(r),
78
+ );
79
+
80
+ /**
81
+ * One observation. `state` is the evidence; `evidence_source` is where it came
82
+ * from.
83
+ *
84
+ * The field is `evidence_source` and not `source` on purpose: `source` is a
85
+ * member of `FREE_FORM_KEYS`, so a field of that name would make the privacy
86
+ * assertion at the bottom of this file `Assert<false>` and stop the build. The
87
+ * rename is the cheap half of keeping this input type incapable of carrying
88
+ * content.
89
+ */
90
+ export interface RungObservation {
91
+ readonly rung: LadderRung;
92
+ readonly state: Exclude<RungState, 'unknown'>;
93
+ readonly evidence_source: EvidenceSource;
94
+ }
95
+
96
+ export interface ReceiptBuild {
97
+ readonly receipt: ActivationReceipt | null;
98
+ readonly errors: readonly string[];
99
+ }
100
+
101
+ /**
102
+ * Build a receipt from observations.
103
+ *
104
+ * TB-2 in one line: the output's `rungs` map has exactly the keys the caller
105
+ * observed. Nothing is defaulted, nothing is filled in, and a rung nobody looked
106
+ * at is absent — which `rungState` reads as `unknown` and `ladderRate` keeps out
107
+ * of its denominator.
108
+ *
109
+ * TB-3 in the refusals: an unadmitted source, or an admitted source speaking
110
+ * about a rung that is not its own, is an ERROR and yields no receipt. It is
111
+ * not a warning and it is not silently dropped, because a receipt missing a rung
112
+ * is indistinguishable from a receipt whose rung was refused, and only one of
113
+ * those is honest.
114
+ */
115
+ export function buildActivationReceipt(
116
+ artefact: string,
117
+ observations: readonly RungObservation[],
118
+ reason?: PrecedenceReason,
119
+ ): ReceiptBuild {
120
+ const errors: string[] = [];
121
+ if (!artefact) errors.push('artefact id is required');
122
+
123
+ const rungs: Partial<Record<LadderRung, RungState>> = {};
124
+ for (const o of observations) {
125
+ if (!(EVIDENCE_SOURCES as readonly string[]).includes(o.evidence_source)) {
126
+ errors.push(`evidence_source '${o.evidence_source}' is not admitted (TB-3)`);
127
+ continue;
128
+ }
129
+ if (SOURCE_RUNG[o.evidence_source] !== o.rung) {
130
+ errors.push(
131
+ `evidence_source '${o.evidence_source}' may only observe rung ` +
132
+ `'${SOURCE_RUNG[o.evidence_source]}', not '${o.rung}' (TB-3)`,
133
+ );
134
+ continue;
135
+ }
136
+ if (rungs[o.rung] !== undefined && rungs[o.rung] !== o.state) {
137
+ errors.push(`rung '${o.rung}' observed twice with conflicting states`);
138
+ continue;
139
+ }
140
+ rungs[o.rung] = o.state;
141
+ }
142
+ if (errors.length > 0) return { receipt: null, errors };
143
+
144
+ const receipt: ActivationReceipt = reason === undefined
145
+ ? { artefact, rungs }
146
+ : { artefact, rungs, reason };
147
+ return { receipt, errors: [] };
148
+ }
149
+
150
+ // --- observers ---------------------------------------------------------------
151
+
152
+ /**
153
+ * Observe the `projected` rung: does a host tree carry a file for this artefact?
154
+ *
155
+ * EC-3 is the reason this returns `undefined` rather than probing further when
156
+ * the host root itself is missing. A host tree that does not exist is not
157
+ * evidence that the artefact was not projected into it — it is the absence of a
158
+ * place to look, and the honest output of a missing observation is nothing at
159
+ * all. Escalating from "read a path" to "go find the tree" is the unbounded-cost
160
+ * mistake EC-3 names, and it is the one a reader would forgive.
161
+ */
162
+ export function observeProjection(
163
+ hostRoot: string,
164
+ artefactRelPath: string,
165
+ ): RungObservation | undefined {
166
+ if (!existsQuiet(hostRoot)) return undefined;
167
+ return {
168
+ rung: 'projected',
169
+ state: existsQuiet(path.join(hostRoot, artefactRelPath)) ? 'reached' : 'not-reached',
170
+ evidence_source: 'host-projection',
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Observe the `eligible` rung: is the artefact authored in the source tree?
176
+ *
177
+ * Same absence rule as {@link observeProjection}: an unreadable source root
178
+ * yields no observation rather than a negative one.
179
+ */
180
+ export function observeSourceTree(
181
+ sourceRoot: string,
182
+ artefactRelPath: string,
183
+ ): RungObservation | undefined {
184
+ if (!existsQuiet(sourceRoot)) return undefined;
185
+ return {
186
+ rung: 'eligible',
187
+ state: existsQuiet(path.join(sourceRoot, artefactRelPath)) ? 'reached' : 'not-reached',
188
+ evidence_source: 'source-tree',
189
+ };
190
+ }
191
+
192
+ /**
193
+ * Observe the `selected` rung from an already-loaded discovery-manifest id set.
194
+ *
195
+ * Takes the id set rather than a path: loading and parsing the manifest is the
196
+ * caller's, so this stays a pure predicate and EC-1's "no I/O beyond a read"
197
+ * holds trivially for it. An EMPTY set is treated as no manifest — not as a
198
+ * manifest that selected nothing — because those are different observations and
199
+ * folding them is exactly TB-2's failure.
200
+ */
201
+ export function observeSelection(
202
+ selectedIds: ReadonlySet<string>,
203
+ artefactId: string,
204
+ ): RungObservation | undefined {
205
+ if (selectedIds.size === 0) return undefined;
206
+ return {
207
+ rung: 'selected',
208
+ state: selectedIds.has(artefactId) ? 'reached' : 'not-reached',
209
+ evidence_source: 'discovery-manifest',
210
+ };
211
+ }
212
+
213
+ function existsQuiet(p: string): boolean {
214
+ try {
215
+ fs.statSync(p);
216
+ return true;
217
+ } catch {
218
+ return false;
219
+ }
220
+ }
221
+
222
+ // --- the audit line ----------------------------------------------------------
223
+
224
+ /** What THIS producer's lines carry: an artefact id, enums, and counts. */
225
+ const PRODUCER_PRIVACY_CLASS: PrivacyClass = 'ids-only';
226
+
227
+ export interface ActivationLineInput {
228
+ /** The artefact the receipt is about. An id, never a path. */
229
+ artefact: string;
230
+ /** The rungs actually observed. Absent rungs stay absent (TB-2). */
231
+ rungs: Readonly<Partial<Record<LadderRung, RungState>>>;
232
+ /**
233
+ * The precedence reason, when there is one.
234
+ *
235
+ * Named `precedence_reason` and NOT `reason`, which is a `FREE_FORM_KEYS`
236
+ * member: a field called `reason` on this type makes the assertion at the
237
+ * bottom of this file `Assert<false>` and stops the build, even though the
238
+ * value it would hold is a closed six-value enum. The emitted JSON key is
239
+ * still `reason`, because that is `ActivationReceipt`'s field name and the
240
+ * ladder module owns the receipt shape. The rename buys the compile-time
241
+ * floor at the cost of one line of mapping, which is the right trade: a
242
+ * guard that only rejects genuinely dangerous names is a guard someone has
243
+ * to keep tuning.
244
+ */
245
+ precedence_reason?: PrecedenceReason | undefined;
246
+ /** ISO-8601 UTC; the caller supplies it so this stays pure. */
247
+ ts: string;
248
+ /** ULID, UUID or content hash; the caller supplies it. */
249
+ id: string;
250
+ work_id?: string | undefined;
251
+ }
252
+
253
+ export interface BuiltActivationLine {
254
+ line: Record<string, unknown> | null;
255
+ errors: string[];
256
+ }
257
+
258
+ /**
259
+ * Build ONE audit-log-v1 line carrying an `activation` object.
260
+ *
261
+ * Deliberately the same envelope as `_lib/review_skipped_record.ts` — same
262
+ * mandatory fields, same `{line, errors}` contract, same refusal to return a
263
+ * half-built line. `skills_applied` is omitted for the same reason it is there:
264
+ * this producer has no skill observation to offer, and `[]` would assert one.
265
+ */
266
+ export function buildActivationLine(input: ActivationLineInput): BuiltActivationLine {
267
+ const errors: string[] = [];
268
+ if (!input.artefact) errors.push('artefact is required');
269
+ if (!input.ts) errors.push('ts (ISO-8601 UTC) is required');
270
+ if (!input.id) errors.push('id (ULID, UUID, or content hash) is required');
271
+ const observed = Object.keys(input.rungs);
272
+ if (observed.length === 0) {
273
+ // A receipt that observed nothing is not a receipt. Writing one would
274
+ // add a line to an append-only ledger that carries no evidence and
275
+ // still counts as a record — the shape a later reader mistakes for
276
+ // coverage.
277
+ errors.push('a receipt must carry at least one observed rung');
278
+ }
279
+ for (const r of observed) {
280
+ if (!(LADDER_RUNGS as readonly string[]).includes(r)) {
281
+ errors.push(`'${r}' is not a ladder rung`);
282
+ }
283
+ }
284
+ if (errors.length) return { line: null, errors };
285
+
286
+ const activation: Record<string, unknown> = { artefact: input.artefact, rungs: { ...input.rungs } };
287
+ if (input.precedence_reason !== undefined) activation['reason'] = input.precedence_reason;
288
+
289
+ const line: Record<string, unknown> = {
290
+ schema_version: 1,
291
+ id: input.id,
292
+ ts: input.ts,
293
+ work_id: input.work_id ?? `activation-${input.ts}`,
294
+ phase: 'report',
295
+ outcome: 'success',
296
+ confidence_band: 'high',
297
+ risk_class: 'low',
298
+ memory: { asks: 0, hits: 0 },
299
+ verify: { claims: 0, first_try_passes: 0 },
300
+ rules_applied: [],
301
+ privacy_class: PRODUCER_PRIVACY_CLASS,
302
+ persona: null,
303
+ input_kind: 'prompt',
304
+ type: 'note',
305
+ activation,
306
+ };
307
+ return { line, errors: [] };
308
+ }
309
+
310
+ /**
311
+ * Append ONE line to the monthly audit log (TB-4).
312
+ *
313
+ * `appendFileSync` and nothing else: no read-modify-write, no truncation, no
314
+ * seek. Returns the file it wrote so a caller can assert the write happened
315
+ * rather than trusting that it did.
316
+ */
317
+ export function appendActivationLine(
318
+ workspaceRoot: string,
319
+ line: Record<string, unknown>,
320
+ ts: string,
321
+ ): string {
322
+ const dir = path.join(workspaceRoot, 'agents', 'runtime', 'state', 'audit');
323
+ fs.mkdirSync(dir, { recursive: true });
324
+ const file = path.join(dir, `${ts.slice(0, 7)}.jsonl`);
325
+ fs.appendFileSync(file, `${JSON.stringify(line)}\n`, 'utf8');
326
+ return file;
327
+ }
328
+
329
+ /**
330
+ * The privacy floor, by construction, on this producer's input type.
331
+ *
332
+ * Same mechanism as the two producers `docs/contracts/audit-log-v1.md`
333
+ * § Privacy floor already names. Adding a `path`, `detail`, `reason_text` or
334
+ * any other `FREE_FORM_KEYS` member below makes this `Assert<false>` and stops
335
+ * the build. `reason` is one of them, which is why the precedence field is
336
+ * called `precedence_reason` here and mapped to `reason` on the way out — see
337
+ * the field's own note.
338
+ */
339
+ type _ActivationLineInputCarriesNoFreeFormField = Assert<
340
+ [NoFreeForm<ActivationLineInput>] extends [never] ? false : true
341
+ >;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * The five states a per-asset outcome can occupy, and why three would not do.
3
+ *
4
+ * A per-asset "win rate" computed over two states — worked / did not work —
5
+ * is uninterpretable, and the failure is not cosmetic. Take a skill whose
6
+ * content is excellent and which the router never activates. Its success rate
7
+ * is low. Every fix that number suggests is a change to the skill, and every
8
+ * one of them would improve nothing, because the skill was never reached. The
9
+ * split below is what makes the number point at the right layer.
10
+ *
11
+ * Three rungs are observed independently:
12
+ *
13
+ * available -> was the asset present in this install at all?
14
+ * activated -> did the router/agent actually load it for this task?
15
+ * followed -> did the work that followed conform to what it said?
16
+ *
17
+ * Each rung is `true`, `false`, or `null` for "not observed". `null` is not a
18
+ * pessimistic `false`: an unobserved rung means the instrument did not see,
19
+ * which is a statement about the instrument. Collapsing it into either
20
+ * direction manufactures a signal, so `classify` returns `'unknown'` the moment
21
+ * any rung it would need is unobserved.
22
+ */
23
+
24
+ /** Ordered from least to most engaged. `unknown` is not on that ladder. */
25
+ export const ACTIVATION_STATES = [
26
+ /** The asset is not present in this install. Nothing about its quality follows. */
27
+ 'not-available',
28
+ /** Present, and the router never loaded it. A content fix cannot help this case. */
29
+ 'available-not-activated',
30
+ /** Loaded, and the work did not conform to it. This is the case a content or clarity fix addresses. */
31
+ 'activated-not-followed',
32
+ /** Loaded and conformed to. The only state that may count toward a win rate. */
33
+ 'activated-followed',
34
+ /**
35
+ * At least one rung was not observed. Reported as its own share, never
36
+ * folded into a success or a failure — a report that hides its own blind
37
+ * spot is worse than one that has none, because the reader cannot see the
38
+ * hole.
39
+ */
40
+ 'unknown',
41
+ ] as const;
42
+
43
+ export type ActivationState = (typeof ACTIVATION_STATES)[number];
44
+
45
+ export function isActivationState(v: unknown): v is ActivationState {
46
+ return typeof v === 'string' && (ACTIVATION_STATES as readonly string[]).includes(v);
47
+ }
48
+
49
+ /** One observation per rung. `null` means "not observed", never "no". */
50
+ export interface ActivationObservation {
51
+ available: boolean | null;
52
+ activated: boolean | null;
53
+ followed: boolean | null;
54
+ }
55
+
56
+ /**
57
+ * Classify one observation.
58
+ *
59
+ * The short-circuits are deliberate and are the reason this is a function
60
+ * rather than a lookup table: once `available` is observed `false`, the other
61
+ * two rungs are IRRELEVANT rather than unknown — an absent asset cannot have
62
+ * been activated — so an unobserved `followed` must not drag the answer to
63
+ * `'unknown'`. The same holds one rung down for `activated: false`.
64
+ *
65
+ * Everywhere else an unobserved rung wins, because the alternative is to invent
66
+ * the observation.
67
+ */
68
+ export function classify(obs: ActivationObservation): ActivationState {
69
+ if (obs.available === null) return 'unknown';
70
+ if (obs.available === false) return 'not-available';
71
+
72
+ if (obs.activated === null) return 'unknown';
73
+ if (obs.activated === false) return 'available-not-activated';
74
+
75
+ if (obs.followed === null) return 'unknown';
76
+ return obs.followed ? 'activated-followed' : 'activated-not-followed';
77
+ }
78
+
79
+ /**
80
+ * True for the states that may enter a win-rate denominator.
81
+ *
82
+ * `unknown` is excluded because it is not an outcome, and `not-available` is
83
+ * excluded because it is not a fact about the asset's quality. Exported so a
84
+ * report cannot quietly choose a different denominator per column.
85
+ */
86
+ export function countsTowardWinRate(state: ActivationState): boolean {
87
+ return state === 'activated-followed' || state === 'activated-not-followed';
88
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Deterministic adherence detection, and a hard refusal to guess.
3
+ *
4
+ * Step 5.1 splits a per-asset outcome into five states. The hardest of its
5
+ * rungs to observe is `followed`: whether the work actually conformed to the
6
+ * rule that was loaded. It is tempting to have a model read the transcript and
7
+ * say. That is precisely what this module refuses to do.
8
+ *
9
+ * The rule, from step 5.2: where a rule has an OBSERVABLE FOOTPRINT, adherence
10
+ * is computed from that footprint. Where it has none, adherence is `unknown` —
11
+ * never inferred, never a model's guess. An inferred adherence figure is worse
12
+ * than a missing one, because a missing one is visible in the `unknown` share
13
+ * and an inferred one is not.
14
+ *
15
+ * A DETECTOR ANSWERS FOR ONE CLAUSE, NOT FOR A RULE. Rules in this tree carry
16
+ * many clauses; `think-before-action` alone spans a read set, a verification
17
+ * matrix, and a test-first preference. A detector that observed one clause and
18
+ * reported "rule followed" would be overclaiming by construction, so every
19
+ * registration below names the clause it decides and the registry key is the
20
+ * pair, not the rule id.
21
+ */
22
+
23
+ import type { ActivationState } from './activation_states.js';
24
+
25
+ /** The subset of {@link ActivationState} a detector may return. */
26
+ export type Adherence = Extract<
27
+ ActivationState,
28
+ 'activated-followed' | 'activated-not-followed' | 'unknown'
29
+ >;
30
+
31
+ /**
32
+ * One observed write, reduced to the two things a detector may see: where it
33
+ * went, and in what order relative to the others.
34
+ *
35
+ * Deliberately carries NO content field — a detector that could read a diff
36
+ * body would be a second place for file contents to travel, and the audit
37
+ * privacy floor exists to stop exactly that.
38
+ */
39
+ export interface WriteObservation {
40
+ /** Repository-relative path. */
41
+ path: string;
42
+ /** Monotonic ordering key within one task. Absolute time is not required. */
43
+ seq: number;
44
+ }
45
+
46
+ export interface DetectorInput {
47
+ writes: readonly WriteObservation[];
48
+ }
49
+
50
+ export interface ClauseDetector {
51
+ /** The rule whose clause this decides. */
52
+ rule_id: string;
53
+ /** Which clause — a rule has many, and a detector answers for one. */
54
+ clause: string;
55
+ /** Where that clause is written, so a reader can check the detector against it. */
56
+ source: string;
57
+ detect(input: DetectorInput): Adherence;
58
+ }
59
+
60
+ /** A path is a test path when it sits under a `tests/` segment or is named `*.test.*` / `*.spec.*`. */
61
+ export function isTestPath(p: string): boolean {
62
+ const normalized = p.replace(/\\/g, '/');
63
+ if (/(^|\/)tests?(\/|$)/.test(normalized)) return true;
64
+ return /\.(test|spec)\.[cm]?[jt]sx?$/.test(normalized);
65
+ }
66
+
67
+ /**
68
+ * `think-before-action` § "When behavior can be defined → prefer test-first /
69
+ * TDD" (`dist/agent-src/rules/think-before-action.md:43`).
70
+ *
71
+ * The footprint is write ORDER: a test file written before the production file
72
+ * it covers is test-first; the reverse is not.
73
+ *
74
+ * The `unknown` branch is the load-bearing one and is wider than it first
75
+ * looks. If only test writes are observed, no production change happened and
76
+ * the clause did not apply. If only production writes are observed, it is
77
+ * tempting to answer `activated-not-followed` — and that would be a GUESS: the
78
+ * test may have been written in an earlier task, or the change may be one the
79
+ * clause's own "when behavior can be defined" qualifier excludes. Both
80
+ * one-sided cases are therefore `unknown`, which is the honest answer and the
81
+ * conservative one in the direction that matters — it never manufactures a
82
+ * violation.
83
+ */
84
+ export const testFirstDetector: ClauseDetector = {
85
+ rule_id: 'think-before-action',
86
+ clause: 'prefer test-first / TDD when behavior can be defined',
87
+ source: 'dist/agent-src/rules/think-before-action.md:43',
88
+ detect({ writes }) {
89
+ let firstTest: number | null = null;
90
+ let firstProd: number | null = null;
91
+ for (const w of writes) {
92
+ if (isTestPath(w.path)) {
93
+ if (firstTest === null || w.seq < firstTest) firstTest = w.seq;
94
+ } else if (firstProd === null || w.seq < firstProd) {
95
+ firstProd = w.seq;
96
+ }
97
+ }
98
+ // Either side missing means the order was never observed, not that it
99
+ // was violated. See the note above on why the production-only case is
100
+ // deliberately NOT a violation.
101
+ if (firstTest === null || firstProd === null) return 'unknown';
102
+ return firstTest < firstProd ? 'activated-followed' : 'activated-not-followed';
103
+ },
104
+ };
105
+
106
+ /**
107
+ * The registry. Keyed `${rule_id}#${clause}` so one rule may gain a second
108
+ * detector later without either silently replacing the other.
109
+ */
110
+ const DETECTORS: readonly ClauseDetector[] = [testFirstDetector];
111
+
112
+ export function detectorsFor(ruleId: string): readonly ClauseDetector[] {
113
+ return DETECTORS.filter((d) => d.rule_id === ruleId);
114
+ }
115
+
116
+ /**
117
+ * Adherence for one rule.
118
+ *
119
+ * A rule with NO registered detector returns `unknown`. That is the whole
120
+ * point: 118 of this tree's 119 rules have no observable footprint today, and
121
+ * the honest report says so rather than filling the column with inference.
122
+ *
123
+ * With several detectors registered for one rule, a single observed violation
124
+ * wins over a `followed` — a rule is not adhered to if any decided clause was
125
+ * broken — and `unknown` only survives when nothing was decided at all.
126
+ */
127
+ export function detectAdherence(ruleId: string, input: DetectorInput): Adherence {
128
+ const detectors = detectorsFor(ruleId);
129
+ if (detectors.length === 0) return 'unknown';
130
+
131
+ let sawFollowed = false;
132
+ for (const d of detectors) {
133
+ const verdict = d.detect(input);
134
+ if (verdict === 'activated-not-followed') return 'activated-not-followed';
135
+ if (verdict === 'activated-followed') sawFollowed = true;
136
+ }
137
+ return sawFollowed ? 'activated-followed' : 'unknown';
138
+ }
139
+
140
+ /** Rule ids that have at least one detector. Everything else reports `unknown`. */
141
+ export function rulesWithDetectors(): readonly string[] {
142
+ return [...new Set(DETECTORS.map((d) => d.rule_id))];
143
+ }
@@ -308,6 +308,32 @@ export type EvidenceStrength = (typeof EVIDENCE_STRENGTHS)[number];
308
308
 
309
309
  export const DISCOVERY_STATES = ['complete', 'incomplete'] as const;
310
310
  export const AUTHORITY_BASES = ['evidence', 'owner_intent'] as const;
311
+ export type AuthorityBasis = (typeof AUTHORITY_BASES)[number];
312
+
313
+ /**
314
+ * Reopen-authority vocabulary (`adr-layout.md` § Reopen authority).
315
+ *
316
+ * Moved here from `check_adr_frontmatter.ts` on 2026-08-31 so the ADR gate and
317
+ * `road-to-harness-promotion-bridge` step 7.2 read ONE list. 7.2's whole
318
+ * requirement is "route through the existing gate, not a second governance
319
+ * system"; importing the validator's private constant was not available, and
320
+ * copying it would have created the second system the step forbids.
321
+ *
322
+ * Both fields stay OPTIONAL at the ADR reader — an absent `reopen_policy`
323
+ * resolves to `unclassified`, never to `owner`.
324
+ */
325
+ export const REOPEN_POLICIES = ['directional', 'owner', 'unclassified'] as const;
326
+ export type ReopenPolicy = (typeof REOPEN_POLICIES)[number];
327
+
328
+ export const PROTECTED_DIMENSIONS = [
329
+ 'purpose',
330
+ 'security_floor',
331
+ 'privacy_floor',
332
+ 'external_commitment',
333
+ 'governance',
334
+ 'none',
335
+ ] as const;
336
+ export type ProtectedDimension = (typeof PROTECTED_DIMENSIONS)[number];
311
337
 
312
338
  export interface AdrProvenance {
313
339
  kind: string | null;