@event4u/agent-config 16.1.0 → 16.3.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 (467) 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 +98 -257
  5. package/README.md +14 -12
  6. package/dist/agent-src/commands/analyze/inbox.md +1 -1
  7. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  8. package/dist/agent-src/commands/bug/fix.md +17 -2
  9. package/dist/agent-src/commands/feature/plan.md +1 -1
  10. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  11. package/dist/agent-src/commands/fix/ci.md +1 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/jira-ticket.md +1 -1
  14. package/dist/agent-src/commands/roadmap/create.md +1 -1
  15. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  16. package/dist/agent-src/commands/roadmap/process-full.md +5 -5
  17. package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
  18. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  19. package/dist/agent-src/commands/roadmap.md +18 -4
  20. package/dist/agent-src/commands/tests/create.md +17 -3
  21. package/dist/agent-src/commands/tests/execute.md +22 -5
  22. package/dist/agent-src/commands/work.md +4 -0
  23. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  25. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
  27. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
  28. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  29. package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
  30. package/dist/agent-src/rules/active-remediation.md +1 -1
  31. package/dist/agent-src/rules/autonomous-execution.md +1 -0
  32. package/dist/agent-src/rules/broken-access-control.md +1 -0
  33. package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
  34. package/dist/agent-src/rules/context-hygiene.md +1 -1
  35. package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
  36. package/dist/agent-src/rules/design-fidelity.md +13 -16
  37. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
  38. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
  39. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  40. package/dist/agent-src/rules/domain-safety-retention.md +1 -0
  41. package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
  42. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  43. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  44. package/dist/agent-src/rules/finance-safety-floor.md +1 -0
  45. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  46. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  47. package/dist/agent-src/rules/legal-safety-floor.md +3 -2
  48. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  49. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  50. package/dist/agent-src/rules/media-governance-routing.md +14 -17
  51. package/dist/agent-src/rules/persona-governance.md +2 -2
  52. package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
  53. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  54. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  55. package/dist/agent-src/rules/runtime-safety.md +1 -0
  56. package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
  57. package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
  58. package/dist/agent-src/rules/session-canary.md +8 -62
  59. package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
  60. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  61. package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
  62. package/dist/agent-src/rules/tool-safety.md +1 -0
  63. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  64. package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
  65. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  66. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  67. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  68. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  69. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  70. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
  71. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  72. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  74. package/dist/agent-src/skills/design-review/SKILL.md +30 -4
  75. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  76. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  77. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
  78. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  79. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  80. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  81. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  82. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  83. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  84. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  85. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  86. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  87. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  88. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  89. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  90. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  91. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  92. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  93. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  94. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  95. package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
  96. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  97. package/dist/agent-src/templates/roadmaps.md +30 -0
  98. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  99. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  100. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  101. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  102. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  103. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  104. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  105. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  106. package/dist/cli/python/knowledge_ingest.js +1 -1
  107. package/dist/cli/python/workspace_drive.js +1 -1
  108. package/dist/cli/registry.js +1 -1
  109. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  110. package/dist/cli-delegate/check_update_banner.js +12 -1
  111. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  112. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  113. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  114. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
  115. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  116. package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
  117. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
  118. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  119. package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
  120. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
  121. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  122. package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
  123. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
  124. package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
  125. package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
  126. package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
  127. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  128. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  129. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
  130. package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
  131. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
  132. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
  133. package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
  134. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  135. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  136. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  137. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  138. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  139. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  140. package/dist/cli-delegate/cmd_conformance.js +1862 -809
  141. package/dist/cli-delegate/cmd_doctor.js +13 -6
  142. package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
  143. package/dist/cli-delegate/cmd_explain.js +5 -5
  144. package/dist/cli-delegate/cmd_export.js +11 -8
  145. package/dist/cli-delegate/cmd_fleet.js +3 -3
  146. package/dist/cli-delegate/cmd_handoff.js +10 -7
  147. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  148. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  149. package/dist/cli-delegate/cmd_migrate.js +2 -2
  150. package/dist/cli-delegate/cmd_packs_active.js +3 -3
  151. package/dist/cli-delegate/cmd_preflight.js +6 -6
  152. package/dist/cli-delegate/cmd_prune.js +11 -8
  153. package/dist/cli-delegate/cmd_refresh.js +2 -1
  154. package/dist/cli-delegate/cmd_route_audit.js +8 -6
  155. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  156. package/dist/cli-delegate/cmd_session_recycle.js +4 -3
  157. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  158. package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
  159. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  160. package/dist/cli-delegate/cmd_sync.js +11 -8
  161. package/dist/cli-delegate/cmd_uninstall.js +11 -8
  162. package/dist/cli-delegate/cmd_update.js +1 -1
  163. package/dist/cli-delegate/cmd_upgrade.js +3 -2
  164. package/dist/cli-delegate/cmd_validate.js +11 -8
  165. package/dist/cli-delegate/cmd_versions.js +1 -1
  166. package/dist/cli-delegate/deferral_carry.js +16 -0
  167. package/dist/cli-delegate/gate_execute.js +2 -2
  168. package/dist/cli-delegate/roadmap_gates.js +5 -5
  169. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  170. package/dist/discovery/deprecation-report.md +1 -1
  171. package/dist/discovery/discovery-manifest.json +132 -80
  172. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  173. package/dist/discovery/discovery-manifest.summary.md +3 -3
  174. package/dist/discovery/dormancy-report.md +1 -1
  175. package/dist/discovery/orphan-report.md +1 -1
  176. package/dist/discovery/packs.json +7 -5
  177. package/dist/discovery/trust-report.md +2 -2
  178. package/dist/discovery/workspaces.json +6 -4
  179. package/dist/hooks/dispatch.js +7972 -5186
  180. package/dist/hooks/dispatch.sha256 +1 -0
  181. package/dist/install/claudePathsPlan.js +47 -6
  182. package/dist/install/claudeRuleRewrite.js +7 -0
  183. package/dist/install/emit_host_rules_cli.js +39 -36
  184. package/dist/install/globalRuleScope.js +87 -0
  185. package/dist/install/host_rule_ownership.js +160 -0
  186. package/dist/install/install.mjs +2226 -1055
  187. package/dist/install/installThinLayer.js +261 -0
  188. package/dist/install/installedRuleLinks.js +176 -0
  189. package/dist/install/wizard-plan.js +24 -0
  190. package/dist/mcp/registry-manifest.json +3 -3
  191. package/dist/mcp/server.json +2 -2
  192. package/dist/mcp/server.mjs +40913 -34865
  193. package/dist/scripts/_lib/agent_settings.js +11 -0
  194. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  195. package/dist/scripts/_lib/installed_layer.js +378 -0
  196. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  197. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  198. package/dist/scripts/_lib/rule_injection.js +67 -10
  199. package/dist/scripts/_lib/rule_law_section.js +122 -0
  200. package/dist/scripts/_lib/thin_rules.js +458 -0
  201. package/dist/scripts/_lib/windsurf_render.js +60 -0
  202. package/dist/scripts/condense.js +14 -26
  203. package/dist/scripts/project_thin_rules.js +14 -294
  204. package/dist/server/schemas/settings.js +29 -0
  205. package/dist/shared/skillRanking.js +74 -13
  206. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  207. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  208. package/dist/ui/index.html +2 -2
  209. package/docs/contracts/settings-classes.md +10 -6
  210. package/package.json +4 -4
  211. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  212. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  213. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  214. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  215. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  216. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  217. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  218. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  219. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  220. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  221. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  222. package/src/config/agent-settings.template.yml +91 -22
  223. package/src/config/ci-local-parity.yml +18 -0
  224. package/src/config/continuity-surface.json +9 -2
  225. package/src/config/evaluator-budgets.json +4 -4
  226. package/src/config/gate-coverage.yml +327 -3
  227. package/src/config/gate-violation-baselines.json +21 -9
  228. package/src/config/hook-bundle-budget.json +25 -0
  229. package/src/config/hook-latency-budget.json +21 -0
  230. package/src/config/hook-token-budget.json +8 -3
  231. package/src/config/host-instruction-limits.json +33 -0
  232. package/src/config/metric-registry.yml +114 -0
  233. package/src/config/placeholder-drift-budget.json +10 -0
  234. package/src/config/routing-coverage-seed.json +38 -3
  235. package/src/config/rule-activation-census.json +7 -3
  236. package/src/config/rule-consequence-class.json +161 -0
  237. package/src/config/rule-law-ceilings.json +99 -0
  238. package/src/install/claudePathsPlan.ts +46 -4
  239. package/src/install/claudeRuleRewrite.ts +10 -1
  240. package/src/install/emit_host_rules_cli.ts +43 -34
  241. package/src/install/globalRuleScope.ts +109 -0
  242. package/src/install/host_rule_ownership.ts +170 -0
  243. package/src/install/installThinLayer.ts +312 -0
  244. package/src/install/installedRuleLinks.ts +220 -0
  245. package/src/install/wizard-plan.ts +24 -0
  246. package/src/scripts/_cli/cmd_doctor.ts +28 -90
  247. package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
  248. package/src/scripts/_cli/doctor_execution.ts +100 -17
  249. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  250. package/src/scripts/_dispatch.bash +16 -2
  251. package/src/scripts/_lib/agent_settings.ts +11 -0
  252. package/src/scripts/_lib/body_portable.ts +102 -0
  253. package/src/scripts/_lib/cc_transcript.ts +132 -1
  254. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  255. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  256. package/src/scripts/_lib/estate_offsets.ts +241 -0
  257. package/src/scripts/_lib/exemption_shape.ts +143 -0
  258. package/src/scripts/_lib/fnv.ts +23 -0
  259. package/src/scripts/_lib/foreign_scan.ts +106 -0
  260. package/src/scripts/_lib/forge_protection.ts +114 -0
  261. package/src/scripts/_lib/forge_reader.ts +558 -0
  262. package/src/scripts/_lib/gitignore_block.ts +314 -0
  263. package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
  264. package/src/scripts/_lib/graph_feeder_record.ts +214 -0
  265. package/src/scripts/_lib/hook_settings.ts +73 -0
  266. package/src/scripts/_lib/host_capability.ts +40 -19
  267. package/src/scripts/_lib/host_env_write.ts +111 -0
  268. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  269. package/src/scripts/_lib/installed_layer.ts +538 -0
  270. package/src/scripts/_lib/json_merge.ts +82 -0
  271. package/src/scripts/_lib/json_pointers.ts +93 -11
  272. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  273. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  274. package/src/scripts/_lib/machine_wake.ts +16 -3
  275. package/src/scripts/_lib/neighbour_census.ts +760 -0
  276. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  277. package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
  278. package/src/scripts/_lib/obligations.ts +119 -8
  279. package/src/scripts/_lib/probe_inputs.ts +271 -0
  280. package/src/scripts/_lib/prompt_shape.ts +46 -0
  281. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  282. package/src/scripts/_lib/release_highlights.ts +2 -1
  283. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  284. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  285. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  286. package/src/scripts/_lib/review_coverage.ts +134 -0
  287. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  288. package/src/scripts/_lib/rule_injection.ts +130 -10
  289. package/src/scripts/_lib/rule_law_section.ts +147 -0
  290. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  291. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  292. package/src/scripts/_lib/skill_origin.ts +254 -0
  293. package/src/scripts/_lib/structural_hiding.ts +622 -0
  294. package/src/scripts/_lib/structured_ask.ts +64 -21
  295. package/src/scripts/_lib/thin_rules.ts +540 -0
  296. package/src/scripts/_lib/touched_file_quality.ts +434 -0
  297. package/src/scripts/_lib/turn_end_refusals.ts +600 -4
  298. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  299. package/src/scripts/_lib/verification_command.ts +324 -0
  300. package/src/scripts/_lib/verification_evidence.ts +647 -0
  301. package/src/scripts/_lib/verify_clause.ts +280 -0
  302. package/src/scripts/_lib/windsurf_render.ts +63 -0
  303. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  304. package/src/scripts/ai_council/clients.ts +26 -57
  305. package/src/scripts/ai_council/config.ts +1 -1
  306. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  307. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  308. package/src/scripts/audit_skill_overlap.ts +261 -0
  309. package/src/scripts/before_complete_hook.ts +573 -25
  310. package/src/scripts/bench_hook_latency.ts +412 -5
  311. package/src/scripts/bench_touched_file_quality.ts +238 -0
  312. package/src/scripts/cache_realization_report.ts +61 -1
  313. package/src/scripts/check_argument_hint.ts +287 -0
  314. package/src/scripts/check_claims.ts +125 -1
  315. package/src/scripts/check_enforcement_coverage.ts +38 -9
  316. package/src/scripts/check_enforcement_matrix.ts +621 -22
  317. package/src/scripts/check_estate_count.ts +130 -153
  318. package/src/scripts/check_finding_dispositions.ts +138 -7
  319. package/src/scripts/check_generator_sync.ts +71 -0
  320. package/src/scripts/check_hook_bundle_composition.ts +370 -0
  321. package/src/scripts/check_host_docs_digest.ts +786 -0
  322. package/src/scripts/check_host_format_column.ts +559 -0
  323. package/src/scripts/check_input_references.ts +228 -0
  324. package/src/scripts/check_inputs_parity.ts +235 -0
  325. package/src/scripts/check_kernel_edit_ratified.ts +89 -9
  326. package/src/scripts/check_kill_switch_table.ts +294 -0
  327. package/src/scripts/check_memory.ts +7 -1
  328. package/src/scripts/check_placeholder_drift.ts +221 -0
  329. package/src/scripts/check_read_surface_coverage.ts +515 -0
  330. package/src/scripts/check_release_highlights.ts +10 -0
  331. package/src/scripts/check_release_holds.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +38 -15
  333. package/src/scripts/check_routing_coverage.ts +378 -11
  334. package/src/scripts/check_standing_rule_delivery.ts +33 -13
  335. package/src/scripts/check_static_parity.ts +17 -0
  336. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  337. package/src/scripts/ci_settle.ts +145 -19
  338. package/src/scripts/closure_scan.ts +115 -1
  339. package/src/scripts/code_graph/detect.ts +127 -7
  340. package/src/scripts/code_graph/foreign.ts +194 -0
  341. package/src/scripts/code_graph/query.ts +217 -4
  342. package/src/scripts/code_graph/types.ts +26 -2
  343. package/src/scripts/code_graph/validate.ts +3 -1
  344. package/src/scripts/code_graph/verbs.ts +103 -0
  345. package/src/scripts/compile_hook_manifest.ts +90 -14
  346. package/src/scripts/condense.ts +14 -27
  347. package/src/scripts/estate_exemption_shape.ts +202 -0
  348. package/src/scripts/external_sources_denylist.json +29 -4
  349. package/src/scripts/generate_host_cost_table.ts +1 -1
  350. package/src/scripts/hook_manifest.json +1 -1
  351. package/src/scripts/hook_manifest.yaml +192 -14
  352. package/src/scripts/hooks/block_config_weakening.ts +294 -4
  353. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  354. package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
  355. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  356. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  357. package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
  358. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  359. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  360. package/src/scripts/hooks/concern_registry.ts +2 -0
  361. package/src/scripts/hooks/concern_timings.ts +94 -0
  362. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  363. package/src/scripts/hooks/design_pass_hook.ts +100 -9
  364. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  365. package/src/scripts/hooks/dispatch_hook.ts +77 -71
  366. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  367. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  368. package/src/scripts/hooks/evidence_independence.ts +1 -2
  369. package/src/scripts/hooks/exit_codes.ts +129 -0
  370. package/src/scripts/hooks/host_lowering.json +1 -0
  371. package/src/scripts/hooks/host_lowering.ts +146 -3
  372. package/src/scripts/hooks/host_lowering.yaml +262 -46
  373. package/src/scripts/hooks/host_semantics.ts +30 -2
  374. package/src/scripts/hooks/injection_budget.ts +9 -2
  375. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  376. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  377. package/src/scripts/hooks/memory_recall_hook.ts +1 -2
  378. package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
  379. package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
  380. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  381. package/src/scripts/hooks/payload_stub.ts +10 -1
  382. package/src/scripts/hooks/permission_gate.ts +1 -2
  383. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  384. package/src/scripts/hooks/replay_hook.ts +2 -1
  385. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  386. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  387. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  388. package/src/scripts/hooks/rule_inject_hook.ts +765 -68
  389. package/src/scripts/hooks/run_continuation_hook.ts +13 -15
  390. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  391. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  392. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  393. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  394. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  395. package/src/scripts/hooks/table_fingerprint.ts +70 -0
  396. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  397. package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
  398. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  399. package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
  400. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  401. package/src/scripts/hooks_status.ts +112 -0
  402. package/src/scripts/injection_scan_hook.ts +7 -0
  403. package/src/scripts/install.ts +75 -189
  404. package/src/scripts/installed_layer_report.ts +103 -0
  405. package/src/scripts/language_mirror_hook.ts +15 -6
  406. package/src/scripts/learning_sidecar.ts +119 -8
  407. package/src/scripts/lint_deny_text.ts +419 -0
  408. package/src/scripts/lint_exit_codes.ts +262 -0
  409. package/src/scripts/lint_hook_manifest.ts +108 -0
  410. package/src/scripts/lint_major_migration_sections.ts +156 -26
  411. package/src/scripts/lint_pack_boundaries.ts +63 -5
  412. package/src/scripts/lint_roadmap_blockers.ts +78 -12
  413. package/src/scripts/lint_rule_law_section.ts +517 -0
  414. package/src/scripts/lint_skill_descriptions.ts +1 -1
  415. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  416. package/src/scripts/lint_workflow_security.ts +161 -5
  417. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  418. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  419. package/src/scripts/mcp_server/prompts.ts +142 -1
  420. package/src/scripts/measure_routing_signal.ts +54 -16
  421. package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
  422. package/src/scripts/measure_turn_end_gate.ts +193 -0
  423. package/src/scripts/memory_learn_hook.ts +91 -6
  424. package/src/scripts/memory_lookup.ts +1 -1
  425. package/src/scripts/model_rule_injection.ts +52 -5
  426. package/src/scripts/prepack-check.mjs +53 -0
  427. package/src/scripts/project_thin_rules.ts +34 -327
  428. package/src/scripts/release_publication.ts +13 -1
  429. package/src/scripts/report_evidence_temperature.ts +657 -0
  430. package/src/scripts/report_installed_rule_links.ts +157 -0
  431. package/src/scripts/report_invocation_surface.ts +383 -0
  432. package/src/scripts/report_label_agreement.ts +233 -0
  433. package/src/scripts/report_obligation_carriers.ts +699 -0
  434. package/src/scripts/report_obligation_mechanism.ts +230 -0
  435. package/src/scripts/report_obligation_writer_split.ts +236 -0
  436. package/src/scripts/report_single_token_triggers.ts +277 -0
  437. package/src/scripts/report_skill_menu_census.ts +208 -0
  438. package/src/scripts/report_skill_ranker_confusion.ts +442 -0
  439. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  440. package/src/scripts/report_verification_record_coverage.ts +306 -0
  441. package/src/scripts/roadmap_verify_share.ts +213 -0
  442. package/src/scripts/rule_activation_census.ts +5 -2
  443. package/src/scripts/rule_trigger_eval.ts +9 -9
  444. package/src/scripts/schemas/command.schema.json +44 -0
  445. package/src/scripts/schemas/review-findings.schema.json +7 -2
  446. package/src/scripts/schemas/rule.schema.json +5 -0
  447. package/src/scripts/schemas/skill.schema.json +44 -0
  448. package/src/scripts/self_review_gate.ts +421 -17
  449. package/src/scripts/semantic_parity_census.ts +314 -0
  450. package/src/scripts/session_eol_report.ts +54 -1
  451. package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
  452. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  453. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  454. package/src/scripts/sync_gitignore.ts +29 -235
  455. package/src/scripts/trigger_eval_grandfather.json +0 -7
  456. package/src/scripts/trigger_eval_rotation.ts +122 -27
  457. package/src/scripts/ui_conformance_probe.ts +156 -4
  458. package/src/scripts/update_prices.ts +85 -3
  459. package/src/scripts/write_bundle_digest.mjs +74 -0
  460. package/src/server/schemas/settings.ts +41 -0
  461. package/src/shared/skillRanking.ts +117 -11
  462. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  463. package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
  464. package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
  465. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  466. package/dist/ui/assets/index-DH1xc62v.js +0 -29
  467. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
