avorelo 0.3.8 → 0.4.0-rc.2

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 (394) hide show
  1. package/LICENSE +16 -23
  2. package/README.md +62 -72
  3. package/bin/avorelo +9 -0
  4. package/package.json +147 -139
  5. package/scripts/README.md +40 -0
  6. package/scripts/avorelo-session-collision-guard.js +540 -0
  7. package/scripts/avorelo-workstream-preflight.js +918 -0
  8. package/scripts/cco-dashboard.js +346 -0
  9. package/scripts/cco-posttooluse.js +504 -0
  10. package/scripts/cco-pretooluse.js +381 -0
  11. package/scripts/cco-status.js +540 -0
  12. package/scripts/cco-stop.js +77 -0
  13. package/scripts/cco-userprompt-submit.js +83 -0
  14. package/scripts/lib/activation/account-state.js +37 -0
  15. package/scripts/lib/activation/activate-command.js +114 -0
  16. package/scripts/lib/activation/activation-runner.js +607 -0
  17. package/scripts/lib/activation/activation-self-healing.js +481 -0
  18. package/scripts/lib/activation/activation-state.js +96 -0
  19. package/scripts/lib/activation/activation-summary.js +241 -0
  20. package/scripts/lib/activation/adapters/claude-code.js +77 -0
  21. package/scripts/lib/activation/adapters/codex-cli.js +52 -0
  22. package/scripts/lib/activation/adapters/cursor.js +37 -0
  23. package/scripts/lib/activation/adapters/github-agent.js +39 -0
  24. package/scripts/lib/activation/adapters/terminal.js +42 -0
  25. package/scripts/lib/activation/adapters/vscode.js +39 -0
  26. package/scripts/lib/activation/adapters/windsurf.js +37 -0
  27. package/scripts/lib/activation/ai-surface-detector.js +151 -0
  28. package/scripts/lib/activation/connect-account.js +145 -0
  29. package/scripts/lib/activation/detect-environment.js +75 -0
  30. package/scripts/lib/activation/detect-hosts.js +62 -0
  31. package/scripts/lib/activation/format-activation-output.js +109 -0
  32. package/scripts/lib/activation/next-action.js +43 -0
  33. package/scripts/lib/activation/repair-engine.js +219 -0
  34. package/scripts/lib/activation/run-entry.js +346 -0
  35. package/scripts/lib/activation-distribution-readiness.js +507 -0
  36. package/scripts/lib/adapter-conformance.js +176 -0
  37. package/scripts/lib/adapter-readiness.js +428 -0
  38. package/scripts/lib/adapter-safety-boundaries.js +335 -0
  39. package/scripts/lib/adapter-technical-readiness-gate.js +205 -0
  40. package/scripts/lib/agent-access-governance.js +455 -0
  41. package/scripts/lib/agent-activation-readiness.js +878 -0
  42. package/scripts/lib/agent-enforcement.js +765 -0
  43. package/scripts/lib/agent-evolution-loop.js +479 -0
  44. package/scripts/lib/agent-policy-profile.js +210 -0
  45. package/scripts/lib/agent-security/action-evaluator.js +507 -0
  46. package/scripts/lib/agent-security/adapter-registry.js +98 -0
  47. package/scripts/lib/agent-security/auto-policy.js +139 -0
  48. package/scripts/lib/agent-security/bounded-scan.js +93 -0
  49. package/scripts/lib/agent-security/enforcement-adapter.js +174 -0
  50. package/scripts/lib/agent-security/enforcement-engine.js +1129 -0
  51. package/scripts/lib/agent-security/file-write-adapter.js +183 -0
  52. package/scripts/lib/agent-security/file-write-rules.js +178 -0
  53. package/scripts/lib/agent-security/index.js +3342 -0
  54. package/scripts/lib/agent-security/instruction-risk.js +181 -0
  55. package/scripts/lib/agent-security/mcp-action-adapter.js +185 -0
  56. package/scripts/lib/agent-security/mcp-action-rules.js +184 -0
  57. package/scripts/lib/agent-security/package-action-adapter.js +175 -0
  58. package/scripts/lib/agent-security/package-action-rules.js +233 -0
  59. package/scripts/lib/agent-security/performance.js +148 -0
  60. package/scripts/lib/agent-security/permission-minimizer.js +403 -0
  61. package/scripts/lib/agent-security/scan-cache.js +74 -0
  62. package/scripts/lib/agent-security/source-trust.js +146 -0
  63. package/scripts/lib/ai-efficiency-dogfood-pack.js +437 -0
  64. package/scripts/lib/ai-efficiency-eval.js +207 -0
  65. package/scripts/lib/ai-efficiency-guard-contract.js +209 -0
  66. package/scripts/lib/ai-efficiency-measured-value.js +106 -0
  67. package/scripts/lib/ai-install-prompt.js +293 -0
  68. package/scripts/lib/ai-task-inference.js +155 -0
  69. package/scripts/lib/ai-value-ledger.js +121 -0
  70. package/scripts/lib/ai-value-proof-table.js +151 -0
  71. package/scripts/lib/ai-work-efficiency-routing.js +623 -0
  72. package/scripts/lib/ai-workspace-hygiene.js +1499 -0
  73. package/scripts/lib/alpha-activation.js +520 -0
  74. package/scripts/lib/alpha-feedback.js +263 -0
  75. package/scripts/lib/alpha-readiness-gate.js +332 -0
  76. package/scripts/lib/anti-gaming.js +169 -0
  77. package/scripts/lib/artifact-health.js +431 -0
  78. package/scripts/lib/artifact-receipt-hygiene.js +619 -0
  79. package/scripts/lib/attribution.js +180 -0
  80. package/scripts/lib/audit.js +289 -0
  81. package/scripts/lib/avorelo-skill-registry.js +810 -0
  82. package/scripts/lib/batch-jobs.js +71 -0
  83. package/scripts/lib/brain-pack.js +578 -0
  84. package/scripts/lib/brand-boundary.js +424 -0
  85. package/scripts/lib/brand.js +74 -0
  86. package/scripts/lib/browser-capability.js +1048 -0
  87. package/scripts/lib/browser-proof-governed-workflow.js +1020 -0
  88. package/scripts/lib/browser-proof-preflight.js +321 -0
  89. package/scripts/lib/cache-readiness.js +296 -0
  90. package/scripts/lib/canonical-reentry.js +162 -0
  91. package/scripts/lib/capability-contract-validator.js +177 -0
  92. package/scripts/lib/capability-hygiene.js +504 -0
  93. package/scripts/lib/capability-intake-quarantine.js +789 -0
  94. package/scripts/lib/capability-kernel-registry.js +566 -0
  95. package/scripts/lib/capability-kernel.js +202 -0
  96. package/scripts/lib/capability-manifest.js +255 -0
  97. package/scripts/lib/capability-outcome-normalizer.js +104 -0
  98. package/scripts/lib/capability-packs.js +314 -0
  99. package/scripts/lib/capability-recommender.js +513 -0
  100. package/scripts/lib/capability-registry.js +1062 -0
  101. package/scripts/lib/carry-forward-surfacing.js +194 -0
  102. package/scripts/lib/ccusage-adapter.js +188 -0
  103. package/scripts/lib/claude-session-evidence/index.js +1027 -0
  104. package/scripts/lib/cli-output-sanitizer.js +118 -0
  105. package/scripts/lib/company-loop.js +1149 -0
  106. package/scripts/lib/config.js +641 -0
  107. package/scripts/lib/context-acquisition-plan.js +359 -0
  108. package/scripts/lib/context-authority-rules.js +138 -0
  109. package/scripts/lib/context-budget-guard.js +170 -0
  110. package/scripts/lib/context-budget-scanner.js +257 -0
  111. package/scripts/lib/context-budget.js +167 -0
  112. package/scripts/lib/context-claim-safety.js +116 -0
  113. package/scripts/lib/context-compiler.js +236 -0
  114. package/scripts/lib/context-optimizer.js +715 -0
  115. package/scripts/lib/context-packet.js +121 -0
  116. package/scripts/lib/context-receipt.js +57 -0
  117. package/scripts/lib/context-reduction-plan.js +179 -0
  118. package/scripts/lib/context-safety.js +88 -0
  119. package/scripts/lib/context-savings-engine.js +158 -0
  120. package/scripts/lib/context-source-registry.js +393 -0
  121. package/scripts/lib/context-task-profiles.js +147 -0
  122. package/scripts/lib/cost-abuse-guard.js +975 -0
  123. package/scripts/lib/cost-evidence.js +287 -0
  124. package/scripts/lib/cost-to-outcome-signals.js +639 -0
  125. package/scripts/lib/cross-host-install-plan.js +308 -0
  126. package/scripts/lib/cross-host-install-readiness.js +242 -0
  127. package/scripts/lib/cross-host-value-flow.js +268 -0
  128. package/scripts/lib/dashboard.js +1056 -0
  129. package/scripts/lib/data-permissions-guard.js +1187 -0
  130. package/scripts/lib/deployment-environment-guard.js +1236 -0
  131. package/scripts/lib/design-partner-feedback.js +346 -0
  132. package/scripts/lib/dogfood-evidence-freshness.js +567 -0
  133. package/scripts/lib/efficiency-receipt.js +354 -0
  134. package/scripts/lib/entitlements.js +100 -0
  135. package/scripts/lib/execution-packet.js +559 -0
  136. package/scripts/lib/execution-route-governor.js +179 -0
  137. package/scripts/lib/experimentation-events.js +547 -0
  138. package/scripts/lib/external-capability-compliance.js +107 -0
  139. package/scripts/lib/external-readiness/ai-visibility/ai-visibility-runner.js +322 -0
  140. package/scripts/lib/external-readiness/calibration/benchmark-site-catalog.js +121 -0
  141. package/scripts/lib/external-readiness/calibration/completion-gate.js +112 -0
  142. package/scripts/lib/external-readiness/calibration/real-site-benchmark-runner.js +284 -0
  143. package/scripts/lib/external-readiness/drift-detector.js +100 -0
  144. package/scripts/lib/external-readiness/endpoint-prober.js +332 -0
  145. package/scripts/lib/external-readiness/external-readiness-runner.js +112 -0
  146. package/scripts/lib/external-readiness/full-agent-readiness-scorer.js +220 -0
  147. package/scripts/lib/external-readiness/golden-path-runner.js +333 -0
  148. package/scripts/lib/external-readiness/inside-out-runner.js +118 -0
  149. package/scripts/lib/external-readiness/proof-receipt-writer.js +112 -0
  150. package/scripts/lib/external-readiness/safe-fix-executor.js +117 -0
  151. package/scripts/lib/external-readiness/skills/category-boundary-guard.js +30 -0
  152. package/scripts/lib/external-readiness/skills/pmm-positioning-guard.js +69 -0
  153. package/scripts/lib/external-readiness/skills/safe-fix-policy.js +35 -0
  154. package/scripts/lib/external-user-simulation.js +166 -0
  155. package/scripts/lib/failure-recovery-readiness.js +81 -0
  156. package/scripts/lib/failure-recovery.js +419 -0
  157. package/scripts/lib/feedback-intelligence.js +537 -0
  158. package/scripts/lib/feedback-signals.js +205 -0
  159. package/scripts/lib/file-integrity.js +68 -0
  160. package/scripts/lib/fsx.js +129 -0
  161. package/scripts/lib/full-readiness-gate.js +451 -0
  162. package/scripts/lib/governed-action-exposure-primitives.js +1514 -0
  163. package/scripts/lib/governed-exposure-planner.js +186 -0
  164. package/scripts/lib/governed-workspace-hygiene.js +946 -0
  165. package/scripts/lib/guard-suite-common.js +412 -0
  166. package/scripts/lib/guidance-builder.js +174 -0
  167. package/scripts/lib/hook-apply.js +1075 -0
  168. package/scripts/lib/hook-baseline.js +310 -0
  169. package/scripts/lib/hook-config-preview.js +275 -0
  170. package/scripts/lib/hook-contracts.js +290 -0
  171. package/scripts/lib/hook-safety-boundary-readiness.js +80 -0
  172. package/scripts/lib/host-capability-matrix.js +351 -0
  173. package/scripts/lib/host-support-context.js +254 -0
  174. package/scripts/lib/http-hook-action.js +538 -0
  175. package/scripts/lib/install-ai-readiness.js +84 -0
  176. package/scripts/lib/install-intake-risk.js +1051 -0
  177. package/scripts/lib/install-journey-intelligence.js +329 -0
  178. package/scripts/lib/intervention-guidance.js +57 -0
  179. package/scripts/lib/known-limitations.js +115 -0
  180. package/scripts/lib/l8-path-truth.js +146 -0
  181. package/scripts/lib/launch-hardening-gate.js +436 -0
  182. package/scripts/lib/launch-readiness.js +635 -0
  183. package/scripts/lib/learning-experimentation-foundation.js +1484 -0
  184. package/scripts/lib/learning-memory.js +686 -0
  185. package/scripts/lib/lifecycle-hooks.js +982 -0
  186. package/scripts/lib/local-package-smoke.js +436 -0
  187. package/scripts/lib/local-pricing.js +299 -0
  188. package/scripts/lib/mcp-enforcement.js +311 -0
  189. package/scripts/lib/mcp-least-privilege-policy.js +303 -0
  190. package/scripts/lib/mcp-tool-inventory.js +388 -0
  191. package/scripts/lib/mcp-tool-risk.js +0 -0
  192. package/scripts/lib/memory.js +335 -0
  193. package/scripts/lib/metrics.js +699 -0
  194. package/scripts/lib/micro-proof.js +133 -0
  195. package/scripts/lib/model-work-class-routing.js +79 -0
  196. package/scripts/lib/next-run-context.js +436 -0
  197. package/scripts/lib/next-run-continuity.js +1207 -0
  198. package/scripts/lib/observability-recovery-guard.js +1030 -0
  199. package/scripts/lib/operating-value.js +1662 -0
  200. package/scripts/lib/optimization-v3.js +122 -0
  201. package/scripts/lib/orchestration/adapters/_shared.js +49 -0
  202. package/scripts/lib/orchestration/adapters/aider.js +18 -0
  203. package/scripts/lib/orchestration/adapters/claude-code.js +35 -0
  204. package/scripts/lib/orchestration/adapters/codex.js +35 -0
  205. package/scripts/lib/orchestration/adapters/gemini-cli.js +18 -0
  206. package/scripts/lib/orchestration/adapters/git.js +25 -0
  207. package/scripts/lib/orchestration/adapters/index.js +31 -0
  208. package/scripts/lib/orchestration/adapters/lm-studio.js +18 -0
  209. package/scripts/lib/orchestration/adapters/ollama.js +18 -0
  210. package/scripts/lib/orchestration/adapters/opencode.js +18 -0
  211. package/scripts/lib/orchestration/adapters/openrouter.js +18 -0
  212. package/scripts/lib/orchestration/adapters/test-runner.js +25 -0
  213. package/scripts/lib/orchestration/cli.js +438 -0
  214. package/scripts/lib/orchestration/execution-manager.js +279 -0
  215. package/scripts/lib/orchestration/handoff.js +314 -0
  216. package/scripts/lib/orchestration/index.js +456 -0
  217. package/scripts/lib/orchestration/inventory.js +47 -0
  218. package/scripts/lib/orchestration/model-discovery.js +498 -0
  219. package/scripts/lib/orchestration/model-profiler.js +170 -0
  220. package/scripts/lib/orchestration/model-profiles.js +252 -0
  221. package/scripts/lib/orchestration/model-refresh-policy.js +72 -0
  222. package/scripts/lib/orchestration/proof-writer.js +349 -0
  223. package/scripts/lib/orchestration/provider-discovery/aider.js +49 -0
  224. package/scripts/lib/orchestration/provider-discovery/claude-code.js +56 -0
  225. package/scripts/lib/orchestration/provider-discovery/codex.js +49 -0
  226. package/scripts/lib/orchestration/provider-discovery/common.js +186 -0
  227. package/scripts/lib/orchestration/provider-discovery/gemini.js +106 -0
  228. package/scripts/lib/orchestration/provider-discovery/lm-studio.js +118 -0
  229. package/scripts/lib/orchestration/provider-discovery/models-dev.js +12 -0
  230. package/scripts/lib/orchestration/provider-discovery/ollama.js +100 -0
  231. package/scripts/lib/orchestration/provider-discovery/opencode.js +47 -0
  232. package/scripts/lib/orchestration/provider-discovery/openrouter.js +44 -0
  233. package/scripts/lib/orchestration/risk-classifier.js +130 -0
  234. package/scripts/lib/orchestration/routing-policy.js +486 -0
  235. package/scripts/lib/orchestration/settings.js +95 -0
  236. package/scripts/lib/orchestration/state.js +165 -0
  237. package/scripts/lib/orchestration/verification-manager.js +138 -0
  238. package/scripts/lib/outcome-evidence-stack.js +1083 -0
  239. package/scripts/lib/output-profiles.js +146 -0
  240. package/scripts/lib/package-content-audit.js +368 -0
  241. package/scripts/lib/package-runtime.js +278 -0
  242. package/scripts/lib/plan-surface.js +53 -0
  243. package/scripts/lib/plans.js +2327 -0
  244. package/scripts/lib/policy-provider.js +27 -0
  245. package/scripts/lib/prelaunch-activation-readiness.js +409 -0
  246. package/scripts/lib/prelaunch-evidence-store.js +816 -0
  247. package/scripts/lib/prelaunch-intelligence.js +869 -0
  248. package/scripts/lib/pricing-experiment.js +118 -0
  249. package/scripts/lib/pro-moment-events.js +77 -0
  250. package/scripts/lib/pro-moment-state.js +227 -0
  251. package/scripts/lib/pro-moments.js +1216 -0
  252. package/scripts/lib/product-home-receipt.js +1790 -0
  253. package/scripts/lib/product-learning-events.js +696 -0
  254. package/scripts/lib/production-confidence-control-tower.js +1209 -0
  255. package/scripts/lib/production-confidence.js +1858 -0
  256. package/scripts/lib/project-profile.js +555 -0
  257. package/scripts/lib/prompt-compiler-plan.js +94 -0
  258. package/scripts/lib/prompt-compiler.js +280 -0
  259. package/scripts/lib/prompt-lint.js +32 -0
  260. package/scripts/lib/prompt-suggestions.js +52 -0
  261. package/scripts/lib/proof-canonical.js +398 -0
  262. package/scripts/lib/proof-drilldown.js +383 -0
  263. package/scripts/lib/proof-e2e/promise-completion.js +141 -0
  264. package/scripts/lib/proof-e2e/promise-dashboard-claims.js +135 -0
  265. package/scripts/lib/proof-e2e/promise-local-proof.js +156 -0
  266. package/scripts/lib/proof-e2e/promise-provider-neutral.js +136 -0
  267. package/scripts/lib/proof-e2e/promise-registry.js +219 -0
  268. package/scripts/lib/proof-e2e/promise-security-trust.js +141 -0
  269. package/scripts/lib/proof-e2e/promise-skills-risk.js +163 -0
  270. package/scripts/lib/proof-e2e/promise-token-savings.js +112 -0
  271. package/scripts/lib/proof-e2e/promise-work-management.js +126 -0
  272. package/scripts/lib/proof-events.js +342 -0
  273. package/scripts/lib/proof-history.js +243 -0
  274. package/scripts/lib/proof-metrics.js +296 -0
  275. package/scripts/lib/proof-outcome-evidence.js +134 -0
  276. package/scripts/lib/proof-receipt.js +335 -0
  277. package/scripts/lib/proof-record.js +461 -0
  278. package/scripts/lib/proof-savings-report.js +1549 -0
  279. package/scripts/lib/public-activation-distribution-gate.js +266 -0
  280. package/scripts/lib/public-cli.js +5631 -0
  281. package/scripts/lib/public-distribution-truth.js +211 -0
  282. package/scripts/lib/public-distribution.js +73 -0
  283. package/scripts/lib/public-install-claim-checker.js +300 -0
  284. package/scripts/lib/publish-provenance-readiness.js +287 -0
  285. package/scripts/lib/readiness-delta.js +218 -0
  286. package/scripts/lib/readiness-evidence-closure.js +196 -0
  287. package/scripts/lib/reentry-memory-capture.js +241 -0
  288. package/scripts/lib/reentry-memory-retrieval.js +302 -0
  289. package/scripts/lib/reentry-memory-status.js +147 -0
  290. package/scripts/lib/reentry-memory-store.js +183 -0
  291. package/scripts/lib/reentry-state.js +66 -0
  292. package/scripts/lib/release-candidate-bundle.js +166 -0
  293. package/scripts/lib/remediation.js +81 -0
  294. package/scripts/lib/repo-map.js +391 -0
  295. package/scripts/lib/run-action-policy.js +104 -0
  296. package/scripts/lib/run-contract-receipt.js +48 -0
  297. package/scripts/lib/run-contract.js +288 -0
  298. package/scripts/lib/run-cost-to-verified-outcome.js +87 -0
  299. package/scripts/lib/run-improvements-lifecycle.js +330 -0
  300. package/scripts/lib/run-improvements.js +789 -0
  301. package/scripts/lib/run-proof-contract.js +116 -0
  302. package/scripts/lib/run-risk-classifier.js +131 -0
  303. package/scripts/lib/run-task-classifier.js +216 -0
  304. package/scripts/lib/runtime-decision-policy.js +387 -0
  305. package/scripts/lib/safe-path-engine.js +705 -0
  306. package/scripts/lib/safe-repair.js +877 -0
  307. package/scripts/lib/safe-run-controller.js +887 -0
  308. package/scripts/lib/scope-repair-before-approval.js +865 -0
  309. package/scripts/lib/score.js +262 -0
  310. package/scripts/lib/seamless-enforcement.js +329 -0
  311. package/scripts/lib/seamless-outcome.js +689 -0
  312. package/scripts/lib/seamless-reality-gate.js +5053 -0
  313. package/scripts/lib/security-confidence/activation-safety.js +78 -0
  314. package/scripts/lib/security-confidence/adapters/adapter-contract.js +125 -0
  315. package/scripts/lib/security-confidence/adapters/mock-claude-bughunter-adapter.js +36 -0
  316. package/scripts/lib/security-confidence/adapters/mock-decepticon-adapter.js +34 -0
  317. package/scripts/lib/security-confidence/adapters/mock-mcp-scan-adapter.js +35 -0
  318. package/scripts/lib/security-confidence/adapters/mock-snyk-agent-scan-adapter.js +35 -0
  319. package/scripts/lib/security-confidence/adapters/mock-tank-adapter.js +34 -0
  320. package/scripts/lib/security-confidence/adapters/reference-registry.js +63 -0
  321. package/scripts/lib/security-confidence/auth-rbac-plan.js +39 -0
  322. package/scripts/lib/security-confidence/component-inventory.js +151 -0
  323. package/scripts/lib/security-confidence/constants.js +191 -0
  324. package/scripts/lib/security-confidence/dependency-script-risk.js +95 -0
  325. package/scripts/lib/security-confidence/evidence-hygiene.js +127 -0
  326. package/scripts/lib/security-confidence/feature-impact-classifier.js +80 -0
  327. package/scripts/lib/security-confidence/file-utils.js +161 -0
  328. package/scripts/lib/security-confidence/finding-triage.js +90 -0
  329. package/scripts/lib/security-confidence/findings.js +115 -0
  330. package/scripts/lib/security-confidence/index.js +29 -0
  331. package/scripts/lib/security-confidence/permission-budget.js +93 -0
  332. package/scripts/lib/security-confidence/redaction.js +82 -0
  333. package/scripts/lib/security-confidence/redteam-fixtures.js +53 -0
  334. package/scripts/lib/security-confidence/reference-adoption.js +229 -0
  335. package/scripts/lib/security-confidence/reference-taxonomy.js +155 -0
  336. package/scripts/lib/security-confidence/report-quality.js +99 -0
  337. package/scripts/lib/security-confidence/report-writer.js +79 -0
  338. package/scripts/lib/security-confidence/risk-classifier.js +187 -0
  339. package/scripts/lib/security-confidence/runner.js +179 -0
  340. package/scripts/lib/security-confidence/schema.js +188 -0
  341. package/scripts/lib/security-confidence/secret-safety.js +74 -0
  342. package/scripts/lib/security-confidence/security-capability-router.js +98 -0
  343. package/scripts/lib/security-confidence/web-security-smoke-plan.js +46 -0
  344. package/scripts/lib/security-risk-classifier.js +511 -0
  345. package/scripts/lib/security-scan.js +396 -0
  346. package/scripts/lib/session-context-optimizer.js +1211 -0
  347. package/scripts/lib/session-timing.js +322 -0
  348. package/scripts/lib/skill-hygiene.js +805 -0
  349. package/scripts/lib/skill-packs.js +161 -0
  350. package/scripts/lib/skills-operating-layer-v1.js +1023 -0
  351. package/scripts/lib/skills-operating-layer.js +629 -0
  352. package/scripts/lib/smallest-safe-plan.js +214 -0
  353. package/scripts/lib/smart-routing-plan.js +115 -0
  354. package/scripts/lib/smart-work-routing.js +768 -0
  355. package/scripts/lib/source-catalog.js +1022 -0
  356. package/scripts/lib/status-value-summary.js +32 -0
  357. package/scripts/lib/supply-chain-dependency-guard.js +1333 -0
  358. package/scripts/lib/supply-chain-guard.js +219 -0
  359. package/scripts/lib/support-bundle.js +561 -0
  360. package/scripts/lib/support-redaction.js +66 -0
  361. package/scripts/lib/task-continuation.js +440 -0
  362. package/scripts/lib/test-helpers.js +15 -0
  363. package/scripts/lib/tier.js +38 -0
  364. package/scripts/lib/token-context-quality-gate.js +370 -0
  365. package/scripts/lib/token-cost-capture.js +187 -0
  366. package/scripts/lib/token-cost-evidence.js +862 -0
  367. package/scripts/lib/token-cost-intelligence.js +358 -0
  368. package/scripts/lib/token-efficiency-evidence.js +213 -0
  369. package/scripts/lib/token-efficiency-map.js +110 -0
  370. package/scripts/lib/token-evidence.js +703 -0
  371. package/scripts/lib/tokenish.js +17 -0
  372. package/scripts/lib/tool-output-sandbox.js +559 -0
  373. package/scripts/lib/trust-audit.js +136 -0
  374. package/scripts/lib/unified-events.js +396 -0
  375. package/scripts/lib/upgrade-interruption-recovery.js +407 -0
  376. package/scripts/lib/usage-ledger.js +201 -0
  377. package/scripts/lib/value-ledger.js +130 -0
  378. package/scripts/lib/value-proof-calibration.js +531 -0
  379. package/scripts/lib/visual-qa.js +231 -0
  380. package/scripts/lib/voice-alpha.js +29 -0
  381. package/scripts/lib/webhook-idempotency-guard.js +990 -0
  382. package/scripts/lib/work-aware-orchestration.js +976 -0
  383. package/scripts/lib/work-control-receipts.js +577 -0
  384. package/scripts/lib/work-ledger.js +1123 -0
  385. package/scripts/lib/work-panel-preview.js +352 -0
  386. package/scripts/lib/workflow-discipline.js +280 -0
  387. package/scripts/lib/workflow-intelligence-radar.js +804 -0
  388. package/scripts/lib/workflow-signals.js +419 -0
  389. package/scripts/lib/workspace-map.js +281 -0
  390. package/scripts/lib/workspace-registry.js +1367 -0
  391. package/scripts/lib/workspace-resolver.js +542 -0
  392. package/scripts/wuz-doctor.js +315 -0
  393. package/bin/avorelo.mjs +0 -7
  394. package/dist/avorelo.mjs +0 -24678
