diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 5e518b7a..7953bcc7 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -172,6 +172,7 @@ | 发布缺口 | [gap-matrix](../remediation/gap-matrix.md)(`production_ready=yes`;Wave 0 IAM 只读未发现旁路) | | 连续性审计/计划 | [audit](../audit/2026-09-16-feature-matrix-production-readiness-audit.md) · [remediation](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) · [Wave 0 任务](./short-term/2026-09-16-feature-matrix-wave0-calibration.md) | | 测试报告 | [test-reports/](../test-reports/) | +| dev→test 晋升前复核 | [research](./research/2026-09-19-pre-test-promotion-review.md)(2026-09-19 只读;静态门禁过,容器未 rebuild,暂不合并) | | D7 盘点(W7) | [audit](../audit/2026-09-17-d7-data-inventory.md) · [报告](../test-reports/2026-09-17-w7-d7-inventory-test-report.md) · ADR 仍 `pending-compliance-signoff` | | Wave 7 编排确认 | [决策记录](./short-term/2026-09-18-wave7-roadmap-orchestration.md) | | Agent 手册 | [AGENTS.md](../../AGENTS.md) | diff --git a/.doc/ops/research/2026-09-19-pre-test-promotion-review.md b/.doc/ops/research/2026-09-19-pre-test-promotion-review.md new file mode 100644 index 00000000..dc197ae5 --- /dev/null +++ b/.doc/ops/research/2026-09-19-pre-test-promotion-review.md @@ -0,0 +1,151 @@ +--- +title: "dev→test 晋升前复核:功能权限、合并可行性、已知缺陷" +created: 2026-09-19 +updated: 2026-09-19 +status: done +confidence: high +--- + +# 调研:dev→test 晋升前复核 + +只读复核。不改业务代码、不 rebuild 容器、不合入 `test`/`main`、不修复 [medium/low backlog](../long-term/2026-09-19-audit-remainder.md)。 + +## 结论 + +1. **规划内的功能、权限与流程已按声明范围接入。** [FEATURE-MATRIX](../../status/FEATURE-MATRIX.md) 主表里,除明确标成 `partial` / `deferred` 的行以外,其余能力均为 `done`,并有测试报告或 commit 证据。没有发现「规划了但完全未实现」的模块。未完成项是主动延后,且 [gap-matrix](../../remediation/gap-matrix.md) 已判定不挡首发。 +2. **`dev` 的静态质量达标,但现在不建议直接合并入 `test`。** `go vet` 与 `go test -short` 全绿,2026-09-19 深度审计的 critical/high 已合入 `dev`。合并前仍缺三件事:dev 容器 rebuild 冒烟、治理 PG 集成与前端构建、批 2 越权负例的自动化覆盖。 +3. **critical/high 已关闭;medium/low 仍在,且本轮不修。** 新发现的观察项是文档漂移和 `test` 分支上 9 个晋升提交,不是新的代码缺陷。 + +## 一、功能、权限、流程 + +对照 [FEATURE-MATRIX](../../status/FEATURE-MATRIX.md)(更新 2026-09-19)与 [gap-matrix](../../remediation/gap-matrix.md)(`production_ready=yes`,门禁 B1–B4 已签)。 + +### 已关闭(声明范围内 `done`) + +| 能力 | 接入情况 | +|------|----------| +| 意图识别 L1、多意图 U1–U8、多意图扩面 U9–U12 | 代码与报告齐全;`MULTI_INTENT_PLAN_TIER` 仍为 `legacy`,未默认升 `confirm`/`full` | +| 对话 / ctxmgr、语义摘要 D3、PI change-report 叙事 | 刷新恢复门禁已签;摘要与叙事 flag 默认 off,REPLACE 未启用 | +| 工作流治理 | 三正式工作流、动作级鉴权、真实 PI E2E | +| 文档治理、文档版本 baseline | 法定生命周期、租约、受控正文、运行时 UI | +| IAM / 鉴权 | 项目级 API + RBAC;路由清单见 [authorization-matrix-v3](../../audit/authorization-matrix-v3-full.md) | +| 前端工作台、PI Runner、三环境运维、CI/E2E、Artifact 同 digest、可靠事件核心、系统管理台 | 各自行有报告;系统管理台二期(Playwright、细粒度 `system:*`、设置审计)不在本行关闭条件内 | +| 文档编制人兼任(U1–U6) | 已合入 `dev`;总开关默认 off | + +2026-09-19 审计批 2 已把鉴权缺口接到主链:H1 给 dev/test legacy 兜底加了告警(未删除兜底)、H2 批注/认领 actor 取 principal 且读类端点校验项目成员、H3 会话查询跨用户 403、H4 登录限流、H8 compose 口令改为必填。证据:[批 2 报告](../../test-reports/2026-09-19-audit-b2-authz-hardening-test-report.md)。 + +### 明确未完成(不是遗漏) + +| 行 | 状态 | 剩余 | 是否挡首发 | +|----|------|------|------------| +| 研发设计控制(rdev) | partial | S2/S3、P2 前端、P3 三样本 E2E、P4 键名空间化 | 否 | +| 纯软件项目自举 | partial | SWBOOT-10 仍 fail-closed stub | 否 | +| Final Artifact Vault | partial | live 未放量;禁止整支 merge;`FAV_DEGRADED_READ=false` | 否 | +| 对话数据治理(D7) | deferred | `pending-compliance-signoff`;禁止按口径物理删除 | 否(违规则才升 blocker) | +| 首次加载性能 | partial(矩阵外专项) | U2 已验收;U1/U3–U7 未做 | 否 | + +红线与代码/compose 对齐(深度审计已核实,本轮未再改 flag):`MULTI_INTENT_PLAN_TIER=legacy`、`SEMANTIC_SUMMARY_REPLACE` 未接线、`FAV_DEGRADED_READ=false`、SWBOOT-10 fail-closed stub、项目 143 只读。 + +## 二、`dev` 能否合入 `test` + +**判断:静态门禁通过,运行态与回归门禁未补齐,暂不合并。** + +### 已满足 + +- `dev` 工作树在复核时干净;`dev` HEAD 为 `66421b1`(含审计批 1–4:`844f757`、`08f4e0b`、`a2a49a6`、`d73bc79`)。 +- `go vet ./...` 零告警。 +- `go test -short ./...` 全包 PASS(`internal/server` 本轮实测约 14s,非缓存)。 +- 三环境 `GET /api/v1/health` 均为 `status=ok`、`schema_version=52`、`schema_ready=true`。goose 最新文件为 `00052`。迁移版本本身不阻塞晋升。 +- `internal/`、`cmd/` 生产代码中无 `TODO`/`FIXME`/`XXX`。 + +### 合并前必须处理 + +1. **dev 容器仍是旧二进制。** 批 1–3 报告写明未执行 `./scripts/env-service.sh dev rebuild`。`:8080` 健康只证明旧镜像在跑,不能证明审计修复已部署。按 [AGENTS.md](../../../AGENTS.md) §6.3,合入共享环境前要占集成槽位并冒烟。 +2. **`dev` 领先 `test` 225 个 commit。** 差异覆盖 rdev 模板、系统管理台、docgov 加固、Control Center 移除等。`-short` 不够。晋升前至少再跑:`TEST_DATABASE_URL` 下治理 PG 集成,以及 `cd web && npm test && npm run build`。 +3. **批 2 的越权负例仍是人工兜底。** [批 2 报告](../../test-reports/2026-09-19-audit-b2-authz-hardening-test-report.md) 写明:非项目成员访问 docgov 应 403 的 HTTP/Playwright 负例未补,目前靠既有鉴权测试不回退加 code review。 + +### `test` 上多出来的 9 个提交 + +`git rev-list --count dev..test` = 9。这些提交是历次 `release-candidate` / 晋升文档同步(含 `rc-v1.0.0-beta.2` 至 `beta.4`),不是 `dev` 上缺失的产品代码。下次晋升应把 `dev` **merge 进** `test`,不要把 `test` reset 到 `dev`,否则这 9 个提交的晋升记录会丢。 + +`CURRENT.md` 文首仍写 test `schema_version=48`,同文「环境快照」表与本次 health 实测已是 52。这是文档漂移,不是运行时缺陷。更正留给下次晋升文档,本笔记不改那一行。 + +## 三、缺陷 + +### 已修复(2026-09-19 深度审计 critical/high) + +来源:[系统深度体检](../../audit/2026-09-19-system-deep-audit.md)。四批均已合入 `dev`。 + +| 批 | 项 | merge | +|----|----|-------| +| 1 数据一致性 | C1 docgov 吞错与 fencing 读回;C2 Session 竞态与跨项目污染;C4 计划保存事务与 `completed_by`;H10 请求 ctx | `844f757` | +| 2 鉴权 | H1–H4、H8、M8 | `08f4e0b` | +| 3 SSE/事件 | C3 心跳与写超时;H5 任务 SSE 幂等;H6 stale fencing 日志;H7 迁移注释(历史 SQL 不能补 down) | `a2a49a6` | +| 4 前端 | H9 占位符 XSS;未读回滚;Excel 预览上限 | `d73bc79` | + +H1 的 legacy user-id=1 兜底只加了日志,删除仍在 backlog(`H1-del`)。H7 的 00001–00009 无 down 不能改已应用文件,只加了注释。 + +### 已知未修(维持 backlog,本轮不启动) + +清单 SSOT:[2026-09-19-audit-remainder.md](../long-term/2026-09-19-audit-remainder.md)。均为 medium/low,不回写 gap-matrix。 + +| ID | 项 | +|----|----| +| M1 | 缺 `nosniff` / `X-Frame-Options` / `Referrer-Policy`,CSP 未收敛 | +| M2 | 租约 TTL 无上限;Acquire 前未校验编辑权 | +| M3 | 关键词改写意图;硬编码「张工」 | +| M4 | `u_sess_*` 解析失败得到 UserID=0 | +| M5 | `Runtime.Start` 双调用且吞错 | +| M6 | sessions 无硬上限 | +| M7 | 修订三阶段写无事务 | +| M9 | `SEMANTIC_SUMMARY_REPLACE` 只在 dev compose 声明;dev/test 默认模型不一致 | +| M10 | cutover 只允许 `dev` | +| M13 | `deploy/postgres/migrations/` 与 goose 重复 | +| M14 | ResolveDocTask 静默 0 值三权 | +| M15 | PG 投递允许乱序,MemoryBus 有 gap | +| L1 | health 每次两次 DB | +| L2 | SSE marshal 错误被吞 | +| L3 | ReplayPlan digest 不含 DryRun | +| H1-del | 删除 legacy user-id=1 兜底前须盘点调用方 | +| FE | `App.tsx` 巨石、localStorage 无版本、lucide 来源待确认 | + +M8(测试 flag 名 `FAV_PUBLISHER_ENABLE` 少一个 D)已在批 2 修复,不在上表。M11/M12 的未读回滚与 Excel 行数上限已在批 4 处理;批 4 报告写明浏览器端到端未覆盖这两条,单测已钉住 XSS 主路径。 + +### 本轮新观察(不单独立项) + +- 文首 schema 数字与实测不一致,见第二节。 +- `test` 独有 9 个晋升提交,合并时用 merge,不要 reset。 + +## 证据 + +复核时间:2026-09-19。工作区当时在 `docs/audit-remediation-backlog`(树与 `dev@66421b1` 一致),随后本笔记落在 `docs/pre-test-promotion-review`。 + +| 项 | 路径/命令 | 结果 | +|----|-----------|------| +| 工作树 | `git status` | clean | +| dev 领先 test | `git rev-list --count test..dev` | 225 | +| test 领先 dev | `git rev-list --count dev..test` | 9(晋升/文档提交) | +| 静态检查 | `go vet ./...` | 零告警,exit 0 | +| 短测 | `go test -short ./...` | 全包 PASS;`internal/server` 14.044s | +| dev health | `curl -s http://127.0.0.1:8080/api/v1/health` | `env=dev` `schema_version=52` `status=ok` | +| test health | `curl -s http://127.0.0.1:8081/api/v1/health` | `env=test` `schema_version=52` `status=ok` | +| main health | `curl -s http://127.0.0.1:8000/api/v1/health` | `env=main` `schema_version=52` `status=ok` | +| 迁移文件 | `deploy/postgres/goose/` | 52 个 SQL,最新 `00052_2026-09-17-document-duty-locked.sql` | +| worktree | `git worktree list` | 主仓 + `dev-rdev-merge` + `feature-initial-load-performance-plan` + `fix-dev-runtime-data-root-guard`(检出 `feature/final-artifact-vault`) | +| 待办标记 | `grep TODO\|FIXME\|XXX` 于 `internal/` `cmd/`(排除 `_test.go`) | 0 | +| 容器 | `docker ps` | dev/test/main app+events+pi-agent 均为 healthy;dev app 已运行约 5 小时,早于批 1–4 合入后的 rebuild(未做) | + +## 开放问题 + +- dev 与 test/main 默认模型不一致(M2.7-highspeed vs M3)是否刻意?深度审计已记,本轮无新证据。 +- `deploy/postgres/migrations/` 是否仍有外部工具依赖?无则再归档(M13)。 +- H2/H3 越权负例补到哪一层才算晋升门禁:HTTP 集成即可,还是必须 Playwright? + +## 建议动作 + +按顺序,全部另开任务,不在本笔记内执行: + +1. 占集成槽位,`./scripts/env-service.sh dev rebuild`,`curl -sf http://127.0.0.1:8080/health`(或 `/api/v1/health`)确认 schema 52 且二进制含批 1–4。 +2. `TEST_DATABASE_URL` 下跑治理 PG 集成;`cd web && npm test && npm run build`。 +3. 为 H2/H3 补至少一条跨用户/非成员 403 负例。 +4. 通过后再把 `dev` merge 入 `test`(保留 test 上 9 个晋升提交),打 rc tag,并顺手更正 `CURRENT.md` 文首的 test schema 表述。