@@ -0,0 +1,314 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * The semantic-parity census — which skill frontmatter semantics survive the
4
+ * MCP-lite carrier, and which are dropped on the way to a host.
5
+ *
6
+ * road-to-semantic-parity-before-off-menu, Phase 1.
7
+ *
8
+ * THE CARRIER THIS MEASURES
9
+ *
10
+ * Exactly one: `ContentEntry` in `src/cli/mcp/content.ts`. That scope is in the
11
+ * report header on purpose. A different delivery path drops a different set, so
12
+ * a second carrier is a second report rather than an edit to this one — merging
13
+ * two field sets into one list would leave neither denominator recoverable, and
14
+ * a report whose scope is not stated in the report gets quoted as general.
15
+ *
16
+ * THE CLASSIFICATION
17
+ *
18
+ * Every property the skill frontmatter schema declares falls into exactly one
19
+ * of three columns, decided by what the carrier's builder actually reads rather
20
+ * than by what its field comments say:
21
+ *
22
+ * - `carried` — the builder reads the frontmatter key and the value reaches
23
+ * `ContentEntry` whole.
24
+ * - `partial` — the builder reads the key but transports only part of the
25
+ * value. `triggers` is the only such key: `triggerText()` keeps
26
+ * `INDEXED_TRIGGER_KEYS` (`keyword`, `phrase`) and silently
27
+ * drops `file_pattern`, `path_prefix`, `command` and `reason`.
28
+ * Classing it `carried` would make a path-triggered skill look
29
+ * portable when its routing does not travel at all.
30
+ * - `dropped` — the builder never reads the key, so the semantic does not
31
+ * leave the disk.
32
+ *
33
+ * `carried` and `partial` are derived from the carrier source (the constants in
34
+ * `_lib/body_portable.ts` mirror `buildEntry` and `triggerText`), never from
35
+ * the schema. The
36
+ * `dropped` column is the remainder, so the three are total and disjoint by
37
+ * construction and a new schema property lands in `dropped` until someone
38
+ * teaches the carrier to read it — which is the failure direction this census
39
+ * exists to make visible.
40
+ *
41
+ * NOT IN THE CLASSIFICATION: `body`, `kind`, `mime_type` and `uri` are
42
+ * `ContentEntry` fields with no frontmatter key behind them — the body is the
43
+ * file minus its frontmatter, and the other three are derived from where the
44
+ * file sits. They are carrier fields, not declared semantics, so counting them
45
+ * as `carried` would inflate the numerator with things no skill declares.
46
+ *
47
+ * REPRODUCIBILITY
48
+ *
49
+ * The report pins the commit it was taken at and carries no wall-clock date, so
50
+ * a re-run at the same commit is byte-equal. Nothing machine-dependent is
51
+ * computed into it.
52
+ */
53
+
54
+ import { execFileSync } from 'node:child_process';
55
+ import fs from 'node:fs';
56
+ import path from 'node:path';
57
+ import { fileURLToPath, pathToFileURL } from 'node:url';
58
+
59
+ import { load as yamlLoad } from 'js-yaml';
60
+
61
+ import { CARRIED_KEYS, PARTIAL_KEYS, classifyPortability } from './_lib/body_portable.js';
62
+
63
+ const _HERE = fileURLToPath(import.meta.url);
64
+ export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
65
+
66
+ /** Where the schema that declares the semantics lives. */
67
+ const SCHEMA_REL = path.join('src', 'scripts', 'schemas', 'skill.schema.json');
68
+
69
+ /** Where the corpus lives. */
70
+ const SKILLS_REL = path.join('src', 'skills');
71
+
72
+ /** Default report location. */
73
+ const DEFAULT_OUT = path.join('agents', 'evidence', 'analysis', 'semantic-parity-census.md');
74
+
75
+ /**
76
+ * The carrier constants live with the predicate in `_lib/body_portable.ts` so
77
+ * that the census and the eligibility check cannot drift apart: one source of
78
+ * truth, read here and there.
79
+ */
80
+ export { CARRIED_KEYS, PARTIAL_KEYS };
81
+
82
+ export type Column = 'carried' | 'partial' | 'dropped';
83
+
84
+ export interface FieldRow {
85
+ readonly field: string;
86
+ readonly column: Column;
87
+ /** For `partial`, the sub-keys that travel. Empty otherwise. */
88
+ readonly travels: readonly string[];
89
+ }
90
+
91
+ export interface SkillRow {
92
+ /** Directory name under `src/skills/`. */
93
+ readonly skill: string;
94
+ /** Declared keys that are `dropped`. */
95
+ readonly dropped: readonly string[];
96
+ /** Declared keys that are `partial`. */
97
+ readonly partial: readonly string[];
98
+ }
99
+
100
+ export interface Census {
101
+ readonly fields: readonly FieldRow[];
102
+ readonly skills: readonly SkillRow[];
103
+ /** Per dropped-or-partial field: how many skills declare it. */
104
+ readonly perField: Readonly<Record<string, number>>;
105
+ /** Total `SKILL.md` files read. */
106
+ readonly scanned: number;
107
+ }
108
+
109
+ /** Classify every schema property into exactly one column. */
110
+ export function classify(schemaProperties: readonly string[]): FieldRow[] {
111
+ const rows: FieldRow[] = [];
112
+ for (const field of [...schemaProperties].sort()) {
113
+ if (CARRIED_KEYS.includes(field)) {
114
+ rows.push({ field, column: 'carried', travels: [] });
115
+ continue;
116
+ }
117
+ const travels = PARTIAL_KEYS[field];
118
+ if (travels !== undefined) {
119
+ rows.push({ field, column: 'partial', travels });
120
+ continue;
121
+ }
122
+ rows.push({ field, column: 'dropped', travels: [] });
123
+ }
124
+ return rows;
125
+ }
126
+
127
+ /** Parsed top-level frontmatter of one `SKILL.md`, or `{}` when it carries none. */
128
+ export function frontmatterRecord(text: string): Record<string, unknown> {
129
+ const m = /^---\n([\s\S]*?)\n---/.exec(text);
130
+ if (m === null) return {};
131
+ let doc: unknown;
132
+ try {
133
+ doc = yamlLoad(m[1]!);
134
+ } catch {
135
+ return {};
136
+ }
137
+ if (doc === null || typeof doc !== 'object' || Array.isArray(doc)) return {};
138
+ return doc as Record<string, unknown>;
139
+ }
140
+
141
+ export function census(root: string): Census {
142
+ const schemaPath = path.join(root, SCHEMA_REL);
143
+ const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf8')) as {
144
+ properties?: Record<string, unknown>;
145
+ };
146
+ const fields = classify(Object.keys(schema.properties ?? {}));
147
+
148
+ const skillsDir = path.join(root, SKILLS_REL);
149
+ const dirs = fs.existsSync(skillsDir)
150
+ ? fs
151
+ .readdirSync(skillsDir, { withFileTypes: true })
152
+ .filter((d) => d.isDirectory())
153
+ .map((d) => d.name)
154
+ .sort()
155
+ : [];
156
+
157
+ const skills: SkillRow[] = [];
158
+ const perField: Record<string, number> = {};
159
+ let scanned = 0;
160
+
161
+ for (const dir of dirs) {
162
+ const file = path.join(skillsDir, dir, 'SKILL.md');
163
+ if (!fs.existsSync(file)) continue;
164
+ scanned += 1;
165
+ // The per-skill pass calls the PREDICATE rather than re-deriving the
166
+ // classification from the schema. An earlier version looked the key up
167
+ // in the schema-derived column map and skipped what it did not find,
168
+ // which made the census fail OPEN on an unknown key while the predicate
169
+ // failed CLOSED on the same key — two numbers presented as one
170
+ // measurement, disagreeing on exactly the case the predicate's own
171
+ // documentation calls its most important. Sharing the function removes
172
+ // the divergence class instead of correcting this instance of it.
173
+ const { dropped, partial } = classifyPortability(
174
+ frontmatterRecord(fs.readFileSync(file, 'utf8')),
175
+ );
176
+ for (const key of [...dropped, ...partial]) {
177
+ perField[key] = (perField[key] ?? 0) + 1;
178
+ }
179
+ skills.push({ skill: dir, dropped, partial });
180
+ }
181
+
182
+ return { fields, skills, perField, scanned };
183
+ }
184
+
185
+ function pin(root: string): { sha: string; date: string } {
186
+ const git = (args: string[]): string =>
187
+ execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim();
188
+ try {
189
+ return { sha: git(['rev-parse', 'HEAD']), date: git(['show', '-s', '--format=%cI', 'HEAD']) };
190
+ } catch {
191
+ return { sha: 'unknown', date: 'unknown' };
192
+ }
193
+ }
194
+
195
+ export function render(c: Census, p: { sha: string; date: string }): string {
196
+ const lines: string[] = [];
197
+ lines.push('<!-- evidence-type: analysis -->');
198
+ lines.push(`<!-- semantic-parity-census: v1 | commit: ${p.sha} | commit-date: ${p.date} -->`);
199
+ lines.push('');
200
+ lines.push('# Semantic-parity census — MCP-lite `ContentEntry`');
201
+ lines.push('');
202
+ lines.push(
203
+ 'Emitted by `src/scripts/semantic_parity_census.ts`. **Carrier measured: `ContentEntry`**',
204
+ );
205
+ lines.push(
206
+ 'in `src/cli/mcp/content.ts` — one delivery path, MCP-lite. A different path drops a',
207
+ );
208
+ lines.push(
209
+ 'different set; a second carrier is a second report, never an edit to this one. Read the',
210
+ );
211
+ lines.push("script's module header for the classification before reading a number here.");
212
+ lines.push('');
213
+ lines.push('This report states coverage only. It marks no skill, excludes none, and is not a');
214
+ lines.push('verdict about which skills matter.');
215
+ lines.push('');
216
+ lines.push(`- **Commit pin:** \`${p.sha}\` (${p.date})`);
217
+ lines.push(`- **Schema:** \`${SCHEMA_REL}\``);
218
+ lines.push(`- **Corpus:** \`${SKILLS_REL}/*/SKILL.md\` — ${String(c.scanned)} file(s)`);
219
+ lines.push('');
220
+
221
+ const counts: Record<Column, number> = { carried: 0, partial: 0, dropped: 0 };
222
+ for (const r of c.fields) counts[r.column] += 1;
223
+
224
+ lines.push('## Field coverage');
225
+ lines.push('');
226
+ lines.push(
227
+ `${String(c.fields.length)} declared propert${c.fields.length === 1 ? 'y' : 'ies'}, each in exactly one column: ` +
228
+ `${String(counts.carried)} carried, ${String(counts.partial)} partial, ${String(counts.dropped)} dropped.`,
229
+ );
230
+ lines.push('');
231
+ lines.push('| field | carried | partial | dropped | travels |');
232
+ lines.push('|---|---|---|---|---|');
233
+ for (const r of c.fields) {
234
+ const mark = (col: Column): string => (r.column === col ? 'x' : '');
235
+ const travels = r.travels.length ? r.travels.map((t) => `\`${t}\``).join(', ') : '';
236
+ lines.push(
237
+ `| \`${r.field}\` | ${mark('carried')} | ${mark('partial')} | ${mark('dropped')} | ${travels} |`,
238
+ );
239
+ }
240
+ lines.push('');
241
+
242
+ lines.push('## Corpus declarations against the uncarried set');
243
+ lines.push('');
244
+ lines.push(
245
+ 'How many skills declare each field the carrier drops or truncates. A field absent from',
246
+ );
247
+ lines.push('this table is declared by no skill today — the gap for it is theoretical.');
248
+ lines.push('');
249
+ const declared = c.fields
250
+ .filter((r) => r.column !== 'carried')
251
+ .map((r) => ({ field: r.field, column: r.column, n: c.perField[r.field] ?? 0 }))
252
+ .filter((r) => r.n > 0)
253
+ .sort((a, b) => b.n - a.n || a.field.localeCompare(b.field));
254
+ lines.push('| field | column | skills declaring |');
255
+ lines.push('|---|---|---|');
256
+ for (const r of declared) {
257
+ lines.push(`| \`${r.field}\` | ${r.column} | ${String(r.n)} |`);
258
+ }
259
+ lines.push('');
260
+
261
+ const nonPortable = c.skills.filter((s) => s.dropped.length > 0 || s.partial.length > 0);
262
+ lines.push(
263
+ `**${String(nonPortable.length)} of ${String(c.scanned)} skills declare at least one semantic the carrier does not transport whole.**`,
264
+ );
265
+ lines.push('');
266
+
267
+ lines.push('## Per skill');
268
+ lines.push('');
269
+ lines.push('| skill | dropped | partial |');
270
+ lines.push('|---|---|---|');
271
+ for (const s of c.skills) {
272
+ const d = s.dropped.length ? s.dropped.map((k) => `\`${k}\``).join(', ') : '—';
273
+ const pa = s.partial.length ? s.partial.map((k) => `\`${k}\``).join(', ') : '—';
274
+ lines.push(`| \`${s.skill}\` | ${d} | ${pa} |`);
275
+ }
276
+ lines.push('');
277
+ return lines.join('\n');
278
+ }
279
+
280
+ export function main(argv: readonly string[]): number {
281
+ const write = argv.includes('--write');
282
+ const json = argv.includes('--json');
283
+ const outIdx = argv.indexOf('--out');
284
+ const out = outIdx >= 0 ? argv[outIdx + 1] : undefined;
285
+
286
+ const c = census(REPO_ROOT);
287
+
288
+ if (json) {
289
+ process.stdout.write(`${JSON.stringify(c, null, 2)}\n`);
290
+ return 0;
291
+ }
292
+ if (write) {
293
+ const target = path.resolve(REPO_ROOT, out ?? DEFAULT_OUT);
294
+ fs.mkdirSync(path.dirname(target), { recursive: true });
295
+ fs.writeFileSync(target, render(c, pin(REPO_ROOT)), 'utf8');
296
+ process.stdout.write(
297
+ `semantic_parity_census: wrote ${path.relative(REPO_ROOT, target)}\n`,
298
+ );
299
+ return 0;
300
+ }
301
+
302
+ const counts: Record<Column, number> = { carried: 0, partial: 0, dropped: 0 };
303
+ for (const r of c.fields) counts[r.column] += 1;
304
+ process.stdout.write(
305
+ `semantic_parity_census · ${String(c.fields.length)} schema field(s): ` +
306
+ `${String(counts.carried)} carried, ${String(counts.partial)} partial, ${String(counts.dropped)} dropped\n`,
307
+ );
308
+ process.stdout.write(` corpus: ${String(c.scanned)} SKILL.md file(s)\n`);
309
+ return 0;
310
+ }
311
+
312
+ if (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
313
+ process.exit(main(process.argv.slice(2)));
314
+ }
@@ -31,7 +31,15 @@ import process from 'node:process';
31
31
  import { fileURLToPath, pathToFileURL } from 'node:url';
