Skip to content

[Bug] standalone /maintenance/reclaim 与面板路由同源的两处形态:窗口无上界 + 确认门的报告未兜错 #411

Closed

Description

@modusensus

[Bug] standalone /maintenance/reclaim 与面板路由同源的两处形态:窗口无上界 + 确认门的报告未兜错

现象

src/api-standalone.js 的 POST /maintenance/reclaim(:485-535)是面板路由 POST /api/dsh-mneme/maintenance/reclaim 的复制源,两处形态一直一致。PR #410 评审期间,面板侧那两处被判定为缺陷并修掉了,数据面这份原样保留(该 PR 的边界写明「数据面零改动」)。因此同样的输入在两条路径上行为不同。

① olderThanDays 只校验形状、不校验量级(:508)

if (olderThanDays !== undefined && (!Number.isInteger(olderThanDays) || olderThanDays < 0)) {

1e20 是整数,能过这道校验。maintenance.reclaim 随后拿它算 new Date(now() - days * 86400000).toISOString()(src/maintenance.js:84),超出 Date 有效范围就抛 RangeError: Invalid time value。

实测:POST {"dryRun":false,"olderThanDays":1e20} → 抛出 RangeError(阈值在 1e9 附近;3650 / 1e7 / 1e8 都正常)。

② 确认门里那份 dry-run 报告没兜住抛错(:516-526)

if (!dryRun && body.confirm !== true) {
  sendJson(res, 400, {
    error: "confirm-required",
    hint: "...",
    report: maintenance.reclaim({ olderThanDays, vacuum: body.vacuum === true, dryRun: true })
  });
  return;
}

它在 readBody 的 .then() 回调里执行,外层的 try(:527-532)那时已经退栈。报告一旦抛错,异常不会走到 catch,而是变成一个没人接的 rejection —— 调用方收到的是连接上一个字节都没有,而不是 500 {"error":"internal"}。HTTP 客户端只会看到连接被挂断/超时,没有任何可诊断的信息。

两者叠加时最糟:POST {"dryRun":false,"olderThanDays":1e20} 恰好同时命中 ① 与 ②,得到的就是「无响应 + 一个 unhandledRejection」。

影响面

数据面是外部调用方(dsh-mneme-serve / MCP / 自建集成)唯一入口,且这个路由是不可逆内容丢弃的入口。无响应比 500 更难排查:调用方分不清是网络问题、服务挂了,还是请求本身有问题。

建议

与面板侧对齐即可,不新增概念:

  1. 引入同一个上界(面板侧为 MAX_RECLAIM_WINDOW_DAYS = 3650,取值与 config.js 的 llmAudit.retentionDays / recallRetentionDays 一致),两侧统一;超界回 400 {"error":"invalid-older-than-days"}。
  2. 把 confirm-required 那份报告挪进本地 try/catch,失败时 logger.warn 留住原始错误文本并回 500 {"error":"internal"}。

备注

这条属 #275(存储生命周期)起的既有形态,不是 #410 引入的;#410 只是把面板侧那份修了,两条路径从此分叉。是否一并把数据面收口,取决于维护者对「数据面是否允许独立演进」的口径。

Activity

  1. added
    bug功能异常、崩溃、数据错误(agent 诊断 → 人工确认)
    on Oct 11, 2026
  2. moved this from 📋 Backlog to 🔨 In Progress in dsh-mneme 任务看板on Oct 12, 2026
  3. moved this from 🔨 In Progress to ✅ Done in dsh-mneme 任务看板on Oct 12, 2026
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

    bug功能异常、崩溃、数据错误(agent 诊断 → 人工确认)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions