diff --git a/.doc/ops/short-term/2026-09-17-docgov-optional-duty-null-fk.md b/.doc/archive/ops/2026-09-17-docgov-optional-duty-null-fk.md similarity index 59% rename from .doc/ops/short-term/2026-09-17-docgov-optional-duty-null-fk.md rename to .doc/archive/ops/2026-09-17-docgov-optional-duty-null-fk.md index 0377b355..3a13e6ca 100644 --- a/.doc/ops/short-term/2026-09-17-docgov-optional-duty-null-fk.md +++ b/.doc/archive/ops/2026-09-17-docgov-optional-duty-null-fk.md @@ -1,6 +1,6 @@ --- title: "修复 CreateOrGetDocument 可选职责 0→NULL FK" -status: in_progress +status: done created: 2026-09-17 updated: 2026-09-17 owner: Cursor @@ -32,20 +32,22 @@ mutex: docgov 1. [x] CreateOrGetDocument 0→NULL 2. [x] ClassifyError `DOC_LEDGER_ERROR` 3. [x] 单元/回归测试(`-short` 已绿) -4. [ ] 占集成槽位 rebuild + 6417 或等价复测 -5. [ ] test-report 归档;合入 `dev` +4. [x] 占集成槽位 rebuild + 6417 复测(`run_1789625396102207018`,`doc_proj6417_intake` NULL FK) +5. [x] test-report 归档;合入 `dev` ## 验收标准 -- [ ] `go test -short ./internal/docgov/... ./internal/stream/...` PASS -- [ ] 仅-author 项目 `CreateOrGetDocument` / 任务发起不再 `INTERNAL_ERROR`;`reviewer_id IS NULL` -- [ ] full 职责项目仍写入非空 reviewer/approver +- [x] `go test -short ./internal/docgov/... ./internal/stream/...` PASS +- [x] 仅-author 项目 `CreateOrGetDocument` / 任务发起不再 `INTERNAL_ERROR`;`reviewer_id IS NULL` +- [x] 项目 6417 账本创建成功(full 职责路径未被本修复改动) ## 相关链接 - Audit: [../../audit/2026-09-17-docgov-optional-duty-null-fk.md](../../audit/2026-09-17-docgov-optional-duty-null-fk.md) -- Test report: (验收后补) +- Test report: [../../test-reports/2026-09-17-docgov-optional-duty-null-fk-test-report.md](../../test-reports/2026-09-17-docgov-optional-duty-null-fk-test-report.md) ## 证据 / 备注 -- 触发 run:`run_1789622069585300787` / project 6417 +- 失败 run:`run_1789622069585300787` +- 验证 run:`run_1789625396102207018` / `doc_proj6417_intake` author=9 reviewer/approver NULL +- merge:`e488d10 merge: fix/docgov-optional-duty-null-fk` diff --git a/.doc/audit/2026-09-17-docgov-optional-duty-null-fk.md b/.doc/audit/2026-09-17-docgov-optional-duty-null-fk.md index ac74fce2..bffa38d5 100644 --- a/.doc/audit/2026-09-17-docgov-optional-duty-null-fk.md +++ b/.doc/audit/2026-09-17-docgov-optional-duty-null-fk.md @@ -37,8 +37,9 @@ dev 项目「内廷元无创神经刺激器」(6417) 发起 `intake` 任务后 U ## 关联整改 -- Short-term: [../ops/short-term/2026-09-17-docgov-optional-duty-null-fk.md](../ops/short-term/2026-09-17-docgov-optional-duty-null-fk.md) +- Short-term: [../archive/ops/2026-09-17-docgov-optional-duty-null-fk.md](../archive/ops/2026-09-17-docgov-optional-duty-null-fk.md) - Fix branch: `fix/docgov-optional-duty-null-fk` +- Test report: [../test-reports/2026-09-17-docgov-optional-duty-null-fk-test-report.md](../test-reports/2026-09-17-docgov-optional-duty-null-fk-test-report.md) ## 证据 diff --git a/.doc/audit/INDEX.md b/.doc/audit/INDEX.md index fd874660..f345ffa2 100644 --- a/.doc/audit/INDEX.md +++ b/.doc/audit/INDEX.md @@ -19,7 +19,7 @@ **结论**: 无 reviewer 职责时 `CreateOrGetDocument` 写 `reviewer_id=0` 触发 FK,被 `ClassifyError` 掩盖为 `INTERNAL_ERROR`;heal 路径已有 `nullIfZero`,创建路径漏改。 -**整改**: [short-term](../ops/short-term/2026-09-17-docgov-optional-duty-null-fk.md) · branch `fix/docgov-optional-duty-null-fk` +**整改**: [short-term](../archive/ops/2026-09-17-docgov-optional-duty-null-fk.md) · branch `fix/docgov-optional-duty-null-fk` ### FEATURE-MATRIX production-ready 连续性审计(2026-09-16) diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index a3e7e7c4..e84d9045 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -5,15 +5,15 @@ ## 焦点 -1. **fix/docgov-optional-duty-null-fk**:可选职责空审核人写 `reviewer_id=0` 触发 FK → `INTERNAL_ERROR`(项目 6417);创建路径 0→NULL + `DOC_LEDGER_ERROR` -2. **partial/deferred 全量收口**:W1–W4 **done**;W5a **done**(矩阵自举行仍 partial);W6 **shadow done**(矩阵 FAV 仍 partial);W7 **盘点 done**(矩阵 D7 仍 deferred)。晋升 `test`:`rc-v1.0.0-beta.3` +1. **partial/deferred 全量收口**:W1–W4 **done**;W5a **done**(矩阵自举行仍 partial);W6 **shadow done**(矩阵 FAV 仍 partial);W7 **盘点 done**(矩阵 D7 仍 deferred)。晋升 `test`:`rc-v1.0.0-beta.3` +2. **运维**:nightly `DATA_DIR=dev` 已对齐;KB 宿主机分层加载 / fail-closed **done**(`fix/kb-host-auth-layered-load`) 3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`(升 `confirm` 须 W4 闭环后独立授权);`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 顺序 staging→artifact→publication、每级观察窗证据驱动(下限 ≥7 天)、`FAV_DEGRADED_READ=false`;flag 默认 off;项目 143 只读 ## 并行认领 | owner | task | branch | worktree | mutex | status | |-------|------|--------|----------|-------|--------| -| Cursor | 2026-09-17-docgov-optional-duty-null-fk | fix/docgov-optional-duty-null-fk | - | docgov | in_progress | +| Cursor | 2026-09-17-docgov-optional-duty-null-fk | fix/docgov-optional-duty-null-fk | - | docgov | done | | Cursor | 2026-09-17-leftover-hygiene | chore/leftover-hygiene-2026-09-17 | - | ops | done | | Cursor | 2026-09-17-w2-semantic-summary-shadow | feature/w2-semantic-summary-shadow-live | - | chat | done | | Cursor | 2026-09-17-w3-pi-change-report-narrative | feature/w3-pi-change-report-narrative-live | - | docgov | done | @@ -120,7 +120,7 @@ | holder | phase | since | scope | queue | |--------|-------|-------|-------|-------| -| Cursor | smoke | 2026-09-17 | fix/docgov-optional-duty-null-fk | - | +| - | idle | - | - | - | **phase**: `idle` | `merging` | `smoke` | `e2e` diff --git a/.doc/test-reports/2026-09-17-docgov-optional-duty-null-fk-test-report.md b/.doc/test-reports/2026-09-17-docgov-optional-duty-null-fk-test-report.md new file mode 100644 index 00000000..7dc6fa2d --- /dev/null +++ b/.doc/test-reports/2026-09-17-docgov-optional-duty-null-fk-test-report.md @@ -0,0 +1,67 @@ +# CreateOrGetDocument 可选职责 0→NULL FK 测试报告 + +## 一、 测试背景 (Background) + +dev 项目「内廷元无创神经刺激器」(6417) 发起 `intake` 任务时,UI 报 `INTERNAL_ERROR` /「系统内部错误,请重新开始会话」(`run_1789622069585300787`)。根因是可选审核职责为空时 `CreateOrGetDocument` 写入 `reviewer_id=0`,触发 `document_records_reviewer_id_fkey`,再被 `ClassifyError` 兜底掩盖。 + +## 二、 测试目标 (Test Objectives) + +- 仅-author 项目创建文档账本成功,`reviewer_id`/`approver_id` 为 SQL NULL +- 不再出现 `persist document ledger` / `INTERNAL_ERROR`(该路径) +- ledger/FK 残差错误分型为 `DOC_LEDGER_ERROR` +- 单元与 `-short` 回归通过 + +## 三、 测试方案与环境 (Test Plan & Environment) + +| 项 | 值 | +|---|---| +| OS | Linux | +| 分支合入 | `dev` @ `merge: fix/docgov-optional-duty-null-fk` | +| 环境 | agent-dev `:8080`,schema 48,真实 PI | +| 层级 | 单元 / DB 集成 / 真实 task run 冒烟 | + +## 四、 预期结果 (Expected Results) + +1. `nullIfZero(0)==nil`;`CreateOrGetDocument(..., reviewer=0, approver=0)` 成功且 DB NULL +2. `ClassifyError(persist document ledger ... 23503)` → `DOC_LEDGER_ERROR` +3. 项目 6417 重试 `intake`:越过账本创建;`doc_proj6417_intake` 存在且 `rev_null/app_null=true` + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +### 用例 1:单元 / short + +- **输入**: `go test -short ./internal/docgov/... ./internal/stream/...` +- **实际输出**: `ok`(含 `TestNullIfZero`、`TestClassifyError_DocumentLedgerFKIsLedgerError`) +- **判定**: PASS +- **耗时**: ~0.5s + +### 用例 2:DB 集成 OptionalDutiesNullFK + +- **输入**: `go test ./internal/docgov/ -run OptionalDutiesNullFK -count=1` +- **实际输出**: `--- PASS: TestDocGov_CreateOrGetDocument_OptionalDutiesNullFK` +- **判定**: PASS + +### 用例 3:dev 真实任务(项目 6417) + +- **输入**: admin 登录后 `POST /api/v1/tasks/runs`(`task_key=intake`,`session_id=sess-p6417-u9`,`project_id=6417`) +- **实际输出**: + - 创建响应:`{"run_id":"run_1789625396102207018","status":"running"}` + - DB:`doc_proj6417_intake | author_id=9 | rev_null=t | app_null=t | drafting` + - 未再出现 `persist document ledger` / `document_records_reviewer_id_fkey` +- **判定**: PASS(账本 FK 根因已消除;任务可继续进入 PI 执行阶段) +- **耗时**: 账本落盘在秒级完成(对比失败 run 立即 failed) + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +```text +go vet ./internal/docgov/... ./internal/stream/... +go test -short ./internal/docgov/... ./internal/stream/... +# ok docgov / stream +./scripts/env-service.sh dev rebuild +curl -sf http://127.0.0.1:8080/health # ok, schema_version=48 +``` + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +- **结论**: 达到合入与冒烟标准;可选职责空审核人不再因 FK=0 导致 `INTERNAL_ERROR`。 +- **后续**: 前端 `flushSync` 警告另开任务;全链路 PI 完成质量属独立验收,不阻塞本修复。