Files
Jyotisha/docs/tasks/PROGRESS-report-density-fix2-20260923.md
T

74 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PROGRESS-report-density-fix2-20260923 · BUG-1011 快照 SQL E2BIG 修复
## 当前状态(2026-09-23)
**BUG-1011 已修复,Gitea 门禁全绿,staging 已部署。** 修复提交 `018b2b4883eede47dae60f8860d92da0fac82f5e`;run **2858** / validate job **6349** 为 **3,764 pass / 0 fail / 0 skip**,publish job **6350** 成功。匿名 `/api/health` 返回 200,`deployment.gitCommit` 与 `deployment.apiGitCommit` 均等于修复 SHA;`/login` 200、未登录 `/api/account` 401。未提升 main。
| 项 | 事实 |
| --- | --- |
| 工作树 / 分支 | `.worktrees/report-density-fix2-20260923` / `codex/report-density-fix2-20260923` |
| 基线 | `451a58089a2eaa8c7e5ae1f0648199b008aa0dc2`(任务书更正提交) |
| 开工 Bug 最大号 | BUG-1014;本单修复既有 BUG-1011,不新增编号 |
| 根因 | 约 428,557 字节的完整快照 SQL 被放进 `psql -c` 单个 argv;超过 Linux `MAX_ARG_STRLEN` 约 131,072 字节 |
| 原门禁 | run 2857 / validate 6347:3,762 tests / 3,761 pass / 1 fail,唯一失败为 `spawnSync docker E2BIG` |
| 本轮门禁 | run 2858 / validate 6349:3,764 tests / 3,764 pass / 0 fail;cancelled/skipped/todo 均 0 |
| 名称多重集合 | 比较上述两个真实 job 完整日志:既有名称消失 0,新增恰好 2 条,新增失败 0 |
| 本机 Docker | Server `29.8.0` 可用,但 compose 创建网络报 `all predefined address pools have been fully subnetted`;未清理其他会话资源 |
## G1:实现与范围审计
- `frontend/tests/helpers/postgres-fixture.ts` 新增 `psqlScriptAs(role, password, sql)`,stdin `input: sql`,参数 `-X -At -v ON_ERROR_STOP=1 --single-transaction -f -`,显式 `maxBuffer: 16 * 1024 * 1024`。
- 既有 `psql` 与 `psqlAs` 实现、签名和 argv 一字未改。其余测试继续使用原有单事务 `-c` 路径。
- `database-personal-report-sections.test.ts` 仅更换完整快照写入和大 JSON 读回两个调用入口。后者依据任务书 G1 的显式大缓冲要求;不裁剪 payload,也不把完整对象比较降级成局部检查。
- reader Markdown、engine packet、snapshot 构造、哈希、首版保留与越权隔离等原断言原样保留。
- 新增 `database-postgres-fixture-contract.test.ts`,真实启动 fixture,执行 UTF-8 大于 131,072 字节的 SQL;验证事务本地 `set_config(..., true)` 对后续查询仍可见,并完整取回 1,048,577 字节 stdout。
- 原静态 `postgres-fixture-contract.test.ts` 新增 stdin / maxBuffer / 单事务 / 旧 `-c` 路径合同;其首次新正则遗漏换行,已在提交前改为匹配空白并复验 3/3。没有为通过测试修改共享 helper。
- 独立只读审查未发现具体缺陷,确认共享 helper、完整 fixture 与原断言不变。运行证据以下列真实 Gitea 日志为准,不以审查替代运行。
## G2:原值 / 新值 / 原因
| 原值 | 新值 | 原因 |
| --- | --- | --- |
| 完整快照写入走 `fixture.psqlAs(...)`,SQL 作为单个 `-c` 参数 | 仅该大快照写入走 `fixture.psqlScriptAs(...)` | 避免 E2BIG,保留整段单事务语义 |
| 大 JSON 读回走默认输出缓冲的 `fixture.psql(...)` | 读回走新 helper 的显式 16 MiB 缓冲,仍用 postgres 角色 | 防止默认 1 MiB 输出缓冲导致 ENOBUFS;原完整对象断言不变 |
| 无大脚本及大输出运行时合同 | 新增超 argv 限制 SQL、事务本地设置与大 stdout 合同 | 防止传输和事务语义回归 |
| 原快照、幂等、RLS 断言 | 全部原样 | 本单只修测试传输,不改产品性质或断言标准 |
## 本机验证(不等同远端通过)
| 检查 | 实际结果 |
| --- | --- |
| `tsc --noEmit` | 0 错 |
| `npm run lint` | 0 error / 119 既有 warning;未顺修无关 warning |
| 受影响测试文件 ESLint | 0 error |
| 静态 fixture 合同最终复验 | 3/3,通过;不启动 Docker |
| 目标快照与新运行时合同定向 | 均失败在 Docker 网络创建,未执行 SQL;不是产品断言失败 |
| `npm run test:db` | 47 tests / 8 pass / 39 fail / 0 skip;含 Docker 网络、Windows symlink 与路径相关失败,不能说所有失败均为 Docker |
| `npm test` | 3,707 tests / 3,618 pass / 89 fail / 0 skip;该次运行未包含后来新增的静态合同,不能将其写成最终全量成绩或名称对照完成。最终名称比较以 Gitea 两个 job 为准 |
| `npm run build -- --webpack` | webpack 与 TypeScript 通过;页面数据阶段因 Skill runtime alias `symlink EPERM` 在 `/api/daily-starlanguage` 失败;本机 Static/gzip 未取得 |
| `git diff --check` | 通过 |
本机初次定向因新树缺 `tsx` 无法启动,随后复制相同锁文件对应的既有依赖,不升级依赖。两次指定固定日志路径的重定向被工具拒绝后,改用工具自动创建的后台日志,未覆盖被拒目标。
## Gitea 真实数据库与门禁证据
[run 2858](https://git.copse.top/root/Jyotisha/actions/runs/2858),validate **6349**,日志明确包含:
- `ok 1269 - personal report sections enforce owner-read RLS and service-owned durable transitions`
- `ok 1270 - stdin PostgreSQL scripts carry large SQL and preserve transaction-local settings`
- `ok 1872 - large PostgreSQL scripts use stdin without changing shared -c helpers`
- `# tests 3764` / `# pass 3764` / `# fail 0` / `# skipped 0`。
完整 `test:db` 本机命令列出的 47 个测试名称,逐一在 validate 6349 日志中找到 `ok` 记录,无缺失;门禁通过证据来自完整 `npm test` 中的数据库用例,不声称门禁另跑了独立 `test:db` 命令。migrate run 2859/job 6351 和 deploy run 2860/job 6352 均成功。匿名 health 未提供 `swisseph_available` 字段,本轮没有额外访问内部健康接口,不将该字段写成已验证。
与 job 6347 的名称多重集合比较:`REMOVED []`;新增只有上述两条 helper 合同。原快照测试首次真正执行完整落库、冲突完成保留首版和他人不可读断言,全部通过,未触发任务书的产品断言失败停止条件。
## 交付与边界
- 正常快进推送 `451a5808 → 018b2b48`,`ls-remote` 已核对完整 SHA。
- publish 6350 成功;后续 run 2859、2860 成功。部署健康 SHA 已追上代码提交。后续验收文档为纯文档,不应触发新部署。
- 没有生产代码/UI 改动;没有改 workflow、schema、RPC、migration、main 或 DNS。
- 未删测试、加 skip、缩短快照;未使用 stash/reset/clean/rebase/强推;未读取保护 pending packets 或借用账号,未清理他人 Docker 资源。
- 仅使用用户已配置并授权的 Gitea token 在内存请求头读取门禁;未打印或落盘凭据。未运行本机跨库 quick/隐私扫描,不声称本机全库隐私通过。
- 本机 Windows 构建与 Docker 缺口保留;本次门禁与部署成功不能代替报告登录态、真机打印等原真人清单验收。