avorelo 0.1.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 (258) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/bin/avorelo +9 -0
  4. package/package.json +135 -0
  5. package/scripts/README.md +40 -0
  6. package/scripts/cco-dashboard.js +252 -0
  7. package/scripts/cco-status.js +430 -0
  8. package/scripts/lib/activation/account-state.js +37 -0
  9. package/scripts/lib/activation/activation-runner.js +546 -0
  10. package/scripts/lib/activation/activation-self-healing.js +480 -0
  11. package/scripts/lib/activation/activation-state.js +83 -0
  12. package/scripts/lib/activation/activation-summary.js +191 -0
  13. package/scripts/lib/activation/adapters/claude-code.js +77 -0
  14. package/scripts/lib/activation/adapters/codex-cli.js +52 -0
  15. package/scripts/lib/activation/adapters/cursor.js +37 -0
  16. package/scripts/lib/activation/adapters/github-agent.js +39 -0
  17. package/scripts/lib/activation/adapters/terminal.js +42 -0
  18. package/scripts/lib/activation/adapters/vscode.js +39 -0
  19. package/scripts/lib/activation/adapters/windsurf.js +37 -0
  20. package/scripts/lib/activation/ai-surface-detector.js +151 -0
  21. package/scripts/lib/activation/connect-account.js +145 -0
  22. package/scripts/lib/activation/detect-environment.js +75 -0
  23. package/scripts/lib/activation/detect-hosts.js +62 -0
  24. package/scripts/lib/activation/format-activation-output.js +109 -0
  25. package/scripts/lib/activation/next-action.js +43 -0
  26. package/scripts/lib/activation/repair-engine.js +219 -0
  27. package/scripts/lib/activation-distribution-readiness.js +507 -0
  28. package/scripts/lib/adapter-conformance.js +176 -0
  29. package/scripts/lib/adapter-readiness.js +417 -0
  30. package/scripts/lib/adapter-safety-boundaries.js +335 -0
  31. package/scripts/lib/adapter-technical-readiness-gate.js +205 -0
  32. package/scripts/lib/agent-access-governance.js +455 -0
  33. package/scripts/lib/agent-enforcement.js +765 -0
  34. package/scripts/lib/agent-policy-profile.js +210 -0
  35. package/scripts/lib/agent-security/action-evaluator.js +507 -0
  36. package/scripts/lib/agent-security/adapter-registry.js +98 -0
  37. package/scripts/lib/agent-security/auto-policy.js +139 -0
  38. package/scripts/lib/agent-security/bounded-scan.js +93 -0
  39. package/scripts/lib/agent-security/enforcement-adapter.js +174 -0
  40. package/scripts/lib/agent-security/enforcement-engine.js +1129 -0
  41. package/scripts/lib/agent-security/file-write-adapter.js +183 -0
  42. package/scripts/lib/agent-security/file-write-rules.js +178 -0
  43. package/scripts/lib/agent-security/index.js +3342 -0
  44. package/scripts/lib/agent-security/instruction-risk.js +181 -0
  45. package/scripts/lib/agent-security/mcp-action-adapter.js +185 -0
  46. package/scripts/lib/agent-security/mcp-action-rules.js +184 -0
  47. package/scripts/lib/agent-security/package-action-adapter.js +175 -0
  48. package/scripts/lib/agent-security/package-action-rules.js +233 -0
  49. package/scripts/lib/agent-security/performance.js +148 -0
  50. package/scripts/lib/agent-security/permission-minimizer.js +403 -0
  51. package/scripts/lib/agent-security/scan-cache.js +74 -0
  52. package/scripts/lib/agent-security/source-trust.js +146 -0
  53. package/scripts/lib/ai-install-prompt.js +288 -0
  54. package/scripts/lib/ai-workspace-hygiene.js +1499 -0
  55. package/scripts/lib/alpha-activation.js +520 -0
  56. package/scripts/lib/alpha-feedback.js +263 -0
  57. package/scripts/lib/alpha-readiness-gate.js +332 -0
  58. package/scripts/lib/anti-gaming.js +169 -0
  59. package/scripts/lib/artifact-health.js +431 -0
  60. package/scripts/lib/attribution.js +180 -0
  61. package/scripts/lib/audit.js +289 -0
  62. package/scripts/lib/avorelo-skill-registry.js +810 -0
  63. package/scripts/lib/batch-jobs.js +71 -0
  64. package/scripts/lib/brain-pack.js +578 -0
  65. package/scripts/lib/brand-boundary.js +424 -0
  66. package/scripts/lib/brand.js +74 -0
  67. package/scripts/lib/browser-capability.js +1048 -0
  68. package/scripts/lib/browser-proof-preflight.js +321 -0
  69. package/scripts/lib/cache-readiness.js +187 -0
  70. package/scripts/lib/canonical-reentry.js +162 -0
  71. package/scripts/lib/capability-packs.js +314 -0
  72. package/scripts/lib/capability-recommender.js +512 -0
  73. package/scripts/lib/capability-registry.js +1059 -0
  74. package/scripts/lib/carry-forward-surfacing.js +194 -0
  75. package/scripts/lib/ccusage-adapter.js +188 -0
  76. package/scripts/lib/company-loop.js +1149 -0
  77. package/scripts/lib/config.js +637 -0
  78. package/scripts/lib/context-acquisition-plan.js +287 -0
  79. package/scripts/lib/context-budget-guard.js +170 -0
  80. package/scripts/lib/context-budget-scanner.js +257 -0
  81. package/scripts/lib/context-optimizer.js +715 -0
  82. package/scripts/lib/context-reduction-plan.js +178 -0
  83. package/scripts/lib/context-safety.js +88 -0
  84. package/scripts/lib/context-savings-engine.js +158 -0
  85. package/scripts/lib/cost-evidence.js +254 -0
  86. package/scripts/lib/cross-host-install-plan.js +308 -0
  87. package/scripts/lib/cross-host-install-readiness.js +237 -0
  88. package/scripts/lib/cross-host-value-flow.js +268 -0
  89. package/scripts/lib/dashboard.js +900 -0
  90. package/scripts/lib/design-partner-feedback.js +346 -0
  91. package/scripts/lib/entitlements.js +100 -0
  92. package/scripts/lib/execution-packet.js +559 -0
  93. package/scripts/lib/experimentation-events.js +547 -0
  94. package/scripts/lib/external-capability-compliance.js +107 -0
  95. package/scripts/lib/external-user-simulation.js +166 -0
  96. package/scripts/lib/failure-recovery-readiness.js +81 -0
  97. package/scripts/lib/failure-recovery.js +419 -0
  98. package/scripts/lib/feedback-intelligence.js +537 -0
  99. package/scripts/lib/feedback-signals.js +205 -0
  100. package/scripts/lib/file-integrity.js +68 -0
  101. package/scripts/lib/fsx.js +127 -0
  102. package/scripts/lib/full-readiness-gate.js +451 -0
  103. package/scripts/lib/guidance-builder.js +174 -0
  104. package/scripts/lib/hook-apply.js +1019 -0
  105. package/scripts/lib/hook-baseline.js +310 -0
  106. package/scripts/lib/hook-config-preview.js +275 -0
  107. package/scripts/lib/hook-contracts.js +290 -0
  108. package/scripts/lib/hook-safety-boundary-readiness.js +80 -0
  109. package/scripts/lib/host-capability-matrix.js +351 -0
  110. package/scripts/lib/host-support-context.js +254 -0
  111. package/scripts/lib/http-hook-action.js +538 -0
  112. package/scripts/lib/install-ai-readiness.js +84 -0
  113. package/scripts/lib/install-intake-risk.js +1037 -0
  114. package/scripts/lib/install-journey-intelligence.js +329 -0
  115. package/scripts/lib/intervention-guidance.js +57 -0
  116. package/scripts/lib/known-limitations.js +115 -0
  117. package/scripts/lib/l8-path-truth.js +146 -0
  118. package/scripts/lib/launch-hardening-gate.js +436 -0
  119. package/scripts/lib/launch-readiness.js +628 -0
  120. package/scripts/lib/learning-memory.js +686 -0
  121. package/scripts/lib/lifecycle-hooks.js +802 -0
  122. package/scripts/lib/local-package-smoke.js +423 -0
  123. package/scripts/lib/local-pricing.js +299 -0
  124. package/scripts/lib/mcp-enforcement.js +311 -0
  125. package/scripts/lib/mcp-least-privilege-policy.js +303 -0
  126. package/scripts/lib/mcp-tool-inventory.js +388 -0
  127. package/scripts/lib/mcp-tool-risk.js +0 -0
  128. package/scripts/lib/memory.js +335 -0
  129. package/scripts/lib/metrics.js +699 -0
  130. package/scripts/lib/micro-proof.js +133 -0
  131. package/scripts/lib/next-run-context.js +436 -0
  132. package/scripts/lib/operating-value.js +1648 -0
  133. package/scripts/lib/optimization-v3.js +122 -0
  134. package/scripts/lib/orchestration/adapters/_shared.js +49 -0
  135. package/scripts/lib/orchestration/adapters/aider.js +18 -0
  136. package/scripts/lib/orchestration/adapters/claude-code.js +35 -0
  137. package/scripts/lib/orchestration/adapters/codex.js +35 -0
  138. package/scripts/lib/orchestration/adapters/gemini-cli.js +18 -0
  139. package/scripts/lib/orchestration/adapters/git.js +25 -0
  140. package/scripts/lib/orchestration/adapters/index.js +31 -0
  141. package/scripts/lib/orchestration/adapters/lm-studio.js +18 -0
  142. package/scripts/lib/orchestration/adapters/ollama.js +18 -0
  143. package/scripts/lib/orchestration/adapters/opencode.js +18 -0
  144. package/scripts/lib/orchestration/adapters/openrouter.js +18 -0
  145. package/scripts/lib/orchestration/adapters/test-runner.js +25 -0
  146. package/scripts/lib/orchestration/cli.js +438 -0
  147. package/scripts/lib/orchestration/execution-manager.js +279 -0
  148. package/scripts/lib/orchestration/handoff.js +314 -0
  149. package/scripts/lib/orchestration/index.js +456 -0
  150. package/scripts/lib/orchestration/inventory.js +47 -0
  151. package/scripts/lib/orchestration/model-discovery.js +498 -0
  152. package/scripts/lib/orchestration/model-profiler.js +170 -0
  153. package/scripts/lib/orchestration/model-profiles.js +252 -0
  154. package/scripts/lib/orchestration/model-refresh-policy.js +72 -0
  155. package/scripts/lib/orchestration/proof-writer.js +349 -0
  156. package/scripts/lib/orchestration/provider-discovery/aider.js +49 -0
  157. package/scripts/lib/orchestration/provider-discovery/claude-code.js +56 -0
  158. package/scripts/lib/orchestration/provider-discovery/codex.js +49 -0
  159. package/scripts/lib/orchestration/provider-discovery/common.js +186 -0
  160. package/scripts/lib/orchestration/provider-discovery/gemini.js +106 -0
  161. package/scripts/lib/orchestration/provider-discovery/lm-studio.js +118 -0
  162. package/scripts/lib/orchestration/provider-discovery/models-dev.js +12 -0
  163. package/scripts/lib/orchestration/provider-discovery/ollama.js +100 -0
  164. package/scripts/lib/orchestration/provider-discovery/opencode.js +47 -0
  165. package/scripts/lib/orchestration/provider-discovery/openrouter.js +44 -0
  166. package/scripts/lib/orchestration/risk-classifier.js +130 -0
  167. package/scripts/lib/orchestration/routing-policy.js +486 -0
  168. package/scripts/lib/orchestration/settings.js +112 -0
  169. package/scripts/lib/orchestration/state.js +165 -0
  170. package/scripts/lib/orchestration/verification-manager.js +138 -0
  171. package/scripts/lib/output-profiles.js +146 -0
  172. package/scripts/lib/package-content-audit.js +368 -0
  173. package/scripts/lib/package-runtime.js +278 -0
  174. package/scripts/lib/plan-surface.js +53 -0
  175. package/scripts/lib/plans.js +2318 -0
  176. package/scripts/lib/policy-provider.js +27 -0
  177. package/scripts/lib/prelaunch-activation-readiness.js +409 -0
  178. package/scripts/lib/prelaunch-evidence-store.js +816 -0
  179. package/scripts/lib/prelaunch-intelligence.js +869 -0
  180. package/scripts/lib/pricing-experiment.js +118 -0
  181. package/scripts/lib/pro-moment-events.js +77 -0
  182. package/scripts/lib/pro-moment-state.js +227 -0
  183. package/scripts/lib/pro-moments.js +1216 -0
  184. package/scripts/lib/product-learning-events.js +629 -0
  185. package/scripts/lib/project-profile.js +555 -0
  186. package/scripts/lib/prompt-compiler.js +280 -0
  187. package/scripts/lib/prompt-lint.js +32 -0
  188. package/scripts/lib/prompt-suggestions.js +52 -0
  189. package/scripts/lib/proof-canonical.js +398 -0
  190. package/scripts/lib/proof-drilldown.js +383 -0
  191. package/scripts/lib/proof-events.js +342 -0
  192. package/scripts/lib/proof-history.js +243 -0
  193. package/scripts/lib/proof-metrics.js +296 -0
  194. package/scripts/lib/proof-outcome-evidence.js +134 -0
  195. package/scripts/lib/proof-receipt.js +335 -0
  196. package/scripts/lib/proof-record.js +461 -0
  197. package/scripts/lib/public-activation-distribution-gate.js +258 -0
  198. package/scripts/lib/public-cli.js +3891 -0
  199. package/scripts/lib/public-distribution-truth.js +211 -0
  200. package/scripts/lib/public-install-claim-checker.js +294 -0
  201. package/scripts/lib/publish-provenance-readiness.js +283 -0
  202. package/scripts/lib/readiness-delta.js +218 -0
  203. package/scripts/lib/readiness-evidence-closure.js +196 -0
  204. package/scripts/lib/reentry-memory-capture.js +241 -0
  205. package/scripts/lib/reentry-memory-retrieval.js +302 -0
  206. package/scripts/lib/reentry-memory-status.js +146 -0
  207. package/scripts/lib/reentry-memory-store.js +178 -0
  208. package/scripts/lib/reentry-state.js +66 -0
  209. package/scripts/lib/release-candidate-bundle.js +166 -0
  210. package/scripts/lib/remediation.js +81 -0
  211. package/scripts/lib/repo-map.js +391 -0
  212. package/scripts/lib/run-improvements-lifecycle.js +330 -0
  213. package/scripts/lib/run-improvements.js +789 -0
  214. package/scripts/lib/runtime-decision-policy.js +387 -0
  215. package/scripts/lib/safe-path-engine.js +705 -0
  216. package/scripts/lib/safe-run-controller.js +887 -0
  217. package/scripts/lib/score.js +262 -0
  218. package/scripts/lib/seamless-enforcement.js +329 -0
  219. package/scripts/lib/seamless-outcome.js +689 -0
  220. package/scripts/lib/seamless-reality-gate.js +5043 -0
  221. package/scripts/lib/security-risk-classifier.js +511 -0
  222. package/scripts/lib/security-scan.js +384 -0
  223. package/scripts/lib/session-context-optimizer.js +1211 -0
  224. package/scripts/lib/session-timing.js +315 -0
  225. package/scripts/lib/skill-hygiene.js +805 -0
  226. package/scripts/lib/skill-packs.js +161 -0
  227. package/scripts/lib/skills-operating-layer.js +580 -0
  228. package/scripts/lib/smart-work-routing.js +768 -0
  229. package/scripts/lib/source-catalog.js +700 -0
  230. package/scripts/lib/status-value-summary.js +32 -0
  231. package/scripts/lib/support-bundle.js +578 -0
  232. package/scripts/lib/task-continuation.js +440 -0
  233. package/scripts/lib/test-helpers.js +15 -0
  234. package/scripts/lib/tier.js +38 -0
  235. package/scripts/lib/token-context-quality-gate.js +370 -0
  236. package/scripts/lib/token-cost-capture.js +187 -0
  237. package/scripts/lib/token-cost-intelligence.js +358 -0
  238. package/scripts/lib/token-efficiency-evidence.js +213 -0
  239. package/scripts/lib/token-evidence.js +699 -0
  240. package/scripts/lib/tokenish.js +17 -0
  241. package/scripts/lib/tool-output-sandbox.js +304 -0
  242. package/scripts/lib/trust-audit.js +136 -0
  243. package/scripts/lib/unified-events.js +396 -0
  244. package/scripts/lib/upgrade-interruption-recovery.js +407 -0
  245. package/scripts/lib/usage-ledger.js +201 -0
  246. package/scripts/lib/value-ledger.js +130 -0
  247. package/scripts/lib/value-proof-calibration.js +531 -0
  248. package/scripts/lib/visual-qa.js +231 -0
  249. package/scripts/lib/voice-alpha.js +29 -0
  250. package/scripts/lib/work-aware-orchestration.js +976 -0
  251. package/scripts/lib/work-control-receipts.js +577 -0
  252. package/scripts/lib/work-ledger.js +1123 -0
  253. package/scripts/lib/work-panel-preview.js +352 -0
  254. package/scripts/lib/workflow-discipline.js +280 -0
  255. package/scripts/lib/workflow-signals.js +419 -0
  256. package/scripts/lib/workspace-map.js +281 -0
  257. package/scripts/lib/workspace-registry.js +1367 -0
  258. package/scripts/lib/workspace-resolver.js +480 -0
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+
3
+ // Run Improvements Lifecycle — manages the consumption and application receipt
4
+ // for next-run defaults prepared by run-improvements.js.
5
+ // Receipt schema: avorelo.runImprovementsReceipt.v1
6
+ //
7
+ // Lifecycle states:
8
+ // prepared Improvements generated, ready
9
+ // consumed A supported surface explicitly read the prepared defaults
10
+ // applied Defaults made available to a next run; receipt exists
11
+ // expired TTL exceeded on source artifact
12
+ // stale Source fingerprint no longer matches current artifact
13
+ // insufficient_evidence Not enough evidence to generate reliable defaults
14
+ // skipped Explicitly skipped
15
+ // error Unexpected error
16
+
17
+ const fs = require("fs");
18
+ const path = require("path");
19
+
20
+ const RECEIPT_REL = ".claude/cco/state/run-improvements-receipt.json";
21
+ const SCHEMA_VERSION = "avorelo.runImprovementsReceipt.v1";
22
+
23
+ const LIFECYCLE_STATES = [
24
+ "prepared",
25
+ "consumed",
26
+ "applied",
27
+ "expired",
28
+ "stale",
29
+ "insufficient_evidence",
30
+ "skipped",
31
+ "error",
32
+ ];
33
+
34
+ function nowIso() {
35
+ return new Date().toISOString();
36
+ }
37
+
38
+ function loadLifecycleReceipt(cwd) {
39
+ try {
40
+ const absPath = path.join(cwd, RECEIPT_REL);
41
+ const raw = JSON.parse(fs.readFileSync(absPath, "utf8"));
42
+ if (raw.schemaVersion !== SCHEMA_VERSION) return null;
43
+ return raw;
44
+ } catch {
45
+ return null;
46
+ }
47
+ }
48
+
49
+ function writeLifecycleReceipt(cwd, receipt) {
50
+ const absPath = path.join(cwd, RECEIPT_REL);
51
+ fs.mkdirSync(path.dirname(absPath), { recursive: true });
52
+ fs.writeFileSync(absPath, JSON.stringify(receipt, null, 2), "utf8");
53
+ return receipt;
54
+ }
55
+
56
+ function buildLifecycleReceipt(artifact, options = {}) {
57
+ const now = nowIso();
58
+ return {
59
+ schemaVersion: SCHEMA_VERSION,
60
+ generatedAt: now,
61
+ sourceRunFingerprint: artifact.sourceRunFingerprint,
62
+ runImprovementsArtifactId: artifact.sourceRunFingerprint,
63
+ lifecycleState: options.lifecycleState || "prepared",
64
+ surface: options.surface || null,
65
+ consumedAt: options.consumedAt || null,
66
+ appliedAt: options.appliedAt || null,
67
+ reasonCodes: options.reasonCodes || artifact.reasonCodes || [],
68
+ redactionStatus: "redacted",
69
+ limitations: options.limitations || artifact.limitations || [],
70
+ };
71
+ }
72
+
73
+ // Check if existing receipt is stale (source fingerprint no longer matches current artifact).
74
+ function checkLifecycleStale(cwd) {
75
+ const receipt = loadLifecycleReceipt(cwd);
76
+ if (!receipt) return { stale: false, reason: "no_receipt" };
77
+
78
+ try {
79
+ const { loadRunImprovements } = require("./run-improvements");
80
+ const artifact = loadRunImprovements(cwd);
81
+ if (!artifact) return { stale: false, reason: "no_artifact" };
82
+ if (receipt.sourceRunFingerprint !== artifact.sourceRunFingerprint) {
83
+ return { stale: true, reason: "fingerprint_mismatch" };
84
+ }
85
+ return { stale: false, reason: "ok" };
86
+ } catch {
87
+ return { stale: false, reason: "check_error" };
88
+ }
89
+ }
90
+
91
+ // Mark as consumed — a supported surface explicitly read the prepared defaults.
92
+ // Idempotent: same fingerprint already consumed or applied → return existing receipt.
93
+ function consumeRunImprovements(cwd, surface) {
94
+ try {
95
+ const { loadRunImprovements } = require("./run-improvements");
96
+ const artifact = loadRunImprovements(cwd);
97
+ if (!artifact || artifact.status === "not_available" || artifact.status === "expired") {
98
+ return null;
99
+ }
100
+
101
+ const existing = loadLifecycleReceipt(cwd);
102
+ if (
103
+ existing &&
104
+ existing.sourceRunFingerprint === artifact.sourceRunFingerprint &&
105
+ (existing.lifecycleState === "consumed" || existing.lifecycleState === "applied")
106
+ ) {
107
+ return existing;
108
+ }
109
+
110
+ const now = nowIso();
111
+ const receipt = buildLifecycleReceipt(artifact, {
112
+ lifecycleState: "consumed",
113
+ surface: surface || "cli",
114
+ consumedAt: now,
115
+ appliedAt: null,
116
+ });
117
+
118
+ writeLifecycleReceipt(cwd, receipt);
119
+ _emitLifecycleAuditEvent(cwd, artifact, receipt, "run_improvements.consumed");
120
+ return receipt;
121
+ } catch {
122
+ return null;
123
+ }
124
+ }
125
+
126
+ // Mark as applied — defaults were made available to a next AI coding run
127
+ // through a supported surface and an application receipt exists.
128
+ // This is the only honest way to set applied=true on the main artifact.
129
+ function applyRunImprovements(cwd, surface) {
130
+ try {
131
+ const { loadRunImprovements, RUN_IMPROVEMENTS_REL, SCHEMA_VERSION: RI_SCHEMA } = require("./run-improvements");
132
+ const artifact = loadRunImprovements(cwd);
133
+ if (!artifact || artifact.status === "not_available" || artifact.status === "expired") {
134
+ return { success: false, reason: "no_valid_artifact" };
135
+ }
136
+
137
+ const existing = loadLifecycleReceipt(cwd);
138
+ if (
139
+ existing &&
140
+ existing.sourceRunFingerprint === artifact.sourceRunFingerprint &&
141
+ existing.lifecycleState === "applied"
142
+ ) {
143
+ return { success: true, receipt: existing, reason: "already_applied" };
144
+ }
145
+
146
+ const now = nowIso();
147
+ const receipt = buildLifecycleReceipt(artifact, {
148
+ lifecycleState: "applied",
149
+ surface: surface || "cli",
150
+ consumedAt: existing?.consumedAt || now,
151
+ appliedAt: now,
152
+ });
153
+
154
+ writeLifecycleReceipt(cwd, receipt);
155
+ _emitLifecycleAuditEvent(cwd, artifact, receipt, "run_improvements.applied");
156
+
157
+ // Update the main artifact to reflect applied state (only when fingerprint matches)
158
+ try {
159
+ const absPath = path.join(cwd, RUN_IMPROVEMENTS_REL);
160
+ if (fs.existsSync(absPath)) {
161
+ const stored = JSON.parse(fs.readFileSync(absPath, "utf8"));
162
+ if (
163
+ stored.schemaVersion === RI_SCHEMA &&
164
+ stored.sourceRunFingerprint === artifact.sourceRunFingerprint
165
+ ) {
166
+ stored.status = "applied";
167
+ stored.applied = true;
168
+ stored.appliedAt = now;
169
+ fs.writeFileSync(absPath, JSON.stringify(stored, null, 2), "utf8");
170
+ }
171
+ }
172
+ } catch {}
173
+
174
+ return { success: true, receipt, reason: "applied" };
175
+ } catch (err) {
176
+ return { success: false, reason: "error", error: String(err.message) };
177
+ }
178
+ }
179
+
180
+ function _emitLifecycleAuditEvent(cwd, artifact, receipt, eventName) {
181
+ try {
182
+ const eventsPath = path.join(cwd, ".claude/cco/events/outcome-events.jsonl");
183
+ fs.mkdirSync(path.dirname(eventsPath), { recursive: true });
184
+ const safeEventName = eventName.replace(/\./g, "_");
185
+ const event = JSON.stringify({
186
+ event_id: `run_lc_${safeEventName}_${artifact.sourceRunFingerprint}`,
187
+ session_id: "avorelo-run-improvements",
188
+ timestamp: nowIso(),
189
+ category: "run_improvements",
190
+ event_name: safeEventName,
191
+ reason_code: "RUN_IMPROVEMENTS_LIFECYCLE",
192
+ confidence_score: 1.0,
193
+ platform: "avorelo",
194
+ metadata: {
195
+ schemaVersion: SCHEMA_VERSION,
196
+ lifecycleState: receipt.lifecycleState,
197
+ surface: receipt.surface,
198
+ sourceRunFingerprint: artifact.sourceRunFingerprint,
199
+ improvementCount: (artifact.topImprovements || []).length,
200
+ topCategories: [
201
+ ...new Set((artifact.topImprovements || []).map((i) => i.category)),
202
+ ].slice(0, 3),
203
+ redacted: true,
204
+ },
205
+ });
206
+ fs.appendFileSync(eventsPath, event + "\n", "utf8");
207
+ } catch {}
208
+ }
209
+
210
+ // Inject next-run context: generates the bounded next-run-context artifact,
211
+ // marks consumed (defaults read) and applied (artifact written + receipt exists).
212
+ // This is the real application path — `applied` requires this function to succeed.
213
+ // Surface: "next_run_context" — never "cli" or generic display.
214
+ function injectNextRunContext(cwd, options = {}) {
215
+ try {
216
+ const { loadRunImprovements, RUN_IMPROVEMENTS_REL, SCHEMA_VERSION: RI_SCHEMA } = require("./run-improvements");
217
+ const artifact = loadRunImprovements(cwd);
218
+ if (!artifact || artifact.status === "not_available" || artifact.status === "expired") {
219
+ return { success: false, reason: "no_valid_artifact", nextRunContextArtifact: null, receipt: null };
220
+ }
221
+
222
+ // Idempotency: same fingerprint already applied through next_run_context → return existing
223
+ const existing = loadLifecycleReceipt(cwd);
224
+ if (
225
+ existing &&
226
+ existing.sourceRunFingerprint === artifact.sourceRunFingerprint &&
227
+ existing.lifecycleState === "applied" &&
228
+ existing.surface === "next_run_context"
229
+ ) {
230
+ const { loadNextRunContext } = require("./next-run-context");
231
+ return {
232
+ success: true,
233
+ receipt: existing,
234
+ nextRunContextArtifact: loadNextRunContext(cwd),
235
+ reason: "already_applied",
236
+ };
237
+ }
238
+
239
+ // Step 1: generate the next-run context artifact (this "consumes" the defaults)
240
+ const { generateNextRunContextArtifact, emitNextRunContextEvent } = require("./next-run-context");
241
+ const { artifact: nrcArtifact, written } = generateNextRunContextArtifact(cwd, { force: options.force || false });
242
+
243
+ if (!nrcArtifact || nrcArtifact.status === "not_available" || nrcArtifact.status === "error") {
244
+ return {
245
+ success: false,
246
+ reason: "next_run_context_generation_failed",
247
+ nextRunContextArtifact: nrcArtifact,
248
+ receipt: null,
249
+ };
250
+ }
251
+
252
+ const now = nowIso();
253
+
254
+ // Step 2: consumed receipt — defaults were read and embedded into context artifact
255
+ const consumedReceipt = buildLifecycleReceipt(artifact, {
256
+ lifecycleState: "consumed",
257
+ surface: "next_run_context",
258
+ consumedAt: now,
259
+ appliedAt: null,
260
+ });
261
+ writeLifecycleReceipt(cwd, consumedReceipt);
262
+ _emitLifecycleAuditEvent(cwd, artifact, consumedReceipt, "run_improvements.consumed");
263
+
264
+ // Step 3: applied receipt — next-run-context artifact written and points to defaults
265
+ const appliedReceipt = buildLifecycleReceipt(artifact, {
266
+ lifecycleState: "applied",
267
+ surface: "next_run_context",
268
+ consumedAt: now,
269
+ appliedAt: now,
270
+ limitations: [
271
+ "Applied via next-run-context artifact injection.",
272
+ "Injected status requires session-start hook to read the artifact.",
273
+ ...(nrcArtifact.limitations || []).slice(0, 2),
274
+ ],
275
+ });
276
+ writeLifecycleReceipt(cwd, appliedReceipt);
277
+ _emitLifecycleAuditEvent(cwd, artifact, appliedReceipt, "run_improvements.applied");
278
+
279
+ // Step 4: update main run-improvements artifact to reflect applied state
280
+ try {
281
+ const absPath = path.join(cwd, RUN_IMPROVEMENTS_REL);
282
+ if (fs.existsSync(absPath)) {
283
+ const stored = JSON.parse(fs.readFileSync(absPath, "utf8"));
284
+ if (
285
+ stored.schemaVersion === RI_SCHEMA &&
286
+ stored.sourceRunFingerprint === artifact.sourceRunFingerprint
287
+ ) {
288
+ stored.status = "applied";
289
+ stored.applied = true;
290
+ stored.appliedAt = now;
291
+ fs.writeFileSync(absPath, JSON.stringify(stored, null, 2), "utf8");
292
+ }
293
+ }
294
+ } catch {}
295
+
296
+ // Step 5: mark next-run-context artifact as applied (now has lifecycle backing)
297
+ try {
298
+ const { updateNextRunContextStatus } = require("./next-run-context");
299
+ updateNextRunContextStatus(cwd, "applied");
300
+ emitNextRunContextEvent(cwd, { ...nrcArtifact, status: "applied" }, "next_run_context.applied");
301
+ } catch {}
302
+
303
+ return {
304
+ success: true,
305
+ receipt: appliedReceipt,
306
+ nextRunContextArtifact: { ...nrcArtifact, status: "applied" },
307
+ reason: written ? "injected" : "idempotent_existing",
308
+ defaultsCount: (nrcArtifact.appliedDefaults || []).length,
309
+ decisionsCount: nrcArtifact.activeDecisionCount || 0,
310
+ risksCount: nrcArtifact.activeRiskCount || 0,
311
+ surface: "next_run_context",
312
+ artifactPath: ".claude/cco/state/next-run-context.json",
313
+ };
314
+ } catch (err) {
315
+ return { success: false, reason: "error", error: String(err.message), nextRunContextArtifact: null, receipt: null };
316
+ }
317
+ }
318
+
319
+ module.exports = {
320
+ SCHEMA_VERSION,
321
+ LIFECYCLE_STATES,
322
+ RECEIPT_REL,
323
+ loadLifecycleReceipt,
324
+ writeLifecycleReceipt,
325
+ buildLifecycleReceipt,
326
+ consumeRunImprovements,
327
+ applyRunImprovements,
328
+ injectNextRunContext,
329
+ checkLifecycleStale,
330
+ };