@event4u/agent-config 14.12.0 → 14.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +118 -155
  5. package/CONTRIBUTING.md +38 -0
  6. package/CREDITS.md +135 -0
  7. package/NOTICE +13 -0
  8. package/README.md +8 -6
  9. package/dist/agent-src/commands/analyze/inbox.md +145 -2
  10. package/dist/agent-src/commands/feature/dev.md +7 -2
  11. package/dist/agent-src/commands/ghostwriter/write.md +5 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  14. package/dist/agent-src/commands/orchestrate.md +2 -2
  15. package/dist/agent-src/commands/post-as/me.md +5 -1
  16. package/dist/agent-src/commands/pr/merge.md +19 -6
  17. package/dist/agent-src/commands/roadmap/process-full.md +19 -5
  18. package/dist/agent-src/commands/tdd/red.md +12 -2
  19. package/dist/agent-src/commands/work.md +1 -1
  20. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
  21. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
  22. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
  23. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
  24. package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
  25. package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
  26. package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
  27. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  28. package/dist/agent-src/rules/broken-access-control.md +4 -0
  29. package/dist/agent-src/rules/code-comment-discipline.md +6 -0
  30. package/dist/agent-src/rules/code-provenance.md +4 -0
  31. package/dist/agent-src/rules/design-fidelity.md +1 -1
  32. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  33. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  34. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  35. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  36. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  37. package/dist/agent-src/rules/laravel-routing.md +1 -1
  38. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  39. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  40. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  41. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  42. package/dist/agent-src/rules/symfony-routing.md +1 -1
  43. package/dist/agent-src/rules/token-efficiency.md +14 -0
  44. package/dist/agent-src/rules/tool-safety.md +4 -0
  45. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  46. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
  47. package/dist/agent-src/scripts/guarded_baseline.ts +343 -0
  48. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  49. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  50. package/dist/agent-src/scripts/stubs_due.ts +516 -0
  51. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  52. package/dist/agent-src/scripts/update_roadmap_progress.ts +16 -12
  53. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  54. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  55. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  56. package/dist/agent-src/skills/database/SKILL.md +8 -0
  57. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  58. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  59. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  60. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  61. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  62. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  63. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  64. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  65. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  66. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  67. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  68. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  69. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  70. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  71. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  72. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  73. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  74. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  75. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  76. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  77. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  78. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  79. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  80. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  81. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  82. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  83. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  84. package/dist/agent-src/templates/roadmaps.md +97 -3
  85. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  86. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  87. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  88. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  93. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  94. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  95. package/dist/cli/commands/uiAudit.js +124 -5
  96. package/dist/cli/registry.js +2 -0
  97. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  98. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  99. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  100. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  101. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  102. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  103. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  104. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  105. package/dist/cli-delegate/cmd_conformance.js +80 -11
  106. package/dist/cli-delegate/cmd_doctor.js +3 -3
  107. package/dist/cli-delegate/cmd_export.js +3 -2
  108. package/dist/cli-delegate/cmd_fleet.js +2 -2
  109. package/dist/cli-delegate/cmd_handoff.js +1 -1
  110. package/dist/cli-delegate/cmd_preflight.js +2 -2
  111. package/dist/cli-delegate/cmd_prune.js +3 -2
  112. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  113. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  114. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  115. package/dist/cli-delegate/cmd_sync.js +3 -2
  116. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  117. package/dist/cli-delegate/cmd_validate.js +3 -2
  118. package/dist/discovery/deprecation-report.md +1 -1
  119. package/dist/discovery/discovery-manifest.json +58 -58
  120. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  121. package/dist/discovery/discovery-manifest.summary.md +1 -1
  122. package/dist/discovery/dormancy-report.md +1 -1
  123. package/dist/discovery/orphan-report.md +1 -1
  124. package/dist/discovery/packs.json +2 -2
  125. package/dist/discovery/trust-report.md +1 -1
  126. package/dist/discovery/workspaces.json +2 -2
  127. package/dist/hooks/dispatch.js +2900 -1049
  128. package/dist/install/claudeRuleRewrite.js +254 -0
  129. package/dist/install/detect.js +29 -16
  130. package/dist/install/detect_php_shape.js +159 -0
  131. package/dist/install/install.mjs +634 -428
  132. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  133. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  134. package/dist/mcp/registry-manifest.json +3 -3
  135. package/dist/mcp/server.json +3 -3
  136. package/dist/mcp/server.mjs +4895 -2627
  137. package/dist/server/schemas/settings.js +3 -0
  138. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  139. package/dist/ui/index.html +1 -1
  140. package/docs/MIGRATION.md +1 -1
  141. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  142. package/docs/contracts/provider-lifecycle.md +1 -1
  143. package/docs/contracts/settings-classes.md +10 -4
  144. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  145. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  146. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  147. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  148. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  149. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  150. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  151. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  152. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  153. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  154. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  155. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  156. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  157. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  158. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  159. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  160. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  161. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  162. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  163. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  164. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  165. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  166. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  167. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  168. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  169. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  170. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  171. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  172. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  173. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  174. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  175. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  176. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  177. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  178. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  179. package/docs/guidelines/augment-portability-patterns.md +6 -4
  180. package/docs/guidelines/code-clarity.md +18 -0
  181. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  182. package/docs/guidelines/cross-role-handoff.md +2 -2
  183. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  184. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  185. package/docs/guidelines/php/database.md +90 -7
  186. package/docs/guidelines/prompt-templates.md +7 -7
  187. package/llms.txt +2 -2
  188. package/package.json +5 -2
  189. package/src/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
  190. package/src/agent-src/scripts/guarded_baseline.ts +343 -0
  191. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  192. package/src/agent-src/scripts/stub_queue.ts +82 -0
  193. package/src/agent-src/scripts/stubs_due.ts +516 -0
  194. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  195. package/src/agent-src/scripts/update_roadmap_progress.ts +16 -12
  196. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  197. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  198. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  199. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  202. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  203. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  204. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  205. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  206. package/src/config/agent-settings.template.yml +32 -3
  207. package/src/config/assurance-capability-registry.json +21 -9
  208. package/src/config/canonical-terms.yml +119 -0
  209. package/src/config/capability-native-outcome-bars.json +81 -0
  210. package/src/config/ci-local-parity.yml +80 -0
  211. package/src/config/drafting-channels.yml +43 -0
  212. package/src/config/estate-count-budget.json +57 -36
  213. package/src/config/evaluator-budgets.json +14 -14
  214. package/src/config/gate-coverage.yml +729 -63
  215. package/src/config/gate-reachability-exemptions.json +21 -0
  216. package/src/config/gate-violation-baselines.json +42 -19
  217. package/src/config/harness-evolution-budget.json +25 -0
  218. package/src/config/lapsed-beta-baseline.json +96 -0
  219. package/src/config/memory-twin-verdicts.yml +129 -0
  220. package/src/config/metric-registry.yml +124 -0
  221. package/src/config/pack-size-budget.json +16 -15
  222. package/src/config/preamble-payload-budget.json +12 -4
  223. package/src/config/profiles/balanced.ini +27 -0
  224. package/src/config/profiles/full.ini +27 -0
  225. package/src/config/profiles/minimal.ini +27 -0
  226. package/src/config/publish-surface.json +9 -2
  227. package/src/config/routing-coverage-seed.json +16 -2
  228. package/src/config/rule-stub-ceilings.json +133 -112
  229. package/src/config/turnaround-budget.json +66 -0
  230. package/src/install/claudeRuleRewrite.ts +288 -0
  231. package/src/install/detect.ts +60 -17
  232. package/src/install/detect_php_shape.ts +191 -0
  233. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  234. package/src/scripts/_dispatch.bash +23 -0
  235. package/src/scripts/_lib/activation_ladder.ts +255 -0
  236. package/src/scripts/_lib/activation_receipt_producer.ts +341 -0
  237. package/src/scripts/_lib/activation_states.ts +88 -0
  238. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  239. package/src/scripts/_lib/adr_frontmatter.ts +26 -0
  240. package/src/scripts/_lib/arith_claims.ts +181 -0
  241. package/src/scripts/_lib/arm_ranking.ts +62 -0
  242. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  243. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  244. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  245. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  246. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  247. package/src/scripts/_lib/candidate_pair_delta.ts +349 -0
  248. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  249. package/src/scripts/_lib/candidate_record.ts +601 -0
  250. package/src/scripts/_lib/capture_rate.ts +319 -0
  251. package/src/scripts/_lib/carrier_status.ts +118 -0
  252. package/src/scripts/_lib/cascade_stage_enumeration.ts +92 -0
  253. package/src/scripts/_lib/collector_denominator.ts +771 -0
  254. package/src/scripts/_lib/collector_record.ts +340 -0
  255. package/src/scripts/_lib/collector_store.ts +664 -0
  256. package/src/scripts/_lib/collector_supervision.ts +827 -0
  257. package/src/scripts/_lib/concern_estate.ts +77 -0
  258. package/src/scripts/_lib/config_chain.ts +477 -0
  259. package/src/scripts/_lib/config_cost.ts +209 -0
  260. package/src/scripts/_lib/corpus_manifest.ts +726 -0
  261. package/src/scripts/_lib/council_settings_block.ts +6 -0
  262. package/src/scripts/_lib/curator_ops.ts +172 -0
  263. package/src/scripts/_lib/delivery_arm_experiment.ts +282 -0
  264. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  265. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  266. package/src/scripts/_lib/empty_cycles.ts +88 -0
  267. package/src/scripts/_lib/estate_carrier_cases.ts +72 -0
  268. package/src/scripts/_lib/eval_publication.ts +354 -0
  269. package/src/scripts/_lib/evaluation_cascade.ts +452 -0
  270. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  271. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  272. package/src/scripts/_lib/evidence_basis.ts +118 -0
  273. package/src/scripts/_lib/evolution_roi.ts +562 -0
  274. package/src/scripts/_lib/exec_evidence.ts +8 -0
  275. package/src/scripts/_lib/experience_card.ts +272 -0
  276. package/src/scripts/_lib/experience_report.ts +151 -0
  277. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  278. package/src/scripts/_lib/generated_by.ts +66 -0
  279. package/src/scripts/_lib/harness_evolution_guards.ts +239 -0
  280. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  281. package/src/scripts/_lib/host_denominator.ts +687 -0
  282. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  283. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  284. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  285. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  286. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  287. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  288. package/src/scripts/_lib/lexical_shortlist.ts +215 -0
  289. package/src/scripts/_lib/llm_candidate_proposer.ts +461 -0
  290. package/src/scripts/_lib/llm_proposer_transport.ts +153 -0
  291. package/src/scripts/_lib/loop_guards.ts +299 -0
  292. package/src/scripts/_lib/loss_class.ts +129 -0
  293. package/src/scripts/_lib/machine_wake.ts +51 -0
  294. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  295. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  296. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  297. package/src/scripts/_lib/orchestration_record.ts +253 -5
  298. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  299. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  300. package/src/scripts/_lib/paired_stats.ts +245 -0
  301. package/src/scripts/_lib/paired_verdict.ts +226 -0
  302. package/src/scripts/_lib/pathology_archive.ts +393 -0
  303. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  304. package/src/scripts/_lib/privacy_class.ts +47 -0
  305. package/src/scripts/_lib/promotion_capability.ts +315 -0
  306. package/src/scripts/_lib/promotion_evidence.ts +414 -0
  307. package/src/scripts/_lib/promotion_review.ts +294 -0
  308. package/src/scripts/_lib/prompt_shape.ts +92 -0
  309. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  310. package/src/scripts/_lib/release_highlights.ts +70 -1
  311. package/src/scripts/_lib/release_material.ts +125 -2
  312. package/src/scripts/_lib/repeated_failure.ts +105 -0
  313. package/src/scripts/_lib/repo_root.ts +111 -0
  314. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  315. package/src/scripts/_lib/role_split.ts +338 -0
  316. package/src/scripts/_lib/routing_corpus.ts +307 -0
  317. package/src/scripts/_lib/routing_index_input.ts +104 -0
  318. package/src/scripts/_lib/rule_injection.ts +22 -1
  319. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  320. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  321. package/src/scripts/_lib/semantic_noop.ts +167 -0
  322. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  323. package/src/scripts/_lib/source_digest.ts +200 -0
  324. package/src/scripts/_lib/source_redact.ts +260 -0
  325. package/src/scripts/_lib/source_shape.ts +502 -0
  326. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  327. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  328. package/src/scripts/_lib/strip_comments.mjs +65 -0
  329. package/src/scripts/_lib/test_red_state.ts +154 -0
  330. package/src/scripts/_lib/trigger_shift.ts +144 -0
  331. package/src/scripts/_lib/untrusted_content.ts +82 -7
  332. package/src/scripts/activation_receipt.ts +258 -0
  333. package/src/scripts/adoption_report.ts +1 -1
  334. package/src/scripts/adr/evidence_census.ts +1 -1
  335. package/src/scripts/adr/regenerate_index.ts +26 -2
  336. package/src/scripts/adr_cite_check.ts +164 -1
  337. package/src/scripts/ai_council/blind_review.ts +11 -1
  338. package/src/scripts/ai_council/clients.ts +4 -0
  339. package/src/scripts/ai_council/config.ts +3 -0
  340. package/src/scripts/ai_council/consensus.ts +28 -8
  341. package/src/scripts/ai_council/consensus_round.ts +226 -0
  342. package/src/scripts/ai_council/cross_exam.ts +128 -0
  343. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  344. package/src/scripts/ai_council/explain_route.ts +157 -0
  345. package/src/scripts/ai_council/information_gain.ts +293 -0
  346. package/src/scripts/ai_council/inline_findings.ts +340 -0
  347. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  348. package/src/scripts/ai_council/leakage_corpus.ts +385 -0
  349. package/src/scripts/ai_council/leakage_patterns.ts +453 -0
  350. package/src/scripts/ai_council/minority_retention.ts +171 -0
  351. package/src/scripts/ai_council/orchestrator.ts +16 -203
  352. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  353. package/src/scripts/ai_council/pricing.ts +106 -0
  354. package/src/scripts/ai_council/prompts.ts +74 -7
  355. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  356. package/src/scripts/ai_council/py_format.ts +14 -3
  357. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  358. package/src/scripts/ai_council/recouncil_savings.ts +299 -0
  359. package/src/scripts/ai_council/replay_route.ts +223 -0
  360. package/src/scripts/ai_council/response_record.ts +50 -0
  361. package/src/scripts/ai_council/reviewer_assignment.ts +279 -0
  362. package/src/scripts/ai_council/routing_training_row.ts +197 -0
  363. package/src/scripts/ai_council/synthesis_strategy.ts +159 -0
  364. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  365. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  366. package/src/scripts/asset_delivery_ledger.ts +157 -0
  367. package/src/scripts/attest_artifact.ts +193 -0
  368. package/src/scripts/audit_auto_rules.ts +2 -1
  369. package/src/scripts/audit_command_surface.ts +1 -1
  370. package/src/scripts/audit_mcp_tools.ts +2 -2
  371. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  372. package/src/scripts/audit_user_type_axis.ts +2 -1
  373. package/src/scripts/bench_ab_clone.ts +215 -10
  374. package/src/scripts/bench_ab_integrity.ts +119 -5
  375. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  376. package/src/scripts/build_archive_index.ts +1 -1
  377. package/src/scripts/build_linear_digest.ts +1 -1
  378. package/src/scripts/build_proof.ts +11 -4
  379. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  380. package/src/scripts/build_source_digests.ts +157 -0
  381. package/src/scripts/cache_realization_report.ts +103 -0
  382. package/src/scripts/check_adr_frontmatter.ts +131 -10
  383. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  384. package/src/scripts/check_beta_review_markers.ts +235 -6
  385. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  386. package/src/scripts/check_claims.ts +576 -6
  387. package/src/scripts/check_composite_arming.ts +35 -0
  388. package/src/scripts/check_concern_admissions.ts +365 -0
  389. package/src/scripts/check_enforcement_coverage.ts +28 -0
  390. package/src/scripts/check_estate_count.ts +347 -25
  391. package/src/scripts/check_gate_reachability.ts +383 -0
  392. package/src/scripts/check_host_loadability.ts +104 -0
  393. package/src/scripts/check_loss_class_declared.ts +308 -0
  394. package/src/scripts/check_md_language.ts +15 -98
  395. package/src/scripts/check_memory_proposal.ts +18 -11
  396. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  397. package/src/scripts/check_no_external_sources.ts +281 -6
  398. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  399. package/src/scripts/check_pack_size.ts +59 -2
  400. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  401. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  402. package/src/scripts/check_publish_surface.ts +10 -1
  403. package/src/scripts/check_references.ts +24 -1
  404. package/src/scripts/check_release_highlights.ts +96 -13
  405. package/src/scripts/check_roadmap_trackable.ts +17 -2
  406. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  407. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  408. package/src/scripts/check_score_contract.ts +26 -3
  409. package/src/scripts/check_static_parity.ts +285 -0
  410. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  411. package/src/scripts/check_suppression_hygiene.ts +15 -0
  412. package/src/scripts/ci_settle.ts +39 -2
  413. package/src/scripts/code_graph/build.ts +60 -3
  414. package/src/scripts/code_graph/extract.ts +44 -0
  415. package/src/scripts/code_graph/types.ts +24 -0
  416. package/src/scripts/collector_daemon.ts +714 -0
  417. package/src/scripts/config_cost_report.ts +302 -0
  418. package/src/scripts/consumer_matrix.ts +74 -1
  419. package/src/scripts/corpus_manifest.ts +235 -0
  420. package/src/scripts/cost/budget.mjs +10 -3
  421. package/src/scripts/cost/track.mjs +10 -3
  422. package/src/scripts/council_cli.ts +37 -54
  423. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  424. package/src/scripts/evolution_lab.ts +1153 -0
  425. package/src/scripts/external_sources_denylist.json +5 -18
  426. package/src/scripts/extract_audit_patterns.ts +21 -0
  427. package/src/scripts/fold_intake.ts +12 -1
  428. package/src/scripts/gen_discovery_baseline.ts +1 -1
  429. package/src/scripts/generate_capabilities_index.ts +12 -5
  430. package/src/scripts/generate_capability_matrix.ts +3 -3
  431. package/src/scripts/generate_command_flows.ts +2 -2
  432. package/src/scripts/generate_cookbook.ts +2 -2
  433. package/src/scripts/generate_index.ts +8 -1
  434. package/src/scripts/generate_knowledge_index.ts +2 -1
  435. package/src/scripts/generate_ownership_matrix.ts +2 -1
  436. package/src/scripts/generate_pack_manifests.ts +10 -2
  437. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  438. package/src/scripts/generate_settings_reference.ts +1 -1
  439. package/src/scripts/git_authorization_hook.ts +22 -1
  440. package/src/scripts/grade_target_readiness.ts +48 -5
  441. package/src/scripts/hook_effect_doctor.ts +261 -0
  442. package/src/scripts/hook_manifest.json +1 -1
  443. package/src/scripts/hook_manifest.yaml +125 -16
  444. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  445. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  446. package/src/scripts/hooks/comment_discipline_hook.ts +146 -0
  447. package/src/scripts/hooks/concern_registry.ts +6 -0
  448. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  449. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  450. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  451. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  452. package/src/scripts/hooks/shims/install.sh +61 -0
  453. package/src/scripts/hooks/shims/php +101 -0
  454. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  455. package/src/scripts/hooks/turn_end_gate_hook.ts +9 -1
  456. package/src/scripts/hot_context_hook.ts +16 -0
  457. package/src/scripts/install-hooks.sh +20 -5
  458. package/src/scripts/install.ts +17 -35
  459. package/src/scripts/inventory_frontmatter.ts +2 -1
  460. package/src/scripts/language_mirror_hook.ts +14 -2
  461. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  462. package/src/scripts/lint_canonical_terms.ts +604 -0
  463. package/src/scripts/lint_carrier_integrity.ts +820 -0
  464. package/src/scripts/lint_code_comments.ts +643 -0
  465. package/src/scripts/lint_composition_review.ts +619 -0
  466. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  467. package/src/scripts/lint_eval_specs.ts +593 -0
  468. package/src/scripts/lint_hook_manifest.ts +19 -0
  469. package/src/scripts/lint_host_portability.ts +373 -0
  470. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  471. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  472. package/src/scripts/lint_metric_consumers.ts +355 -0
  473. package/src/scripts/lint_plan_risk_register.ts +39 -19
  474. package/src/scripts/lint_promotion_paths.ts +779 -0
  475. package/src/scripts/lint_skill_descriptions.ts +18 -1
  476. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  477. package/src/scripts/lint_skill_link_reach.ts +252 -0
  478. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  479. package/src/scripts/lint_ticket_buildable.ts +17 -1
  480. package/src/scripts/llm_propose.ts +256 -0
  481. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  482. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  483. package/src/scripts/measure_delivery_sets.ts +361 -0
  484. package/src/scripts/measure_docs_dead_links.ts +348 -0
  485. package/src/scripts/measure_host_capture.ts +461 -0
  486. package/src/scripts/measure_routing_signal.ts +307 -0
  487. package/src/scripts/migration_status.ts +3 -3
  488. package/src/scripts/model_rule_injection.ts +76 -0
  489. package/src/scripts/orchestration_record.ts +14 -0
  490. package/src/scripts/preamble_byte_census.ts +139 -10
  491. package/src/scripts/prepack-check.mjs +4 -1
  492. package/src/scripts/probe_council_retention.ts +495 -0
  493. package/src/scripts/probe_turnaround.ts +384 -0
  494. package/src/scripts/probe_unblocked_ask.ts +279 -0
  495. package/src/scripts/release.ts +21 -37
  496. package/src/scripts/release_drill.ts +143 -0
  497. package/src/scripts/release_env.ts +35 -0
  498. package/src/scripts/release_publication.ts +84 -0
  499. package/src/scripts/render_benchmark_md.ts +1 -1
  500. package/src/scripts/rule_activation_census.ts +70 -9
  501. package/src/scripts/rule_backlinks.ts +1 -1
  502. package/src/scripts/run_lifecycle_suite.ts +208 -0
  503. package/src/scripts/run_skill_evals.ts +40 -0
  504. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  505. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  506. package/src/scripts/schemas/evals.schema.json +24 -1
  507. package/src/scripts/schemas/rule.schema.json +52 -1
  508. package/src/scripts/schemas/skill.schema.json +17 -2
  509. package/src/scripts/skill_overlap.ts +7 -1
  510. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  511. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  512. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  513. package/src/scripts/skill_usage_report.ts +2 -1
  514. package/src/scripts/stubs_due.ts +211 -0
  515. package/src/scripts/sweep_source_surfaces.ts +678 -0
  516. package/src/scripts/sync_pr_branch.ts +3 -3
  517. package/src/scripts/trigger_eval_grandfather.json +202 -222
  518. package/src/scripts/utilization_report.ts +22 -2
  519. package/src/server/schemas/settings.ts +5 -0
  520. package/src/templates/marketing-copy.yml +1 -1
  521. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -0,0 +1,461 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Measure the runtime event journal's HOST capture rate.
