任务:一份很小的提交让 submit_result 内部崩溃,修正说明也不够具体

真实运行(缺陷转用例,真实 Circle 客户端)里,一次只有约 2.4 KB 的提交连续两次让 Hub 返回内部错误(MCP -32603),管理员记录里只有一句 RangeError: Maximum call stack size exceeded,没有调用栈;出错的提交没有存下,客户端那边的会话目录也已经清掉,原文找不回来。同一轮里模型前七次提交都把 commands 的每一项写成了字符串,回执的修正说明只说“按槽位模式改正后重交”,模型就一直改不对。

  • 分支和工作树:hub-submit-robustness,目录 circle-hub-submit-robustness(依赖已装好)
  • 可以改的路径:hub/server/**(工具入口、错误处理和管理员记录)、hub/runs/**(提交的解析、证据收集、引用解析的调用处)、hub/refs/**(引用解析)、hub/records/** 里的规范 JSON(如果递归在那里),以及对应的测试和 tests/acceptance/** 的一个场景。别的路径不动;改合约要先回报。
  • 规则:同前(不推送、不建 PR、不发布、不部署,不碰 7420、钥匙串、环境配置文件和任何真实系统;测试只用合成数据;git commit -s,合并用 git merge --signoff)。

要做的

  1. 可诊断:任何工具调用落到“内部错误”时,管理员记录里写上错误的调用栈(只写栈帧的函数名和仓库内的相对位置,不写本机绝对路径,不写参数原文)。先写测试:人为抛错时记录里有栈。
  2. 找出并消除这次的递归。没有原文,所以从 submit_result 能走到的每个递归处入手,逐个写合成的复现测试:
    • 很深的嵌套(2.4 KB 里能塞一千多层数组或对象)经过参数校验、规范 JSON 和证据收集;
    • 引用之间成环:提交里引用本次运行自己先前的验证结果(rec:),那份结果又引用这份提交;或一个片段引用指回它自己;
    • 别的你在代码里看到的、没有访问集合或深度上限的递归。

    能复现栈溢出的那个就是这次的缺陷,修好;其余的也一并加上限。

  3. 统一的处理:JSON 的嵌套深度超过上限(例如 64 层)时,整份提交不受理,码用已有的提交结构错误,修正说明写“嵌套超过 N 层”;引用解析带访问集合,碰到环停下来,这一处记为引用解析不出,修正说明写明成环的引用。绝不落到内部错误。
  4. 修正说明具体化:提交的结构错误按出错位置在槽位模式里的定义给出要求的形状。例如“/items/0/slots/cases/0/commands/0 要的是对象 {"command": "<命令行>", "present"?: 布尔},收到的是字符串”。只用槽位模式里已有的信息,不写包的名字。
  5. 测试先写,验收场景加一例(深嵌套和引用成环各被拒,回执里有修正说明,没有内部错误)。验证:npx tsc --noEmit;node --test --test-concurrency=3 对改过的路径和新场景(数据库测试别和别的终端同时跑)。

完成后在终端里回报:提交号、测试数量、找到的递归在哪里、没做完或拿不准的地方。