oh-my-muse/docs/agent-specs/2026-06-13-P1RContentAdminRiskActionCompletedApproval执行版.md

27 KiB
Raw Blame History

P1R Content Admin RiskAction Completed Approval 执行版

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development to implement this plan task-by-task only after fresh execution review double PASS and explicit user approval. Steps use checkbox syntax for tracking.

日期2026-06-13

结论

本执行版只锁定 Content 管理后台治理写命令 1 个 operation-level completed approval

content:adminRiskAction

本轮不把 content 加入 domain-level completed allowlist不推进 Content 51/51 completed不修改 OpenAPI不修改 Content 业务实现,不修改 SQL migration。

获批后目标 coverage summary 为:

total=233
completed=145
needsVerification=88
incomplete=0
genericPersistence=0
ssePlaceholder=0

Content 域目标状态为:

content total=51
completed=14
needsVerification=37

当前阶段只允许写执行方案并进入 fresh execution review。执行版 review 双 PASS 后仍必须由用户再次明确批准审批清单、operation-level 边界、allowed diff 和 mixed gate 同步范围,才允许实施。

flowchart TB
    Current["当前 Content<br/>13 completed / 38 needs_verification"] --> Exec["执行版<br/>锁定 adminRiskAction 1 op"]
    Exec --> Review["fresh execution spec/scope review<br/>fresh execution quality/testing review"]
    Review --> Approval{"用户明确批准<br/>1 op / operation-level / allowed diff / mixed gates"}
    Approval -->|否| Stay["保持当前 coverage<br/>233/144/89"]
    Approval -->|是| Red["TDD RED<br/>先改 gate 期望<br/>旧 report 必须失败"]
    Red --> Runtime["HTTP + real DB _test<br/>RBAC + tenant + command + audit + rollback"]
    Runtime --> Green["scanner operation allowlist<br/>regenerate report"]
    Green --> Verify["focused tests + P1R mixed gates<br/>XML 防空跑 + protected diff"]
    Verify --> FreshReview["fresh implementation review"]

当前事实

正确 worktree

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

当前 HEAD

b0b4b2c test(p1r): 收口 Content Admin Read completed approval 门禁

当前分支:

dev/1.0.0...origin/dev/1.0.0

当前 coverage summary

233	144	89	0	0	0

当前 domain 状态:

account  completed=10  needsVerification=23
content  completed=13  needsVerification=38
market   completed=4   needsVerification=28
meta     completed=16  needsVerification=0

当前目标 operation 状态:

adminRiskAction	dedicated	needs_verification	true	POST	/admin-api/muse/content/works/{workId}/risk-actions

已验证的只读实现事实:

  • OpenAPI RiskActionRequest.required 已包含 commandIdactionreasonexpectedVersion
  • AdminContentController.adminRiskAction 使用 @PreAuthorize("@ss.hasPermission('muse:content:risk-action')"),并调用 requireApiVersion()
  • Controller-local mapping 为 /muse/content/works/{workId}/risk-actions;对外 OpenAPI 路径为 /admin-api/muse/content/works/{workId}/risk-actions
  • ContentAdminServiceImpl.adminRiskAction 使用 @Transactional(rollbackFor = Exception.class)
  • Service 先通过 ContentCommandService.reserveCommand(...) 处理 commandId 和 replay再通过 WorkMapper.selectByIdForUpdate(workId, tenantId) 锁定作品行。
  • Service 在锁定作品行后校验 expectedVersion、action、targetScope、targetIds并校验 chapter / block target 归属 URL work。
  • 成功路径插入 muse_content_governance_action,并通过 ContentCommandAuditService.recordSucceededWithAudit(...) 写 command/audit/result snapshot。
  • 当前实现不写 muse_content_event_publish_outbox;本切片不证明 Events propagation。
  • 现有 AdminContentControllerTest / ContentAdminServiceTest 只能作为 focused 辅助证据,不能替代 completed-grade HTTP + real PostgreSQL _test

执行边界

必须先获用户明确批准

