14 KiB
P1R Content 状态推进
日期:2026-06-12
结论
本轮只推进 Content 第一批 8 个 operation-level completed approval:
content:listWorkscontent:getWorkcontent:listChapterscontent:getChaptercontent:listBlockscontent:getBlockcontent:saveBlockcontent:getBlockSourceAttribution
Content 仍不是整域 completed。其余 43 个 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:
0032774 test(p1r): 收口 Market 第一批 completed approval 门禁
实施前 coverage summary:
233 131 102 0 0 0
实施后 coverage summary:
233 139 94 0 0 0
实施后 Content 状态:
completed=8
needs_verification=43
继续 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:getPlanning
content:listPlanningCandidates
content:createPlanningCandidate
content:getPlanningCandidate
content:confirmPlanningCandidate
content:discardPlanningCandidate
content:createStyleCheck
content:getStyleCheckResult
content:savePlanningItem
主要原因:
- 创建、更新、删除、重排、拆分、合并等写命令仍存在 OpenAPI / coverage
requiresCommandId与服务端 VO 或实现口径不一致风险,本轮不夹带合同修正。 - 导入、导出、解析、下载仍缺 FileService、任务产物和真实下载字节闭环 evidence。
- Meta projection、AI planning candidate、style check、suggestion 等能力仍依赖 Meta / AI / Knowledge 外部 owner closure 和运行时证据。
- admin read / risk action 需要单独 admin guard、审计和跨 owner 边界 evidence。
- planning section 虽属 Content 本域,但有 schemaVersion、projectionVersion、CAS、command replay 等独立合同,后续应单独切片。
修改范围
本轮修改:
muse-cloud/scripts/p1r-audit-api-coverage.pydocs/superpowers/reports/p1r-api-coverage.jsondocs/superpowers/reports/p1r-api-coverage.mdmuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rApiCoverageReportTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rEventsRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAiRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rKnowledgeRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rMarketRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAccountRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rMetaRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentEventsPublishFlywayMigrationIT.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentCoreCompletedApprovalIT.javadocs/agent-specs/.agentdocs/agent-specs/2026-06-11-P1RContentCompletedApproval审阅版.mddocs/agent-specs/2026-06-12-P1RContentCompletedApproval执行版.mddocs/memorys/2026-06-12-P1RContent状态推进.md
未修改:
- 7 个 OpenAPI。
- Content 业务实现。
- SQL migration。
- Content domain-level completed allowlist。
TDD evidence
RED 阶段先修改 P1R gate 期望值和 Content 8 个 operation 断言,在旧 scanner/report 下运行 focused P1R gates,预期失败已出现:
- 失败点来自旧 report 仍为
completed=131 / needsVerification=102。 - 失败点来自 Content 8 个 operation 仍为
needs_verification。 - 该失败证明 gate 会阻止未获 scanner/report 支撑的 completed 推进。
GREEN 阶段完成 scanner operation-level allowlist、report 重新生成、Content HTTP+DB _test evidence 和 focused gates 后,目标验证通过。
MockMvc HTTP 入口 + DB 证据
新增:
muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentCoreCompletedApprovalIT.java
验证方式:
- 使用 Spring Mock web context +
MockMvc。 - 使用真实 mapper / service。
- 使用真实 PostgreSQL
_test数据库。 - 使用 Flyway clean/migrate V1-V21。
- 密码只从环境变量读取,禁止通过 JVM system property 传入。
说明:这里的 HTTP 入口证据是执行版要求的 WebApplicationContext + MockMvc 请求路径证据,不是启动真实 socket 端口的 live servlet container 证据。
验证数据库:
muse_p1r_content_core_completed_approval_test
通过结果:
P1rContentCoreCompletedApprovalIT: tests=12, failures=0, errors=0, skipped=0
review 修复:
- fresh testing review(Hooke)指出 chapter/block missing 负路径缺显式 HTTP 断言。
- 已补
missing work chapter list、missing chapter detail、missing chapter block list、missing block detail。 - 已补上述查询负路径的 Content outbox no-write 断言。
- 修复后已重跑
P1rContentCoreCompletedApprovalIT,结果仍为 tests=12、failures=0、errors=0、skipped=0,XML mtime 在本次运行窗口内。 - fresh implementation review 第一轮中,Bohr correctness review 与 Euclid testing/data-integrity review 均 FAIL,指出
saveBlock缺expectedRevision、缺sourceSnapshot两个执行版 mandatory 负路径。 - 已补
p1r-content-missing-expected-revision与p1r-content-missing-source-snapshot两个 HTTP+DB no-write 断言,并复用assertSnapshotUnchanged覆盖 block/source/outbox/command 不写入。 - 修复后已重跑
P1rContentCoreCompletedApprovalIT,结果仍为 tests=12、failures=0、errors=0、skipped=0,XML mtime 在本次运行窗口内。
覆盖内容:
listWorks分页、状态过滤、owner 隔离、tenant 隔离、空页。getWorkhappy、missing、cross owner、cross tenant。listChapters的 happy、empty、missing work、cross owner、cross tenant。getChapter的 happy、missing chapter、path mismatch、cross owner、cross tenant。listBlocks的 happy、empty、missing chapter、path mismatch、cross owner、cross tenant。getBlock的 happy、missing block、path mismatch、cross owner、cross tenant。saveBlock写入 block revision、source attribution、Content outbox、command log。saveBlockcommand replay 不重复写。saveBlock缺commandId、缺expectedRevision、缺sourceSnapshot、revision conflict、command conflict、path mismatch、cross owner、cross tenant 均断言 no-write 或事务回滚后行数不变。getBlockSourceAttributionactive/current、empty、path mismatch、cross owner、cross tenant,错误路径不写 DB。
Flyway V21 证据
增强:
muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentEventsPublishFlywayMigrationIT.java
验证数据库:
muse_p1r_content_core_completed_approval_test
通过结果:
P1rContentEventsPublishFlywayMigrationIT: tests=4, failures=0, errors=0, skipped=0
关键输出:
flyway_success=true
flyway_url=jdbc:postgresql://<host>/muse_p1r_content_core_completed_approval_test
flyway_locations_effective=filesystem:/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0/muse-cloud/sql/muse
migrations_executed=21
successful_migration_count=21
target_schema_version=21
flyway_latest=21:extend content events publish outbox
v21_table=muse_content_event_publish_outbox
v21_triggers=trg_muse_content_event_publish_outbox_update_time
验证内容:
- V1-V21 clean migrate。
- V21 Content event publish outbox 表存在。
- claim、owner/status、block/revision 相关索引存在。
- event type、notification type、source status、publish status、owner、block、block revision、resource ref、attempt count、max attempt 等约束存在。
- update time trigger 存在。
attempt_count=-1被 PostgreSQL check 拒绝。max_attempt=0被 PostgreSQL check 拒绝。
system property 组合验证
P1rContentCoreCompletedApprovalIT 与 P1rContentEventsPublishFlywayMigrationIT 都会保存并在 @AfterAll 恢复 p1r.flyway.url/user,避免脱敏后的 system property 污染同一 Surefire JVM 后续测试。
组合验证使用真实 PostgreSQL _test 库:
muse_p1r_content_core_completed_approval_test
通过结果:
P1rContentCoreCompletedApprovalIT,P1rContentEventsPublishFlywayMigrationIT: tests=16, failures=0, errors=0, skipped=0
P1rContentCoreCompletedApprovalIT,P1rContentEventsPublishFlywayMigrationIT with -Dsurefire.runOrder=reversealphabetical: tests=16, failures=0, errors=0, skipped=0
Hooke 修复后已重跑上述两组组合验证,结果仍为 16/16 pass,两个目标 XML 均为本次运行窗口内的新产物。
Bohr / Euclid P1 修复后已重跑普通组合验证,结果仍为 16/16 pass,两个目标 XML 均为本次运行窗口内的新产物。
注意:两次组合验证的实际 Surefire 执行顺序均为 P1rContentEventsPublishFlywayMigrationIT 先、P1rContentCoreCompletedApprovalIT 后。-Dsurefire.runOrder=reversealphabetical 未改变实际顺序,因此本轮只能证明 Flyway IT 脱敏/恢复不会污染后续 Core IT,不能写成已证明 Core IT -> Flyway IT 反向顺序。
focused gates
Content focused verification 通过,并已做 XML 防空跑:
ContentAppServiceTest: tests=13, failures=0, errors=0, skipped=0
ContentSourceServiceTest: tests=23, failures=0, errors=0, skipped=0
ContentEventPublishOutboxServiceTest: tests=6, failures=0, errors=0, skipped=0
ContentEventPublishWorkerTest: tests=10, failures=0, errors=0, skipped=0
AppContentControllerTest: tests=32, failures=0, errors=0, skipped=0
AppContentSourceControllerTest: tests=5, failures=0, errors=0, skipped=0
P1rContentEventsPublishMigrationSqlTest: tests=3, failures=0, errors=0, skipped=0
P1rContentEventsPublishDependencyTest: tests=2, failures=0, errors=0, skipped=0
P1rContentEventsPublishEndToEndTest: tests=5, failures=0, errors=0, skipped=0
P1rContentRealApiGateTest: tests=5, failures=0, errors=0, skipped=0
P1rApiCoverageReportTest: tests=6, failures=0, errors=0, skipped=0
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 139 94 0 0 0
Content operation 状态确认:
completed=8
needs_verification=43
completed 清单:
listWorks
getWork
listChapters
getChapter
listBlocks
getBlock
saveBlock
getBlockSourceAttribution
代表性非目标 operation 仍为 needs_verification:
adminRiskAction
createWork
updateWork
mergeBlockSuggestion
createChapter
exportWork
getPlanning
diff check:
git diff --check: pass
protected OpenAPI diff:
empty
allowed diff 检查结果:
仅包含执行版允许的 docs/agent-specs、docs/memorys、coverage report、scanner、P1R gate test、Content Core IT 与 Content Flyway IT 文件。
当前边界
- fresh implementation re-review 已双 PASS:Mendel correctness review PASS,确认 Bohr/Euclid P1 已关闭,8 个 Content completed operation、scanner operation-level allowlist、coverage summary、protected diff 与 XML 证据均自洽;Anscombe testing/data-integrity review PASS,无 findings、无 testing gaps,残余风险仅为 raw Surefire XML 可能包含本地 DB host/user,未发现 password 泄露。
- 本轮只代表 Content 第一批 8 个 operation-level completed approval。
- 不代表 Content 51/51 completed。
- 不代表 Account remaining completed。
- 不代表 Market remaining completed。
- 不代表总 P1R completed。
- raw Surefire XML 可能包含 DB host/user,未发现 password 泄露;外发前需清洗。
- 当前已具备提交条件;提交或 push 仍需用户明确指令。