@event4u/agent-config 14.12.0 → 14.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) 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 +234 -0
  5. package/CONTRIBUTING.md +38 -0
  6. package/CREDITS.md +135 -0
  7. package/NOTICE +13 -0
  8. package/README.md +8 -6
  9. package/dist/agent-src/commands/analyze/inbox.md +109 -2
  10. package/dist/agent-src/commands/feature/dev.md +7 -2
  11. package/dist/agent-src/commands/ghostwriter/write.md +5 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  14. package/dist/agent-src/commands/orchestrate.md +2 -2
  15. package/dist/agent-src/commands/post-as/me.md +5 -1
  16. package/dist/agent-src/commands/pr/merge.md +19 -6
  17. package/dist/agent-src/commands/roadmap/process-full.md +19 -5
  18. package/dist/agent-src/commands/tdd/red.md +12 -2
  19. package/dist/agent-src/commands/work.md +1 -1
  20. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
  21. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
  22. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
  23. package/dist/agent-src/contexts/execution/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-provenance.md +4 -0
  30. package/dist/agent-src/rules/design-fidelity.md +1 -1
  31. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  32. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  33. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  34. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  35. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  36. package/dist/agent-src/rules/laravel-routing.md +1 -1
  37. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  38. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  39. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  40. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  41. package/dist/agent-src/rules/symfony-routing.md +1 -1
  42. package/dist/agent-src/rules/token-efficiency.md +14 -0
  43. package/dist/agent-src/rules/tool-safety.md +4 -0
  44. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  45. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  46. package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
  47. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  48. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  49. package/dist/agent-src/scripts/stubs_due.ts +400 -0
  50. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  51. package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
  52. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  53. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  54. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  55. package/dist/agent-src/skills/database/SKILL.md +8 -0
  56. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  57. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  58. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  59. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  60. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  61. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  62. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  63. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  64. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  65. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  66. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  67. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  68. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  69. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  70. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  71. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  72. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  73. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  74. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  75. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  76. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  77. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  78. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  79. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  80. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  81. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  82. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  83. package/dist/agent-src/templates/roadmaps.md +97 -3
  84. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  85. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  86. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  87. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  88. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  93. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  94. package/dist/cli/commands/uiAudit.js +124 -5
  95. package/dist/cli/registry.js +2 -0
  96. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  97. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  98. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  99. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  100. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  101. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  102. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  103. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  104. package/dist/cli-delegate/cmd_conformance.js +42 -10
  105. package/dist/cli-delegate/cmd_doctor.js +3 -3
  106. package/dist/cli-delegate/cmd_export.js +3 -2
  107. package/dist/cli-delegate/cmd_fleet.js +2 -2
  108. package/dist/cli-delegate/cmd_handoff.js +1 -1
  109. package/dist/cli-delegate/cmd_preflight.js +2 -2
  110. package/dist/cli-delegate/cmd_prune.js +3 -2
  111. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  112. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  113. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  114. package/dist/cli-delegate/cmd_sync.js +3 -2
  115. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  116. package/dist/cli-delegate/cmd_validate.js +3 -2
  117. package/dist/discovery/deprecation-report.md +1 -1
  118. package/dist/discovery/discovery-manifest.json +57 -57
  119. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  120. package/dist/discovery/discovery-manifest.summary.md +1 -1
  121. package/dist/discovery/dormancy-report.md +1 -1
  122. package/dist/discovery/orphan-report.md +1 -1
  123. package/dist/discovery/packs.json +2 -2
  124. package/dist/discovery/trust-report.md +1 -1
  125. package/dist/discovery/workspaces.json +2 -2
  126. package/dist/hooks/dispatch.js +1836 -712
  127. package/dist/install/claudeRuleRewrite.js +254 -0
  128. package/dist/install/detect.js +29 -16
  129. package/dist/install/detect_php_shape.js +159 -0
  130. package/dist/install/install.mjs +634 -428
  131. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  132. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  133. package/dist/mcp/registry-manifest.json +3 -3
  134. package/dist/mcp/server.json +3 -3
  135. package/dist/mcp/server.mjs +4818 -2645
  136. package/dist/server/schemas/settings.js +3 -0
  137. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  138. package/dist/ui/index.html +1 -1
  139. package/docs/MIGRATION.md +1 -1
  140. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  141. package/docs/contracts/provider-lifecycle.md +1 -1
  142. package/docs/contracts/settings-classes.md +10 -4
  143. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  144. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  145. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  146. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  147. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  148. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  149. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  150. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  151. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  152. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  153. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  154. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  155. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  156. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  157. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  158. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  159. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  160. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  161. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  162. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  163. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  164. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  165. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  166. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  167. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  168. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  169. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  170. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  171. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  172. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  173. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  174. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  175. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  176. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  177. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  178. package/docs/guidelines/augment-portability-patterns.md +6 -4
  179. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  180. package/docs/guidelines/cross-role-handoff.md +2 -2
  181. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  182. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  183. package/docs/guidelines/php/database.md +90 -7
  184. package/docs/guidelines/prompt-templates.md +7 -7
  185. package/llms.txt +2 -2
  186. package/package.json +5 -2
  187. package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  188. package/src/agent-src/scripts/guarded_baseline.ts +328 -0
  189. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  190. package/src/agent-src/scripts/stub_queue.ts +82 -0
  191. package/src/agent-src/scripts/stubs_due.ts +400 -0
  192. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  193. package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
  194. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  195. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  196. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  197. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  198. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  199. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  202. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  203. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  204. package/src/config/agent-settings.template.yml +32 -3
  205. package/src/config/assurance-capability-registry.json +21 -9
  206. package/src/config/canonical-terms.yml +119 -0
  207. package/src/config/capability-native-outcome-bars.json +81 -0
  208. package/src/config/ci-local-parity.yml +80 -0
  209. package/src/config/drafting-channels.yml +43 -0
  210. package/src/config/estate-count-budget.json +38 -36
  211. package/src/config/evaluator-budgets.json +14 -14
  212. package/src/config/gate-coverage.yml +579 -63
  213. package/src/config/gate-reachability-exemptions.json +21 -0
  214. package/src/config/gate-violation-baselines.json +37 -19
  215. package/src/config/harness-evolution-budget.json +25 -0
  216. package/src/config/lapsed-beta-baseline.json +96 -0
  217. package/src/config/memory-twin-verdicts.yml +129 -0
  218. package/src/config/metric-registry.yml +124 -0
  219. package/src/config/pack-size-budget.json +16 -15
  220. package/src/config/preamble-payload-budget.json +8 -8
  221. package/src/config/profiles/balanced.ini +27 -0
  222. package/src/config/profiles/full.ini +27 -0
  223. package/src/config/profiles/minimal.ini +27 -0
  224. package/src/config/publish-surface.json +9 -2
  225. package/src/config/routing-coverage-seed.json +16 -2
  226. package/src/config/rule-stub-ceilings.json +126 -112
  227. package/src/config/turnaround-budget.json +66 -0
  228. package/src/install/claudeRuleRewrite.ts +288 -0
  229. package/src/install/detect.ts +60 -17
  230. package/src/install/detect_php_shape.ts +191 -0
  231. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  232. package/src/scripts/_dispatch.bash +27 -0
  233. package/src/scripts/_lib/activation_ladder.ts +211 -0
  234. package/src/scripts/_lib/activation_states.ts +88 -0
  235. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  236. package/src/scripts/_lib/arith_claims.ts +181 -0
  237. package/src/scripts/_lib/arm_ranking.ts +62 -0
  238. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  239. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  240. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  241. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  242. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  243. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  244. package/src/scripts/_lib/candidate_record.ts +601 -0
  245. package/src/scripts/_lib/capture_rate.ts +319 -0
  246. package/src/scripts/_lib/collector_denominator.ts +771 -0
  247. package/src/scripts/_lib/collector_record.ts +340 -0
  248. package/src/scripts/_lib/collector_store.ts +664 -0
  249. package/src/scripts/_lib/collector_supervision.ts +827 -0
  250. package/src/scripts/_lib/concern_estate.ts +77 -0
  251. package/src/scripts/_lib/config_chain.ts +477 -0
  252. package/src/scripts/_lib/config_cost.ts +209 -0
  253. package/src/scripts/_lib/council_settings_block.ts +6 -0
  254. package/src/scripts/_lib/curator_ops.ts +172 -0
  255. package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
  256. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  257. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  258. package/src/scripts/_lib/empty_cycles.ts +88 -0
  259. package/src/scripts/_lib/eval_publication.ts +354 -0
  260. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  261. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  262. package/src/scripts/_lib/evidence_basis.ts +118 -0
  263. package/src/scripts/_lib/exec_evidence.ts +8 -0
  264. package/src/scripts/_lib/experience_card.ts +272 -0
  265. package/src/scripts/_lib/experience_report.ts +151 -0
  266. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  267. package/src/scripts/_lib/generated_by.ts +66 -0
  268. package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
  269. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  270. package/src/scripts/_lib/host_denominator.ts +687 -0
  271. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  272. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  273. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  274. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  275. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  276. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  277. package/src/scripts/_lib/loop_guards.ts +299 -0
  278. package/src/scripts/_lib/loss_class.ts +129 -0
  279. package/src/scripts/_lib/machine_wake.ts +51 -0
  280. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  281. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  282. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  283. package/src/scripts/_lib/orchestration_record.ts +253 -5
  284. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  285. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  286. package/src/scripts/_lib/paired_stats.ts +245 -0
  287. package/src/scripts/_lib/paired_verdict.ts +226 -0
  288. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  289. package/src/scripts/_lib/privacy_class.ts +47 -0
  290. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  291. package/src/scripts/_lib/repeated_failure.ts +105 -0
  292. package/src/scripts/_lib/repo_root.ts +111 -0
  293. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  294. package/src/scripts/_lib/role_split.ts +338 -0
  295. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  296. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  297. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  298. package/src/scripts/_lib/source_digest.ts +200 -0
  299. package/src/scripts/_lib/source_redact.ts +260 -0
  300. package/src/scripts/_lib/source_shape.ts +502 -0
  301. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  302. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  303. package/src/scripts/_lib/strip_comments.mjs +65 -0
  304. package/src/scripts/_lib/test_red_state.ts +154 -0
  305. package/src/scripts/_lib/trigger_shift.ts +144 -0
  306. package/src/scripts/_lib/untrusted_content.ts +82 -7
  307. package/src/scripts/adoption_report.ts +1 -1
  308. package/src/scripts/adr/evidence_census.ts +1 -1
  309. package/src/scripts/adr/regenerate_index.ts +26 -2
  310. package/src/scripts/adr_cite_check.ts +164 -1
  311. package/src/scripts/ai_council/blind_review.ts +11 -1
  312. package/src/scripts/ai_council/clients.ts +4 -0
  313. package/src/scripts/ai_council/config.ts +3 -0
  314. package/src/scripts/ai_council/consensus.ts +28 -8
  315. package/src/scripts/ai_council/consensus_round.ts +226 -0
  316. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  317. package/src/scripts/ai_council/inline_findings.ts +340 -0
  318. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  319. package/src/scripts/ai_council/orchestrator.ts +16 -203
  320. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  321. package/src/scripts/ai_council/pricing.ts +106 -0
  322. package/src/scripts/ai_council/prompts.ts +74 -7
  323. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  324. package/src/scripts/ai_council/py_format.ts +14 -3
  325. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  326. package/src/scripts/ai_council/response_record.ts +50 -0
  327. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  328. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  329. package/src/scripts/asset_delivery_ledger.ts +157 -0
  330. package/src/scripts/attest_artifact.ts +193 -0
  331. package/src/scripts/audit_auto_rules.ts +2 -1
  332. package/src/scripts/audit_command_surface.ts +1 -1
  333. package/src/scripts/audit_mcp_tools.ts +2 -2
  334. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  335. package/src/scripts/audit_user_type_axis.ts +2 -1
  336. package/src/scripts/bench_ab_clone.ts +215 -10
  337. package/src/scripts/bench_ab_integrity.ts +119 -5
  338. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  339. package/src/scripts/build_archive_index.ts +1 -1
  340. package/src/scripts/build_linear_digest.ts +1 -1
  341. package/src/scripts/build_proof.ts +11 -4
  342. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  343. package/src/scripts/build_source_digests.ts +157 -0
  344. package/src/scripts/cache_realization_report.ts +103 -0
  345. package/src/scripts/check_adr_frontmatter.ts +126 -0
  346. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  347. package/src/scripts/check_beta_review_markers.ts +235 -6
  348. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  349. package/src/scripts/check_claims.ts +576 -6
  350. package/src/scripts/check_composite_arming.ts +35 -0
  351. package/src/scripts/check_concern_admissions.ts +365 -0
  352. package/src/scripts/check_enforcement_coverage.ts +28 -0
  353. package/src/scripts/check_estate_count.ts +142 -1
  354. package/src/scripts/check_gate_reachability.ts +383 -0
  355. package/src/scripts/check_host_loadability.ts +104 -0
  356. package/src/scripts/check_loss_class_declared.ts +308 -0
  357. package/src/scripts/check_md_language.ts +15 -98
  358. package/src/scripts/check_memory_proposal.ts +18 -11
  359. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  360. package/src/scripts/check_no_external_sources.ts +281 -6
  361. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  362. package/src/scripts/check_pack_size.ts +59 -2
  363. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  364. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  365. package/src/scripts/check_publish_surface.ts +10 -1
  366. package/src/scripts/check_references.ts +24 -1
  367. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  368. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  369. package/src/scripts/check_score_contract.ts +26 -3
  370. package/src/scripts/check_static_parity.ts +285 -0
  371. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  372. package/src/scripts/check_suppression_hygiene.ts +15 -0
  373. package/src/scripts/ci_settle.ts +39 -2
  374. package/src/scripts/code_graph/build.ts +60 -3
  375. package/src/scripts/code_graph/extract.ts +44 -0
  376. package/src/scripts/code_graph/types.ts +24 -0
  377. package/src/scripts/collector_daemon.ts +714 -0
  378. package/src/scripts/config_cost_report.ts +302 -0
  379. package/src/scripts/consumer_matrix.ts +74 -1
  380. package/src/scripts/cost/budget.mjs +10 -3
  381. package/src/scripts/cost/track.mjs +10 -3
  382. package/src/scripts/council_cli.ts +37 -54
  383. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  384. package/src/scripts/evolution_lab.ts +980 -0
  385. package/src/scripts/external_sources_denylist.json +5 -18
  386. package/src/scripts/extract_audit_patterns.ts +21 -0
  387. package/src/scripts/fold_intake.ts +12 -1
  388. package/src/scripts/gen_discovery_baseline.ts +1 -1
  389. package/src/scripts/generate_capabilities_index.ts +12 -5
  390. package/src/scripts/generate_capability_matrix.ts +3 -3
  391. package/src/scripts/generate_command_flows.ts +2 -2
  392. package/src/scripts/generate_cookbook.ts +2 -2
  393. package/src/scripts/generate_index.ts +8 -1
  394. package/src/scripts/generate_knowledge_index.ts +2 -1
  395. package/src/scripts/generate_ownership_matrix.ts +2 -1
  396. package/src/scripts/generate_pack_manifests.ts +10 -2
  397. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  398. package/src/scripts/generate_settings_reference.ts +1 -1
  399. package/src/scripts/git_authorization_hook.ts +22 -1
  400. package/src/scripts/grade_target_readiness.ts +48 -5
  401. package/src/scripts/hook_effect_doctor.ts +261 -0
  402. package/src/scripts/hook_manifest.json +1 -1
  403. package/src/scripts/hook_manifest.yaml +98 -11
  404. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  405. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  406. package/src/scripts/hooks/concern_registry.ts +4 -0
  407. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  408. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  409. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  410. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  411. package/src/scripts/hooks/shims/install.sh +61 -0
  412. package/src/scripts/hooks/shims/php +101 -0
  413. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  414. package/src/scripts/hot_context_hook.ts +16 -0
  415. package/src/scripts/install-hooks.sh +20 -5
  416. package/src/scripts/install.ts +17 -35
  417. package/src/scripts/inventory_frontmatter.ts +2 -1
  418. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  419. package/src/scripts/lint_canonical_terms.ts +604 -0
  420. package/src/scripts/lint_composition_review.ts +619 -0
  421. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  422. package/src/scripts/lint_eval_specs.ts +593 -0
  423. package/src/scripts/lint_hook_manifest.ts +19 -0
  424. package/src/scripts/lint_host_portability.ts +373 -0
  425. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  426. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  427. package/src/scripts/lint_metric_consumers.ts +355 -0
  428. package/src/scripts/lint_skill_descriptions.ts +18 -1
  429. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  430. package/src/scripts/lint_skill_link_reach.ts +252 -0
  431. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  432. package/src/scripts/lint_ticket_buildable.ts +17 -1
  433. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  434. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  435. package/src/scripts/measure_docs_dead_links.ts +348 -0
  436. package/src/scripts/measure_host_capture.ts +461 -0
  437. package/src/scripts/migration_status.ts +3 -3
  438. package/src/scripts/model_rule_injection.ts +60 -0
  439. package/src/scripts/orchestration_record.ts +14 -0
  440. package/src/scripts/preamble_byte_census.ts +139 -10
  441. package/src/scripts/prepack-check.mjs +4 -1
  442. package/src/scripts/probe_turnaround.ts +384 -0
  443. package/src/scripts/probe_unblocked_ask.ts +279 -0
  444. package/src/scripts/render_benchmark_md.ts +1 -1
  445. package/src/scripts/rule_activation_census.ts +70 -9
  446. package/src/scripts/rule_backlinks.ts +1 -1
  447. package/src/scripts/run_lifecycle_suite.ts +208 -0
  448. package/src/scripts/run_skill_evals.ts +40 -0
  449. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  450. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  451. package/src/scripts/schemas/evals.schema.json +24 -1
  452. package/src/scripts/schemas/rule.schema.json +52 -1
  453. package/src/scripts/schemas/skill.schema.json +17 -2
  454. package/src/scripts/skill_overlap.ts +7 -1
  455. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  456. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  457. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  458. package/src/scripts/skill_usage_report.ts +2 -1
  459. package/src/scripts/stubs_due.ts +211 -0
  460. package/src/scripts/sweep_source_surfaces.ts +678 -0
  461. package/src/scripts/sync_pr_branch.ts +3 -3
  462. package/src/scripts/trigger_eval_grandfather.json +202 -222
  463. package/src/scripts/utilization_report.ts +22 -2
  464. package/src/server/schemas/settings.ts +5 -0
  465. package/src/templates/marketing-copy.yml +1 -1
  466. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Pre-registered guards for the governed harness-evolution programme.
3
+ *
4
+ * `road-to-governed-harness-evolution` Phase 0, steps 0.4, 0.5 and 0.6. All
5
+ * three are PRE-REGISTRATION: the runner they guard does not exist yet (Phases
6
+ * 1-7 are unbuilt), and that is the point — a budget invariant written after
7
+ * the first run is a description of what was spent, and a leakage abort written
8
+ * after the first leak is a post-mortem.
9
+ *
10
+ * The three guards, and the failure each exists to make impossible:
11
+ *
12
+ * 0.4 EVALUATOR TRUST BOUNDARY. The parent design named which fields are
13
+ * proposer-visible and which are evaluator-private, and stopped at the
14
+ * naming. A declared boundary that nothing checks is a boundary that
15
+ * holds until the first convenient exception. {@link discloseToProposer}
16
+ * refuses a holdout field and records every field it did release.
17
+ *
18
+ * 0.5 BUDGET INVARIANT. Candidate count, trial repetitions and a spend
19
+ * ceiling, fixed BEFORE the run and aborting rather than truncating. A
20
+ * truncated run yields `underpowered`, which `paired_verdict` refuses to
21
+ * call a pass (`_lib/paired_verdict.ts:26`) and which a reader mistakes
22
+ * for one.
23
+ *
24
+ * 0.6 EPISTEMIC STOP CONDITIONS. A spend cap stops on cost; most of the
25
+ * reasons to stop are about VALIDITY. Each condition below carries a
26
+ * detector or is explicitly marked model-carried — never implied to be
27
+ * checked when it is not.
28
+ *
29
+ * Nothing here spends, fetches, or writes. The guards are pure functions over
30
+ * declared state so a future runner can call them before it does any of those.
31
+ */
32
+
33
+ /**
34
+ * What a field may be shown to.
35
+ *
36
+ * `holdout` is the load-bearing member: it names a value whose disclosure
37
+ * INVALIDATES the run rather than merely leaking information, which is why
38
+ * {@link discloseToProposer} aborts on it instead of redacting.
39
+ */
40
+ export type VisibilityClass =
41
+ /** The proposer may read it. Candidate text, public metric names, the task. */
42
+ | 'proposer-visible'
43
+ /** The evaluator reads it; the proposer never does. Per-trial raw scores. */
44
+ | 'evaluator-private'
45
+ /** Sealed-partition truth. Disclosure invalidates the run, not just the trial. */
46
+ | 'holdout';
47
+
48
+ /** One observation field and the boundary it sits behind. */
49
+ export interface FieldVisibility {
50
+ readonly field: string;
51
+ readonly visibility: VisibilityClass;
52
+ }
53
+
54
+ /** A field released to a proposer, with the class it was released under. */
55
+ export interface DisclosureRecord {
56
+ readonly field: string;
57
+ readonly visibility: VisibilityClass;
58
+ }
59
+
60
+ export class HoldoutLeakError extends Error {
61
+ readonly field: string;
62
+ constructor(field: string) {
63
+ super(
64
+ `holdout leakage: field '${field}' is class 'holdout' and reached proposer context. ` +
65
+ 'The run is INVALID, not degraded — a proposer that has seen sealed truth cannot ' +
66
+ 'be evaluated against it, and no later stage can undo that. Abort, do not redact.',
67
+ );
68
+ this.name = 'HoldoutLeakError';
69
+ this.field = field;
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Release an observation to a proposer, recording every field released.
75
+ *
76
+ * Fails CLOSED on an undeclared field: a field with no `visibility_class` is
77
+ * treated as `holdout`, because the alternative — defaulting to visible —
78
+ * makes forgetting to classify a new field silently equivalent to publishing
79
+ * it. Step 0.4's whole subject is that a declared boundary nothing checks is
80
+ * not a boundary.
81
+ *
82
+ * @throws {HoldoutLeakError} on the first holdout or undeclared field.
83
+ */
84
+ export function discloseToProposer(
85
+ observation: Readonly<Record<string, unknown>>,
86
+ schema: readonly FieldVisibility[],
87
+ log: DisclosureRecord[],
88
+ ): Record<string, unknown> {
89
+ const byField = new Map(schema.map((f) => [f.field, f.visibility]));
90
+ const out: Record<string, unknown> = {};
91
+ for (const field of Object.keys(observation)) {
92
+ const visibility = byField.get(field) ?? 'holdout';
93
+ if (visibility === 'holdout') throw new HoldoutLeakError(field);
94
+ if (visibility !== 'proposer-visible') continue;
95
+ log.push({ field, visibility });
96
+ out[field] = observation[field];
97
+ }
98
+ return out;
99
+ }
100
+
101
+ /** The budget fixed before a run. Every field is a ceiling, never a target. */
102
+ export interface RunBudget {
103
+ readonly maxCandidates: number;
104
+ readonly maxTrialsPerCandidate: number;
105
+ /** Spend ceiling in whole cents, so no float ever decides an abort. */
106
+ readonly maxSpendCents: number;
107
+ }
108
+
109
+ /** What a run intends to do, as declared before it starts. */
110
+ export interface RunPlan {
111
+ readonly candidates: number;
112
+ readonly trialsPerCandidate: number;
113
+ readonly estimatedSpendCents: number;
114
+ }
115
+
116
+ export class BudgetExceededError extends Error {
117
+ readonly dimension: 'candidates' | 'trials' | 'spend';
118
+ constructor(dimension: 'candidates' | 'trials' | 'spend', planned: number, ceiling: number) {
119
+ super(
120
+ `budget invariant: planned ${dimension} ${String(planned)} exceeds the pre-registered ` +
121
+ `ceiling ${String(ceiling)}. ABORTING BEFORE THE RUN, not truncating it — a ` +
122
+ 'truncated run yields `underpowered`, which paired_verdict refuses to call a pass ' +
123
+ 'and which a reader mistakes for one.',
124
+ );
125
+ this.name = 'BudgetExceededError';
126
+ this.dimension = dimension;
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Check a plan against the pre-registered budget, BEFORE anything is spent.
132
+ *
133
+ * The order is deliberate — candidates, then trials, then spend. The first two
134
+ * are free to check and the third is the one an operator argues about; failing
135
+ * on a countable dimension first makes the message actionable without any
136
+ * pricing discussion.
137
+ *
138
+ * @throws {BudgetExceededError} on the first dimension over its ceiling.
139
+ */
140
+ export function assertWithinBudget(plan: RunPlan, budget: RunBudget): void {
141
+ if (plan.candidates > budget.maxCandidates) {
142
+ throw new BudgetExceededError('candidates', plan.candidates, budget.maxCandidates);
143
+ }
144
+ if (plan.trialsPerCandidate > budget.maxTrialsPerCandidate) {
145
+ throw new BudgetExceededError('trials', plan.trialsPerCandidate, budget.maxTrialsPerCandidate);
146
+ }
147
+ if (plan.estimatedSpendCents > budget.maxSpendCents) {
148
+ throw new BudgetExceededError('spend', plan.estimatedSpendCents, budget.maxSpendCents);
149
+ }
150
+ }
151
+
152
+ /**
153
+ * A stop condition, and whether anything actually checks it.
154
+ *
155
+ * `detector: null` means MODEL-CARRIED and is written out rather than left to
156
+ * inference. This repository's own records name the coverage-inflation failure
157
+ * — a condition listed as if it were enforced when nothing enforces it — often
158
+ * enough that the honest field is cheaper than the audit that finds it later.
159
+ */
160
+ export interface StopCondition {
161
+ readonly id: string;
162
+ readonly why: string;
163
+ /** The exported detector's name, or `null` for model-carried. */
164
+ readonly detector: string | null;
165
+ }
166
+
167
+ /**
168
+ * The four epistemic stop conditions, from the roadmap's step 0.6.
169
+ *
170
+ * Both parent designs carried eight or nine stop conditions; the master
171
+ * compressed them into the budget cap. A spend cap stops on COST, and these
172
+ * stop on VALIDITY — stopping with INDETERMINATE is a valid result, and an
173
+ * honest null is a success when it prevents unnecessary architecture.
174
+ */
175
+ export const STOP_CONDITIONS: readonly StopCondition[] = [
176
+ {
177
+ id: 'holdout-underpowered',
178
+ why: 'the sealed partition no longer carries enough discordant trials for the exact sign test to resolve, so every verdict it produces is `underpowered` by construction',
179
+ detector: 'holdoutUnderpowered',
180
+ },
181
+ {
182
+ id: 'evaluator-leakage',
183
+ why: 'a holdout field reached proposer context; the run is invalid rather than degraded, and no later stage can undo it',
184
+ detector: 'discloseToProposer',
185
+ },
186
+ {
187
+ id: 'diversity-collapse',
188
+ why: 'the candidate set has collapsed to semantic duplicates, so the trials measure sampling noise rather than a difference between candidates',
189
+ detector: 'diversityCollapsed',
190
+ },
191
+ {
192
+ id: 'cross-component-interference',
193
+ why: 'two components changed in one run and credit cannot be assigned to either',
194
+ // Honest null: deciding whether two changes interfere needs a causal
195
+ // model of the components, and this programme has none. Marked
196
+ // model-carried rather than given a detector that would pattern-match
197
+ // on file paths and report confidence it does not have.
198
+ detector: null,
199
+ },
200
+ ];
201
+
202
+ /**
203
+ * Has the candidate set collapsed to semantic duplicates?
204
+ *
205
+ * Deterministic and deliberately crude: normalise, then count DISTINCT
206
+ * candidates. Below `minDistinct` the set is collapsed. No embedding, no model
207
+ * call — a detector that needs a model to decide whether to stop a model run is
208
+ * a detector that can fail in the same way as the thing it watches.
209
+ *
210
+ * Normalisation is case- and whitespace-folding only. Two candidates differing
211
+ * by a synonym read as distinct here, which UNDER-detects; that direction is
212
+ * chosen on purpose, because a false stop discards a valid run while a missed
213
+ * stop is caught by the verdict coming back `no-change`.
214
+ */
215
+ export function diversityCollapsed(candidates: readonly string[], minDistinct = 2): boolean {
216
+ const normalised = new Set(candidates.map((c) => c.trim().toLowerCase().replace(/\s+/g, ' ')));
217
+ return normalised.size < minDistinct;
218
+ }
219
+
220
+ /**
221
+ * Is the holdout partition too small for the exact sign test to resolve?
222
+ *
223
+ * Mirrors `paired_verdict`'s own floor rather than restating a number:
224
+ * `MIN_DISCORDANT` there is DERIVED from the exact test at ALPHA, not chosen,
225
+ * so a second hard-coded constant here would be a fork of a derivation.
226
+ */
227
+ export function holdoutUnderpowered(discordantTrials: number, minDiscordant: number): boolean {
228
+ return discordantTrials < minDiscordant;
229
+ }
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Does any of this configuration take effect here?
3
+ * (`road-to-delivered-cost-truth` Phase 3.)
4
+ *
5
+ * `doctorShell` states its own scope: Node version, package-root resolution,
6
+ * whether the Bash dispatcher exists. That is an ENVIRONMENT probe. It cannot
7
+ * answer whether a bound hook actually fires on this host — which is the
8
+ * question that decides whether any of the configuration this suite ships is
9
+ * doing anything here.
10
+ *
11
+ * FIVE STATES, NOT FOUR. The roadmap named four binding states; both council
12
+ * seats (2026-08-28, 2/2, resolving `how-far-the-effect-probe-may-reach` as
13
+ * option (c)) split one of them, and the split is real:
14
+ *
15
+ * effective fired, and a deny would have been honoured
16
+ * bound-discarded fired, and the host discards its output
17
+ * bound-not-fired the manifest binds it, and no dispatch was observed
18
+ * unbound the manifest does not bind it on this host
19
+ * unknown it was not safe to probe
20
+ *
21
+ * `bound-not-fired` and `unknown` were one bucket in the four-state model, and
22
+ * collapsing them hides the difference between "the host ignored it" and "we
23
+ * declined to look".
24
+ *
25
+ * ELIGIBILITY IS MEASURED, NOT DECLARED. Option (c) as written restricts
26
+ * dispatch to concerns that DECLARE themselves side-effect free, and both seats
27
+ * then said the same thing from different directions: a self-declared property
28
+ * nothing verifies is a weak control this repository flags as a defect
29
+ * elsewhere, and the dispatch should be sandboxed even for declared-safe
30
+ * concerns. Taken together that makes the declaration redundant — so this module
31
+ * measures the property instead: run the concern against a scratch root, compare
32
+ * the tree before and after, and treat any write as ineligible. A concern that
33
+ * writes is reported `unknown`, which is the honest answer and never a success.
34
+ *
35
+ * `unknown` IS NEVER RENDERED AS `effective`. That is the one rule every seat
36
+ * stated independently, and it is what the three coverage metrics exist to keep
37
+ * visible: a report can be truthful about each concern and still mislead, if
38
+ * almost nothing was actually probed.
39
+ */
40
+
41
+ export const PROBE_STATES = ['effective', 'bound-discarded', 'bound-not-fired', 'unbound', 'unknown'] as const;
42
+ export type ProbeState = (typeof PROBE_STATES)[number];
43
+
44
+ /** The verdict a whole host gets. */
45
+ export const HOST_VERDICTS = ['effective', 'partial', 'inert', 'unknown'] as const;
46
+ export type HostVerdict = (typeof HOST_VERDICTS)[number];
47
+
48
+ export interface ConcernProbe {
49
+ concern: string;
50
+ slot: string;
51
+ state: ProbeState;
52
+ /** Always populated — for `unknown` it is the reason the probe declined. */
53
+ reason: string;
54
+ /** Did the sandbox observe a write? `null` when no dispatch was attempted. */
55
+ wrote_in_sandbox: boolean | null;
56
+ }
57
+
58
+ export interface Coverage {
59
+ /** dispatched / total — tests the control itself. */
60
+ dispatch_rate: number;
61
+ /** non-unknown / total — where an answer exists at all. */
62
+ known_state_rate: number;
63
+ /** (effective + bound-discarded) / total — actual observed confidence. */
64
+ verified_rate: number;
65
+ }
66
+
67
+ export interface HostReport {
68
+ host: string;
69
+ probes: ConcernProbe[];
70
+ coverage: Coverage;
71
+ verdict: HostVerdict;
72
+ /** For `partial`, the slots that are inert. Empty otherwise. */
73
+ inert_slots: string[];
74
+ reason: string;
75
+ }
76
+
77
+ function rate(n: number, d: number): number {
78
+ return d === 0 ? 0 : n / d;
79
+ }
80
+
81
+ export function coverageOf(probes: readonly ConcernProbe[]): Coverage {
82
+ const total = probes.length;
83
+ const dispatched = probes.filter((p) => p.wrote_in_sandbox !== null).length;
84
+ const known = probes.filter((p) => p.state !== 'unknown').length;
85
+ const verified = probes.filter((p) => p.state === 'effective' || p.state === 'bound-discarded').length;
86
+ return {
87
+ dispatch_rate: rate(dispatched, total),
88
+ known_state_rate: rate(known, total),
89
+ verified_rate: rate(verified, total),
90
+ };
91
+ }
92
+
93
+ /**
94
+ * One verdict for the host.
95
+ *
96
+ * The ordering is the honesty: `unknown` is checked BEFORE `effective`, so a run
97
+ * that could not establish anything can never present itself as a working
98
+ * configuration. A single `effective` among a hundred `unknown`s is `unknown`,
99
+ * not `partial` — because the hundred were not measured, and `partial` is a
100
+ * claim about what IS inert rather than about what was not looked at.
101
+ */
102
+ export function hostVerdict(probes: readonly ConcernProbe[]): { verdict: HostVerdict; inert: string[]; reason: string } {
103
+ if (probes.length === 0) {
104
+ return { verdict: 'unknown', inert: [], reason: 'no concern is bound on this host, so there is nothing to probe' };
105
+ }
106
+ const known = probes.filter((p) => p.state !== 'unknown');
107
+ if (known.length === 0) {
108
+ return {
109
+ verdict: 'unknown',
110
+ inert: [],
111
+ reason: `none of the ${String(probes.length)} bound concern(s) could be probed safely — no state was established`,
112
+ };
113
+ }
114
+ const effective = known.filter((p) => p.state === 'effective');
115
+ const inertProbes = known.filter((p) => p.state === 'bound-discarded' || p.state === 'bound-not-fired' || p.state === 'unbound');
116
+ const inert = [...new Set(inertProbes.map((p) => p.slot))].sort();
117
+
118
+ if (effective.length === 0) {
119
+ return {
120
+ verdict: 'inert',
121
+ inert,
122
+ reason: `no probed concern reached the model on this host (${String(known.length)} of ${String(probes.length)} probed)`,
123
+ };
124
+ }
125
+ if (inertProbes.length === 0 && known.length === probes.length) {
126
+ return { verdict: 'effective', inert: [], reason: `every bound concern (${String(probes.length)}) took effect` };
127
+ }
128
+ return {
129
+ verdict: 'partial',
130
+ inert,
131
+ reason:
132
+ `${String(effective.length)} of ${String(probes.length)} bound concern(s) took effect; ` +
133
+ `inert slot(s): ${inert.length === 0 ? 'none' : inert.join(', ')}` +
134
+ (known.length < probes.length ? ` · ${String(probes.length - known.length)} could not be probed` : ''),
135
+ };
136
+ }
137
+
138
+ export function buildHostReport(host: string, probes: readonly ConcernProbe[]): HostReport {
139
+ const v = hostVerdict(probes);
140
+ return { host, probes: [...probes], coverage: coverageOf(probes), verdict: v.verdict, inert_slots: v.inert, reason: v.reason };
141
+ }