32
32
  import * as path from 'node:path';
33
33
 
34
- import { DEFAULT_PROJECTS_ROOT, listTranscriptFiles } from './_lib/cc_transcript.js';
34
+ import {
35
+ DEFAULT_PROJECTS_ROOT,
36
+ derivedBytes,
37
+ listTranscriptFiles,
38
+ measureBytesPerToken,
39
+ scanTranscripts,
40
+ type BytesPerToken,
41
+ type DerivedBytes,
42
+ } from './_lib/cc_transcript.js';
35
43
  import { emptyCounters, scanEolSlice, type EolCounters } from './_lib/session_eol.js';
36
44
 
37
45
  export interface SessionSummary {
@@ -90,6 +98,28 @@ export interface EolReport {
90
98
  };
91
99
  /** Pearson r of file bytes vs final context tokens over the readable set. */
92
100
  bytes_tokens_pearson_r: number | null;
101
+ /**
102
+ * The median session's final context expressed in bytes - DERIVED, and
103
+ * labelled so (`road-to-a-bytes-row-that-exists` Phase 2, metric
104
+ * `provider-bytes-per-call`).
105
+ *
106
+ * Do NOT confuse this with `SessionSummary.bytes` or with the Pearson r
107
+ * above: those are the transcript FILE's size on this disk, a local
108
+ * artefact. This is an estimate of the context volume a round re-sends,
109
+ * obtained by multiplying a token count by a ratio measured on this same
110
+ * store. `null` whenever either input is missing - there is no fallback
111
+ * ratio anywhere in this path, deliberately.
112
+ *
113
+ * COST, named rather than discovered: producing it costs a second pass
114
+ * over the store (`scanTranscripts`), because the end-of-life counters are
115
+ * accumulated by `_lib/session_eol.ts`, whose shape is PERSISTED in state
116
+ * files and whose fields therefore carry a migration obligation this
117
+ * report does not need to take on for a derived column.
118
+ */
119
+ provider_bytes: {
120
+ factor: BytesPerToken | null;
121
+ median_final_context: DerivedBytes | null;
122
+ };
93
123
  threshold_crossings: Record<string, number>;
94
124
  }
