@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,495 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Read-only probe: is the declared council-artefact TTL actually honoured?
4
+ *
5
+ * `ai_council.session_retention_days` (default 7 — `ai_council/session.ts:81`)
6
+ * declares a retention window for the three council artefact directories:
7
+ *
8
+ * agents/runtime/council/questions/
9
+ * agents/runtime/council/responses/
10
+ * agents/runtime/council/sessions/
11
+ *
12
+ * Every pruner in the tree that could enforce that window is reached only by an
13
+ * explicit human command:
14
+ *
15
+ * - `prune_all_council_artifacts` (`ai_council/session.ts:468`) has exactly
16
+ * one caller in `src/`, the manual CLI `council_prune.ts:131`, which is
17
+ * bound to `task council-prune` and to no hook, workflow or scheduler.
18
+ * - `save()` (`ai_council/session.ts:506`), the only function that calls
19
+ * `prune_old_artifacts(QUESTIONS_DIR, …)` / `(RESPONSES_DIR, …)`
20
+ * (`:603-604`), has no caller in `src/` at all — `council_cli.ts` writes its
21
+ * own `--output` payload directly (`council_cli.ts:2807`) and never imports
22
+ * the session module.
23
+ * - `janitor.ts` declares `agents/runtime/council/responses` with
24
+ * `ttlDays: 7` (`janitor.ts:55-61`) but defaults to a dry-run report;
25
+ * deletion needs `--apply` (`janitor.ts:12-14`, `:329`), and it declares no
26
+ * entry for `questions/` or `sessions/` at all.
27
+ *
28
+ * So the TTL is a declaration, not a mechanism, and the retained corpus is
29
+ * "every artefact nobody deleted by hand". This probe measures that gap instead
30
+ * of asserting it: it reports how much of the corpus is past its declared TTL,
31
+ * and how much provider-attributed response text that over-TTL slice holds.
32
+ *
33
+ * THIS SCRIPT NEVER WRITES, UNLINKS, MOVES, TRUNCATES, OR MUTATES ANYTHING.
34
+ * It opens files for reading only. There is no `--apply`, no `--fix`, and no
35
+ * code path that calls a mutating `fs` function. The corpus is the measurement
36
+ * subject; destroying it would destroy the instrument.
37
+ *
38
+ * Usage:
39
+ * ./scripts-run src/scripts/probe_council_retention
40
+ * ./scripts-run src/scripts/probe_council_retention --root /path/to/project
41
+ * ./scripts-run src/scripts/probe_council_retention --retention-days 7 --json
42
+ *
43
+ * Exit code: 0 always. This is a report, never a gate — an over-TTL corpus is
44
+ * the finding, not a build failure.
45
+ */
46
+
47
+ import * as fs from 'node:fs';
48
+ import * as path from 'node:path';
49
+ import { fileURLToPath, pathToFileURL } from 'node:url';
50
+
51
+ import { resolve_project_root } from './_lib/agent_settings.js';
52
+
53
+ const _HERE = fileURLToPath(import.meta.url);
54
+
55
+ const PROG = 'probe_council_retention';
56
+
57
+ /** The three canonical council dirs, relative to the project root. */
58
+ const COUNCIL_DIRS: readonly string[] = ['responses', 'sessions', 'questions'];
59
+
60
+ /** Mirrors `DEFAULT_RETENTION_DAYS` (`ai_council/session.ts:81`). */
61
+ const DEFAULT_RETENTION_DAYS = 7;
62
+
63
+ const MS_PER_DAY = 86_400_000;
64
+
65
+ const _USAGE = `usage: ${PROG} [-h] [--root PATH] [--retention-days N] [--json]`;
66
+
67
+ const _HELP =
68
+ `${_USAGE}\n\n` +
69
+ 'Read-only report on whether the declared council-artefact TTL is honoured.\n' +
70
+ 'Never deletes or modifies anything.\n\n' +
71
+ 'options:\n' +
72
+ ' -h, --help show this help message and exit\n' +
73
+ ' --root PATH project root to probe (default: resolved like sibling scripts)\n' +
74
+ ` --retention-days N TTL in days (default: ${String(DEFAULT_RETENTION_DAYS)})\n` +
75
+ ' --json emit the report as JSON instead of text\n';
76
+
77
+ interface Args {
78
+ root: string | null;
79
+ retention_days: number;
80
+ json: boolean;
81
+ help: boolean;
82
+ }
83
+
84
+ /** One TTL-split pair of counts. */
85
+ interface Split {
86
+ within_ttl: number;
87
+ over_ttl: number;
88
+ }
89
+
90
+ interface DirReport {
91
+ /** Directory label (`responses` / `sessions` / `questions`). */
92
+ dir: string;
93
+ /** Absolute path probed. */
94
+ abs_path: string;
95
+ /** Whether the directory exists at all. */
96
+ exists: boolean;
97
+ /** Files found, recursively. */
98
+ files: number;
99
+ /** Files split by mtime against the TTL cutoff. */
100
+ files_split: Split;
101
+ /** JSON files carrying a `responses[]` array. */
102
+ json_with_responses: number;
103
+ /** Files that look like JSON but would not parse. */
104
+ unparseable: number;
105
+ /** Provider-attributed response bodies (provider + text, no error). */
106
+ attributed_bodies: number;
107
+ /** Attributed bodies split by their SOURCE FILE's mtime against the TTL. */
108
+ attributed_split: Split;
109
+ /** Attributed bodies per provider. */
110
+ by_provider: Record<string, number>;
111
+ /** Attributed bodies per provider, over-TTL only. */
112
+ by_provider_over_ttl: Record<string, number>;
113
+ /** Age in days of the oldest file found, or `null` when the dir is empty. */
114
+ oldest_age_days: number | null;
115
+ }
116
+
117
+ interface Report {
118
+ root: string;
119
+ root_origin: string;
120
+ retention_days: number;
121
+ generated_at_utc: string;
122
+ dirs: DirReport[];
123
+ totals: {
124
+ files: number;
125
+ files_over_ttl: number;
126
+ attributed_bodies: number;
127
+ attributed_bodies_over_ttl: number;
128
+ unparseable: number;
129
+ oldest_age_days: number | null;
130
+ };
131
+ /** `true` when nothing at all is past the declared window. */
132
+ ttl_honoured: boolean;
133
+ }
134
+
135
+ function _argError(message: string): never {
136
+ process.stderr.write(`${_USAGE}\n`);
137
+ process.stderr.write(`${PROG}: error: ${message}\n`);
138
+ // A malformed invocation is still not a gate failure for the caller's
139
+ // build, but it must not print a report that means nothing.
140
+ process.exitCode = 2;
141
+ throw new _ExitSignal(2);
142
+ }
143
+
144
+ class _ExitSignal extends Error {
145
+ constructor(readonly code: number) {
146
+ super(`exit ${code}`);
147
+ }
148
+ }
149
+
150
+ function _parseArgs(argv: readonly string[]): Args {
151
+ const args: Args = {
152
+ root: null,
153
+ retention_days: DEFAULT_RETENTION_DAYS,
154
+ json: false,
155
+ help: false,
156
+ };
157
+ for (let i = 0; i < argv.length; i += 1) {
158
+ const a = argv[i] as string;
159
+ if (a === '-h' || a === '--help') {
160
+ args.help = true;
161
+ } else if (a === '--json') {
162
+ args.json = true;
163
+ } else if (a === '--root') {
164
+ const v = argv[i + 1];
165
+ if (v === undefined || v.startsWith('-')) {
166
+ _argError('argument --root: expected one argument');
167
+ }
168
+ args.root = v;
169
+ i += 1;
170
+ } else if (a === '--retention-days') {
171
+ const v = argv[i + 1];
172
+ if (v === undefined || v.startsWith('-')) {
173
+ _argError('argument --retention-days: expected one argument');
174
+ }
175
+ const parsed = Number.parseInt(v, 10);
176
+ if (!Number.isFinite(parsed) || String(parsed) !== v.trim() || parsed < 0) {
177
+ _argError(`argument --retention-days: invalid non-negative int value: '${v}'`);
178
+ }
179
+ args.retention_days = parsed;
180
+ i += 1;
181
+ } else {
182
+ _argError(`unrecognized arguments: ${a}`);
183
+ }
184
+ }
185
+ return args;
186
+ }
187
+
188
+ function _isDir(p: string): boolean {
189
+ try {
190
+ return fs.statSync(p).isDirectory();
191
+ } catch {
192
+ return false;
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Every FILE under `dir`, recursively, sorted for a stable report.
198
+ *
199
+ * Recursive rather than a flat `readdirSync`: `responses/` holds per-debate
200
+ * subdirectories (`<slug>.json/debate-round-N.json`), and a flat listing counts
201
+ * one entry where the corpus holds several artefacts.
202
+ */
203
+ function _walkFiles(dir: string): string[] {
204
+ const out: string[] = [];
205
+ if (!_isDir(dir)) {
206
+ return out;
207
+ }
208
+ let entries: string[];
209
+ try {
210
+ entries = fs.readdirSync(dir).sort();
211
+ } catch {
212
+ return out;
213
+ }
214
+ for (const name of entries) {
215
+ const full = path.join(dir, name);
216
+ let st: fs.Stats;
217
+ try {
218
+ st = fs.statSync(full);
219
+ } catch {
220
+ continue;
221
+ }
222
+ if (st.isFile()) {
223
+ out.push(full);
224
+ } else if (st.isDirectory()) {
225
+ out.push(..._walkFiles(full));
226
+ }
227
+ }
228
+ return out;
229
+ }
230
+
231
+ function _mtimeMs(p: string): number | null {
232
+ try {
233
+ return fs.statSync(p).mtimeMs;
234
+ } catch {
235
+ return null;
236
+ }
237
+ }
238
+
239
+ function _bump(map: Record<string, number>, key: string): void {
240
+ map[key] = (map[key] ?? 0) + 1;
241
+ }
242
+
243
+ /**
244
+ * A response body counts as provider-attributed when it names a provider,
245
+ * carries text, and records no error — the shape `recouncil_guard` and the
246
+ * leakage assembler both treat as real captured provider output.
247
+ */
248
+ function _isAttributed(entry: unknown): { attributed: boolean; provider: string } {
249
+ if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {
250
+ return { attributed: false, provider: '' };
251
+ }
252
+ const rec = entry as Record<string, unknown>;
253
+ const provider = typeof rec['provider'] === 'string' ? rec['provider'].trim() : '';
254
+ const text = typeof rec['text'] === 'string' ? rec['text'] : '';
255
+ const error = rec['error'];
256
+ const hasError = error !== null && error !== undefined && error !== '' && error !== false;
257
+ if (provider === '' || text.trim() === '' || hasError) {
258
+ return { attributed: false, provider };
259
+ }
260
+ return { attributed: true, provider };
261
+ }
262
+
263
+ function probeDir(root: string, label: string, cutoffMs: number, nowMs: number): DirReport {
264
+ const abs = path.join(root, 'agents', 'runtime', 'council', label);
265
+ const report: DirReport = {
266
+ dir: label,
267
+ abs_path: abs,
268
+ exists: _isDir(abs),
269
+ files: 0,
270
+ files_split: { within_ttl: 0, over_ttl: 0 },
271
+ json_with_responses: 0,
272
+ unparseable: 0,
273
+ attributed_bodies: 0,
274
+ attributed_split: { within_ttl: 0, over_ttl: 0 },
275
+ by_provider: {},
276
+ by_provider_over_ttl: {},
277
+ oldest_age_days: null,
278
+ };
279
+ if (!report.exists) {
280
+ return report;
281
+ }
282
+ const files = _walkFiles(abs);
283
+ report.files = files.length;
284
+ let oldestMs: number | null = null;
285
+ for (const f of files) {
286
+ const mtime = _mtimeMs(f);
287
+ const overTtl = mtime !== null && mtime < cutoffMs;
288
+ if (overTtl) {
289
+ report.files_split.over_ttl += 1;
290
+ } else {
291
+ report.files_split.within_ttl += 1;
292
+ }
293
+ if (mtime !== null && (oldestMs === null || mtime < oldestMs)) {
294
+ oldestMs = mtime;
295
+ }
296
+ // Only JSON-shaped artefacts can carry a `responses[]` array. A `.md`
297
+ // render is a sibling projection, counted as a file and nothing more.
298
+ if (!f.endsWith('.json')) {
299
+ continue;
300
+ }
301
+ let payload: unknown;
302
+ try {
303
+ payload = JSON.parse(fs.readFileSync(f, 'utf-8'));
304
+ } catch {
305
+ report.unparseable += 1;
306
+ continue;
307
+ }
308
+ if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
309
+ continue;
310
+ }
311
+ const responses = (payload as Record<string, unknown>)['responses'];
312
+ if (!Array.isArray(responses)) {
313
+ continue;
314
+ }
315
+ report.json_with_responses += 1;
316
+ for (const entry of responses) {
317
+ const { attributed, provider } = _isAttributed(entry);
318
+ if (!attributed) {
319
+ continue;
320
+ }
321
+ report.attributed_bodies += 1;
322
+ _bump(report.by_provider, provider);
323
+ if (overTtl) {
324
+ report.attributed_split.over_ttl += 1;
325
+ _bump(report.by_provider_over_ttl, provider);
326
+ } else {
327
+ report.attributed_split.within_ttl += 1;
328
+ }
329
+ }
330
+ }
331
+ if (oldestMs !== null) {
332
+ report.oldest_age_days = Math.floor((nowMs - oldestMs) / MS_PER_DAY);
333
+ }
334
+ return report;
335
+ }
336
+
337
+ export function buildReport(opts: {
338
+ root: string;
339
+ root_origin: string;
340
+ retention_days: number;
341
+ now?: Date;
342
+ }): Report {
343
+ const now = opts.now ?? new Date();
344
+ const nowMs = now.getTime();
345
+ const cutoffMs = nowMs - opts.retention_days * MS_PER_DAY;
346
+ const dirs = COUNCIL_DIRS.map((label) => probeDir(opts.root, label, cutoffMs, nowMs));
347
+ const oldest = dirs
348
+ .map((d) => d.oldest_age_days)
349
+ .filter((v): v is number => v !== null)
350
+ .reduce<number | null>((acc, v) => (acc === null || v > acc ? v : acc), null);
351
+ const totals = {
352
+ files: dirs.reduce((s, d) => s + d.files, 0),
353
+ files_over_ttl: dirs.reduce((s, d) => s + d.files_split.over_ttl, 0),
354
+ attributed_bodies: dirs.reduce((s, d) => s + d.attributed_bodies, 0),
355
+ attributed_bodies_over_ttl: dirs.reduce((s, d) => s + d.attributed_split.over_ttl, 0),
356
+ unparseable: dirs.reduce((s, d) => s + d.unparseable, 0),
357
+ oldest_age_days: oldest,
358
+ };
359
+ return {
360
+ root: opts.root,
361
+ root_origin: opts.root_origin,
362
+ retention_days: opts.retention_days,
363
+ generated_at_utc: now.toISOString(),
364
+ dirs,
365
+ totals,
366
+ // A zero over-TTL count is the ONLY reading that shows the window being
367
+ // enforced; anything else means the declaration is not a mechanism.
368
+ ttl_honoured: totals.files_over_ttl === 0,
369
+ };
370
+ }
371
+
372
+ function _providerLines(map: Record<string, number>, indent: string): string {
373
+ const keys = Object.keys(map).sort((a, b) => {
374
+ const d = (map[b] as number) - (map[a] as number);
375
+ return d !== 0 ? d : a.localeCompare(b);
376
+ });
377
+ if (keys.length === 0) {
378
+ return `${indent}(none)\n`;
379
+ }
380
+ return keys.map((k) => `${indent}${k.padEnd(14)} ${String(map[k])}\n`).join('');
381
+ }
382
+
383
+ export function renderReport(r: Report): string {
384
+ const lines: string[] = [];
385
+ lines.push(`council retention probe — read-only, nothing was deleted`);
386
+ lines.push(`root ${r.root} (origin: ${r.root_origin})`);
387
+ lines.push(`retention_days ${String(r.retention_days)}`);
388
+ lines.push(`generated ${r.generated_at_utc}`);
389
+ lines.push('');
390
+ for (const d of r.dirs) {
391
+ lines.push(`── ${d.dir} ──`);
392
+ if (!d.exists) {
393
+ lines.push(` directory absent: ${d.abs_path}`);
394
+ lines.push('');
395
+ continue;
396
+ }
397
+ lines.push(` files ${String(d.files)}`);
398
+ lines.push(
399
+ ` within TTL / over TTL ${String(d.files_split.within_ttl)} / ${String(d.files_split.over_ttl)}`,
400
+ );
401
+ lines.push(` JSON records with responses[] ${String(d.json_with_responses)}`);
402
+ lines.push(` unparseable JSON ${String(d.unparseable)}`);
403
+ lines.push(` provider-attributed bodies ${String(d.attributed_bodies)}`);
404
+ lines.push(
405
+ ` within TTL / over TTL ${String(d.attributed_split.within_ttl)} / ${String(d.attributed_split.over_ttl)}`,
406
+ );
407
+ lines.push(' by provider (all):');
408
+ lines.push(_providerLines(d.by_provider, ' ').trimEnd());
409
+ lines.push(' by provider (over TTL only):');
410
+ lines.push(_providerLines(d.by_provider_over_ttl, ' ').trimEnd());
411
+ lines.push(
412
+ ` oldest file age (days) ${d.oldest_age_days === null ? 'n/a' : String(d.oldest_age_days)}`,
413
+ );
414
+ lines.push('');
415
+ }
416
+ lines.push('── totals ──');
417
+ lines.push(` files ${String(r.totals.files)}`);
418
+ lines.push(` files over TTL ${String(r.totals.files_over_ttl)}`);
419
+ lines.push(` attributed bodies ${String(r.totals.attributed_bodies)}`);
420
+ lines.push(` attributed bodies over TTL ${String(r.totals.attributed_bodies_over_ttl)}`);
421
+ lines.push(` unparseable JSON ${String(r.totals.unparseable)}`);
422
+ lines.push(
423
+ ` oldest artefact age (days) ${r.totals.oldest_age_days === null ? 'n/a' : String(r.totals.oldest_age_days)}`,
424
+ );
425
+ lines.push('');
426
+ lines.push(
427
+ r.ttl_honoured
428
+ ? `TTL HONOURED — 0 artefacts are older than ${String(r.retention_days)} days.`
429
+ : `TTL NOT HONOURED — ${String(r.totals.files_over_ttl)} of ${String(r.totals.files)} ` +
430
+ `artefacts are older than the declared ${String(r.retention_days)}-day window ` +
431
+ `(oldest ${r.totals.oldest_age_days === null ? 'n/a' : String(r.totals.oldest_age_days)} days). ` +
432
+ `Every pruner in the tree needs an explicit human command; nothing sweeps on its own.`,
433
+ );
434
+ return lines.join('\n') + '\n';
435
+ }
436
+
437
+ export function main(argv: readonly string[]): number {
438
+ let args: Args;
439
+ try {
440
+ args = _parseArgs(argv);
441
+ } catch (exc) {
442
+ if (exc instanceof _ExitSignal) {
443
+ // Arg errors already wrote usage + set exitCode; the report itself
444
+ // never fails, so the caller still sees a 0-shaped contract for the
445
+ // reporting path and a 2 only for a malformed invocation.
446
+ return exc.code;
447
+ }
448
+ throw exc;
449
+ }
450
+ if (args.help) {
451
+ process.stdout.write(_HELP);
452
+ return 0;
453
+ }
454
+ const [root, origin] = resolve_project_root(args.root);
455
+ const report = buildReport({
456
+ root,
457
+ root_origin: origin,
458
+ retention_days: args.retention_days,
459
+ });
460
+ if (args.json) {
461
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
462
+ } else {
463
+ process.stdout.write(renderReport(report));
464
+ }
465
+ return 0;
466
+ }
467
+
468
+ function _isCliEntry(): boolean {
469
+ if (process.argv[1] === undefined) {
470
+ return false;
471
+ }
472
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
473
+ if (import.meta.url === argvUrl) {
474
+ return true;
475
+ }
476
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
477
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
478
+ // import.meta.url is the resolved real path while argv[1] keeps the
479
+ // symlink path. Compare realpaths so the entry guard still fires
480
+ // (without this the CLI silently no-ops when run through a symlink).
481
+ try {
482
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
483
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
484
+ return here === argv;
485
+ } catch {
486
+ return false;
487
+ }
488
+ }
489
+
490
+ if (_isCliEntry() || process.argv[1] === _HERE) {
491
+ process.exitCode = main(process.argv.slice(2));
492
+ }
493
+
494
+ export { COUNCIL_DIRS, DEFAULT_RETENTION_DAYS, PROG };
495
+ export type { Report, DirReport, Split };