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

379 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 状态推进
日期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。
## 工作区与基线
工作区:
```text
/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0
```
基线 HEAD
```text
0032774 test(p1r): 收口 Market 第一批 completed approval 门禁
```
实施前 coverage summary
```text
233 131 102 0 0 0
```
实施后 coverage summary
```text
233 139 94 0 0 0
```
实施后 Content 状态:
```text
completed=8
needs_verification=43
```
## 继续 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: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 证据。
验证数据库:
```text
muse_p1r_content_core_completed_approval_test
```
通过结果:
```text
P1rContentCoreCompletedApprovalIT: tests=12, failures=0, errors=0, skipped=0
```
review 修复:
- fresh testing reviewHooke指出 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=0XML 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=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 不重复写。
- `saveBlock``commandId`、缺 `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`
验证数据库:
```text
muse_p1r_content_core_completed_approval_test
```
通过结果:
```text
P1rContentEventsPublishFlywayMigrationIT: tests=4, failures=0, errors=0, skipped=0
```
关键输出:
```text
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` 库:
```text
muse_p1r_content_core_completed_approval_test
```
通过结果:
```text
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 防空跑:
```text
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 防空跑:
```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 139 94 0 0 0
```
Content operation 状态确认:
```text
completed=8
needs_verification=43
```
completed 清单:
```text
listWorks
getWork
listChapters
getChapter
listBlocks
getBlock
saveBlock
getBlockSourceAttribution
```
代表性非目标 operation 仍为 `needs_verification`
```text
adminRiskAction
createWork
updateWork
mergeBlockSuggestion
createChapter
exportWork
getPlanning
```
diff check
```text
git diff --check: pass
```
protected OpenAPI diff
```text
empty
```
allowed diff 检查结果:
```text
仅包含执行版允许的 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 仍需用户明确指令。