Skip to content

[Bug] 图投影任务无重试上限:0.2.66 后台 worker 每 3 秒重领永久失败任务 #47

Description

@1024MHz

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 当作需要拆分批次的可恢复错误;提供图投影开关/上限配置与全局熔断。

复现步骤

  1. stratagate-dsh 0.2.66/0.2.67,DSH 0.1.5-rc.2,profile web,模型 deepseek-official/deepseek-flash,插件配置 maxOutputTokens: 10000
  2. 让知识图谱累积到几十个节点(本机为 74 events / 38 nodes / 113 edges)
  3. 制造一次必然被截断的投影批次(本机为 gproj_b67948a5,12 个源事件)
  4. 观察 ~/.dsh/stratagate/memory.db 的 graph_state.jobs_json:该 job 的 status 在 running 与 failed 之间以 30–60 秒翻转、attempts 持续上涨(98→125),updated_at 始终是「刚刚」
  5. 对照 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 内容。正则脱敏仅是纵深防御,提交前仍需人工检查。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions