Closed
[V1106-I01] [P0·bench] 一次性模式散文即散会+`Stalled` 映 `rc=0` #34
kemengAdd on  10 days agoClosed at  9 days ago
kemengCollaborators
10 days ago Create

在非交互一次性运行(xwcode -p "<instruction>")中,若模型某一轮只输出散文(进度汇报/分步计划/反问用户),进程会立刻以 rc=0 退出,工作区零改动。评测侧表现为 reward 0 / f2p 0/N / p2p 全绿 / 无异常,与「模型答错了」不可区分。

复现(14 次运行里 8 次零动作,其中 6 次是这一形态)

cd /app && xwcode --model <m> --max-steps 200 --permission-mode workspace-write \
  --cwd /app --config /tmp/xwcode-bench/xwcode.json -p "$(cat instruction.md)" < /dev/null

Rust 长任务(wasmi coredump/pest charclass)稳定复现:约 1m40s~2m45s 退出,21~24 次模型调用,输入约 60 万 token、输出 3k~12k,补丁 0 字节。

根因

xwcore runtime/stages/mod.rs:「本轮无工具调用且未识别计划」分支直接置 FinishReason::Stalled 并 Break;该 Stalled 在一次性模式下映射为 rc=0,调用方认为「成功结束」。

期望

  1. 非交互模式下 FinishReason::Stalled 应以非零退出码结束(不得伪装成正常完成);
  2. has_patch == false 且 tool_uses.is_empty() 时,break 之前至少注入一次「继续执行,不要向用户提问、不要只汇报进度」的 nudge;
  3. 退出时输出结构化的「本轮为什么结束」,便于评测侧区分「答错」与「没开始」。

交付边界(2026-10-29 实测补充)

第 1 条的实际映射点不在 xwcore:xwrepl/crates/xwrepl/src/oneshot.rs::run() 收 TurnSummary 后返回 Ok(()),不读 finish_reason;xwkernel/kernel-host/src/boot.rs 一次性执行结尾 if let Err(..) { exit(1) }。⇒ xwcore 侧只能交判据面,接线须由上述归属仓执行。
另:结构化行 [xwcore] turn_end {json} 走 stderr,而评测侧只保留失败命令 stdout 前 1000 字符 ⇒ 该行可能到不了评测侧。

likedislike
kemengCollaborators
10 days ago Comments:

交付:xwcore MR !4 — https://gitcode.com/xuanwu-code/xwcore/merge_requests/4

  • 支 tx/v1106-b1b2-evidence @ 314a138(= tx/v1106-b1-stalled-exit@d23fc37 ⊕ tx/v1106-b2-plan-regex@6186a5d)→ master cb4b880,mergeable: True
  • 面:g1 0 / g2 rc=100(938 run / 935 pass / 3 fail) / g3 0 / g4 0 / g5 rc=1(FAIL=6)
  • 3 条 nextest 红与 g5 六项与 master 逐条同名同读数 ⇒ 本批引入红 0。证据:docs/test-verification/V1106-B1B2-EVIDENCE.md

⚠ 本件不可据此判「已闭环」。 期望 1(Stalled ⇒ 非零退出)未生效:
finish_exit.rs 无生产调用点,Stalled 永不变成 Err;映射点在 xwrepl/oneshot.rs::run() 与 xwkernel/boot.rs,均不在本仓。
第二缺口:turn_end 行走 stderr,评测侧只留 stdout 前 1000 字符。

⇒ 期望 2(nudge 注入)已交付;期望 1、3 待跨仓接线(接线方案已备,tx/v1106-b1-oneshot-exit,未入本 PR,待定归属仓)。
nudge 只降低散文退出概率(预算 2 用尽仍 Stalled),不改退出码。

likedislike
kemengCollaborators
10 days ago Comments:

pin 订正:tx/v1106-b1b2-evidence 尖已前进到 9a31150(上条评论写的 314a138 是取五闸读数那一笔)。
末笔只补证据档(+40/−3,零代码,git diff --stat 314a138..9a31150 仅 V1106-B1B2-EVIDENCE.md),
故 g1..g5 读数不变;MR !4 的 body 已同步为本尖。

likedislike
kemengCollaborators
9 days ago Comments:

#34 B 半 已出 MR:xwrepl !4 — https://gitcode.com/xuanwu-code/xwrepl/merge_requests/4

面三值:支 tx/v1106-b1-oneshot-exit · 尖 bc86f5348 · 树 9672b8fa · 基 e8fff6d78

改动 crates/xwrepl/src/oneshot.rs(+197/−20):把一次性运行的退出判决单点化成纯函数 map_run_result——

Stalled ∧ !has_patch ∧ modified_files 为空  ⇒  rc=1 (outcome=no_patch reason=stalled)
其余(含 TaskCompleted、有补丁的 Stalled)  ⇒  rc=0

三条件合取:has_patch 看不见未跟踪新文件,modified_files 由变更类工具调用记录,两条互补。

五闸(本仓实跑):fmt / clippy / nextest / 构建门 全 rc=0(nextest 91 passed,含 7 条新单测);L4 rc=1 为基线红,已用基线树逐面对表证实(两侧 10 条 FAIL 逐行相同)。

披露一处残余盲区:用 bash 直接建文件(cat >、sed -i)时两条信号都看不见,该类 turn 仍可能被判零动作——本 MR 不修。

请主线评审后合入;我不合主线、不关 issue。

likedislike
kemengCollaborators
9 days ago Comments:

收口证据(ar): 期望1=xwrepl !4已合入master 389d6117(R24树等+祖先链验讫;评审V1108_REVIEW_XWREPL_4之A-,支单测exit_decision 7/7); 期望2=xwcore !4已合(nudge注入); 期望3=结构化行outcome=no_patch随Err面输出。残余盲区(bash直建文件)已披露不修。判R17关闭门满足,收口。

likedislike
KkemengCollaborators
9 days ago Close issue
kemengCollaborators
9 days ago Comments:

纠错(ar): 我上一条称'期望2=xwcore !4已合'失实——xwcore !4仍open(现mergeable=False,与!12内容冲突)。判据未满足即关号是我的错。本号重开,待xwcore !4解冲突合入后再收口。B半(xwrepl !4)与A-评审结论不受影响。

likedislike
KkemengCollaborators
9 days ago Reopen issue
kemengCollaborators
9 days ago Comments:

再收口(ar): xwcore !4已合入master 74f4dda2(R24+补则验讫;去行号与!4注释双形并存,B-1/B-2两测试档在位)。重开条件满足,收口。

likedislike
KkemengCollaborators
9 days ago Close issue