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,202 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Capability Kernel v1 — avorelo.capabilityKernelReport.v1
5
+ *
6
+ * Audit-first, contract-first operating layer over Avorelo capabilities.
7
+ * Discovers capabilities from the static registry, validates contracts,
8
+ * produces a deterministic report, and surfaces one compact outcome.
9
+ *
10
+ * This does NOT rewrite capability internals or create a new dashboard.
11
+ * It is an audit/normalization/reporting layer.
12
+ */
13
+
14
+ const path = require("path");
15
+ const { getCapabilityRegistry } = require("./capability-kernel-registry");
16
+ const { validateAllContracts, COMPLIANCE_READY, COMPLIANCE_PARTIAL } = require("./capability-contract-validator");
17
+ const { checkClaimSafety, SCHEMA_VERSION } = require("./capability-manifest");
18
+
19
+ const KERNEL_REPORT_SCHEMA = "avorelo.capabilityKernelReport.v1";
20
+
21
+ /**
22
+ * Build the full Capability Kernel v1 report.
23
+ * @param {string} cwd - Repository root
24
+ * @param {object} [options] - Options
25
+ * @param {object[]} [options.capabilities] - Override capability list (for testing)
26
+ * @returns {object} Kernel report
27
+ */
28
+ function buildCapabilityKernelReport(cwd, options = {}) {
29
+ const capabilities = options.capabilities || getCapabilityRegistry();
30
+ const { results, summary } = validateAllContracts(capabilities, cwd);
31
+
32
+ // Classify gaps
33
+ const gaps = [];
34
+ for (const r of results) {
35
+ if (r.compliance !== COMPLIANCE_READY) {
36
+ const gapReasons = [];
37
+ if (r.errors.length > 0) gapReasons.push(...r.errors.map((e) => `error: ${e}`));
38
+ if (!r.hasTests) gapReasons.push("missing tests");
39
+ if (!r.hasDocs) gapReasons.push("missing docs");
40
+ if (!r.hasPolicyGate) gapReasons.push("missing policy gate");
41
+ if (!r.hasRollback) gapReasons.push("missing rollback behavior");
42
+ if (!r.hasDogfood) gapReasons.push("missing dogfood artifact");
43
+ if (r.claimSafetyIssues.length > 0) gapReasons.push("claim-safety issues detected");
44
+ if (r.warnings.length > 2) gapReasons.push(`${r.warnings.length} warnings`);
45
+
46
+ gaps.push({
47
+ capabilityId: r.id,
48
+ capabilityName: r.name,
49
+ compliance: r.compliance,
50
+ reasons: gapReasons,
51
+ safeNextAction: buildSafeNextAction(r),
52
+ });
53
+ }
54
+ }
55
+
56
+ // Overall status
57
+ let status = "pass";
58
+ if (summary.needsAttention > 0 || summary.unsafeClaims > 0) {
59
+ status = "needs_attention";
60
+ } else if (summary.partiallyCompliant > 0) {
61
+ status = "warn";
62
+ }
63
+
64
+ // Duplicate surface check
65
+ const surfaceCounts = {};
66
+ for (const cap of capabilities) {
67
+ if (cap.surfaces) {
68
+ for (const [key, val] of Object.entries(cap.surfaces)) {
69
+ if (val) {
70
+ surfaceCounts[key] = (surfaceCounts[key] || 0) + 1;
71
+ }
72
+ }
73
+ }
74
+ }
75
+ // Flag if any single surface has >15 capabilities (noise risk)
76
+ const noisySurfaces = Object.entries(surfaceCounts).filter(([, count]) => count > 15);
77
+ summary.duplicateSurfaces = noisySurfaces.length;
78
+
79
+ const safeNextAction = buildOverallSafeNextAction(gaps, summary);
80
+
81
+ return {
82
+ schemaVersion: KERNEL_REPORT_SCHEMA,
83
+ status,
84
+ summary,
85
+ capabilities: results.map((r) => ({
86
+ id: r.id,
87
+ name: r.name,
88
+ compliance: r.compliance,
89
+ hasTests: r.hasTests,
90
+ hasDocs: r.hasDocs,
91
+ hasPolicyGate: r.hasPolicyGate,
92
+ hasRollback: r.hasRollback,
93
+ hasBudgets: r.hasBudgets,
94
+ hasDogfood: r.hasDogfood,
95
+ errorCount: r.errors.length,
96
+ warningCount: r.warnings.length,
97
+ claimSafetyIssueCount: r.claimSafetyIssues.length,
98
+ })),
99
+ gaps,
100
+ noisySurfaces: noisySurfaces.map(([surface, count]) => ({ surface, count })),
101
+ safeNextAction,
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Build a safe next action for a single capability gap.
107
+ */
108
+ function buildSafeNextAction(result) {
109
+ if (result.errors.length > 0) {
110
+ return `Fix contract errors for ${result.name}: ${result.errors[0]}`;
111
+ }
112
+ if (!result.hasTests) {
113
+ return `Add test coverage for ${result.name}`;
114
+ }
115
+ if (!result.hasDocs) {
116
+ return `Add documentation for ${result.name}`;
117
+ }
118
+ if (result.claimSafetyIssues.length > 0) {
119
+ return `Review claim-safety issues in ${result.name}`;
120
+ }
121
+ if (!result.hasDogfood) {
122
+ return `Add dogfood artifact for ${result.name}`;
123
+ }
124
+ return `Review ${result.warnings.length} warnings for ${result.name}`;
125
+ }
126
+
127
+ /**
128
+ * Build the overall safe next action for the kernel report.
129
+ */
130
+ function buildOverallSafeNextAction(gaps, summary) {
131
+ if (summary.unsafeClaims > 0) {
132
+ return "Review and fix unsafe public claims before release.";
133
+ }
134
+ if (summary.needsAttention > 0) {
135
+ const first = gaps.find((g) => g.compliance === "needs_attention");
136
+ return first
137
+ ? `Fix: ${first.safeNextAction}`
138
+ : "Fix capabilities that need attention.";
139
+ }
140
+ if (summary.partiallyCompliant > 0) {
141
+ const first = gaps.find((g) => g.compliance === "partial");
142
+ return first
143
+ ? `Next: ${first.safeNextAction}`
144
+ : "Improve partial capabilities toward full compliance.";
145
+ }
146
+ return "All capabilities checked and compliant. Continue normal operation.";
147
+ }
148
+
149
+ /**
150
+ * Format kernel report as compact text for CLI/status.
151
+ */
152
+ function formatKernelReportText(report) {
153
+ const s = report.summary;
154
+ let text = `Capabilities: ${s.capabilitiesFound} checked; ${s.fullyCompliant} ready; ${s.partiallyCompliant} partial; ${s.needsAttention} need attention.`;
155
+
156
+ if (report.safeNextAction) {
157
+ text += ` ${report.safeNextAction}`;
158
+ }
159
+
160
+ return text;
161
+ }
162
+
163
+ /**
164
+ * Format kernel report as a Product Home bucket mapping.
165
+ */
166
+ function formatKernelProductHomeBuckets(report) {
167
+ const buckets = {
168
+ found: [],
169
+ fixed: [],
170
+ saved_or_proved: [],
171
+ needs_attention: [],
172
+ };
173
+
174
+ for (const cap of report.capabilities) {
175
+ if (cap.compliance === COMPLIANCE_READY) {
176
+ buckets.saved_or_proved.push({
177
+ title: cap.name,
178
+ oneLine: `${cap.name}: checked, proof-backed`,
179
+ });
180
+ } else {
181
+ buckets.needs_attention.push({
182
+ title: cap.name,
183
+ oneLine: `${cap.name}: ${cap.compliance} (${cap.errorCount} errors, ${cap.warningCount} warnings)`,
184
+ });
185
+ }
186
+ }
187
+
188
+ // The discovery itself is a "found" item
189
+ buckets.found.push({
190
+ title: "Capability Kernel v1",
191
+ oneLine: `${report.summary.capabilitiesFound} capabilities discovered and mapped`,
192
+ });
193
+
194
+ return buckets;
195
+ }
196
+
197
+ module.exports = {
198
+ KERNEL_REPORT_SCHEMA,
199
+ buildCapabilityKernelReport,
200
+ formatKernelReportText,
201
+ formatKernelProductHomeBuckets,
202
+ };
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Capability Manifest Schema — avorelo.capabilityManifest.v1
5
+ *
6
+ * Defines the operating contract for every Avorelo capability.
7
+ * Each capability is represented by a manifest that describes its
8
+ * triggers, risk tier, policy gate, evidence requirements, output
9
+ * contract, surfaces, budgets, tests, docs, and rollback behavior.
10
+ *
11
+ * This is an audit/contract layer — it does not rewrite capability internals.
12
+ */
13
+
14
+ const SCHEMA_VERSION = "avorelo.capabilityManifest.v1";
15
+
16
+ const VALID_STATUSES = new Set(["active", "partial", "deprecated", "internal_only"]);
17
+ const VALID_RISK_TIERS = new Set(["low", "medium", "high"]);
18
+ const VALID_SIDE_EFFECT_LEVELS = new Set(["read_only", "local_write", "external_write", "destructive"]);
19
+ const VALID_DECISIONS = new Set(["allow", "warn", "require_approval", "block", "defer", "no_op"]);
20
+ const VALID_REF_TYPES = new Set(["report", "receipt", "test", "diff", "proof", "audit"]);
21
+ const VALID_OUTCOME_TYPES = new Set(["found", "fixed", "saved_or_proved", "needs_attention"]);
22
+ const VALID_FAIL_BEHAVIORS = new Set(["fail_open_advisory", "fail_closed_policy"]);
23
+
24
+ const UNSAFE_CLAIM_TERMS = [
25
+ "guaranteed",
26
+ "fully secure",
27
+ "fully secured",
28
+ "autonomous",
29
+ "company brain",
30
+ "remembers everything",
31
+ "full memory",
32
+ "guaranteed recall",
33
+ "saves dollars",
34
+ "saves credits",
35
+ "saves money",
36
+ "auto-inject",
37
+ "auto-injected",
38
+ "perfect proof",
39
+ "complete proof",
40
+ "production certified",
41
+ ];
42
+
43
+ const UNSAFE_CLAIM_PATTERNS = UNSAFE_CLAIM_TERMS.map(
44
+ (term) => new RegExp(term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i")
45
+ );
46
+
47
+ /**
48
+ * Validate a capability manifest against the v1 schema.
49
+ * Returns { valid, errors, warnings }.
50
+ */
51
+ function validateManifest(manifest) {
52
+ const errors = [];
53
+ const warnings = [];
54
+
55
+ if (!manifest || typeof manifest !== "object") {
56
+ return { valid: false, errors: ["manifest must be a non-null object"], warnings };
57
+ }
58
+
59
+ // Required fields
60
+ if (manifest.schemaVersion !== SCHEMA_VERSION) {
61
+ errors.push(`schemaVersion must be "${SCHEMA_VERSION}", got "${manifest.schemaVersion}"`);
62
+ }
63
+ if (!manifest.id || typeof manifest.id !== "string") {
64
+ errors.push("id is required and must be a non-empty string");
65
+ }
66
+ if (!manifest.name || typeof manifest.name !== "string") {
67
+ errors.push("name is required and must be a non-empty string");
68
+ }
69
+ if (!manifest.category || typeof manifest.category !== "string") {
70
+ errors.push("category is required and must be a non-empty string");
71
+ }
72
+
73
+ // Status
74
+ if (manifest.status && !VALID_STATUSES.has(manifest.status)) {
75
+ errors.push(`status must be one of: ${[...VALID_STATUSES].join(", ")}`);
76
+ }
77
+
78
+ // Risk tier
79
+ if (manifest.riskTier && !VALID_RISK_TIERS.has(manifest.riskTier)) {
80
+ errors.push(`riskTier must be one of: ${[...VALID_RISK_TIERS].join(", ")}`);
81
+ }
82
+
83
+ // Side-effect level
84
+ if (manifest.sideEffectLevel && !VALID_SIDE_EFFECT_LEVELS.has(manifest.sideEffectLevel)) {
85
+ errors.push(`sideEffectLevel must be one of: ${[...VALID_SIDE_EFFECT_LEVELS].join(", ")}`);
86
+ }
87
+
88
+ // Policy gate validation for side-effect capabilities
89
+ if (manifest.sideEffectLevel && manifest.sideEffectLevel !== "read_only") {
90
+ if (!manifest.policy || typeof manifest.policy !== "object") {
91
+ errors.push("side-effect capabilities (non-read_only) must define a policy gate");
92
+ } else {
93
+ if (manifest.policy.defaultDecision && !VALID_DECISIONS.has(manifest.policy.defaultDecision)) {
94
+ errors.push(`policy.defaultDecision must be one of: ${[...VALID_DECISIONS].join(", ")}`);
95
+ }
96
+ // Destructive or external_write must not default to allow
97
+ if (
98
+ (manifest.sideEffectLevel === "destructive" || manifest.sideEffectLevel === "external_write") &&
99
+ manifest.policy.defaultDecision === "allow"
100
+ ) {
101
+ errors.push("destructive or external_write capabilities must not default to allow");
102
+ }
103
+ }
104
+ }
105
+
106
+ // Evidence requirements for active capabilities
107
+ if (manifest.status === "active") {
108
+ if (!manifest.evidenceRequirements || typeof manifest.evidenceRequirements !== "object") {
109
+ warnings.push("active capabilities should define evidenceRequirements");
110
+ } else {
111
+ if (manifest.evidenceRequirements.allowedRefTypes) {
112
+ for (const rt of manifest.evidenceRequirements.allowedRefTypes) {
113
+ if (!VALID_REF_TYPES.has(rt)) {
114
+ warnings.push(`unknown evidenceRequirements.allowedRefTypes: "${rt}"`);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+
121
+ // Output contract
122
+ if (manifest.outputContract && typeof manifest.outputContract === "object") {
123
+ if (manifest.outputContract.outcomeTypes) {
124
+ for (const ot of manifest.outputContract.outcomeTypes) {
125
+ if (!VALID_OUTCOME_TYPES.has(ot)) {
126
+ warnings.push(`unknown outputContract.outcomeTypes: "${ot}"`);
127
+ }
128
+ }
129
+ }
130
+ }
131
+
132
+ // Budgets for context-heavy capabilities
133
+ if (manifest.budgets && typeof manifest.budgets === "object") {
134
+ if (manifest.budgets.maxFilesScanned != null && typeof manifest.budgets.maxFilesScanned !== "number") {
135
+ warnings.push("budgets.maxFilesScanned should be a number");
136
+ }
137
+ if (manifest.budgets.maxFileBytes != null && typeof manifest.budgets.maxFileBytes !== "number") {
138
+ warnings.push("budgets.maxFileBytes should be a number");
139
+ }
140
+ }
141
+
142
+ // Rollback / fail behavior
143
+ if (manifest.rollback && typeof manifest.rollback === "object") {
144
+ if (manifest.rollback.failBehavior && !VALID_FAIL_BEHAVIORS.has(manifest.rollback.failBehavior)) {
145
+ errors.push(`rollback.failBehavior must be one of: ${[...VALID_FAIL_BEHAVIORS].join(", ")}`);
146
+ }
147
+ } else if (manifest.status === "active") {
148
+ warnings.push("active capabilities should define rollback behavior");
149
+ }
150
+
151
+ // Tests and docs
152
+ if (!manifest.tests || !Array.isArray(manifest.tests) || manifest.tests.length === 0) {
153
+ warnings.push("capability should reference at least one test file");
154
+ }
155
+ if (!manifest.docs || !Array.isArray(manifest.docs) || manifest.docs.length === 0) {
156
+ warnings.push("capability should reference at least one doc file");
157
+ }
158
+
159
+ // Surfaces
160
+ if (manifest.surfaces && typeof manifest.surfaces === "object") {
161
+ // No additional validation needed — booleans
162
+ }
163
+
164
+ return { valid: errors.length === 0, errors, warnings };
165
+ }
166
+
167
+ /**
168
+ * Check a text string for unsafe public claim terms.
169
+ * Returns array of { term, matched } for each violation found.
170
+ */
171
+ function checkClaimSafety(text) {
172
+ if (!text || typeof text !== "string") return [];
173
+ const violations = [];
174
+ for (let i = 0; i < UNSAFE_CLAIM_TERMS.length; i++) {
175
+ if (UNSAFE_CLAIM_PATTERNS[i].test(text)) {
176
+ violations.push({ term: UNSAFE_CLAIM_TERMS[i], matched: true });
177
+ }
178
+ }
179
+ return violations;
180
+ }
181
+
182
+ /**
183
+ * Build a minimal manifest from known capability metadata.
184
+ */
185
+ function buildManifest(fields) {
186
+ return {
187
+ schemaVersion: SCHEMA_VERSION,
188
+ id: fields.id || "",
189
+ name: fields.name || "",
190
+ category: fields.category || "",
191
+ owner: fields.owner || "avorelo-core",
192
+ status: fields.status || "active",
193
+ riskTier: fields.riskTier || "low",
194
+ sideEffectLevel: fields.sideEffectLevel || "read_only",
195
+ triggers: fields.triggers || [],
196
+ antiTriggers: fields.antiTriggers || [],
197
+ inputSignals: fields.inputSignals || [],
198
+ allowedActions: fields.allowedActions || [],
199
+ forbiddenActions: fields.forbiddenActions || [],
200
+ policy: fields.policy || {
201
+ defaultDecision: "allow",
202
+ requiresApprovalWhen: [],
203
+ blocksWhen: [],
204
+ },
205
+ evidenceRequirements: fields.evidenceRequirements || {
206
+ minimumRefs: 0,
207
+ allowedRefTypes: ["report", "receipt", "test"],
208
+ rawDataAllowed: false,
209
+ },
210
+ outputContract: fields.outputContract || {
211
+ outcomeTypes: ["found", "needs_attention"],
212
+ reasonCodesRequired: true,
213
+ claimSafetyRequired: true,
214
+ },
215
+ budgets: fields.budgets || {
216
+ maxFilesScanned: 2200,
217
+ maxFileBytes: 262144,
218
+ maxContextRefs: 10,
219
+ maxRuntimeMs: 2000,
220
+ },
221
+ surfaces: fields.surfaces || {
222
+ productHome: true,
223
+ status: true,
224
+ dashboard: true,
225
+ nextRun: true,
226
+ teams: false,
227
+ },
228
+ tests: fields.tests || [],
229
+ docs: fields.docs || [],
230
+ dogfood: fields.dogfood || {
231
+ required: true,
232
+ artifactPath: "",
233
+ },
234
+ rollback: fields.rollback || {
235
+ disableFlag: "",
236
+ failBehavior: "fail_open_advisory",
237
+ },
238
+ };
239
+ }
240
+
241
+ module.exports = {
242
+ SCHEMA_VERSION,
243
+ VALID_STATUSES,
244
+ VALID_RISK_TIERS,
245
+ VALID_SIDE_EFFECT_LEVELS,
246
+ VALID_DECISIONS,
247
+ VALID_REF_TYPES,
248
+ VALID_OUTCOME_TYPES,
249
+ VALID_FAIL_BEHAVIORS,
250
+ UNSAFE_CLAIM_TERMS,
251
+ UNSAFE_CLAIM_PATTERNS,
252
+ validateManifest,
253
+ checkClaimSafety,
254
+ buildManifest,
255
+ };
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Capability Outcome Normalizer — avorelo.outcomeSurface.v1
5
+ *
6
+ * Maps capability outputs to the standard Found / Fixed / Saved-or-Proved / Needs Attention
7
+ * buckets. Enforces evidence/proof ref requirements. Downgrades unsupported claims.
8
+ */
9
+
10
+ const { checkClaimSafety } = require("./capability-manifest");
11
+
12
+ const VALID_BUCKETS = new Set(["found", "fixed", "saved_or_proved", "needs_attention"]);
13
+ const VALID_SEVERITIES = new Set(["low", "medium", "high"]);
14
+
15
+ /**
16
+ * Normalize a capability output into an outcome surface entry.
17
+ * @param {object} params
18
+ * @param {string} params.capabilityId
19
+ * @param {string} params.title
20
+ * @param {string} params.bucket - One of: found, fixed, saved_or_proved, needs_attention
21
+ * @param {string} params.oneLine - Compact summary
22
+ * @param {string[]} [params.proofRefs] - Evidence references
23
+ * @param {string} [params.nextAction] - Safe next action
24
+ * @param {string} [params.severity] - low, medium, high
25
+ * @param {object} [params.surfaces] - Which surfaces to show in
26
+ * @returns {{ normalized, warnings }}
27
+ */
28
+ function normalizeOutcome(params) {
29
+ const warnings = [];
30
+
31
+ let bucket = params.bucket;
32
+ if (!VALID_BUCKETS.has(bucket)) {
33
+ warnings.push(`unknown bucket "${bucket}", defaulting to "needs_attention"`);
34
+ bucket = "needs_attention";
35
+ }
36
+
37
+ let severity = params.severity || "low";
38
+ if (!VALID_SEVERITIES.has(severity)) {
39
+ warnings.push(`unknown severity "${severity}", defaulting to "low"`);
40
+ severity = "low";
41
+ }
42
+
43
+ const proofRefs = params.proofRefs || [];
44
+
45
+ // Downgrade saved_or_proved if no proof refs
46
+ if (bucket === "saved_or_proved" && proofRefs.length === 0) {
47
+ warnings.push("saved_or_proved claim downgraded to found: no proof refs provided");
48
+ bucket = "found";
49
+ }
50
+
51
+ // Claim safety on the oneLine text
52
+ const oneLine = params.oneLine || "";
53
+ const claimViolations = checkClaimSafety(oneLine);
54
+ if (claimViolations.length > 0) {
55
+ warnings.push(`unsafe claim terms detected in oneLine: ${claimViolations.map((v) => v.term).join(", ")}`);
56
+ bucket = "needs_attention";
57
+ }
58
+
59
+ const normalized = {
60
+ schemaVersion: "avorelo.outcomeSurface.v1",
61
+ capabilityId: params.capabilityId || "",
62
+ title: params.title || "",
63
+ bucket,
64
+ severity,
65
+ oneLine: oneLine,
66
+ proofRefs,
67
+ nextAction: params.nextAction || "",
68
+ showInProductHome: params.surfaces?.productHome !== false,
69
+ showInStatus: params.surfaces?.status !== false,
70
+ showInDashboard: params.surfaces?.dashboard !== false,
71
+ };
72
+
73
+ return { normalized, warnings };
74
+ }
75
+
76
+ /**
77
+ * Normalize multiple outcomes and return a compact summary.
78
+ */
79
+ function normalizeOutcomes(outcomes) {
80
+ const allWarnings = [];
81
+ const normalized = [];
82
+
83
+ for (const o of outcomes) {
84
+ const result = normalizeOutcome(o);
85
+ normalized.push(result.normalized);
86
+ allWarnings.push(...result.warnings);
87
+ }
88
+
89
+ const bucketCounts = {
90
+ found: normalized.filter((n) => n.bucket === "found").length,
91
+ fixed: normalized.filter((n) => n.bucket === "fixed").length,
92
+ saved_or_proved: normalized.filter((n) => n.bucket === "saved_or_proved").length,
93
+ needs_attention: normalized.filter((n) => n.bucket === "needs_attention").length,
94
+ };
95
+
96
+ return { normalized, bucketCounts, warnings: allWarnings };
97
+ }
98
+
99
+ module.exports = {
100
+ VALID_BUCKETS,
101
+ VALID_SEVERITIES,
102
+ normalizeOutcome,
103
+ normalizeOutcomes,
104
+ };