diff --git a/bin/aas.mjs b/bin/aas.mjs index 3a5edd1..b6ddc43 100644 --- a/bin/aas.mjs +++ b/bin/aas.mjs @@ -35,7 +35,6 @@ export const DEFAULT_PATHS = Object.freeze({ lock: join(root, "stack-lock.json"), }); -const DISPUTE_OUTCOMES = new Set(["compensated", "disputed"]); const STAGE_NAMES = ["decide", "act", "prove"]; const DEMO_FLAG_OPTIONS = new Set(["--dispute", "--json"]); const DEMO_VALUE_OPTIONS = new Set(["--response", "--fault"]); @@ -442,7 +441,7 @@ export async function runDemo(args = [], options = {}) { bundle_verification: act.raw?.bundle_verification ?? null, }; report.flow = "decide -> act"; - const shouldProve = forceDispute || DISPUTE_OUTCOMES.has(outcome); + const shouldProve = forceDispute || outcome !== "settled"; if (!shouldProve) { stages.prove = stageRecord("skipped", { reason: "no_dispute" }); report.stages.prove = stages.prove; @@ -455,7 +454,7 @@ export async function runDemo(args = [], options = {}) { report.stages.prove = { status: stages.prove.status, scenario, - triggered_by: forceDispute && !DISPUTE_OUTCOMES.has(outcome) ? "--dispute" : `act_outcome=${outcome}`, + triggered_by: forceDispute && outcome === "settled" ? "--dispute" : `act_outcome=${outcome}`, ok: prove.ok, result_keys: prove.raw?.result && typeof prove.raw.result === "object" ? Object.keys(prove.raw.result) : [], }; diff --git a/test/stack.test.mjs b/test/stack.test.mjs index 0dc3546..25d274f 100644 --- a/test/stack.test.mjs +++ b/test/stack.test.mjs @@ -167,6 +167,22 @@ test("dispute bundle runs prove and records its trigger", async () => { assert.deepEqual(readdirSync(join(result.bundleDir, "stages")).sort(), ["act.json", "decide.json", "prove.json"]); }); +test("an unresolved act outcome is sent to proof", async () => { + const outputRoot = tempRoot(); + let proveCalls = 0; + const result = await runDemo(["--response", "pass"], stubOptions(outputRoot, { + runId: "unresolved-run", + runActFn: async () => ({ ok: true, raw: { outcome: null, state: "UNKNOWN", fault: "lost-response-before-commit" }, status: 0 }), + runProveFn: async () => { + proveCalls += 1; + return { ok: true, raw: { ok: true, result: { evidence: true } }, status: 0 }; + }, + })); + assert.equal(proveCalls, 1); + assert.equal(result.manifest.stages.prove.status, "passed"); + assert.equal(result.report.stages.prove.triggered_by, "act_outcome=null"); +}); + test("child-process errors are visible as safe stage errors and downstream skips", async () => { const outputRoot = tempRoot(); const result = await runDemo(["--response", "pass"], stubOptions(outputRoot, {