fix(gate): keep quality-gate logs readable (BUG-1230)

Summarize successful steps, print the failing check and error text,
and split the validate job into seven steps. Local npm test stays TAP.
This commit is contained in:
jesse-ux
2026-10-04 22:58:17 +08:00
parent 06bfae92d8
commit 2c64b66423
11 changed files with 729 additions and 40 deletions
+15
View File
@@ -16612,3 +16612,18 @@
- 相关记录:BUG-1224、BUG-1227。
- 复发自:无
- 修复版本:待发布
## BUG-1230 | 门禁 validate 单步日志过大,失败页打不开
- 状态:resolved(分支 `codex/gate-log-volume-20261004`)
- 首次发现 / 最近更新:2026-10-04 / 2026-10-04
- 来源:第六批 `baf4ae8b` 的门禁失败(Gitea task 6691、run 3170)。产品负责人打开 job 页时,「Validate backend, package, frontend, and database contracts」这一步日志打不开,看不到报错。任务书 `docs/tasks/TASK-gate-log-volume-20261004.md`。当时 staging 仍部署 `153c6e99`。
- 影响面:`.gitea/workflows/backend-quality-gate.yml` 的 validate job;`scripts/run_quality_gate.py` 的默认输出;`frontend` 的 `npm test` 在 CI / Gitea 下的输出。触发条件、paths 过滤、job 依赖、runner、密钥、超时、发布与部署未改。
- 现象:这一步把 ruff、py_compile、快速门、隐私扫描、`python -m build`、`npm test`、lint 合成一个 run(非 push 还有前端构建)。写任务书时本机测得:`npm test` 约 26,800 行,快速门约 14,000 行,`python -m build` 约 2,900 行,合计 4.4 万行以上、2 MB 以上。成功的检查也刷屏,失败点埋在中间,网页渲染不出来。
- 根因:门禁把全部明细当默认输出,并且把 7 个检查挤在同一个 step。
- 修复:快速门默认改为捕获子进程输出。成功只打一行;失败打失败标记、退出码和最后 200 行,完整输出写到 `gate-logs/` 并打印路径。`--verbose` 恢复原来的透传。没有给子进程新加超时。前端 `npm test` 在本机仍输出 TAP;在 CI / Gitea 用点号进度,完整 TAP 写到 `gate-logs/frontend-tests.tap`,日志末尾打 tests / pass / fail / cancelled,以及每条失败的名字和报错正文(每条最多 60 行)。点号报告自带的整段堆栈不再重复打进日志。退出码仍是测试进程的退出码。workflow 把原来的一个 step 拆成 7 个顺序 step;`python -m build` 的明细写入 `gate-logs/python-build.log`,失败时打最后 200 行再以原退出码退出。
- 验证:本机测量见 `docs/tasks/PROGRESS-gate-log-volume-20261004.md`。快速门精简输出 18 行且退出码 0。`--verbose` 打出 27,093 行;同一次里有一条既有测试失败,单独重跑通过。`CI=true npm test` 仍能看到失败名字和报错正文,退出码为 1(本机既有失败,不是这次改出来的)。合同测试锁住 7 步顺序、`set -euo pipefail` 和构建重定向。Gitea 网页是否打得开要等推送后第一次门禁,本记录不声称页面已经打开。
- 防复发:`tests/test_run_quality_gate_output.py`;`frontend/tests/staging-backend-workflows.test.ts` 里原有两条测试加上步序、禁止 `continue-on-error`、构建重定向。没有新增 `test()`。
- 相关记录:BUG-995(前端测试要同时看 cancelled 和退出码)。
- 复发自:无
- 修复版本:待发布
@@ -0,0 +1,70 @@
# PROGRESS:门禁日志体积 — 2026-10-04
基线 `origin/staging` `06bfae92`。分支 `codex/gate-log-volume-20261004`,工作树 `.worktrees/gate-log-volume-20261004`。未提交,未推送,未部署。Gitea 上各 step 页面是否打得开,留待推送后由产品确认。
## 做了什么
1. 快速门默认只打摘要。通过一行,失败打标记、退出码、最后 200 行,完整输出写到 `gate-logs/`。`--verbose` 恢复原来的整份输出。没有新加子进程超时。
2. 前端 `npm test` 本机仍是完整 TAP。门禁环境(`CI` 或 `GITEA_ACTIONS`)打点号进度,完整 TAP 写到 `gate-logs/frontend-tests.tap`,末尾打 tests / pass / fail / cancelled,以及每条失败的名字和报错正文(每条最多 60 行)。点号报告自己还会再打一遍整段堆栈,那一段不进日志,避免同一条失败打两遍。
3. 门禁 workflow 把原来的一个 step 拆成 7 个顺序 step。`python -m build` 的明细写入 `gate-logs/python-build.log`,失败打最后 200 行,退出码不变。触发条件、paths、job 依赖、runner、密钥、超时、发布和部署没动。
4. 记录:BUG-1230、CHANGELOG、本文件、状态板改为「已实现待验收」。
## 行数
任务书里的 26,800 / 14,000 / 2,900 是写任务书时的测量。下表「改前」里标「本轮实测」的,是这次在同一台 Windows 上、改代码前抓到的日志。
| 输出 | 改前 | 改后 |
| --- | --- | --- |
| 快速门 `--profile quick --skip-yoga-logic --skip-frontend-runtime` | 任务书约 14,000 行 | 18 行,退出码 0,用时 929 秒 |
| 同一条命令加 `--verbose` | 与改前同类(子进程整份输出直接打出) | 27,093 行。退出码 1:1,056 通过、1 失败、1 跳过。失败的是既有测试 `test_the_new_layer_leaves_every_existing_output_unchanged`(两次算盘对不上)。精简模式的全门是通过的;这条事后单独重跑也通过。不是这次输出改动引进的 |
| 本机 `npm test`(不设 CI) | 36,122 行;4,844 tests / 4,700 pass / 144 fail / 0 cancelled | 36,140 行;汇总相同;失败名字顺序与改前相同 |
| `CI=true npm test` | 先做的一版 7,128 行(点号进度的整段堆栈,再加上每条失败的完整诊断) | 1,144 行。没有 `Failed tests:` 那一段。汇总仍是 4,844 / 4,700 / 144 / 0。134 条失败名字与精简前相同,报错正文还在(例如迁移文件重名、EBUSY)。退出码 1 |
| `python -m build` | 任务书约 2,900 行 | 本机没再跑。workflow 改为写入日志文件,失败只打末 200 行 |
`CI=true` 在这台机器上是 1,144 行,超过任务书写的 600 行。原因是这台机器有 144 条失败,不是任务书里的 24 条。点号进度本身大约 248 行(Node 在非终端下每行 20 个点,4,844 个测试约 243 行)。每条失败平均再占 6.65 行。按这个长度,24 条失败大约 413 行,全绿大约 253 行,都低于 600。失败名字和报错正文没有拿掉。
这 144 条是这台 Windows 上本来就有的:迁移文件名重复(符号链接被检出成普通文件)、`G:\G:\` 路径、建符号链接没有权限、临时目录删不掉、没有 bash。改前改后的失败名单一致,不是这次改出来的。
## 检查集合对照
命令和参数没有增删。只是从同一步拆开,构建的输出改道。
| 检查 | 拆分前 | 拆分后 |
| --- | --- | --- |
| `ruff check` 那 5 个文件 | 唯一的 validate step | `Lint and compile Python` |
| `python -m py_compile scripts/*.py jyotish_vedic/*.py mcp_server.py` | 同一步 | 同一步 |
| `python scripts/run_quality_gate.py --profile quick --skip-yoga-logic --skip-frontend-runtime` | 同一步 | `Python quality gate (quick)` |
| `python scripts/commercial_privacy_artifact_scan.py --json` | 同一步 | `Privacy artifact scan` |
| `python -m build` | 同一步,明细直接打进该 step | `Build Python package`,明细进 `gate-logs/python-build.log`,失败 `tail -n 200` 后用原来的退出码退出 |
| `npm test --prefix frontend` | 同一步 | `Frontend and database tests` |
| `npm run lint --prefix frontend` | 同一步 | `Frontend lint` |
| 非 push 才 `timeout 600 npm run build --prefix frontend -- --webpack`,超时文案后 `exit 124`;push 只打原来那句 echo | 同一步 | `Frontend production build (non-push)` |
`mkdir -p gate-logs` 放在第一步里,不是第八个检查。没有用成功码吞掉失败,也没有 `continue-on-error`。三处 `npm test` / `lint` / `build` 仍各出现 1 次。
## 合同断言三栏
没有新增 `test()`。下面三处改的是原有测试里的字符串。
| 断言 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| 安装步骤的结束边界 | `Validate backend, package, frontend, and database contracts` | `Lint and compile Python` | 下一段改了名,安装步骤正文没变 |
| 提取 npm install 脚本的切分点 | 换行后 `- name: Validate backend` | 换行后 `- name: Lint and compile Python` | 切分点跟着下一段的名字 |
| `python -m build` | 整行就是 `python -m build` | 重定向到 `gate-logs/python-build.log`,失败时记下退出码再 `tail -n 200` | 明细写入文件,失败打末 200 行。仍然禁止 `--no-isolation` |
这两条测试重跑:2 tests,2 pass,0 fail,0 cancelled。
## 其他验收
| 项 | 结果 |
| --- | --- |
| `tsc --noEmit` | 0 错 |
| `npm run lint` | 0 error,126 条原有 warning,没改 |
| 英文对照 + 隐私标记 | 68 条通过,退出码 0 |
| 快速门里的 `tests/test_run_quality_gate_output.py` | 随快速门一起通过(退出码 0) |
| ruff(改过的两个 Python 文件) | 通过 |
| 前端测试总数 | 仍是 4,844,没有新增测试文件 |
| `next build` | 没跑。这次不改页面,任务书验收口径没有要求 |
| 推送 / 部署 / Gitea 页面 | 没做 |
快速门跑的时候改写了 `references/oracle/artifacts/pending_packets/` 下 5 个模板文件。那不是本单的改动,收尾时还原,不提交。
+1 -1
View File
@@ -420,4 +420,4 @@
| `TASK-astrologer-rulings-batch4-20261003.md` | `PROGRESS-astrologer-rulings-batch4-20261003.md` | Rath 当前大运进全部领域卡(卡预算 12,000→12,500、总 18,000→18,500,修改 BUG-1160/1161 决定);报告年运强度表改 Tajika 五分法(与年主同口径);校正打分不换,等第六轮 | 已实现待验收(T1–T3 完成) | 分支 `codex/astrologer-rulings-batch4-20261003`(未推送;BUG-1221~1222;校正分数不变、未升版本) |
| `TASK-astrologer-rulings-batch5-20261004.md` | `PROGRESS-astrologer-rulings-batch5-20261004.md` | 占星师第六轮:Rath 双主星按 p.43(a)–(e)、罗计尊贵按 Rath Table 9(仅 Narayana 内)、子运方向 p.51 例外与书内分歧标注、Wadiyar 两对标软件特例;年主选不出时不再用 Muntha 主星顶替(对齐上游 03bea6ed);Rath 替换校正 v5 重试算(研究)(BUG 从 1223 起) | 已实现待验收(T2–T5 完成;T1 按红线停下 blocked;T6 研究分支已跑) | 分支 `codex/astrologer-rulings-batch5-20261004`(未推送;BUG-1223~1227;校正分数不变、未升版本);研究分支 `codex/narayana-rath-rectification-trial-20261004`(不合入) |
| `TASK-astrologer-rulings-batch6-20261004.md` | `PROGRESS-astrologer-rulings-batch6-20261004.md` | 第七轮裁定(共享仓书面回复,产品采用;问 1 选 A):Rath 版双主星按 p.43 (a)–(e)(BUG-1227 解除 blocked,推翻第五批红线 2 的 Table 17 年数底线);第 5 级宫主度数只倒算计都(p.71 脚注 42);罗计旺陷 ±1 年;同宫两主比经度;BUG 从 1228 起 | 待验收 | 分支 `codex/astrologer-rulings-batch6-20261004`(BUG-1227~1229;校正分数文件未改、未升版本) |
| `TASK-gate-log-volume-20261004.md` | `PROGRESS-gate-log-volume-20261004.md` | 门禁 validate 单步日志 4.4 万行 / 2 MB 网页打不开(run 3170):快速门只打摘要(失败给末 200 行 + 日志文件)、前端测试门禁上 dot + 失败汇总(本机仍 TAP)、拆分 validate 为 7 个 step(产品授权改 workflow,只限拆分与重定向);检查一项不少 | 待领取 | 分支 `codex/gate-log-volume-20261004` |
| `TASK-gate-log-volume-20261004.md` | `PROGRESS-gate-log-volume-20261004.md` | 门禁 validate 单步日志 4.4 万行 / 2 MB 网页打不开(run 3170):快速门只打摘要(失败给末 200 行 + 日志文件)、前端测试门禁上 dot + 失败汇总(本机仍 TAP)、拆分 validate 为 7 个 step(产品授权改 workflow,只限拆分与重定向);检查一项不少 | **已实现待验收**(BUG-1230;未推送、未部署;Gitea 各 step 页面是否打得开留待推送后由产品确认) | 分支 `codex/gate-log-volume-20261004` |