@claudexor/orchestrator 3.0.4 → 3.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 (64) hide show
  1. package/dist/attemptFinalize.d.ts +162 -0
  2. package/dist/attemptFinalize.d.ts.map +1 -0
  3. package/dist/attemptFinalize.js +368 -0
  4. package/dist/attemptFinalize.js.map +1 -0
  5. package/dist/attemptTelemetry.d.ts +88 -7
  6. package/dist/attemptTelemetry.d.ts.map +1 -1
  7. package/dist/attemptTelemetry.js +276 -14
  8. package/dist/attemptTelemetry.js.map +1 -1
  9. package/dist/budgetFailure.d.ts +70 -0
  10. package/dist/budgetFailure.d.ts.map +1 -0
  11. package/dist/budgetFailure.js +114 -0
  12. package/dist/budgetFailure.js.map +1 -0
  13. package/dist/candidateEvidence.d.ts +55 -1
  14. package/dist/candidateEvidence.d.ts.map +1 -1
  15. package/dist/candidateEvidence.js +72 -0
  16. package/dist/candidateEvidence.js.map +1 -1
  17. package/dist/continuation.d.ts +77 -0
  18. package/dist/continuation.d.ts.map +1 -0
  19. package/dist/continuation.js +92 -0
  20. package/dist/continuation.js.map +1 -0
  21. package/dist/deepScanReducer.d.ts +148 -0
  22. package/dist/deepScanReducer.d.ts.map +1 -0
  23. package/dist/deepScanReducer.js +352 -0
  24. package/dist/deepScanReducer.js.map +1 -0
  25. package/dist/harnessFailure.d.ts +27 -0
  26. package/dist/harnessFailure.d.ts.map +1 -0
  27. package/dist/harnessFailure.js +61 -0
  28. package/dist/harnessFailure.js.map +1 -0
  29. package/dist/orchestrator.d.ts +97 -10
  30. package/dist/orchestrator.d.ts.map +1 -1
  31. package/dist/orchestrator.js +1213 -295
  32. package/dist/orchestrator.js.map +1 -1
  33. package/dist/planQuestions.d.ts.map +1 -1
  34. package/dist/planQuestions.js +105 -50
  35. package/dist/planQuestions.js.map +1 -1
  36. package/dist/planRun.d.ts +15 -7
  37. package/dist/planRun.d.ts.map +1 -1
  38. package/dist/planRun.js +88 -42
  39. package/dist/planRun.js.map +1 -1
  40. package/dist/planTerminal.d.ts +36 -0
  41. package/dist/planTerminal.d.ts.map +1 -0
  42. package/dist/planTerminal.js +63 -0
  43. package/dist/planTerminal.js.map +1 -0
  44. package/dist/runSupport.d.ts +50 -2
  45. package/dist/runSupport.d.ts.map +1 -1
  46. package/dist/runSupport.js +60 -6
  47. package/dist/runSupport.js.map +1 -1
  48. package/dist/runTelemetryWriter.d.ts +6 -1
  49. package/dist/runTelemetryWriter.d.ts.map +1 -1
  50. package/dist/runTelemetryWriter.js +2 -0
  51. package/dist/runTelemetryWriter.js.map +1 -1
  52. package/dist/runTerminals.d.ts +15 -4
  53. package/dist/runTerminals.d.ts.map +1 -1
  54. package/dist/runTerminals.js +16 -1
  55. package/dist/runTerminals.js.map +1 -1
  56. package/dist/structuredOutput.d.ts +27 -0
  57. package/dist/structuredOutput.d.ts.map +1 -1
  58. package/dist/structuredOutput.js +65 -7
  59. package/dist/structuredOutput.js.map +1 -1
  60. package/dist/transientClassify.d.ts +59 -0
  61. package/dist/transientClassify.d.ts.map +1 -0
  62. package/dist/transientClassify.js +109 -0
  63. package/dist/transientClassify.js.map +1 -0
  64. package/package.json +17 -17