实现前必须同时获得以下 4 项批准:

  1. 批准本轮只审批 content:adminRiskAction 一个 operation。
  2. 批准继续使用 operation-level approval不把 content 加入 domain-level completed allowlist。
  3. 批准按本执行版修改 scanner、coverage report、P1R gates、新增 Admin RiskAction HTTP+DB _test、memory 和 .agent
  4. 批准同步 mixed gate 的 summary / Content / 非目标域防回退断言,目标为 233/145/88/0/0/0 与 Content 14 completed / 37 needs_verification

未获上述批准前,不得实施本执行版。

本轮允许变更

获批后只允许修改以下路径:

  • 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/P1rContentAdminRiskActionCompletedApprovalIT.java
  • muse-cloud/muse-module-content/muse-module-content-server/src/test/java/cn/iocoder/muse/module/content/application/ContentAdminServiceTest.java,仅限补充本执行版缺失的 focused behavior 证据。
  • muse-cloud/muse-module-content/muse-module-content-server/src/test/java/cn/iocoder/muse/module/content/controller/admin/AdminContentControllerTest.java,仅限补充本执行版缺失的 controller contract 证据。
  • docs/agent-specs/.agent
  • docs/agent-specs/2026-06-13-P1RContentAdminRiskActionCompletedApproval审阅版.md
  • docs/agent-specs/2026-06-13-P1RContentAdminRiskActionCompletedApproval执行版.md
  • docs/memorys/2026-06-13-P1RContentAdminRiskAction状态推进.md

如 implementation 发现必须修改 Content 业务实现、OpenAPI、SQL migration、非批准 gate 或其它文件,必须停下说明原因并重新取得用户批准。

本轮禁止变更

  • 不修改 7 个 OpenAPI。
  • 不修改 Content main/java 业务实现来掩盖 coverage 缺口。
  • 不新增或修改 SQL migration。
  • 不把 content 加入 domain-level completed allowlist。
  • 不推进 Content 51/51 completed。
  • 不推进 Account remaining 23、Market remaining 28、Content remaining 37 或总 P1R completed。
  • 不推进 admin import/export task、Content CRUD 写命令、AI planning candidate、style check、Meta projection、dynamic fields、FileService、import/export/parse operation。
  • 不把 Admin Read 的 riskFlag 聚合证据当成 adminRiskAction completed 证据。
  • 不把 dedicated gate PASS、review PASS、文档结论或已有 Mockito 单测直接等同 completed。

审批清单

operation key Method Path 目标状态 完成证据边界
content:adminRiskAction POST /admin-api/muse/content/works/{workId}/risk-actions dedicated / completed MockMvc HTTP + 真实 PostgreSQL _test,覆盖 API version、method security RBAC、commandId、replay、command conflict、expectedVersion、row lock、targetScope / targetIds 归属、governance action、command/audit snapshot、tenant 隔离、schema gate、no-write / rollback

保持 needs_verification 的 Content operation

以下 37 个 operation 必须保持 dedicated / needs_verification

content:adminListExportTasks
content:adminListImportTasks
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

证据分层

Evidence 文件 / 测试 目的
Operation inventory / coverage gate P1rApiCoverageReportTestP1rContentRealApiGateTest 和 mixed gates 证明只推进获批 1 个 operation非目标 domain 不回退
Admin RiskAction HTTP+DB _test 新增 P1rContentAdminRiskActionCompletedApprovalIT 证明 adminRiskAction 经 MockMvc HTTP 入口访问真实 service / mapper / PostgreSQL _test 数据
Tenant / schema gate P1rContentAdminRiskActionCompletedApprovalIT 内验证 V1-V21 clean migrate 与 governance action 依赖 schema 证明 Work / Chapter / Block / GovernanceAction / CommandLog / Outbox schema 和 tenant interceptor 真实可用
Method security gate P1rContentAdminRiskActionCompletedApprovalIT 内启用 method security 与 ss bean 证明 admin RBAC 缺权限拒绝不是注解反射假证据
Command / audit gate P1rContentAdminRiskActionCompletedApprovalIT 内读取 muse_content_command_log.result_snapshot 证明 operationId、side、target、requestSummary、result snapshot 和 replay 语义真实落库
Focused unit/controller tests ContentAdminServiceTestAdminContentControllerTest 支撑 service/controller contract不替代 HTTP+DB _test

