@dzhechkov/harness-core 0.5.0 → 0.5.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 (96) hide show
  1. package/.dz-manifest.json +339 -75
  2. package/README.md +47 -4
  3. package/dist/codex-hooks-assets.d.ts.map +1 -1
  4. package/dist/codex-hooks-assets.js +39 -2
  5. package/dist/codex-hooks-assets.js.map +1 -1
  6. package/dist/codex-hooks-verify.d.ts +23 -2
  7. package/dist/codex-hooks-verify.d.ts.map +1 -1
  8. package/dist/codex-hooks-verify.js +29 -0
  9. package/dist/codex-hooks-verify.js.map +1 -1
  10. package/dist/codex-hooks.d.ts +90 -7
  11. package/dist/codex-hooks.d.ts.map +1 -1
  12. package/dist/codex-hooks.js +171 -21
  13. package/dist/codex-hooks.js.map +1 -1
  14. package/dist/feature-adr-routing.d.ts +22 -0
  15. package/dist/feature-adr-routing.d.ts.map +1 -1
  16. package/dist/feature-adr-routing.js +45 -0
  17. package/dist/feature-adr-routing.js.map +1 -1
  18. package/dist/index.d.ts +11 -4
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +17 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/loop-blobs.generated.d.ts +1 -1
  23. package/dist/loop-blobs.generated.d.ts.map +1 -1
  24. package/dist/loop-blobs.generated.js +12 -3
  25. package/dist/loop-blobs.generated.js.map +1 -1
  26. package/dist/loop-plan.d.ts +70 -0
  27. package/dist/loop-plan.d.ts.map +1 -1
  28. package/dist/loop-plan.js +103 -0
  29. package/dist/loop-plan.js.map +1 -1
  30. package/dist/loop-render.d.ts.map +1 -1
  31. package/dist/loop-render.js +38 -130
  32. package/dist/loop-render.js.map +1 -1
  33. package/dist/loop-run-semantics.d.ts +130 -0
  34. package/dist/loop-run-semantics.d.ts.map +1 -0
  35. package/dist/loop-run-semantics.js +257 -0
  36. package/dist/loop-run-semantics.js.map +1 -0
  37. package/dist/loop-trace.d.ts +106 -5
  38. package/dist/loop-trace.d.ts.map +1 -1
  39. package/dist/loop-trace.js +151 -18
  40. package/dist/loop-trace.js.map +1 -1
  41. package/dist/managed-hooks.d.ts +10 -0
  42. package/dist/managed-hooks.d.ts.map +1 -1
  43. package/dist/managed-hooks.js +17 -5
  44. package/dist/managed-hooks.js.map +1 -1
  45. package/dist/named-lock.d.ts +57 -0
  46. package/dist/named-lock.d.ts.map +1 -0
  47. package/dist/named-lock.js +247 -0
  48. package/dist/named-lock.js.map +1 -0
  49. package/dist/operations.d.ts +81 -5
  50. package/dist/operations.d.ts.map +1 -1
  51. package/dist/operations.js +356 -38
  52. package/dist/operations.js.map +1 -1
  53. package/dist/parity.d.ts +70 -2
  54. package/dist/parity.d.ts.map +1 -1
  55. package/dist/parity.js +133 -2
  56. package/dist/parity.js.map +1 -1
  57. package/dist/qe-bridge.d.ts +291 -0
  58. package/dist/qe-bridge.d.ts.map +1 -0
  59. package/dist/qe-bridge.js +538 -0
  60. package/dist/qe-bridge.js.map +1 -0
  61. package/dist/score.d.ts.map +1 -1
  62. package/dist/score.js +43 -9
  63. package/dist/score.js.map +1 -1
  64. package/dist/trace-corroborate.d.ts +48 -0
  65. package/dist/trace-corroborate.d.ts.map +1 -0
  66. package/dist/trace-corroborate.js +172 -0
  67. package/dist/trace-corroborate.js.map +1 -0
  68. package/dist/workflow-run-dispatch.d.ts +230 -0
  69. package/dist/workflow-run-dispatch.d.ts.map +1 -0
  70. package/dist/workflow-run-dispatch.js +363 -0
  71. package/dist/workflow-run-dispatch.js.map +1 -0
  72. package/dist/workflow-run.d.ts +513 -0
  73. package/dist/workflow-run.d.ts.map +1 -0
  74. package/dist/workflow-run.js +1377 -0
  75. package/dist/workflow-run.js.map +1 -0
  76. package/package.json +2 -2
  77. package/sbom.json +740 -80
  78. package/src/codex-hooks-assets.ts +39 -2
  79. package/src/codex-hooks-verify.ts +55 -2
  80. package/src/codex-hooks.ts +172 -20
  81. package/src/feature-adr-routing.ts +55 -0
  82. package/src/index.ts +46 -1
  83. package/src/loop-blobs.generated.ts +12 -3
  84. package/src/loop-plan.ts +185 -0
  85. package/src/loop-render.ts +38 -128
  86. package/src/loop-run-semantics.ts +278 -0
  87. package/src/loop-trace.ts +207 -16
  88. package/src/managed-hooks.ts +26 -5
  89. package/src/named-lock.ts +277 -0
  90. package/src/operations.ts +441 -40
  91. package/src/parity.ts +177 -2
  92. package/src/qe-bridge.ts +737 -0
  93. package/src/score.ts +50 -9
  94. package/src/trace-corroborate.ts +205 -0
  95. package/src/workflow-run-dispatch.ts +459 -0
  96. package/src/workflow-run.ts +1773 -0
