Mastra 化前置:loop 三修 —— 提交放行发真验收卡、事件只记不跑、轨迹喂回叙事面
勘察(两路 code-explorer)坐实 loop 范式三处真缺口,本轮先修(用户拍板), 与 Mastra 化解耦、按外科手术做(活动内 MVP 期高内聚不过度抽象): ① 提交放行走不到 released:submit/判齐只返回 submitted,task 层当 running 处理,任务原地重跑到预算耗尽(exhausted 而非 released)。 修:提交 = 发**验收卡**挂起等裁决(raiseAcceptance 唯一出口:发卡、立监听、 在途验收入状态信封 sys.loop_state.pending,迁移 0015);判齐重入不发第二张卡; 裁决 pass → finished released(选口随放行带回),reject → finished 不放行。 TurnOutcome 增 finished/released/selectedPorts,engines 接线透传。 ② onEvent 双拍:自跑一整拍后 deliver 的 tick 再跑一拍 —— 每次人卡回传多耗 一次不计 steps/activeMs 预算的模型决策。修:onEvent **只记不跑** (登记 occur / 收验收裁决入信封,存快照即返),推进统一归 tick,预算一个口径。 ③ Agent 每拍失忆:memory.window 定义了但零调用,任务自身轨迹从不喂回 prompt。 修:叙事面新增【本任务最近轨迹】段,窗口大小取活动声明的 manifest.declarations.harness.memoryWindow(活动侧唯一记忆配置,不再硬编码)。 测试:turn-runner-acceptance 八例;全量绿,五闸退出码过;loop CONTRACT.md 同步。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
@@ -425,6 +425,12 @@ export function wireEngines(deps: EngineWiringDeps): EngineWiring {
|
||||
append: memoryRecorder.append as never,
|
||||
loadActivityMemory: async (activityId: string, limit: number) =>
|
||||
(await deps.memory.loadActivityMemory(activityId, { limit })).map((m) => ({ layer: m.layer, statement: m.statement })),
|
||||
// 任务自身的最近轨迹:窗口大小是活动声明的唯一 Harness 记忆配置(manifest.declarations.harness.memoryWindow)
|
||||
window: async (taskId) => {
|
||||
const { activityId } = await taskContext.of(taskId);
|
||||
const size = (await deps.registry.manifestOf(activityId)).declarations.harness.memoryWindow;
|
||||
return (await deps.memory.window(taskId, size)).map((m) => ({ kind: m.kind, title: m.title }));
|
||||
},
|
||||
},
|
||||
tasks: taskContext,
|
||||
clock,
|
||||
@@ -508,11 +514,18 @@ export function wireEngines(deps: EngineWiringDeps): EngineWiring {
|
||||
load: (taskId, model) => loop.load(taskId, model as never).then(() => undefined),
|
||||
advance: async (taskId) => {
|
||||
const outcome = await loop.runTurn(taskId);
|
||||
return { status: outcome.status, ...(outcome.blockedReason === undefined ? {} : { reason: outcome.blockedReason }) };
|
||||
return {
|
||||
status: outcome.status,
|
||||
...(outcome.blockedReason === undefined ? {} : { reason: outcome.blockedReason }),
|
||||
// 终局唯放行:runTurn 依在途验收的裁决给出 finished 时,released/选口一并带回
|
||||
...(outcome.released === undefined ? {} : { released: outcome.released }),
|
||||
...(outcome.selectedPorts === undefined ? {} : { selectedPorts: outcome.selectedPorts }),
|
||||
};
|
||||
},
|
||||
// 只记不跑:登记事件/收裁决即返,推进统一归 deliver 随后的 tick —— 预算一个口径
|
||||
onEvent: async (taskId, event) => {
|
||||
const outcome = await loop.onEvent(taskId, event);
|
||||
return { status: outcome.status, ...(outcome.blockedReason === undefined ? {} : { reason: outcome.blockedReason }) };
|
||||
await loop.onEvent(taskId, event);
|
||||
return { status: 'running' as const };
|
||||
},
|
||||
},
|
||||
flow: {
|
||||
|
||||
Reference in New Issue
Block a user