95
125
 
@@ -220,6 +250,11 @@ export function buildReport(root: string, now: Date = new Date()): EolReport {
220
250
  const post = allEvents.map((e) => e.post_tokens).filter((v): v is number => v !== null);
221
251
  const summaryRecords = sessions.reduce((s, x) => s + x.counters.compact_summaries, 0);
222
252
 
253
+ // Byte factor, measured on this same store. Separate pass - see the
254
+ // `provider_bytes` doc comment for why it is not folded into EolCounters.
255
+ const byteScan = scanTranscripts({ root, measureBytes: true });
256
+ const bytesFactor = measureBytesPerToken(byteScan.records);
257
+
223
258
  const crossings: Record<string, number> = {};
224
259
  for (const thr of [200_000, 400_000, 600_000, 800_000]) {
225
260
  crossings[`>=${thr / 1000}k`] = finals.filter((c) => c >= thr).length;
@@ -250,6 +285,10 @@ export function buildReport(root: string, now: Date = new Date()): EolReport {
250
285
  .filter((s) => (s.counters.final_context_tokens as number) > 1_000)
251
286
  .map((s) => [s.bytes, s.counters.final_context_tokens as number]),
252
287
  ),
288
+ provider_bytes: {
289
+ factor: bytesFactor,
290
+ median_final_context: derivedBytes(percentiles(finals)?.median ?? 0, finals.length > 0 ? bytesFactor : null),
291
+ },
253
292
  threshold_crossings: crossings,
254
293
  };
255
294
  }
