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

14 KiB
Raw Blame History

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。

工作区与基线

工作区:

/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0

基线 HEAD

3ced553 test(p1r): 收口 Content 第一批 completed approval 门禁

实施前 coverage summary

233	139	94	0	0	0

实施后 coverage summary

233	141	92	0	0	0

实施后 Content 状态:

completed=10
needs_verification=41

目标 operation 状态:

getPlanning	dedicated	completed	false
savePlanningItem	dedicated	completed	true

继续 needs_verification 的 Content operation

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 证据。

单类验证数据库:

muse_p1r_content_planning_completed_approval_test

通过结果:

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 明细断言覆盖 tenantIdrequestHash 长度、result.newRevisionresult.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-writecommandId 不同 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 库:

muse_p1r_content_planning_combined_test

首次组合运行失败原因:

P1rContentEventsPublishFlywayMigrationIT.should_migrateV1ToV21OnRealPostgresqlAndVerifyContentPublishOutboxSchema
缺少必需环境变量: P1R_FLYWAY_PASSWORD 或 MUSE_POSTGRES_PASSWORD

根因:

  • 新增 Planning IT 与 Core IT 接受 P1R_CONTENT_COMPLETED_PASSWORD
  • 既有 Content Events Flyway IT 接受 P1R_FLYWAY_PASSWORDMUSE_POSTGRES_PASSWORD
  • 首次组合命令只设置了 P1R_CONTENT_COMPLETED_PASSWORD

修正:

  • 仅调整运行环境,同时设置 P1R_CONTENT_COMPLETED_PASSWORDP1R_FLYWAY_PASSWORD
  • 未修改代码。

通过结果:

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 产物:

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 防空跑:

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

合计:

P1R mixed gates: 49/49 pass

scanner 与 diff 证据

scanner

python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check

结果:

Generated docs/superpowers/reports/p1r-api-coverage.json
Generated docs/superpowers/reports/p1r-api-coverage.md
233	141	92	0	0	0

Content operation 状态确认:

completed=10
needs_verification=41

本轮新增 completed 清单:

getPlanning
savePlanningItem

diff check

git diff --check: pass

protected OpenAPI diff

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 ContentPlanningServiceTestAppContentPlanningControllerTest 未运行XML 证据缺失。

已修复并验证:

  • commandId 与缺 content validation 改为全租户 command/outbox no-write。
  • command/audit snapshot 增加 tenantIdrequestHashresult.newRevision/sectionKey、audit side/operationId/reason/status/resultSummaryrequestSummary.operationId/sectionKey/expectedRevision/saveMode 断言。
  • Task 3 focused tests fresh 运行,ContentPlanningServiceTest 15/15AppContentPlanningControllerTest 7/7XML 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_versionprojection_versionrevision 三列 columnNullable(...)=NO 断言。
  • 补 missing work、cross-owner、cross-tenant 当前 tenant 与目标 tenant planning row count 为 0 的断言。
  • 修复后 fresh 重跑 P1rContentPlanningCompletedApprovalITtests=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:getPlanningcontent:savePlanningItem 两个 operation-level completed approval 具备收口条件,不代表 Content 51/51、Account remaining、Market remaining 或总 P1R completed。

final verification

Fresh 双 PASS 后已重跑:

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 验证:

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 仍需用户明确指令。