4
+ *
5
+ * `road-to-journal-host-capture-measurement` Phase 2 step 2.1. Produces the
6
+ * number that step, and its parent roadmap's step 1.4, asked for — or the
7
+ * stated reason a given population's rate cannot exist.
8
+ *
9
+ * ## What it measures, and the one thing it is not
10
+ *
11
+ * The DENOMINATOR is host-authored: it is reconstructed from Claude Code's own
12
+ * per-session transcripts by the pinned rules in `_lib/host_denominator.ts`.
13
+ * The NUMERATOR is this package's journal store. Neither is derived from the
14
+ * other, which is the property that makes the ratio a capture rate.
15
+ *
16
+ * It is emphatically **not** the dispatch-path figure published by
17
+ * `agents/evidence/analysis/runtime-journal-capture-2026-08-28.md` (100.00 %,
18
+ * 1,000 envelopes). That measured envelopes handed to the concern by a test —
19
+ * a floor on the writer. This measures events a real host emitted. Reporting
20
+ * either as the other is the category substitution both evidence pages refuse.
21
+ *
22
+ * ## One population, and it is the numerator's — R2 finding 1
23
+ *
24
+ * The journal lives at `<git-common-dir>/agent-journal/journal.sqlite`: one
25
+ * store per REPOSITORY, shared by its worktrees, reaching nothing else. So the
26
+ * denominator defaults to `--scope repository`, which counts only the
27
+ * transcripts of that repository's worktrees. `--scope machine` is available
28
+ * and is a different figure about the host; the rate printed under it is
29
+ * labelled UNMATCHED, because dividing a machine-wide denominator by a
30
+ * repository-scoped numerator is the defect this flag exists to make visible.
31
+ *
32
+ * ## Populations
33
+ *
34
+ * Per the unanimous AI-council resolution of `measurement-population-default-off`
35
+ * (option c), two install populations are reported and neither is "the" capture
36
+ * rate:
37
+ *
38
+ * - **default** — settings as shipped; `hooks.runtime_journal.enabled`
39
+ * absent, resolving to false.
40
+ * - **opted-in** — `hooks.runtime_journal.enabled: true`.
41
+ *
42
+ * The script reports which one the measured machine is actually in, and
43
+ * censuses the settings layers rather than assuming. A population with no
44
+ * opted-in layer is reported as measured-empty, never as 0 %.
45
+ *
46
+ * Usage:
47
+ * measure_host_capture # human-readable
48
+ * measure_host_capture --json # machine-readable
49
+ * measure_host_capture --days 30 # window length in CALENDAR
50
+ * # days, inclusive both ends
51
+ * # (default 30 — the journal's
52
+ * # retention TTL)
53
+ * measure_host_capture --scope machine # widen the denominator, and
54
+ * # label the rate unmatched
55
+ * measure_host_capture --projects-root P # override ~/.claude/projects
56
+ */
57
+
58
+ import * as fs from 'node:fs';
59
+ import * as os from 'node:os';
60
+ import * as path from 'node:path';
61
+ import { fileURLToPath } from 'node:url';
62
+
63
+ import {
64
+ accumulate,
65
+ COUNTED_EVENTS,
66
+ countTranscriptFile,
67
+ DENOMINATOR_SCOPES,
68
+ type DenominatorScope,
69
+ emptyDenominator,
70
+ findTranscripts,
71
+ type HostDenominator,
72
+ JOURNAL_BOUND_COUNTED_EVENTS,
73
+ RECONSTRUCTION_RULE_VERSION,
74
+ repositoryScopeSlugs,
75
+ STOP_CANDIDATES,
76
+ totalCountedEvents,
77
+ totalJournalBoundEvents,
78
+ } from './_lib/host_denominator.js';
79
+ import {
80
+ isJournalAvailable,
81
+ openJournal,
82
+ resolveJournal,
83
+ RETENTION_TTL_DAYS,
84
+ } from './_lib/runtime_journal.js';
85
+
86
+ /** Why a numerator is what it is. A blind zero is what this enum prevents. */
87
+ export type NumeratorStatus =
88
+ | 'counted'
89
+ | 'store-absent'
90
+ | 'sqlite-unavailable'
91
+ | 'store-unreadable';
92
+
93
+ /**
94
+ * The settings layers a hook on this machine would consult for
95
+ * `hooks.runtime_journal.enabled`, and what each one says.
96
+ *
97
+ * A census of LAYERS, and the field names say so. v1 called them `observable` /
98
+ * `opted_in` and the evidence page published them as "installs", which is a
99
+ * different unit: one machine carrying both a project and a user-global layer
100
+ * would have reported two installs (R2 finding 7).
101
+ *
102
+ * `parse_failed` exists because a non-match used to be indistinguishable from
103
+ * "key absent", and both resolved silently toward the `default` population
104
+ * label that both published captions rest on (R2 finding 4).
105
+ */
106
+ export interface LayerCensus {
107
+ /** Settings files present and readable. */
108
+ layers_present: number;
109
+ /** Of those, how many carry the key at all. */
110
+ layers_with_key: number;
111
+ /** Of those, how many set it `true`. */
112
+ layers_enabled: number;
113
+ /** Files that were readable but whose `hooks:` block could not be parsed. */
114
+ layers_parse_failed: number;
115
+ /** The resolved value — the first layer that carries the key wins. */
116
+ resolved_enabled: boolean;
117
+ /** True when no layer carries the key, so the shipped default applies. */
118
+ resolved_from_default: boolean;
119
+ }
120
+
121
+ export interface CaptureMeasurement {
122
+ measured_on: string;
123
+ window_days: number;
124
+ denominator: HostDenominator;
125
+ /** Worktrees the repository scope resolved to. 0 means an empty scope. */
126
+ scope_worktrees: number;
127
+ denominator_scope: DenominatorScope;
128
+ /** False when the denominator's scope cannot be divided by this numerator. */
129
+ scope_matches_numerator: boolean;
130
+ /** Which install population the measured machine is in. */
131
+ measured_population: 'default' | 'opted-in';
132
+ layers: LayerCensus;
133
+ numerator_status: NumeratorStatus;
134
+ /** Journal records in-window on the six counted cells. */
135
+ numerator_counted_cells: number;
136
+ /** Journal records in-window on the five journal-bound counted cells. */
137
+ numerator_journal_bound_cells: number;
138
+ /** All in-window journal records, on any event. Context, not the numerator. */
139
+ numerator_all_events: number;
140
+ }
141
+
142
+ function isoDay(d: Date): string {
143
+ return d.toISOString().slice(0, 10);
144
+ }
145
+
146
+ /**
147
+ * Parse one settings file for `hooks.runtime_journal.enabled`.
148
+ *
149
+ * Anchored to the `hooks:` parent and tolerant of any consistent indentation,
150
+ * because v1 hard-coded 2-space / 4-space nesting and matched a
151
+ * `runtime_journal:` under any section at all. Returns `null` when the key is
152
+ * absent and `'parse-failed'` when a `hooks:` block exists but no verdict could
153
+ * be read from it — the two are different facts and v1 reported them the same.
154
+ */
155
+ export function readJournalKey(text: string): boolean | null | 'parse-failed' {
156
+ const lines = text.split('\n');
157
+ const hooksAt = lines.findIndex((l) => /^hooks:\s*$/.test(l));
158
+ if (hooksAt === -1) return null;
159
+
160
+ let sectionIndent: number | null = null;
161
+ let inSection = false;
162
+ for (let i = hooksAt + 1; i < lines.length; i++) {
163
+ const line = lines[i] ?? '';
164
+ if (line.trim().length === 0 || line.trimStart().startsWith('#')) continue;
165
+ const indent = line.length - line.trimStart().length;
166
+ if (indent === 0) break; // out of the `hooks:` block
167
+
168
+ if (/^runtime_journal:\s*$/.test(line.trim())) {
169
+ inSection = true;
170
+ sectionIndent = indent;
171
+ continue;
172
+ }
173
+ if (!inSection) continue;
174
+ if (sectionIndent !== null && indent <= sectionIndent) {
175
+ // Left the `runtime_journal:` block without finding the key.
176
+ return 'parse-failed';
177
+ }
178
+ const m = line.trim().match(/^enabled:\s*(\S+)/);
179
+ if (m) return (m[1] ?? '').trim() === 'true';
180
+ }
181
+ return inSection ? 'parse-failed' : null;
182
+ }
183
+
184
+ function layerCensus(root: string): LayerCensus {
185
+ const candidates = [
186
+ path.join(root, '.agent-settings.yml'),
187
+ path.join(os.homedir(), '.event4u', 'agent-config', 'settings', '.agent-settings.yml'),
188
+ ];
189
+ const census: LayerCensus = {
190
+ layers_present: 0,
191
+ layers_with_key: 0,
192
+ layers_enabled: 0,
193
+ layers_parse_failed: 0,
194
+ resolved_enabled: false,
195
+ resolved_from_default: true,
196
+ };
197
+ for (const file of candidates) {
198
+ let text: string;
199
+ try {
200
+ text = fs.readFileSync(file, 'utf8');
201
+ } catch {
202
+ continue;
203
+ }
204
+ census.layers_present += 1;
205
+ const verdict = readJournalKey(text);
206
+ if (verdict === 'parse-failed') {
207
+ census.layers_parse_failed += 1;
208
+ continue;
209
+ }
210
+ if (verdict === null) continue;
211
+ census.layers_with_key += 1;
212
+ if (verdict) census.layers_enabled += 1;
213
+ if (census.resolved_from_default) {
214
+ census.resolved_enabled = verdict;
215
+ census.resolved_from_default = false;
216
+ }
217
+ }
218
+ return census;
219
+ }
220
+
221
+ export async function measure(options: {
222
+ root: string;
223
+ projectsRoot: string;
224
+ days: number;
225
+ scope?: DenominatorScope;
226
+ now?: Date;
227
+ }): Promise<CaptureMeasurement> {
228
+ const scope = options.scope ?? 'repository';
229
+ const now = options.now ?? new Date();
230
+ const windowEnd = isoDay(now);
231
+ // `days - 1`: both comparisons are inclusive, so `--days 30` must span 30
232
+ // calendar days and not 31. v1 spanned 31 while the caption said 30, which
233
+ // gave the denominator one day the numerator's TTL cannot retain (R2
234
+ // finding 3).
235
+ const windowStart = isoDay(new Date(now.getTime() - (options.days - 1) * 86_400_000));
236
+
237
+ const repoScope = scope === 'repository' ? repositoryScopeSlugs(options.root) : null;
238
+ const walk = findTranscripts(options.projectsRoot, repoScope?.slugs);
239
+
240
+ const denominator = emptyDenominator(windowStart, windowEnd, scope);
241
+ denominator.transcripts_out_of_scope = walk.outOfScope;
242
+ denominator.unreadable_directories = walk.unreadable;
243
+ for (const file of walk.files) {
244
+ accumulate(denominator, await countTranscriptFile(file), windowStart, windowEnd);
245
+ }
246
+
247
+ const layers = layerCensus(options.root);
248
+ const measured_population = layers.resolved_enabled ? 'opted-in' : 'default';
249
+
250
+ let numerator_status: NumeratorStatus = 'counted';
251
+ let counted = 0;
252
+ let bound = 0;
253
+ let all = 0;
254
+
255
+ const location = resolveJournal(options.root);
256
+ if (!fs.existsSync(location.path)) {
257
+ numerator_status = 'store-absent';
258
+ } else if (!isJournalAvailable()) {
259
+ numerator_status = 'sqlite-unavailable';
260
+ } else {
261
+ try {
262
+ const handle = openJournal(options.root);
263
+ try {
264
+ // Windowed in SQL rather than by materialising the whole table
265
+ // and filtering in JS (R2 finding 17). `substr(at, 1, 10)` is
266
+ // the same day-string comparison the denominator uses, so the
267
+ // two sides window identically.
268
+ const rows = handle.db
269
+ .prepare(
270
+ `SELECT event, COUNT(*) AS n FROM journal_event
271
+ WHERE repository_id = ?
272
+ AND substr(at, 1, 10) >= ?
273
+ AND substr(at, 1, 10) <= ?
274
+ GROUP BY event`,
275
+ )
276
+ .all(location.repository_id, windowStart, windowEnd) as {
277
+ event: string;
278
+ n: number;
279
+ }[];
280
+ for (const row of rows) {
281
+ all += row.n;
282
+ if ((COUNTED_EVENTS as readonly string[]).includes(row.event)) counted += row.n;
283
+ if ((JOURNAL_BOUND_COUNTED_EVENTS as readonly string[]).includes(row.event)) {
284
+ bound += row.n;
285
+ }
286
+ }
287
+ } finally {
288
+ handle.close();
289
+ }
290
+ } catch {
291
+ numerator_status = 'store-unreadable';
292
+ // Reset, or a partial count ships as if it were counted while the
293
+ // status says it could not be read (R2 finding 5).
294
+ counted = 0;
295
+ bound = 0;
296
+ all = 0;
297
+ }
298
+ }
299
+
300
+ return {
301
+ measured_on: windowEnd,
302
+ window_days: options.days,
303
+ denominator,
304
+ scope_worktrees: repoScope?.worktrees.length ?? 0,
305
+ denominator_scope: scope,
306
+ scope_matches_numerator: scope === 'repository',
307
+ measured_population,
308
+ layers,
309
+ numerator_status,
310
+ numerator_counted_cells: counted,
311
+ numerator_journal_bound_cells: bound,
312
+ numerator_all_events: all,
313
+ };
314
+ }
315
+
316
+ function rate(numerator: number, denominator: number): string {
317
+ if (denominator === 0) return 'undefined (denominator 0)';
318
+ return `${((numerator / denominator) * 100).toFixed(2)} %`;
319
+ }
320
+
321
+ function render(m: CaptureMeasurement): string {
322
+ const d = m.denominator;
323
+ const lines: string[] = [];
324
+ lines.push(`Host capture rate — runtime event journal`);
325
+ lines.push(` measured on ............ ${m.measured_on}`);
326
+ lines.push(
327
+ ` window ................. ${d.window_start} .. ${d.window_end} (${m.window_days} calendar days, inclusive; journal TTL is ${RETENTION_TTL_DAYS})`,
328
+ );
329
+ lines.push(` reconstruction rules ... v${RECONSTRUCTION_RULE_VERSION}`);
330
+ lines.push(` platform ............... ${d.platform} (the only cell set with a host denominator)`);
331
+ lines.push(
332
+ ` denominator scope ...... ${d.scope}${m.scope_matches_numerator ? '' : ' ⚠️ UNMATCHED — a machine-wide denominator may not be divided by this repository-scoped numerator'}`,
333
+ );
334
+ if (d.scope === 'repository') {
335
+ lines.push(` worktrees in scope ..... ${m.scope_worktrees}`);
336
+ }
337
+ lines.push('');
338
+ lines.push(`Population of sessions`);
339
+ lines.push(` transcripts in scope ... ${d.transcripts_found}`);
340
+ lines.push(` project dirs skipped ... ${d.transcripts_out_of_scope} (outside the scope)`);
341
+ lines.push(` in window .............. ${d.sessions_in_window}`);
342
+ lines.push(` before window .......... ${d.sessions_before_window}`);
343
+ lines.push(` after window ........... ${d.sessions_after_window}`);
344
+ lines.push(` undatable .............. ${d.sessions_undatable}`);
345
+ lines.push(` unreadable dirs ........ ${d.unreadable_directories}`);
346
+ lines.push(` unparseable lines ...... ${d.unparseable_lines}`);
347
+ lines.push('');
348
+ lines.push(`Denominator — host events, per counted cell`);
349
+ for (const event of COUNTED_EVENTS) {
350
+ const isBound = (JOURNAL_BOUND_COUNTED_EVENTS as readonly string[]).includes(event);
351
+ lines.push(
352
+ ` ${event.padEnd(20)} ${String(d[event]).padStart(8)} ${isBound ? 'journal-bound' : 'NOT journal-bound — numerator 0 by construction'}`,
353
+ );
354
+ }
355
+ lines.push(` ${'TOTAL (6 cells)'.padEnd(20)} ${String(totalCountedEvents(d)).padStart(8)}`);
356
+ lines.push(
357
+ ` ${'TOTAL (5 bound)'.padEnd(20)} ${String(totalJournalBoundEvents(d)).padStart(8)}`,
358
+ );
359
+ lines.push(
360
+ ` of which sidechain ..... ${d.sidechain_tool_use_blocks} tool_use / ${d.sidechain_agent_tool_use_blocks} Agent-or-Task blocks (INCLUDED; subtract to disagree)`,
361
+ );
362
+ lines.push('');
363
+ lines.push(`Settings-layer census — the opted-in population, measured not assumed`);
364
+ lines.push(` layers present ......... ${m.layers.layers_present}`);
365
+ lines.push(` carrying the key ....... ${m.layers.layers_with_key}`);
366
+ lines.push(` set to true ............ ${m.layers.layers_enabled}`);
367
+ lines.push(` parse failed ........... ${m.layers.layers_parse_failed}`);
368
+ lines.push(
369
+ ` resolved from .......... ${m.layers.resolved_from_default ? 'the shipped default (no layer carries the key)' : 'an explicit layer value'}`,
370
+ );
371
+ lines.push(
372
+ ` opted-in population .... ${m.layers.layers_enabled === 0 ? 'EMPTY in measurement scope — no denominator for a rate to be over' : 'non-empty'}`,
373
+ );
374
+ lines.push('');
375
+ lines.push(`Numerator — journal records`);
376
+ lines.push(` measured population .... ${m.measured_population}`);
377
+ lines.push(` status ................. ${m.numerator_status}`);
378
+ lines.push(` on 6 counted cells ..... ${m.numerator_counted_cells}`);
379
+ lines.push(` on 5 bound cells ....... ${m.numerator_journal_bound_cells}`);
380
+ lines.push(` on any event ........... ${m.numerator_all_events}`);
381
+ lines.push(
382
+ ` host-agnostic .......... yes — \`JournalEvent\` carries no platform field, so an event`,
383
+ );
384
+ lines.push(
385
+ ` written by another bound host on this repository would count`,
386
+ );
387
+ lines.push(
388
+ ` into the numerator against a claude-only denominator`,
389
+ );
390
+ lines.push('');
391
+ lines.push(
392
+ `Rate — ${m.measured_population} install, ${d.platform}, ${d.scope} scope, ${d.window_start}..${d.window_end}`,
393
+ );
394
+ lines.push(
395
+ ` over 6 counted cells ... ${rate(m.numerator_counted_cells, totalCountedEvents(d))}`,
396
+ );
397
+ lines.push(
398
+ ` over 5 bound cells ..... ${rate(m.numerator_journal_bound_cells, totalJournalBoundEvents(d))}`,
399
+ );
400
+ if (!m.scope_matches_numerator) {
401
+ lines.push(` ⚠️ UNMATCHED SCOPE — the two rates above are not capture rates.`);
402
+ }
403
+ lines.push('');
404
+ lines.push(`Refused denominators for \`stop\` (journal-bound, not counted)`);
405
+ for (const c of STOP_CANDIDATES) {
406
+ lines.push(` ${String(c.reading).padStart(5)} ${c.candidate}`);
407
+ }
408
+ return lines.join('\n');
409
+ }
410
+
411
+ export async function main(argv: readonly string[]): Promise<number> {
412
+ const json = argv.includes('--json');
413
+
414
+ const daysAt = argv.indexOf('--days');
415
+ const days = daysAt >= 0 ? Number(argv[daysAt + 1] ?? NaN) : RETENTION_TTL_DAYS;
416
+ if (!Number.isInteger(days) || days <= 0) {
417
+ process.stderr.write('--days must be a positive integer\n');
418
+ return 2;
419
+ }
420
+
421
+ const scopeAt = argv.indexOf('--scope');
422
+ const scopeArg = scopeAt >= 0 ? argv[scopeAt + 1] : undefined;
423
+ if (scopeAt >= 0 && !(DENOMINATOR_SCOPES as readonly string[]).includes(scopeArg ?? '')) {
424
+ process.stderr.write(`--scope must be one of ${DENOMINATOR_SCOPES.join(' | ')}\n`);
425
+ return 2;
426
+ }
427
+
428
+ const rootAt = argv.indexOf('--projects-root');
429
+ const overrideRoot = rootAt >= 0 ? argv[rootAt + 1] : undefined;
430
+ if (rootAt >= 0 && (overrideRoot === undefined || overrideRoot.startsWith('--'))) {
431
+ process.stderr.write('--projects-root needs a directory\n');
432
+ return 2;
433
+ }
434
+ const projectsRoot = overrideRoot ?? path.join(os.homedir(), '.claude', 'projects');
435
+
436
+ const measurement = await measure({
437
+ root: process.cwd(),
438
+ projectsRoot,
439
+ days,
440
+ scope: (scopeArg as DenominatorScope | undefined) ?? 'repository',
441
+ });
442
+
443
+ process.stdout.write(
444
+ json ? `${JSON.stringify(measurement, null, 2)}\n` : `${render(measurement)}\n`,
445
+ );
446
+ return 0;
447
+ }
448
+
449
+ function _isCliEntry(): boolean {
450
+ try {
451
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
452
+ const argv = fs.realpathSync(path.resolve(process.argv[1] ?? ''));
453
+ return here === argv;
454
+ } catch {
455
+ return false;
456
+ }
457
+ }
458
+
459
+ if (_isCliEntry()) {
460
+ process.exitCode = await main(process.argv.slice(2));
461
+ }