@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.
- package/dist/attemptFinalize.d.ts +14 -11
- package/dist/attemptFinalize.d.ts.map +1 -1
- package/dist/attemptFinalize.js +41 -14
- package/dist/attemptFinalize.js.map +1 -1
- package/dist/attemptTelemetry.d.ts +16 -20
- package/dist/attemptTelemetry.d.ts.map +1 -1
- package/dist/attemptTelemetry.js +38 -70
- package/dist/attemptTelemetry.js.map +1 -1
- package/dist/attemptUsageCost.d.ts +47 -0
- package/dist/attemptUsageCost.d.ts.map +1 -0
- package/dist/attemptUsageCost.js +191 -0
- package/dist/attemptUsageCost.js.map +1 -0
- package/dist/budgetFailure.d.ts +3 -1
- package/dist/budgetFailure.d.ts.map +1 -1
- package/dist/budgetFailure.js.map +1 -1
- package/dist/candidateEvidence.d.ts +5 -0
- package/dist/candidateEvidence.d.ts.map +1 -1
- package/dist/candidateEvidence.js +3 -1
- package/dist/candidateEvidence.js.map +1 -1
- package/dist/candidateOutputs.d.ts +19 -0
- package/dist/candidateOutputs.d.ts.map +1 -1
- package/dist/candidateOutputs.js +201 -67
- package/dist/candidateOutputs.js.map +1 -1
- package/dist/credential-profile-rotation.d.ts +145 -0
- package/dist/credential-profile-rotation.d.ts.map +1 -0
- package/dist/credential-profile-rotation.js +315 -0
- package/dist/credential-profile-rotation.js.map +1 -0
- package/dist/credential-profiles.d.ts +35 -134
- package/dist/credential-profiles.d.ts.map +1 -1
- package/dist/credential-profiles.js +73 -295
- package/dist/credential-profiles.js.map +1 -1
- package/dist/decisionBudget.d.ts +43 -0
- package/dist/decisionBudget.d.ts.map +1 -0
- package/dist/decisionBudget.js +84 -0
- package/dist/decisionBudget.js.map +1 -0
- package/dist/decisionTerminalReconciliation.d.ts +18 -0
- package/dist/decisionTerminalReconciliation.d.ts.map +1 -0
- package/dist/decisionTerminalReconciliation.js +26 -0
- package/dist/decisionTerminalReconciliation.js.map +1 -0
- package/dist/deepScanReducer.d.ts +14 -44
- package/dist/deepScanReducer.d.ts.map +1 -1
- package/dist/deepScanReducer.js +240 -128
- package/dist/deepScanReducer.js.map +1 -1
- package/dist/delegation-parent-activation.d.ts +6 -0
- package/dist/delegation-parent-activation.d.ts.map +1 -0
- package/dist/delegation-parent-activation.js +13 -0
- package/dist/delegation-parent-activation.js.map +1 -0
- package/dist/delegationBudgetAuthority.d.ts +30 -0
- package/dist/delegationBudgetAuthority.d.ts.map +1 -0
- package/dist/delegationBudgetAuthority.js +157 -0
- package/dist/delegationBudgetAuthority.js.map +1 -0
- package/dist/delegationFailure.d.ts +58 -0
- package/dist/delegationFailure.d.ts.map +1 -0
- package/dist/delegationFailure.js +184 -0
- package/dist/delegationFailure.js.map +1 -0
- package/dist/delegationToolEvidence.d.ts +20 -0
- package/dist/delegationToolEvidence.d.ts.map +1 -0
- package/dist/delegationToolEvidence.js +46 -0
- package/dist/delegationToolEvidence.js.map +1 -0
- package/dist/git-precondition.d.ts +11 -0
- package/dist/git-precondition.d.ts.map +1 -0
- package/dist/git-precondition.js +69 -0
- package/dist/git-precondition.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +14 -6
- package/dist/interaction.d.ts.map +1 -1
- package/dist/interaction.js +106 -19
- package/dist/interaction.js.map +1 -1
- package/dist/orchestrator.d.ts +62 -115
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +671 -965
- package/dist/orchestrator.js.map +1 -1
- package/dist/plan-prompt.d.ts +3 -0
- package/dist/plan-prompt.d.ts.map +1 -0
- package/dist/plan-prompt.js +28 -0
- package/dist/plan-prompt.js.map +1 -0
- package/dist/planBrief.d.ts +27 -0
- package/dist/planBrief.d.ts.map +1 -0
- package/dist/planBrief.js +42 -0
- package/dist/planBrief.js.map +1 -0
- package/dist/planRun.d.ts +4 -3
- package/dist/planRun.d.ts.map +1 -1
- package/dist/planRun.js +33 -33
- package/dist/planRun.js.map +1 -1
- package/dist/plannerAttempt.d.ts +64 -0
- package/dist/plannerAttempt.d.ts.map +1 -0
- package/dist/plannerAttempt.js +235 -0
- package/dist/plannerAttempt.js.map +1 -0
- package/dist/policyFindings.js.map +1 -1
- package/dist/requestRequirements.d.ts +45 -1
- package/dist/requestRequirements.d.ts.map +1 -1
- package/dist/requestRequirements.js +158 -11
- package/dist/requestRequirements.js.map +1 -1
- package/dist/reviewerPanel.js.map +1 -1
- package/dist/root-ledger.d.ts +13 -0
- package/dist/root-ledger.d.ts.map +1 -0
- package/dist/root-ledger.js +21 -0
- package/dist/root-ledger.js.map +1 -0
- package/dist/routing-failure.d.ts +6 -0
- package/dist/routing-failure.d.ts.map +1 -0
- package/dist/routing-failure.js +12 -0
- package/dist/routing-failure.js.map +1 -0
- package/dist/run-bounded.d.ts +3 -0
- package/dist/run-bounded.d.ts.map +1 -0
- package/dist/run-bounded.js +23 -0
- package/dist/run-bounded.js.map +1 -0
- package/dist/run-input-resolution.d.ts +10 -0
- package/dist/run-input-resolution.d.ts.map +1 -0
- package/dist/run-input-resolution.js +88 -0
- package/dist/run-input-resolution.js.map +1 -0
- package/dist/runEventLog.d.ts +48 -0
- package/dist/runEventLog.d.ts.map +1 -0
- package/dist/runEventLog.js +63 -0
- package/dist/runEventLog.js.map +1 -0
- package/dist/runFacts.d.ts +23 -0
- package/dist/runFacts.d.ts.map +1 -0
- package/dist/runFacts.js +179 -0
- package/dist/runFacts.js.map +1 -0
- package/dist/runFactsBuilder.d.ts +5 -0
- package/dist/runFactsBuilder.d.ts.map +1 -0
- package/dist/runFactsBuilder.js +412 -0
- package/dist/runFactsBuilder.js.map +1 -0
- package/dist/runFactsDeliverable.d.ts +13 -0
- package/dist/runFactsDeliverable.d.ts.map +1 -0
- package/dist/runFactsDeliverable.js +94 -0
- package/dist/runFactsDeliverable.js.map +1 -0
- package/dist/runFactsPresentation.d.ts +7 -0
- package/dist/runFactsPresentation.d.ts.map +1 -0
- package/dist/runFactsPresentation.js +113 -0
- package/dist/runFactsPresentation.js.map +1 -0
- package/dist/runFactsReview.d.ts +7 -0
- package/dist/runFactsReview.d.ts.map +1 -0
- package/dist/runFactsReview.js +63 -0
- package/dist/runFactsReview.js.map +1 -0
- package/dist/runSupport.d.ts +17 -15
- package/dist/runSupport.d.ts.map +1 -1
- package/dist/runSupport.js +16 -0
- package/dist/runSupport.js.map +1 -1
- package/dist/runTelemetryWriter.d.ts +5 -2
- package/dist/runTelemetryWriter.d.ts.map +1 -1
- package/dist/runTelemetryWriter.js +72 -1
- package/dist/runTelemetryWriter.js.map +1 -1
- package/dist/runTerminalContext.d.ts +31 -0
- package/dist/runTerminalContext.d.ts.map +1 -0
- package/dist/runTerminalContext.js +12 -0
- package/dist/runTerminalContext.js.map +1 -0
- package/dist/runTerminalResults.d.ts +55 -0
- package/dist/runTerminalResults.d.ts.map +1 -0
- package/dist/runTerminalResults.js +134 -0
- package/dist/runTerminalResults.js.map +1 -0
- package/dist/runTerminals.d.ts +8 -57
- package/dist/runTerminals.d.ts.map +1 -1
- package/dist/runTerminals.js +423 -135
- package/dist/runTerminals.js.map +1 -1
- package/dist/secretDiff.d.ts +32 -0
- package/dist/secretDiff.d.ts.map +1 -0
- package/dist/secretDiff.js +140 -0
- package/dist/secretDiff.js.map +1 -0
- package/dist/structuredOutput.d.ts.map +1 -1
- package/dist/structuredOutput.js.map +1 -1
- package/dist/task-contract-builder.d.ts +35 -0
- package/dist/task-contract-builder.d.ts.map +1 -0
- package/dist/task-contract-builder.js +114 -0
- package/dist/task-contract-builder.js.map +1 -0
- package/dist/terminalOutcome.d.ts +22 -0
- package/dist/terminalOutcome.d.ts.map +1 -0
- package/dist/terminalOutcome.js +39 -0
- package/dist/terminalOutcome.js.map +1 -0
- package/dist/transientClassify.js.map +1 -1
- 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"}
|