@@ -274,6 +313,20 @@ export function renderText(r: EolReport): string {
274
313
  if (r.turns) {
275
314
  lines.push(`turns per session: median=${fmt(r.turns.median)} p90=${fmt(r.turns.p90)} max=${fmt(r.turns.max)}`);
276
315
  }
316
+ const pb = r.provider_bytes;
317
+ if (pb.factor === null || pb.median_final_context === null) {
318
+ lines.push('provider bytes: basis unavailable - this store supplied no bytes-per-token factor');
319
+ } else {
320
+ lines.push(
321
+ `provider bytes (basis: ${pb.median_final_context.basis}): median final context`
322
+ + ` ~= ${fmt(pb.median_final_context.bytes)} bytes`,
323
+ );
324
+ lines.push(
325
+ ` factor ${pb.factor.bytes_per_token.toFixed(4)} bytes/token (basis: ${pb.factor.basis},`
326
+ + ` ${fmt(pb.factor.content_bytes)} content bytes / ${fmt(pb.factor.output_tokens)} output tokens,`
327
+ + ` n=${pb.factor.records}) - measured on assistant output, applied to an input token count`,
328
+ );
329
+ }
277
330
  const c = r.compaction;
278
331
  lines.push(
279
332
  `compaction: ${c.sessions_with_compaction} sessions, ${c.events_total} events (${Object.entries(c.events_by_trigger)