@claudexor/orchestrator 3.1.1 → 3.2.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 (173) hide show
  1. package/dist/attemptFinalize.d.ts +14 -11
  2. package/dist/attemptFinalize.d.ts.map +1 -1
  3. package/dist/attemptFinalize.js +41 -14
  4. package/dist/attemptFinalize.js.map +1 -1
  5. package/dist/attemptTelemetry.d.ts +16 -20
  6. package/dist/attemptTelemetry.d.ts.map +1 -1
  7. package/dist/attemptTelemetry.js +38 -70
  8. package/dist/attemptTelemetry.js.map +1 -1
  9. package/dist/attemptUsageCost.d.ts +47 -0
  10. package/dist/attemptUsageCost.d.ts.map +1 -0
  11. package/dist/attemptUsageCost.js +191 -0
  12. package/dist/attemptUsageCost.js.map +1 -0
  13. package/dist/budgetFailure.d.ts +3 -1
  14. package/dist/budgetFailure.d.ts.map +1 -1
  15. package/dist/budgetFailure.js.map +1 -1
  16. package/dist/candidateEvidence.d.ts +5 -0
  17. package/dist/candidateEvidence.d.ts.map +1 -1
  18. package/dist/candidateEvidence.js +3 -1
  19. package/dist/candidateEvidence.js.map +1 -1
  20. package/dist/candidateOutputs.d.ts +19 -0
  21. package/dist/candidateOutputs.d.ts.map +1 -1
  22. package/dist/candidateOutputs.js +201 -67
  23. package/dist/candidateOutputs.js.map +1 -1
  24. package/dist/credential-profile-rotation.d.ts +145 -0
  25. package/dist/credential-profile-rotation.d.ts.map +1 -0
  26. package/dist/credential-profile-rotation.js +315 -0
  27. package/dist/credential-profile-rotation.js.map +1 -0
  28. package/dist/credential-profiles.d.ts +35 -134
  29. package/dist/credential-profiles.d.ts.map +1 -1
  30. package/dist/credential-profiles.js +73 -295
  31. package/dist/credential-profiles.js.map +1 -1
  32. package/dist/decisionBudget.d.ts +43 -0
  33. package/dist/decisionBudget.d.ts.map +1 -0
  34. package/dist/decisionBudget.js +84 -0
  35. package/dist/decisionBudget.js.map +1 -0
  36. package/dist/decisionTerminalReconciliation.d.ts +18 -0
  37. package/dist/decisionTerminalReconciliation.d.ts.map +1 -0
  38. package/dist/decisionTerminalReconciliation.js +26 -0
  39. package/dist/decisionTerminalReconciliation.js.map +1 -0
  40. package/dist/deepScanReducer.d.ts +14 -44
  41. package/dist/deepScanReducer.d.ts.map +1 -1
  42. package/dist/deepScanReducer.js +240 -128
  43. package/dist/deepScanReducer.js.map +1 -1
  44. package/dist/delegation-parent-activation.d.ts +6 -0
  45. package/dist/delegation-parent-activation.d.ts.map +1 -0
  46. package/dist/delegation-parent-activation.js +13 -0
  47. package/dist/delegation-parent-activation.js.map +1 -0
  48. package/dist/delegationBudgetAuthority.d.ts +30 -0
  49. package/dist/delegationBudgetAuthority.d.ts.map +1 -0
  50. package/dist/delegationBudgetAuthority.js +157 -0
  51. package/dist/delegationBudgetAuthority.js.map +1 -0
  52. package/dist/delegationFailure.d.ts +58 -0
  53. package/dist/delegationFailure.d.ts.map +1 -0
  54. package/dist/delegationFailure.js +184 -0
  55. package/dist/delegationFailure.js.map +1 -0
  56. package/dist/delegationToolEvidence.d.ts +20 -0
  57. package/dist/delegationToolEvidence.d.ts.map +1 -0
  58. package/dist/delegationToolEvidence.js +46 -0
  59. package/dist/delegationToolEvidence.js.map +1 -0
  60. package/dist/git-precondition.d.ts +11 -0
  61. package/dist/git-precondition.d.ts.map +1 -0
  62. package/dist/git-precondition.js +69 -0
  63. package/dist/git-precondition.js.map +1 -0
  64. package/dist/index.d.ts +3 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +3 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/interaction.d.ts +14 -6
  69. package/dist/interaction.d.ts.map +1 -1
  70. package/dist/interaction.js +106 -19
  71. package/dist/interaction.js.map +1 -1
  72. package/dist/orchestrator.d.ts +62 -115
  73. package/dist/orchestrator.d.ts.map +1 -1
  74. package/dist/orchestrator.js +671 -965
  75. package/dist/orchestrator.js.map +1 -1
  76. package/dist/plan-prompt.d.ts +3 -0
  77. package/dist/plan-prompt.d.ts.map +1 -0
  78. package/dist/plan-prompt.js +28 -0
  79. package/dist/plan-prompt.js.map +1 -0
  80. package/dist/planBrief.d.ts +27 -0
  81. package/dist/planBrief.d.ts.map +1 -0
  82. package/dist/planBrief.js +42 -0
  83. package/dist/planBrief.js.map +1 -0
  84. package/dist/planRun.d.ts +4 -3
  85. package/dist/planRun.d.ts.map +1 -1
  86. package/dist/planRun.js +33 -33
  87. package/dist/planRun.js.map +1 -1
  88. package/dist/plannerAttempt.d.ts +64 -0
  89. package/dist/plannerAttempt.d.ts.map +1 -0
  90. package/dist/plannerAttempt.js +235 -0
  91. package/dist/plannerAttempt.js.map +1 -0
  92. package/dist/policyFindings.js.map +1 -1
  93. package/dist/requestRequirements.d.ts +45 -1
  94. package/dist/requestRequirements.d.ts.map +1 -1
  95. package/dist/requestRequirements.js +158 -11
  96. package/dist/requestRequirements.js.map +1 -1
  97. package/dist/reviewerPanel.js.map +1 -1
  98. package/dist/root-ledger.d.ts +13 -0
  99. package/dist/root-ledger.d.ts.map +1 -0
  100. package/dist/root-ledger.js +21 -0
  101. package/dist/root-ledger.js.map +1 -0
  102. package/dist/routing-failure.d.ts +6 -0
  103. package/dist/routing-failure.d.ts.map +1 -0
  104. package/dist/routing-failure.js +12 -0
  105. package/dist/routing-failure.js.map +1 -0
  106. package/dist/run-bounded.d.ts +3 -0
  107. package/dist/run-bounded.d.ts.map +1 -0
  108. package/dist/run-bounded.js +23 -0
  109. package/dist/run-bounded.js.map +1 -0
  110. package/dist/run-input-resolution.d.ts +10 -0
  111. package/dist/run-input-resolution.d.ts.map +1 -0
  112. package/dist/run-input-resolution.js +88 -0
  113. package/dist/run-input-resolution.js.map +1 -0
  114. package/dist/runEventLog.d.ts +48 -0
  115. package/dist/runEventLog.d.ts.map +1 -0
  116. package/dist/runEventLog.js +63 -0
  117. package/dist/runEventLog.js.map +1 -0
  118. package/dist/runFacts.d.ts +23 -0
  119. package/dist/runFacts.d.ts.map +1 -0
  120. package/dist/runFacts.js +179 -0
  121. package/dist/runFacts.js.map +1 -0
  122. package/dist/runFactsBuilder.d.ts +5 -0
  123. package/dist/runFactsBuilder.d.ts.map +1 -0
  124. package/dist/runFactsBuilder.js +412 -0
  125. package/dist/runFactsBuilder.js.map +1 -0
  126. package/dist/runFactsDeliverable.d.ts +13 -0
  127. package/dist/runFactsDeliverable.d.ts.map +1 -0
  128. package/dist/runFactsDeliverable.js +94 -0
  129. package/dist/runFactsDeliverable.js.map +1 -0
  130. package/dist/runFactsPresentation.d.ts +7 -0
  131. package/dist/runFactsPresentation.d.ts.map +1 -0
  132. package/dist/runFactsPresentation.js +113 -0
  133. package/dist/runFactsPresentation.js.map +1 -0
  134. package/dist/runFactsReview.d.ts +7 -0
  135. package/dist/runFactsReview.d.ts.map +1 -0
  136. package/dist/runFactsReview.js +63 -0
  137. package/dist/runFactsReview.js.map +1 -0
  138. package/dist/runSupport.d.ts +17 -15
  139. package/dist/runSupport.d.ts.map +1 -1
  140. package/dist/runSupport.js +16 -0
  141. package/dist/runSupport.js.map +1 -1
  142. package/dist/runTelemetryWriter.d.ts +5 -2
  143. package/dist/runTelemetryWriter.d.ts.map +1 -1
  144. package/dist/runTelemetryWriter.js +72 -1
  145. package/dist/runTelemetryWriter.js.map +1 -1
  146. package/dist/runTerminalContext.d.ts +31 -0
  147. package/dist/runTerminalContext.d.ts.map +1 -0
  148. package/dist/runTerminalContext.js +12 -0
  149. package/dist/runTerminalContext.js.map +1 -0
  150. package/dist/runTerminalResults.d.ts +55 -0
  151. package/dist/runTerminalResults.d.ts.map +1 -0
  152. package/dist/runTerminalResults.js +134 -0
  153. package/dist/runTerminalResults.js.map +1 -0
  154. package/dist/runTerminals.d.ts +8 -57
  155. package/dist/runTerminals.d.ts.map +1 -1
  156. package/dist/runTerminals.js +423 -135
  157. package/dist/runTerminals.js.map +1 -1
  158. package/dist/secretDiff.d.ts +32 -0
  159. package/dist/secretDiff.d.ts.map +1 -0
  160. package/dist/secretDiff.js +140 -0
  161. package/dist/secretDiff.js.map +1 -0
  162. package/dist/structuredOutput.d.ts.map +1 -1
  163. package/dist/structuredOutput.js.map +1 -1
  164. package/dist/task-contract-builder.d.ts +35 -0
  165. package/dist/task-contract-builder.d.ts.map +1 -0
  166. package/dist/task-contract-builder.js +114 -0
  167. package/dist/task-contract-builder.js.map +1 -0
  168. package/dist/terminalOutcome.d.ts +22 -0
  169. package/dist/terminalOutcome.d.ts.map +1 -0
  170. package/dist/terminalOutcome.js +39 -0
  171. package/dist/terminalOutcome.js.map +1 -0
  172. package/dist/transientClassify.js.map +1 -1
  173. package/package.json +17 -17
