@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
@@ -25,6 +25,8 @@
25
25
  */
26
26
  import { spawnSync } from 'node:child_process';
27
27
 
28
+ import { CURATED_HEAD_INSTRUCTION } from './release_material.js';
29
+
28
30
  /** The five curated labels, in the order an operator reads them. */
29
31
  export const HEAD_LABELS: readonly string[] = [
30
32
  'Behaviour changes',
@@ -39,11 +41,27 @@ export const HEAD_NONE = '_none_';
39
41
  /**
40
42
  * Prefix marking a head line the generator derived rather than a human wrote.
41
43
  *
42
- * Machine-checkable so the gate can warn when one survives to merge, and
44
+ * Machine-checkable so the gate can REFUSE when one survives to merge, and
43
45
  * readable so the line still says something true to anyone who ships it
44
46
  * unedited. It is not a placeholder token: the line it introduces carries real
45
47
  * evidence (the reason plus the citing SHAs), so nothing here is
46
48
  * wrong-if-shipped — only unpolished-if-unedited.
49
+ *
50
+ * **REVERSED 2026-09-01 — "only unpolished-if-unedited" no longer implies
51
+ * "therefore advisory".** The clause above is kept because it is TRUE, and the
52
+ * conclusion that used to follow from it is the part that was falsified: the
53
+ * gate warned, and the marker shipped anyway in five consecutive released
54
+ * sections (14.9.0 through 14.13.0, eighteen lines, re-derived at
55
+ * `b50b27281`). `check_release_highlights` now exits non-zero on a marker in
56
+ * the section under release, and the sibling annotation in that file's header
57
+ * carries the full reversal.
58
+ *
59
+ * **Instructing authority:** the maintainer's closing instruction in the
60
+ * 2026-09-a inbox round, carried into
61
+ * `agents/roadmaps/archive/road-to-publication-integrity-hard-fail.md` § Phase 1.
62
+ *
63
+ * Nothing about the marker's own shape changes here — it is still one
64
+ * definition, still shared with the generator that writes it.
47
65
  */
48
66
  export const DERIVED_MARKER = '_auto-derived, rewrite before merge:_';
49
67
 
@@ -283,6 +301,57 @@ export function render_derived_head_values(
283
301
  return out;
284
302
  }
285
303
 
304
+ /**
305
+ * Reasons the section under release must NOT be published, in the order a
306
+ * reader should act on them. Empty means nothing here blocks publication.
307
+ *
308
+ * Added 2026-09-01 for roadmap § 3.1. It exists because the two IRREVERSIBLE
309
+ * transitions — the annotated tag and the GitHub Release body — happen inside
310
+ * `release.ts` after the PR gate has already passed, and nothing re-read the
311
+ * section between them. `check_release_highlights` guards the PR; this guards
312
+ * the publish.
313
+ *
314
+ * **It takes a section body, never a path and never a repository.** A guard
315
+ * that reads a file decides for itself what it is guarding, and the two
316
+ * refused earlier attempts both died there: one placed the check inside a pure
317
+ * formatter, which has no idea whether it is publishing, and one read the live
318
+ * changelog from a drill fixture. The caller cuts the section and owns the
319
+ * decision to publish; this function only answers whether that text is
320
+ * publishable.
321
+ *
322
+ * **Two markers since 2026-09-01, and the second one had to wait for a writer
323
+ * change.** This function used to check `DERIVED_MARKER` only, and said so:
324
+ * the generator still wrote its authoring comment into every section it cut,
325
+ * so refusing on that comment would have redded every release on its first run
326
+ * — Risk 1 of the roadmap, reproduced exactly. Roadmap § Phase 2 Option A
327
+ * removed the emission (`render_release_head` in `release.ts`), which is what
328
+ * makes refusing on it safe. The order was forced and it is the reason the
329
+ * check arrives second rather than late.
330
+ *
331
+ * `CURATED_HEAD_INSTRUCTION` is a named sentinel imported from the module that
332
+ * defines it — never a shape match over comment prose, which would reject
333
+ * unrelated legitimate comments and miss this one after a reword.
334
+ */
335
+ export function publication_blockers(sectionBody: string, version: string): string[] {
336
+ const out: string[] = [];
337
+ if (sectionBody.includes(DERIVED_MARKER)) {
338
+ out.push(
339
+ `the ${version} section still carries \`${DERIVED_MARKER}\` — the generator's ` +
340
+ 'draft head, not a curated claim. Rewrite those line(s) on ' +
341
+ `${'`main`'} and re-run.`,
342
+ );
343
+ }
344
+ if (sectionBody.includes(CURATED_HEAD_INSTRUCTION)) {
345
+ out.push(
346
+ `the ${version} section still carries the authoring instruction ` +
347
+ `(\`${CURATED_HEAD_INSTRUCTION}\`) — a reminder to the releaser, not ` +
348
+ 'release content, and `CHANGELOG.md` is published to npm. Delete that ' +
349
+ 'comment line from the section and re-run.',
350
+ );
351
+ }
352
+ return out;
353
+ }
354
+
286
355
  /** Labels whose curated value is still the generator's unedited draft. */
287
356
  export function stale_draft_labels(
288
357
  curated: Readonly<Record<string, string>>,
@@ -61,6 +61,116 @@ export function extract_changelog_section(text: string, version: string): Change
61
61
  return { heading: m[0], body };
62
62
  }
63
63
 
64
+ /**
65
+ * The generator's authoring instruction, identified by ONE named sentinel.
66
+ *
67
+ * Roadmap `road-to-publication-integrity-hard-fail` § Phase 2, Option A. Until
68
+ * 2026-09-01 `render_release_head` wrote this comment into every changelog
69
+ * section it cut, and nothing removed it at release time — so it shipped. At
70
+ * that commit `grep -c 'Curated head: fill before merge' CHANGELOG.md` read 2,
71
+ * and `package.json` `files` carries the bare `"CHANGELOG.md"`, which is the
72
+ * npm-published artifact. The instruction now lives in the release-PR body,
73
+ * which is never published, and the writer emits none.
74
+ *
75
+ * **A sentinel, deliberately not a shape match.** A council seat warned that a
76
+ * pattern such as `/<!-- .* should(?: only)? be .* -->/` is overbroad and
77
+ * under-specified: it rejects unrelated legitimate comments while missing the
78
+ * prohibited instruction after harmless rewording. This follows the discipline
79
+ * `DERIVED_MARKER` already follows — one definition, imported by every
80
+ * consumer, including the gates that refuse on it.
81
+ */
82
+ export const CURATED_HEAD_INSTRUCTION = 'Curated head: fill before merge';
83
+
84
+ /**
85
+ * The full authoring instruction as the release-PR body carries it.
86
+ *
87
+ * Parameterized rather than importing `RELEASE_HEAD_CAP_LINES` / `HEAD_NONE`,
88
+ * because this module has no imports and that is load-bearing: it is the one
89
+ * place the equality gate, the drill fixtures and the unit tests all reach, so
90
+ * a dependency here is a dependency in all three.
91
+ */
92
+ /**
93
+ * Cap on curated-head lines, and the placeholder a label carries when the
94
+ * answer is genuinely nothing.
95
+ *
96
+ * Relocated here from `release.ts` on 2026-09-01 with the instruction text:
97
+ * this module builds the release-PR body, so the instruction and the two
98
+ * values it interpolates belong on the same side of the import boundary. The
99
+ * generator re-exports `RELEASE_HEAD_CAP_LINES` under its original name, so
100
+ * nothing that referenced it there has to change.
101
+ */
102
+ export const RELEASE_HEAD_CAP_LINES = 10;
103
+
104
+ /**
105
+ * The fallback value of a head line the span does not substantiate.
106
+ *
107
+ * `_none_` and not a placeholder token: where nothing was derived it is the
108
+ * **true** answer, and a release that genuinely changed no defaults should say
109
+ * so rather than carry an unfilled marker.
110
+ *
111
+ * It is a fallback and no longer a blanket default. Writing `_none_` into
112
+ * every field made the generator assert five things it had not checked, and
113
+ * `check_release_highlights` rejected exactly that assertion the moment the
114
+ * span contradicted it — which for this package is every release, because every
115
+ * release touches `src/rules/` or `src/scripts/schemas/`. Substantiated labels
116
+ * are now pre-filled from the span (`_derive_head_prefill`), so the tool states
117
+ * only what it can support and `_none_` means what it says.
118
+ */
119
+ export const RELEASE_HEAD_DEFAULT = '_none_';
120
+
121
+ export function render_curated_head_instruction(capLines: number, headDefault: string): string {
122
+ return (
123
+ `<!-- ${CURATED_HEAD_INSTRUCTION}, keep it under ${capLines} lines, and leave ` +
124
+ `\`${headDefault}\` where it is genuinely the answer. The generated log below is ` +
125
+ 'unchanged. -->'
126
+ );
127
+ }
128
+
129
+ /** The instruction exactly as the release-PR body carries it. */
130
+ export const CURATED_HEAD_INSTRUCTION_COMMENT = render_curated_head_instruction(
131
+ RELEASE_HEAD_CAP_LINES,
132
+ RELEASE_HEAD_DEFAULT,
133
+ );
134
+
135
+ /**
136
+ * Delimiters bounding the release-PR-only region.
137
+ *
138
+ * The region exists so the PR body can carry something the changelog must not,
139
+ * WITHOUT relaxing surface equality anywhere else. `strip_pr_wrapper` removes
140
+ * exactly what sits between these two markers and nothing else — never a prose
141
+ * match, never a whole-body relaxation. Relaxing equality wholesale would
142
+ * remove the release-truth guarantee that the PR body and the changelog say
143
+ * the same thing, which is a larger floor than the one this change
144
+ * strengthens.
145
+ *
146
+ * An UNTERMINATED region is deliberately left in place: it then surfaces as an
147
+ * ordinary divergence instead of silently swallowing the rest of the body.
148
+ */
149
+ export const PR_ONLY_START = '<!-- release-pr-only:start -->';
150
+ export const PR_ONLY_END = '<!-- release-pr-only:end -->';
151
+
152
+ /** Remove every complete PR-only region. Delimiter-bounded, never a prose match. */
153
+ export function strip_pr_only_regions(s: string): string {
154
+ const out: string[] = [];
155
+ let rest = s;
156
+ for (;;) {
157
+ const i = rest.indexOf(PR_ONLY_START);
158
+ if (i === -1) {
159
+ out.push(rest);
160
+ break;
161
+ }
162
+ const j = rest.indexOf(PR_ONLY_END, i + PR_ONLY_START.length);
163
+ if (j === -1) {
164
+ // Unterminated — leave it standing so equality reports it.
165
+ out.push(rest);
166
+ break;
167
+ }
168
+ out.push(rest.slice(0, i));
169
+ rest = rest.slice(j + PR_ONLY_END.length);
170
+ }
171
+ return out.join('');
172
+ }
173
+
64
174
  /** Footer appended to the release-PR body; the strip helper accepts legacy variants. */
65
175
  export const PR_BODY_FOOTER = 'Created by `src/scripts/release.ts`.';
66
176
  const _LEGACY_PR_FOOTERS = ['Created by `scripts/release.py`.', PR_BODY_FOOTER];
@@ -68,9 +178,18 @@ const _LEGACY_PR_FOOTERS = ['Created by `scripts/release.py`.', PR_BODY_FOOTER];
68
178
  /** Marker `_cap_body` embeds when a surface was truncated to a GitHub limit. */
69
179
  export const TRUNCATION_MARKER = '_Changelog truncated to fit GitHub';
70
180
 
71
- /** Release-PR body derived from the (possibly capped) changelog-section body. */
181
+ /**
182
+ * Release-PR body derived from the (possibly capped) changelog-section body.
183
+ *
184
+ * Carries the authoring instruction inside the PR-only region. The region is
185
+ * emitted unconditionally rather than passed in by each caller: there are two
186
+ * PR-creation paths (`release.ts` and `release_publication.ts`), and a caller
187
+ * that forgot the argument would silently ship a PR with no reminder — the
188
+ * failure this change exists to make impossible, reintroduced one level up.
189
+ */
72
190
  export function pr_body_from_section(cappedBody: string, version: string): string {
73
- return `Release ${version}.\n\n${cappedBody}\n\n${PR_BODY_FOOTER}`;
191
+ const prOnly = `${PR_ONLY_START}\n${CURATED_HEAD_INSTRUCTION_COMMENT}\n${PR_ONLY_END}`;
192
+ return `Release ${version}.\n\n${prOnly}\n\n${cappedBody}\n\n${PR_BODY_FOOTER}`;
74
193
  }
75
194
 
76
195
  /** GitHub-release notes derived from the (possibly capped) changelog-section body. */
@@ -96,6 +215,10 @@ export function strip_pr_wrapper(prBody: string, version: string): string | null
96
215
  return null;
97
216
  }
