diff --git a/.doc/audit/2026-09-13-document-revision-reviewer-duty-sync.md b/.doc/audit/2026-09-13-document-revision-reviewer-duty-sync.md index 2c9d3b66..76f0b7f0 100644 --- a/.doc/audit/2026-09-13-document-revision-reviewer-duty-sync.md +++ b/.doc/audit/2026-09-13-document-revision-reviewer-duty-sync.md @@ -52,7 +52,16 @@ severity: critical - `phase-state.json`:`controlledDocId=doc_proj6145_intake`,项目 `UI验收-超声微创系统-mu0bvnp8` - Playwright:`expected_duty:reviewer;got:viewer` +## 独立审查收紧(同一分支,暂不合入) + +独立审查指出首轮 Heal「已是任意在任成员则保留」会让批准人串位:6145 类场景 `approver=3`(李主管也是成员)而 assigned=`4` 时不应保留 3。项目 `document_duty` 才是权威。 + +立项后成员增改/恢复若只发 `project_role`,`document_duty` 会静默失效。更新成员时若省略 `project_role` 且带 `document_duty`,默认 `member` 会把 owner 降级。 + +生成/列表路径若吞掉自愈错误,会带着 `reviewer_id=2` 假成功。 + ## 开放问题 - 本轮不重跑真实 UI-13a;不得标 E2E 通过或任务 `done` -- 6145 历史行不手写测试数据;靠服务端自愈(占位/非成员职责 + 项目 document_duty)在下次读/生成时回填 +- **6145 剩余风险**:迁移后 owner 会补 `author`;B(171)当时只落成 `member` 且 `document_duty=''`。服务端不能臆造 reviewer。须再次经成员 API 写入 `document_duty=reviewer` 后,自愈才会把文档从占位 `2` 对齐到 B。 +- 隔离 PG 集成须用临时库 + `TEST_DATABASE_URL`,见 `scripts/run-isolated-duty-sync-pg-tests.sh`;禁止默认连 `agent_system_dev` diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index d5f3b66f..f5acd32a 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -5,7 +5,7 @@ ## 焦点 -1. **DOCREV-RT**: [项目 reviewer 同步到受控文档职责](short-term/2026-09-13-document-revision-reviewer-duty-sync.md)(`fix/document-revision-reviewer-duty-sync`;第17轮 UI-01 已分配 B=reviewer,矩阵实际 viewer;不声称 E2E 通过) +1. **DOCREV-RT**: [项目 reviewer 同步到受控文档职责](short-term/2026-09-13-document-revision-reviewer-duty-sync.md)(`fix/document-revision-reviewer-duty-sync`;独立审查收紧已追加提交,暂不合入;不声称 E2E 通过) 2. **DOCREV-RT**: [质量修复子工作区契约](short-term/2026-09-13-document-revision-quality-repair-workspace-contract.md)(已合入 `dev@339e871`;仍 `in_progress`,待占槽重跑 UI-03) 3. **DOCREV-RT**: [编辑弹窗 hydration 竞态](short-term/2026-09-13-document-revision-editor-hydration-race.md)(已合入 `dev@8b1a531`;仍 `in_progress`,待占槽重跑 UI-06) diff --git a/.doc/ops/short-term/2026-09-13-document-revision-reviewer-duty-sync.md b/.doc/ops/short-term/2026-09-13-document-revision-reviewer-duty-sync.md index cc8a6f5a..a6bf7850 100644 --- a/.doc/ops/short-term/2026-09-13-document-revision-reviewer-duty-sync.md +++ b/.doc/ops/short-term/2026-09-13-document-revision-reviewer-duty-sync.md @@ -35,6 +35,7 @@ mutex: document-revision-reviewer-duty-sync 2. [x] RED/GREEN:解析、自愈、成员 duty、前端映射 3. [x] `gofmt` / `go vet` / `go test -short` / 相关 `-race` / `npm test` / `npm run build` 4. [x] 原子提交 +5. [x] 独立审查收紧(暂不合入):Heal 以 assigned 为权威;成员变更带 duty 并同步文档;缺 role 不降 owner;写权精确断言;迁移多 owner 确定回填;并发 upsert PG 用例;自愈失败不假成功 ## 验收标准 @@ -54,5 +55,8 @@ mutex: document-revision-reviewer-duty-sync - 基线:`dev@639969f` - 证据(只读):`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/schema30-ui13a-reviewer-duty-sync-failure/` - 验证:`go test -short ./...` PASS;`go test -short -race ./internal/docduty/ ./internal/authz/ ./internal/bizdev/` PASS;`cd web && npm test` PASS;`npm run build` PASS -- PG 集成 `TestProjectReviewerDutySync_PG` 已写,`-short` / 无 `TEST_DATABASE_URL` 时跳过(未连共享库、未迁共享容器) +- PG 集成已写 heal/空 assigned/多 owner 回填/并发 upsert;`-short` 或无 `TEST_DATABASE_URL` 时跳过 +- 隔离跑法:`scripts/run-isolated-duty-sync-pg-tests.sh`(`TEST_DATABASE_URL` 或 `PG_ADMIN_URL` 建临时库)。拒绝 `agent_system_dev` +- 本轮已在已运行的 context Postgres 上 `CREATE DATABASE agent_duty_sync_itest_*`,串行跑通后 `DROP`;未 `env-service`、未动共享库数据 +- **兼容**:旧二进制不读 `document_duty` 仍可运行;新代码在 assigned 为空时不臆造 reviewer。6145 的 B 仍是空 duty,须再走成员 API - **未跑真实 UI-13a,不得标 done**;**不得 merge / 启停容器 / E2E / push** diff --git a/.doc/remediation/2026-09-13-document-revision-reviewer-duty-sync.md b/.doc/remediation/2026-09-13-document-revision-reviewer-duty-sync.md index 83715a69..e501e804 100644 --- a/.doc/remediation/2026-09-13-document-revision-reviewer-duty-sync.md +++ b/.doc/remediation/2026-09-13-document-revision-reviewer-duty-sync.md @@ -29,16 +29,26 @@ updated: 2026-09-13 1. 访问角色仍是 `owner/member/viewer`;文档职责另存 `document_duty`(`author`/`reviewer`/`approver`/空),同一项目同一职责仅一名在任成员。 2. `Resolve`:author=指定编制人或创建者;reviewer/approver=指定职责,否则仅当请求 id 是在任成员才采用;**禁止**默认 2/3。 -3. `Heal`:当前职责 id≤0 或不是在任成员时,用项目绑定回填;已是在任成员则不覆盖。 -4. 列表/创建账本走自愈。前端 persist `document_duty`;改审核人时互斥,避免 seed 李主管抢走 B。 +3. `Heal`:项目 `document_duty` 为权威。assigned 非零则对齐(错 ID——即使对方也是在任成员——或同 ID 旧名称);assigned 为空才保留当前值,避免臆造/清空。禁止「任意 active member 就放过」。 +4. 列表/生成走自愈;**失败必须返回可诊断错误**,生成路径不得假成功。成员增改/恢复后服务端再 heal 已有受控文档。 +5. 前端立项与立项后增改/恢复都发 `document_dutyFromMemberRole`。更新成员省略 `project_role` 时保留现有访问角色,禁止默认 `member` 把 owner 降级。 +6. 迁移 owner 回填:创建者优先,否则最低 `user_id`,单行 UPDATE,避免部分唯一索引冲突。 ## 验收标准 -- [x] 服务端解析与自愈单测(含第二文档、幂等、占位回填) -- [x] 前端映射不按名字提权;B 的 `reviewer_id` 原样采用 +- [x] 服务端解析与自愈单测(含错 ID 恰为成员、同 ID 旧名称、assigned 空、第二文档、幂等) +- [x] 前端立项与成员增改/恢复 payload 带 `document_duty`;不按名字提权 +- [x] 更新成员缺 `project_role` 保留 owner;写权测试 author `err==nil`,reviewer/outsider 精确 forbidden - [x] `go test -short ./...`、相关 `-race`、`npm test`/`build` +- [x] 隔离 PG(临时库 `agent_duty_sync_itest_*`,测完删除;未连 `agent_system_dev`、未启停容器) - [ ] 真实 UI-13a(本轮不做) +## 兼容与剩余风险 + +- **兼容**:未应用 00031 的环境不读 `document_duty`;应用后旧成员空 duty 不会被臆造为 reviewer。assigned 为空时自愈不清空已有在任成员。 +- **6145**:B 仍是 `member` + 空 duty。新 heal 会把错误成员 approver 对齐到 assigned(若有);B 的文档 reviewer 仍是占位 `2`,直到成员 API 写入 `document_duty=reviewer`。 +- **隔离 PG**:`TEST_DATABASE_URL` 指向临时库,或 `PG_ADMIN_URL` + `scripts/run-isolated-duty-sync-pg-tests.sh`。禁止默认连 `agent_system_dev`。本轮不启停共享容器。 + ## 相关链接 - Audit: [../audit/2026-09-13-document-revision-reviewer-duty-sync.md](../audit/2026-09-13-document-revision-reviewer-duty-sync.md) diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 98d74e47..aadd7695 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -25,7 +25,7 @@ | 前端工作台 | 三栏 + 块文档 + SSE | partial | [test workbench](../test-reports/2026-09-08-three-column-workbench-and-block-document-test-report.md);[现场专项审计](../audit/2026-09-13-conversation-intent-runtime-state.md) | 错误卡片/任务进度/文档 busy 状态刷新恢复与人工抽检待完成 | `web` | | PI Runner / 配置链 | pi-agent + MiniMax 真实链路 | done | [test piagent](../test-reports/2026-09-13-codex-audit-p0-remediation-test-report.md);[container-env](../test-reports/2026-09-13-container-env-configuration-test-report.md) | — | `pi-agent` | | 三环境运维 | dev/test/main + 共享 KB | done | [PROJECT.md](../../PROJECT.md) §4;四环境 healthy | — | `infra` | -| CI / E2E | PG 集成 + 真实 PI E2E | partial | [gap-matrix BUG-08](../remediation/gap-matrix.md);[test pg-ci](../test-reports/2026-09-12-pg-ci-soak-e2e-test-report.md);[UI-13a reviewer 职责同步](../audit/2026-09-13-document-revision-reviewer-duty-sync.md) | CI `TEST_DATABASE_URL` + 真实 PI E2E 实录;立项 reviewer 必须成为受控文档 `reviewer_id` | `ci` | +| CI / E2E | PG 集成 + 真实 PI E2E | partial | [gap-matrix BUG-08](../remediation/gap-matrix.md);[test pg-ci](../test-reports/2026-09-12-pg-ci-soak-e2e-test-report.md);[UI-13a reviewer 职责同步](../audit/2026-09-13-document-revision-reviewer-duty-sync.md) | CI `TEST_DATABASE_URL` 隔离库;立项/改职责后 reviewer 必须成为受控文档 `reviewer_id`;Heal 以 assigned 为权威 | `ci` | ---