Record scope, receipts and independent review for the pipe hazard sweep
ci / svc-realcombo (pull_request) Failing after 7m45s
ci / test (pull_request) Failing after 22m29s
ci / test-pg (pull_request) Successful in 26m10s

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
This commit is contained in:
2026-10-20 15:52:10 +00:00
parent b9a0309aa4
commit 4d93a7767d
+15 -8
View File
@@ -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/分支/任务卡处置)