@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
@@ -67,8 +67,9 @@
67
67
  "\\bcodeguard\\b",
68
68
  "\\bcosai\\b"
69
69
  ],
70
+ "_deny_digests_README": "DORMANT (road-to-source-silence Phase 1.1). HMAC-SHA256 digests of the deny set, derived from the gitignored private master by src/scripts/build_source_digests.ts. It is EMPTY on purpose: the plaintext `deny` array above stays in force and is not deleted. Provisioning the CI secret SOURCE_DENY_KEY, generating production digests, removing the plaintext array and switching CI to strict mode are ONE ATOMIC MAINTAINER CHANGE (AI council 2026-08-28, blocker `where-the-key-lives`, 2/2) — splitting them leaves the gate either failing every run for want of a key or silently degraded to warn mode, which is the failure this whole programme exists to remove. Recipe: docs/maintainers/source-deny-digests.md",
71
+ "deny_digests": [],
70
72
  "skip_paths": [
71
- "src/scripts/check_no_external_sources.py",
72
73
  "src/scripts/check_no_external_sources.ts",
73
74
  "src/scripts/external_sources_denylist.json",
74
75
  "src/skills/design-intelligence/*",
@@ -76,8 +77,6 @@
76
77
  "src/skills/design-tokens/*",
77
78
  "src/skills/react-shadcn-ui/*",
78
79
  "src/skills/tailwind-engineer/*",
79
- "src/scripts/cost/*",
80
- "src/scripts/validate_safe_paths.py",
81
80
  "dist/agent-src/skills/design-intelligence/*",
82
81
  "dist/agent-src/skills/corpus-grounding/*",
83
82
  "dist/agent-src/skills/design-tokens/*",
@@ -88,31 +87,19 @@
88
87
  "docs/mcp.md",
89
88
  "docs/mcp-registries.md",
90
89
  "docs/DISTRIBUTION_CHECKLIST.md",
91
- "src/templates/marketing-copy.yml",
92
90
  "internal/workers/mcp/content.json",
93
- "internal/workers/mcp/content.json.gz",
94
- "internal/workers/mcp/manifest.json",
95
- "src/rules/source-confidentiality.md",
96
- "dist/agent-src/rules/source-confidentiality.md",
97
- "agents/roadmaps/archive/road-to-final-state-and-market-readiness.md",
98
- "agents/roadmaps/archive/road-to-image-brand-typography.md",
99
- "agents/roadmaps/archive/road-to-subagent-value-realization.md",
100
- "agents/roadmap-assets/road-to-image-brand-typography.assets.md",
101
91
  "CREDITS.md",
102
- "agents/roadmaps/archive/road-to-ecosystem-harvest-index.md",
103
92
  "provenance/borrows.jsonl",
104
- "docs/THIRD-PARTY-NOTICES.md",
105
- "agents/evidence/reviews/*.review-input/diff.patch"
93
+ "docs/THIRD-PARTY-NOTICES.md"
106
94
  ],
