@deftai/directive-core 0.104.0 → 0.106.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 (287) hide show
  1. package/dist/authz/classify.js +1108 -67
  2. package/dist/check/cached-orchestrator.d.ts +1 -1
  3. package/dist/check/cached-orchestrator.js +2 -2
  4. package/dist/check/named-cause.d.ts +1 -1
  5. package/dist/check/named-cause.js +34 -4
  6. package/dist/codebase/default-extractor.d.ts +5 -0
  7. package/dist/codebase/default-extractor.js +7 -15
  8. package/dist/deposit/copy-tree.js +60 -0
  9. package/dist/deposit/python-free.js +26 -18
  10. package/dist/doctor/checks.d.ts +8 -0
  11. package/dist/doctor/checks.js +37 -25
  12. package/dist/doctor/doctor-state.d.ts +4 -0
  13. package/dist/doctor/doctor-state.js +7 -1
  14. package/dist/doctor/main.js +9 -19
  15. package/dist/doctor/types.d.ts +9 -0
  16. package/dist/forward-coverage/diff-coverage.d.ts +39 -0
  17. package/dist/forward-coverage/diff-coverage.js +112 -0
  18. package/dist/forward-coverage/diff-lines.d.ts +19 -0
  19. package/dist/forward-coverage/diff-lines.js +173 -0
  20. package/dist/forward-coverage/evaluate.d.ts +24 -9
  21. package/dist/forward-coverage/evaluate.js +125 -19
  22. package/dist/fs/contained-write.d.ts +115 -1
  23. package/dist/fs/contained-write.js +241 -5
  24. package/dist/fs/mutation-ledger.d.ts +54 -0
  25. package/dist/fs/mutation-ledger.js +133 -0
  26. package/dist/fs/non-product-dirs.d.ts +79 -0
  27. package/dist/fs/non-product-dirs.js +96 -0
  28. package/dist/hooks/dispatcher.d.ts +3 -1
  29. package/dist/hooks/dispatcher.js +14 -0
  30. package/dist/index.d.ts +1 -0
  31. package/dist/index.js +2 -0
  32. package/dist/init-deposit/agent-hooks.d.ts +1 -1
  33. package/dist/init-deposit/agent-hooks.js +18 -16
  34. package/dist/init-deposit/core-guard-pin-content.d.ts +7 -0
  35. package/dist/init-deposit/core-guard-pin-content.js +393 -0
  36. package/dist/init-deposit/gitignore.js +9 -0
  37. package/dist/init-deposit/hygiene.d.ts +47 -11
  38. package/dist/init-deposit/hygiene.js +172 -37
  39. package/dist/init-deposit/legacy-detect.js +6 -2
  40. package/dist/init-deposit/refresh.d.ts +21 -1
  41. package/dist/init-deposit/refresh.js +106 -9
  42. package/dist/init-deposit/scaffold.js +28 -279
  43. package/dist/init-deposit/slash-deposit.js +13 -7
  44. package/dist/init-deposit/xbrief-projections.d.ts +8 -1
  45. package/dist/init-deposit/xbrief-projections.js +24 -11
  46. package/dist/intake/clause-derivation.d.ts +47 -1
  47. package/dist/intake/clause-derivation.js +238 -9
  48. package/dist/intake/issue-ingest.d.ts +3 -1
  49. package/dist/intake/issue-ingest.js +35 -6
  50. package/dist/lifecycle/completed-tracked-on-delivery.d.ts +5 -0
  51. package/dist/lifecycle/completed-tracked-on-delivery.js +85 -18
  52. package/dist/lifecycle-visible/evaluate.d.ts +98 -0
  53. package/dist/lifecycle-visible/evaluate.js +710 -0
  54. package/dist/lifecycle-visible/index.d.ts +2 -0
  55. package/dist/lifecycle-visible/index.js +2 -0
  56. package/dist/literal-acceptance/capture.d.ts +10 -0
  57. package/dist/literal-acceptance/capture.js +226 -77
  58. package/dist/literal-acceptance/evaluate.d.ts +29 -4
  59. package/dist/literal-acceptance/evaluate.js +70 -2
  60. package/dist/literal-acceptance/index.d.ts +3 -3
  61. package/dist/literal-acceptance/index.js +3 -3
  62. package/dist/literal-acceptance/safety.d.ts +41 -0
  63. package/dist/literal-acceptance/safety.js +126 -2
  64. package/dist/literal-acceptance/types.d.ts +8 -0
  65. package/dist/orchestration/judgment-policy.d.ts +13 -0
  66. package/dist/orchestration/judgment-policy.js +15 -0
  67. package/dist/orchestration/probe-session.js +13 -8
  68. package/dist/orchestration/verify-judgment-gates.d.ts +4 -0
  69. package/dist/orchestration/verify-judgment-gates.js +43 -11
  70. package/dist/orphan-active/evaluate.d.ts +7 -1
  71. package/dist/orphan-active/evaluate.js +102 -23
  72. package/dist/platform/platform-capabilities.js +2 -3
  73. package/dist/policy/base-branch.d.ts +37 -0
  74. package/dist/policy/base-branch.js +114 -0
  75. package/dist/policy/branch-sync.d.ts +80 -0
  76. package/dist/policy/branch-sync.js +211 -0
  77. package/dist/policy/ceremony-dial-escalation.js +1 -0
  78. package/dist/policy/ceremony-dial.js +11 -21
  79. package/dist/policy/delivery-branch.d.ts +5 -3
  80. package/dist/policy/delivery-branch.js +7 -3
  81. package/dist/policy/file-size-thresholds.d.ts +24 -0
  82. package/dist/policy/file-size-thresholds.js +23 -0
  83. package/dist/policy/forge-outage-retry.d.ts +47 -0
  84. package/dist/policy/forge-outage-retry.js +157 -0
  85. package/dist/policy/host-hooks.d.ts +20 -0
  86. package/dist/policy/host-hooks.js +121 -2
  87. package/dist/policy/index.d.ts +7 -0
  88. package/dist/policy/index.js +66 -7
  89. package/dist/policy/org-force-on-migration.js +2 -1
  90. package/dist/policy/plan-extensions.d.ts +1 -1
  91. package/dist/policy/plan-extensions.js +2 -0
  92. package/dist/policy/product-signal.js +6 -7
  93. package/dist/policy/project-invariants.d.ts +50 -0
  94. package/dist/policy/project-invariants.js +205 -0
  95. package/dist/policy/require-human-merge.js +8 -6
  96. package/dist/policy/resolve.d.ts +7 -2
  97. package/dist/policy/resolve.js +25 -8
  98. package/dist/policy/sync-default.d.ts +129 -0
  99. package/dist/policy/sync-default.js +452 -0
  100. package/dist/policy/sync-max-files.d.ts +93 -0
  101. package/dist/policy/sync-max-files.js +192 -0
  102. package/dist/policy/value-feedback.js +7 -8
  103. package/dist/pr-monitor/absent-required.d.ts +11 -0
  104. package/dist/pr-monitor/absent-required.js +61 -0
  105. package/dist/pr-monitor/constants.d.ts +7 -0
  106. package/dist/pr-monitor/constants.js +7 -0
  107. package/dist/pr-monitor/index.d.ts +2 -1
  108. package/dist/pr-monitor/index.js +2 -1
  109. package/dist/pr-monitor/main.js +4 -0
  110. package/dist/pr-monitor/monitor.js +24 -1
  111. package/dist/pr-wait-mergeable/classify.js +6 -0
  112. package/dist/preflight/evaluate.d.ts +4 -0
  113. package/dist/preflight/evaluate.js +35 -1
  114. package/dist/preflight/index.d.ts +4 -0
  115. package/dist/preflight/index.js +2 -0
  116. package/dist/preflight/intended-placement.d.ts +62 -0
  117. package/dist/preflight/intended-placement.js +275 -0
  118. package/dist/preflight/project-invariants-gate.d.ts +29 -0
  119. package/dist/preflight/project-invariants-gate.js +82 -0
  120. package/dist/preflight-cache/evaluate.d.ts +12 -0
  121. package/dist/preflight-cache/evaluate.js +15 -1
  122. package/dist/preflight-cache/index.d.ts +1 -1
  123. package/dist/preflight-cache/index.js +1 -1
  124. package/dist/product-first-done-gate/acceptance-resolver.d.ts +128 -0
  125. package/dist/product-first-done-gate/acceptance-resolver.js +144 -0
  126. package/dist/product-first-done-gate/acceptance.d.ts +7 -4
  127. package/dist/product-first-done-gate/acceptance.js +79 -8
  128. package/dist/product-first-done-gate/empty-resolution.d.ts +4 -1
  129. package/dist/product-first-done-gate/empty-resolution.js +12 -1
  130. package/dist/product-first-done-gate/evaluate.d.ts +16 -0
  131. package/dist/product-first-done-gate/evaluate.js +298 -34
  132. package/dist/product-first-done-gate/index.d.ts +2 -0
  133. package/dist/product-first-done-gate/index.js +1 -0
  134. package/dist/release/build-dist.d.ts +101 -0
  135. package/dist/release/build-dist.js +428 -46
  136. package/dist/release/closed-verb-gate.d.ts +12 -0
  137. package/dist/release/closed-verb-gate.js +51 -0
  138. package/dist/release/index.d.ts +1 -0
  139. package/dist/release/index.js +1 -0
  140. package/dist/release/pipeline.js +7 -0
  141. package/dist/release/types.d.ts +12 -0
  142. package/dist/render/constants.d.ts +2 -1
  143. package/dist/render/constants.js +2 -1
  144. package/dist/render/framework-commands.js +4 -0
  145. package/dist/render/spec-validate.js +23 -12
  146. package/dist/run-summary/emit.d.ts +16 -10
  147. package/dist/run-summary/emit.js +26 -15
  148. package/dist/run-summary/index.d.ts +3 -2
  149. package/dist/run-summary/index.js +2 -1
  150. package/dist/run-summary/session-id.d.ts +21 -0
  151. package/dist/run-summary/session-id.js +92 -0
  152. package/dist/run-summary/types.d.ts +33 -4
  153. package/dist/run-summary/types.js +1 -0
  154. package/dist/scope/acceptance-evidence.d.ts +19 -7
  155. package/dist/scope/acceptance-evidence.js +38 -11
  156. package/dist/scope/delivery-evidence.d.ts +3 -3
  157. package/dist/scope/delivery-evidence.js +22 -27
  158. package/dist/scope/index.d.ts +1 -0
  159. package/dist/scope/index.js +1 -0
  160. package/dist/scope/main.js +15 -5
  161. package/dist/scope/parent-lineage.js +7 -6
  162. package/dist/scope/project-invariant-coverage.d.ts +54 -0
  163. package/dist/scope/project-invariant-coverage.js +322 -0
  164. package/dist/scope/promote-from-issue.js +5 -5
  165. package/dist/scope/transition.js +1 -1
  166. package/dist/scope-provenance/compare-intent.d.ts +27 -0
  167. package/dist/scope-provenance/compare-intent.js +233 -0
  168. package/dist/scope-provenance/digest.d.ts +18 -1
  169. package/dist/scope-provenance/digest.js +16 -11
  170. package/dist/scope-provenance/evaluate.d.ts +5 -1
  171. package/dist/scope-provenance/evaluate.js +67 -7
  172. package/dist/scope-provenance/extract-intent.d.ts +43 -0
  173. package/dist/scope-provenance/extract-intent.js +262 -0
  174. package/dist/scope-provenance/index.d.ts +7 -1
  175. package/dist/scope-provenance/index.js +7 -1
  176. package/dist/scope-provenance/intent-digest.d.ts +12 -0
  177. package/dist/scope-provenance/intent-digest.js +33 -0
  178. package/dist/scope-provenance/intent-evaluate.d.ts +43 -0
  179. package/dist/scope-provenance/intent-evaluate.js +149 -0
  180. package/dist/scope-provenance/json-tokenizer.d.ts +19 -0
  181. package/dist/scope-provenance/json-tokenizer.js +225 -0
  182. package/dist/scope-provenance/known-machine.d.ts +38 -0
  183. package/dist/scope-provenance/known-machine.js +157 -0
  184. package/dist/scope-provenance/mint-artifacts.d.ts +102 -0
  185. package/dist/scope-provenance/mint-artifacts.js +425 -0
  186. package/dist/session/ac-pass-banking.d.ts +9 -36
  187. package/dist/session/ac-pass-banking.js +33 -79
  188. package/dist/session/ac-pass-reuse.d.ts +53 -0
  189. package/dist/session/ac-pass-reuse.js +95 -0
  190. package/dist/session/git.js +19 -4
  191. package/dist/session/index.d.ts +4 -0
  192. package/dist/session/index.js +4 -0
  193. package/dist/session/occupancy-stress-worker.d.ts +7 -0
  194. package/dist/session/occupancy-stress-worker.js +36 -0
  195. package/dist/session/occupancy.d.ts +97 -0
  196. package/dist/session/occupancy.js +422 -0
  197. package/dist/session/openclaw-soft-rebind-deposit.js +6 -6
  198. package/dist/session/process-cost.d.ts +32 -10
  199. package/dist/session/process-cost.js +189 -1
  200. package/dist/session/product-state-hash.d.ts +26 -0
  201. package/dist/session/product-state-hash.js +700 -0
  202. package/dist/session/ritual-entrypoint.js +16 -1
  203. package/dist/session/session-ready.d.ts +2 -0
  204. package/dist/session/session-ready.js +52 -30
  205. package/dist/session/session-start.d.ts +13 -0
  206. package/dist/session/session-start.js +103 -9
  207. package/dist/session/verify-ac-session-cache.d.ts +42 -0
  208. package/dist/session/verify-ac-session-cache.js +126 -0
  209. package/dist/session/verify-session-ritual.d.ts +28 -0
  210. package/dist/session/verify-session-ritual.js +97 -5
  211. package/dist/slash/openclaw-deposit.js +13 -9
  212. package/dist/slice/constants.d.ts +2 -2
  213. package/dist/slice/constants.js +2 -2
  214. package/dist/slice/existing.js +9 -3
  215. package/dist/slice/lock.d.ts +16 -1
  216. package/dist/slice/lock.js +137 -11
  217. package/dist/story-ready/evaluate.d.ts +2 -0
  218. package/dist/story-ready/evaluate.js +13 -0
  219. package/dist/swarm/complete-cohort.d.ts +3 -0
  220. package/dist/swarm/complete-cohort.js +59 -11
  221. package/dist/swarm/finalize-cohort-cli.d.ts +7 -2
  222. package/dist/swarm/finalize-cohort-cli.js +165 -35
  223. package/dist/swarm/finalize-cohort.d.ts +1 -0
  224. package/dist/swarm/finalize-cohort.js +47 -4
  225. package/dist/swarm/launch.d.ts +22 -0
  226. package/dist/swarm/launch.js +155 -0
  227. package/dist/swarm/routing-set-cli.d.ts +11 -1
  228. package/dist/swarm/routing-set-cli.js +15 -3
  229. package/dist/swarm/routing-verify.d.ts +13 -1
  230. package/dist/swarm/routing-verify.js +60 -21
  231. package/dist/swarm/routing.d.ts +14 -0
  232. package/dist/swarm/routing.js +53 -3
  233. package/dist/telemetry-coverage/fake-trial.js +10 -0
  234. package/dist/telemetry-coverage/kinds.js +2 -0
  235. package/dist/triage/actions/index.js +4 -1
  236. package/dist/triage/bootstrap/index.js +6 -6
  237. package/dist/triage/help/registry-data.d.ts +1 -1
  238. package/dist/triage/help/registry-data.js +1 -1
  239. package/dist/triage/welcome/writers.d.ts +1 -1
  240. package/dist/triage/welcome/writers.js +10 -5
  241. package/dist/ts-check-lane/index.d.ts +3 -0
  242. package/dist/ts-check-lane/index.js +2 -0
  243. package/dist/ts-check-lane/progress-reporter.d.ts +17 -0
  244. package/dist/ts-check-lane/progress-reporter.js +38 -0
  245. package/dist/ts-check-lane/progress.d.ts +32 -0
  246. package/dist/ts-check-lane/progress.js +57 -0
  247. package/dist/ts-check-lane/run-lane.d.ts +3 -1
  248. package/dist/ts-check-lane/run-lane.js +8 -6
  249. package/dist/validate-content/validate-links.d.ts +8 -0
  250. package/dist/validate-content/validate-links.js +9 -15
  251. package/dist/value/feedback-file.js +12 -2
  252. package/dist/value/readback.d.ts +4 -1
  253. package/dist/value/readback.js +51 -12
  254. package/dist/vbrief-build/index.d.ts +1 -0
  255. package/dist/vbrief-build/index.js +1 -0
  256. package/dist/vbrief-build/project-invariants-io.d.ts +16 -0
  257. package/dist/vbrief-build/project-invariants-io.js +41 -0
  258. package/dist/vbrief-reconcile/graph.js +18 -1
  259. package/dist/vbrief-reconcile/index.d.ts +1 -1
  260. package/dist/vbrief-reconcile/index.js +1 -1
  261. package/dist/vbrief-reconcile/types.d.ts +13 -0
  262. package/dist/vbrief-reconcile/umbrellas.d.ts +14 -0
  263. package/dist/vbrief-reconcile/umbrellas.js +261 -26
  264. package/dist/vbrief-validate/index.d.ts +1 -1
  265. package/dist/vbrief-validate/index.js +1 -1
  266. package/dist/vbrief-validate/plan-hooks.d.ts +4 -0
  267. package/dist/vbrief-validate/plan-hooks.js +68 -0
  268. package/dist/vbrief-validate/schema.d.ts +4 -0
  269. package/dist/vbrief-validate/schema.js +1 -1
  270. package/dist/verify-ac/evaluate.d.ts +7 -1
  271. package/dist/verify-ac/evaluate.js +34 -26
  272. package/dist/verify-ac/flag.d.ts +4 -0
  273. package/dist/verify-ac/flag.js +16 -0
  274. package/dist/verify-ac/index.d.ts +2 -2
  275. package/dist/verify-ac/index.js +2 -2
  276. package/dist/verify-env/agent-hook-readiness.d.ts +2 -2
  277. package/dist/verify-env/agent-hook-readiness.js +12 -8
  278. package/dist/verify-env/agent-hooks-live-probe.d.ts +5 -1
  279. package/dist/verify-env/agent-hooks-live-probe.js +26 -5
  280. package/dist/verify-env/agent-hooks.js +3 -4
  281. package/dist/verify-source/contained-writes.js +2 -0
  282. package/dist/verify-source/verify-stubs.d.ts +15 -1
  283. package/dist/verify-source/verify-stubs.js +20 -16
  284. package/dist/vitest-runner/win32-coverage-tmp-setup.d.ts +5 -6
  285. package/dist/vitest-runner/win32-coverage-tmp-setup.js +5 -6
  286. package/dist/xbrief-migrate/migrate-project.js +2 -5
  287. package/package.json +7 -3
