@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,302 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * `config-cost report` — what does this configuration cost per session
4
+ * (`road-to-delivered-cost-truth` Phase 1).
5
+ *
6
+ * Class A per ADR-124: in-process, per-invocation, no socket, no daemon, no
7
+ * network, no writes outside a stdout/JSON report. The same class
8
+ * `cache_realization_report` already occupies, and for the same reason.
9
+ *
10
+ * Four figures, and the discipline is the point of each:
11
+ *
12
+ * delivered payload from the per-asset ledger, exact BPE where it resolves
13
+ * billable_input split fresh input · cache read · cache creation
14
+ * cache-read share `null` when nothing was billed, never 0 %
15
+ * payload_amplification delivered / profile-declared, or `unknown_profile`
16
+ *
17
+ * NO CURRENCY, ANYWHERE. The suite does not know the consumer's contract, so a
18
+ * monetary figure would be extrapolated from a rate it invented — actionable and
19
+ * wrong, which is worse than absent. `check_no_currency_in_cost_surfaces` gates
20
+ * it rather than leaving it to intent.
21
+ *
22
+ * Usage:
23
+ * ./scripts-run src/scripts/config_cost_report [--format text|json]
24
+ * [--root <path>] [--profile <name>] [--transcript-root <path>]
25
+ * [--max-age-days <n>] [--summary-line]
26
+ */
27
+ import * as fs from 'node:fs';
28
+ import * as path from 'node:path';
29
+
30
+ import { buildLedger } from './_lib/asset_delivery_ledger.js';
31
+ import {
32
+ amplification,
33
+ billableSplit,
34
+ rereadCost,
35
+ summaryLine,
36
+ type AmplificationResult,
37
+ type BillableSplit,
38
+ type ProfileDeclaration,
39
+ type RereadCost,
40
+ type RereadLeg,
41
+ } from './_lib/config_cost.js';
42
+ import { prefixStableDirRoots } from './_lib/prefix_stable_surfaces.js';
43
+ import { DEFAULT_PROJECTS_ROOT, aggregateByBucket, scanTranscripts } from './_lib/cc_transcript.js';
44
+ import { computeRereads } from './_lib/transcript_reads.js';
45
+ import { gpt_tokens } from './_lib/token_count.js';
46
+
47
+ const HERE = path.dirname(new URL(import.meta.url).pathname);
48
+ const REPO_ROOT = path.resolve(HERE, '..', '..');
49
+
50
+ export interface Options {
51
+ format: 'text' | 'json';
52
+ transcript: string | null;
53
+ root: string;
54
+ profile: string | null;
55
+ transcriptRoot: string;
56
+ maxAgeDays: number;
57
+ summaryOnly: boolean;
58
+ }
59
+
60
+ export function parseArgs(argv: string[]): Options {
61
+ const o: Options = {
62
+ format: 'text',
63
+ transcript: null,
64
+ root: REPO_ROOT,
65
+ profile: null,
66
+ transcriptRoot: DEFAULT_PROJECTS_ROOT,
67
+ maxAgeDays: 14,
68
+ summaryOnly: false,
69
+ };
70
+ for (let i = 0; i < argv.length; i++) {
71
+ const a = argv[i];
72
+ if (a === undefined) continue;
73
+ if (a === '--format') o.format = (argv[++i] as Options['format']) ?? o.format;
74
+ else if (a.startsWith('--format=')) o.format = a.slice('--format='.length) as Options['format'];
75
+ else if (a === '--root') o.root = path.resolve(argv[++i] ?? o.root);
76
+ else if (a.startsWith('--root=')) o.root = path.resolve(a.slice('--root='.length));
77
+ else if (a === '--profile') o.profile = argv[++i] ?? null;
78
+ else if (a.startsWith('--profile=')) o.profile = a.slice('--profile='.length);
79
+ else if (a === '--transcript-root') o.transcriptRoot = argv[++i] ?? o.transcriptRoot;
80
+ else if (a.startsWith('--transcript-root=')) o.transcriptRoot = a.slice('--transcript-root='.length);
81
+ else if (a === '--max-age-days') o.maxAgeDays = Number(argv[++i]) || o.maxAgeDays;
82
+ else if (a.startsWith('--max-age-days=')) o.maxAgeDays = Number(a.slice('--max-age-days='.length)) || o.maxAgeDays;
83
+ else if (a === '--transcript') o.transcript = argv[++i] ?? null;
84
+ else if (a.startsWith('--transcript=')) o.transcript = a.slice('--transcript='.length);
85
+ else if (a === '--summary-line') o.summaryOnly = true;
86
+ }
87
+ if (o.format !== 'text' && o.format !== 'json') o.format = 'text';
88
+ return o;
89
+ }
90
+
91
+ /** Read a profile's declared standing payload. Absent file or key → `null`, never a default. */
92
+ export function readProfileDeclaration(root: string, profile: string): ProfileDeclaration | null {
93
+ const file = path.join(root, 'src', 'config', 'profiles', `${profile}.ini`);
94
+ let text: string;
95
+ try {
96
+ text = fs.readFileSync(file, 'utf-8');
97
+ } catch {
98
+ return null;
99
+ }
100
+ const num = (key: string): number | null => {
101
+ const m = new RegExp(`^${key}\\s*=\\s*([0-9.]+)\\s*$`, 'm').exec(text);
102
+ if (m === null) return null;
103
+ const v = Number(m[1]);
104
+ return Number.isFinite(v) ? v : null;
105
+ };
106
+ const rules = num('declared_rules_tokens');
107
+ const skills = num('declared_skill_catalogue_tokens');
108
+ const headroom = num('declared_payload_sanity_headroom');
109
+ if (rules === null || skills === null || headroom === null) return null;
110
+ return { profile, declared: { rules_tokens: rules, skill_catalogue_tokens: skills }, sanity_headroom: headroom };
111
+ }
112
+
113
+ /** The active profile, read from the settings cascade. `full` is the shipped default. */
114
+ export function activeProfile(root: string, override: string | null): string {
115
+ if (override !== null) return override;
116
+ for (const rel of ['.agent-settings.yml', path.join('agents', 'settings', '.agent-settings.yml')]) {
117
+ try {
118
+ const m = /^\s*profile:\s*['"]?([A-Za-z0-9_-]+)/m.exec(fs.readFileSync(path.join(root, rel), 'utf-8'));
119
+ if (m !== null) return m[1] as string;
120
+ } catch {
121
+ /* absent layer — try the next */
122
+ }
123
+ }
124
+ return 'full';
125
+ }
126
+
127
+ /**
128
+ * Turn the re-reads `hot_context_hook` already counts into a token figure
129
+ * (step 1.3).
130
+ *
131
+ * The hook notices a repeated read and renders it as an advisory line; nothing
132
+ * ever priced it, so a re-read was visible and free-looking. The cost is
133
+ * `duplicate_reads x the file's MEASURED size` — derived, never a constant,
134
+ * because a constant would rank a re-read of a one-line config beside a re-read
135
+ * of a 3,000-token rule.
136
+ *
137
+ * A file that no longer exists is skipped rather than priced at zero: it was
138
+ * genuinely read, and a zero would understate the cost while looking measured.
139
+ */
140
+ export function collectRereadLegs(transcriptPath: string | null, root: string): RereadLeg[] {
141
+ if (transcriptPath === null) return [];
142
+ let result;
143
+ try {
144
+ result = computeRereads([transcriptPath]);
145
+ } catch {
146
+ return [];
147
+ }
148
+ const legs: RereadLeg[] = [];
149
+ for (const f of result.files) {
150
+ if (f.duplicate_reads <= 0) continue;
151
+ const rel = path.relative(root, f.file_path);
152
+ if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel)) continue;
153
+ let text: string;
154
+ try {
155
+ text = fs.readFileSync(f.file_path, 'utf-8');
156
+ } catch {
157
+ continue;
158
+ }
159
+ legs.push({
160
+ file: rel,
161
+ total_reads: f.total_reads,
162
+ duplicate_reads: f.duplicate_reads,
163
+ file_tokens: gpt_tokens(text).tokens,
164
+ });
165
+ }
166
+ legs.sort((a, b) => b.duplicate_reads * b.file_tokens - a.duplicate_reads * a.file_tokens);
167
+ return legs;
168
+ }
169
+
170
+ export interface CostReport {
171
+ schema: 'config-cost-report/v1';
172
+ profile: string;
173
+ delivered: { total_tokens: number; rules_tokens: number; skill_catalogue_tokens: number; exact_throughout: boolean };
174
+ /** `null` with a stated reason when the transcript ledger carries nothing. */
175
+ billable: BillableSplit | null;
176
+ billable_reason: string | null;
177
+ amplification: AmplificationResult;
178
+ reread: RereadCost;
179
+ summary_line: string;
180
+ }
181
+
182
+ export function buildReport(o: Options, legsOverride?: readonly RereadLeg[]): CostReport {
183
+ const legs = legsOverride ?? collectRereadLegs(o.transcript, o.root);
184
+ const [rulesRel, skillsRel] = prefixStableDirRoots();
185
+ const ledger = buildLedger(
186
+ path.join(o.root, rulesRel ?? 'dist/agent-src/rules'),
187
+ path.join(o.root, skillsRel ?? 'dist/agent-src/skills'),
188
+ o.root,
189
+ );
190
+ const measured = {
191
+ rules_tokens: ledger.by_kind.rule.tokens,
192
+ skill_catalogue_tokens: ledger.by_kind['skill-catalogue-line'].tokens,
193
+ };
194
+
195
+ let billable: BillableSplit | null = null;
196
+ let billableReason: string | null = null;
197
+ try {
198
+ const scan = scanTranscripts({ root: o.transcriptRoot, maxAgeDays: o.maxAgeDays });
199
+ const buckets = aggregateByBucket(scan.records);
200
+ const fresh = buckets.main.input_tokens + buckets.subagent.input_tokens;
201
+ const read = buckets.main.cache_read_input_tokens + buckets.subagent.cache_read_input_tokens;
202
+ const creation = buckets.main.cache_creation_input_tokens + buckets.subagent.cache_creation_input_tokens;
203
+ if (fresh + read + creation === 0) {
204
+ billableReason = `no billable input recorded under ${o.transcriptRoot} in the last ${String(o.maxAgeDays)} day(s)`;
205
+ } else {
206
+ billable = billableSplit(fresh, read, creation);
207
+ }
208
+ } catch (err) {
209
+ billableReason = `the transcript ledger at ${o.transcriptRoot} could not be read: ${(err as Error).message}`;
210
+ }
211
+
212
+ const profile = activeProfile(o.root, o.profile);
213
+ return {
214
+ schema: 'config-cost-report/v1',
215
+ profile,
216
+ delivered: {
217
+ total_tokens: ledger.total_tokens,
218
+ rules_tokens: measured.rules_tokens,
219
+ skill_catalogue_tokens: measured.skill_catalogue_tokens,
220
+ exact_throughout: ledger.exact_throughout,
221
+ },
222
+ billable,
223
+ billable_reason: billableReason,
224
+ amplification: amplification(ledger.total_tokens, measured, readProfileDeclaration(o.root, profile)),
225
+ reread: rereadCost(legs),
226
+ summary_line: summaryLine(ledger.total_tokens, billable),
227
+ };
228
+ }
229
+
230
+ export function renderText(r: CostReport): string {
231
+ const out: string[] = [];
232
+ const n = (v: number): string => String(v);
233
+ out.push('Config-cost report — what this configuration costs per session');
234
+ out.push(` profile: ${r.profile}`);
235
+ out.push(
236
+ ` delivered standing payload: ${n(r.delivered.total_tokens)} tok ` +
237
+ `(rules ${n(r.delivered.rules_tokens)} · skill catalogue ${n(r.delivered.skill_catalogue_tokens)})` +
238
+ `${r.delivered.exact_throughout ? '' : ' — MIXED measurement, some rows fell back to the chars/4 proxy'}`,
239
+ );
240
+ out.push('');
241
+ out.push('billable_input = fresh input + cache read + cache creation');
242
+ if (r.billable === null) {
243
+ out.push(` unavailable — ${r.billable_reason ?? 'no reason recorded'}`);
244
+ out.push(' (a stated reason, never zeros standing in for absence)');
245
+ } else {
246
+ const b = r.billable;
247
+ out.push(` fresh input: ${n(b.fresh_input_tokens)} tok`);
248
+ out.push(` cache read: ${n(b.cache_read_tokens)} tok`);
249
+ out.push(` cache creation: ${n(b.cache_creation_tokens)} tok`);
250
+ out.push(` billable total: ${n(b.billable_input_tokens)} tok`);
251
+ out.push(
252
+ ` cache-read share: ${b.cache_read_share === null ? 'unavailable (nothing was billed)' : `${(b.cache_read_share * 100).toFixed(1)}%`}`,
253
+ );
254
+ }
255
+ out.push('');
256
+ out.push('payload amplification (delivered ÷ profile-declared)');
257
+ out.push(` verdict: ${r.amplification.verdict}`);
258
+ out.push(` ratio: ${r.amplification.ratio === null ? 'not computed' : r.amplification.ratio.toFixed(2)}`);
259
+ out.push(` ${r.amplification.reason}`);
260
+ out.push('');
261
+ out.push(' This measures AMPLIFICATION, not net value. It never observes what the payload');
262
+ out.push(' returned, so it informs the question of whether the configuration earns its cost');
263
+ out.push(' and is not allowed to answer it.');
264
+ if (r.reread.legs.length > 0) {
265
+ out.push('');
266
+ out.push('re-read cost (content paid for twice)');
267
+ out.push(` wasted: ${n(r.reread.wasted_tokens)} tok across ${n(r.reread.legs.length)} file(s)`);
268
+ if (r.reread.worst_file !== null) out.push(` worst: ${r.reread.worst_file}`);
269
+ }
270
+ out.push('');
271
+ out.push(r.summary_line);
272
+ return out.join('\n') + '\n';
273
+ }
274
+
275
+ export function main(argv: string[] = process.argv.slice(2)): number {
276
+ const o = parseArgs(argv);
277
+ let report: CostReport;
278
+ try {
279
+ report = buildReport(o);
280
+ } catch (err) {
281
+ process.stderr.write(`❌ config_cost_report: ${(err as Error).message}\n`);
282
+ return 2;
283
+ }
284
+ if (report.delivered.total_tokens === 0) {
285
+ process.stderr.write(
286
+ '❌ config_cost_report: no standing asset measured. The rule and skill trees are\n' +
287
+ ' generated (`task sync && task generate-tools`); a checkout that has not run them\n' +
288
+ ' has no payload to price. Stated, not reported as a cost of zero.\n',
289
+ );
290
+ return 2;
291
+ }
292
+ if (o.summaryOnly) {
293
+ process.stdout.write(report.summary_line + '\n');
294
+ return 0;
295
+ }
296
+ process.stdout.write(o.format === 'json' ? JSON.stringify(report, null, 2) + '\n' : renderText(report));
297
+ return 0;
298
+ }
299
+
300
+ if (process.argv[1] !== undefined && import.meta.url === `file://${process.argv[1]}`) {
301
+ process.exit(main());
302
+ }
@@ -344,7 +344,80 @@ interface MissingModule {
344
344
  * deliberately ignores bare package specifiers (`from 'commander'`) so the
345
345
  * walk never leaves the package's own `dist/` tree.
346
346
  */
347
- export function parseRelativeSpecifiers(source: string): string[] {
347
+ /**
348
+ * Strip comments before scanning for import specifiers.
349
+ *
350
+ * A doc comment can contain a perfectly well-formed `export { X } from './X'`
351
+ * as an EXAMPLE, and the scanner had no way to tell one from a real import —
352
+ * `src/cli/commands/uiAudit.ts` carries exactly that line, and the built output
353
+ * keeps it, so the gate reported `commands/uiAudit.js → missing ./X` for a
354
+ * module nobody imports. That is a false red on a completeness gate, which is
355
+ * the worst kind: it says the shipped tarball is broken when it is not.
356
+ *
357
+ * ## Why the string state resets at every newline
358
+ *
359
+ * The first version carried quote state across the whole file, and it did not
360
+ * survive contact with that very comment: prose says `module's body`, and an
361
+ * apostrophe inside a comment is only inert while the lexer KNOWS it is inside
362
+ * one. One desync — a regex literal, an unpaired apostrophe reached in the
363
+ * wrong mode — and every subsequent `/*` reads as string content, so the doc
364
+ * comment is scanned as code and the false red survives the fix. Measured: the
365
+ * fix shipped, CI stayed red on the identical message.
366
+ *
367
+ * So block-comment state is tracked ACROSS lines (a block comment is the thing
368
+ * being removed) while quote state is tracked WITHIN one line and discarded at
369
+ * the newline. A desync then costs the remainder of one line instead of the
370
+ * remainder of the file. A multi-line template literal containing a relative
371
+ * specifier would be read as code — a false red, the same direction the gate
372
+ * already errs, and no such literal exists in the compiled output this walks.
373
+ */
374
+ export function stripComments(source: string): string {
375
+ const out: string[] = [];
376
+ let inBlock = false;
377
+ for (const rawLine of source.split('\n')) {
378
+ let line = '';
379
+ let i = 0;
380
+ let quote: string | null = null;
381
+ while (i < rawLine.length) {
382
+ const c = rawLine[i] as string;
383
+ const next = rawLine[i + 1];
384
+ if (inBlock) {
385
+ if (c === '*' && next === '/') {
386
+ inBlock = false;
387
+ i += 2;
388
+ continue;
389
+ }
390
+ i += 1;
391
+ continue;
392
+ }
393
+ if (quote !== null) {
394
+ line += c;
395
+ if (c === '\\' && next !== undefined) {
396
+ line += next;
397
+ i += 2;
398
+ continue;
399
+ }
400
+ if (c === quote) quote = null;
401
+ i += 1;
402
+ continue;
403
+ }
404
+ if (c === '/' && next === '/') break;
405
+ if (c === '/' && next === '*') {
406
+ inBlock = true;
407
+ i += 2;
408
+ continue;
409
+ }
410
+ if (c === "'" || c === '"' || c === '`') quote = c;
411
+ line += c;
412
+ i += 1;
413
+ }
414
+ out.push(line);
415
+ }
416
+ return out.join('\n');
417
+ }
418
+
419
+ export function parseRelativeSpecifiers(rawSource: string): string[] {
420
+ const source = stripComments(rawSource);
348
421
  const out = new Set<string>();
349
422
  const patterns = [
350
423
  /\bfrom\s*["']([^"']+)["']/g,
@@ -0,0 +1,235 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * `corpus_manifest` — pin the metered-proposer experiment's subject, and check
4
+ * that a fresh checkout reproduces it.
5
+ *
6
+ * Two verbs and no third. `capture` writes the pin from the tree as it stands;
7
+ * `verify` re-captures and reports every difference against a pin on disk.
8
+ * There is deliberately no `update` verb: a pin that can be refreshed in place
9
+ * is a pin that silently follows the tree, which is the property it exists not
10
+ * to have.
11
+ *
12
+ * `verify` exits 3 when the SUBJECT differs and 0 when only the explanatory
13
+ * fields do. That split is the whole point of the exit code — a different
14
+ * runtime version is a fact worth printing and is not a reason to refuse a
15
+ * comparison, while a different subject means the two runs measured different
16
+ * things and no amount of green elsewhere repairs it.
17
+ *
18
+ * Nothing here spends: it reads files and shells out to `git` for the commit.
19
+ */
20
+ import * as fs from 'node:fs';
21
+ import * as os from 'node:os';
22
+ import * as path from 'node:path';
23
+ import process from 'node:process';
24
+ import { fileURLToPath } from 'node:url';
25
+
26
+ import { partitionActive } from '../install/partitionEligibility.js';
27
+ import {
28
+ type CorpusManifest,
29
+ captureManifest,
30
+ diffManifests,
31
+ parseManifest,
32
+ serialiseManifest,
33
+ subjectsEquivalent,
34
+ } from './_lib/corpus_manifest.js';
35
+
36
+ const _HERE = fileURLToPath(import.meta.url);
37
+ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
38
+
39
+ export const EXIT_OK = 0;
40
+ export const EXIT_ERROR = 1;
41
+ export const EXIT_USAGE = 2;
42
+ /** The subject differs. Distinct from a plain error so a runner can branch. */
43
+ export const EXIT_SUBJECT_DIFFERS = 3;
44
+
45
+ /**
46
+ * The enumeration rule this manifest pins under, as an ID rather than prose.
47
+ *
48
+ * It is part of the digest, so changing the rule changes the subject even when
49
+ * every file hash is unchanged. That is correct: a corpus of the same five
50
+ * files selected by a different rule is a different experiment, and a digest
51
+ * that could not see the difference would let the selection semantics be
52
+ * amended without the pin noticing.
53
+ */
54
+ export const ENUMERATION_RULE_ID = 'claude-rules-md-bytesorted-first-N/v1';
55
+
56
+ const USAGE = `usage: corpus_manifest capture --out FILE [--limit N]
57
+ corpus_manifest verify --manifest FILE
58
+
59
+ capture write the subject pin from the tree as it stands
60
+ verify re-capture and report every difference against FILE
61
+
62
+ --limit N corpus size, on CAPTURE only; defaults to max_candidates from the
63
+ pre-registered budget, which is the ceiling the run guard aborts
64
+ on. verify re-captures at the size its own manifest pinned, so it
65
+ REFUSES --limit rather than accepting a flag it cannot honour
66
+
67
+ Exit: 0 ok · 1 error · 2 usage · 3 the SUBJECT differs
68
+ `;
69
+
70
+ /**
71
+ * The corpus size, read from the pre-registered budget rather than defaulted.
72
+ *
73
+ * Hardcoding five here would put a second copy of a pre-registered number in a
74
+ * file nobody would think to check when the budget changed, and the two would
75
+ * disagree in the direction that matters: a manifest pinning more subjects than
76
+ * the run guard admits describes an experiment that cannot be run.
77
+ */
78
+ export function defaultLimit(repoRoot: string = REPO_ROOT): number {
79
+ const raw = JSON.parse(
80
+ fs.readFileSync(path.join(repoRoot, 'src', 'config', 'harness-evolution-budget.json'), 'utf-8'),
81
+ ) as { budget?: { max_candidates?: unknown } };
82
+ const n = raw.budget?.max_candidates;
83
+ if (typeof n !== 'number' || !Number.isInteger(n) || n <= 0) {
84
+ throw new Error('max_candidates missing or not a positive integer in the pre-registered budget');
85
+ }
86
+ return n;
87
+ }
88
+
89
+ interface Parsed {
90
+ verb?: string;
91
+ out?: string;
92
+ manifest?: string;
93
+ limit?: number;
94
+ }
95
+
96
+ export function parseArgs(argv: readonly string[]): Parsed | string {
97
+ const p: Parsed = {};
98
+ for (let i = 0; i < argv.length; i += 1) {
99
+ const a = argv[i] as string;
100
+ if (!a.startsWith('--') && p.verb === undefined) {
101
+ p.verb = a;
102
+ continue;
103
+ }
104
+ const v = argv[i + 1];
105
+ if (v === undefined || v.startsWith('--')) return `${a} requires a value`;
106
+ i += 1;
107
+ if (a === '--out') p.out = v;
108
+ else if (a === '--manifest') p.manifest = v;
109
+ else if (a === '--limit') {
110
+ const n = Number(v);
111
+ if (!Number.isInteger(n) || n <= 0) return '--limit must be a positive integer';
112
+ p.limit = n;
113
+ } else return `unknown option '${a}'`;
114
+ }
115
+ if (p.verb === 'verify' && p.limit !== undefined) {
116
+ return (
117
+ 'verify does not take --limit: it re-captures at the size its own manifest pinned, ' +
118
+ 'because a re-capture at another corpus size is a comparison against another subject. ' +
119
+ 'Accepting the flag and then using the pinned size reported green on a run that had ' +
120
+ 'not honoured it'
121
+ );
122
+ }
123
+ return p;
124
+ }
125
+
126
+ /**
127
+ * One real capture over the real tree.
128
+ *
129
+ * This is the one caller for which the process globals `partitionActive` reads
130
+ * — the host layer under the running user's home, and the install lockfile —
131
+ * ARE this run's own host, so it is the one caller that passes the predicate.
132
+ * Everywhere else the field stays `null` rather than recording some other
133
+ * machine's state under this tree's name.
134
+ */
135
+ function capture(limit: number): CorpusManifest {
136
+ return captureManifest({
137
+ repoRoot: REPO_ROOT,
138
+ userHome: process.env['HOME'] ?? os.homedir(),
139
+ limit,
140
+ enumerationRule: ENUMERATION_RULE_ID,
141
+ partitionActive,
142
+ });
143
+ }
144
+
145
+ export function main(argv?: string[]): number {
146
+ const args = argv ?? process.argv.slice(2);
147
+ if (args.length === 0 || args.includes('-h') || args.includes('--help')) {
148
+ process.stdout.write(USAGE);
149
+ return args.length === 0 ? EXIT_USAGE : EXIT_OK;
150
+ }
151
+ const parsed = parseArgs(args);
152
+ if (typeof parsed === 'string') {
153
+ process.stderr.write(`corpus_manifest: error: ${parsed}\n${USAGE}`);
154
+ return EXIT_USAGE;
155
+ }
156
+
157
+ if (parsed.verb === 'capture') {
158
+ if (parsed.out === undefined) {
159
+ process.stderr.write(`corpus_manifest: error: capture requires --out FILE\n${USAGE}`);
160
+ return EXIT_USAGE;
161
+ }
162
+ let m: CorpusManifest;
163
+ try {
164
+ m = capture(parsed.limit ?? defaultLimit());
165
+ } catch (e) {
166
+ process.stderr.write(`corpus_manifest: capture refused — ${(e as Error).message}\n`);
167
+ return EXIT_ERROR;
168
+ }
169
+ fs.mkdirSync(path.dirname(path.resolve(parsed.out)), { recursive: true });
170
+ fs.writeFileSync(parsed.out, serialiseManifest(m), 'utf-8');
171
+ process.stdout.write(
172
+ `corpus_manifest: wrote ${parsed.out} · subject_digest=${m.subject_digest.slice(0, 16)} · ` +
173
+ `${String(m.included.length)} subject(s) · ${String(m.produced.length)} produced · ` +
174
+ `${String(m.user_scope.filter((t) => t.byte_identical).length)} byte-identical ` +
175
+ `twin(s), ${String(m.user_scope.filter((t) => t.causes_skip).length)} of them ` +
176
+ `causing a skip under ${String(m.generator_config['projection.scope_dedup'])}\n`,
177
+ );
178
+ if (m.tree_dirty) {
179
+ process.stdout.write(
180
+ 'corpus_manifest: WARNING the working tree is dirty, so the recorded commit does not ' +
181
+ 'describe the bytes that were hashed\n',
182
+ );
183
+ }
184
+ return EXIT_OK;
185
+ }
186
+
187
+ if (parsed.verb === 'verify') {
188
+ if (parsed.manifest === undefined) {
189
+ process.stderr.write(`corpus_manifest: error: verify requires --manifest FILE\n${USAGE}`);
190
+ return EXIT_USAGE;
191
+ }
192
+ let expected: CorpusManifest;
193
+ let actual: CorpusManifest;
194
+ try {
195
+ expected = parseManifest(JSON.parse(fs.readFileSync(parsed.manifest, 'utf-8')));
196
+ actual = capture(expected.included.length);
197
+ } catch (e) {
198
+ process.stderr.write(`corpus_manifest: verify refused — ${(e as Error).message}\n`);
199
+ return EXIT_ERROR;
200
+ }
201
+ const diffs = diffManifests(expected, actual);
202
+ for (const d of diffs) {
203
+ process.stdout.write(`corpus_manifest: DIFF ${d.field}: expected ${d.expected}, got ${d.actual}\n`);
204
+ }
205
+ if (subjectsEquivalent(expected, actual)) {
206
+ process.stdout.write(
207
+ `corpus_manifest: SUBJECT EQUIVALENT · ${String(actual.included.length)} subject(s) · ` +
208
+ `digest=${actual.subject_digest.slice(0, 16)}` +
209
+ (diffs.length > 0 ? ` · ${String(diffs.length)} explanatory difference(s) above\n` : '\n'),
210
+ );
211
+ return EXIT_OK;
212
+ }
213
+ process.stdout.write(
214
+ 'corpus_manifest: SUBJECT DIFFERS — a comparison captured against this manifest is not ' +
215
+ 'comparable to one captured here\n',
216
+ );
217
+ return EXIT_SUBJECT_DIFFERS;
218
+ }
219
+
220
+ process.stderr.write(`corpus_manifest: error: unknown verb ${JSON.stringify(parsed.verb)}\n${USAGE}`);
221
+ return EXIT_USAGE;
222
+ }
223
+
224
+ function _isCliEntry(): boolean {
225
+ try {
226
+ if (process.argv[1] === undefined) return false;
227
+ return fs.realpathSync(_HERE) === fs.realpathSync(path.resolve(process.argv[1]));
228
+ } catch {
229
+ return false;
230
+ }
231
+ }
232
+
233
+ if (_isCliEntry()) {
234
+ process.exit(main());
235
+ }
@@ -2,9 +2,16 @@
2
2
  // cost-budget — set / get / check the project's cost budget against
3
3
  // accumulated session spend in agents/cost-tracking/sessions.jsonl.
4
4
  //
5
- // Forked from ruvnet/ruflo plugins/ruflo-cost-tracker/scripts/budget.mjs.
6
- // Local-JSONL swap replaces the upstream `mcp__claude-flow__memory_store`
7
- // dependency. Budget config lives next to the sessions store as budget.json.
5
+ // Derived work. The upstream, its MIT terms and the reproduced copyright and
6
+ // permission notice are in CREDITS.md; the transformation record is in
7
+ // docs/THIRD-PARTY-NOTICES.md, generated from provenance/borrows.jsonl. The
8
+ // first two ship with the package, which is what discharges the obligation for
9
+ // a consumer who receives this file from npm. The source is not named here
10
+ // because a source name in a tracked source file is what
11
+ // `source-confidentiality` forbids, and MIT discharges through a distributed
12
+ // notice rather than an in-file one.
13
+ // Local-JSONL swap replaces the upstream MCP memory-store dependency. Budget
14
+ // config lives next to the sessions store as budget.json.
8
15
  //
9
16
  // Usage: node scripts/cost/budget.mjs {set <usd>|get|check}
10
17
  // Env: BUDGET_STORE, BUDGET_CONFIG, BUDGET_PERIOD={today|week|month|all}, BUDGET_QUIET=1
@@ -2,9 +2,16 @@
2
2
  // cost-track — auto-capture token usage from a Claude Code session jsonl
3
3
  // and append a structured record to agents/cost-tracking/sessions.jsonl.
4
4
  //
5
- // Forked from ruvnet/ruflo plugins/ruflo-cost-tracker/scripts/track.mjs.
6
- // Local-JSONL swap replaces the upstream `mcp__claude-flow__memory_store`
7
- // dependency. Pricing constants are kept in sync with REFERENCE.md.
5
+ // Derived work. The upstream, its MIT terms and the reproduced copyright and
6
+ // permission notice are in CREDITS.md; the transformation record is in
7
+ // docs/THIRD-PARTY-NOTICES.md, generated from provenance/borrows.jsonl. The
8
+ // first two ship with the package, which is what discharges the obligation for
9
+ // a consumer who receives this file from npm. The source is not named here
10
+ // because a source name in a tracked source file is what
11
+ // `source-confidentiality` forbids, and MIT discharges through a distributed
12
+ // notice rather than an in-file one.
13
+ // Local-JSONL swap replaces the upstream MCP memory-store dependency. Pricing
14
+ // constants are kept in sync with REFERENCE.md.
8
15
  //
9
16
  // Dedup + main/subagent split, and the logic driving them, are mirrored
10
17
  // (not imported) from `src/scripts/_lib/cc_transcript.ts`: this file ships