oh-my-muse/docs/memorys/2026-06-13-P1RContentPlanning状态推进.md
zizi 2692af32e7 test(p1r): 收口 Content Planning completed approval 门禁
将 content:getPlanning 与 content:savePlanningItem 纳入 operation-level completed approval,并保留 Content 其余 operation 的 needs_verification 边界。
2026-06-13 02:24:29 +08:00

370 lines
14 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.

# P1R Content Planning 状态推进
日期2026-06-13
## 结论
本轮只推进 Content Planning 2 个 operation-level completed approval
- `content:getPlanning`
- `content:savePlanningItem`
Content 仍不是整域 completed。其余 41 个 Content operation 继续 `dedicated/needs_verification`
本轮未修改 OpenAPI未修改 Content 业务实现,未修改 SQL migration未把 `content` 加入 domain-level completed allowlist。
## 工作区与基线
工作区:
```text
/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0
```
基线 HEAD
```text
3ced553 test(p1r): 收口 Content 第一批 completed approval 门禁
```
实施前 coverage summary
```text
233 139 94 0 0 0
```
实施后 coverage summary
```text
233 141 92 0 0 0
```
实施后 Content 状态:
```text
completed=10
needs_verification=41
```
目标 operation 状态:
```text
getPlanning dedicated completed false
savePlanningItem dedicated completed true
```
## 继续 needs_verification 的 Content operation
```text
content:adminListExportTasks
content:adminListImportTasks
content:adminListWorks
content:adminGetWork
content:adminListChapters
content:adminRiskAction
content:confirmChapterParseResult
content:rejectChapterParseResult
content:downloadExportPackage
content:getExportTask
content:getImportTask
content:getParseJob
content:listParseJobChapters
content:batchConfirmChapters
content:retryParseJob
content:createWork
content:deleteWork
content:updateWork
content:deleteBlock
content:mergeBlocks
content:splitBlock
content:mergeBlockSuggestion
content:createChapter
content:deleteChapter
content:updateChapter
content:createBlock
content:reorderChapters
content:validateDynamicFields
content:exportWork
content:createExportTask
content:createImportTask
content:listMetaProjections
content:getMetaProjection
content:createParseJob
content:listPlanningCandidates
content:createPlanningCandidate
content:getPlanningCandidate
content:confirmPlanningCandidate
content:discardPlanningCandidate
content:createStyleCheck
content:getStyleCheckResult
```
## 修改范围
本轮修改:
- `muse-cloud/scripts/p1r-audit-api-coverage.py`
- `docs/superpowers/reports/p1r-api-coverage.json`
- `docs/superpowers/reports/p1r-api-coverage.md`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rApiCoverageReportTest.java`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentRealApiGateTest.java`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rEventsRealApiGateTest.java`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAiRealApiGateTest.java`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rKnowledgeRealApiGateTest.java`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rMarketRealApiGateTest.java`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAccountRealApiGateTest.java`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rMetaRealApiGateTest.java`
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentPlanningCompletedApprovalIT.java`
- `docs/agent-specs/.agent`
- `docs/agent-specs/2026-06-12-P1RContentPlanningCompletedApproval审阅版.md`
- `docs/agent-specs/2026-06-12-P1RContentPlanningCompletedApproval执行版.md`
- `docs/memorys/2026-06-13-P1RContentPlanning状态推进.md`
未修改:
- 7 个 OpenAPI。
- Content 业务实现。
- SQL migration。
- Content domain-level completed allowlist。
## TDD evidence
RED 阶段先修改 P1R gate 期望值和 Content Planning 2 个 operation 断言,在旧 scanner/report 下运行 focused P1R gates预期失败已出现
- 失败点来自旧 report 仍为 `completed=139 / needsVerification=94`
- 失败点来自 `content/getPlanning` 仍为 `needs_verification`
- 失败点包含 summary 断言 `expected 141 but was 139`
GREEN 阶段完成 scanner operation-level allowlist、report 重新生成、Planning HTTP+DB `_test` evidence 和 focused gates 后,目标验证通过。
## MockMvc HTTP 入口 + DB 证据
新增:
- `muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentPlanningCompletedApprovalIT.java`
验证方式:
- 使用 Spring Mock web context + `MockMvc`
- 使用真实 mapper / service。
- 使用真实 PostgreSQL `_test` 数据库。
- 使用 Flyway clean/migrate V1-V21。
- 密码只从环境变量读取,禁止通过 JVM system property 或 JDBC query 传入。
说明:这里的 HTTP 入口证据是执行版要求的 WebApplicationContext + MockMvc 请求路径证据,不是启动真实 socket 端口的 live servlet container 证据。
单类验证数据库:
```text
muse_p1r_content_planning_completed_approval_test
```
通过结果:
```text
P1rContentPlanningCompletedApprovalIT: tests=11, failures=0, errors=0, skipped=0
```
覆盖内容:
- 拒绝 JVM password system property、JDBC credential query 和非 `_test` 数据库。
- V9 planning schema 门禁JSONB 类型、nullable/default、`tenant_id` BIGINT NOT NULL DEFAULT 0、`schema_version/projection_version/revision` NOT NULL + default、unique、index、trigger。
- 直接 JDBC 行为门禁:默认 revision/schema/projection、JSONB 存储、duplicate `(tenant_id, work_id, section_key)` 被 PostgreSQL 以 `23505` 拒绝、不同 tenant 可并存、CAS update 后 revision+1 且 `update_time` 推进。
- `getPlanning` happy、empty、missing work、cross owner、cross tenant查询路径不写 command/outbox。
- `savePlanningItem` create断言 planning section、sourceSnapshot、command audit snapshot 与 outbox no-write。
- command/audit snapshot 明细断言覆盖 `tenantId``requestHash` 长度、`result.newRevision``result.sectionKey`、audit `side/operationId/reason/status/resultSummary`,以及 `requestSummary.operationId/sectionKey/expectedRevision/saveMode`
- `savePlanningItem` update断言 CAS revision、schemaVersion、projectionVersion、sourceSnapshot。
- `savePlanningItem` replay不重复推进 revision、不重复写 command。
- 三类 command conflict no-write`commandId` 不同 content、不同 `sectionKey`、不同 `workId` 均返回 `CONTENT_COMMAND_ID_CONFLICT`,首次 planning row 与 command audit/result snapshot 不变,目标 section/work 不产生脏 row。
-`commandId`、缺 `content`、缺 `expectedRevision`、revision conflict、schemaVersion conflict、projectionVersion conflict 均断言 no-write其中缺 `commandId` 与缺 `content` 已补全租户 command/outbox no-write。
- missing work、cross owner、cross tenant 均断言事务回滚后无残留 command并补充全租户 command/outbox 污染断言。
- missing work、cross owner、cross tenant 均补充目标 planning row no-write不存在的 work 不创建 row其他 owner work 不在当前 tenant 创建 rowcross tenant 不污染当前 tenant 或目标 tenant planning row。
## 组合验证
组合验证使用真实 PostgreSQL `_test` 库:
```text
muse_p1r_content_planning_combined_test
```
首次组合运行失败原因:
```text
P1rContentEventsPublishFlywayMigrationIT.should_migrateV1ToV21OnRealPostgresqlAndVerifyContentPublishOutboxSchema
缺少必需环境变量: P1R_FLYWAY_PASSWORD 或 MUSE_POSTGRES_PASSWORD
```
根因:
- 新增 Planning IT 与 Core IT 接受 `P1R_CONTENT_COMPLETED_PASSWORD`
- 既有 Content Events Flyway IT 接受 `P1R_FLYWAY_PASSWORD``MUSE_POSTGRES_PASSWORD`
- 首次组合命令只设置了 `P1R_CONTENT_COMPLETED_PASSWORD`
修正:
- 仅调整运行环境,同时设置 `P1R_CONTENT_COMPLETED_PASSWORD``P1R_FLYWAY_PASSWORD`
- 未修改代码。
通过结果:
```text
P1rContentPlanningCompletedApprovalIT: tests=11, failures=0, errors=0, skipped=0
P1rContentCoreCompletedApprovalIT: tests=12, failures=0, errors=0, skipped=0
P1rContentEventsPublishFlywayMigrationIT: tests=4, failures=0, errors=0, skipped=0
combined: tests=27, failures=0, errors=0, skipped=0
```
## focused Content tests
执行版 Task 3 focused tests 已单独运行,并确认 XML 为本轮 fresh 产物:
```text
ContentPlanningServiceTest: tests=15, failures=0, errors=0, skipped=0, fresh_xml=yes
AppContentPlanningControllerTest: tests=7, failures=0, errors=0, skipped=0, fresh_xml=yes
combined focused tests: 22/22 pass
```
## focused gates
P1R mixed gates 通过,并已做 XML 防空跑:
```text
P1rApiCoverageReportTest: tests=6, failures=0, errors=0, skipped=0
P1rContentRealApiGateTest: tests=5, failures=0, errors=0, skipped=0
P1rEventsRealApiGateTest: tests=7, failures=0, errors=0, skipped=0
P1rAiRealApiGateTest: tests=7, failures=0, errors=0, skipped=0
P1rKnowledgeRealApiGateTest: tests=8, failures=0, errors=0, skipped=0
P1rMarketRealApiGateTest: tests=6, failures=0, errors=0, skipped=0
P1rAccountRealApiGateTest: tests=5, failures=0, errors=0, skipped=0
P1rMetaRealApiGateTest: tests=5, failures=0, errors=0, skipped=0
```
合计:
```text
P1R mixed gates: 49/49 pass
```
## scanner 与 diff 证据
scanner
```bash
python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check
```
结果:
```text
Generated docs/superpowers/reports/p1r-api-coverage.json
Generated docs/superpowers/reports/p1r-api-coverage.md
233 141 92 0 0 0
```
Content operation 状态确认:
```text
completed=10
needs_verification=41
```
本轮新增 completed 清单:
```text
getPlanning
savePlanningItem
```
diff check
```text
git diff --check: pass
```
protected OpenAPI diff
```text
empty
```
## fresh review 状态
历史 review
- Curie testing/data-integrity review PASS无 blocker该结论发生在 Ohm 后续修复之前,当前只作为历史记录。
- Kepler correctness reviewer 超时后关闭,无可用结论。
Ohm fresh correctness/spec review FAIL3 个 P1 有效:
-`commandId` 与缺 `content` validation 路径未做全租户 command/outbox no-write。
- command/audit snapshot 断言不足,缺 tenant_id、request_hash、result_snapshot、audit requestSummary/operationId/status/reason 等关键事实。
- 执行版 Task 3 mandatory focused `ContentPlanningServiceTest``AppContentPlanningControllerTest` 未运行XML 证据缺失。
已修复并验证:
-`commandId` 与缺 `content` validation 改为全租户 command/outbox no-write。
- command/audit snapshot 增加 `tenantId``requestHash``result.newRevision/sectionKey`、audit `side/operationId/reason/status/resultSummary``requestSummary.operationId/sectionKey/expectedRevision/saveMode` 断言。
- Task 3 focused tests fresh 运行,`ContentPlanningServiceTest 15/15``AppContentPlanningControllerTest 7/7`XML mtime 均在运行窗口内。
本轮 fresh implementation review
- Locke correctness/spec review PASS确认 scope、scanner、coverage、非目标 operation、Planning IT 和 Ohm 3 个 P1 修复均符合执行版。
- Locke 残余风险:执行版 allowed diff memory 文件日期写成 `2026-06-12`,实际为 `2026-06-13`;已修订执行版 allowed diff。
- Hilbert testing/data-integrity review FAIL2 个 P2 有效V9 schema gate 未显式断言 `schema_version/projection_version/revision` NOT NULLmissing/cross-owner/cross-tenant no-write 未逐一断言目标 planning row 未创建。
Hilbert P2 已修复并验证:
-`schema_version``projection_version``revision` 三列 `columnNullable(...)=NO` 断言。
- 补 missing work、cross-owner、cross-tenant 当前 tenant 与目标 tenant planning row count 为 0 的断言。
- 修复后 fresh 重跑 `P1rContentPlanningCompletedApprovalIT`tests=11、failures=0、errors=0、skipped=0XML mtime 为 `2026-06-13 01:53:08 +0800`
当前仍需重新派发 fresh implementation spec/correctness re-review + fresh quality/data-integrity/testing re-review双 PASS 前不得提交或 push。
Fresh re-review 已双 PASS
- Epicurus correctness/spec re-review PASS确认 protected diff 为空、scope 未扩大、scanner 仍只追加 `content:getPlanning` / `content:savePlanningItem`、执行版 allowed diff 已改为实际 memory 路径、Hilbert 两个 P2 已关闭、coverage report 为 `233/141/92/0/0/0` 且 Content 为 `10 completed / 41 needs_verification`。Epicurus 未运行 Maven 测试,只做只读 diff/source/docs/report 复核。
- Nietzsche testing/data-integrity re-review PASS确认 schema NOT NULL、missing/cross-owner/cross-tenant 目标 row no-write、缺 `commandId` / 缺 `content` 全租户 command/outbox no-write、command/audit snapshot 解析断言、fresh XML `P1rContentPlanningCompletedApprovalIT 11/11``.agent` / memory 留痕和 `git diff --check` 均无新 blocker。Nietzsche 未运行 Maven 测试,只解析现有 XML 并运行只读 diff check。
残余风险:
- Surefire XML 含本地 classpath、`user.dir`、测试 DB URL 等本机信息,外发前需清洗。
- 新增 IT 与 memory 当前仍未提交,提交前必须确认纳入正确 commit。
- 双 PASS 只代表 `content:getPlanning``content:savePlanningItem` 两个 operation-level completed approval 具备收口条件,不代表 Content 51/51、Account remaining、Market remaining 或总 P1R completed。
## final verification
Fresh 双 PASS 后已重跑:
```text
python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check: pass
ContentPlanningServiceTest + AppContentPlanningControllerTest: 22/22 pass, fresh XML yes
P1R mixed gates: 49/49 pass
Content combined DB gate: 27/27 pass
git diff --check: pass
protected OpenAPI / Content main/java / SQL diff: empty
```
正确 jq 验证:
```text
summary: 233 141 92 0 0 0
Content completed: 10
Content needs_verification: 41
getPlanning dedicated completed false
savePlanningItem dedicated completed true
listPlanningCandidates dedicated needs_verification false
createStyleCheck dedicated needs_verification true
getStyleCheckResult dedicated needs_verification false
```
## 当前边界
- 本轮只代表 Content Planning 2 个 operation-level completed approval。
- 不代表 Content 51/51 completed。
- 不代表 Account remaining completed。
- 不代表 Market remaining completed。
- 不代表总 P1R completed。
- raw Surefire XML 可能包含 DB host/user外发前需清洗。
- 当前具备提交候选条件;提交或 push 仍需用户明确指令。