@event4u/agent-config 14.11.0 → 14.13.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 (762) 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 +368 -516
  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 +109 -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/evidence-discipline.md +26 -0
  24. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
  25. package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
  26. package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
  27. package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
  28. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  29. package/dist/agent-src/rules/broken-access-control.md +4 -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 +247 -3
  47. package/dist/agent-src/scripts/guarded_baseline.ts +328 -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 +400 -0
  51. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  52. package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
  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/code-refactoring/SKILL.md +45 -1
  57. package/dist/agent-src/skills/code-review/SKILL.md +65 -6
  58. package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
  59. package/dist/agent-src/skills/database/SKILL.md +8 -0
  60. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  61. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  62. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  63. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +25 -2
  64. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  65. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  66. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  67. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  68. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  69. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  70. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  71. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  72. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  73. package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
  74. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +30 -13
  75. package/dist/agent-src/skills/skill-writing/references/procedure.md +29 -7
  76. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  77. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  78. package/dist/agent-src/skills/storybook-workshop/SKILL.md +9 -0
  79. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  80. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  81. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  82. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  83. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  84. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  85. package/dist/agent-src/skills/ui-component-architect/SKILL.md +53 -2
  86. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  87. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  88. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  89. package/dist/agent-src/templates/roadmaps.md +97 -3
  90. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  91. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  92. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  93. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  94. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  95. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  96. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  97. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  98. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  99. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  100. package/dist/cli/commands/uiAudit.js +124 -5
  101. package/dist/cli/registry.js +2 -0
  102. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  103. package/dist/cli-delegate/{chunk-L43NCYPB.js → chunk-4FS4WRXP.js} +10 -0
  104. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  105. package/dist/cli-delegate/{chunk-236PNQZK.js → chunk-AKJGUQNO.js} +466 -285
  106. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  107. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  108. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  109. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  110. package/dist/cli-delegate/cmd_conformance.js +42 -10
  111. package/dist/cli-delegate/cmd_doctor.js +3 -3
  112. package/dist/cli-delegate/cmd_export.js +3 -2
  113. package/dist/cli-delegate/cmd_fleet.js +2 -2
  114. package/dist/cli-delegate/cmd_handoff.js +1 -1
  115. package/dist/cli-delegate/cmd_preflight.js +2 -2
  116. package/dist/cli-delegate/cmd_prune.js +3 -2
  117. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  118. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  119. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  120. package/dist/cli-delegate/cmd_sync.js +3 -2
  121. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  122. package/dist/cli-delegate/cmd_validate.js +3 -2
  123. package/dist/discovery/deprecation-report.md +1 -1
  124. package/dist/discovery/discovery-manifest.json +62 -62
  125. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  126. package/dist/discovery/discovery-manifest.summary.md +1 -1
  127. package/dist/discovery/dormancy-report.md +1 -1
  128. package/dist/discovery/orphan-report.md +1 -1
  129. package/dist/discovery/packs.json +2 -2
  130. package/dist/discovery/trust-report.md +1 -1
  131. package/dist/discovery/workspaces.json +2 -2
  132. package/dist/hooks/dispatch.js +2413 -1087
  133. package/dist/install/claudeRuleRewrite.js +254 -0
  134. package/dist/install/detect.js +29 -16
  135. package/dist/install/detect_php_shape.js +159 -0
  136. package/dist/install/install.mjs +639 -428
  137. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  138. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  139. package/dist/mcp/registry-manifest.json +3 -3
  140. package/dist/mcp/server.json +3 -3
  141. package/dist/mcp/server.mjs +4818 -2645
  142. package/dist/server/schemas/settings.js +6 -0
  143. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  144. package/dist/ui/index.html +1 -1
  145. package/docs/MIGRATION.md +1 -1
  146. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  147. package/docs/contracts/provider-lifecycle.md +1 -1
  148. package/docs/contracts/settings-classes.md +30 -4
  149. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  150. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  151. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  152. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  153. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  154. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  155. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  156. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  157. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  158. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  159. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  160. package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  161. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  162. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  163. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  164. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  165. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  166. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  167. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  168. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  169. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  170. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  171. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  172. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  173. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  174. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  175. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  176. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  177. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  178. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  179. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  180. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  181. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  182. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  183. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  184. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  185. package/docs/guidelines/augment-portability-patterns.md +6 -4
  186. package/docs/guidelines/code-clarity.md +21 -0
  187. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  188. package/docs/guidelines/cross-role-handoff.md +2 -2
  189. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  190. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  191. package/docs/guidelines/php/database.md +90 -7
  192. package/docs/guidelines/prompt-templates.md +7 -7
  193. package/docs/guidelines/redundancy-taxonomy.md +180 -0
  194. package/llms.txt +2 -2
  195. package/package.json +10 -3
  196. package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  197. package/src/agent-src/scripts/guarded_baseline.ts +328 -0
  198. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  199. package/src/agent-src/scripts/stub_queue.ts +82 -0
  200. package/src/agent-src/scripts/stubs_due.ts +400 -0
  201. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  202. package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
  203. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  204. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  205. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  206. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  207. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  208. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  209. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  210. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  211. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  212. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  213. package/src/config/agent-settings.template.yml +48 -3
  214. package/src/config/assurance-capability-registry.json +21 -9
  215. package/src/config/budgets.yml +19 -0
  216. package/src/config/canonical-terms.yml +119 -0
  217. package/src/config/capability-native-outcome-bars.json +81 -0
  218. package/src/config/ci-local-parity.yml +95 -0
  219. package/src/config/discovery/prompt-patterns.yml +56 -0
  220. package/src/config/drafting-channels.yml +43 -0
  221. package/src/config/estate-count-budget.json +38 -31
  222. package/src/config/evaluator-budgets.json +14 -14
  223. package/src/config/gate-coverage.yml +731 -30
  224. package/src/config/gate-reachability-exemptions.json +21 -0
  225. package/src/config/gate-violation-baselines.json +38 -20
  226. package/src/config/harness-evolution-budget.json +25 -0
  227. package/src/config/lapsed-beta-baseline.json +96 -0
  228. package/src/config/memory-twin-verdicts.yml +129 -0
  229. package/src/config/metric-registry.yml +124 -0
  230. package/src/config/pack-size-budget.json +35 -7
  231. package/src/config/preamble-payload-budget.json +97 -71
  232. package/src/config/profiles/balanced.ini +27 -0
  233. package/src/config/profiles/full.ini +27 -0
  234. package/src/config/profiles/minimal.ini +27 -0
  235. package/src/config/publish-surface.json +9 -2
  236. package/src/config/routing-coverage-seed.json +43 -0
  237. package/src/config/rule-stub-ceilings.json +126 -112
  238. package/src/config/suggestion-capture.json +28 -0
  239. package/src/config/surface-matrix.yml +21 -2
  240. package/src/config/turnaround-budget.json +66 -0
  241. package/src/config/web-launch-readiness.json +188 -0
  242. package/src/install/claudeRuleRewrite.ts +288 -0
  243. package/src/install/detect.ts +60 -17
  244. package/src/install/detect_php_shape.ts +191 -0
  245. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  246. package/src/scripts/_dispatch.bash +27 -0
  247. package/src/scripts/_lib/activation_ladder.ts +211 -0
  248. package/src/scripts/_lib/activation_states.ts +88 -0
  249. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  250. package/src/scripts/_lib/arith_claims.ts +181 -0
  251. package/src/scripts/_lib/arm_ranking.ts +62 -0
  252. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  253. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  254. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  255. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  256. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  257. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  258. package/src/scripts/_lib/candidate_record.ts +601 -0
  259. package/src/scripts/_lib/capture_rate.ts +319 -0
  260. package/src/scripts/_lib/collector_denominator.ts +771 -0
  261. package/src/scripts/_lib/collector_record.ts +340 -0
  262. package/src/scripts/_lib/collector_store.ts +664 -0
  263. package/src/scripts/_lib/collector_supervision.ts +827 -0
  264. package/src/scripts/_lib/concern_estate.ts +77 -0
  265. package/src/scripts/_lib/config_chain.ts +477 -0
  266. package/src/scripts/_lib/config_cost.ts +209 -0
  267. package/src/scripts/_lib/council_settings_block.ts +6 -0
  268. package/src/scripts/_lib/curator_ops.ts +172 -0
  269. package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
  270. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  271. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  272. package/src/scripts/_lib/empty_cycles.ts +88 -0
  273. package/src/scripts/_lib/eval_publication.ts +354 -0
  274. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  275. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  276. package/src/scripts/_lib/evidence_basis.ts +118 -0
  277. package/src/scripts/_lib/exec_evidence.ts +8 -0
  278. package/src/scripts/_lib/experience_card.ts +272 -0
  279. package/src/scripts/_lib/experience_report.ts +151 -0
  280. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  281. package/src/scripts/_lib/gate_baseline.ts +150 -1
  282. package/src/scripts/_lib/generated_by.ts +66 -0
  283. package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
  284. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  285. package/src/scripts/_lib/host_denominator.ts +687 -0
  286. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  287. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  288. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  289. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  290. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  291. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  292. package/src/scripts/_lib/loop_guards.ts +299 -0
  293. package/src/scripts/_lib/loss_class.ts +129 -0
  294. package/src/scripts/_lib/machine_wake.ts +51 -0
  295. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  296. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  297. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  298. package/src/scripts/_lib/orchestration_record.ts +253 -5
  299. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  300. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  301. package/src/scripts/_lib/paired_stats.ts +245 -0
  302. package/src/scripts/_lib/paired_verdict.ts +226 -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/regression_neighbourhood.ts +259 -0
  306. package/src/scripts/_lib/repeated_failure.ts +105 -0
  307. package/src/scripts/_lib/repo_root.ts +111 -0
  308. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  309. package/src/scripts/_lib/role_split.ts +338 -0
  310. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  311. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  312. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  313. package/src/scripts/_lib/skill_estate.ts +115 -0
  314. package/src/scripts/_lib/source_digest.ts +200 -0
  315. package/src/scripts/_lib/source_redact.ts +260 -0
  316. package/src/scripts/_lib/source_shape.ts +502 -0
  317. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  318. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  319. package/src/scripts/_lib/strip_comments.mjs +65 -0
  320. package/src/scripts/_lib/test_red_state.ts +154 -0
  321. package/src/scripts/_lib/trigger_shift.ts +144 -0
  322. package/src/scripts/_lib/untrusted_content.ts +82 -7
  323. package/src/scripts/adoption_report.ts +1 -1
  324. package/src/scripts/adr/evidence_census.ts +1 -1
  325. package/src/scripts/adr/regenerate_index.ts +26 -2
  326. package/src/scripts/adr_cite_check.ts +164 -1
  327. package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
  328. package/src/scripts/ai_council/blind_review.ts +11 -1
  329. package/src/scripts/ai_council/clients.ts +4 -0
  330. package/src/scripts/ai_council/config.ts +3 -0
  331. package/src/scripts/ai_council/consensus.ts +28 -8
  332. package/src/scripts/ai_council/consensus_round.ts +226 -0
  333. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  334. package/src/scripts/ai_council/inline_findings.ts +340 -0
  335. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  336. package/src/scripts/ai_council/orchestrator.ts +16 -203
  337. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  338. package/src/scripts/ai_council/pricing.ts +106 -0
  339. package/src/scripts/ai_council/prompts.ts +74 -7
  340. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  341. package/src/scripts/ai_council/py_format.ts +14 -3
  342. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  343. package/src/scripts/ai_council/response_record.ts +50 -0
  344. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  345. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  346. package/src/scripts/asset_delivery_ledger.ts +157 -0
  347. package/src/scripts/attest_artifact.ts +193 -0
  348. package/src/scripts/audit_auto_rules.ts +2 -1
  349. package/src/scripts/audit_command_surface.ts +1 -1
  350. package/src/scripts/audit_mcp_tools.ts +2 -2
  351. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  352. package/src/scripts/audit_user_type_axis.ts +2 -1
  353. package/src/scripts/bench_ab_clone.ts +215 -10
  354. package/src/scripts/bench_ab_integrity.ts +119 -5
  355. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  356. package/src/scripts/build_archive_index.ts +1 -1
  357. package/src/scripts/build_linear_digest.ts +1 -1
  358. package/src/scripts/build_proof.ts +11 -4
  359. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  360. package/src/scripts/build_source_digests.ts +157 -0
  361. package/src/scripts/cache_realization_report.ts +103 -0
  362. package/src/scripts/check_adr_frontmatter.ts +126 -0
  363. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  364. package/src/scripts/check_beta_review_markers.ts +235 -6
  365. package/src/scripts/check_bundle_path_leakage.ts +195 -7
  366. package/src/scripts/check_claims.ts +576 -6
  367. package/src/scripts/check_command_examples.ts +557 -0
  368. package/src/scripts/check_composite_arming.ts +35 -0
  369. package/src/scripts/check_concern_admissions.ts +365 -0
  370. package/src/scripts/check_enforcement_coverage.ts +28 -0
  371. package/src/scripts/check_estate_count.ts +263 -3
  372. package/src/scripts/check_gate_reachability.ts +383 -0
  373. package/src/scripts/check_host_loadability.ts +104 -0
  374. package/src/scripts/check_loss_class_declared.ts +308 -0
  375. package/src/scripts/check_md_language.ts +15 -98
  376. package/src/scripts/check_memory_proposal.ts +18 -11
  377. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  378. package/src/scripts/check_no_external_sources.ts +281 -6
  379. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  380. package/src/scripts/check_pack_size.ts +59 -2
  381. package/src/scripts/check_preamble_payload_budget.ts +144 -6
  382. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  383. package/src/scripts/check_publish_surface.ts +10 -1
  384. package/src/scripts/check_references.ts +24 -1
  385. package/src/scripts/check_routing_coverage.ts +352 -0
  386. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  387. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  388. package/src/scripts/check_score_contract.ts +528 -0
  389. package/src/scripts/check_skill_admissions.ts +514 -0
  390. package/src/scripts/check_static_parity.ts +285 -0
  391. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  392. package/src/scripts/check_suppression_hygiene.ts +15 -0
  393. package/src/scripts/check_web_launch_readiness.ts +705 -0
  394. package/src/scripts/ci_settle.ts +39 -2
  395. package/src/scripts/code_graph/build.ts +60 -3
  396. package/src/scripts/code_graph/extract.ts +44 -0
  397. package/src/scripts/code_graph/types.ts +24 -0
  398. package/src/scripts/collector_daemon.ts +714 -0
  399. package/src/scripts/config_cost_report.ts +302 -0
  400. package/src/scripts/consumer_matrix.ts +74 -1
  401. package/src/scripts/cost/budget.mjs +10 -3
  402. package/src/scripts/cost/track.mjs +10 -3
  403. package/src/scripts/council_cli.ts +37 -54
  404. package/src/scripts/description_route_check.ts +494 -0
  405. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  406. package/src/scripts/evolution_lab.ts +980 -0
  407. package/src/scripts/external_sources_denylist.json +5 -18
  408. package/src/scripts/extract_audit_patterns.ts +21 -0
  409. package/src/scripts/fold_intake.ts +12 -1
  410. package/src/scripts/gen_discovery_baseline.ts +1 -1
  411. package/src/scripts/generate_capabilities_index.ts +12 -5
  412. package/src/scripts/generate_capability_matrix.ts +3 -3
  413. package/src/scripts/generate_command_flows.ts +2 -2
  414. package/src/scripts/generate_cookbook.ts +2 -2
  415. package/src/scripts/generate_index.ts +8 -1
  416. package/src/scripts/generate_knowledge_index.ts +2 -1
  417. package/src/scripts/generate_ownership_matrix.ts +2 -1
  418. package/src/scripts/generate_pack_manifests.ts +10 -2
  419. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  420. package/src/scripts/generate_settings_reference.ts +1 -1
  421. package/src/scripts/git_authorization_hook.ts +22 -1
  422. package/src/scripts/grade_target_readiness.ts +48 -5
  423. package/src/scripts/hook_effect_doctor.ts +261 -0
  424. package/src/scripts/hook_manifest.json +1 -1
  425. package/src/scripts/hook_manifest.yaml +125 -11
  426. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  427. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  428. package/src/scripts/hooks/concern_registry.ts +6 -0
  429. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  430. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  431. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  432. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  433. package/src/scripts/hooks/shims/install.sh +61 -0
  434. package/src/scripts/hooks/shims/php +101 -0
  435. package/src/scripts/hooks/suggestion_capture_hook.ts +378 -0
  436. package/src/scripts/hot_context_hook.ts +16 -0
  437. package/src/scripts/install-hooks.sh +20 -5
  438. package/src/scripts/install.ts +17 -35
  439. package/src/scripts/inventory_frontmatter.ts +2 -1
  440. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  441. package/src/scripts/lint_budget_ownership.ts +54 -4
  442. package/src/scripts/lint_canonical_terms.ts +604 -0
  443. package/src/scripts/lint_composition_review.ts +619 -0
  444. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  445. package/src/scripts/lint_eval_specs.ts +593 -0
  446. package/src/scripts/lint_hook_manifest.ts +19 -0
  447. package/src/scripts/lint_host_portability.ts +373 -0
  448. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  449. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  450. package/src/scripts/lint_metric_consumers.ts +355 -0
  451. package/src/scripts/lint_skill_descriptions.ts +18 -1
  452. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  453. package/src/scripts/lint_skill_link_reach.ts +252 -0
  454. package/src/scripts/lint_skill_trigger_corpus.ts +752 -0
  455. package/src/scripts/lint_ticket_buildable.ts +17 -1
  456. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  457. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  458. package/src/scripts/measure_docs_dead_links.ts +348 -0
  459. package/src/scripts/measure_host_capture.ts +461 -0
  460. package/src/scripts/migration_status.ts +3 -3
  461. package/src/scripts/model_rule_injection.ts +60 -0
  462. package/src/scripts/orchestration_record.ts +14 -0
  463. package/src/scripts/pack_install_smoke.ts +363 -0
  464. package/src/scripts/pr_conflict_census.ts +187 -0
  465. package/src/scripts/preamble_byte_census.ts +139 -10
  466. package/src/scripts/prepack-check.mjs +4 -1
  467. package/src/scripts/probe_turnaround.ts +384 -0
  468. package/src/scripts/probe_unblocked_ask.ts +279 -0
  469. package/src/scripts/render_benchmark_md.ts +1 -1
  470. package/src/scripts/report_pack_delta.ts +204 -0
  471. package/src/scripts/rule_activation_census.ts +70 -9
  472. package/src/scripts/rule_backlinks.ts +1 -1
  473. package/src/scripts/run_lifecycle_suite.ts +208 -0
  474. package/src/scripts/run_skill_evals.ts +40 -0
  475. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  476. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  477. package/src/scripts/schemas/evals.schema.json +24 -1
  478. package/src/scripts/schemas/rule.schema.json +52 -1
  479. package/src/scripts/schemas/skill.schema.json +17 -2
  480. package/src/scripts/select_analysis_mode.ts +112 -0
  481. package/src/scripts/skill_overlap.ts +7 -1
  482. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  483. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  484. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  485. package/src/scripts/skill_usage_report.ts +2 -1
  486. package/src/scripts/stubs_due.ts +211 -0
  487. package/src/scripts/sweep_source_surfaces.ts +678 -0
  488. package/src/scripts/sync_pr_branch.ts +40 -1
  489. package/src/scripts/trigger_eval_grandfather.json +202 -222
  490. package/src/scripts/utilization_report.ts +22 -2
  491. package/src/server/schemas/settings.ts +10 -0
  492. package/src/templates/marketing-copy.yml +1 -1
  493. package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
  494. package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
  495. package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
  496. package/dist/agent-src/skills/alerting-doctrine/evals/triggers.json +0 -17
  497. package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
  498. package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
  499. package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
  500. package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
  501. package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
  502. package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
  503. package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
  504. package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
  505. package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
  506. package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
  507. package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
  508. package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
  509. package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
  510. package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
  511. package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
  512. package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
  513. package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
  514. package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
  515. package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
  516. package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
  517. package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
  518. package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
  519. package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
  520. package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
  521. package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
  522. package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
  523. package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
  524. package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
  525. package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
  526. package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
  527. package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
  528. package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
  529. package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
  530. package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
  531. package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
  532. package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
  533. package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
  534. package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
  535. package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
  536. package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
  537. package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
  538. package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
  539. package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -67
  540. package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
  541. package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
  542. package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
  543. package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
  544. package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
  545. package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
  546. package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
  547. package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
  548. package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
  549. package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
  550. package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
  551. package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
  552. package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
  553. package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
  554. package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
  555. package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
  556. package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
  557. package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
  558. package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
  559. package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
  560. package/dist/agent-src/skills/js-library-packaging/evals/triggers.json +0 -17
  561. package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
  562. package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
  563. package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
  564. package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
  565. package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
  566. package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
  567. package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
  568. package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
  569. package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
  570. package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
  571. package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
  572. package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
  573. package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
  574. package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
  575. package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
  576. package/dist/agent-src/skills/monorepo-workspace/evals/triggers.json +0 -17
  577. package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
  578. package/dist/agent-src/skills/operational-readiness/evals/triggers.json +0 -17
  579. package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
  580. package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
  581. package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
  582. package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
  583. package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
  584. package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
  585. package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
  586. package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
  587. package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
  588. package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
  589. package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
  590. package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
  591. package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
  592. package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
  593. package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
  594. package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
  595. package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
  596. package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
  597. package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
  598. package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
  599. package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
  600. package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
  601. package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
  602. package/dist/agent-src/skills/server-hardening/evals/triggers.json +0 -17
  603. package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
  604. package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
  605. package/dist/agent-src/skills/storybook-workshop/evals/triggers.json +0 -17
  606. package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
  607. package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
  608. package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
  609. package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
  610. package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
  611. package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
  612. package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
  613. package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
  614. package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
  615. package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
  616. package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
  617. package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
  618. package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
  619. package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
  620. package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
  621. package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
  622. package/dist/agent-src/skills/workspace-link/evals/triggers.json +0 -17
  623. package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
  624. package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
  625. package/dist/cli/agent-config.js.map +0 -1
  626. package/dist/cli/bash/runBash.js.map +0 -1
  627. package/dist/cli/commands/commands.js.map +0 -1
  628. package/dist/cli/commands/config.js.map +0 -1
  629. package/dist/cli/commands/doctorShell.js.map +0 -1
  630. package/dist/cli/commands/mcpServer.js.map +0 -1
  631. package/dist/cli/commands/packs.js.map +0 -1
  632. package/dist/cli/commands/profiles.js.map +0 -1
  633. package/dist/cli/commands/recordTriggerEval.js.map +0 -1
  634. package/dist/cli/commands/rtkDetect.js.map +0 -1
  635. package/dist/cli/commands/settings.js.map +0 -1
  636. package/dist/cli/commands/uiAudit.js.map +0 -1
  637. package/dist/cli/commands/uiRender.js.map +0 -1
  638. package/dist/cli/commands/uiServe.js.map +0 -1
  639. package/dist/cli/commands/versions.js.map +0 -1
  640. package/dist/cli/commands/workspaces.js.map +0 -1
  641. package/dist/cli/configRoot.js.map +0 -1
  642. package/dist/cli/discovery/loadManifest.js.map +0 -1
  643. package/dist/cli/firstRunNotice.js.map +0 -1
  644. package/dist/cli/help.js.map +0 -1
  645. package/dist/cli/initRouting.js.map +0 -1
  646. package/dist/cli/log/logger.js.map +0 -1
  647. package/dist/cli/main.js.map +0 -1
  648. package/dist/cli/mcp/content.js.map +0 -1
  649. package/dist/cli/mcp/dispatch.js.map +0 -1
  650. package/dist/cli/mcp/stdio.js.map +0 -1
  651. package/dist/cli/paths.js.map +0 -1
  652. package/dist/cli/python/knowledge_ingest.js.map +0 -1
  653. package/dist/cli/python/workspace_analytics.js.map +0 -1
  654. package/dist/cli/python/workspace_crypto.js.map +0 -1
  655. package/dist/cli/python/workspace_documents.js.map +0 -1
  656. package/dist/cli/python/workspace_drive.js.map +0 -1
  657. package/dist/cli/python/workspace_drive_health.js.map +0 -1
  658. package/dist/cli/python/workspace_explain.js.map +0 -1
  659. package/dist/cli/python/workspace_hosts.js.map +0 -1
  660. package/dist/cli/python/workspace_inbox.js.map +0 -1
  661. package/dist/cli/python/workspace_render.js.map +0 -1
  662. package/dist/cli/python/workspace_roles.js.map +0 -1
  663. package/dist/cli/python/workspace_secrets.js.map +0 -1
  664. package/dist/cli/python/workspace_sessions.js.map +0 -1
  665. package/dist/cli/python/workspace_skills.js.map +0 -1
  666. package/dist/cli/registry.js.map +0 -1
  667. package/dist/install/agentSwitchDetection.js.map +0 -1
  668. package/dist/install/agentSwitchProfile.js.map +0 -1
  669. package/dist/install/atomic.js.map +0 -1
  670. package/dist/install/claudePathsPlan.js.map +0 -1
  671. package/dist/install/conflict.js.map +0 -1
  672. package/dist/install/detect.js.map +0 -1
  673. package/dist/install/emit_host_rules_cli.js.map +0 -1
  674. package/dist/install/globalRuleLayers.js.map +0 -1
  675. package/dist/install/hostLayerFingerprint.js.map +0 -1
  676. package/dist/install/partitionEligibility.js.map +0 -1
  677. package/dist/install/paths.js.map +0 -1
  678. package/dist/install/plan.js.map +0 -1
  679. package/dist/install/preflight.js.map +0 -1
  680. package/dist/install/rtkDetection.js.map +0 -1
  681. package/dist/install/ruleInScope.js.map +0 -1
  682. package/dist/install/ruleLayerPartition.js.map +0 -1
  683. package/dist/install/rule_scope.js.map +0 -1
  684. package/dist/install/rule_scope_cli.js.map +0 -1
  685. package/dist/install/selectedTools.js.map +0 -1
  686. package/dist/install/toolDetection.js.map +0 -1
  687. package/dist/install/txlog.js.map +0 -1
  688. package/dist/install/types.js.map +0 -1
  689. package/dist/install/wizard-plan.js.map +0 -1
  690. package/dist/install/wizardDismissals.js.map +0 -1
  691. package/dist/scripts/_lib/agent_settings.js.map +0 -1
  692. package/dist/scripts/_lib/agent_src.js.map +0 -1
  693. package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
  694. package/dist/scripts/_lib/claude_plugin.js.map +0 -1
  695. package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
  696. package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
  697. package/dist/scripts/_lib/environment_detector.js.map +0 -1
  698. package/dist/scripts/_lib/host_launch.js.map +0 -1
  699. package/dist/scripts/_lib/install_layout.js.map +0 -1
  700. package/dist/scripts/_lib/installed_lock.js.map +0 -1
  701. package/dist/scripts/_lib/lean_projection_mode.js.map +0 -1
  702. package/dist/scripts/_lib/model_tier.js.map +0 -1
  703. package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
  704. package/dist/scripts/_lib/scoped_projection.js.map +0 -1
  705. package/dist/scripts/_lib/script_output.js.map +0 -1
  706. package/dist/scripts/_lib/spawn_env.js.map +0 -1
  707. package/dist/scripts/_lib/surface_tiers.js.map +0 -1
  708. package/dist/scripts/_lib/token_count.js.map +0 -1
  709. package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
  710. package/dist/scripts/_lib/ui_surface.js.map +0 -1
  711. package/dist/scripts/_lib/user_global_paths.js.map +0 -1
  712. package/dist/scripts/ai_council/modes.js.map +0 -1
  713. package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
  714. package/dist/scripts/condense.js.map +0 -1
  715. package/dist/scripts/project_thin_rules.js.map +0 -1
  716. package/dist/server/app.js.map +0 -1
  717. package/dist/server/io/atomicMultiWrite.js.map +0 -1
  718. package/dist/server/io/atomicWrite.js.map +0 -1
  719. package/dist/server/io/sharedWriteCheck.js.map +0 -1
  720. package/dist/server/io/substituteTemplate.js.map +0 -1
  721. package/dist/server/io/yamlIO.js.map +0 -1
  722. package/dist/server/nicknameResolver.js.map +0 -1
  723. package/dist/server/port.js.map +0 -1
  724. package/dist/server/routes/discovery.js.map +0 -1
  725. package/dist/server/routes/install.js.map +0 -1
  726. package/dist/server/routes/ping.js.map +0 -1
  727. package/dist/server/routes/schema.js.map +0 -1
  728. package/dist/server/routes/settings.js.map +0 -1
  729. package/dist/server/routes/settingsChanges.js.map +0 -1
  730. package/dist/server/routes/userMd.js.map +0 -1
  731. package/dist/server/routes/wizard.js.map +0 -1
  732. package/dist/server/routes/workspace.js.map +0 -1
  733. package/dist/server/schemas/settings.js.map +0 -1
  734. package/dist/server/serverInfo.js.map +0 -1
  735. package/dist/server/token.js.map +0 -1
  736. package/dist/server/writeRoot.js.map +0 -1
  737. package/dist/shared/capabilities.js.map +0 -1
  738. package/dist/shared/interactiveContext.js.map +0 -1
  739. package/dist/shared/nicknamePrefill.js.map +0 -1
  740. package/dist/shared/settingsAsks.js.map +0 -1
  741. package/dist/shared/settingsCarveOut.js.map +0 -1
  742. package/dist/shared/settingsClasses.js.map +0 -1
  743. package/dist/shared/settingsConsent.js.map +0 -1
  744. package/dist/shared/settingsSurface.js.map +0 -1
  745. package/dist/shared/skillRanking.js.map +0 -1
  746. package/dist/shared/userMd/formAdapter.js.map +0 -1
  747. package/dist/shared/userMd/schema.js.map +0 -1
  748. package/dist/shared/userMd/utils.js.map +0 -1
  749. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
  750. package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
  751. package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
  752. package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
  753. package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
  754. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
  755. package/src/scripts/_lib/secret_detector.test.ts +0 -108
  756. package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
  757. package/src/scripts/_lib/ui_authority.test.ts +0 -251
  758. package/src/scripts/_lib/untrusted_content.test.ts +0 -175
  759. package/src/scripts/check_secret_leak.test.ts +0 -90
  760. package/src/scripts/design_slop_rules.test.ts +0 -246
  761. package/src/scripts/self_review_gate.test.ts +0 -296
  762. package/src/shared/capabilities.test.ts +0 -43
