StrataGate 问题报告
问题描述
发现的时候已经空跑了十几元的余额,为了阻止继续错误的生成记忆耗费余额,我将插件存档清空重置了,所以下方自动诊断信息的数量为0。以下为deepseek整理的信息
stratagate-dsh 0.2.67 上,一条永久失败的 Graph projection 任务被 0.2.66 新增的持久记忆后台 worker 无限重领:claimGraphProjection() 没有 attempts 上限(抽取任务有 DERIVATION_MAX_ATTEMPTS=3 与退避,投影任务没有),而 worker 间隔 BACKGROUND_WORKER_INTERVAL_MS=3000,只要 namespace 里存在 pending 图任务就会不断运行 resumePendingWork() → projectEligibleGraph()。每次失败都会以约 30–60 秒周期在 running/failed 间翻转,failed 后 3 秒即被重新领取。
失败原因是输出被截断:claimGraphProjection() 把整节点对象(含 currentState 全量拼接与每条 fact 的 id/时间戳/置信度)交给模型,38 节点平均 3.1KB + 113 边,既有图谱上下文约 170KB ≈ 5.3 万 token,模型在 maxOutputTokens=10000 内无法闭合被强制的工具调用,每次失败报 "call was truncated before valid arguments"(finish=max-tokens, toolCalls=0);JSON_RESPONSE_ATTEMPTS=2 使每次重试花 2 次模型调用。
副作用还包括饥饿:claimGraphProjection 按 priority desc + createdAt asc 排序,这条 createdAt 最早的失败任务每次都插队,3 条真正 pending 的任务在 100+ 次重试期间从未被投影。面板长期显示「运行中 · 已尝试 N 次」,用户无法判断它其实是终态失败。建议:给投影任务补 attempts 上限 + 退避并让 pending 优先;压缩投影上下文(去掉事实 id/时间戳/置信度、截断 currentState、节点 80→32、边 120→60,实测 −72% 体积);把 finish=max-tokens 当作需要拆分批次的可恢复错误;提供图投影开关/上限配置与全局熔断。
复现步骤
- stratagate-dsh 0.2.66/0.2.67,DSH 0.1.5-rc.2,profile web,模型 deepseek-official/deepseek-flash,插件配置 maxOutputTokens: 10000
- 让知识图谱累积到几十个节点(本机为 74 events / 38 nodes / 113 edges)
- 制造一次必然被截断的投影批次(本机为 gproj_b67948a5,12 个源事件)
- 观察 ~/.dsh/stratagate/memory.db 的 graph_state.jobs_json:该 job 的 status 在 running 与 failed 之间以 30–60 秒翻转、attempts 持续上涨(98→125),updated_at 始终是「刚刚」
- 对照 dsh-cost-meter 账本(~/.dsh/storages/cost-meter/ledger.json):会话 stratagate-worker:dsh:project: 的 calls/cost 随之线性增长
预期行为
失败的图投影任务最多重试固定的少数次数(与抽取任务一致,DERIVATION_MAX_ATTEMPTS=3 并带指数退避),之后进入终态 failed 且不再自动重试;投影批次大小应与 maxOutputTokens 匹配,使正常批次能在预算内完成工具调用;pending 任务不应被老失败任务饿死。
实际行为
失败的图投影任务被每 3 秒重领一次、永不停止:观测期间 attempts 从 98 涨到 125,任务状态在 running/failed 间反复翻转;且每次调用的输出都恰好是 10,001 token(等于 maxOutputTokens 上限)。同时 3 条 pending 投影任务(10/5/7 个事件)在 100+ 次重试期间始终未被处理。官方 npm 最新版仍为 0.2.67,无修复版本。
相关错误信息
graph_state.jobs_json[gproj_b67948a5].lastError(原样):
StrataGate model did not produce a valid stratagate_project_knowledge_graph call after 2 attempts
Cause: StrataGate stratagate_project_knowledge_graph call was truncated before valid arguments
Raw response (full):
[no model blocks; finish=max-tokens]
[finish=max-tokens; toolCalls=0]
关键代码位置(dist/plugin.js,0.2.67):
- 3730 claimGraphProjection():filter 只判断 status==="pending"||"failed",无 attempts 上限;排序 priority desc + createdAt asc 导致饥饿
- 3676 claimNextElementProjection():同样无上限
- 5716 BACKGROUND_WORKER_INTERVAL_MS = 3e3;5807 scheduleBackgroundWorker();5849 runBackgroundNamespace() 的 runnable 判定
- 3224 / 4490 resumePendingWork() → projectEligibleGraph()
- 3740-3755 投影上下文构造:existingNodes = [...].slice(0, 80) 且 structuredClone 整节点对象;existingEdges slice(-120)
- 5305 callStructured():finish.kind === "max-tokens" 被判为 "call was truncated before valid arguments";4822 JSON_RESPONSE_ATTEMPTS = 2
- 2737/4363/4380:抽取任务已有 DERIVATION_MAX_ATTEMPTS=3 + retryAt() 退避,可作为修复参照
自动诊断信息
- StrataGate 版本:0.2.67
- Harness 版本:0.1.5-rc.2
- blockTurnSize:6
- 已封存块:0
- Event / Graph Node 数量:0 / 0
- 最近错误:无
此报告在浏览器本地生成。默认诊断不包含原始聊天、L5、Event 或 Graph 内容。正则脱敏仅是纵深防御,提交前仍需人工检查。
StrataGate 问题报告
问题描述
发现的时候已经空跑了十几元的余额,为了阻止继续错误的生成记忆耗费余额,我将插件存档清空重置了,所以下方自动诊断信息的数量为0。以下为deepseek整理的信息
stratagate-dsh 0.2.67 上,一条永久失败的 Graph projection 任务被 0.2.66 新增的持久记忆后台 worker 无限重领:claimGraphProjection() 没有 attempts 上限(抽取任务有 DERIVATION_MAX_ATTEMPTS=3 与退避,投影任务没有),而 worker 间隔 BACKGROUND_WORKER_INTERVAL_MS=3000,只要 namespace 里存在 pending 图任务就会不断运行 resumePendingWork() → projectEligibleGraph()。每次失败都会以约 30–60 秒周期在 running/failed 间翻转,failed 后 3 秒即被重新领取。
失败原因是输出被截断:claimGraphProjection() 把整节点对象(含 currentState 全量拼接与每条 fact 的 id/时间戳/置信度)交给模型,38 节点平均 3.1KB + 113 边,既有图谱上下文约 170KB ≈ 5.3 万 token,模型在 maxOutputTokens=10000 内无法闭合被强制的工具调用,每次失败报 "call was truncated before valid arguments"(finish=max-tokens, toolCalls=0);JSON_RESPONSE_ATTEMPTS=2 使每次重试花 2 次模型调用。
副作用还包括饥饿:claimGraphProjection 按 priority desc + createdAt asc 排序,这条 createdAt 最早的失败任务每次都插队,3 条真正 pending 的任务在 100+ 次重试期间从未被投影。面板长期显示「运行中 · 已尝试 N 次」,用户无法判断它其实是终态失败。建议:给投影任务补 attempts 上限 + 退避并让 pending 优先;压缩投影上下文(去掉事实 id/时间戳/置信度、截断 currentState、节点 80→32、边 120→60,实测 −72% 体积);把 finish=max-tokens 当作需要拆分批次的可恢复错误;提供图投影开关/上限配置与全局熔断。
复现步骤
预期行为
失败的图投影任务最多重试固定的少数次数(与抽取任务一致,DERIVATION_MAX_ATTEMPTS=3 并带指数退避),之后进入终态 failed 且不再自动重试;投影批次大小应与 maxOutputTokens 匹配,使正常批次能在预算内完成工具调用;pending 任务不应被老失败任务饿死。
实际行为
失败的图投影任务被每 3 秒重领一次、永不停止:观测期间 attempts 从 98 涨到 125,任务状态在 running/failed 间反复翻转;且每次调用的输出都恰好是 10,001 token(等于 maxOutputTokens 上限)。同时 3 条 pending 投影任务(10/5/7 个事件)在 100+ 次重试期间始终未被处理。官方 npm 最新版仍为 0.2.67,无修复版本。
相关错误信息
graph_state.jobs_json[gproj_b67948a5].lastError(原样):
StrataGate model did not produce a valid stratagate_project_knowledge_graph call after 2 attempts
Cause: StrataGate stratagate_project_knowledge_graph call was truncated before valid arguments
Raw response (full):
[no model blocks; finish=max-tokens]
[finish=max-tokens; toolCalls=0]
关键代码位置(dist/plugin.js,0.2.67):
自动诊断信息