68 lines
5.7 KiB
Markdown
68 lines
5.7 KiB
Markdown
# PROGRESS-report-density-fix2-20260923 · BUG-1011 快照 SQL E2BIG 修复
|
||
|
||
## 当前状态(2026-09-23)
|
||
|
||
**实现已完成,真实数据库验证仍待 Gitea Linux 门禁。** 本轮从更正后的 `origin/staging` 基线 `451a58089a2eaa8c7e5ae1f0648199b008aa0dc2` 建立独立 worktree;没有修改旧的 `staging-gate-red-20260923` worktree。BUG-1011 尚不能标记 resolved。
|
||
|
||
| 项 | 事实 |
|
||
| --- | --- |
|
||
| 工作树 / 分支 | `.worktrees/report-density-fix2-20260923` / `codex/report-density-fix2-20260923` |
|
||
| 基线 | `451a58089a2eaa8c7e5ae1f0648199b008aa0dc2`(任务书更正提交) |
|
||
| 根因 | 约 428,557 字节的完整快照 SQL 被放进 `psql -c` 单个 argv;Linux `MAX_ARG_STRLEN` 约 131,072,门禁真实报 `spawnSync docker E2BIG` |
|
||
| 本机 Docker | CLI/daemon 存在,Server `29.8.0`;创建 compose 网络时报 `all predefined address pools have been fully subnetted`,未清理其他会话网络 |
|
||
| 远端门禁 | 前一 run 2857 / validate job 6347 唯一失败仍是本 BUG;本轮代码尚未推送,暂无新 run |
|
||
| 状态 | investigating;等待真实 PostgreSQL 快照测试和完整数据库套件证据 |
|
||
|
||
## 实现与范围审计
|
||
|
||
### G1:专用 stdin 单事务 helper
|
||
|
||
- `frontend/tests/helpers/postgres-fixture.ts` 新增 `psqlScriptAs(role, password, sql)`。
|
||
- 既有 `psql` 与 `psqlAs` 的签名、argv、事务行为保持不变;未迁移其他数据库测试调用。
|
||
- 新 helper 通过 stdin (`input: sql`) 传输 SQL,使用 `-X -At -v ON_ERROR_STOP=1 --single-transaction -f -`,并设置 `maxBuffer: 16 * 1024 * 1024`。
|
||
- `database-personal-report-sections.test.ts` 仅把完整快照写入调用和大 JSON 读回调用切换到新 helper;其他 `psql` / `psqlAs` 调用保持原样。
|
||
- 完整虚构 reader Markdown、engine packet、snapshot JSON 构造、哈希、幂等/首版保留、owner-read RLS 与越权断言均未裁剪、删除或弱化。
|
||
- 新增 `database-postgres-fixture-contract.test.ts`:真实 fixture 路径构造 UTF-8 SQL 大于 131,072 字节,验证 `set_config(..., true)` 后续可见,并验证超过 1 MiB 的 stdout 能完整取回。这些运行时合同仍需可用 Docker 才能执行。
|
||
|
||
### G2:原值 / 新值 / 原因
|
||
|
||
| 原值 | 新值 | 原因 |
|
||
| --- | --- | --- |
|
||
| 完整快照写入使用 `fixture.psqlAs(...)`,SQL 作为单个 `-c` 参数 | 仅该大快照写入使用 `fixture.psqlScriptAs(...)`,SQL 经 stdin、整段单事务执行 | 避免 Linux `E2BIG`,同时保留 `set_config(..., true)` 所依赖的事务语义 |
|
||
| 完整快照读回使用默认 `fixture.psql(...)` 输出缓冲 | 该大 JSON 读回使用新 helper 的显式 16 MiB `maxBuffer` | 避免完整 payload 超过 Node 默认 1 MiB stdout 缓冲而产生 `ENOBUFS`;不改变断言 |
|
||
| 无大脚本运行时合同 | 新增超 argv 限制 SQL、事务本地设置可见性和大 stdout 合同 | 防止后续回退到 argv 传输或移除显式输出缓冲 |
|
||
|
||
## 验证账本
|
||
|
||
| 检查 | 结果 |
|
||
| --- | --- |
|
||
| `./node_modules/.bin/tsc --noEmit` | 通过,0 错 |
|
||
| `npm run lint` | 通过,0 error;保留仓库既有 119 条 warning,未顺修无关 warning |
|
||
| 受影响文件 ESLint | 通过,0 error |
|
||
| `tests/postgres-fixture-contract.test.ts` | 2/2 通过(不启动 Docker) |
|
||
| `tests/database-postgres-fixture-contract.test.ts` | 失败于 `startPostgresFixture()` 创建网络:`all predefined address pools have been fully subnetted`;未执行 SQL,不是 helper 或产品断言失败 |
|
||
| `tests/database-personal-report-sections.test.ts` | 同一 Docker 网络创建错误;未执行迁移、快照写入、读回或 RLS 断言 |
|
||
| `npm run test:db` | 47 tests / 8 pass / 39 fail;数据库 fixture 均在 Docker 网络创建时报 `all predefined address pools have been fully subnetted`,未执行 BUG-1011 SQL;本机环境缺口 |
|
||
| `npm test` | 3,707 tests / 3,618 pass / 89 fail / 0 skipped;相对本轮此前记录的 3,704 名称基线新增 3 个合同测试,未发现 BUG-1011 引入的业务失败;失败含既有 Windows 路径、Docker 地址池、symlink EPERM 与既有断言,不能记全绿 |
|
||
| `npm run build -- --webpack` | 编译与 TypeScript 通过;页面数据阶段因 Windows Skill runtime symlink `EPERM` 在 `/api/daily-starlanguage` 失败,未取得 Static/gzip |
|
||
| `node --import tsx --test tests/postgres-fixture-contract.test.ts` | 3/3 通过(静态合同,不启动 Docker) |
|
||
| `node --import tsx --test tests/database-postgres-fixture-contract.test.ts` | 1 fail(Docker 地址池创建前阻断),2 个静态 fixture 合同通过;没有执行 SQL |
|
||
| `./node_modules/.bin/tsc --noEmit` | 通过,0 错 |
|
||
| 受影响文件 ESLint | 通过,0 error |
|
||
| `git diff --check` | 通过 |
|
||
| `git diff --check` | 已通过当前代码差异检查 |
|
||
|
||
## 硬红线核对
|
||
|
||
- 未修改 `.gitea/workflows/**`、schema、RPC、migration、生产代码或共享 `psql` / `psqlAs`。
|
||
- 未删除、skip 或弱化测试;完整快照 fixture 与断言保留。
|
||
- 未使用 `git stash`、`reset`、`clean`、`rebase` 或强推。
|
||
- 未读取或提交 `references/oracle/artifacts/pending_packets` 内容;未读取、猜测或借用凭据;未清理其他会话 Docker 资源。
|
||
- staging 推送、Gitea 新 run、publish/deploy 与 health SHA 尚未发生,不能预写成功。
|
||
|
||
## 下一步
|
||
|
||
1. 完成本机可执行的静态、前端与构建验证,并如实记录环境失败。
|
||
2. 仅提交本单允许文件;推送前 fetch 并核对远端 staging,若有并行推进则保留双方历史,不强推。
|
||
3. 推送后读取 Gitea validate 日志。只有 `database-personal-report-sections.test.ts`、新增大脚本合同和全部 `tests/database-*.test.ts` 在 Linux runner 通过,且无其他失败,才把 BUG-1011 改为 resolved;否则保留 investigating 并记录原文。
|