test(claude-code): 宿主端到端第一次真跑通 - #3
Merged
Merged
Conversation
Claude Code 作为宿主此前只有六条接缝单测,没有一条会真的 spawn 一个 `claude` 进程—— 「参数拼对了」「hook 真的被加载了」「skills 真的被识别了」三件事只有文档没有证据。 Codex 在 09-10 有过一次实测(19),两个宿主的证据强度长期不对等。 `verify-host-stages.ts --real --claude` 这个脚本一直存在,只是没人跑过。第一次跑, 脚本判 `passed: false`「agent 中途停下了」。看 trace 才知道它停在哪: begin_stage(modules) → load_run_instructions → retrieve_spec → plan_modules → module_plan_state ×3 → 停 session 本身是**正常结束**的(`is_error: false, subtype: success`)。它在等人冻结模块树, 而脚本里没有这个人。**不是适配器坏了,是这个脚本比流水线旧**——它写在模块节点与那道 人工闸引入之前。 照 `drive-modules-and-stories.ts` 的先例加 `--freeze-as-operator`:默认不按, 带这个开关才按,并把「谁按的、什么时候按的」写进证据。这条闸的意义是「有人为这棵树 负责」,不是「必须有个人坐在那儿」——脚本调用者显式声明自己就是那个人,是成立的; 悄悄替他按,不成立。 带上它重跑,全链通了:17 次 MCP 阶段调用(内部 run_pipeline 0 次)、3 分 10 秒、$1.52、 11 份修订,最终 `finalize`。实测记录写进 docs/v3/25。 顺带验到两件: - schema 拒收之后 agent 会自己修。第一次 write_cases 被 `transitionIds` 打回, 改完重写就过了;门禁出结果后又写一次再 gate,修复回路按设计走通。 - **2026-09-14 新加的门禁规则在英文材料上也生效。** `acceptance-uncovered` 点到 「S-01/AC-1 要求用户动手(When the visitor clicks the visible Inc)」——验收准则编号 与「要不要用户动手」的判定当时是对着中文语料调的,这次在纯英文规格上, `When` 子句解析与英文动作动词都命中了。 还没验到的三件写在文档里:hook 有没有真被执行、执行节点没走、用的是本地 counter 规格不是重前端页面。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
上一轮用的是脚本自带的本地 counter 规格。这一轮换成真东西:新建项目、目标 `app.hyperliquid-testnet.xyz/trade`,走完探索 → 宿主规划 → 人复核 → g2。 分工是被迫的也是对的:MCP 里没有探索工具(`register_run` 收的是材料文本), 而且探索要浏览器、宿主 agent 没有。所以服务端探索(modules 前设断点停住), 材料交给宿主规划,人复核,再编译执行。驱动脚本 `drive-claude-host.ts`。 6 屏 / 32,656 字材料 → 9 模块 / 4 故事 / 11 用例,门禁 score 1;复核 10 批准 1 驳回; g2 ready_to_execute,代码门禁 score 1。 用例质量与 24 §38 之前那 81 条完全不同:11 条全是 tier1 + 机器判据 + ready, acRefs 全部按编号引用,步骤是真实动作,大多带回退,没有一条是「打开页面 + 看一眼」。 **驳回的那条,缺陷不在用例。** C-12 的判据是 `Account value must be <$2500万 to use portfolio margin in beta mode.`—— 一个英文 dapp 不会渲染「万」。查探索材料,原文就是这句:用例逐字抄的,没编。 缺陷在上游,材料里这句的数字被本地化了($25M → $2500万),而同一份材料里 `No open positions yet`、`Trailing Stop` 都是逐字英文。这是 outputLanguage: 'zh' 的运行都可能中招的一类。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
全流程最后一段跑完了:探索 → 宿主规划 → 人复核 → g2 → execution, 10 条批准的用例真跑到 app.hyperliquid-testnet.xyz/trade 上,**零基础设施错误**。 唯一一条失败是定位失败不是产品缺陷:C-10 第 2 步找不到账户面板里的「Positions」标签, 而页面就绪读数是 30 controls / 1849 text characters——页面是画完的,未连接钱包时 那一行标签本来就可能不在。归 locate 而不是 assert,分档是对的。 9 条通过里只有 4 条是挣来的,另 5 条的判据在动作之前就已经成立 (`heldBefore`)。判据是真的机器判据、通过也是真的通过,但那 5 条这次没有证明 它们那几步做成了什么。复核时我已经标出 C-01 与 C-11 两条,执行把另外三条也找出来了。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
zyonlab
changed the base branch from
fix/drift-covers-host-plugins
to
opt/tier4
September 14, 2026 13:27
CI 从来没绿过。三条 PR 分支各红了一次,红的都是同一条,而且和各自改的东西
毫无关系:
Error: penguin_node_24_required: set TP_PENGUIN_NODE to a Node 24+ executable
❯ src/penguin.ts:144 ❯ test/managed-penguin.test.ts:22
`managed-penguin.test.ts` 的四条都是 `it.runIf(installed)`——没装就跳过,机制是齐的。
但 `installed` 这一行在模块顶层调用 `node24Path()`,而它在找不到 Node 24 时**抛异常**。
于是在一台没有 Node 24 的机器上,整个文件加载失败,四条连「跳过」都到不了,
整个 server 包的测试红。
CI 用的是 Node 22。本机也是 22.17.0,只是 PATH 上另有一个 Node 24,
`node24Path()` 的 `execFileSync("node", …)` 兜底找得到它——所以本地一直是绿的,
CI 一直是红的,而两边跑的是同一条命令。
探测的答案本来就该是「没有」,不是「出错」。包一层 try/catch。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
Claude Code 作为宿主此前只有六条接缝单测,没有一条会真的 spawn 一个
claude进程。「参数拼对了」「hook 真的被加载了」「skills 真的被识别了」三件事只有文档没有证据。Codex 在 09-10 有过一次实测,两个宿主的证据强度长期不对等。第一次跑:agent 停住了,而不是适配器坏了
verify-host-stages.ts --real --claude一直存在,只是没人跑过。第一次跑判passed: false。看 trace:session 本身正常结束(
is_error: false, subtype: success)。它在等人冻结模块树——而脚本里没有这个人。不是适配器坏了,是这个脚本比流水线旧,写在模块节点与那道人工闸引入之前。照
drive-modules-and-stories.ts的先例加--freeze-as-operator:默认不按,带开关才按,并把「谁按的、什么时候」写进证据。这条闸的意义是「有人为这棵树负责」,不是「必须有个人坐在那儿」——脚本调用者显式声明自己就是那个人成立,悄悄替他按不成立。结果
带上开关重跑,全链通了:
claude-opus-5[1m](原生,未替换)run_pipeline0 次finalize顺带验到两件
schema 拒收之后 agent 会自己修。 第一次
write_cases被design.transitionIds打回,改完重写就过;门禁出结果后又写一次再 gate——修复回路按设计走通。2026-09-14 新加的门禁规则在英文材料上也生效。
acceptance-uncovered点到:验收准则编号与「要不要用户动手」的判定当时是对着中文语料调的,这次在纯英文规格上,
When子句解析与英文动作动词都命中了。两轮门禁都score: 1。还没验到的(写在文档里,不含糊过去)
waiting_review,没有走复核 → g2 → execution检查
pnpm typecheck/pnpm test(431)/pnpm check:drift全绿。🤖 Generated with Claude Code