TDD / 实施步骤

Task 1Preflight 与 RED gate

  • 确认当前 worktree
git -c core.quotePath=false status --short --branch

期望:

## dev/1.0.0...origin/dev/1.0.0

允许存在本执行版和审阅版文档 diff不得存在 OpenAPI、业务实现、SQL、scanner、coverage report 或 gate test 的未授权 diff。

  • 确认当前 coverage
jq -r '.summary | [.totalOperations,.completedOperations,.needsVerificationOperations,.incompleteOperations,.genericPersistenceOperations,.ssePlaceholderOperations] | @tsv' docs/superpowers/reports/p1r-api-coverage.json
jq -r '.operations[] | select(.domain=="content" and .operationId=="adminRiskAction") | [.operationId,.implementationStatus,.completionStatus,(.requiresCommandId|tostring),.method,.path] | @tsv' docs/superpowers/reports/p1r-api-coverage.json

期望:

233	144	89	0	0	0
adminRiskAction	dedicated	needs_verification	true	POST	/admin-api/muse/content/works/{workId}/risk-actions
  • TDD RED先修改 P1R gate 期望值和 adminRiskAction completed 断言,但不修改 scanner/report。

RED 目标:

  • P1rApiCoverageReportTest 期望 summary completed=145 / needsVerification=88
  • P1rContentRealApiGateTest 期望 Content 14 completed / 37 needs_verificationadminRiskAction completed。
  • 7 个 mixed gate 中所有硬编码 Content 13/38 或 summary 144/89 的断言同步为 14/37145/88

RED 命令:

cd muse-cloud
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \
mvn -o test -pl muse-server -am \
  -Dtest=P1rApiCoverageReportTest,P1rContentRealApiGateTest,P1rEventsRealApiGateTest,P1rAiRealApiGateTest,P1rKnowledgeRealApiGateTest,P1rMarketRealApiGateTest,P1rAccountRealApiGateTest,P1rMetaRealApiGateTest \
  -Dsurefire.failIfNoSpecifiedTests=false

期望BUILD FAILURE。失败点必须来自旧 report 仍是 233/144/89adminRiskAction 仍为 needs_verification;不得来自编译错误或无关测试失败。

Task 2新增 Admin RiskAction HTTP+DB _test

  • 新增:
muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rContentAdminRiskActionCompletedApprovalIT.java