107
95
  "skip_reason": {
108
96
  "vendored_cluster": "design-intelligence/corpus-grounding/design-tokens/react-shadcn-ui/tailwind-engineer + cost/*.mjs ship vendored Apache/MIT code; their upstream attribution is license-required and must NOT be stripped (ADR-061). CREDITS.md is the repo-level attribution file FOR that same cluster — it names the upstreams because the licenses require it, which is the one case source-confidentiality explicitly exempts. It was missing here, so the gate flagged the very attribution the rule mandates.",
109
97
  "recommendation_docs": "mcp.md, mcp-registries.md, DISTRIBUTION_CHECKLIST.md, ADR-086, marketing-copy.yml reference registries (Smithery/Glama) as recommendations/distribution targets — allowed.",
110
98
  "generated_bundles": "content.json* bundle the vendored-cluster skill bodies above.",
111
99
  "self": "the linter + its denylist + the source-confidentiality rule necessarily contain the deny tokens as data.",
112
- "validate_safe_paths": "telegraph-derived (MIT) ported code; upstream attribution is license-required.",
113
- "archived_roadmaps_newly_tracked": "Archived roadmaps (and their assets) that predate the source-confidentiality sweep became tracked via the 2026-07 agents-dir gitignore hygiene change. They are frozen historical records; the claudekit mentions are ADR-061 license-attribution work and the remaining names are historical planning references. New roadmaps stay subject to the gate. road-to-ecosystem-harvest-index.md is the sharpest case: the flagged line is its own acceptance criterion, 'No harvest-family artifact names a real external source' — it quotes the names in order to assert their absence, so the gate fires on the sentence that records the cleanup. road-to-opt-retrieval-and-memory.md was REMOVED from this list on 2026-07-28 (road-to-native-code-intelligence Phase 6): its two clear-text mentions named a gitignored borrow-catalogue inbox file, which carries no historical value that a neutral descriptor loses — so the mentions were rewritten and the exception retired rather than kept. Retiring an exception is preferred over holding one whenever the named token is not license-required attribution and not load-bearing for the record.",
114
100
  "provenance_ledger": "provenance/borrows.jsonl and the docs/THIRD-PARTY-NOTICES.md it generates are the license-attribution surfaces for CODE borrows, and code-provenance REQUIRES the upstream name in them: the ledger's `source_url` is a mandatory field (provenance/README.md), and lint_provenance fails when the notices file drifts from it. That is the same license-required-attribution case source-confidentiality already exempts for the vendored cluster and CREDITS.md — the rule forbids derivation-attribution, not the notice a license obliges. The collision only surfaced on 2026-08-13 because the ledger had been empty until its first record; before that there was no name to flag. Scope is deliberately these two paths and not `provenance/*`: the harvest ledger next door governs KNOWLEDGE claims, where anonymisation is the rule and no license compels a name.",
115
- "r2_review_diff_capture": "The R2 completion-review dispatcher writes a verbatim `diff.patch` of the branch under review into a tracked input package. It is a MECHANICAL CAPTURE, not authored text: any source name inside it was already written somewhere else in the same branch, where this gate does see it. A branch that touches the vendored cluster's ATTRIBUTION.md — carved out here precisely because its license requires the name — therefore reproduces that name in the capture and fails the gate for content the gate already allowed at its source. Scope is the capture ONLY: `findings.md` and `prompt.md` are authored prose and stay under the gate, so a reviewer who names a harvest source in their findings is still caught."
101
+ "_dead_entries_removed_2026_08_28": "road-to-source-silence Phase 2.3, first drawdown. Three skip_paths named files that no longer exist and were therefore exempting nothing: src/scripts/check_no_external_sources.py and src/scripts/validate_safe_paths.py (both retired in the ADR-200 Python teardown) and internal/workers/mcp/content.json.gz (a .gz, which the extension skip-list already covers). The roadmap's measurement named ONE dead entry; re-checked at execution there were three. The `validate_safe_paths` reason key went with its path. Removing a dead exemption is pure shrink -- it cannot loosen the gate, and check_suppression_hygiene forbids growth in the other direction.",
102
+ "_entries_removed_2026_08_29": "road-to-source-silence Phases 2.1/2.3/3.4 drew skip_paths from 32 to 22. TEN entries went, and the arithmetic is stated so it can be checked: three DEAD (suppressed zero hits, measured per entry by removal and re-scan), five archived roadmaps plus ONE roadmap-asset file REDACTED in place under ADR-250 (dated markers, mechanical word-diff audit, 0 unexplained changes) = six, one comment rephrased generically, and the review-snapshot diff.patch carve-out replaced by earned per-finding deduplication in _lib/source_snapshot_dedup.ts. 3 + 6 + 1 + 1 = 10, and 32 - 10 = 22. An earlier version of this note said \"Eleven entries went\" by counting the roadmap-asset file separately from the five archived roadmaps AND in the six; the published ledger was right and this sentence was wrong. Full 32-entry ledger with per-entry suppressed-hit counts and dispositions: agents/evidence/reports/source-skip-paths-ledger.md."
116
103
  },