@@ -0,0 +1,513 @@
1
+ /**
2
+ * `workflow-run` — the PURE scheduler half of `dz workflow run` (feature dz-workflow-run).
3
+ *
4
+ * `dz workflow run` INTERPRETS a `loop-plan/1` plan; it never executes the rendered Claude-host
5
+ * script (ADR-001). That is the whole design in one sentence, and everything in this file follows
6
+ * from it: the plan is read through a PROJECTION (`toRunProjection` — the AM-3 doctrine, now with a
7
+ * second enactor), the enactment DECISIONS come from the one shared module the rendered script also
8
+ * carries as a blob (`loop-run-semantics`), and the trace is emitted through the SAME validated
9
+ * grammar the Claude host uses (`loop-trace`), so a divergent event cannot even be buffered.
10
+ *
11
+ * PURITY (NFR-3): everything here is deterministic under injected seams — a `Dispatcher` per family,
12
+ * a `RunStore` for every byte that touches a disk, an injected clock and an injected runId. No
13
+ * `spawn`, no `fs`, no `Date`, no randomness. That is what buys the determinism test, the
14
+ * replay-derived discrimination leg, the landed-barrier mutant and all 22 taxonomy producers
15
+ * WITHOUT spawning a single child.
16
+ *
17
+ * The three refusal planes, in the order a run meets them:
18
+ * 1. PREFLIGHT — decidable before anything is spawned (no trace plane, unroutable model, a write
19
+ * that escapes the root, same-family QE, an operator override that cannot fit a boundary).
20
+ * 2. RESUME — decidable from state + checkpoints + artifact probes, never from a step list.
21
+ * 3. RUNTIME — dispatch failures, gate verdicts, deliverables that did not land, budget.
22
+ * Every refusal names itself from ONE closed list (`WF_RUN_REASONS`), and the list is the count
23
+ * authority a reachability suite walks.
24
+ */
25
+ import type { LoopPlan, RunProjection, RunStepSpec } from './loop-plan.js';
26
+ import { type BridgeFamily } from './qe-bridge.js';
27
+ import { type Dispatcher } from './workflow-run-dispatch.js';
28
+ export declare const WF_RUN_STATE_SCHEMA = "wf-run-state/1";
29
+ export declare const WF_BUDGET_ROW_SCHEMA = "wf-budget-1";
30
+ export declare const WF_PAUSE_ENVELOPE_SCHEMA = "wf-pause-envelope/1";
31
+ export declare const WF_RUN_RESULT_SCHEMA = "wf-run-result/1";
32
+ export declare const WF_RUN_OWNER_HOST = "dz-workflow-run";
33
+ /** ADR-004 W9 — a DECLARED GUESS, deliberately ONE exported constant so calibration is a one-line
34
+ * change with a name, not a number sprinkled through the scheduler. */
35
+ export declare const WALLCLOCK_CEILING_MULTIPLIER = 1.5;
36
+ /** 75 = sysexits EX_TEMPFAIL ("try again later"). NOT 3: that collides with workflow-lint's
37
+ * inconclusive and reads ignorable, while a pause strands resumable progress (AM-11). */
38
+ export declare const WF_EXIT: {
39
+ readonly completed: 0;
40
+ readonly failed: 1;
41
+ readonly usage: 2;
42
+ readonly pause: 75;
43
+ };
44
+ /**
45
+ * The CLOSED reason set (AM-1 + AM-15 + AM-19) as DATA — the single count authority. The
46
+ * reachability suite WALKS this array: a member no in-suite scenario can produce fails the suite, so
47
+ * the list can never quietly grow a decorative member or lose a real one. Every count written in
48
+ * prose anywhere is a DESCRIPTION of this array, never a second authority.
49
+ */
50
+ export declare const WF_RUN_REASONS: readonly ["plan-invalid", "trace-emit-required", "plan-model-unroutable", "artifact-path-escapes-root", "probe-failed", "dispatch-timeout", "dispatch-dead", "gate-verdict-unparseable", "deliverable-not-landed", "same-family-qe-refused", "prompt-over-ceiling", "stale-input-refused", "resume-model-unavailable", "foreign-run-refused", "run-exists", "run-locked", "budget-exhausted", "budget-extension-exhausted", "budget-invariant-violated", "resume-already-completed", "wall-extension-exhausted", "reservation-unsatisfiable", "gate-failed", "plan-pause"];
51
+ export type WfRunReason = (typeof WF_RUN_REASONS)[number];
52
+ /**
53
+ * The members whose PRODUCER lives in the impure half (`dz workflow run`'s CLI): a run DIRECTORY
54
+ * that already holds a run, and a LIVE owner marker. Neither is decidable without a filesystem, so
55
+ * neither can be produced by the core suite.
56
+ *
57
+ * Exported as DATA so the reachability proof spans both packages WITHOUT either side restating the
58
+ * other's list: the core suite asserts `produced-in-core ∪ this === WF_RUN_REASONS`, and the CLI
59
+ * suite asserts it produces every member of exactly this array. Together that is a real 23/23 walk;
60
+ * a member that fell out of both halves would fail the core union check, and a member added here
61
+ * without a CLI producer would fail the CLI check.
62
+ */
63
+ export declare const WF_RUN_REASONS_CLI_PRODUCED: readonly ["run-exists", "run-locked"];
64
+ export interface WfRunOwner {
65
+ host: typeof WF_RUN_OWNER_HOST;
66
+ runnerVersion: string;
67
+ pid: number;
68
+ startedMarker: string;
69
+ }
70
+ export interface WfRunState {
71
+ schema: typeof WF_RUN_STATE_SCHEMA;
72
+ /**
73
+ * CONTENT binding for the attestation (feature honest-trace-provenance, ADR-001 round 3).
74
+ * Identifiers alone were not enough: a fabricated trace dropped beside a genuine run-state with
75
+ * matching ids satisfied the binding, which is exactly the counterexample that failed round 2.
76
+ * Optional because a state written before this feature has none — and a state with NO binding can
77
+ * never mint `instrument`, which is the fail-closed direction.
78
+ */
79
+ traceSha256?: string;
80
+ traceLines?: number;
81
+ owner: WfRunOwner;
82
+ status: 'running' | 'paused' | 'completed' | 'failed';
83
+ runId: string;
84
+ /** BARE hex everywhere it is stored or compared (K7) — the rendered header's `sha256:` prefix is
85
+ * display-only. One domain, so no comparison has to remember to strip a prefix. */
86
+ planDigest: string;
87
+ execFp: string;
88
+ argsHash: string;
89
+ pause?: {
90
+ state: string;
91
+ resumeArg: string;
92
+ payloadSchema: Record<string, unknown> | null;
93
+ remainingSteps: string[];
94
+ reservationNote: string;
95
+ };
96
+ failure?: {
97
+ reason: WfRunReason;
98
+ detail: string;
99
+ };
100
+ /**
101
+ * DIAGNOSTIC-ONLY (W10). Read by NOTHING — the resume cursor comes from checkpoint lines plus
102
+ * artifact probes, never from a step list a crashed writer may have half-updated. A test corrupts
103
+ * this field arbitrarily and asserts every resume decision is byte-identical.
104
+ */
105
+ completedSteps: string[];
106
+ /** stepId → PROBED model id (joins resume identity, AM-8). */
107
+ resolvedModels: Record<string, string>;
108
+ budget: {
109
+ total: number;
110
+ spent: number;
111
+ extensions: {
112
+ ts: string;
113
+ extra: number;
114
+ newTotal: number;
115
+ }[];
116
+ };
117
+ wallClock: {
118
+ ceilingMs: number;
119
+ spentMs: number;
120
+ extensions: {
121
+ ts: string;
122
+ extraMs: number;
123
+ newCeilingMs: number;
124
+ }[];
125
+ };
126
+ waivers: {
127
+ kind: 'same-family-qe';
128
+ step: string;
129
+ recordedDebt: string;
130
+ }[];
131
+ /**
132
+ * Every resume arg supplied so far, across ALL legs (Step-8 re-QE NEW-B2). Which pauses are
133
+ * SATISFIED is run state, not an argument of the current invocation: a three-pause plan is
134
+ * resumed three times, and leg 3 supplies only its own key.
135
+ */
136
+ resumeArgs?: Record<string, string>;
137
+ coderFamily: BridgeFamily;
138
+ startedAt: string;
139
+ updatedAt: string;
140
+ /** True when a scripted-dispatcher TEST SEAM supplied the dispatchers — recorded LOUDLY, because
141
+ * a test seam that leaves no trace in the artifact is indistinguishable from a real run. */
142
+ dispatcherOverride?: boolean;
143
+ }
144
+ export interface WfBudgetRow {
145
+ schema: typeof WF_BUDGET_ROW_SCHEMA;
146
+ kind: 'stage' | 'probe';
147
+ runId: string;
148
+ /** Joins 1:1 to the trace's dispatch events; null on a probe row (a probe is not a dispatch). */
149
+ dispatchSeq: number | null;
150
+ stepId: string | null;
151
+ itemKey: string | null;
152
+ attempt: number | null;
153
+ family: BridgeFamily;
154
+ model: string | null;
155
+ wallMs: number;
156
+ tokensIn: number | null;
157
+ tokensOut: number | null;
158
+ tokensSource: 'claude-envelope' | 'codex-stderr' | null;
159
+ outcome: 'ok' | 'null' | 'error' | null;
160
+ timeoutMs: number | null;
161
+ }
162
+ export interface WfPauseEnvelope {
163
+ schema: typeof WF_PAUSE_ENVELOPE_SCHEMA;
164
+ runId: string;
165
+ exitCode: 75;
166
+ pauseState: string;
167
+ /** CLOSED (Step-8 HIGH-7): a member of `WF_RUN_REASONS`, never a free string. */
168
+ reason: WfRunReason;
169
+ /** The REAL path of this run's state file — a custom `--run-dir` must not be told to look in the
170
+ * default one. */
171
+ runStatePath: string;
172
+ /** A command that actually works for this run, `--run-dir` included. */
173
+ resumeCmd: string;
174
+ }
175
+ export interface WfRunResult {
176
+ schema: typeof WF_RUN_RESULT_SCHEMA;
177
+ runId: string;
178
+ status: 'completed' | 'failed';
179
+ reason?: WfRunReason;
180
+ exitCode: 0 | 1;
181
+ /**
182
+ * The gate `terminal:` route this run ended on, when it ended on one (Step-8 MEDIUM-13).
183
+ *
184
+ * A terminal route is a PLAN-DECLARED ending, so the exit code stays 0 — parity with the rendered
185
+ * script, whose top-level terminal `return` also completes the Workflow. But "completed" and
186
+ * "completed because a gate rejected it" are different facts, and a wrapper could not tell them
187
+ * apart from the result line alone; the route was visible only in the ledger. It is a field
188
+ * rather than a new exit code because changing the exit semantics would silently reclassify every
189
+ * existing terminal-route run.
190
+ */
191
+ terminalRoute?: string;
192
+ /** True when the SCRIPTED dispatcher seam supplied the models (Step-8 MEDIUM-11) — a run that
193
+ * dispatched to no real model must say so in its own result, not only in a state file. */
194
+ dispatcherOverride?: boolean;
195
+ }
196
+ export interface RunnerInputs {
197
+ plan: LoopPlan;
198
+ runId: string;
199
+ coderFamily: BridgeFamily;
200
+ allowSameFamilyQe: boolean;
201
+ defaultFamily: BridgeFamily | null;
202
+ budgetOverride: number | null;
203
+ maxWallClockMsOverride: number | null;
204
+ stageTimeoutMsOverride: number | null;
205
+ /** runId to resume, or null for a fresh run. */
206
+ resume: string | null;
207
+ resumeArgs: Record<string, string>;
208
+ budgetExtra: number | null;
209
+ wallClockExtraMs: number | null;
210
+ runnerVersion: string;
211
+ cwdRoot: string;
212
+ }
213
+ /**
214
+ * The run-args identity hash, over the inputs MINUS an ENUMERATED exclusion list (AM-13 / W12).
215
+ *
216
+ * The exclusions are the whole point and they are returned as DATA so a test can pin them rather
217
+ * than restate them: the plan-declared `resumeArg` keys (supplying one is what a resume IS),
218
+ * `budgetExtra` and `wallClockExtra` (extending a ceiling is a resume-plane input, not a different
219
+ * run). Everything else — including a resume arg the plan never declared — is IDENTITY, so changing
220
+ * it makes the resume stale rather than silently continuing a different run.
221
+ */
222
+ export declare function computeRunArgsHash(inputs: RunnerInputs, proj: RunProjection): {
223
+ hash: string;
224
+ excluded: string[];
225
+ };
226
+ export interface BoundaryReservation {
227
+ boundaryId: string;
228
+ kind: 'stage' | 'region' | 'gate';
229
+ steps: string[];
230
+ /** Worst-case agent invocations this boundary can consume, retries and redos included. */
231
+ invocations: number;
232
+ /** Worst-case wall clock, before the ceiling multiplier. */
233
+ wallMs: number;
234
+ }
235
+ /**
236
+ * Worst-case reservation PER BOUNDARY (AM-4: a region is reserved as a whole and never interrupted,
237
+ * which is what makes "pause BEFORE the region" expressible at all).
238
+ *
239
+ * • stage — the step's declared `maxAgents`;
240
+ * • gate — the gate's own allowance PLUS the declared redo allowance, reserved AT the gate
241
+ * boundary (a plan-declared redo must be affordable where it is spent, not somewhere
242
+ * upstream, or a short budget pauses in the middle of a redo loop);
243
+ * • region — every activated member × the whole chain. This is the number that can legitimately
244
+ * exceed the plan's total: the render's ceiling counts a member step ONCE, the runtime
245
+ * dispatches it per item. Naming the gap here is what makes the extension cap
246
+ * satisfiable instead of a surprise mid-run.
247
+ */
248
+ export declare function computeBoundaryReservations(proj: RunProjection, timeoutMsFor: (s: RunStepSpec) => number): BoundaryReservation[];
249
+ /**
250
+ * The extension cap (AM-14, correcting AM-5's doubling): `max(2 × originalTotal, Σ reservations)`.
251
+ *
252
+ * The doubling bound ALONE left a valid plan permanently unresumable — counterexample from the
253
+ * amendment: T=10 with a last boundary needing 25 can never be finished, because the achievable cap
254
+ * is 20 and the prefix already spent some of it. Σ reservations is PREFIX-CLOSED (actual spend per
255
+ * construct never exceeds its own reservation), so default caps are satisfiable BY CONSTRUCTION.
256
+ * The named cost: for attempt-heavy plans the cap is larger than 2×T, so the doubling guarantee is
257
+ * weakened exactly there — the extension records are what keep that audited.
258
+ */
259
+ export declare function computeAchievableMax(originalTotal: number, reservations: BoundaryReservation[]): number;
260
+ /** ADR-004 W9: Σ worst-case wall × the declared multiplier. The multiplier is a GUESS with a name. */
261
+ export declare function computeWallClockCeilingMs(reservations: BoundaryReservation[]): number;
262
+ export interface PreflightDeps {
263
+ /** Resolve a path to its real location, or null when it cannot be resolved. */
264
+ realpath: (p: string) => string | null;
265
+ exists: (p: string) => boolean;
266
+ }
267
+ export interface PreflightOk {
268
+ ok: true;
269
+ projection: RunProjection;
270
+ planDigest: string;
271
+ execFp: string;
272
+ argsHash: string;
273
+ /** stepId → family, TOTAL over every dispatching step (AM-8): resolution happens ONCE, here. */
274
+ families: Record<string, BridgeFamily>;
275
+ reservations: BoundaryReservation[];
276
+ budgetTotal: number;
277
+ wallCeilingMs: number;
278
+ achievableMax: number;
279
+ /** The wall twin of `achievableMax` (AM-14 arithmetic): `max(2 × the COMPUTED default ceiling,
280
+ * Σ boundary wall reservations)`. Plan-derived, so an operator override cannot inflate its own
281
+ * cap (Step-8 HIGH-5). */
282
+ achievableWallMs: number;
283
+ /** same-family QE steps proceeding under the LOUD waiver (each one owes a re-QE debt). */
284
+ qeWaivers: {
285
+ step: string;
286
+ }[];
287
+ }
288
+ export interface PreflightRefusal {
289
+ ok: false;
290
+ reason: WfRunReason;
291
+ detail: string;
292
+ }
293
+ /** The per-stage timeout the run uses: the operator's override, else the measured codex xhigh
294
+ * ceiling (the far end of the distribution — a shorter default would turn slow models into
295
+ * `dispatch-timeout` noise). */
296
+ export declare function stageTimeoutMs(inputs: RunnerInputs): number;
297
+ /**
298
+ * Refusals in a FIXED order, each one named:
299
+ * trace-emit-required → plan-model-unroutable → artifact-path-escapes-root →
300
+ * same-family-qe-refused (unless waived) → reservation-unsatisfiable.
301
+ *
302
+ * The order is not cosmetic. `trace-emit-required` comes first because a run with no trace plane is
303
+ * unverifiable — refusing it later would mean deciding routing for a run nobody could ever check.
304
+ * `reservation-unsatisfiable` comes last because it is the only refusal that depends on every
305
+ * preceding resolution, and it fires ONLY for an EXPLICIT operator override: the defaults are
306
+ * satisfiable by construction (AM-14), so a default-budget run that cannot fit a boundary pauses and
307
+ * resumes rather than refusing to start.
308
+ *
309
+ * `plan-invalid` never reaches here — the CLI parses and validates first and exits 2.
310
+ */
311
+ export declare function preflight(inputs: RunnerInputs, deps: PreflightDeps): PreflightOk | PreflightRefusal;
312
+ export interface RunResumeDecision {
313
+ ok: boolean;
314
+ reason?: WfRunReason;
315
+ detail?: string;
316
+ /** Completed top-level boundaryIds. Built from checkpoint lines + artifact probes ONLY. */
317
+ cursor: Set<string>;
318
+ }
319
+ /**
320
+ * The runner's checkpoint key: `checkpointInputHash` (the `fa-ckpt-2` line shape the timeline reader
321
+ * already merges), SALTED with the exec fingerprint exactly like the rendered script's
322
+ * `__ckptInputHash`. Salting with the fingerprint is what makes a semantics change invalidate every
323
+ * prior checkpoint instead of resuming into a plan that no longer means the same thing.
324
+ */
325
+ export declare function runnerCheckpointHash(boundaryId: string, execFp: string, promptText: string, depResults: unknown[]): string;
326
+ /**
327
+ * Refusals in a FIXED order: foreign-run-refused → resume-already-completed → stale-input-refused →
328
+ * resume-model-unavailable. (`run-locked` is the CALLER's — it belongs to the lock, not to the
329
+ * decision.)
330
+ *
331
+ * Two properties this function exists to guarantee:
332
+ * • A STALE-INPUT mismatch never resumes, in ANY mode — there is no override, because the hash
333
+ * proves run-INPUT identity and an input change means the remaining work is not the work the
334
+ * checkpoints describe.
335
+ * • The cursor is built from CHECKPOINT LINES plus ARTIFACT PROBES and from nothing else.
336
+ * `completedSteps` in run-state is diagnostic: a crashed writer can leave it optimistic, and a
337
+ * resume that believed it would skip work that never happened.
338
+ */
339
+ /**
340
+ * The OWNERSHIP + IDENTITY half of the resume decision — everything decidable WITHOUT dispatching
341
+ * anything (Step-8 re-QE NEW-B1).
342
+ *
343
+ * Round 1 hoisted the model probe above the whole decision so `resume-model-unavailable` could be
344
+ * produced at all. That was right, and it had a cost nobody priced: a foreign, completed or
345
+ * stale-input run PROBED first and therefore wrote a `wf-budget-1` probe row before being refused.
346
+ * A refused run must spend NOTHING — a budget row is a record of work, and there was none.
347
+ *
348
+ * So the decision is in two phases now. This one needs no dispatcher, runs first, and refuses on
349
+ * ownership or identity. The model-availability half stays in `decideRunResume`, after the probe.
350
+ * Returns null when there is nothing to refuse.
351
+ */
352
+ export declare function decideResumeIdentity(opts: {
353
+ runState: WfRunState | null;
354
+ hasTrace: boolean;
355
+ identity: {
356
+ planDigest: string;
357
+ execFp: string;
358
+ argsHash: string;
359
+ };
360
+ }): {
361
+ reason: WfRunReason;
362
+ detail: string;
363
+ } | null;
364
+ /**
365
+ * Accumulate the resume args of the WHOLE pause chain (Step-8 re-QE NEW-B2).
366
+ *
367
+ * A pause is satisfied by an arg supplied in SOME leg, not necessarily the current one. Reading only
368
+ * `inputs.resumeArgs` meant leg 3 (supplying `go2`) forgot that leg 2 had supplied `go1`, so the run
369
+ * fell back to the already-satisfied first pause and could never advance past two pauses at all
370
+ * (MEASURED: P1 → P2 → P1 → P1). The satisfied set is run STATE, so it lives in run-state.
371
+ *
372
+ * FIRST WINS for a key that has already been consumed: the boundary it satisfied has already run,
373
+ * and its result is in the checkpoints and the trace. Re-supplying the SAME value is a harmless
374
+ * repeat; re-supplying a DIFFERENT one is refused rather than silently re-deciding history.
375
+ */
376
+ export declare function accumulateResumeArgs(persisted: Record<string, string> | undefined, supplied: Record<string, string>): {
377
+ args: Record<string, string>;
378
+ conflict: {
379
+ key: string;
380
+ was: string;
381
+ now: string;
382
+ } | null;
383
+ };
384
+ export declare function decideRunResume(opts: {
385
+ runState: WfRunState | null;
386
+ hasTrace: boolean;
387
+ identity: {
388
+ planDigest: string;
389
+ execFp: string;
390
+ argsHash: string;
391
+ };
392
+ checkpointsText: string | null;
393
+ expectedHashFor: (boundaryId: string) => string;
394
+ probeArtifact: (rel: string) => boolean;
395
+ /** The declared writes of a boundary — its checkpoint is only resumable while they still EXIST.
396
+ * (Step-8 BLOCKER-2: this was missing, so `probeArtifact` was never called and a checkpointed
397
+ * file stage whose deliverable had been deleted was skipped on resume.) */
398
+ declaredWritesFor?: (boundaryId: string) => string[];
399
+ reprobedModels: Record<string, string | null>;
400
+ }): RunResumeDecision;
401
+ /**
402
+ * Torn-tail-tolerant JSONL reader (ADR-004 Confirmation-4b). A malformed LAST line is the signature
403
+ * of a process that died mid-append — it is skipped with a NAMED warning. A malformed INTERIOR line
404
+ * is not: something rewrote history, and silently continuing would hide it.
405
+ */
406
+ export declare function readJsonlTolerant(text: string): {
407
+ rows: unknown[];
408
+ tornTail: boolean;
409
+ warnings: string[];
410
+ };
411
+ /** The machine-readable pause envelope (AM-16): a wrapper distinguishes pause from failure using
412
+ * ONLY stdout + the exit code, never prose. */
413
+ export declare function buildPauseEnvelope(runId: string, pauseState: string, reason: WfRunReason, planPath: string, resumeArg: string | null, where?: {
414
+ runStatePath?: string | undefined;
415
+ runDirArg?: string | null | undefined;
416
+ }): WfPauseEnvelope;
417
+ export interface RunStore {
418
+ runDirExists(): boolean;
419
+ hasTrace(): boolean;
420
+ /**
421
+ * The trace text written so far, or null when there is none.
422
+ *
423
+ * ADDED to the architecture's verbatim `RunStore` (flagged, not smuggled): a RESUMED leg must
424
+ * CONTINUE the seq counter, not restart it at 1. Without this the two legs of one run collide on
425
+ * seq 1..n and the CONCATENATED trace fails `seq-monotonic` and `join-coverage` — which is
426
+ * exactly the property ADR-004 Confirmation-3 requires to hold across a resume. Reading the file
427
+ * is the only way the pure half can know the high-water mark, and putting the mark in run-state
428
+ * instead would make a diagnostic field load-bearing (the W10 mistake).
429
+ */
430
+ readTraceText(): string | null;
431
+ /** sha256 + non-empty line count of trace.jsonl AS IT NOW STANDS ON DISK, or null when absent.
432
+ * Impure by nature (hashing a file), so it lives behind the store seam like every other fs read. */
433
+ measureTrace(): {
434
+ sha256: string;
435
+ lines: number;
436
+ } | null;
437
+ readRunState(): WfRunState | null;
438
+ /** Atomic in the fs impl (temp + rename): a half-written state is a foreign run forever. */
439
+ writeRunState(s: WfRunState): void;
440
+ appendTraceLines(lines: string[]): void;
441
+ readCheckpointsText(): string | null;
442
+ appendCheckpointLine(line: string): void;
443
+ appendBudgetRow(row: WfBudgetRow): void;
444
+ appendLedgerLine(line: string): void;
445
+ probeArtifact(rel: string): boolean;
446
+ /**
447
+ * Does this declared artifact path STILL resolve inside the run root, RIGHT NOW? (re-QE R3-A /
448
+ * round-1 C4's "repeat containment immediately before filesystem access".) The fs impl applies
449
+ * the realpath + symlinked-ancestor walk; a symlink planted between preflight and dispatch is
450
+ * caught here for reads AND writes, not only inferred from a landed-barrier miss on writes.
451
+ */
452
+ pathContainmentOk(rel: string): boolean;
453
+ /** Pre-dispatch content fingerprints of the declared writes (null = absent). */
454
+ snapshotWrites(rels: string[]): Record<string, string | null>;
455
+ writeReqeDebt(record: object): void;
456
+ }
457
+ export interface SchedulerDeps {
458
+ store: RunStore;
459
+ dispatchers: Record<BridgeFamily, Dispatcher>;
460
+ /** Short state transactions ONLY — never held across a dispatch. */
461
+ lock<T>(fn: () => T): T;
462
+ /** Injected ISO clock (determinism, NFR-2). */
463
+ now(): string;
464
+ monotonicMs(): number;
465
+ /**
466
+ * TEST SEAM (named, never a casual flag): disables the landed barrier so the F5 mutant can show
467
+ * the lying file-step passing. Default false; a run that sets it records `dispatcherOverride`.
468
+ */
469
+ disableLandedBarrier?: boolean;
470
+ /** TEST SEAM: corrupts reservation arithmetic so the per-spawn guard fires inside a reserved
471
+ * region — the ONLY way to reach `budget-invariant-violated` without a real arithmetic bug. */
472
+ corruptReservations?: boolean;
473
+ /** Recorded loudly in run-state when the dispatchers came from the scripted test seam. */
474
+ dispatcherOverride?: boolean;
475
+ planPath?: string;
476
+ slug?: string;
477
+ /** The REAL path of this run's `run-state.json` (Step-8 HIGH-7 — the envelope may not guess it). */
478
+ runStatePath?: string;
479
+ /** The `--run-dir` value the caller used, so the resume command reproduces THIS run. */
480
+ runDirArg?: string | null;
481
+ /** The pid that actually HOLDS this run's owner claim, and when it took it (Step-8 HIGH-6).
482
+ * `run-state.owner.pid` used to be initialised to 0 — a durable record of a process that never
483
+ * existed, which no liveness check could ever mean anything against. */
484
+ ownerPid?: number;
485
+ ownerStartedMarker?: string;
486
+ }
487
+ export type RunOutcome = {
488
+ kind: 'completed';
489
+ exitCode: 0;
490
+ result: WfRunResult;
491
+ } | {
492
+ kind: 'failed';
493
+ exitCode: 1;
494
+ reason: WfRunReason;
495
+ detail: string;
496
+ result: WfRunResult;
497
+ } | {
498
+ kind: 'paused';
499
+ exitCode: 75;
500
+ envelope: WfPauseEnvelope;
501
+ };
502
+ /**
503
+ * THE interpreter loop.
504
+ *
505
+ * Per boundary, in plan order: RESERVE (and pause BEFORE the boundary if the worst case does not
506
+ * fit) → dispatch through the family `Dispatcher` with immediate retries over the closed classes →
507
+ * settle through the shared trace emitter → verify a file deliverable actually landed → checkpoint →
508
+ * append the budget row. A per-spawn guard fires only if the reservation arithmetic was WRONG, and
509
+ * that is a FAILURE (`budget-invariant-violated`), never a pause: a pause promises the remaining
510
+ * work fits after an extension, and a broken invariant promises nothing.
511
+ */
512
+ export declare function runWorkflow(inputs: RunnerInputs, pre: PreflightOk, deps: SchedulerDeps): Promise<RunOutcome>;
513
+ //# sourceMappingURL=workflow-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-run.d.ts","sourceRoot":"","sources":["../src/workflow-run.ts"],"names":[],"mappings":"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"}