测试上下文要求:

  • 使用 @SpringBootTest(webEnvironment = MOCK) + WebApplicationContext + MockMvcBuilders.webAppContextSetup(...)
  • 真实 /admin-api/muse/** 前缀进入 AdminContentController
  • 导入 MuseWebAutoConfiguration,并提供 test-local ApiErrorLogCommonApi stub返回 CommonResult.success(true),满足 GlobalExceptionHandler 依赖。
  • 启用 @EnableMethodSecurity(securedEnabled = true),并提供 @Bean("ss") 的 test-local SecurityFrameworkService,权限点必须是 muse:content:risk-action
  • 使用真实 ContentAdminServiceImplContentCommandServiceImplContentAuditServiceImpl、真实 mapper 和真实 PostgreSQL _test 数据库。
  • 注册真实 MyBatis tenant interceptorTenantLineInnerInterceptor + TenantDatabaseInterceptor(new TenantProperties())
  • 所有 ContentAdminServiceImpl@Resource 依赖必须可启动;不得只注册 Work/Chapter/Block/GovernanceAction mapper 后让上下文靠 mock 补洞。
  • Configuration 必须导入所有 ContentAdminServiceImpl 字段依赖需要的 mapper / service / facade stub如果某个 facade 不属于本切片,应提供 fail-fast stub并证明本切片未调用它。
  • TARGET_VERSION="21",执行 V1-V21 clean migrate。
  • 数据库密码只能来自环境变量,禁止 JVM system property 或 JDBC query 参数传入。
  • 保存并在 @AfterAll 恢复 p1r.flyway.url / p1r.flyway.user system property避免污染同一 Surefire JVM 后续 Flyway 测试。

建议测试库:

muse_p1r_content_admin_risk_action_completed_approval_test

建议环境变量优先级:

P1R_CONTENT_ADMIN_RISK_ACTION_COMPLETED_PASSWORD
P1R_CONTENT_COMPLETED_PASSWORD
P1R_FLYWAY_PASSWORD
MUSE_POSTGRES_PASSWORD

standalone 建库与运行前置:

source ~/.config/muse-repo/infra.env
export P1R_FLYWAY_PASSWORD="$MUSE_POSTGRES_PASSWORD"
export P1R_CONTENT_COMPLETED_PASSWORD="$MUSE_POSTGRES_PASSWORD"
export P1R_CONTENT_ADMIN_RISK_ACTION_COMPLETED_PASSWORD="$MUSE_POSTGRES_PASSWORD"
export P1R_CONTENT_ADMIN_RISK_ACTION_COMPLETED_APPROVAL_TEST_DB=muse_p1r_content_admin_risk_action_completed_approval_test

PGPASSWORD="$MUSE_POSTGRES_PASSWORD" psql \
  -h "$MUSE_POSTGRES_HOST" \
  -p "$MUSE_POSTGRES_PORT" \
  -U "$MUSE_POSTGRES_USERNAME" \
  -d postgres \
  -tc "SELECT 1 FROM pg_database WHERE datname = '$P1R_CONTENT_ADMIN_RISK_ACTION_COMPLETED_APPROVAL_TEST_DB'" | grep -q 1 || \
PGPASSWORD="$MUSE_POSTGRES_PASSWORD" psql \
  -h "$MUSE_POSTGRES_HOST" \
  -p "$MUSE_POSTGRES_PORT" \
  -U "$MUSE_POSTGRES_USERNAME" \
  -d postgres \
  -c "CREATE DATABASE $P1R_CONTENT_ADMIN_RISK_ACTION_COMPLETED_APPROVAL_TEST_DB"

执行版 implementation 必须显式拒绝非 _test 数据库名;如果建库变量不是 _test 后缀,测试必须在连接前失败。

  • 新增基础 seed 与快照工具。

seed 要求:

  • 当前 tenant 的 workrevision 固定为 7
  • 当前 tenant 下属于该 work 的 chapter / block。
  • 当前 tenant 下另一个 work、另一个 chapter / block用于 cross-work target 拒绝。
  • 另一个 tenant 的 work / chapter / block用于 tenant 隔离。
  • 当前 login user 为 admin usertenant 与 visitTenant 都设置为当前 tenant。

错误路径 no-write 快照必须覆盖:

muse_content_work
muse_content_chapter
muse_content_block
muse_content_governance_action
muse_content_command_log
muse_content_event_publish_outbox

快照必须用 row_to_json(t)::text 或等价关键字段快照,不能只比对行数。

  • mandatory test matrix。

最低测试类行为:

  1. 拒绝 unsafe DB 配置:非 _test 数据库、JVM password system property、JDBC credential query。
  2. 验证 schemaV1-V21 clean migratemuse_content_governance_action 表、关键列、JSONB target_ids、unique command 约束、work 索引、updated_at trigger 存在duplicate (tenant_id, command_id) 返回 SQLState 23505
  3. API version / RBAC缺或不支持 X-API-Version no-writemuse:content:risk-action 权限返回 403 CommonResult 且 no-write成功请求必须证明 ss.hasPermission("muse:content:risk-action") 被调用。
  4. work scope happy path成功写 1 条 governance action 和 1 条 command/audit envelope返回 actionId/status/affectedScope/auditLogIdaffectedScope=work:{workId}outbox 不写。
  5. chapter / block scope happy pathtargetIds 属于 URL work 才能成功chapter 与 block affectedScope 正确。
  6. action statusnotify_owner 返回 pending_notificationwarn / restrict / block_content / force_archive 返回 executed
  7. command replay同 commandId 同请求返回同一 resultSnapshot,不重复插入 governance action、command/audit 或 outbox。
  8. command conflict同 commandId 不同 action、reason、targetScope、targetIds、workId 或 expectedVersion 返回 command conflict且 no-write。
  9. revision conflictexpectedVersion 与 work revision 不一致返回 CONTENT_REVISION_CONFLICT,且 no-write。
  10. validation / unsupported缺 commandId、缺 expectedVersion、unsupported action、unsupported targetScope 均拒绝并 no-write。
  11. targetIds invalidchapter / block targetIds 为空、含 null、missing、cross-work、cross-tenant、block -> chapter -> work 链路不匹配,均拒绝并 no-write。
  12. missing / cross tenant work返回 not found 或不可见语义,不泄露其它 tenant 数据,且 no-write。
  13. row-lock proxy至少用 WorkMapper.selectByIdForUpdate 源码 / mapper SQL 断言包含 FOR UPDATE,并用真实 DB stale expectedVersion 场景证明锁后 revision 校验会拒绝并 rollback。若要做真实并发事务测试必须保证可重复、无 sleep 竞态和可诊断日志。
  14. command/audit row fact断言 muse_content_command_log 行级字段 tenant_idcommand_idcommand_type=adminRiskActionowner_user_id=admin usertarget_type=worktarget_id=workIdrequest_hash 非空且 replay 时稳定。
  15. governance action row fact断言 muse_content_governance_action 行级字段 tenant_idwork_idoperator_user_id=admin usercommand_idaudit_log_idactionreasontarget_scopetarget_idsexpected_versionstatus
  16. command/audit snapshot解析 muse_content_command_log.result_snapshot,断言 operationId=adminRiskActionside=admintargetType=worktargetId=workIdstatus=succeededreasonrequestSummary.actionrequestSummary.targetScoperequestSummary.targetIdsrequestSummary.expectedVersionresult.actionId/status/affectedScope/auditLogId

Task 3Focused tests

  • 运行 Content focused tests
cd muse-cloud
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \
mvn -o test -pl muse-module-content/muse-module-content-server,muse-server -am \
  -Dtest=ContentAdminServiceTest,AdminContentControllerTest \
  -Dsurefire.failIfNoSpecifiedTests=false

期望:

ContentAdminServiceTest: pass
AdminContentControllerTest: pass
BUILD SUCCESS

如执行版实现发现 focused tests 缺少审阅版硬门槛,可只在允许范围内补充测试,不得改 main/java。

Task 4GREEN scanner / report

  • scanner 只追加 operation-level key
content:adminRiskAction

禁止修改:

APPROVED_COMPLETED_DOMAINS
  • 重新生成 coverage report
python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check

期望 summary

233	145	88	0	0	0

期望 Content

completed=14
needsVerification=37

期望 operation

adminRiskAction	dedicated	completed	true

仍必须抽样断言这些非目标 operation 保持 needs_verification

adminListImportTasks
adminListExportTasks
createWork
updateWork
createChapter
mergeBlockSuggestion
exportWork
listPlanningCandidates
createStyleCheck
getStyleCheckResult

Task 5P1R mixed gates

  • 运行 P1R mixed gates
cd muse-cloud
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \
mvn -o test -pl muse-server -am \
  -Dtest=P1rApiCoverageReportTest,P1rContentRealApiGateTest,P1rEventsRealApiGateTest,P1rAiRealApiGateTest,P1rKnowledgeRealApiGateTest,P1rMarketRealApiGateTest,P1rAccountRealApiGateTest,P1rMetaRealApiGateTest \
  -Dsurefire.failIfNoSpecifiedTests=false

期望:

  • P1rApiCoverageReportTest summary 为 233/145/88/0/0/0
  • P1rContentRealApiGateTest Content 为 14/37adminRiskAction completed。
  • P1rEventsRealApiGateTestP1rAiRealApiGateTestP1rKnowledgeRealApiGateTestP1rMarketRealApiGateTestP1rAccountRealApiGateTestP1rMetaRealApiGateTest 内所有 Content partial approval 防回退断言同步为 14/37
  • AI 41、Knowledge 59、Events 1、Meta 16、Account 10、Market 4 状态不回退。

Task 6Content combined DB gate

  • 使用独立 _test 库组合运行 Content completed approval DB gates
source ~/.config/muse-repo/infra.env
export P1R_FLYWAY_PASSWORD="$MUSE_POSTGRES_PASSWORD"
export P1R_CONTENT_COMPLETED_PASSWORD="$MUSE_POSTGRES_PASSWORD"
export P1R_CONTENT_ADMIN_RISK_ACTION_COMPLETED_PASSWORD="$MUSE_POSTGRES_PASSWORD"
export P1R_CONTENT_ADMIN_RISK_ACTION_COMBINED_TEST_DB=muse_p1r_content_admin_risk_action_combined_test

PGPASSWORD="$MUSE_POSTGRES_PASSWORD" psql \
  -h "$MUSE_POSTGRES_HOST" \
  -p "$MUSE_POSTGRES_PORT" \
  -U "$MUSE_POSTGRES_USERNAME" \
  -d postgres \
  -tc "SELECT 1 FROM pg_database WHERE datname = '$P1R_CONTENT_ADMIN_RISK_ACTION_COMBINED_TEST_DB'" | grep -q 1 || \
PGPASSWORD="$MUSE_POSTGRES_PASSWORD" psql \
  -h "$MUSE_POSTGRES_HOST" \
  -p "$MUSE_POSTGRES_PORT" \
  -U "$MUSE_POSTGRES_USERNAME" \
  -d postgres \
  -c "CREATE DATABASE $P1R_CONTENT_ADMIN_RISK_ACTION_COMBINED_TEST_DB"

cd muse-cloud
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \
mvn -o test -pl muse-server -am \
  -Dtest=P1rContentAdminRiskActionCompletedApprovalIT,P1rContentAdminReadCompletedApprovalIT,P1rContentPlanningCompletedApprovalIT,P1rContentCoreCompletedApprovalIT,P1rContentEventsPublishFlywayMigrationIT \
  -Dflyway.postgresql.transactional.lock=false \
  -Dp1r.flyway.locations=filesystem:sql/muse \
  -Dp1r.flyway.url="jdbc:postgresql://$MUSE_POSTGRES_HOST:$MUSE_POSTGRES_PORT/$P1R_CONTENT_ADMIN_RISK_ACTION_COMBINED_TEST_DB" \
  -Dp1r.flyway.user="$MUSE_POSTGRES_USERNAME" \
  -Djava.net.useSystemProxies=false \
  -DsocksProxyHost= -DsocksProxyPort= \
  -Dhttp.proxyHost= -Dhttp.proxyPort= \
  -Dhttps.proxyHost= -Dhttps.proxyPort= \
  -Dsurefire.failIfNoSpecifiedTests=false

要求:

  • 所有类 tests > 0。
  • failures=0、errors=0、skipped=0。
  • 证明新增 Admin RiskAction IT 不污染同 JVM 的 Flyway system properties。
  • 如 first run 暴露 password env 缺失或 system property 污染,必须修复后重跑,并记录失败根因与修复。

Task 7XML 防空跑

  • 检查以下 XML 必须存在、mtime 在本轮验证窗口内、tests > 0、failures/errors/skipped 均为 0
P1rContentAdminRiskActionCompletedApprovalIT
P1rContentAdminReadCompletedApprovalIT
P1rContentPlanningCompletedApprovalIT
P1rContentCoreCompletedApprovalIT
P1rContentEventsPublishFlywayMigrationIT
ContentAdminServiceTest
AdminContentControllerTest
P1rApiCoverageReportTest
P1rContentRealApiGateTest
P1rEventsRealApiGateTest
P1rAiRealApiGateTest
P1rKnowledgeRealApiGateTest
P1rMarketRealApiGateTest
P1rAccountRealApiGateTest
P1rMetaRealApiGateTest

防空跑脚本可用 shell / awk / xmllint / existing local pattern但不得把 XML 旧产物当 fresh evidence。

Task 8Protected diff / final checks

  • 运行:
git diff --check
  • 确认 protected diff 为空:
git diff --name-only -- docs/api-contracts muse-cloud/muse-module-content/muse-module-content-server/src/main/java muse-cloud/sql/muse

期望:无输出。

  • 确认 scanner/report 目标:
jq -r '.summary | [.totalOperations,.completedOperations,.needsVerificationOperations,.incompleteOperations,.genericPersistenceOperations,.ssePlaceholderOperations] | @tsv' docs/superpowers/reports/p1r-api-coverage.json
jq -r '.operations[] | select(.domain=="content" and (.operationId=="adminRiskAction" or .operationId=="adminListExportTasks" or .operationId=="adminListImportTasks" or .operationId=="createWork" or .operationId=="exportWork" or .operationId=="createStyleCheck")) | [.operationId,.implementationStatus,.completionStatus,(.requiresCommandId|tostring)] | @tsv' docs/superpowers/reports/p1r-api-coverage.json

期望:

233	145	88	0	0	0
adminRiskAction	dedicated	completed	true
adminListExportTasks	dedicated	needs_verification	false
adminListImportTasks	dedicated	needs_verification	false
createWork	dedicated	needs_verification	false
exportWork	dedicated	needs_verification	false
createStyleCheck	dedicated	needs_verification	true

Review gate

本执行版写完后必须先进行 fresh execution review

  1. fresh execution spec/scope review

    • 确认只覆盖 content:adminRiskAction
    • 确认不夹带 admin import/export task、Content CRUD 写命令、Content domain-level completed 或其它 domain。
    • 确认目标值 233/145/88 与 Content 14/37 能从当前 233/144/89 与 Content 13/38 加 1 个 operation 机械推导。
    • 确认 allowed / prohibited diff 自洽。
  2. fresh execution quality/feasibility/testing review

    • 确认 HTTP+DB _test harness 可复用现有 Admin Read / Planning 模式落地。
    • 确认 method security、tenant interceptor、command replay/conflict、expectedVersion/row lock、targetScope / targetIds、governance action、command/audit snapshot、no-write / rollback、schema gate、XML 防空跑和 mixed gate 同步都可验证。
    • 确认不需要改 OpenAPI、Content main/java 或 SQL migration。

双 PASS 后,仍不代表 adminRiskAction completed。必须由用户明确批准执行边界后才允许进入 implementation。

Rollback

如果实现后需要回滚本切片:

  1. APPROVED_COMPLETED_OPERATIONS 删除 content:adminRiskAction
  2. 重新运行 scanner恢复 report summary 到 233/144/89/0/0/0
  3. 恢复 P1rApiCoverageReportTestP1rContentRealApiGateTest 和 mixed gates 的 summary / Content count / adminRiskAction 断言。
  4. 删除 P1rContentAdminRiskActionCompletedApprovalIT
  5. 删除或修订对应 memory / .agent 状态推进记录。
  6. 保留 OpenAPI、Content main/java、SQL migration 无 diff。

完成条件

只有同时满足以下条件,才允许汇报本切片具备提交候选条件:

  • 用户已批准执行版四项前置条件。
  • RED gate 先失败且失败点正确。
  • P1rContentAdminRiskActionCompletedApprovalIT fresh pass且 XML 防空跑通过。
  • Content focused tests fresh pass。
  • scanner --check fresh passsummary 为 233/145/88/0/0/0
  • P1R mixed gates fresh pass。
  • Content combined DB gate fresh pass。
  • protected OpenAPI / Content main/java / SQL diff 为空。
  • git diff --check 通过。
  • .agentdocs/memorys 留痕明确说明 Content 仍不是 51/51 completed。
  • fresh implementation spec/correctness review + fresh quality/data-integrity/testing review 双 PASS。