From 4d93a7767d9e9e6218e01cea41f7d259f8d415f6 Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 20 Oct 2026 15:52:10 +0000 Subject: [PATCH] Record scope, receipts and independent review for the pipe hazard sweep Why: the sweep needs its authorization boundary, three agent unit receipts and the review verdict recorded before delivery. Evidence: /tmp/svc-pipefail-impl-r1-20261020.json (cursor, success, f87d63f), /tmp/svc-pipefail-review-r1-20261020.json (pi-glm, PASS, 2ef67de), /tmp/svc-pipefail-repair-r2-20261020.json (cursor, success, 5fadf85); review report .task/reviews/2026-10-20-svc-pipefail-independent-review.md. Impact: card metadata only; no behaviour change. Refs: fix/svc-pipefail-early-exit-pipes --- .task/fix-svc-pipefail-early-exit-pipes.md | 23 ++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/.task/fix-svc-pipefail-early-exit-pipes.md b/.task/fix-svc-pipefail-early-exit-pipes.md index 97ec61a6..5f846c1c 100644 --- a/.task/fix-svc-pipefail-early-exit-pipes.md +++ b/.task/fix-svc-pipefail-early-exit-pipes.md @@ -7,7 +7,7 @@ - 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false - 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=995ae1c10a5bed201669a98755fcd9db243864384184f224d037521c25d156fb;triage_receipt=/tmp/triage-pipefail-class-20261020.json;receipt_sha256=a136d676c51767e6fc53e36b96e6d518cd235ccc9ad4a77a14449ace86136d8f -- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> +- 授权与交付终点:消除本仓受管 shell 脚本在 `set -o pipefail` 下的早退读取器管道隐患,并加守护测试防复发;按现行门禁完成 Review、PR、CI、合入、任务卡闭合与安全回收。不得改动任何命令的语义与退出码契约,不得改 Makefile/CI/子模块/规范文档,不得用 `|| true`、`set +o pipefail` 掩盖状态,不得新增 schema/开关/通用重构。 - 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进) - 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md) - 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) @@ -15,7 +15,11 @@ ## 目标与非目标 -<预期结果、受影响入口/模块/契约;明确不做什么。> +目标:`producer | grep -q PAT`、`... | head -N`、`awk ... exit` 这类「读取器先退出」的管道,在 `set -euo pipefail` 下会让写满 64KiB 管道缓冲的生产者收到 SIGPIPE,管道状态变成 141 而非读取器结论,`if` / `if !` / `&&` 的判定被静默翻转。本任务把本仓受管脚本(`scripts/svc.sh`、`scripts/task.sh`、`scripts/e2e.sh`、`scripts/lint-boundaries.sh`、`docker/verify-env.sh`、`tests/load/collaboration/run_pgbench.sh`)中的此类管道改为语义等价且读取器退出码不再经过管道形态,并新增 `tests/test_shell_pipe_hazard.py` 守护测试防止复发。受影响入口:`make task-finish`、`make precheck`、`make svc` 系列与环境校验。 + +非目标:不改变任何命令的行为、退出码与调用顺序;不修 `runtime/` 下的 ignored 陈旧克隆;不改守护测试的检测范围(中段读取器、`awk exit`、`| read`、前缀化 grep 等盲区按 Review 建议保留为非阻塞);不改 Makefile、CI、子模块 pin、共享规范子模块与文档;不新增 schema、运行时开关或通用化重构。 + +验收条件:(1) 受管脚本中不再有末级早退读取器管道,守护测试通过;(2) 变换前后行为等价(含命中/未命中/多行匹配/命令替换取值/退出码),并有对照证据;(3) `make test-governance` 与 `test_svc*.py` 全绿;(4) 独立 Review 无阻塞项。 ## Agent 实施收据 @@ -23,13 +27,16 @@ | 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 | |---|---|---|---|---|---|---|---|---|---|---| -| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — | +| svc-pipefail-early-exit-pipes | 6 个受管脚本 + `tests/test_shell_pipe_hazard.py` | 本仓 AGENT-EXECUTION.md | implementation | cursor, antigravity, pi-glm, pi, codex | 1 | cursor / auto | success | success (`f87d63f`) | false | `/tmp/svc-pipefail-impl-r1-20261020.json` | +| svc-pipefail-independent-review | `.task/reviews/2026-10-20-svc-pipefail-independent-review.md` | 同上 | review | pi-glm, pi, antigravity, cursor, codex | 1 | pi-glm / zai-coding-cn/glm-5.3-flash | success(PASS,无阻塞项) | success (`2ef67de`) | false | `/tmp/svc-pipefail-review-r1-20261020.json` | +| svc-pipefail-residual-sites | `scripts/svc.sh` | 同上 | repair | cursor, antigravity, pi-glm, pi, codex | 2(r1 failed-unknown:cursor `auto` 模型不可用,零产物不导入) | cursor / auto | success | success (`5fadf85`) | false | `/tmp/svc-pipefail-repair-r2-20261020.json`(r1:`/tmp/svc-pipefail-repair-r1-20261020.json`) | ## 同步记录 | 节点 | sync_base_sha | tested_head_sha | checked_at | |---|---|---|---| | 启动 | 7e19cf3e182b566bdc48a7e690e44ff11b4ab33c | 7e19cf3e182b566bdc48a7e690e44ff11b4ab33c | 2026-10-20T14:22:14Z | +| 交付前同步(最终) | 6a7f008ed491e813d7f43fb013cb9542d849ff85 | b9a0309aa4b517d95012b83086a4e02b0d02da85 | 2026-10-20T15:48:20Z | ## 证据(Evidence) @@ -39,14 +46,14 @@ ## 结果与验证(完成后填写) -- 结果: -- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表> -- 影响与剩余项: +- 结果:6 个受管脚本中共 41 处早退读取器管道改为语义等价形态——变量入管道改 here-string(`grep -q PAT <<<"$var"`)、命令生产者改进程替换(`grep -q PAT < <(producer)`,二进制 `grep -qa` 亦走进程替换以避免 NUL 截断)、`sed … | head -1` 改 `sed -n '/re/{s//x/p;q;}'`;另新增 `tests/test_shell_pipe_hazard.py`(词法扫描管道末级 + 可失败的合成自检)。未使用 `|| true` / `set +o pipefail` 掩盖状态。 +- 验证:PASS——行为对照 `/tmp/pipefail-demo-evidence-20261020.json`:旧式在 >64KiB 生产者下把命中分支错误地跳过,新式正确命中,小输入语义不变;dsn 提取新旧表达式在命中/未命中/值内含伪 dsn/文件缺失/多行匹配五种输入下逐一 MATCH(`/tmp/dsn-equiv-evidence-20261020.json`);6 个脚本 `bash -n` 全过;最终 HEAD 上守护测试 4 项 OK、`test_svc*.py` 213 项 OK(18 skipped)、`make test-governance` 518 项 OK(18 skipped)。真实故障参照:PR #657 修复前 Backend 组件索引 76386 字节、旧式管道 rc=141。 +- 影响与剩余项:不改变任何命令的行为与退出码调用方式;进程替换后生产者自身的退出码不再参与 `if` 判定(Review 逐处判定为修正旧判定翻转或中性等价)。非阻塞(按 Review 建议保留):守护测试仅覆盖末级读取器,中段 `| head`、`awk … exit`、`| read`、前缀化 `grep` 为已知盲区;`SCRIPTS` 元组硬编码,新增受管脚本需手动登记。 ## 合入与清理 -- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据) -- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测) +- Review 记录:PASS(独立会话 pi-glm / zai-coding-cn/glm-5.3-flash;base 7e19cf3e182b566bdc48a7e690e44ff11b4ab33c,head 2ef67de19e8bceb0eaa1b4ab1dba4667fc108212;报告 `.task/reviews/2026-10-20-svc-pipefail-independent-review.md`;无阻塞项,4 项非阻塞建议;其点名的 svc.sh 三处残留已由 repair 单元 `5fadf858` 收干净,重放依据:host 行为对照 + dsn 等价对照 + `test_svc*.py`/治理套件) +- 冲突记录:NOT_RUN(一次交付前同步 `make task-sync`,无冲突;业务差异始终限于 6 个脚本、1 个新增测试与任务记录) - CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果) - 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验) - 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)