98
217
  s = s.slice(prefix.length);
218
+ // Delimiter-bounded, before the footer walk: the region is PR-only material
219
+ // by construction, so it is removed from the comparison rather than
220
+ // compared. Everything outside it still has to match the changelog.
221
+ s = strip_pr_only_regions(s);
99
222
  for (const footer of _LEGACY_PR_FOOTERS) {
100
223
  if (s.trimEnd().endsWith(footer)) {
101
224
  s = s.trimEnd();
@@ -0,0 +1,105 @@
1
+ /**
2
+ * The repeated-failure rate — computed over the AMENDED view, by construction.
3
+ *
4
+ * This is the roadmap's single pre-registered core metric, and the reason it
5
+ * needed the amendment path first is arithmetic rather than aesthetic. A repeat
6
+ * is precisely the signal that surfaces AFTER an episode's terminal record is
7
+ * written: rework lands, a regression is found, a review comes back. A rate
8
+ * computed over unamended rows therefore undercounts the exact thing it exists
9
+ * to measure, and undercounts it in the flattering direction.
10
+ *
11
+ * The guarantee here is structural, not documentary: this module's input type
12
+ * is {@link EpisodeReconstruction}, which is the folded projection. It has no
13
+ * overload taking raw `JournalEvent[]`, so a caller CANNOT accidentally compute
14
+ * the rate over unamended rows — there is nothing to pass.
15
+ */
16
+
17
+ import type { BasisTag } from './evidence_basis.js';
18
+ import type { EpisodeReconstruction } from './runtime_journal.js';
19
+ import { RUN_TERMINAL_STATES, type RunTerminalState } from './outcome_vocabularies.js';
20
+
21
+ /**
22
+ * Terminal states that count as a failure for this metric.
23
+ *
24
+ * `clean-no-op` is deliberately NOT a failure: an episode that correctly
25
+ * determined there was nothing to do succeeded at the thing it was asked. And
26
+ * `approval-required` is not one either — it is the safety floor working, and
27
+ * counting a floor doing its job as a failure would make the metric fall every
28
+ * time governance fires.
29
+ */
30
+ export const FAILURE_TERMINALS: ReadonlySet<RunTerminalState> = new Set([
31
+ 'blocked',
32
+ 'exhausted',
33
+ 'stagnated',
34
+ ]);
35
+
36
+ /** States that count as a success for the metric. */
37
+ export const SUCCESS_TERMINALS: ReadonlySet<RunTerminalState> = new Set([
38
+ 'success',
39
+ 'clean-no-op',
40
+ ]);
41
+
42
+ // Every terminal state is classified or deliberately excluded -- silence about
43
+ // one is how a metric quietly changes meaning when the vocabulary grows.
44
+ const CLASSIFIED = new Set<string>([...FAILURE_TERMINALS, ...SUCCESS_TERMINALS, 'approval-required']);
45
+ const _unclassified = RUN_TERMINAL_STATES.filter((t) => !CLASSIFIED.has(t));
46
+ if (_unclassified.length > 0) {
47
+ throw new Error(
48
+ `repeated_failure: terminal state(s) ${_unclassified.join(', ')} are neither a failure, ` +
49
+ 'a success, nor explicitly excluded. Classify them or the rate silently changes meaning.',
50
+ );
51
+ }
52
+
53
+ export interface RepeatedFailureRate {
54
+ /** Episodes whose EFFECTIVE terminal state is a failure. */
55
+ failed: number;
56
+ /** Episodes with any classifiable effective terminal state. */
57
+ classified: number;
58
+ /** Episodes whose terminal state is absent or excluded. Its own share. */
59
+ unknown: number;
60
+ /** `failed / classified`, or `null` when nothing was classifiable. */
61
+ rate: number | null;
62
+ /** How many of the counted episodes carried at least one amendment. */
63
+ amended_episodes: number;
64
+ basis: BasisTag;
65
+ }
66
+
67
+ /**
68
+ * Compute the rate.
69
+ *
70
+ * `rate` is `null`, never `0`, when nothing classifiable was seen — the same
71
+ * rule the per-asset report follows, for the same reason: zero is a measurement
72
+ * and null is an absence, and a reader acts on the first while asking about the
73
+ * second.
74
+ */
75
+ export function repeatedFailureRate(
76
+ episodes: readonly EpisodeReconstruction[],
77
+ ): RepeatedFailureRate {
78
+ let failed = 0;
79
+ let classified = 0;
80
+ let unknown = 0;
81
+ let amended_episodes = 0;
82
+
83
+ for (const ep of episodes) {
84
+ if (ep.amendment_count > 0) amended_episodes += 1;
85
+
86
+ // `ep.terminal_state` is already the AMENDED verdict: reconstructEpisode
87
+ // drops superseded rows and takes the LAST effective terminal state.
88
+ const t = ep.terminal_state;
89
+ if (t === null || !CLASSIFIED.has(t) || t === 'approval-required') {
90
+ unknown += 1;
91
+ continue;
92
+ }
93
+ classified += 1;
94
+ if (FAILURE_TERMINALS.has(t)) failed += 1;
95
+ }
96
+
97
+ return {
98
+ failed,
99
+ classified,
100
+ unknown,
101
+ rate: classified === 0 ? null : failed / classified,
102
+ amended_episodes,
103
+ basis: 'estimated:ratio-over-amended-episode-terminals',
104
+ };
105
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Repository-root resolution that REFUSES rather than guesses.
3
+ *
4
+ * `road-to-skill-ecosystem-runtime-enforcement` Phase 2 Step 6. The trap class
5
+ * this closes is small to describe and has cost multiple sessions:
6
+ *
7
+ * 1. **An inherited `GIT_DIR`.** A git hook exports `GIT_DIR` (often `.git`,
8
+ * relative) into every child process. A gate that resolves its root with
9
+ * `git rev-parse --show-toplevel` then answers for whatever repository the
10
+ * inherited variable points at — which inside a worktree hook is the parent
11
+ * checkout, not the tree being committed. The gate runs, reads the wrong
12
+ * files, and passes.
13
+ * 2. **A path walked one directory too far.** `path.resolve(__dirname, '..',
14
+ * '..')` is correct until a file moves, and then it silently addresses a
15
+ * parent directory that also exists. Nothing fails; the scan is simply
16
+ * empty, which several gates report as a clean pass.
17
+ *
18
+ * Both are the same failure in the end: a resolver that always SUCCEEDS. So the
19
+ * contract here is the opposite — a root is returned only when the directory
20
+ * carries a **sentinel** proving it is the repository, and otherwise the call
21
+ * throws. A caller that cannot locate its own repository should stop, not scan
22
+ * an arbitrary directory.
23
+ *
24
+ * The sentinel is `package.json` carrying this package's `name`, not a bare
25
+ * `package.json`: every node_modules entry and every sibling project has one of
26
+ * those, and a resolver that accepts any of them has not narrowed anything.
27
+ */
28
+ import * as fs from 'node:fs';
29
+ import * as path from 'node:path';
30
+
31
+ /** The package name that identifies THIS repository. */
32
+ export const SENTINEL_PACKAGE_NAME = '@event4u/agent-config';
33
+
34
+ /** Raised when no directory on the walk carries the sentinel. */
35
+ export class RepoRootUnresolvedError extends Error {
36
+ readonly startedAt: string;
37
+
38
+ constructor(startedAt: string, message: string) {
39
+ super(message);
40
+ this.name = 'RepoRootUnresolvedError';
41
+ this.startedAt = startedAt;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * True when `dir` is this repository's root.
47
+ *
48
+ * Reads `package.json` and compares `name`. A parse failure is `false`, never a
49
+ * throw: a malformed `package.json` somewhere up the walk must not stop the walk
50
+ * from reaching a valid root above it.
51
+ */
52
+ export function hasSentinel(dir: string): boolean {
53
+ try {
54
+ const raw = fs.readFileSync(path.join(dir, 'package.json'), 'utf8');
55
+ return (JSON.parse(raw) as { name?: unknown }).name === SENTINEL_PACKAGE_NAME;
56
+ } catch {
57
+ return false;
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Walk upward from `from` and return the first directory carrying the sentinel.
63
+ *
64
+ * @throws {RepoRootUnresolvedError} when the walk reaches the filesystem root
65
+ * without finding one. Deliberately not a `null` return: an optional type
66
+ * invites `?? process.cwd()`, which is the guess this module exists to prevent.
67
+ */
68
+ export function resolveRepoRoot(from: string = process.cwd()): string {
69
+ let dir = path.resolve(from);
70
+ const seen: string[] = [];
71
+ for (;;) {
72
+ seen.push(dir);
73
+ if (hasSentinel(dir)) return dir;
74
+ const parent = path.dirname(dir);
75
+ if (parent === dir) break;
76
+ dir = parent;
77
+ }
78
+ throw new RepoRootUnresolvedError(
79
+ path.resolve(from),
80
+ `no repository root above ${path.resolve(from)} — no directory on the walk carries a ` +
81
+ `package.json named "${SENTINEL_PACKAGE_NAME}". Checked ${String(seen.length)} directory(ies). ` +
82
+ 'This is a refusal, not a fallback: resolving to the working directory here is how a gate ' +
83
+ 'ends up scanning an arbitrary tree and reporting a clean pass over it.',
84
+ );
85
+ }
86
+
87
+ /**
88
+ * The environment variables that override git's own discovery.
89
+ *
90
+ * `GIT_DIR` is the one that has actually bitten; the other three are listed
91
+ * because they fail the same way and a reader checking for one should see all
92
+ * four rather than believe the list is complete at one entry.
93
+ */
94
+ export const GIT_DISCOVERY_OVERRIDES = [
95
+ 'GIT_DIR',
96
+ 'GIT_WORK_TREE',
97
+ 'GIT_INDEX_FILE',
98
+ 'GIT_COMMON_DIR',
99
+ ] as const;
100
+
101
+ /** Any git discovery override present in `env`, with its value. */
102
+ export function inheritedGitOverrides(
103
+ env: NodeJS.ProcessEnv = process.env,
104
+ ): { name: string; value: string }[] {
105
+ const out: { name: string; value: string }[] = [];
106
+ for (const name of GIT_DISCOVERY_OVERRIDES) {
107
+ const value = env[name];
108
+ if (typeof value === 'string' && value !== '') out.push({ name, value });
109
+ }
110
+ return out;
111
+ }
@@ -34,6 +34,17 @@
34
34
  */
35
35
  export type MutationMeasure = 'exact' | 'capped_approximation';
36
36
 
37
+ import type { NoFreeForm } from './runtime_journal.js';
38
+ import { type PrivacyClass } from './privacy_class.js';
39
+
40
+ type Assert<T extends true> = T;
41
+
42
+ /**
43
+ * What THIS producer's lines carry: counts (`diff_lines`), enums, and the
44
+ * `rules_applied` id array. `ids-only`, same as the orchestration producer.
45
+ */
46
+ const PRODUCER_PRIVACY_CLASS: PrivacyClass = 'ids-only';
47
+
37
48
  export interface ReviewSkippedInput {
38
49
  /** Non-doc tracked-file mutation size that triggered the nudge (count only). */
39
50
  diff_lines: number;
@@ -92,6 +103,15 @@ export function buildReviewSkippedLine(input: ReviewSkippedInput): BuiltReviewSk
92
103
  memory: { asks: 0, hits: 0 },
93
104
  verify: { claims: 0, first_try_passes: 0 },
94
105
  rules_applied: ['delegation-policy'],
106
+ // MANDATORY on every audit line, same as the orchestration producer.
107
+ privacy_class: PRODUCER_PRIVACY_CLASS,
108
+ // `skills_applied` is OMITTED here, deliberately and not by oversight.
109
+ // audit-log-v1 distinguishes an absent key ("not recorded") from `[]`
110
+ // ("recorded, none applied"), and this writer observes a review that
111
+ // did not happen -- it has no skill observation to offer in either
112
+ // direction. Emitting `[]` would assert "no skills applied" on evidence
113
+ // this producer never gathered, which is the exact fabrication the
114
+ // absent/empty split exists to make impossible.
95
115
  persona: null,
96
116
  input_kind: 'prompt',
97
117
  type: 'note',
@@ -100,3 +120,20 @@ export function buildReviewSkippedLine(input: ReviewSkippedInput): BuiltReviewSk
100
120
 
101
121
  return { line, errors: [] };
102
122
  }
123
+
124
+ /**
125
+ * The SECOND producer's half of the compile-time privacy floor.
126
+ *
127
+ * `docs/contracts/audit-log-v1.md` states that the floor holds by construction
128
+ * "on two paths"; guarding only the first would leave that sentence half true
129
+ * while reading as fully true. Same mechanism as
130
+ * `orchestration_record.ts`: a free-form key on the input type makes this
131
+ * `Assert<false>` and stops the build.
132
+ *
133
+ * The negative direction is fixtured there rather than duplicated here — one
134
+ * proof that `NoFreeForm` still rejects is enough for both call sites, since
135
+ * they share the type.
136
+ */
137
+ type _ReviewSkippedInputCarriesNoFreeFormField = Assert<
138
+ [NoFreeForm<ReviewSkippedInput>] extends [never] ? false : true
139
+ >;