/** * 精确定位:dowhile 每一轮的 step 记录,在快照里是「追加」还是「覆盖/重置」? * 运行:SPIKE_NO_AUTORUN=1 tsx src/probe-03-loop-snapshot-detail.ts */ import { DecisionScript, Ledger, banner } from './ledger.js'; import { mastraA, storeA, _internals } from './route-a-dowhile.js'; import { resetTrace } from './trace.js'; _internals.setLedger(new Ledger()); _internals.setScript(new DecisionScript([])); resetTrace(); const wf = mastraA.getWorkflow('routeA'); const snapOf = async (workflowName: string, runId: string) => (await (storeA as any).stores.workflows.loadWorkflowSnapshot({ workflowName, runId })) as | Record | null; const run = await wf.createRun(); const inner = async () => await snapOf('round-body', run.runId); const dumpInner = async (tag: string) => { const s = await inner(); console.log(`\n[${tag}] 内层快照 context 的键 = ${JSON.stringify(Object.keys(s?.context ?? {}))}`); for (const k of ['A4', 'A5', 'A6-sub']) { const rec = s?.context?.[k]; if (!rec) continue; console.log( ` ${k}: status=${rec.status} suspendPayload.taskId=${rec.suspendPayload?.taskId} output.price=${rec.output?.price} output.verdict=${rec.output?.verdict}`, ); } }; banner('第 1 轮'); await run.start({ inputData: { quoteId: 'Q-detail' } }); await dumpInner('第1轮 A4 挂起'); await run.resume({ step: ['round-body', 'A4'], resumeData: { price: 100 } }); await dumpInner('第1轮 A4 已推进,A5 挂起'); await run.resume({ step: ['round-body', 'A5'], resumeData: { verdict: 'reject' } }); banner('第 2 轮(E10 回边重开 A4)'); await dumpInner('第2轮 A4 挂起'); console.log('\n→ 第 1 轮的 A5(verdict=reject)记录还在内层快照里吗?', (await inner())?.context?.['A5'] ? '在' : '不在(嵌套快照按轮重置了)'); console.log('→ 第 1 轮的 A4(taskId=T-A4-001, price=100)记录还在吗?'); console.log(' 当前 A4 记录全文 =', JSON.stringify((await inner())?.context?.['A4'], null, 2)); banner('跑完这一单,看终态'); await run.resume({ step: ['round-body', 'A4'], resumeData: { price: 90 } }); await run.resume({ step: ['round-body', 'A5'], resumeData: { verdict: 'pass' } }); const fin = await run.resume({ step: ['round-body', 'A6-sub', 'A6'], resumeData: { outcome: 'won' } }); console.log('最终 status =', fin.status, JSON.stringify((fin as any).result)); await dumpInner('终态'); const outer = await snapOf('route-a', run.runId); console.log('\n外层 context["round-body"].metadata =', JSON.stringify(outer?.context?.['round-body']?.metadata)); console.log('外层 context 键 =', JSON.stringify(Object.keys(outer?.context ?? {}))); console.log('\n结论素材:整个 run 只有一份「A4 的记录」,内容是最后一轮的;第 1 轮的 A4/A5 记录不可回溯。'); _internals.getLedger().dump('probe-03(我们自己记的台账则保留了每一轮)');