oh-my-muse/docs/memorys/2026-06-12-P1RContent状态推进.md

14 KiB
Raw Blame History

P1R Content 状态推进

日期2026-06-12

结论

本轮只推进 Content 第一批 8 个 operation-level completed approval

  • content:listWorks
  • content:getWork
  • content:listChapters
  • content:getChapter
  • content:listBlocks
  • content:getBlock
  • content:saveBlock
  • content: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.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/P1rContentEventsPublishFlywayMigrationIT.java
  • muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentCoreCompletedApprovalIT.java
  • docs/agent-specs/.agent
  • docs/agent-specs/2026-06-11-P1RContentCompletedApproval审阅版.md
  • docs/agent-specs/2026-06-12-P1RContentCompletedApproval执行版.md
  • docs/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 reviewHooke指出 chapter/block missing 负路径缺显式 HTTP 断言。
  • 已补 missing work chapter listmissing chapter detailmissing chapter block listmissing block detail
  • 已补上述查询负路径的 Content outbox no-write 断言。
  • 修复后已重跑 P1rContentCoreCompletedApprovalIT,结果仍为 tests=12、failures=0、errors=0、skipped=0XML mtime 在本次运行窗口内。
  • fresh implementation review 第一轮中Bohr correctness review 与 Euclid testing/data-integrity review 均 FAIL指出 saveBlockexpectedRevision、缺 sourceSnapshot 两个执行版 mandatory 负路径。
  • 已补 p1r-content-missing-expected-revisionp1r-content-missing-source-snapshot 两个 HTTP+DB no-write 断言,并复用 assertSnapshotUnchanged 覆盖 block/source/outbox/command 不写入。
  • 修复后已重跑 P1rContentCoreCompletedApprovalIT,结果仍为 tests=12、failures=0、errors=0、skipped=0XML mtime 在本次运行窗口内。

覆盖内容:

  • listWorks 分页、状态过滤、owner 隔离、tenant 隔离、空页。
  • getWork happy、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。
  • saveBlock command replay 不重复写。
  • saveBlockcommandId、缺 expectedRevision、缺 sourceSnapshot、revision conflict、command conflict、path mismatch、cross owner、cross tenant 均断言 no-write 或事务回滚后行数不变。
  • getBlockSourceAttribution active/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 组合验证

P1rContentCoreCompletedApprovalITP1rContentEventsPublishFlywayMigrationIT 都会保存并在 @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 已双 PASSMendel 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 仍需用户明确指令。