Skip to content

🔒 fix(sidecar): 编排记忆批——routine 本地日期键/提取丢轮回放/evidence 密钥过滤/cron 永假拒绝 - #445

Merged
CavinHuang merged 4 commits into
mainfrom
worktree-orchestration-memory
Aug 22, 2026
Merged

🔒 fix(sidecar): 编排记忆批——routine 本地日期键/提取丢轮回放/evidence 密钥过滤/cron 永假拒绝#445
CavinHuang merged 4 commits into
mainfrom
worktree-orchestration-memory

Conversation

@CavinHuang

Copy link
Copy Markdown
Owner

概要

#408 五项:

  1. routine 日期键本地化:三处 today() 的 UTC 键使 UTC-5 时区 19:00 后当日 routine 失联、晨间生成落昨日键。抽 localDateKey 共享。
  2. 后台记忆提取不再丢轮:trailing 单槽改 FIFO 队列(每轮请求只含当轮 items,覆盖即永久丢证);失败批次 items 暂存并入下次提取(cursor 停旧位但请求式扫描不会重放旧轮)。
  3. evidence quote 密钥过滤:statement 过滤了但整条源消息 quote 曾明文进 frontmatter 并参与注入;含疑似密钥的 quote 以占位替代。
  4. 密钥正则扩展:补 GitHub (ghp_/github_pat_)/AWS AKIA/PEM 私钥/Bearer JWT/Slack xox- 形态。
  5. cron 永假组合拒绝cronDateFeasible 检查 dom/month 受限组合是否存在可命中日期(dow 受限时 OR 语义直接可行);getNextCronRunAt 短路返 null、validateAutomationSchedule 创建/改期即抛错——0 9 31 2 * 类表达式不再逐分钟空转满年卡事件循环数秒。

验证

  • sidecar typecheck 通过
  • automation-schedule / routine / memory-v2 相关套件:失败项经 stash 对照确认为存量串扰假阳性(基线同样失败),与本批无关

Closes #408

🤖 Generated with Claude Code

TaTaLiao and others added 4 commits August 22, 2026 19:37
- routine 三处 today() 统一走 localDateKey(本地时区):UTC 键使 UTC-5
  时区 19:00 后当日 routine 失联、晨间生成落昨日键(#408)
- 后台记忆提取 trailing 单槽改 FIFO 队列,覆盖不再丢中间轮;失败批次
  items 暂存并入下次提取,cursor 不再静默跳过失败轮(#408)
- 记忆 evidence quote 过 containsSecret 再落盘——statement 滤了但整条
  源消息 quote 曾明文进 frontmatter 并注入 prompt;密钥正则补 GitHub/
  AWS/PEM/JWT/Slack 形态(#408)
- cronDateFeasible:dom/month 受限组合无可命中日期时 getNextCronRunAt
  短路返 null、validateAutomationSchedule 创建即拒——永假表达式
  (如 0 9 31 2 *)不再逐分钟空转满年卡事件循环(#408Closes #408

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@CavinHuang

Copy link
Copy Markdown
Owner Author

Code Review(事后补录——本 PR 已合并,问题转为 follow-up)

五项声称修复方向均属实(本地日期键/FIFO 提取/evidence 过滤/cron 可行性短路),但逐项深查发现 4 个 P1,随合并已进入 main

[P1-1] 日期键分裂 → 同一天重复创建整套 automation job

PR 只改了 services/routine/ 内三处 today() 为本地时区,但 RPC 层 rpc/routine-handlers.ts:10(GET_TODAY 读 readRoutine(today())、REGENERATE 以 UTC 键 force 重生成)与 agent 工具层 create-routine-tools.ts:25(routine_get_today / routine_update / routine_generate)仍是 UTC 键。UTC+8 本地 00:00–08:00 窗口内:GET_TODAY 读不到当日 routine → REGENERATE 写 UTC 键文件 → runner 按本地键找不到 → 再次生成并 scheduleRoutineEntries同日重复创建 automation jobroutine_update 会改到另一个文件。修复前所有消费方统一 UTC(语义错但自洽),修复后自洽被打破。

[P1-2] carriedBatches 连续失败丢批次

memory-v2/background-extractor.ts catch 块写的是 carriedBatches.set(threadId, [...(get(threadId) ?? []), input.items]),但开头已 delete,同线程队列串行无并发写者,get 恒 undefined → 只存回本轮 items。反例:轮 A 失败 carry=[A];轮 B 合并 A+B 再失败 → set([B]),A 永久丢失。LLM 持续不可用恰是目标场景。应改局部变量 [...carried, input.items]

[P1-3] 密钥过滤修错字段,实际落盘通道未堵

sanitizeEvidenceQuote 只处理 candidate.evidence.quote,而该字段根本不序列化(markdown-store frontmatter 无 evidence 键)。真正进 frontmatter 的是 evidence_refs[].quote(markdown-store.ts:197/423 原样写入 → YAML.stringify 全量落盘),且 background-extractor.ts:214 把整条源消息文本塞入该字段未过滤。结果:含密钥的 quote 仍明文写入 .md,且 memory.read 按 path 即可回读进 prompt。「quote 不再明文进 frontmatter」的声称不成立。

[P1-4] 存量永假 cron job 毒化整轮调度刷新(升级回归)

已有持久化的永假 job(旧版放行、nextRunAt=null)升级后命中新的 feasibility throw:automation-runner-service.ts:331 job.nextRunAt ?? getNextAutomationRunAt(...) 抛异常,而 scheduleJob/refreshAutomationRunnerJobs(360-367) 无 try/catch,且 refresh 先 clearSchedules() 再遍历 → 一个坏 job 使其余所有 job 定时器全清且不再补,每次 refresh 复现。旧版只慢不抛。建议:feasibility 仅放创建/改期入口,getNextAutomationRunAt 对存量返 null;或 scheduleJob 逐 job 隔离异常。

其他

  • [P2] matchCronExpression dom/dow 同限取 AND,新增 cronDateFeasible 假设 OR——0 9 31 2 1 类表达式永假卡顿未修复,两边语义必须一致
  • [P2] 五项行为改动零新增测试

建议立即以 follow-up PR 修复上述 4 个 P1(P1-3 涉密钥明文落盘优先级最高)。

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P2][sidecar/automation,memory] 编排与记忆批次

2 participants