@@ -0,0 +1,412 @@
1
+ import { join } from "node:path";
2
+ import { deriveApplyEligibility } from "@claudexor/delivery";
3
+ import { CouncilProjection, DecisionRecord, RunTelemetry, SCHEMA_VERSION, TaskContract, WorkProduct, needsDecision, requiredActionsFor, validateRunFactsInvariants, } from "@claudexor/schema";
4
+ import { nowIso, readTextSafe, redactSecrets, sha256 } from "@claudexor/util";
5
+ import { readReviewArtifacts } from "./runFactsReview.js";
6
+ import { canonicalDeliverable } from "./runFactsDeliverable.js";
7
+ import { terminalPresentation } from "./runFactsPresentation.js";
8
+ function parseArtifact(store, path, schema) {
9
+ // Three-state read (fail loudly): a missing canonical artifact is a
10
+ // legitimate absence, but a present-yet-invalid one is corrupted terminal
11
+ // evidence. Returning null for it would silently rewrite contract truth
12
+ // (e.g. a corrupted task.yaml projecting as "gates not configured" in the
13
+ // immutable receipt), so it throws instead and lands in the fail-closed
14
+ // terminal-facts path.
15
+ const raw = store.readYaml(path);
16
+ if (raw === null) {
17
+ if (readTextSafe(path) === null)
18
+ return null;
19
+ throw new Error(`canonical run artifact is not readable YAML: ${path}`);
20
+ }
21
+ const parsed = schema.safeParse(raw);
22
+ if (!parsed.success) {
23
+ const issues = parsed.error.issues
24
+ .slice(0, 3)
25
+ .map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
26
+ .join("; ");
27
+ throw new Error(`canonical run artifact is invalid: ${path} (${issues})`);
28
+ }
29
+ return parsed.data;
30
+ }
31
+ function participantRole(args) {
32
+ if (args.mode === "plan") {
33
+ if (args.mergeAttemptId && args.attemptId === args.mergeAttemptId)
34
+ return "merge";
35
+ return "planner";
36
+ }
37
+ if (args.mode === "ask" && args.hasDeepScanProjection) {
38
+ return args.attemptId === args.reducerAttemptId ? "reducer" : "scout";
39
+ }
40
+ return "candidate";
41
+ }
42
+ function councilRosterEvidence(ctx, council) {
43
+ const events = ctx.log.readAll().events;
44
+ let startedMembers = [];
45
+ const failedByHarness = new Map();
46
+ const draftedHarnessIds = new Set();
47
+ const harnessByAttempt = new Map();
48
+ let mergedEventSeen = false;
49
+ for (const event of events) {
50
+ const payload = event.payload;
51
+ if (event.type === "council.started") {
52
+ const members = payload["members"];
53
+ if (Array.isArray(members)) {
54
+ startedMembers = members.filter((member) => typeof member === "string" && member.length > 0);
55
+ }
56
+ }
57
+ else if (event.type === "council.member.failed") {
58
+ const attemptId = payload["attempt_id"];
59
+ const harnessId = payload["harness_id"];
60
+ if (typeof attemptId === "string" && typeof harnessId === "string") {
61
+ failedByHarness.set(harnessId, attemptId);
62
+ harnessByAttempt.set(attemptId, harnessId);
63
+ }
64
+ }
65
+ else if (event.type === "council.draft") {
66
+ const harnessId = payload["harness_id"];
67
+ if (typeof harnessId === "string")
68
+ draftedHarnessIds.add(harnessId);
69
+ }
70
+ else if (event.type === "harness.started" || event.type === "budget.lease.created") {
71
+ const attemptId = payload["attempt_id"];
72
+ const harnessId = payload["harness_id"];
73
+ if (typeof attemptId === "string" && typeof harnessId === "string") {
74
+ harnessByAttempt.set(attemptId, harnessId);
75
+ }
76
+ }
77
+ else if (event.type === "council.merged") {
78
+ mergedEventSeen = true;
79
+ }
80
+ }
81
+ const memberHarnessIds = startedMembers.length > 0
82
+ ? startedMembers
83
+ : (council?.members.map((member) => member.harnessId) ?? []);
84
+ if (memberHarnessIds.length === 0)
85
+ return null;
86
+ const membershipByHarness = new Map(council?.members.map((member) => [member.harnessId, member]) ?? []);
87
+ const members = memberHarnessIds.map((harnessId, index) => {
88
+ const membership = membershipByHarness.get(harnessId);
89
+ return {
90
+ attemptId: failedByHarness.get(harnessId) ?? `p${String(index + 1).padStart(2, "0")}`,
91
+ harnessId,
92
+ failed: membership?.status === "failed" || failedByHarness.has(harnessId),
93
+ drafted: draftedHarnessIds.has(harnessId) ||
94
+ membership?.status === "drafted" ||
95
+ membership?.status === "merged",
96
+ };
97
+ });
98
+ const mergeAttemptId = council || mergedEventSeen ? `p${String(memberHarnessIds.length + 1).padStart(2, "0")}` : null;
99
+ const primaryHarnessId = council?.members.find((member) => member.role === "primary")?.harnessId ?? null;
100
+ return {
101
+ members,
102
+ mergeAttemptId,
103
+ mergeHarnessId: (mergeAttemptId ? harnessByAttempt.get(mergeAttemptId) : null) ??
104
+ council?.mergedBy ??
105
+ primaryHarnessId,
106
+ mergeFailed: council !== null && council.mergedBy === null,
107
+ };
108
+ }
109
+ function participantsFor(args) {
110
+ const { ctx, mode, telemetry, council } = args;
111
+ const reducerAttemptId = telemetry?.deep_scan_synthesis?.reducer_attempt_id ?? null;
112
+ const hasDeepScanProjection = telemetry?.deep_scan_synthesis != null;
113
+ const councilEvidence = mode === "plan" ? councilRosterEvidence(ctx, council) : null;
114
+ // Stable council ids keep denied pre-spawn lanes role-labelled.
115
+ const mergeAttemptId = councilEvidence?.mergeAttemptId ?? null;
116
+ const attempts = telemetry
117
+ ? telemetry.attempts.map((attempt) => ({
118
+ attempt_id: attempt.attempt_id,
119
+ harness_id: attempt.harness_id,
120
+ role: participantRole({
121
+ mode,
122
+ attemptId: attempt.attempt_id,
123
+ mergeAttemptId,
124
+ reducerAttemptId,
125
+ hasDeepScanProjection,
126
+ }),
127
+ deliverable_present: attempt.outcome.deliverable_present,
128
+ status: attempt.outcome.status,
129
+ }))
130
+ : (() => {
131
+ const started = new Map();
132
+ for (const event of ctx.log.readAll().events) {
133
+ if (event.type !== "harness.started")
134
+ continue;
135
+ const attemptId = event.payload["attempt_id"];
136
+ const harnessId = event.payload["harness_id"];
137
+ if (typeof attemptId === "string" && typeof harnessId === "string") {
138
+ started.set(attemptId, harnessId);
139
+ }
140
+ }
141
+ return [...started].map(([attemptId, harnessId]) => ({
142
+ attempt_id: attemptId,
143
+ harness_id: harnessId,
144
+ role: participantRole({
145
+ mode,
146
+ attemptId,
147
+ mergeAttemptId,
148
+ reducerAttemptId,
149
+ hasDeepScanProjection,
150
+ }),
151
+ deliverable_present: false,
152
+ status: null,
153
+ }));
154
+ })();
155
+ if (councilEvidence) {
156
+ const presentAttemptIds = new Set(attempts.flatMap((attempt) => (attempt.attempt_id ? [attempt.attempt_id] : [])));
157
+ for (const member of councilEvidence.members) {
158
+ if (presentAttemptIds.has(member.attemptId))
159
+ continue;
160
+ attempts.push({
161
+ attempt_id: member.attemptId,
162
+ harness_id: member.harnessId,
163
+ role: "planner",
164
+ deliverable_present: member.drafted,
165
+ status: member.failed ? "failed" : member.drafted ? "success" : null,
166
+ });
167
+ presentAttemptIds.add(member.attemptId);
168
+ }
169
+ if (councilEvidence.mergeAttemptId &&
170
+ councilEvidence.mergeHarnessId &&
171
+ !presentAttemptIds.has(councilEvidence.mergeAttemptId)) {
172
+ attempts.push({
173
+ attempt_id: councilEvidence.mergeAttemptId,
174
+ harness_id: councilEvidence.mergeHarnessId,
175
+ role: "merge",
176
+ deliverable_present: !councilEvidence.mergeFailed,
177
+ status: councilEvidence.mergeFailed ? "failed" : "success",
178
+ });
179
+ }
180
+ const councilOrder = new Map([
181
+ ...councilEvidence.members.map((member) => member.attemptId),
182
+ ...(councilEvidence.mergeAttemptId ? [councilEvidence.mergeAttemptId] : []),
183
+ ].map((attemptId, index) => [attemptId, index]));
184
+ attempts.sort((left, right) => (left.attempt_id
185
+ ? (councilOrder.get(left.attempt_id) ?? Number.MAX_SAFE_INTEGER)
186
+ : Number.MAX_SAFE_INTEGER) -
187
+ (right.attempt_id
188
+ ? (councilOrder.get(right.attempt_id) ?? Number.MAX_SAFE_INTEGER)
189
+ : Number.MAX_SAFE_INTEGER));
190
+ }
191
+ for (const harnessId of args.reviewerHarnessIds) {
192
+ attempts.push({
193
+ attempt_id: null,
194
+ harness_id: harnessId,
195
+ role: "reviewer",
196
+ deliverable_present: false,
197
+ status: null,
198
+ });
199
+ }
200
+ return attempts;
201
+ }
202
+ function gateReceipts(ctx) {
203
+ const receipts = [];
204
+ for (const event of ctx.log.readAll().events) {
205
+ if (event.type !== "gate.completed")
206
+ continue;
207
+ const payload = event.payload;
208
+ const attemptId = payload["attempt_id"];
209
+ const rawGates = payload["gates"];
210
+ if (typeof attemptId !== "string" || !Array.isArray(rawGates))
211
+ continue;
212
+ const gates = [];
213
+ for (const raw of rawGates) {
214
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
215
+ continue;
216
+ const record = raw;
217
+ if (typeof record["id"] !== "string" || typeof record["status"] !== "string")
218
+ continue;
219
+ gates.push({ id: record["id"], status: record["status"] });
220
+ }
221
+ receipts.push({ attemptId, gates });
222
+ }
223
+ return receipts;
224
+ }
225
+ function terminalGateReceipt(ctx, telemetry, decision, producerAttemptId) {
226
+ const receipts = gateReceipts(ctx);
227
+ if (decision?.final_verify?.attempted) {
228
+ const emitted = [...receipts]
229
+ .reverse()
230
+ .find((candidate) => candidate.attemptId === "final-verify");
231
+ if (emitted)
232
+ return emitted;
233
+ // An attempted final verify is authoritative even with no emitted gates.
234
+ return {
235
+ attemptId: "final-verify",
236
+ gates: decision.final_verify.gates.map((gate) => ({
237
+ id: gate.id,
238
+ status: gate.status,
239
+ })),
240
+ };
241
+ }
242
+ const authoritativeAttemptId = decision?.winner ?? producerAttemptId ?? telemetry?.final_attempt_id ?? null;
243
+ if (authoritativeAttemptId) {
244
+ // Never promote a losing candidate's gates merely because the winner's
245
+ // receipt is missing. Missing authority fails closed in gateProjection.
246
+ return ([...receipts].reverse().find((candidate) => candidate.attemptId === authoritativeAttemptId) ??
247
+ null);
248
+ }
249
+ return receipts.at(-1) ?? null;
250
+ }
251
+ function gateProjection(ctx, contract, telemetry, decision, producerAttemptId, terminalOutcome) {
252
+ const commands = contract?.tests.commands ?? [];
253
+ if (commands.length === 0) {
254
+ return {
255
+ gates: {
256
+ configured: false,
257
+ required: 0,
258
+ total: 0,
259
+ executed: false,
260
+ state: "not_configured",
261
+ receipt_attempt_id: null,
262
+ },
263
+ // FinalVerifier and the protected live apply are deterministic checks
264
+ // that run even when the contract configures no gates. A fail-closed
265
+ // terminal CHECKS axis wins over the unconfigured default — otherwise a
266
+ // refused delivery would normalize to run.completed and become
267
+ // apply-eligible. gates.* stays honestly not_configured: it describes
268
+ // configured contract gates only.
269
+ checks: terminalOutcome.checks === "failed" ? "failed" : "not_configured",
270
+ };
271
+ }
272
+ const receipt = terminalGateReceipt(ctx, telemetry, decision, producerAttemptId);
273
+ const configuredIds = new Set(commands.map((command) => command.id));
274
+ const observed = new Map((receipt?.gates ?? [])
275
+ .filter((gate) => configuredIds.has(gate.id))
276
+ .map((gate) => [gate.id, gate.status]));
277
+ const allConfiguredObserved = commands.every((command) => observed.has(command.id));
278
+ const allRequiredPassed = commands
279
+ .filter((command) => command.required)
280
+ .every((command) => observed.get(command.id) === "passed");
281
+ if (!receipt || observed.size === 0) {
282
+ return {
283
+ gates: {
284
+ configured: true,
285
+ required: commands.filter((command) => command.required).length,
286
+ total: commands.length,
287
+ executed: false,
288
+ state: "skipped",
289
+ receipt_attempt_id: null,
290
+ },
291
+ // Missing required gate receipts fail closed as skipped.
292
+ checks: "failed",
293
+ };
294
+ }
295
+ const observedState = !allConfiguredObserved
296
+ ? "skipped"
297
+ : allRequiredPassed
298
+ ? "passed"
299
+ : "failed";
300
+ // A protected live delivery can be refused after a fresh verify passed
301
+ // (for example, when the target changes between verification and mutation).
302
+ // The terminal CHECKS axis is then fail-closed even though the now-stale
303
+ // receipt was green. Preserve that terminal truth and mark the receipt
304
+ // non-authoritative instead of greenwashing the blocked outcome.
305
+ const state = observedState === "passed" && terminalOutcome.checks === "failed" ? "skipped" : observedState;
306
+ return {
307
+ gates: {
308
+ configured: true,
309
+ required: commands.filter((command) => command.required).length,
310
+ total: commands.length,
311
+ executed: true,
312
+ state,
313
+ receipt_attempt_id: receipt.attemptId,
314
+ },
315
+ checks: state === "passed" ? "passed" : "failed",
316
+ };
317
+ }
318
+ function applyStateOf(workProduct) {
319
+ const value = workProduct?.meta["apply_state"];
320
+ return value === "not_applied" ||
321
+ value === "applied" ||
322
+ value === "applied_review_blocked" ||
323
+ value === "reverted"
324
+ ? value
325
+ : null;
326
+ }
327
+ /** Build and validate the terminal projection from canonical artifacts. */
328
+ export function buildRunFacts(ctx, terminalOutcome) {
329
+ const contract = parseArtifact(ctx.store, join(ctx.paths.contextDir, "task.yaml"), TaskContract);
330
+ const telemetry = parseArtifact(ctx.store, join(ctx.paths.finalDir, "telemetry.yaml"), RunTelemetry);
331
+ const workProduct = parseArtifact(ctx.store, join(ctx.paths.finalDir, "work_product.yaml"), WorkProduct);
332
+ const decision = parseArtifact(ctx.store, join(ctx.paths.arbitrationDir, "decision.yaml"), DecisionRecord);
333
+ const council = parseArtifact(ctx.store, join(ctx.paths.root, "council", "membership.yaml"), CouncilProjection);
334
+ const operatorDecision = ctx.store.readYaml(join(ctx.paths.arbitrationDir, "operator_decision.yaml"));
335
+ const patch = readTextSafe(join(ctx.paths.finalDir, "patch.diff")) ?? "";
336
+ const operatorDecisionMatchesPatch = !!operatorDecision &&
337
+ patch.trim().length > 0 &&
338
+ (operatorDecision["action"] === "accept_risk" ||
339
+ operatorDecision["action"] === "override_needs_human") &&
340
+ operatorDecision["patch_sha256"] === sha256(patch);
341
+ const deliverable = canonicalDeliverable({
342
+ ctx,
343
+ mode: ctx.mode,
344
+ workProduct,
345
+ telemetry,
346
+ decision,
347
+ });
348
+ const reviews = readReviewArtifacts(ctx, decision?.winner ?? telemetry?.final_attempt_id ?? null);
349
+ const gate = gateProjection(ctx, contract, telemetry, decision, deliverable.producer_attempt_id, terminalOutcome);
350
+ const outcome = {
351
+ ...terminalOutcome,
352
+ checks: gate.checks,
353
+ ...(gate.checks === "failed" && terminalOutcome.lifecycle === "succeeded"
354
+ ? { reason: "checks_failed" }
355
+ : {}),
356
+ };
357
+ const operatorDecisionPresent = operatorDecisionMatchesPatch && needsDecision(outcome, false);
358
+ const participants = participantsFor({
359
+ ctx,
360
+ mode: ctx.mode,
361
+ telemetry,
362
+ council,
363
+ reviewerHarnessIds: reviews.reviewerHarnessIds,
364
+ });
365
+ const decisionWithCanonicalFacts = decision ? { ...decision, facts: outcome } : null;
366
+ const applyEligibility = patch.trim() && contract && decisionWithCanonicalFacts
367
+ ? deriveApplyEligibility({
368
+ state: outcome.lifecycle,
369
+ decision: decisionWithCanonicalFacts,
370
+ workProduct,
371
+ patch,
372
+ originalRepoRoot: contract.repo.root,
373
+ targetRepoRoot: contract.repo.root,
374
+ operatorDecision: operatorDecisionPresent && typeof operatorDecision?.["patch_sha256"] === "string"
375
+ ? {
376
+ action: String(operatorDecision["action"]),
377
+ patch_sha256: operatorDecision["patch_sha256"],
378
+ }
379
+ : null,
380
+ applyState: applyStateOf(workProduct),
381
+ workState: outcome.work_state ?? null,
382
+ })
383
+ : null;
384
+ const rawFacts = {
385
+ schema_version: SCHEMA_VERSION,
386
+ run_id: ctx.runId,
387
+ task_id: ctx.taskId,
388
+ mode: ctx.mode,
389
+ outcome,
390
+ deliverable,
391
+ presentation: terminalPresentation(ctx),
392
+ participants: {
393
+ planners: participants.filter((participant) => participant.role === "planner").length,
394
+ attempts: participants,
395
+ },
396
+ gates: gate.gates,
397
+ review: {
398
+ state: outcome.review,
399
+ blocker_ids: reviews.blockerIds,
400
+ blockers: reviews.blockerIds.length,
401
+ },
402
+ apply: {
403
+ eligibility: applyEligibility,
404
+ operator_decision_present: operatorDecisionPresent,
405
+ },
406
+ required_actions: requiredActionsFor(outcome, operatorDecisionPresent),
407
+ generated_at: nowIso(),
408
+ };
409
+ // Redact once so every surface can preserve exact object identity.
410
+ return validateRunFactsInvariants(JSON.parse(redactSecrets(JSON.stringify(rawFacts))));
411
+ }
412
+ //# sourceMappingURL=runFactsBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runFactsBuilder.js","sourceRoot":"","sources":["../src/runFactsBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DecisionRecord, RunFacts, RunTelemetry, WorkProduct } from "@claudexor/schema";
2
+ import type { AnnouncedRunContext } from "./runTerminals.js";
3
+ import type { OrchestratorResult } from "./orchestrator.js";
4
+ /** The canonical primary deliverable of a terminal run: mode/result-kind
5
+ * ordered candidate paths probed with lstat and a real-content requirement. */
6
+ export declare function canonicalDeliverable(args: {
7
+ ctx: AnnouncedRunContext;
8
+ mode: OrchestratorResult["mode"];
9
+ workProduct: WorkProduct | null;
10
+ telemetry: RunTelemetry | null;
11
+ decision: DecisionRecord | null;
12
+ }): RunFacts["deliverable"];
13
+ //# sourceMappingURL=runFactsDeliverable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runFactsDeliverable.d.ts","sourceRoot":"","sources":["../src/runFactsDeliverable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAU5D;+EAC+E;AAC/E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,GAAG,EAAE,mBAAmB,CAAC;IACzB,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;CACjC,GAAG,QAAQ,CAAC,aAAa,CAAC,CA0F1B"}
@@ -0,0 +1,94 @@
1
+ import { lstatSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { readTextSafe } from "@claudexor/util";
4
+ function lstatOrNull(path) {
5
+ try {
6
+ return lstatSync(path);
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ /** The canonical primary deliverable of a terminal run: mode/result-kind
13
+ * ordered candidate paths probed with lstat and a real-content requirement. */
14
+ export function canonicalDeliverable(args) {
15
+ const candidates = [];
16
+ const structuredOutput = { kind: "structured_output", path: "final/output.json" };
17
+ if (args.mode === "plan") {
18
+ candidates.push({ kind: "plan", path: "final/plan.md" });
19
+ candidates.push(structuredOutput);
20
+ }
21
+ else {
22
+ const resultKind = args.workProduct?.meta["result_kind"];
23
+ if (resultKind === "patch" || args.workProduct?.kind === "patch") {
24
+ // A patch remains the canonical deliverable even when the same run also
25
+ // satisfied a structured-output contract. Apply eligibility is bound to
26
+ // this exact patch; choosing output.json here would manufacture an
27
+ // invariant failure for a valid dual-output run.
28
+ candidates.push({ kind: "patch", path: "final/patch.diff" }, structuredOutput, {
29
+ kind: "answer",
30
+ path: "final/answer.md",
31
+ });
32
+ }
33
+ else if (resultKind === "report") {
34
+ candidates.push(structuredOutput, { kind: "report", path: "final/report.md" }, { kind: "answer", path: "final/answer.md" });
35
+ }
36
+ else {
37
+ candidates.push(structuredOutput, { kind: "answer", path: "final/answer.md" }, { kind: "report", path: "final/report.md" }, { kind: "patch", path: "final/patch.diff" });
38
+ }
39
+ }
40
+ const selected = candidates.find((candidate) => {
41
+ const absolute = join(args.ctx.paths.root, candidate.path);
42
+ // Symmetric with this projection's other fences: lstat (a symlinked
43
+ // stand-in is not a canonical deliverable) and real content for EVERY
44
+ // kind — a zero-byte final/plan.md counted as `present:true` was the core
45
+ // of issue #29's false green.
46
+ const stat = lstatOrNull(absolute);
47
+ if (!stat || stat.isSymbolicLink() || !stat.isFile())
48
+ return false;
49
+ return (readTextSafe(absolute)?.trim().length ?? 0) > 0;
50
+ });
51
+ if (!selected) {
52
+ return {
53
+ present: false,
54
+ kind: null,
55
+ path: null,
56
+ producer_attempt_id: null,
57
+ };
58
+ }
59
+ const producerAttemptId = args.workProduct?.producer_attempt_id ??
60
+ args.decision?.winner ??
61
+ args.telemetry?.final_attempt_id ??
62
+ null;
63
+ // The file probe alone cannot see an honestly empty answer/report: the
64
+ // read-only final artifact wrapper (title heading + the "(no output)"
65
+ // marker) makes final/answer.md non-empty BY CONSTRUCTION. For those two
66
+ // kinds the D-16 attempt record is the one owner of "delivered" — when the
67
+ // identified producer attested deliverable_present=false, the run truly
68
+ // delivered nothing and the receipt projects an absent deliverable (a clean
69
+ // empty ask completion), instead of manufacturing a producer/deliverable
70
+ // invariant contradiction that would rewrite an honest completion into a
71
+ // fake harness failure. Wrapper-free kinds (patch, plan, structured output)
72
+ // keep the strict cross-check: real file content contradicting the record
73
+ // stays a loud terminal-facts failure, and the probe above still
74
+ // fail-closes the opposite lie (issue #29: a zero-byte artifact can never
75
+ // count as present, whatever the attempt claimed).
76
+ if (producerAttemptId && (selected.kind === "answer" || selected.kind === "report")) {
77
+ const producer = args.telemetry?.attempts.find((attempt) => attempt.attempt_id === producerAttemptId);
78
+ if (producer && producer.outcome.deliverable_present === false) {
79
+ return {
80
+ present: false,
81
+ kind: null,
82
+ path: null,
83
+ producer_attempt_id: null,
84
+ };
85
+ }
86
+ }
87
+ return {
88
+ present: true,
89
+ kind: selected.kind,
90
+ path: selected.path,
91
+ producer_attempt_id: producerAttemptId,
92
+ };
93
+ }
94
+ //# sourceMappingURL=runFactsDeliverable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runFactsDeliverable.js","sourceRoot":"","sources":["../src/runFactsDeliverable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type RunFacts } from "@claudexor/schema";
2
+ import type { AnnouncedRunContext } from "./runTerminals.js";
3
+ /** Build the immutable presentation receipt from the ordered output.ready log. */
4
+ export declare function terminalPresentation(ctx: AnnouncedRunContext): RunFacts["presentation"];
5
+ /** Minimal fail-closed presentation when ordinary terminal preparation failed. */
6
+ export declare function terminalFactsFailurePresentation(ctx: AnnouncedRunContext): NonNullable<RunFacts["presentation"]>;
7
+ //# sourceMappingURL=runFactsPresentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runFactsPresentation.d.ts","sourceRoot":"","sources":["../src/runFactsPresentation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,QAAQ,EAA+B,MAAM,mBAAmB,CAAC;AAEnG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA8E7D,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,CAoCvF;AAED,kFAAkF;AAClF,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,mBAAmB,GACvB,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAQvC"}