117
104
  "_excluded_tokens": {
118
105
  "agent-os": "collides with our own coined 'Agent-OS primitive' term (universal-skills) — too FP-prone to auto-deny; scrub external 'agent-os' mentions by review.",
@@ -22,6 +22,8 @@ import * as fs from 'node:fs';
22
22
  import * as path from 'node:path';
23
23
  import { fileURLToPath, pathToFileURL } from 'node:url';
24
24
 
25
+ import { isPhaseOutcome, PHASE_OUTCOMES } from './_lib/outcome_vocabularies.js';
26
+
25
27
  const _HERE = fileURLToPath(import.meta.url);
26
28
  // src/scripts/extract_audit_patterns.py → parent.parent.parent == repo root.
27
29
  export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
@@ -164,11 +166,22 @@ export function mine(auditDir: string, month: string | null, minCount: number):
164
166
  const records = _resolveSupersedes([..._iterLines(auditDir, month)]);
165
167
  // Preserve insertion order of first-seen keys (Python dict ordering).
166
168
  const groups = new Map<string, Pattern>();
169
+ // `outcome` used to be read as a bare `string`, so a typo silently became
170
+ // its own pattern and nothing said so (`road-to-experience-loop-broadening`
171
+ // 1.3; AI council 2026-08-29 named this the consumer-side half). Grouping
172
+ // is UNCHANGED — this file mirrors a retired Python CLI byte-for-byte and
173
+ // dropping a record would change pinned stdout. What changes is that an
174
+ // off-vocabulary value is now observable instead of silent.
175
+ const unknownOutcomes = new Set<string>();
167
176
  for (const rec of records) {
168
177
  const t = rec.type;
169
178
  if (!(t === undefined || t === null || t === 'phase')) {
170
179
  continue;
171
180
  }
181
+ const rawOutcome = rec.outcome;
182
+ if (rawOutcome !== undefined && rawOutcome !== null && !isPhaseOutcome(rawOutcome)) {
183
+ unknownOutcomes.add(String(rawOutcome));
184
+ }
172
185
  const key = _patternKey(rec);
173
186
  let pat = groups.get(key);
174
187
  if (pat === undefined) {
@@ -194,6 +207,14 @@ export function mine(auditDir: string, month: string | null, minCount: number):
194
207
  pat.last_seen = ts;
195
208
  }
196
209
  }
210
+ if (unknownOutcomes.size > 0) {
211
+ const seen = [...unknownOutcomes].sort().join(', ');
212
+ process.stderr.write(
213
+ `extract_audit_patterns: ${unknownOutcomes.size} off-vocabulary outcome value(s) ` +
214
+ `grouped as-is: ${seen}. Expected one of: ${PHASE_OUTCOMES.join(' | ')} ` +
215
+ `(docs/contracts/audit-log-v1.md, src/scripts/_lib/outcome_vocabularies.ts).\n`,
216
+ );
217
+ }
197
218
  const out: Rec[] = [];
198
219
  for (const p of groups.values()) {
199
220
  if (p.count >= minCount) {
@@ -16,6 +16,16 @@
16
16
  * - **Idempotent** — an existing `fold-<id>.md` is skipped, so re-runs are
17
17
  * no-ops and interrupted runs resume cleanly.
18
18
  *
19
+ * loss_class: recoverable-lossy
20
+ * loss_recovery: the fold page's per-child `<file>:<first-line>-<last-line>` link-backs
21
+ *
22
+ * Named, not changed (`road-to-runtime-context-floors` step 3.1). The fold is
23
+ * smaller than its children and the children are still there, byte-identical,
24
+ * addressable by the link-back range the fold page carries — which is precisely
25
+ * the guarantee `recoverable-lossy` makes and `ephemeral-lossy` does not. The
26
+ * locator is the load-bearing half: without it this class would be
27
+ * indistinguishable from the ephemeral one by anything except intention.
28
+ *
19
29
  * MANUAL TRIGGER ONLY (council decision): this script is deliberately NOT
20
30
  * wired into hooks or CI. The Phase-0 intake tripwire
21
31
  * (`lint_knowledge_scale.ts`, intake > 2000 events) names this script as its
@@ -36,6 +46,7 @@ import * as fs from 'node:fs';
36
46
  import * as path from 'node:path';
37
47
  import process from 'node:process';
38
48
  import { fileURLToPath } from 'node:url';
49
+ import { generatedByQuote } from './_lib/generated_by.js';
39
50
 
40
51
  const PROG = 'fold_intake.ts';
41
52
 
@@ -166,7 +177,7 @@ export function renderFold(plan: FoldPlan, batchSize: number): string {
166
177
  '> Idempotent extractive rollup of a completed intake batch',
167
178
  `> (batch ${plan.index}, size ${batchSize}). Children are never mutated —`,
168
179
  '> this page is an additive archive with link-backs, not a rewrite.',
169
- '> Generated by `src/scripts/fold_intake.ts` (deterministic, no LLM).',
180
+ generatedByQuote('fold_intake', '(deterministic, no LLM.)'),
170
181
  '',
171
182
  `Fold ID: ${plan.id}`,
172
183
  `Batch index: ${plan.index}`,
@@ -192,7 +192,7 @@ export function main(): number {
192
192
  const out: string[] = [];
193
193
  out.push('# Discovery Baseline — Inventory (Phase 0.1)\n');
194
194
  out.push(
195
- '> Generated by `scripts/gen_discovery_baseline.py` on ' + `${_utcStamp()}.\n`,
195
+ '> Generated by `gen_discovery_baseline`. Do not edit. Stamped ' + `${_utcStamp()}.\n`,
196
196
  );
197
197
  out.push(
198
198
  '> Frozen reference for the Phase 2 scanner — the `no domain` tally below must match the\n' +
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Generate `CAPABILITIES.yaml` — the package's capability-coverage index.
4
4
  *
5
- * Ported from the retired Python `src/scripts/generate_capabilities_index.py` (ADR-200).
5
+ * Ported from the retired Python `generate_capabilities_index` (ADR-200).
6
6
  * The CLI contract is pinned — the `--check` flag, exit codes
7
7
  * (0 / 1 / 2), stdout/stderr split, and the byte-identical generated
8
8
  * `CAPABILITIES.yaml` (header comment block, `meta:` block, `capability_areas:`
@@ -44,11 +44,18 @@ import { parse as parseYaml } from 'yaml';
44
44
 
45
45
  import { iter_commands } from './_lib/agent_src.js';
46
46
  import { parse_frontmatter } from './validate_frontmatter.js';
47
+ import { resolveRepoRoot } from './_lib/repo_root.js';
47
48
 
48
49
  const _HERE = fileURLToPath(import.meta.url);
49
50
 
50
- // src/scripts/generate_capabilities_index.ts → parents[2] is repo root.
51
- const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
51
+ // generate_capabilities_index → parents[2] is repo root.
52
+ // Root resolution goes through the sentinel resolver rather than a bare `..`
53
+ // walk: `path.resolve(dirname, '..', '..')` is correct until this file moves,
54
+ // and then it addresses a parent directory that also exists — the generator
55
+ // writes nothing, reports success, and nothing fails. `resolveRepoRoot` REFUSES
56
+ // when no directory on the walk carries this package's `package.json`
57
+ // (road-to-skill-ecosystem-runtime-enforcement Phase 2 Step 6).
58
+ const ROOT = resolveRepoRoot(path.dirname(_HERE));
52
59
  const OUT = path.join(ROOT, 'CAPABILITIES.yaml');
53
60
  const PACKS_YML = path.join(ROOT, 'src', 'config', 'discovery', 'packs.yml');
54
61
  const SKILLS_DIR = path.join(ROOT, 'src', 'skills');
@@ -358,7 +365,7 @@ export function build(): string {
358
365
  const lines: string[] = [];
359
366
  lines.push('# CAPABILITIES.yaml — what agent-config already covers');
360
367
  lines.push('#');
361
- lines.push('# GENERATED by src/scripts/generate_capabilities_index.ts — do NOT hand-edit.');
368
+ lines.push('# GENERATED by generate_capabilities_index — do NOT hand-edit.');
362
369
  lines.push('# Drift-checked in CI (`--check`). Regenerate after adding/removing a');
363
370
  lines.push('# skill, command, or capability pack.');
364
371
  lines.push('#');
@@ -367,7 +374,7 @@ export function build(): string {
367
374
  lines.push('# areas with zero backing skills/commands.');
368
375
  lines.push('');
369
376
  lines.push('meta:');
370
- lines.push(' generated_by: src/scripts/generate_capabilities_index.py');
377
+ lines.push(' generated_by: generate_capabilities_index');
371
378
  lines.push(
372
379
  ' purpose: ' + _scalar(
373
380
  'Machine-readable coverage index so external reviews stop ' +
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Generate the cross-host capability matrix (road-to-competitive-borrow P1.3).
4
4
  *
5
- * Ported from the retired Python `src/scripts/generate_capability_matrix.py` (ADR-200).
5
+ * Ported from the retired Python `src/generate_capability_matrix` (ADR-200).
6
6
  * The CLI contract is pinned — the `--check` / `--quiet` flags,
7
7
  * exit codes (0 / 1 / 2), stdout/stderr split, the byte-identical
8
8
  * `docs/capability-matrix.md` (heading prose, the host-header table, the glyph
@@ -222,7 +222,7 @@ export function render_md(matrix: Record<string, Record<string, string>>): strin
222
222
  const lines: string[] = [
223
223
  '# Capability matrix — what works on which host',
224
224
  '',
225
- '> **Generated** by `scripts/generate_capability_matrix.py` — do NOT',
225
+ '> **Generated** by `generate_capability_matrix` — do NOT',
226
226
  '> hand-edit. Derived from the `generate_tools()` projection logic in',
227
227
  '> `condense.py` (each cell traces to a `generate_*` dispatcher call).',
228
228
  '> Drift-checked in CI (`--check`).',
@@ -318,7 +318,7 @@ function _jsonStringAscii(s: string): string {
318
318
  export function render_json(matrix: Record<string, Record<string, string>>): string {
319
319
  const payload: Record<string, unknown> = {
320
320
  schema: 'capability-matrix/1',
321
- generated_by: 'scripts/generate_capability_matrix.py',
321
+ generated_by: 'generate_capability_matrix',
322
322
  hosts: HOSTS,
323
323
  artifacts: ARTIFACTS,
324
324
  matrix,
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Generate `docs/command-flows.md` — the Flows primary view (road-to-6.1.0 Step 9).
4
4
  *
5
- * Ported from the retired Python `src/scripts/generate_command_flows.py` (ADR-200 —
5
+ * Ported from the retired Python `src/generate_command_flows` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8a). The CLI contract is mirrored
7
7
  * EXACTLY: same flag (`--check`), same exit codes, same stdout/stderr
8
8
  * split, same byte-identical generated `docs/command-flows.md`. WRITER —
@@ -111,7 +111,7 @@ export function render(): string {
111
111
  const idx = _command_index();
112
112
 
113
113
  const out: string[] = [];
114
- out.push('<!-- GENERATED by scripts/generate_command_flows.py — do not edit by hand. -->');
114
+ out.push('<!-- GENERATED by generate_command_flows — do not edit by hand. -->');
115
115
  out.push(
116
116
  '<!-- Source: src/flows/surface-map.yaml + src/flows/<flow>.yaml. Re-run: task generate-command-flows. -->',
117
117
  );
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Generate the named cookbook (road-to-competitive-borrow P1.4).
4
4
  *
5
- * Ported from the retired Python `src/scripts/generate_cookbook.py` (ADR-200). Mirrors the
5
+ * Ported from the retired Python `src/generate_cookbook` (ADR-200). Mirrors the
6
6
  * Python CLI contract EXACTLY — the `--check` / `--quiet` flags, exit codes
7
7
  * (0 / 1 / 2), stdout/stderr split, and the byte-identical generated
8
8
  * `docs/cookbook.md` (heading prose, the named-recipe sections, the four
@@ -152,7 +152,7 @@ export function render(): string {
152
152
  const lines: string[] = [
153
153
  '# Cookbook — things you can do in a minute',
154
154
  '',
155
- '> **Generated** by `scripts/generate_cookbook.py` from ' +
155
+ '> **Generated** by `generate_cookbook` from ' +
156
156
  '`src/flows/cookbook.yaml` + `src/flows/<flow>.yaml` — do NOT hand-edit.',
157
157
  '> Every command and skill below is validated to exist at generation ' +
158
158
  'time; a recipe naming a missing command fails the build.',
@@ -26,11 +26,18 @@ import {
26
26
  } from './_lib/agent_src.js';
27
27
  import { computeStatus as domainSoundnessStatus } from './domain_soundness_status.js';
28
28
  import { skip_compile_disabled_rule } from './condense.js';
29
+ import { resolveRepoRoot } from './_lib/repo_root.js';
29
30
 
30
31
  const _HERE = fileURLToPath(import.meta.url);
31
32
 
32
33
  // src/scripts/generate_index.ts → parents[2] of the .py file is the repo root.
33
- export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
34
+ // Root resolution goes through the sentinel resolver rather than a bare `..`
35
+ // walk: `path.resolve(dirname, '..', '..')` is correct until this file moves,
36
+ // and then it addresses a parent directory that also exists — the generator
37
+ // writes nothing, reports success, and nothing fails. `resolveRepoRoot` REFUSES
38
+ // when no directory on the walk carries this package's `package.json`
39
+ // (road-to-skill-ecosystem-runtime-enforcement Phase 2 Step 6).
40
+ export const ROOT = resolveRepoRoot(path.dirname(_HERE));
34
41
 
35
42
  // Legacy single-root anchor — kept as fallback for pure-condensed consumer
36
43
  // projections. Multi-root discovery uses artefact_roots() per ADR-017.
@@ -24,6 +24,7 @@ import * as path from 'node:path';
24
24
  import process from 'node:process';
25
25
  import { fileURLToPath } from 'node:url';
26
26
  import YAML from 'yaml';
27
+ import { generatedByItalic } from './_lib/generated_by.js';
27
28
 
28
29
  const _HERE = fileURLToPath(import.meta.url);
29
30
  const PROG = 'generate_knowledge_index.ts';
@@ -126,7 +127,7 @@ function renderIndex(knowledgeRoot: string): string {
126
127
  lines.push('# Knowledge Index');
127
128
  lines.push('');
128
129
  lines.push(
129
- '_Auto-generated by `src/scripts/generate_knowledge_index.ts` — do not edit by hand. Regenerate with `task generate-knowledge-index`._',
130
+ generatedByItalic('task generate-knowledge-index'),
130
131
  );
131
132
  lines.push('');
132
133
  lines.push(
@@ -31,6 +31,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
31
31
  import { parse as parseYaml } from 'yaml';
32
32
 
33
33
  import { artefact_roots, strip_source_prefix } from './_lib/agent_src.js';
34
+ import { generatedByQuote } from './_lib/generated_by.js';
34
35
 
35
36
  const _HERE = path.dirname(fileURLToPath(import.meta.url));
36
37
  export const ROOT = path.resolve(_HERE, '..', '..');
@@ -425,7 +426,7 @@ function _to_markdown(payload: Json): string {
425
426
  const lines: string[] = [
426
427
  '# File-ownership matrix (regenerated)',
427
428
  '',
428
- '> **Do not edit.** Regenerated by `scripts/generate_ownership_matrix.py`.',
429
+ generatedByQuote('generate_ownership_matrix'),
429
430
  '> Schema: [`docs/contracts/file-ownership-matrix.md`](../../../docs/contracts/file-ownership-matrix.md).',
430
431
  '',
431
432
  `- Schema version: \`${payload['version']}\``,
@@ -31,17 +31,25 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
31
31
  import { parse as parseYaml } from 'yaml';
32
32
 
33
33
  import { SRC_AGENT, iter_all_sources, resolve_logical } from './_lib/agent_src.js';
34
+ import { resolveRepoRoot } from './_lib/repo_root.js';
35
+ import { generatedByComment } from './_lib/generated_by.js';
34
36
 
35
37
  const _HERE = fileURLToPath(import.meta.url);
36
38
  // src/scripts/generate_pack_manifests.ts → parents[2] is the repo root (mirrors
37
39
  // `Path(__file__).resolve().parents[2]` in the .py).
38
- const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
40
+ // Root resolution goes through the sentinel resolver rather than a bare `..`
41
+ // walk: `path.resolve(dirname, '..', '..')` is correct until this file moves,
42
+ // and then it addresses a parent directory that also exists — the generator
43
+ // writes nothing, reports success, and nothing fails. `resolveRepoRoot` REFUSES
44
+ // when no directory on the walk carries this package's `package.json`
45
+ // (road-to-skill-ecosystem-runtime-enforcement Phase 2 Step 6).
46
+ const ROOT = resolveRepoRoot(path.dirname(_HERE));
39
47
  const PACKAGES = path.join(ROOT, 'packages');
40
48
  const SRC_DOMAINS = path.join(ROOT, 'src', 'domains');
41
49
  const SRC_PACKS = path.join(ROOT, 'src', 'packs');
42
50
  const PACKS_VOCAB = path.join(ROOT, 'src', 'config', 'discovery', 'packs.yml');
43
51
  const GENERATED_HEADER =
44
- '# Generated by scripts/generate_pack_manifests.ts — DO NOT EDIT BY HAND\n';
52
+ `${generatedByComment('generate_pack_manifests')}\n`;
45
53
 
46
54
  type Json = unknown;
47
55
  type Dict = Record<string, unknown>;
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Generate the role-experience catalog (road-to-competitive-borrow P1.0).
4
4
  *
5
- * Ported from the retired Python `src/scripts/generate_role_experiences_catalog.py`
5
+ * Ported from the retired Python `src/generate_role_experiences_catalog`
6
6
  * (ADR-200). The CLI contract is pinned — the `--check` /
7
7
  * `--quiet` flags, exit codes (0 / 1 / 2), stdout/stderr split, and the
8
8
  * byte-identical generated `docs/role-experiences.md` (heading prose, the
@@ -159,7 +159,7 @@ export function render(): string {
159
159
  const lines: string[] = [
160
160
  '# Role experiences — taglines at a glance',
161
161
  '',
162
- '> **Generated** by `scripts/generate_role_experiences_catalog.py` from',
162
+ '> **Generated** by `generate_role_experiences_catalog` from',
163
163
  '> `agents/roles/<role>/index.md` — do NOT hand-edit. Taglines are the',
164
164
  '> existing role-level strings (validated by `lint_role_experiences.py`,',
165
165
  '> rendered in the GUI workspace); this page surfaces them in a catalog.',
@@ -120,7 +120,7 @@ export function renderPage(rows: readonly ReferenceRow[]): string {
120
120
  const out: string[] = [];
121
121
  out.push('# Settings reference — every key, its class, and its default');
122
122
  out.push('');
123
- out.push('> **Generated** by `src/scripts/generate_settings_reference.ts` — do NOT');
123
+ out.push('> **Generated** by `generate_settings_reference` — do NOT');
124
124
  out.push('> hand-edit. Derived from the zod settings schema plus the A/B/C class');
125
125
  out.push('> table in [`settings-classes`](contracts/settings-classes.md).');
126
126
  out.push('> Drift-checked in CI (`--check`).');
@@ -38,6 +38,8 @@ import fs from "node:fs";
38
38
  import path from "node:path";
39
39
  import { fileURLToPath, pathToFileURL } from "node:url";
40
40
 
41
+ import { humanTypedThisTurn as _humanTypedThisTurn } from "./_lib/machine_wake.js";
42
+
41
43
  import { atomic_write_json } from "./hooks/state_io.js";
42
44
  import { readHookStdin } from "./hooks/hook_stdin.js";
43
45
 
@@ -465,6 +467,14 @@ export function takePending(
465
467
  }
466
468
  }
467
469
 
470
+ /**
471
+ * Re-exported so the ledger's own tests and callers keep one import site. The
472
+ * predicate lives in `_lib/machine_wake.ts` because the misclassification is a
473
+ * property of the `user_prompt_submit` SLOT, not of this concern — see that
474
+ * file for the discriminator and the captured evidence behind it.
475
+ */
476
+ export { humanTypedThisTurn } from "./_lib/machine_wake.js";
477
+
468
478
  export function run(stdin_text: string, options: { consumer_root: string }): number {
469
479
  let envelope: JsonObject = {};
470
480
  if (stdin_text.trim()) {
@@ -491,11 +501,22 @@ export function run(stdin_text: string, options: { consumer_root: string }): num
491
501
  return EXIT_ALLOW;
492
502
  }
493
503
 
504
+ const session = typeof envelope["session_id"] === "string" ? envelope["session_id"] : "";
505
+
506
+ // A machine wake is not a user turn. Leave every per-turn record standing —
507
+ // the ledger AND the pending refusal — and return before either is touched.
508
+ // Returning early rather than branching per-record is the point: any future
509
+ // per-turn state added to this function inherits the protection instead of
510
+ // needing to remember it (risk 4 — the misclassification is a property of the
511
+ // slot, not of one consumer).
512
+ if (!_humanTypedThisTurn(prompt)) {
513
+ return EXIT_ALLOW;
514
+ }
515
+
494
516
  const { authorized, evidence } = classifyAuthorization(prompt);
495
517
 
496
518
  // The answer to the guard's own question. Read (and consume) on EVERY prompt,
497
519
  // so the record cannot outlive the turn it was raised in.
498
- const session = typeof envelope["session_id"] === "string" ? envelope["session_id"] : "";
499
520
  const pending = takePending(options.consumer_root, session, Date.now());
500
521
  if (pending && !authorized.includes(pending.op) && isAffirmative(prompt)) {
501
522
  authorized.push(pending.op);
@@ -58,6 +58,12 @@ export interface DimensionResult {
58
58
  grade: Grade | null;
59
59
  /** Required when `grade` is null: why detection is impossible, not merely absent. */
60
60
  notDetectable?: string;
61
+ /**
62
+ * Facts observed without being scored. An empty array means "nothing was
63
+ * observed", which is NOT the same as a failing grade and NOT the same as
64
+ * `notDetectable` — the three states are kept apart deliberately.
65
+ */
66
+ observations?: string[];
61
67
  evidence: string;
62
68
  }
63
69
 
@@ -174,18 +180,51 @@ export function grade(root: string): Matrix {
174
180
  evidence: testCfg ? 'a test-runner config is present' : 'no test-runner config',
175
181
  });
176
182
 
177
- // 3. test strength — mutation or property-based
183
+ // 3. advanced testing signals — OBSERVED, never graded.
184
+ //
185
+ // This dimension used to be `test-strength`, graded on config presence. It
186
+ // was unscored on 2026-08-27: a dormant `stryker.conf` and an unused
187
+ // `fast-check` dependency both scored, while a rigorous conventional suite
188
+ // with neither scored 0 — so the number ordered targets by ADOPTION and
189
+ // read as EFFECTIVENESS. Detection is kept because presence is a real fact
190
+ // about the repository; the grade is dropped because the inference from it
191
+ // was not. Three epistemic states are held apart on purpose: a signal was
192
+ // observed, no signal was observed, and effectiveness is not evaluable at
193
+ // all — the last is permanent under static inspection and is why
194
+ // `notDetectable` is emitted whether or not any observation fires.
178
195
  const mutation =
179
196
  _glob1(root, '.', /^stryker\.conf\./) || _exists(root, 'infection.json', 'infection.json.dist') ||
180
197
  /\[tool\.mutmut\]/.test(pyproject) || /\[mutmut\]/.test(_readIfAny(root, 'setup.cfg'));
181
198
  const property =
182
199
  /fast-check/.test(_readIfAny(root, 'package.json')) || /hypothesis/.test(pyproject + _readIfAny(root, 'requirements.txt'));
200
+ const mutationCi = mutation && _ciBlocks(ci, 'stryker', 'infection', 'mutmut');
201
+ // `ci-reference-detected`, not `ci-enforcement-detected`. Static matching over
202
+ // a workflow file establishes that a mutation tool is REFERENCED there; it
203
+ // cannot establish that the step is enabled, blocking, reached on the required
204
+ // branches, or ever executed. Naming it "enforcement" hands a consumer an
205
+ // assurance token the probe does not earn — and a consumer is entitled to read
206
+ // a token's name, `notDetectable` disclaimer or no disclaimer.
207
+ const observed: string[] = [
208
+ ...(mutation ? ['mutation-testing-config-detected'] : []),
209
+ ...(property ? ['property-testing-library-detected'] : []),
210
+ ...(mutationCi ? ['mutation-testing-ci-reference-detected'] : []),
211
+ ];
183
212
  dims.push({
184
- id: 'test-strength',
185
- label: 'test strength',
213
+ id: 'advanced-testing-signals',
214
+ label: 'advanced testing signals',
186
215
  knockout: false,
187
- grade: _graded(mutation || property, _ciBlocks(ci, 'stryker', 'infection', 'mutmut')),
188
- evidence: mutation ? 'mutation config present' : property ? 'property-based library present' : 'neither mutation nor property testing',
216
+ grade: null,
217
+ observations: observed,
218
+ notDetectable:
219
+ 'test effectiveness — static config and dependency signals cannot establish mutation sensitivity, ' +
220
+ 'property quality, or whether either was ever executed. Outcome evidence would be needed: survivor and ' +
221
+ 'timeout counts from a real mutation run, or executed property-test results.',
222
+ // Derived from `observations`, never a parallel ternary. The original
223
+ // ternary reported only the mutation signal when BOTH fired — which the
224
+ // `python` fixture does — so the human-readable string and the machine
225
+ // list disagreed about the same target. Two representations of one fact
226
+ // drift; one is computed from the other.
227
+ evidence: observed.length > 0 ? observed.join(', ') : 'no advanced-testing signal detected',
189
228
  });
190
229
 
191
230
  // 4. static analysis & types — KNOCKOUT, and the not-detectable case
@@ -319,6 +358,10 @@ export function renderMatrix(m: Matrix): string {
319
358
  for (const d of m.dimensions) {
320
359
  const val = d.grade === null ? `not detectable — ${d.notDetectable ?? ''}` : `${String(d.grade)} ${GRADE_WORD[d.grade] ?? ''}`;
321
360
  L.push(` ${d.knockout ? '!' : ' '} ${d.label.padEnd(28)} ${val}`);
361
+ // Observations are printed under their dimension, never folded into the
362
+ // level. An unscored dimension that printed nothing would read as an
363
+ // omission rather than as a deliberate refusal to grade.
364
+ for (const o of d.observations ?? []) L.push(` ${' '.repeat(31)} observed: ${o}`);
322
365
  }
323
366
  L.push('');
324
367
  L.push(' ! = knockout dimension. The level is the MINIMUM over knockouts;');