@@ -7,8 +7,13 @@
7
7
  *
8
8
  * Types are declared locally (not imported from session-start) so this module
9
9
  * does not form an import cycle with session-start call sites.
10
+ *
11
+ * #3508: composed readers live on `task value:show` (`value/readback.ts`).
12
+ * This module measures CLI process time, not agent-turn wall clock (#3500).
13
+ * ⊗ Do not use a printed CLI duration as #3286 Later graduation input.
10
14
  */
11
- import { emit } from "../lifecycle/events.js";
15
+ import { resolve } from "node:path";
16
+ import { DEFAULT_EVENT_LOG, emit, readEvents, } from "../lifecycle/events.js";
12
17
  import { PROCESS_COST_EVENT_NAMES } from "./process-cost-constants.js";
13
18
  export { PROCESS_COST_EVENT_NAMES, PROCESS_COST_REQUIRED_PAYLOAD, } from "./process-cost-constants.js";
14
19
  /**
@@ -79,4 +84,187 @@ export function emitSessionRitualBlockedProcessCost(input, options) {
79
84
  return null;
80
85
  }
81
86
  }
87
+ function isRecordPayload(payload) {
88
+ return payload !== null && typeof payload === "object" && !Array.isArray(payload);
89
+ }
90
+ function parseDetectedAt(record) {
91
+ const raw = record.detected_at;
92
+ if (typeof raw !== "string" || raw.trim().length === 0) {
93
+ return null;
94
+ }
95
+ let text = raw.trim();
96
+ if (text.endsWith("Z")) {
97
+ text = `${text.slice(0, -1)}+00:00`;
98
+ }
99
+ const parsed = new Date(text);
100
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
101
+ }
102
+ function payloadNumber(payload, key) {
103
+ const raw = payload[key];
104
+ return typeof raw === "number" && Number.isFinite(raw) ? raw : null;
105
+ }
106
+ function resolveProcessCostLogPath(projectRoot, logPath) {
107
+ if (logPath !== undefined && logPath !== null) {
108
+ return resolve(logPath);
109
+ }
110
+ return resolve(projectRoot, DEFAULT_EVENT_LOG);
111
+ }
112
+ function parseSteps(payload) {
113
+ const raw = payload?.steps;
114
+ if (!Array.isArray(raw)) {
115
+ return [];
116
+ }
117
+ const out = [];
118
+ for (const item of raw) {
119
+ if (item === null || typeof item !== "object" || Array.isArray(item)) {
120
+ continue;
121
+ }
122
+ const rec = item;
123
+ if (typeof rec.name !== "string" || typeof rec.duration_ms !== "number") {
124
+ continue;
125
+ }
126
+ if (!Number.isFinite(rec.duration_ms)) {
127
+ continue;
128
+ }
129
+ const step = {
130
+ name: rec.name,
131
+ duration_ms: rec.duration_ms,
132
+ };
133
+ if (rec.skipped === true) {
134
+ out.push({ ...step, skipped: true });
135
+ }
136
+ else {
137
+ out.push(step);
138
+ }
139
+ }
140
+ return out;
141
+ }
142
+ function lastSessionStartForTier(events, tier) {
143
+ for (let i = events.length - 1; i >= 0; i -= 1) {
144
+ const record = events[i];
145
+ if (record === undefined || record.event !== PROCESS_COST_EVENT_NAMES.sessionStart) {
146
+ continue;
147
+ }
148
+ const payload = isRecordPayload(record.payload) ? record.payload : null;
149
+ if (payload?.ceremony_tier === tier) {
150
+ return record;
151
+ }
152
+ }
153
+ return null;
154
+ }
155
+ function durationFrom(record) {
156
+ if (record === null || !isRecordPayload(record.payload)) {
157
+ return null;
158
+ }
159
+ return payloadNumber(record.payload, "duration_ms");
160
+ }
161
+ function formatWindowLabel(windowMs) {
162
+ const days = Math.round(windowMs / 86_400_000);
163
+ if (days >= 1 && days * 86_400_000 === windowMs) {
164
+ return `${days}d`;
165
+ }
166
+ const hours = Math.round(windowMs / 3_600_000);
167
+ if (hours >= 1 && hours * 3_600_000 === windowMs) {
168
+ return `${hours}h`;
169
+ }
170
+ return `${windowMs}ms`;
171
+ }
172
+ /**
173
+ * Roll up ceremony cost from `.deft-cache/events.jsonl` (#3508).
174
+ * Measures CLI process time, not agent-turn wall clock (#3500).
175
+ */
176
+ export function computeCeremonyCostRollup(options) {
177
+ const windowMs = options.windowMs ?? 7 * 86_400_000;
178
+ const now = options.now ?? new Date();
179
+ const sinceMs = now.getTime() - windowMs;
180
+ const logPath = resolveProcessCostLogPath(options.projectRoot, options.logPath);
181
+ let records = [];
182
+ try {
183
+ records = readEvents(logPath).filter((record) => {
184
+ if (record.event !== PROCESS_COST_EVENT_NAMES.sessionStart &&
185
+ record.event !== PROCESS_COST_EVENT_NAMES.sessionRitualBlocked) {
186
+ return false;
187
+ }
188
+ const at = parseDetectedAt(record);
189
+ if (at === null) {
190
+ return false;
191
+ }
192
+ return at.getTime() >= sinceMs;
193
+ });
194
+ }
195
+ catch {
196
+ records = [];
197
+ }
198
+ const lastCold = lastSessionStartForTier(records, "cold");
199
+ const lastRearm = lastSessionStartForTier(records, "rearm");
200
+ const recoveryTierDistribution = {};
201
+ let blockedRitualCount = 0;
202
+ for (const record of records) {
203
+ if (record.event !== PROCESS_COST_EVENT_NAMES.sessionRitualBlocked) {
204
+ continue;
205
+ }
206
+ blockedRitualCount += 1;
207
+ const payload = isRecordPayload(record.payload) ? record.payload : null;
208
+ const rawTier = payload?.recovery_tier;
209
+ const tier = typeof rawTier === "string" && rawTier.trim().length > 0 ? rawTier.trim() : "unspecified";
210
+ recoveryTierDistribution[tier] = (recoveryTierDistribution[tier] ?? 0) + 1;
211
+ }
212
+ return {
213
+ kind: "cli_process_time",
214
+ windowLabel: options.windowLabel ?? formatWindowLabel(windowMs),
215
+ lastColdDurationMs: durationFrom(lastCold),
216
+ lastRearmDurationMs: durationFrom(lastRearm),
217
+ lastColdSteps: parseSteps(lastCold !== null && isRecordPayload(lastCold.payload) ? lastCold.payload : null),
218
+ lastRearmSteps: parseSteps(lastRearm !== null && isRecordPayload(lastRearm.payload) ? lastRearm.payload : null),
219
+ blockedRitualCount,
220
+ recoveryTierDistribution,
221
+ };
222
+ }
223
+ function formatMs(value) {
224
+ return value === null ? "none" : `${value}ms`;
225
+ }
226
+ function formatSteps(steps) {
227
+ if (steps.length === 0) {
228
+ return "none";
229
+ }
230
+ return steps
231
+ .map((step) => {
232
+ const skip = step.skipped === true ? " skipped" : "";
233
+ return `${step.name}=${step.duration_ms}ms${skip}`;
234
+ })
235
+ .join(", ");
236
+ }
237
+ function formatRecovery(distribution) {
238
+ const parts = Object.entries(distribution)
239
+ .sort(([a], [b]) => a.localeCompare(b))
240
+ .map(([tier, count]) => `${tier}=${count}`);
241
+ return parts.length === 0 ? "none" : parts.join(", ");
242
+ }
243
+ /**
244
+ * Human rollup for the composed `value:show` reader (#3508).
245
+ * CLI process time, not agent-turn wall clock (#3500).
246
+ */
247
+ export function formatCeremonyCostReport(rollup) {
248
+ const lines = [
249
+ `[ceremony] CLI process time (not agent-turn wall clock; #3508 / #2994) ` +
250
+ `(${rollup.windowLabel}):`,
251
+ ` last cold: ${formatMs(rollup.lastColdDurationMs)}`,
252
+ ` last re-arm: ${formatMs(rollup.lastRearmDurationMs)}`,
253
+ ` steps (last cold ${PROCESS_COST_EVENT_NAMES.sessionStart}): ` +
254
+ formatSteps(rollup.lastColdSteps),
255
+ ` steps (last re-arm ${PROCESS_COST_EVENT_NAMES.sessionStart}): ` +
256
+ formatSteps(rollup.lastRearmSteps),
257
+ ` blocked-ritual (${PROCESS_COST_EVENT_NAMES.sessionRitualBlocked}): ` +
258
+ String(rollup.blockedRitualCount),
259
+ ` recovery-tier: ${formatRecovery(rollup.recoveryTierDistribution)}`,
260
+ ];
261
+ return `${lines.join("\n")}\n`;
262
+ }
263
+ /**
264
+ * Operator-visible mutation `session:start` line (#3508).
265
+ * CLI process time only. ⊗ not #3286 Later graduation input.
266
+ */
267
+ export function formatSessionStartCeremonyCostLine(ceremonyTier, durationMs) {
268
+ return `[deft session] ceremony ${ceremonyTier} ${durationMs}ms`;
269
+ }
82
270
  //# sourceMappingURL=process-cost.js.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Product-state hash for AC-pass bank reuse (#3387).
3
+ *
4
+ * Acceptance plus product file bytes. Lifecycle dirs (xbrief/vbrief/.deft)
5
+ * are excluded so scope:complete moves do not invalidate a green bank.
6
+ */
7
+ import { type GitRunner } from "./git.js";
8
+ export interface HashProductStateInput {
9
+ readonly projectRoot: string;
10
+ readonly plan: Record<string, unknown>;
11
+ /** Explicit product files (tests / callers). Relative to projectRoot. */
12
+ readonly productPaths?: readonly string[];
13
+ readonly runGit?: GitRunner;
14
+ }
15
+ export interface ProductStateHash {
16
+ readonly digest: string;
17
+ /** False when no product surface could be enumerated — refuse reuse. */
18
+ readonly complete: boolean;
19
+ readonly files: readonly string[];
20
+ }
21
+ /**
22
+ * Hash plan.acceptance plus product files. Missing/empty product surface
23
+ * is incomplete so callers fail closed to a full walk (#3387).
24
+ */
25
+ export declare function hashProductState(input: HashProductStateInput): ProductStateHash;
26
+ //# sourceMappingURL=product-state-hash.d.ts.map