@@ -0,0 +1,279 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * The unblocked-ask rate — the class `user-interaction` measured and then had
4
+ * no instrument for.
5
+ *
6
+ * ## Why this one, and not one of the other 55
7
+ *
8
+ * `road-to-undeclared-obligation-disposition` Phase 2.1 ranks the
9
+ * `cheaply-probeable` bucket by MEASURED failure rather than by feel, and the
10
+ * ranking is lopsided: of 56 rules in that bucket, exactly **one** carries a
11
+ * cited measurement of its own failure. `user-interaction.md:75` records a
12
+ * 30-session conformance audit in which **every** malformed ask was a one-line
13
+ * parenthetical or a trailing free-text offer, and states that **no gate ships**
14
+ * for that class because `check_reply_consistency` inspects numbered-option
15
+ * blocks — "exactly the surface that did not fail".
16
+ *
17
+ * That is the whole case for building this and not a fourth probe. Phase 2.3
18
+ * caps the roadmap at one.
19
+ *
20
+ * ## What is counted
21
+ *
22
+ * A **hand-back** assistant turn — one immediately followed by a genuine user
23
+ * turn, i.e. where the agent actually stopped — that HANDS A DECISION and
24
+ * carries **no** numbered-options block. The rule's own § "The trigger is a
25
+ * decision, not a format" says the obligation fires on handing a decision in any
26
+ * form, so a trailing offer is an ask and owes a recommendation line.
27
+ *
28
+ * Of those, an ask is **malformed** when no recommendation line follows it.
29
+ *
30
+ * ## Honest bounds, and they are wide
31
+ *
32
+ * 1. **"Hands a decision" is a heuristic.** It matches offer shapes — *"soll ich
33
+ * …?"*, *"shall I …?"*, *"sag Bescheid, wenn …"*, *"willst du …?"* — anchored
34
+ * in the closing lines. A genuine clarifying question is deliberately NOT
35
+ * excluded, because `user-interaction` treats a bare yes/no as an ask too.
36
+ * Some rhetorical questions will be counted. The rate is therefore a
37
+ * CEILING for malformed asks of this class, not a point estimate.
38
+ * 2. **Turns WITH a numbered block are excluded**, not judged. That surface
39
+ * already has `check_reply_consistency`; measuring it here would double-count
40
+ * a covered class and hide the uncovered one.
41
+ * 3. **A recommendation line is matched on the label**, `Recommendation:` or
42
+ * `Empfehlung:` (with or without emphasis). A recommendation phrased without
43
+ * the label reads as malformed here. The rule requires the label — a
44
+ * wrong-language label is explicitly "no recommendation" — so this is the
45
+ * rule's own bar, but it is a bar on FORM.
46
+ *
47
+ * Both edges are printed. A reader who cannot see the bracket cannot judge the
48
+ * number.
49
+ *
50
+ * Usage:
51
+ * ./scripts-run src/scripts/probe_unblocked_ask [--limit N] [--store PATH] [--json]
52
+ * ./scripts-run src/scripts/probe_unblocked_ask --self-test
53
+ *
54
+ * Exit codes: 0 always — a measurement, not a gate. `--self-test` exits 1 when
55
+ * the detector fails to fire on its fixtures.
56
+ */
57
+ import fs from 'node:fs';
58
+ import path from 'node:path';
59
+ import { pathToFileURL } from 'node:url';
60
+
61
+ import { defaultStore, HARNESS_TEXT, isInjectedBody } from './conformance_scan.js';
62
+ import { isSyntheticPrompt } from './_lib/prompt_shape.js';
63
+
64
+ /** A numbered-options block — the surface `check_reply_consistency` already reads. */
65
+ export const NUMBERED_BLOCK = /^\s{0,3}(\d+)[.)]\s+\S/m;
66
+
67
+ /** The recommendation line, matched on its label. Either language. */
68
+ export const RECOMMENDATION = /^\s{0,3}\**\s*(Recommendation|Empfehlung)\s*:?\**/im;
69
+
70
+ /**
71
+ * Offer shapes that hand a decision without a block. Every one of these is a
72
+ * shape the 2026-08-06 audit found in a REAL malformed ask.
73
+ */
74
+ export const OFFER_SHAPES: readonly RegExp[] = [
75
+ /\bsoll(en)? ich\b[^.!?]{0,120}\?/i,
76
+ /\bwillst du\b[^.!?]{0,120}\?/i,
77
+ /\bm(ö|oe)chtest du\b[^.!?]{0,120}\?/i,
78
+ /\bsag (mir )?bescheid,? (wenn|ob|falls)\b/i,
79
+ /\bwenn du (willst|m(ö|oe)chtest),? (dann )?(mache|kann|nehme|ziehe)\b/i,
80
+ /\bshall i\b[^.!?]{0,120}\?/i,
81
+ /\bshould i\b[^.!?]{0,120}\?/i,
82
+ /\bdo you want me to\b[^.!?]{0,120}\?/i,
83
+ /\bwould you like me to\b[^.!?]{0,120}\?/i,
84
+ /\blet me know (if|whether)\b/i,
85
+ ];
86
+
87
+ interface Turn {
88
+ role: 'user' | 'assistant';
89
+ text: string;
90
+ at: string;
91
+ }
92
+
93
+ function turns(lines: string[]): Turn[] {
94
+ const out: Turn[] = [];
95
+ for (const line of lines) {
96
+ if (!line.trim()) continue;
97
+ let e: Record<string, unknown>;
98
+ try {
99
+ e = JSON.parse(line) as Record<string, unknown>;
100
+ } catch {
101
+ continue;
102
+ }
103
+ if (e['isSidechain'] === true) continue;
104
+ if (e['type'] === 'user' && e['toolUseResult'] !== undefined) continue;
105
+ if (e['isCompactSummary'] === true) continue;
106
+ const msg = e['message'] as { role?: string; content?: unknown } | undefined;
107
+ const role = msg?.role;
108
+ if (role !== 'user' && role !== 'assistant') continue;
109
+ const c = msg?.content;
110
+ const text =
111
+ typeof c === 'string'
112
+ ? c
113
+ : Array.isArray(c)
114
+ ? c
115
+ .filter((b: { type?: string }) => b?.type === 'text')
116
+ .map((b: { text?: string }) => b.text ?? '')
117
+ .join('\n')
118
+ : '';
119
+ if (!text.trim()) continue;
120
+ if (role === 'assistant' && HARNESS_TEXT.test(text.trim())) continue;
121
+ if (role === 'user' && (isSyntheticPrompt(text) || isInjectedBody(text))) continue;
122
+ out.push({ role, text, at: String(e['timestamp'] ?? '') });
123
+ }
124
+ return out;
125
+ }
126
+
127
+ export interface AskVerdict {
128
+ /** The turn hands a decision with no numbered block. */
129
+ unblockedAsk: boolean;
130
+ /** …and carries no recommendation label. */
131
+ malformed: boolean;
132
+ }
133
+
134
+ /** Classify one assistant hand-back's closing lines. */
135
+ export function classifyTail(tail: string): AskVerdict {
136
+ if (NUMBERED_BLOCK.test(tail)) return { unblockedAsk: false, malformed: false };
137
+ const offers = OFFER_SHAPES.some((re) => re.test(tail));
138
+ if (!offers) return { unblockedAsk: false, malformed: false };
139
+ return { unblockedAsk: true, malformed: !RECOMMENDATION.test(tail) };
140
+ }
141
+
142
+ export interface Result {
143
+ handbacks: number;
144
+ withBlock: number;
145
+ unblockedAsks: number;
146
+ malformed: number;
147
+ samples: { session: string; at: string; span: string }[];
148
+ }
149
+
150
+ export function measure(store: string, limit: number): Result {
151
+ const r: Result = { handbacks: 0, withBlock: 0, unblockedAsks: 0, malformed: 0, samples: [] };
152
+ let files: string[];
153
+ try {
154
+ files = fs.readdirSync(store).filter((f) => f.endsWith('.jsonl'));
155
+ } catch {
156
+ return r;
157
+ }
158
+ const ordered = files
159
+ .map((f) => ({ f, m: fs.statSync(path.join(store, f)).mtimeMs }))
160
+ .sort((a, b) => b.m - a.m)
161
+ .slice(0, limit)
162
+ .map((x) => x.f);
163
+
164
+ for (const f of ordered) {
165
+ const session = f.replace(/\.jsonl$/, '').slice(0, 8);
166
+ const ts = turns(fs.readFileSync(path.join(store, f), 'utf8').split('\n'));
167
+ for (let i = 0; i < ts.length; i += 1) {
168
+ const t = ts[i] as Turn;
169
+ if (t.role !== 'assistant') continue;
170
+ const next = ts[i + 1];
171
+ if (next !== undefined && next.role !== 'user') continue;
172
+ r.handbacks += 1;
173
+ // Closing lines only: an offer buried mid-reply is not the hand-back.
174
+ const tail = t.text.trimEnd().split('\n').slice(-8).join('\n');
175
+ if (NUMBERED_BLOCK.test(tail)) {
176
+ r.withBlock += 1;
177
+ continue;
178
+ }
179
+ const v = classifyTail(tail);
180
+ if (!v.unblockedAsk) continue;
181
+ r.unblockedAsks += 1;
182
+ if (v.malformed) {
183
+ r.malformed += 1;
184
+ if (r.samples.length < 5) {
185
+ const hit = OFFER_SHAPES.find((re) => re.test(tail));
186
+ r.samples.push({
187
+ session,
188
+ at: t.at,
189
+ span: (tail.match(hit as RegExp)?.[0] ?? '').slice(0, 110),
190
+ });
191
+ }
192
+ }
193
+ }
194
+ }
195
+ return r;
196
+ }
197
+
198
+ /**
199
+ * Prove the detector fires, and prove it stays silent where it must.
200
+ *
201
+ * An instrument never seen fire has unknown sensitivity — and one that fires on
202
+ * everything measures nothing, which is why the negative cases are here too.
203
+ */
204
+ export function selfTest(): number {
205
+ const cases: Array<[string, string, boolean, boolean]> = [
206
+ ['a trailing German offer with no recommendation', 'Fertig.\n\nSag Bescheid, wenn ich die drei Zeilen mitnehmen soll.', true, true],
207
+ ['a bare yes/no offer', 'Der Branch ist grün.\n\nSoll ich das so umsetzen?', true, true],
208
+ ['an English trailing offer', 'Done.\n\nLet me know if you want the second half too.', true, true],
209
+ ['an offer WITH a recommendation label', 'Soll ich das so umsetzen?\n\n**Empfehlung:** ja, es ist reversibel.', true, false],
210
+ ['a numbered block is excluded — another gate reads it', '1. do it\n2. skip it\n\nRecommendation: 1', false, false],
211
+ ['an ordinary statement hands nothing', 'Fixed the schema lint; force-pushed b17c4ef8.', false, false],
212
+ ['a question about the code is not an offer to act', 'Why does this function take a callback?', false, false],
213
+ ];
214
+ let failed = 0;
215
+ for (const [name, tail, wantAsk, wantMalformed] of cases) {
216
+ const v = classifyTail(tail);
217
+ const ok = v.unblockedAsk === wantAsk && v.malformed === wantMalformed;
218
+ process.stdout.write(
219
+ `${ok ? '✅' : '❌'} ${name} — ask=${String(v.unblockedAsk)} malformed=${String(v.malformed)}` +
220
+ (ok ? '\n' : ` (wanted ask=${String(wantAsk)} malformed=${String(wantMalformed)})\n`),
221
+ );
222
+ if (!ok) failed += 1;
223
+ }
224
+ const positives = cases.filter((c) => c[3]).length;
225
+ if (positives < 3) {
226
+ process.stderr.write('❌ probe_unblocked_ask --self-test: fewer than 3 positive cases — a truncated suite must fail.\n');
227
+ return 1;
228
+ }
229
+ process.stdout.write(
230
+ `\nprobe_unblocked_ask --self-test: ${String(cases.length - failed)}/${String(cases.length)} case(s) behaved ` +
231
+ `(${String(positives)} positive, ${String(cases.length - positives)} negative)\n`,
232
+ );
233
+ return failed > 0 ? 1 : 0;
234
+ }
235
+
236
+ export function main(argv: string[]): number {
237
+ let limit = 60;
238
+ let storeArg: string | null = null;
239
+ let json = false;
240
+ for (let i = 0; i < argv.length; i += 1) {
241
+ const a = argv[i] as string;
242
+ if (a === '--limit') limit = Number(argv[++i]);
243
+ else if (a === '--store') storeArg = String(argv[++i]);
244
+ else if (a === '--json') json = true;
245
+ // --self-test runs BEFORE the store is resolved: the fixtures are
246
+ // in-process, and resolving a transcript store that may not exist here
247
+ // would make the sensitivity proof depend on the host having one.
248
+ else if (a === '--self-test') return selfTest();
249
+ else {
250
+ process.stderr.write(`probe_unblocked_ask: unrecognized argument: ${a}\n`);
251
+ return 0;
252
+ }
253
+ }
254
+ const store = storeArg ?? defaultStore(process.cwd());
255
+ const r = measure(store, limit);
256
+ if (json) {
257
+ process.stdout.write(`${JSON.stringify(r, null, 2)}\n`);
258
+ return 0;
259
+ }
260
+ const pct = (n: number, d: number): string => (d === 0 ? 'n/a' : `${((100 * n) / d).toFixed(1)}%`);
261
+ process.stdout.write(
262
+ `probe_unblocked_ask · ${String(limit)} most recent session(s) under ${store}\n` +
263
+ ` hand-back turns ${String(r.handbacks)}\n` +
264
+ ` …with a numbered block ${String(r.withBlock)} (excluded — check_reply_consistency reads that surface)\n` +
265
+ ` …unblocked asks ${String(r.unblockedAsks)} ${pct(r.unblockedAsks, r.handbacks)} of hand-backs\n` +
266
+ ` …of those, malformed ${String(r.malformed)} ${pct(r.malformed, r.unblockedAsks)} of unblocked asks\n` +
267
+ '\n CEILING, not a point estimate: "hands a decision" is a heuristic and a\n' +
268
+ ' rhetorical question can match it. A recommendation is matched on its LABEL,\n' +
269
+ ' which is the rule\'s own bar but a bar on form.\n',
270
+ );
271
+ for (const s of r.samples) {
272
+ process.stdout.write(` · ${s.session} ${s.at}: ${s.span}\n`);
273
+ }
274
+ return 0;
275
+ }
276
+
277
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
278
+ process.exit(main(process.argv.slice(2)));
279
+ }
@@ -617,7 +617,7 @@ export function render(quiet = false): number {
617
617
  const parts = [
618
618
  '# Package-Impact A/B Benchmark',
619
619
  '',
620
- '> Generated by `scripts/render_benchmark_md.py`. Source of truth: ' +
620
+ '> Generated by `render_benchmark_md`. Do not edit. Source of truth: ' +
621
621
  '`internal/bench/reports/ab/`. Re-render anytime with `task bench:ab:diff`.',
622
622
  '',
623
623
  render_headline(trackA, trackB, trackBRdp),
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Branch-vs-base packed-payload delta — make accretion legible while it is small.
4
+ *
5
+ * WHY, and this is the whole argument: the 2026-08-24 cap trip was a **merge
6
+ * artifact**. `origin/main` measured 8.3911 and the branch 8.4305, against a cap
7
+ * of 8.4 — *neither side was over alone*, and together they crossed. No
8
+ * per-branch absolute check can see that shape, which is why the cap had to be
9
+ * re-baselined rather than the payload fixed. `check_pack_size` answers "is the
10
+ * total under the cap"; this answers "how much did THIS branch add", which is
11
+ * the number that would have made the accretion visible four raises ago.
12
+ *
13
+ * It is a REPORT, not a gate. It prints a delta and exits 0 whatever the number,
14
+ * because a threshold here would be a second cap with no derivation behind it
15
+ * and the absolute cap already owns the refusal. `--fail-over <MB>` exists for a
16
+ * caller that wants one, and is deliberately not wired into CI.
17
+ *
18
+ * Measurement matches `pack-size-budget.json`'s documented conditions exactly —
19
+ * `npm pack --dry-run --json --ignore-scripts` on an unbuilt tree — because a
20
+ * delta between two figures measured differently is noise. Both sides are
21
+ * measured in throwaway detached worktrees for the same reason: a built working
22
+ * tree reads ~2 MB high, which the budget file records as a trap its own method
23
+ * invites.
24
+ *
25
+ * ```bash
26
+ * report_pack_delta # vs origin/main
27
+ * report_pack_delta --base origin/main --head HEAD
28
+ * report_pack_delta --json
29
+ * report_pack_delta --markdown # a PR-comment / step-summary block
30
+ * ```
31
+ *
32
+ * Exit codes: 0 = reported · 2 = could not measure (a missing ref, a failed
33
+ * pack). Never non-zero for a large delta unless `--fail-over` says so.
34
+ */
35
+ import * as fs from 'node:fs';
36
+ import * as os from 'node:os';
37
+ import * as path from 'node:path';
38
+ import { spawnSync } from 'node:child_process';
39
+ import { fileURLToPath, pathToFileURL } from 'node:url';
40
+
41
+ const _FILE = fileURLToPath(import.meta.url);
42
+ const REPO = path.resolve(path.dirname(_FILE), '..', '..');
43
+
44
+ export interface Side {
45
+ readonly ref: string;
46
+ readonly packedBytes: number;
47
+ readonly unpackedBytes: number;
48
+ readonly entries: number;
49
+ }
50
+
51
+ export interface Delta {
52
+ readonly base: Side;
53
+ readonly head: Side;
54
+ readonly packedDeltaBytes: number;
55
+ readonly entryDelta: number;
56
+ readonly capMb: number | null;
57
+ readonly headroomBytes: number | null;
58
+ }
59
+
60
+ const run = (cmd: string, args: readonly string[], cwd: string): { code: number; out: string; err: string } => {
61
+ const r = spawnSync(cmd, [...args], {
62
+ cwd,
63
+ encoding: 'utf8',
64
+ timeout: 600_000,
65
+ maxBuffer: 64 * 1024 * 1024,
66
+ });
67
+ return { code: r.status ?? 1, out: r.stdout ?? '', err: r.stderr ?? '' };
68
+ };
69
+
70
+ /** Measure one ref in a throwaway detached worktree, unbuilt. */
71
+ export function measure(ref: string): Side {
72
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ac-pack-delta-'));
73
+ const tree = path.join(dir, 'tree');
74
+ try {
75
+ const add = run('git', ['worktree', 'add', '--quiet', '--detach', tree, ref], REPO);
76
+ if (add.code !== 0) throw new Error(`cannot check out ${ref}: ${add.err.trim()}`);
77
+ const packed = run('npm', ['pack', '--dry-run', '--json', '--ignore-scripts'], tree);
78
+ if (packed.code !== 0) throw new Error(`npm pack failed for ${ref}: ${packed.err.slice(-600)}`);
79
+ const start = packed.out.indexOf('[');
80
+ if (start === -1) throw new Error(`npm pack produced no JSON for ${ref}`);
81
+ const meta = JSON.parse(packed.out.slice(start)) as Array<{
82
+ size: number;
83
+ unpackedSize: number;
84
+ entryCount: number;
85
+ }>;
86
+ const m = meta[0];
87
+ if (m === undefined) throw new Error(`npm pack produced no entry for ${ref}`);
88
+ return { ref, packedBytes: m.size, unpackedBytes: m.unpackedSize, entries: m.entryCount };
89
+ } finally {
90
+ run('git', ['worktree', 'remove', '--force', tree], REPO);
91
+ fs.rmSync(dir, { recursive: true, force: true });
92
+ }
93
+ }
94
+
95
+ function readCap(): number | null {
96
+ try {
97
+ const raw = fs.readFileSync(path.join(REPO, 'src', 'config', 'pack-size-budget.json'), 'utf8');
98
+ const d = JSON.parse(raw) as { budgets?: { packed_size_mb?: { max?: number } } };
99
+ const max = d.budgets?.packed_size_mb?.max;
100
+ return typeof max === 'number' ? max : null;
101
+ } catch {
102
+ return null;
103
+ }
104
+ }
105
+
106
+ export function delta(baseRef: string, headRef: string): Delta {
107
+ const base = measure(baseRef);
108
+ const head = measure(headRef);
109
+ const capMb = readCap();
110
+ return {
111
+ base,
112
+ head,
113
+ packedDeltaBytes: head.packedBytes - base.packedBytes,
114
+ entryDelta: head.entries - base.entries,
115
+ capMb,
116
+ headroomBytes: capMb === null ? null : Math.round(capMb * 1e6 - head.packedBytes),
117
+ };
118
+ }
119
+
120
+ const kb = (n: number): string => `${(n / 1024).toFixed(1)} KB`;
121
+ const mb = (n: number): string => `${(n / 1e6).toFixed(4)} MB`;
122
+ const signed = (n: number): string => `${n >= 0 ? '+' : '−'}${kb(Math.abs(n))}`;
123
+
124
+ export function markdown(d: Delta): string {
125
+ const dir = d.packedDeltaBytes === 0 ? 'unchanged' : d.packedDeltaBytes > 0 ? 'grew' : 'shrank';
126
+ const lines = [
127
+ `**Packed payload ${dir}: ${signed(d.packedDeltaBytes)}**`,
128
+ '',
129
+ '| | packed | entries |',
130
+ '|---|---|---|',
131
+ `| base \`${d.base.ref}\` | ${mb(d.base.packedBytes)} | ${d.base.entries} |`,
132
+ `| head \`${d.head.ref}\` | ${mb(d.head.packedBytes)} | ${d.head.entries} |`,
133
+ `| delta | **${signed(d.packedDeltaBytes)}** | ${d.entryDelta >= 0 ? '+' : ''}${d.entryDelta} |`,
134
+ ];
135
+ if (d.capMb !== null && d.headroomBytes !== null) {
136
+ lines.push(
137
+ '',
138
+ `Cap ${d.capMb} MB · headroom after this branch **${kb(d.headroomBytes)}**.`,
139
+ '',
140
+ '<sub>Measured `npm pack --dry-run --ignore-scripts` on unbuilt detached worktrees of both refs — the ' +
141
+ 'conditions `pack-size-budget.json` documents. A report, not a gate: the absolute cap owns the refusal. ' +
142
+ 'This line exists because the 2026-08-24 trip was a MERGE artifact — neither side was over alone.</sub>',
143
+ );
144
+ }
145
+ return lines.join('\n');
146
+ }
147
+
148
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
149
+ const arg = (name: string, dflt: string): string => {
150
+ const i = argv.indexOf(name);
151
+ return i !== -1 && argv[i + 1] !== undefined ? (argv[i + 1] as string) : dflt;
152
+ };
153
+ const baseRef = arg('--base', 'origin/main');
154
+ const headRef = arg('--head', 'HEAD');
155
+ const failOver = arg('--fail-over', '');
156
+
157
+ let d: Delta;
158
+ try {
159
+ d = delta(baseRef, headRef);
160
+ } catch (exc) {
161
+ process.stderr.write(`report_pack_delta: ${String(exc)}\n`);
162
+ return 2;
163
+ }
164
+
165
+ if (argv.includes('--json')) {
166
+ process.stdout.write(`${JSON.stringify(d, null, 2)}\n`);
167
+ } else if (argv.includes('--markdown')) {
168
+ process.stdout.write(`${markdown(d)}\n`);
169
+ } else {
170
+ process.stdout.write(
171
+ `pack delta ${baseRef} → ${headRef}: ${signed(d.packedDeltaBytes)} ` +
172
+ `(${mb(d.base.packedBytes)} → ${mb(d.head.packedBytes)}, ` +
173
+ `${d.entryDelta >= 0 ? '+' : ''}${d.entryDelta} entries)\n`,
174
+ );
175
+ if (d.capMb !== null && d.headroomBytes !== null) {
176
+ process.stdout.write(` cap ${d.capMb} MB · headroom ${kb(d.headroomBytes)}\n`);
177
+ }
178
+ }
179
+ // `scanned:` per the gate-coverage contract — two refs is what it inspected.
180
+ process.stdout.write('scanned: 2\n');
181
+
182
+ if (failOver !== '') {
183
+ const limit = Number(failOver) * 1e6;
184
+ if (Number.isFinite(limit) && d.packedDeltaBytes > limit) {
185
+ process.stderr.write(`report_pack_delta: delta ${kb(d.packedDeltaBytes)} exceeds --fail-over ${failOver} MB\n`);
186
+ return 1;
187
+ }
188
+ }
189
+ return 0;
190
+ }
191
+
192
+ function _isCliEntry(): boolean {
193
+ const a = process.argv[1];
194
+ if (!a) return false;
195
+ if (a === _FILE || pathToFileURL(path.resolve(a)).href === import.meta.url) return true;
196
+ try {
197
+ return fs.realpathSync(a) === fs.realpathSync(_FILE);
198
+ } catch {
199
+ return false;
200
+ }
201
+ }
202
+ if (_isCliEntry()) process.exit(main());
203
+
204
+ export { REPO };
@@ -58,6 +58,7 @@ import * as fs from 'node:fs';
58
58
  import * as path from 'node:path';
59
59
  import { fileURLToPath, pathToFileURL } from 'node:url';
60
60
 
61
+ import { isExclusivelyPackageOnly } from '../install/partitionEligibility.js';
61
62
  import { _claude_paths_plan, _has_non_path_trigger, _parse_frontmatter } from './condense.js';
62
63
 
63
64
  const RULES_DIR = path.join('src', 'rules');
@@ -83,6 +84,13 @@ export interface RuleActivation {
83
84
  emitted_globs: string[];
84
85
  /** Patterns the emitter deliberately drops, with the reason it records. */
85
86
  dropped: { pattern: string; reason: string }[];
87
+ /**
88
+ * Scoped to this package alone, so ADR-236 withholds it from every global
89
+ * host layer. Load-bearing for the projection comparison: a package-only
90
+ * rule is counted by the source verdict and is absent from a delivered
91
+ * tree by design, not by drift.
92
+ */
93
+ package_only: boolean;
86
94
  /**
87
95
  * The emitter's verdict in one word.
88
96
  * `scoped` — loads on a path match · `unconditional` — loads every session ·
@@ -111,7 +119,11 @@ function _declares(meta: Record<string, unknown>, keys: readonly string[]): bool
111
119
  }
112
120
 
113
121
  /** Classify one rule file through the emitter's own exported decision path. */
114
- export function classify_rule(id: string, content: string): RuleActivation {
122
+ export function classify_rule(
123
+ id: string,
124
+ content: string,
125
+ package_only = false,
126
+ ): RuleActivation {
115
127
  const [meta] = _parse_frontmatter(content);
116
128
  const plan = _claude_paths_plan(meta);
117
129
  const has_path_trigger = _declares(meta, PATH_TRIGGER_KEYS);
@@ -139,6 +151,7 @@ export function classify_rule(id: string, content: string): RuleActivation {
139
151
  emitted_globs: plan.globs,
140
152
  dropped: plan.dropped.map((d) => ({ pattern: d.pattern, reason: d.reason })),
141
153
  verdict,
154
+ package_only,
142
155
  };
143
156
  }
144
157
 
@@ -150,7 +163,11 @@ export function census(root: string): RuleActivation[] {
150
163
  .map((e) => e.name)
151
164
  .sort();
152
165
  return files.map((f) =>
153
- classify_rule(f.replace(/\.md$/, ''), fs.readFileSync(path.join(dir, f), 'utf8')),
166
+ classify_rule(
167
+ f.replace(/\.md$/, ''),
168
+ fs.readFileSync(path.join(dir, f), 'utf8'),
169
+ isExclusivelyPackageOnly(path.join(dir, f)),
170
+ ),
154
171
  );
155
172
  }
156
173
 
@@ -223,10 +240,14 @@ export function main(): number {
223
240
 
224
241
  const rows = census(root);
225
242
  const sum = summarize(rows);
243
+ const resolved_projection_dir =
244
+ projection_dir === undefined || projection_dir === null || projection_dir === ''
245
+ ? ''
246
+ : path.isAbsolute(projection_dir)
247
+ ? projection_dir
248
+ : path.join(root, projection_dir);
226
249
  const projection = projection_dir
227
- ? projection_reading(path.isAbsolute(projection_dir)
228
- ? projection_dir
229
- : path.join(root, projection_dir))
250
+ ? projection_reading(resolved_projection_dir)
230
251
  : null;
231
252
 
232
253
  if (as_json) {
@@ -259,11 +280,51 @@ export function main(): number {
259
280
  `\n host projection at ${projection_dir} — reported SEPARATELY, not merged:\n` +
260
281
  ` files ${projection.files} · declaring paths: ${projection.with_paths}\n`,
261
282
  );
262
- if (projection.with_paths !== sum.scoped) {
283
+ // The source verdict counts EVERY rule in `src/rules/`. A GLOBAL host
284
+ // layer does not carry the package-only ones: ADR-236 partitions them to
285
+ // the project layer, so such a tree is expected to be short by exactly
286
+ // that many. Comparing the raw counts reported a divergence on every
287
+ // partitioned install forever — the emitter was right and the
288
+ // comparator was not subtracting.
289
+ //
290
+ // But the subtraction is NOT unconditional, and making it so was its own
291
+ // regression (completion review, 2026-08-30): a full or project-layer
292
+ // projection — which is also the fail-safe default `partitionEligibility`
293
+ // returns on a fresh checkout, an absent install record, or a version or
294
+ // fingerprint mismatch — DOES carry those rules, and for this repo's own
295
+ // project layer `source-of-truth` is the one rule delivered there and the
296
+ // only one declaring `paths:`. Subtracting it there inverts the line.
297
+ //
298
+ // So the partition is DETECTED from the projection rather than assumed:
299
+ // if a package-only rule's file is present, this is not a global layer.
300
+ const pkg_only_ids = rows.filter((r) => r.package_only).map((r) => r.id);
301
+ const partitioned = !pkg_only_ids.some((id) =>
302
+ fs.existsSync(path.join(resolved_projection_dir, `${id}.md`)),
303
+ );
304
+ const scoped_pkg_only = partitioned
305
+ ? rows.filter((r) => r.verdict === 'scoped' && r.package_only)
306
+ : [];
307
+ const expected = sum.scoped - scoped_pkg_only.length;
308
+ if (scoped_pkg_only.length > 0) {
309
+ process.stdout.write(
310
+ ` source scopes ${sum.scoped}; ${scoped_pkg_only.length} of those ` +
311
+ `${scoped_pkg_only.length === 1 ? 'is' : 'are'} package-only and never\n` +
312
+ ` delivered (${scoped_pkg_only.map((r) => r.id).join(', ')}), so a ` +
313
+ `partitioned projection is\n expected to declare ${expected}.\n`,
314
+ );
315
+ }
316
+ if (projection.with_paths !== expected) {
317
+ process.stdout.write(
318
+ ` ⚠️ diverges from the source verdict (${expected} expected` +
319
+ `${scoped_pkg_only.length > 0 ? `, ${sum.scoped} before the package-only partition` : ''}).\n` +
320
+ ` A projection carries no record of the scope or commit it was generated\n` +
321
+ ` at, so this is a reason to regenerate it — never a reading of the\n` +
322
+ ` emitter.\n`,
323
+ );
324
+ } else {
263
325
  process.stdout.write(
264
- ` ⚠️ diverges from the source verdict (${sum.scoped} scoped). A projection\n` +
265
- ` carries no record of the scope or commit it was generated at, so this\n` +
266
- ` is a reason to regenerate it — never a reading of the emitter.\n`,
326
+ ` ✅ consistent with the source verdict (${expected} expected, ` +
327
+ `${projection.with_paths} found).\n`,
267
328
  );
268
329
  }
269
330
  } else if (projection_dir) {
@@ -228,7 +228,7 @@ export function render(
228
228
  validation: ValidationResult = validate_targets(byTarget),
229
229
  ): string {
230
230
  const L: string[] = [];
231
- L.push('<!-- GENERATED by src/scripts/rule_backlinks.ts — do NOT hand-edit.');
231
+ L.push('<!-- GENERATED by rule_backlinks — do NOT hand-edit.');
232
232
  L.push(' Regenerate after each P4 migration batch. Report-only. -->');
233
233
  L.push('');
234
234
  L.push('# Rule backlinks — which rules route here');