@@ -0,0 +1,162 @@
1
+ /**
2
+ * D-16 unified attempt finalizer.
3
+ *
4
+ * ONE owner for the "did this attempt deliver, and in what work_state?" decision
5
+ * — replacing the three divergent deliverable predicates (candidate diff||answer;
6
+ * planner no-error⇒delivered; read-only nonempty-report). It folds the raw
7
+ * intent-specific deliverable evidence with the model-authored WorkReport, the
8
+ * typed context signals, the harness error state, and the gates into:
9
+ * - a final `deliverablePresent`,
10
+ * - a `work_state` axis (orthogonal to lifecycle, INV-116),
11
+ * - a typed reason,
12
+ * - and the class of outcome (clean / veto / contract-failure / interrupted).
13
+ *
14
+ * The module is PURE (no I/O, no clock). The envelope compile/unwrap helpers
15
+ * live here too so the spec-build decision and the finalizer read one contract.
16
+ */
17
+ import { WorkReport, type HarnessCapabilities, type RunReason, type WorkReportSource, type WorkState } from "@claudexor/schema";
18
+ /**
19
+ * How the WorkReport rides the wire for an active envelope (D-16c):
20
+ * - `constrained_json`: the whole final answer IS the `{work_report, output}`
21
+ * JSON (codex `--output-schema`; claude `--json-schema` WITH a caller schema).
22
+ * - `side_tool`: a `{work_report}`-only schema arms claude's StructuredOutput
23
+ * TOOL; the markdown final message stays the deliverable and the report rides
24
+ * the tool payload (surfaced on the final message's `work_report_side_tool`).
25
+ * - `instructed_fence`: no native constraint — the model is INSTRUCTED to end
26
+ * its answer with a fenced `{work_report, output}` JSON block, validated off
27
+ * the last fenced JSON (cursor).
28
+ */
29
+ export type WorkReportChannel = "constrained_json" | "side_tool" | "instructed_fence";
30
+ /** The per-attempt envelope decision made at spec build and consumed by the
31
+ * unwrap. `active` means the orchestrator actually armed a WorkReport transport
32
+ * for this route, so a missing/malformed report is a typed contract failure. */
33
+ export interface WorkReportEnvelopeMode {
34
+ active: boolean;
35
+ source: WorkReportSource;
36
+ hasCallerSchema: boolean;
37
+ channel: WorkReportChannel;
38
+ /** Instruction to APPEND to the spec (instructed_fence only); null otherwise. */
39
+ instruction: string | null;
40
+ }
41
+ /**
42
+ * The instruction appended to an `instructed_fence` (cursor) route so the model
43
+ * emits the WorkReport envelope the finalizer validates. No native schema
44
+ * constrains cursor, so the contract is instructed and validated off the last
45
+ * fenced JSON block (D-16c). The `output` string carries the deliverable prose.
46
+ */
47
+ export declare const WORK_REPORT_FENCE_INSTRUCTION: string;
48
+ /** Result of the spec-build envelope decision. */
49
+ export interface ResolvedWorkReportEnvelope {
50
+ /** What rides HarnessRunSpec.output_schema (undefined = leave unset). */
51
+ outputSchema: Record<string, unknown> | undefined;
52
+ mode: WorkReportEnvelopeMode;
53
+ }
54
+ /**
55
+ * Decide the transport envelope for one route at spec build (D-16 §2). The
56
+ * caller's ORIGINAL schema stays the conformance authority for `output` (it is
57
+ * NOT passed here strictified for validation — only the transport copy is).
58
+ *
59
+ * Activated HERE directly for `constrained` routes that natively constrain
60
+ * output and are not interactive-gated (the WorkReport rides the
61
+ * `{work_report, output}` envelope; claude's no-caller `side_tool` case instead
62
+ * arms a `{work_report}`-only schema on the StructuredOutput tool so the markdown
63
+ * final stays the deliverable — the D-16c seam), and for `validated` routes
64
+ * (cursor), where the report rides an INSTRUCTED fenced envelope. Only
65
+ * interactive-gated and schema-incapable routes stay inactive here (disclosed
66
+ * `absent` work_state).
67
+ */
68
+ export declare function resolveWorkReportEnvelope(opts: {
69
+ transport: HarnessCapabilities["work_report_transport"];
70
+ channel: HarnessCapabilities["structured_output_channel"];
71
+ supportsJsonSchemaOutput: boolean;
72
+ interactive: boolean;
73
+ callerSchema: Record<string, unknown> | null;
74
+ }): ResolvedWorkReportEnvelope;
75
+ /** The unwrapped attempt answer plus the extracted WorkReport (or a typed
76
+ * contract violation). `deliverable` is what answer.md / the caller-schema
77
+ * validator must see — never the envelope. */
78
+ export interface UnwrappedAnswer {
79
+ deliverable: string;
80
+ workReport: WorkReport | null;
81
+ source: WorkReportSource;
82
+ /** Non-null when an active route failed to carry a valid WorkReport. */
83
+ contractViolation: string | null;
84
+ }
85
+ /**
86
+ * Un-nest the WorkReport envelope from an active route's answer (D-16 §2). The
87
+ * behavior forks on `mode.channel`:
88
+ * - `constrained_json`: the whole answer IS `{work_report, output}` JSON.
89
+ * - `instructed_fence`: the envelope is the LAST fenced JSON block; prose
90
+ * before it is discarded (the `output` string is the deliverable).
91
+ * - `side_tool`: the answer text IS the markdown deliverable; the report rides
92
+ * `opts.sideToolReport` (the tool payload the adapter surfaced).
93
+ * A non-active mode passes the answer through untouched. The WorkReport
94
+ * cross-field rules (completed ⇒ no required_inputs; needs_input ⇒ ≥1) are
95
+ * enforced HERE so a broken report is a typed contract violation.
96
+ *
97
+ * For a `constrained_json` route `answerText` is the raw `{work_report, output}`
98
+ * envelope (codex #19816 / QA-009: the orchestrator passes `answer.machineText()`,
99
+ * which yields the raw envelope even when the codex adapter pre-unwrapped the
100
+ * DISPLAY copy of the final message — the visible stream sees the output, the
101
+ * un-nest here still sees the envelope).
102
+ */
103
+ export declare function unwrapWorkReportEnvelope(answerText: string, mode: WorkReportEnvelopeMode, opts?: {
104
+ sideToolReport?: unknown;
105
+ }): UnwrappedAnswer;
106
+ /**
107
+ * QA-036: the terminal outcome facts for a read-only (ask) run that produced NO
108
+ * successful attempt. The D8 legacy mapping treated ANY web-blocked run as a
109
+ * succeeded/review_blocked terminal (exit 0, "Needs review"); a blocked Ask that
110
+ * delivered nothing then read as done. This re-checks the DELIVERABLE: only a
111
+ * blocked attempt that actually produced a partial answer is a review-blocked
112
+ * SUCCESS; an empty blocked (or plain failed) run is a failure (exit 1).
113
+ */
114
+ export declare function readOnlyNoSuccessTerminal(opts: {
115
+ webBlocked: boolean;
116
+ hasDeliverable: boolean;
117
+ budgetStopped: boolean;
118
+ attemptsCount: number;
119
+ }): {
120
+ lifecycle: "succeeded" | "failed";
121
+ review?: "blocked";
122
+ reason: RunReason;
123
+ };
124
+ /** Everything the finalizer folds for one attempt. The gate/web/belt axes are
125
+ * NOT folded here — the finalizer decides deliverable+work_state, and
126
+ * `setAttemptOutcome` runs the status math over gates/web/belt on top (so a
127
+ * `completed` claim with a failed gate still yields a failed status there). */
128
+ export interface FinalizeAttemptInput {
129
+ /** Raw intent-specific deliverable evidence (diff/answer/report present). */
130
+ deliverableEvidence: boolean;
131
+ harnessErrored: boolean;
132
+ workReport: WorkReport | null;
133
+ workReportSource: WorkReportSource;
134
+ /** Non-null when an active route failed its WorkReport contract. */
135
+ workReportViolation: string | null;
136
+ /** A terminal capacity_exhausted context signal was observed this attempt. */
137
+ contextTerminalExhausted: boolean;
138
+ }
139
+ /** Outcome class the run-level terminal maps onto lifecycle/facts. */
140
+ export type AttemptOutcomeClass = "clean" | "veto" | "contract_failure" | "interrupted";
141
+ export interface FinalizeAttemptResult {
142
+ /** Final deliverable presence (a completed claim never invents evidence). */
143
+ deliverablePresent: boolean;
144
+ /** Final harness-error state (a contract failure elevates it). */
145
+ harnessErrored: boolean;
146
+ workState: WorkState;
147
+ /** Typed reason for the veto/failure; null on a clean outcome. */
148
+ reason: RunReason | null;
149
+ outcomeClass: AttemptOutcomeClass;
150
+ }
151
+ /**
152
+ * The unified finalizer. Precedence (hardest signal wins):
153
+ * 1. terminal context exhaustion with no completed report ⇒ interrupted;
154
+ * 2. a broken WorkReport contract on a constrained route ⇒ hard failure
155
+ * (never prose-success);
156
+ * 3. a valid needs_input/incomplete report ⇒ veto (lifecycle stays, run is
157
+ * non-applyable, exit non-zero) — a `completed` claim NEVER overrides a
158
+ * harness error / failed gate / missing evidence;
159
+ * 4. otherwise the disclosed work_state (completed or unverified).
160
+ */
161
+ export declare function finalizeAttempt(input: FinalizeAttemptInput): FinalizeAttemptResult;
162
+ //# sourceMappingURL=attemptFinalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attemptFinalize.d.ts","sourceRoot":"","sources":["../src/attemptFinalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,368 @@
1
+ /**
2
+ * D-16 unified attempt finalizer.
3
+ *
4
+ * ONE owner for the "did this attempt deliver, and in what work_state?" decision
5
+ * — replacing the three divergent deliverable predicates (candidate diff||answer;
6
+ * planner no-error⇒delivered; read-only nonempty-report). It folds the raw
7
+ * intent-specific deliverable evidence with the model-authored WorkReport, the
8
+ * typed context signals, the harness error state, and the gates into:
9
+ * - a final `deliverablePresent`,
10
+ * - a `work_state` axis (orthogonal to lifecycle, INV-116),
11
+ * - a typed reason,
12
+ * - and the class of outcome (clean / veto / contract-failure / interrupted).
13
+ *
14
+ * The module is PURE (no I/O, no clock). The envelope compile/unwrap helpers
15
+ * live here too so the spec-build decision and the finalizer read one contract.
16
+ */
17
+ import { buildWorkReportEnvelope, strictifyOutputSchema, WorkReport, } from "@claudexor/schema";
18
+ import { redactSecrets } from "@claudexor/util";
19
+ /**
20
+ * The instruction appended to an `instructed_fence` (cursor) route so the model
21
+ * emits the WorkReport envelope the finalizer validates. No native schema
22
+ * constrains cursor, so the contract is instructed and validated off the last
23
+ * fenced JSON block (D-16c). The `output` string carries the deliverable prose.
24
+ */
25
+ export const WORK_REPORT_FENCE_INSTRUCTION = [
26
+ "When you have finished, end your reply with a single fenced ```json code block",
27
+ "containing exactly this object and nothing after it:",
28
+ '{"work_report": {"state": "completed" | "needs_input" | "incomplete",',
29
+ '"required_inputs": [{"kind": "file"|"context"|"credential"|"permission"|"decision"|"external_dependency",',
30
+ '"locator": string|null, "description": string}]}, "output": "<your final answer as a string>"}.',
31
+ 'Use state "completed" only when the task is fully done with an empty required_inputs list;',
32
+ 'use "needs_input" (with at least one required_inputs entry) when you are blocked on a missing input;',
33
+ 'use "incomplete" when partial work remains. This block is mandatory.',
34
+ ].join(" ");
35
+ /**
36
+ * Decide the transport envelope for one route at spec build (D-16 §2). The
37
+ * caller's ORIGINAL schema stays the conformance authority for `output` (it is
38
+ * NOT passed here strictified for validation — only the transport copy is).
39
+ *
40
+ * Activated HERE directly for `constrained` routes that natively constrain
41
+ * output and are not interactive-gated (the WorkReport rides the
42
+ * `{work_report, output}` envelope; claude's no-caller `side_tool` case instead
43
+ * arms a `{work_report}`-only schema on the StructuredOutput tool so the markdown
44
+ * final stays the deliverable — the D-16c seam), and for `validated` routes
45
+ * (cursor), where the report rides an INSTRUCTED fenced envelope. Only
46
+ * interactive-gated and schema-incapable routes stay inactive here (disclosed
47
+ * `absent` work_state).
48
+ */
49
+ export function resolveWorkReportEnvelope(opts) {
50
+ const hasCallerSchema = opts.callerSchema !== null;
51
+ const callerStrict = hasCallerSchema
52
+ ? strictifyOutputSchema(opts.callerSchema)
53
+ : null;
54
+ // claude's `--json-schema` × interactive stream-json is an unverified combo:
55
+ // disclose the WorkReport transport as unsupported for that lane (§1).
56
+ const interactiveGated = opts.channel === "side_tool" && opts.interactive;
57
+ // `validated` transport (cursor): no native schema constrains the output —
58
+ // the WorkReport rides an INSTRUCTED fenced envelope validated off the last
59
+ // fenced JSON (D-16c). Caller schemas on such routes were already refused by
60
+ // the mandatory-schema gate upstream, so this is the WorkReport-only case.
61
+ if (opts.transport === "validated" && !interactiveGated) {
62
+ return {
63
+ outputSchema: callerStrict ?? undefined,
64
+ mode: {
65
+ active: true,
66
+ source: "validated",
67
+ hasCallerSchema,
68
+ channel: "instructed_fence",
69
+ instruction: WORK_REPORT_FENCE_INSTRUCTION,
70
+ },
71
+ };
72
+ }
73
+ const active = opts.transport === "constrained" && opts.supportsJsonSchemaOutput && !interactiveGated;
74
+ if (active) {
75
+ // claude side_tool WITHOUT a caller schema (D-16c): arm a {work_report}-only
76
+ // schema on the StructuredOutput tool; the markdown final message stays the
77
+ // deliverable and the report rides the tool payload. Every other constrained
78
+ // case carries the output INSIDE the `{work_report, output}` envelope
79
+ // (caller schema → the strict S; no-caller final_message → output:string).
80
+ if (opts.channel === "side_tool" && !hasCallerSchema) {
81
+ return {
82
+ outputSchema: buildWorkReportEnvelope(null),
83
+ mode: {
84
+ active: true,
85
+ source: "constrained",
86
+ hasCallerSchema,
87
+ channel: "side_tool",
88
+ instruction: null,
89
+ },
90
+ };
91
+ }
92
+ const output = hasCallerSchema
93
+ ? callerStrict
94
+ : "string";
95
+ return {
96
+ outputSchema: buildWorkReportEnvelope(output),
97
+ mode: {
98
+ active: true,
99
+ source: "constrained",
100
+ hasCallerSchema,
101
+ channel: "constrained_json",
102
+ instruction: null,
103
+ },
104
+ };
105
+ }
106
+ return {
107
+ // Legacy path preserved: a caller schema still rides (strictified) on a
108
+ // non-activated route (the mandatory-schema gate already refused
109
+ // schema-incapable routes upstream).
110
+ outputSchema: callerStrict ?? undefined,
111
+ mode: {
112
+ active: false,
113
+ source: "absent",
114
+ hasCallerSchema,
115
+ channel: "constrained_json",
116
+ instruction: null,
117
+ },
118
+ };
119
+ }
120
+ function extractOutput(obj, mode) {
121
+ const output = obj["output"];
122
+ if (mode.hasCallerSchema) {
123
+ // Re-serialize the S-conformant object so finalizeStructuredOutput can
124
+ // JSON.parse + validate it against the caller schema (the caller schema is
125
+ // the conformance authority for `output`, so any shape rides through here).
126
+ return { deliverable: output === undefined ? "" : JSON.stringify(output) };
127
+ }
128
+ // No caller schema: `output` MUST be a string deliverable. A non-string
129
+ // (object/array/null/number/bool) or missing `output` is a BROKEN envelope —
130
+ // coercing it (String({...}) => "[object Object]") would let a bogus payload
131
+ // like {"work_report":{"state":"completed"},"output":{}} finalize CLEAN
132
+ // instead of failing the WorkReport contract. Fail it here (D-16 §2).
133
+ if (typeof output !== "string") {
134
+ return { violation: "work_report envelope output must be a string" };
135
+ }
136
+ return { deliverable: output };
137
+ }
138
+ /** Extract the LAST fenced ```…``` block's body (its optional language tag
139
+ * stripped), or null when the text has no closed fence. No-regex, mechanical
140
+ * transport parsing (INV-049 governs the typed WorkReport, not this seam). */
141
+ function lastFencedBlock(text) {
142
+ const FENCE = "```";
143
+ const end = text.lastIndexOf(FENCE);
144
+ if (end <= 0)
145
+ return null;
146
+ const start = text.lastIndexOf(FENCE, end - 1);
147
+ if (start < 0)
148
+ return null;
149
+ let inner = text.slice(start + FENCE.length, end);
150
+ const nl = inner.indexOf("\n");
151
+ if (nl >= 0) {
152
+ const firstLine = inner.slice(0, nl).trim();
153
+ // A bare language tag (letters/digits/±_-, no whitespace) on the opening
154
+ // line is dropped; a first line that is already JSON content is kept.
155
+ const isLangTag = firstLine.length > 0 &&
156
+ firstLine.length <= 20 &&
157
+ ![...firstLine].some((ch) => ch === " " || ch === "{" || ch === "[" || ch === '"');
158
+ if (firstLine === "" || isLangTag)
159
+ inner = inner.slice(nl + 1);
160
+ }
161
+ return inner.trim();
162
+ }
163
+ /**
164
+ * Un-nest the WorkReport envelope from an active route's answer (D-16 §2). The
165
+ * behavior forks on `mode.channel`:
166
+ * - `constrained_json`: the whole answer IS `{work_report, output}` JSON.
167
+ * - `instructed_fence`: the envelope is the LAST fenced JSON block; prose
168
+ * before it is discarded (the `output` string is the deliverable).
169
+ * - `side_tool`: the answer text IS the markdown deliverable; the report rides
170
+ * `opts.sideToolReport` (the tool payload the adapter surfaced).
171
+ * A non-active mode passes the answer through untouched. The WorkReport
172
+ * cross-field rules (completed ⇒ no required_inputs; needs_input ⇒ ≥1) are
173
+ * enforced HERE so a broken report is a typed contract violation.
174
+ *
175
+ * For a `constrained_json` route `answerText` is the raw `{work_report, output}`
176
+ * envelope (codex #19816 / QA-009: the orchestrator passes `answer.machineText()`,
177
+ * which yields the raw envelope even when the codex adapter pre-unwrapped the
178
+ * DISPLAY copy of the final message — the visible stream sees the output, the
179
+ * un-nest here still sees the envelope).
180
+ */
181
+ export function unwrapWorkReportEnvelope(answerText, mode, opts = {}) {
182
+ if (!mode.active) {
183
+ return {
184
+ deliverable: answerText,
185
+ workReport: null,
186
+ source: mode.source,
187
+ contractViolation: null,
188
+ };
189
+ }
190
+ // side_tool: the markdown answer stays the deliverable; the report is the tool
191
+ // payload. A missing/malformed tool report is a typed contract failure.
192
+ if (mode.channel === "side_tool") {
193
+ if (opts.sideToolReport === undefined) {
194
+ return {
195
+ deliverable: answerText,
196
+ workReport: null,
197
+ source: mode.source,
198
+ contractViolation: "the StructuredOutput tool did not carry a work_report",
199
+ };
200
+ }
201
+ return validateWorkReport(answerText, opts.sideToolReport, mode.source);
202
+ }
203
+ let text = answerText.trim();
204
+ if (mode.channel === "instructed_fence") {
205
+ const fenced = lastFencedBlock(answerText);
206
+ if (fenced === null) {
207
+ return {
208
+ deliverable: answerText,
209
+ workReport: null,
210
+ source: mode.source,
211
+ contractViolation: "final answer has no fenced work_report envelope",
212
+ };
213
+ }
214
+ text = fenced;
215
+ }
216
+ let parsed;
217
+ try {
218
+ parsed = JSON.parse(text);
219
+ }
220
+ catch {
221
+ return {
222
+ deliverable: answerText,
223
+ workReport: null,
224
+ source: mode.source,
225
+ contractViolation: "final answer is not the JSON work_report envelope",
226
+ };
227
+ }
228
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
229
+ return {
230
+ deliverable: answerText,
231
+ workReport: null,
232
+ source: mode.source,
233
+ contractViolation: "work_report envelope is not a JSON object",
234
+ };
235
+ }
236
+ const obj = parsed;
237
+ const extracted = extractOutput(obj, mode);
238
+ if ("violation" in extracted) {
239
+ return {
240
+ deliverable: answerText,
241
+ workReport: null,
242
+ source: mode.source,
243
+ contractViolation: extracted.violation,
244
+ };
245
+ }
246
+ return validateWorkReport(extracted.deliverable, obj["work_report"], mode.source);
247
+ }
248
+ /** Parse + cross-field-validate a raw work_report value against a resolved
249
+ * deliverable. The cross-field rules (completed ⇒ no required_inputs;
250
+ * needs_input ⇒ ≥1) live HERE, not on the permissive Zod wire type. */
251
+ function validateWorkReport(deliverable, rawReport, source) {
252
+ const wr = WorkReport.safeParse(rawReport);
253
+ if (!wr.success) {
254
+ return {
255
+ deliverable,
256
+ workReport: null,
257
+ source,
258
+ contractViolation: `work_report missing or malformed: ${wr.error.issues[0]?.message ?? "invalid"}`,
259
+ };
260
+ }
261
+ // ONE redaction owner for every WorkReport transport: the model-authored
262
+ // locator/description strings flow VERBATIM into telemetry yaml, decision
263
+ // facts, and the CLI needsInputLabel — the last reads the local artifact and
264
+ // bypasses serve-time redaction — so a token pasted into a required_input
265
+ // would otherwise persist unredacted at rest. Redact here, before the report
266
+ // is handed to any of them. (The cross-field checks below read only state and
267
+ // list length, so redaction order does not affect them.)
268
+ const report = {
269
+ ...wr.data,
270
+ required_inputs: wr.data.required_inputs.map((ri) => ({
271
+ ...ri,
272
+ locator: ri.locator === null ? null : redactSecrets(ri.locator),
273
+ description: redactSecrets(ri.description),
274
+ })),
275
+ };
276
+ if (report.state === "completed" && report.required_inputs.length > 0) {
277
+ return {
278
+ deliverable,
279
+ workReport: null,
280
+ source,
281
+ contractViolation: "a completed work_report must not list required_inputs",
282
+ };
283
+ }
284
+ if (report.state === "needs_input" && report.required_inputs.length === 0) {
285
+ return {
286
+ deliverable,
287
+ workReport: null,
288
+ source,
289
+ contractViolation: "a needs_input work_report must list at least one required_input",
290
+ };
291
+ }
292
+ return { deliverable, workReport: report, source, contractViolation: null };
293
+ }
294
+ /**
295
+ * QA-036: the terminal outcome facts for a read-only (ask) run that produced NO
296
+ * successful attempt. The D8 legacy mapping treated ANY web-blocked run as a
297
+ * succeeded/review_blocked terminal (exit 0, "Needs review"); a blocked Ask that
298
+ * delivered nothing then read as done. This re-checks the DELIVERABLE: only a
299
+ * blocked attempt that actually produced a partial answer is a review-blocked
300
+ * SUCCESS; an empty blocked (or plain failed) run is a failure (exit 1).
301
+ */
302
+ export function readOnlyNoSuccessTerminal(opts) {
303
+ if (opts.webBlocked && opts.hasDeliverable) {
304
+ return { lifecycle: "succeeded", review: "blocked", reason: "review_blocked" };
305
+ }
306
+ if (opts.budgetStopped && opts.attemptsCount === 0) {
307
+ return { lifecycle: "failed", reason: "budget_exhausted" };
308
+ }
309
+ return { lifecycle: "failed", reason: "harness_failed" };
310
+ }
311
+ /**
312
+ * The unified finalizer. Precedence (hardest signal wins):
313
+ * 1. terminal context exhaustion with no completed report ⇒ interrupted;
314
+ * 2. a broken WorkReport contract on a constrained route ⇒ hard failure
315
+ * (never prose-success);
316
+ * 3. a valid needs_input/incomplete report ⇒ veto (lifecycle stays, run is
317
+ * non-applyable, exit non-zero) — a `completed` claim NEVER overrides a
318
+ * harness error / failed gate / missing evidence;
319
+ * 4. otherwise the disclosed work_state (completed or unverified).
320
+ */
321
+ export function finalizeAttempt(input) {
322
+ const completed = input.workReport?.state === "completed";
323
+ if (input.contextTerminalExhausted && !completed) {
324
+ return {
325
+ deliverablePresent: input.deliverableEvidence,
326
+ harnessErrored: input.harnessErrored,
327
+ workState: { state: "unverified", source: input.workReportSource },
328
+ reason: "context_capacity_exhausted",
329
+ outcomeClass: "interrupted",
330
+ };
331
+ }
332
+ if (input.workReportViolation) {
333
+ return {
334
+ deliverablePresent: false,
335
+ // A constrained route that promised a WorkReport and broke the contract
336
+ // failed the attempt — it must never terminalize as a prose success.
337
+ harnessErrored: true,
338
+ workState: { state: "unverified", source: input.workReportSource },
339
+ reason: "work_report_contract",
340
+ outcomeClass: "contract_failure",
341
+ };
342
+ }
343
+ const report = input.workReport;
344
+ if (report && (report.state === "needs_input" || report.state === "incomplete")) {
345
+ return {
346
+ deliverablePresent: input.deliverableEvidence,
347
+ harnessErrored: input.harnessErrored,
348
+ workState: {
349
+ state: report.state,
350
+ source: input.workReportSource,
351
+ ...(report.required_inputs.length > 0 ? { required_inputs: report.required_inputs } : {}),
352
+ },
353
+ reason: report.state === "needs_input" ? "input_required" : "work_incomplete",
354
+ outcomeClass: "veto",
355
+ };
356
+ }
357
+ return {
358
+ deliverablePresent: input.deliverableEvidence,
359
+ harnessErrored: input.harnessErrored,
360
+ workState: {
361
+ state: report?.state === "completed" ? "completed" : "unverified",
362
+ source: report ? input.workReportSource : "absent",
363
+ },
364
+ reason: null,
365
+ outcomeClass: "clean",
366
+ };
367
+ }
368
+ //# sourceMappingURL=attemptFinalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attemptFinalize.js","sourceRoot":"","sources":["../src/attemptFinalize.ts"],"names":[],"mappings":"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"}