@@ -0,0 +1,504 @@
1
+ "use strict";
2
+
3
+ const crypto = require("crypto");
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const { readStdinJson, ensureCcoDirs, getEffectiveConfig, safeWriteJson, safeWriteText } = require("./lib/fsx");
7
+ const { normalizeHookInput, outAdditional } = require("./lib/hook-contracts");
8
+ const { readSecurityAllowlist } = require("./lib/config");
9
+ const { logMetric } = require("./lib/metrics");
10
+ const { extractRuntimeEvidence } = require("./lib/attribution");
11
+ const { scanTextForSecurity } = require("./lib/security-scan");
12
+ const { summarizeLargeObject } = require("./lib/tokenish");
13
+ const { summarizeLargeOutput } = require("./lib/context-savings-engine");
14
+ const { ValueLedger } = require("./lib/value-ledger");
15
+ const { createRemediationJob } = require("./lib/remediation");
16
+ const { selectMicroProofs, formatMicroProofContext } = require("./lib/micro-proof");
17
+ const { createCanonicalProof, withCanonicalProof } = require("./lib/proof-canonical");
18
+ const { ReentryMemoryStore } = require("./lib/reentry-memory-store");
19
+ const { captureFromFailure, captureFromFileChange } = require("./lib/reentry-memory-capture");
20
+ const { checkToolOutputSize, normalizeBudgetConfig } = require("./lib/context-budget-guard");
21
+
22
+ const BUILTIN_TOOLS = new Set(["Bash", "Read", "Write", "Edit", "Glob", "Grep", "Agent", "WebFetch", "WebSearch", "Skill"]);
23
+
24
+ function contentHash(text) {
25
+ return crypto.createHash("sha1").update(String(text || "")).digest("hex");
26
+ }
27
+
28
+ function loadScanHashState(cwd) {
29
+ const p = path.join(cwd, ".claude", "cco", "state", "scan-hashes.json");
30
+ try {
31
+ return JSON.parse(fs.readFileSync(p, "utf8"));
32
+ } catch {
33
+ return {};
34
+ }
35
+ }
36
+
37
+ function saveScanHashState(cwd, state) {
38
+ const p = path.join(cwd, ".claude", "cco", "state", "scan-hashes.json");
39
+ fs.mkdirSync(path.dirname(p), { recursive: true });
40
+ fs.writeFileSync(p, JSON.stringify(state, null, 2), "utf8");
41
+ }
42
+
43
+ function logMaterialStep(cwd, params) {
44
+ const canonical = createCanonicalProof("material_step", params.proof || {});
45
+ logMetric(cwd, {
46
+ sessionId: params.sessionId,
47
+ event: params.event,
48
+ tool: params.tool,
49
+ action: params.action,
50
+ reasonCodes: params.reasonCodes || [],
51
+ meta: withCanonicalProof(params.meta || {}, canonical),
52
+ });
53
+ }
54
+
55
+ // Credential finding codes that always trigger a warning even when riskScore < 70.
56
+ // SEC_GH_TOKEN scores ~66 but is credential-critical; SEC_PRIVATE_KEY scores >= 90.
57
+ const CREDENTIAL_CODES = new Set(["SEC_PRIVATE_KEY", "SEC_GH_TOKEN"]);
58
+
59
+ // Redact known credential patterns from a string. Used for MCP output replacement.
60
+ function redactStringCredentials(text) {
61
+ if (typeof text !== "string") return text;
62
+ let s = text.replace(/-----BEGIN PRIVATE KEY-----[\s\S]*?-----END PRIVATE KEY-----/g, "[REDACTED:SEC_PRIVATE_KEY]");
63
+ s = s.replace(/ghp_[A-Za-z0-9]{20,}/g, "[REDACTED:SEC_GH_TOKEN]");
64
+ return s;
65
+ }
66
+
67
+ // Recursively redact credential strings in an object/array, preserving non-string fields.
68
+ function redactObjectStrings(value) {
69
+ if (typeof value === "string") return redactStringCredentials(value);
70
+ if (Array.isArray(value)) return value.map(redactObjectStrings);
71
+ if (value && typeof value === "object") {
72
+ const out = {};
73
+ for (const [k, v] of Object.entries(value)) out[k] = redactObjectStrings(v);
74
+ return out;
75
+ }
76
+ return value;
77
+ }
78
+
79
+ // Build scan text from toolResponse: always JSON.stringify so ALL fields (stdout AND stderr)
80
+ // are covered, not just the first non-null field.
81
+ function buildScanText(toolResponse) {
82
+ if (!toolResponse) return null;
83
+ if (typeof toolResponse === "string") {
84
+ return toolResponse.length > 50000 ? toolResponse.slice(0, 50000) : toolResponse;
85
+ }
86
+ try {
87
+ const s = JSON.stringify(toolResponse);
88
+ return s.length > 50000 ? s.slice(0, 50000) : s;
89
+ } catch { return null; }
90
+ }
91
+
92
+ async function main() {
93
+ const raw = await readStdinJson();
94
+ const input = normalizeHookInput(raw);
95
+ const cwd = input.cwd;
96
+ const sessionId = input.session_id;
97
+ const toolName = input.tool_name;
98
+ const toolInput = input.tool_input;
99
+ const toolResponse = input.tool_response;
100
+ const hookEventName = input.hook_event_name || "PostToolUse";
101
+ const runtimeEvidence = extractRuntimeEvidence({
102
+ tool: toolName,
103
+ event: hookEventName,
104
+ toolInput,
105
+ toolResponse,
106
+ }) || {};
107
+
108
+ ensureCcoDirs(cwd);
109
+ const { config } = getEffectiveConfig(cwd);
110
+ const ledger = new ValueLedger(cwd);
111
+ const allowlist = readSecurityAllowlist(cwd, config);
112
+
113
+ if ((toolName === "Write" || toolName === "Edit") && toolInput && toolInput.file_path) {
114
+ const filePath = toolInput.file_path;
115
+ const content = typeof toolInput.content === "string" ? toolInput.content : "";
116
+
117
+ const hashState = loadScanHashState(cwd);
118
+ const h = contentHash(content);
119
+ if (hashState[filePath] && hashState[filePath] === h) {
120
+ logMaterialStep(cwd, {
121
+ sessionId,
122
+ event: "PostToolUse",
123
+ tool: toolName,
124
+ action: "scanSkipped",
125
+ reasonCodes: ["CTX_SCAN_SKIPPED_UNCHANGED"],
126
+ meta: { filePath },
127
+ proof: {
128
+ step_type: "scan_skipped",
129
+ value_type: "efficiency",
130
+ artifact_ref: null,
131
+ evidence_refs: [],
132
+ user_visible_proof_supported: false,
133
+ notes: "Skipped security scan because file content hash was unchanged.",
134
+ reason_codes: ["CTX_SCAN_SKIPPED_UNCHANGED"],
135
+ },
136
+ });
137
+ return process.stdout.write(JSON.stringify({}));
138
+ }
139
+
140
+ hashState[filePath] = h;
141
+ saveScanHashState(cwd, hashState);
142
+
143
+ const report = scanTextForSecurity({ text: content, pathHint: filePath, allowlist });
144
+ const outPath = `.claude/cco/security/${Date.now()}-file-scan.json`;
145
+ safeWriteJson(cwd, outPath, report);
146
+
147
+ if (Array.isArray(report.suppressionAudit) && report.suppressionAudit.length) {
148
+ const auditPath = `.claude/cco/security/${Date.now()}-suppression-audit.json`;
149
+ safeWriteJson(cwd, auditPath, { sessionId, filePath, suppressionAudit: report.suppressionAudit });
150
+ logMaterialStep(cwd, {
151
+ sessionId,
152
+ event: "PostToolUse",
153
+ tool: toolName,
154
+ action: "suppressionAudit",
155
+ reasonCodes: ["SEC_SUPPRESSION_AUDIT"],
156
+ meta: { filePath, auditPath, count: report.suppressionAudit.length },
157
+ proof: {
158
+ step_type: "suppression_audit",
159
+ value_type: "trust",
160
+ artifact_ref: auditPath,
161
+ evidence_refs: [auditPath],
162
+ user_visible_proof_supported: false,
163
+ notes: "Recorded suppression audit for ignored findings.",
164
+ reason_codes: ["SEC_SUPPRESSION_AUDIT"],
165
+ },
166
+ });
167
+ }
168
+
169
+ let remediation = null;
170
+ if (report.activeFindingsCount > 0) {
171
+ remediation = createRemediationJob(cwd, { sessionId, filePath, report });
172
+ logMaterialStep(cwd, {
173
+ sessionId,
174
+ event: "PostToolUse",
175
+ tool: toolName,
176
+ action: "remediationSuggested",
177
+ reasonCodes: ["SEC_REMEDIATION_JOB_CREATED", ...(report.topReasons || [])],
178
+ meta: {
179
+ profile: config.profile,
180
+ tier: config.tier,
181
+ jobPath: remediation.jobPath,
182
+ riskClass: remediation.job.riskClass,
183
+ },
184
+ proof: {
185
+ step_type: "remediation_created",
186
+ value_type: "trust",
187
+ artifact_ref: remediation.jobPath,
188
+ evidence_refs: [remediation.jobPath],
189
+ recovery_triggered: true,
190
+ user_visible_proof_supported: true,
191
+ notes: "Created remediation guidance for active security findings.",
192
+ reason_codes: ["SEC_REMEDIATION_JOB_CREATED", ...(report.topReasons || [])],
193
+ },
194
+ });
195
+ }
196
+
197
+ logMaterialStep(cwd, {
198
+ sessionId,
199
+ event: "PostToolUse",
200
+ tool: toolName,
201
+ action: "scan",
202
+ reasonCodes: report.topReasons || [],
203
+ meta: {
204
+ profile: config.profile,
205
+ tier: config.tier,
206
+ filePath,
207
+ riskScore: report.riskScore,
208
+ activeFindingsCount: report.activeFindingsCount,
209
+ },
210
+ proof: {
211
+ step_type: report.activeFindingsCount > 0 ? "security_finding" : "other",
212
+ value_type: "trust",
213
+ artifact_ref: outPath,
214
+ evidence_refs: remediation ? [outPath, remediation.jobPath] : [outPath],
215
+ recovery_triggered: remediation ? true : null,
216
+ user_visible_proof_supported: report.activeFindingsCount > 0,
217
+ notes:
218
+ report.activeFindingsCount > 0
219
+ ? "Security scan produced active findings."
220
+ : "Security scan completed with no active findings.",
221
+ reason_codes: report.topReasons || [],
222
+ },
223
+ });
224
+
225
+ if (report.riskScore >= 70) {
226
+ const rem = remediation ? ` Remediation job: ${remediation.jobPath}.` : "";
227
+ let msg = `Security scan flagged HIGH risk (${(report.topReasons || []).join(", ")}). See ${outPath}.${rem}`;
228
+
229
+ try {
230
+ const proofCodes = remediation
231
+ ? ["SEC_REMEDIATION_JOB_CREATED"]
232
+ : (report.topReasons || []).filter((c) => String(c).startsWith("SEC_"));
233
+ const proofEnabled =
234
+ config.proofSystem?.enabled !== false &&
235
+ config.proofSystem?.microProofEnabled !== false;
236
+ const { proofs } = selectMicroProofs(proofCodes, cwd, sessionId, { proofEnabled });
237
+ const proofText = formatMicroProofContext(proofs);
238
+ if (proofText) msg += ` ${proofText}`;
239
+ } catch {}
240
+
241
+ return process.stdout.write(JSON.stringify(outAdditional("PostToolUse", msg)));
242
+ }
243
+
244
+ if (report.riskScore < 70) {
245
+ try {
246
+ const memStore = new ReentryMemoryStore(cwd, config.memory);
247
+ captureFromFileChange(memStore, { sessionId, filePath, summary: `${toolName} on ${filePath} (risk: ${report.riskScore})` });
248
+ } catch { /* non-fatal */ }
249
+ }
250
+
251
+ return process.stdout.write(JSON.stringify({}));
252
+ }
253
+
254
+ if (hookEventName === "PostToolUseFailure") {
255
+ const hint =
256
+ "Tool failed. Avoid blind retries: inspect stderr, narrow inputs, and run avorelo status for quick remediation hints.";
257
+ logMaterialStep(cwd, {
258
+ sessionId,
259
+ event: "PostToolUseFailure",
260
+ tool: toolName,
261
+ action: "guidance",
262
+ reasonCodes: ["FAIL_RETRY_GUARD"],
263
+ meta: { profile: config.profile, tier: config.tier },
264
+ proof: {
265
+ step_type: "retry_guard",
266
+ value_type: "control",
267
+ artifact_ref: null,
268
+ evidence_refs: [],
269
+ recovery_triggered: true,
270
+ user_visible_proof_supported: true,
271
+ notes: hint,
272
+ reason_codes: ["FAIL_RETRY_GUARD"],
273
+ },
274
+ });
275
+
276
+ try {
277
+ const memStore = new ReentryMemoryStore(cwd, config.memory);
278
+ captureFromFailure(memStore, { sessionId, toolName, summary: `${toolName} failed`, errorText: String(input.tool_response || "") });
279
+ } catch { /* non-fatal */ }
280
+
281
+ let microProofSuffix = "";
282
+ try {
283
+ const proofEnabled =
284
+ config.proofSystem?.enabled !== false &&
285
+ config.proofSystem?.microProofEnabled !== false;
286
+ const { proofs } = selectMicroProofs(["FAIL_RETRY_GUARD"], cwd, sessionId, {
287
+ proofEnabled,
288
+ });
289
+ const proofText = formatMicroProofContext(proofs);
290
+ if (proofText) microProofSuffix = ` ${proofText}`;
291
+ } catch {}
292
+
293
+ return process.stdout.write(
294
+ JSON.stringify(outAdditional("PostToolUseFailure", `${hint}${microProofSuffix}`))
295
+ );
296
+ }
297
+
298
+ // Scan Bash, Read, and non-builtin MCP tool responses for sensitive data patterns.
299
+ // Write/Edit have their own file-content scan above; they are excluded here.
300
+ // JSON.stringify scan text ensures ALL fields (stdout AND stderr) are covered.
301
+ const SCAN_RESPONSE_TOOLS = new Set(["Bash", "Read"]);
302
+ const shouldScanResponse = SCAN_RESPONSE_TOOLS.has(toolName) || !BUILTIN_TOOLS.has(toolName);
303
+
304
+ if (shouldScanResponse) {
305
+ try {
306
+ const scanText = buildScanText(toolResponse);
307
+ if (scanText) {
308
+ const scanResult = scanTextForSecurity({ text: scanText, pathHint: `${toolName}-output`, allowlist });
309
+ if (scanResult.activeFindingsCount > 0) {
310
+ const codes = scanResult.topReasons || [];
311
+ const hasCredential = codes.some((c) => CREDENTIAL_CODES.has(c));
312
+ // Warn if riskScore >= 70 OR output contains a credential-like pattern.
313
+ // SEC_GH_TOKEN scores ~66 (below global threshold) but is always credential-critical.
314
+ const warningEmitted = scanResult.riskScore >= 70 || hasCredential;
315
+
316
+ // For MCP (non-builtin) tools: redact credential strings and replace output via
317
+ // updatedMCPToolOutput — this is real PRE_CONTEXT saving (Claude Code honors it).
318
+ // For built-in tools (Bash/Read): output already reached Claude before this hook ran;
319
+ // no replacement schema exists for built-ins, so warning-only is the honest behavior.
320
+ let redactionHappened = false;
321
+ let updatedMCPOutput = null;
322
+ if (warningEmitted && !BUILTIN_TOOLS.has(toolName) && hasCredential) {
323
+ try {
324
+ const redacted = redactObjectStrings(toolResponse);
325
+ updatedMCPOutput = JSON.stringify(redacted);
326
+ redactionHappened = true;
327
+ } catch { /* fail-open: keep redactionHappened=false */ }
328
+ }
329
+
330
+ logMaterialStep(cwd, {
331
+ sessionId,
332
+ event: "PostToolUse",
333
+ tool: toolName,
334
+ action: "sensitiveOutputDetected",
335
+ reasonCodes: ["SEC_OUTPUT_SENSITIVE_DATA", ...codes],
336
+ meta: {
337
+ profile: config.profile,
338
+ tier: config.tier,
339
+ riskScore: scanResult.riskScore,
340
+ activeFindingsCount: scanResult.activeFindingsCount,
341
+ findingCodes: codes,
342
+ warningEmitted,
343
+ redactionHappened,
344
+ },
345
+ proof: {
346
+ step_type: "security_finding",
347
+ value_type: "control",
348
+ artifact_ref: null,
349
+ evidence_refs: [],
350
+ user_visible_proof_supported: warningEmitted,
351
+ notes: redactionHappened
352
+ ? `Sensitive data redacted from MCP tool output before model context.`
353
+ : `Sensitive data pattern detected in ${toolName} tool output; warning emitted.`,
354
+ reason_codes: ["SEC_OUTPUT_SENSITIVE_DATA", ...codes],
355
+ },
356
+ });
357
+
358
+ if (warningEmitted) {
359
+ const codeStr = codes.join(", ") || "SEC_OUTPUT_SENSITIVE_DATA";
360
+ // Only claim redaction for MCP where updatedMCPToolOutput actually replaces output.
361
+ // For built-in tools, raw output already reached Claude — warning only.
362
+ const msg = redactionHappened
363
+ ? `Avorelo redacted sensitive data from MCP tool output (${codeStr}). Raw credential values removed before model context.`
364
+ : `Avorelo detected sensitive data in ${toolName} output (${codeStr}). Review before using this output. Do not log or store raw values.`;
365
+
366
+ const hookOut = outAdditional("PostToolUse", msg);
367
+ if (redactionHappened && updatedMCPOutput !== null) {
368
+ return process.stdout.write(JSON.stringify({
369
+ updatedMCPToolOutput: updatedMCPOutput,
370
+ ...hookOut,
371
+ }));
372
+ }
373
+ return process.stdout.write(JSON.stringify(hookOut));
374
+ }
375
+ }
376
+ }
377
+ } catch {
378
+ // Fail-open: scanner errors must never break tool output delivery.
379
+ try {
380
+ logMaterialStep(cwd, {
381
+ sessionId, event: "PostToolUse", tool: toolName, action: "scanError",
382
+ reasonCodes: [],
383
+ meta: { profile: config.profile, tier: config.tier },
384
+ proof: {
385
+ step_type: "other", value_type: "control",
386
+ artifact_ref: null, evidence_refs: [],
387
+ user_visible_proof_supported: false,
388
+ notes: "Security scanner threw during response scan; failing open.",
389
+ reason_codes: [],
390
+ },
391
+ });
392
+ } catch { /* double fail-open */ }
393
+ }
394
+ }
395
+
396
+ // Detect large output — do NOT pass ledger here; we only emit a ledger event
397
+ // for MCP tools below (where updatedMCPToolOutput genuinely replaces what Claude sees).
398
+ // For built-in tools (Bash etc.) we emit additionalContext only, which adds context rather
399
+ // than saving it — no savings event is claimed.
400
+ const { summary } = summarizeLargeOutput(toolResponse, null, { sessionId, toolName });
401
+ if (summary && summary.isLarge) {
402
+ const artifactPath = `.claude/cco/state/tool-response-${Date.now()}.txt`;
403
+ safeWriteText(cwd, artifactPath, JSON.stringify(toolResponse, null, 2));
404
+
405
+ logMaterialStep(cwd, {
406
+ sessionId,
407
+ event: "PostToolUse",
408
+ tool: toolName,
409
+ action: "largeOutputStored",
410
+ reasonCodes: ["CTX_LARGE_OUTPUT"],
411
+ meta: { profile: config.profile, tier: config.tier, bytes: summary.bytes, artifactPath },
412
+ proof: {
413
+ step_type: "large_output_managed",
414
+ value_type: "efficiency",
415
+ artifact_ref: artifactPath,
416
+ evidence_refs: [artifactPath],
417
+ user_visible_proof_supported: true,
418
+ notes: "Stored large tool output out-of-band to reduce context pressure.",
419
+ reason_codes: ["CTX_LARGE_OUTPUT"],
420
+ bytes: summary.bytes,
421
+ output_artifact_type: "tool_output_snapshot",
422
+ output_artifact_reference: artifactPath,
423
+ },
424
+ });
425
+
426
+ let microProofSuffix = "";
427
+ try {
428
+ const proofEnabled =
429
+ config.proofSystem?.enabled !== false &&
430
+ config.proofSystem?.microProofEnabled !== false;
431
+ const { proofs } = selectMicroProofs(["CTX_LARGE_OUTPUT"], cwd, sessionId, {
432
+ proofEnabled,
433
+ });
434
+ const proofText = formatMicroProofContext(proofs);
435
+ if (proofText) microProofSuffix = ` ${proofText}`;
436
+ } catch {}
437
+
438
+ const additionalContext = `Tool output was large; stored full output at ${artifactPath}. Use the stored file instead of re-running the tool.${microProofSuffix}`;
439
+
440
+ if (!BUILTIN_TOOLS.has(toolName)) {
441
+ // MCP tool: updatedMCPToolOutput replaces the tool response before Claude sees it.
442
+ // This is a genuine PRE_CONTEXT saving — emit the ledger event here only.
443
+ const savedBytes = Math.max(0, summary.bytes - Buffer.byteLength(summary.preview || "", "utf8"));
444
+ ledger.append({
445
+ bucket: "large_output_referenced",
446
+ sessionId,
447
+ label: `MCP large output replaced: ${summary.bytes} bytes → preview`,
448
+ savedBytes,
449
+ savedTokens: Math.round(savedBytes / 4),
450
+ notes: `tool=${toolName}`,
451
+ artifactRef: artifactPath,
452
+ });
453
+ return process.stdout.write(
454
+ JSON.stringify({
455
+ updatedMCPToolOutput: summary.preview,
456
+ ...outAdditional("PostToolUse", additionalContext),
457
+ })
458
+ );
459
+ }
460
+
461
+ // Built-in tool (Bash, Read, etc.): additionalContext only — adds guidance, does not replace
462
+ // the tool response Claude already received. No ledger savings event for this path.
463
+ return process.stdout.write(JSON.stringify(outAdditional("PostToolUse", additionalContext)));
464
+ }
465
+
466
+ if (config.contextBudgetGuard?.enabled) {
467
+ const budget = normalizeBudgetConfig(config.contextBudgetGuard);
468
+ const rawText = typeof toolResponse === "string" ? toolResponse : JSON.stringify(toolResponse ?? "");
469
+ const sizeCheck = checkToolOutputSize(rawText, budget);
470
+ if (sizeCheck.isOversized) {
471
+ logMaterialStep(cwd, {
472
+ sessionId,
473
+ event: "PostToolUse",
474
+ tool: toolName,
475
+ action: "budgetOutputWarning",
476
+ reasonCodes: ["CTX_BUDGET_OUTPUT_OVERSIZED"],
477
+ meta: { bytes: sizeCheck.bytes, maxBytes: sizeCheck.maxBytes },
478
+ proof: {
479
+ step_type: "budget_output_warning",
480
+ value_type: "efficiency",
481
+ artifact_ref: null,
482
+ evidence_refs: [],
483
+ user_visible_proof_supported: true,
484
+ notes: "Tool output exceeded configured context budget output threshold.",
485
+ reason_codes: ["CTX_BUDGET_OUTPUT_OVERSIZED"],
486
+ },
487
+ });
488
+ return process.stdout.write(JSON.stringify(outAdditional("PostToolUse", sizeCheck.truncateHint)));
489
+ }
490
+ }
491
+
492
+ logMetric(cwd, {
493
+ ...runtimeEvidence,
494
+ sessionId,
495
+ event: "PostToolUse",
496
+ tool: toolName,
497
+ action: "noop",
498
+ reasonCodes: [],
499
+ meta: { profile: config.profile, tier: config.tier },
500
+ });
501
+ process.stdout.write(JSON.stringify({}));
502
+ }
503
+
504
+ main().catch(() => process.stdout.write(JSON.stringify({})));