# P1R Meta Remaining 5 Completed Approval 审阅版 日期:2026-06-10 ## 结论 推荐把 Meta 剩余 5 个 `dedicated / needs_verification` operation 作为下一段 completed approval 候选,但当前不建议直接推进 `completed`。 本审阅版只冻结范围、证据缺口、推荐审批粒度和后续执行版要求。不修改 OpenAPI,不修改 scanner,不修改 coverage report,不修改业务代码,不把剩余 5 个 Meta operation 或其它 domain 推进 `completed`。 推荐审批策略: ```text operation-level approval for Meta remaining 5 ``` 原因是 MetaSchema 11 个 operation 已完成 operation-level approval;剩余 5 个 operation 分属 ProtectionNode 和 FunctionChain,证据形态不同。如果改成 Meta domain-level approval,会把两类治理读模型和功能链写命令一次性绑定,风险比继续 operation-level approval 更高。 ## 审批路径 ```mermaid flowchart TB Start["当前 coverage
Meta 11 completed + 5 needs_verification"] --> Review["本审阅版
冻结剩余 5 个 operation 范围"] Review --> FreshReview["fresh spec/scope review
fresh quality/feasibility review"] FreshReview --> ExecDoc["执行版
列出证据、门禁、allowed diff"] ExecDoc --> ExecReview["执行版 fresh 双 review"] ExecReview --> UserApproval{"用户明确批准
剩余 5 个 operation completed?"} UserApproval -->|否| Stop["保持 needs_verification"] UserApproval -->|是| Implement["只按执行版允许路径修改
scanner / gate / report / 必要测试"] Implement --> Verify["focused tests + P1R gates
Flyway _test + XML 防空跑
protected / allowed diff"] Verify --> ImplReview["fresh implementation 双 review"] ImplReview --> FinalApproval{"用户批准提交和 push?"} FinalApproval -->|否| LocalOnly["保留本地 evidence"] FinalApproval -->|是| Commit["提交并 push"] ``` ## 已验证事实 ### 工作区与当前状态 - 正确 worktree:`/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0`。 - 当前分支:`dev/1.0.0`。 - 当前本地与 `origin/dev/1.0.0` 对齐。 - 当前 HEAD: ```text 16e9f4e test(p1r): 收口 Meta completed approval 门禁 ``` 当前 coverage summary: ```text totalOperations 233 completedOperations 112 needsVerificationOperations 121 incompleteOperations 0 genericPersistenceOperations 0 ssePlaceholderOperations 0 ``` Meta 当前状态: ```text meta dedicated/completed:11 meta dedicated/needs_verification:5 ``` ### 本轮候选 operation 本审阅版只覆盖以下 5 个 Meta operation: | operationId | method/path | 当前状态 | | --- | --- | --- | | `listProtectionNodes` | `GET /admin-api/muse/governance/protection-nodes` | `dedicated / needs_verification` | | `getProtectionNode` | `GET /admin-api/muse/governance/protection-nodes/{nodeKey}` | `dedicated / needs_verification` | | `listFunctionChains` | `GET /admin-api/muse/governance/function-chains` | `dedicated / needs_verification` | | `previewFunctionChainImpact` | `POST /admin-api/muse/governance/function-chains/{chainKey}/impact-preview` | `dedicated / needs_verification` | | `activateFunctionChainVersion` | `POST /admin-api/muse/governance/function-chains/{chainKey}/versions/{version}/activate` | `dedicated / needs_verification` | 非候选范围: - 已 completed 的 MetaSchema 11 个 operation。 - Account 33、Market 32、Content 51。 - 总 P1R completed。 - 任何 OpenAPI 合同修改。 - 任何 Meta 业务实现补丁。 ### 已有 dedicated 实现证据 ProtectionNode 已有 dedicated Controller / Service: - `AdminProtectionNodeController` - `ProtectionNodeService` - `ProtectionNodeServiceImpl` `AdminProtectionNodeController` 使用 `/muse/governance/protection-nodes` 类级路由,覆盖 list/detail 两个 operation,且使用 `@PreAuthorize("@ss.hasPermission('muse:meta:query')")`。Controller 调用 `MetaApiVersionGuard.requireVersion(...)`,缺少 `X-API-Version` 时不回退到旧合同兜底结果。 `ProtectionNodeServiceImpl` 只读取 `muse_meta_protection_node` 持久化事实和 `policySnapshot` 中的 `chainKey` 轻量关联,不调用 `MuseContractPersistenceService`。查询只返回 `status='active'` 的保护节点;detail 不存在时抛出 `META_PROTECTION_NODE_NOT_FOUND`。 FunctionChain 已有 dedicated Controller / Service: - `AdminFunctionChainController` - `FunctionChainService` - `FunctionChainServiceImpl` `AdminFunctionChainController` 使用 `/muse/governance/function-chains` 类级路由,覆盖 list / impact-preview / activate 三个 operation,且绑定管理端权限: - 查询:`muse:meta:query` - 影响预览与激活:`muse:meta:function-chain` `FunctionChainServiceImpl` 已覆盖: - active version 读取。 - open slot 与 protection node count 计算。 - preview commandId / requestHash 幂等预占与成功回放。 - targetVersion 解析。 - validation result 和 impact preview 持久化。 - activate commandId / requestHash 幂等回放。 - published-only 激活。 - expected active version 冲突检测。 - validationResult / impactPreview 同源校验。 - protection boundary violation 阻断。 - active version 原子更新。 - governance audit 与 command succeeded 记录。 ### 已有保护边界证据 `FunctionChainGuard` 与 `MetaProtectionNodeGuard` 已声明保护节点不能被替换或降级: - `requireActivationAllowed(...)` 只允许 `published` 状态激活。 - `requireNoProtectionBoundaryViolation(...)` 在影响预览发现保护边界违规时抛出 `META_PROTECTION_NODE_IMMUTABLE`。 - `MetaProtectionNodeGuard.requireNotReplaced(...)` 禁止把 canonical 保护节点换成其它节点。 - `MetaProtectionNodeGuard.requireNotDowngraded(...)` 禁止不可替换保护节点降级为可替换。 - `MetaProtectionNodeGuard.requireFunctionChainNodePreservesProtection(...)` 统一 FunctionChain 编排下的保护边界语义。 `FunctionChainServiceImpl` 的 activation 流程在写 active version 前会调用 `requireProtectionBindingsPreserved(...)`,并基于 active / target version 的 node binding diff 阻断保护节点移除、解绑或降级。 ### 已有 SQL 与测试证据 V10 migration 已包含 FunctionChain 和 ProtectionNode 相关结构: - `muse_meta_function_chain_version` - `muse_meta_function_chain_slot` - `muse_meta_function_chain_node` - `uk_muse_meta_function_chain_version_active` - `muse_meta_protection_node` 结构化字段追加 - 对应 `updated_at` trigger 当前只有静态 SQL gate: - `P1rMetaMigrationSqlTest`,3 个 `@Test`。 与剩余 5 个 operation 直接相关的现有测试: | 测试类 | `@Test` 数量 | | --- | ---: | | `ProtectionNodeServiceTest` | 3 | | `FunctionChainServiceTest` | 12 | | `AdminProtectionNodeControllerTest` | 7 | | `AdminFunctionChainControllerTest` | 7 | | `FunctionChainGuardTest` | 4 | | `MetaProtectionNodeGuardTest` | 5 | `P1rMetaRealApiGateTest` 当前明确要求: - Meta 16 个 operation 都必须是 `dedicated`。 - MetaSchema 11 个 operation 必须是 `completed`。 - FunctionChain / ProtectionNode 5 个 operation 必须保持 `needs_verification`。 - Meta 仍不是 16/16 completed。 ### 保护面当前无 diff 本审阅版写入前已只读检查: ```bash git -c core.quotePath=false diff --name-only -- docs/api-contracts muse-cloud/scripts docs/superpowers/reports ``` 输出为空,说明 OpenAPI、scanner、coverage report 当前无 unstaged diff。 ## 推断 - ProtectionNode 的两个 operation 是治理读模型,完成证据主要来自真实持久化、版本头、权限、active 过滤、detail not-found、结构化字段和非 generic fallback。 - FunctionChain 的三个 operation 是治理读写混合,完成证据必须覆盖幂等、状态机、active partial unique、保护节点不可降级、validation / impact preview 同源校验、审计和命令回放。 - 这 5 个 operation 可以继续 operation-level approval;不需要把 `meta` 加入 domain-level completed 白名单。 - 如果执行版能证明 V10 真实 `_test`、FunctionChain active 唯一约束、ProtectionNode 结构化字段、XML 防空跑和 P1R mixed gates,剩余 5 个 operation 才具备进入用户批准点的条件。 ## 假设 - 用户希望继续 P1R 主线,并优先收口 Meta 剩余 operation,而不是切到 Account / Market / Content。 - 用户仍要求 completed 状态推进必须单独批准,不能由 dedicated gate、review PASS 或文档结论自动推进。 - 如果真实 `_test` 或 focused tests 发现 FunctionChain / ProtectionNode 证据不足,用户接受继续保持对应 operation `needs_verification`。 ## 主要缺口 ### 缺口 1:真实 Flyway `_test` 尚未证明 V10 FunctionChain / ProtectionNode 约束 现有 `P1rMetaMigrationSqlTest` 只做静态 SQL 文本检查。后续执行版必须新增真实 PostgreSQL `_test`,最低验证: - schema version 到达至少 V10。 - `muse_meta_function_chain_version`、`muse_meta_function_chain_slot`、`muse_meta_function_chain_node` 真实存在。 - `muse_meta_function_chain_version` 的 `(tenant_id, chain_id, version_no)` unique 生效。 - `uk_muse_meta_function_chain_version_active` partial unique 生效,同 tenant / chain 不能有两个 active 版本。 - `muse_meta_protection_node` 的结构化字段真实存在。 - FunctionChain / ProtectionNode 相关 `updated_at` trigger 可执行。 - 代表性非法 insert 被拒绝,例如重复 active function chain version、缺少必填字段、重复 chain version。 ### 缺口 2:FunctionChain 影响预览仍使用 Meta owner 自有影响摘要 `FunctionChainServiceImpl` 当前对外部 AI runtime / New-API / SSE 影响使用固定 0 和 `externalRuntime=pending` 摘要,没有接入真实外部 owner。 这不一定阻塞 completed,但执行版必须明确 completed 口径: - 如果 `previewFunctionChainImpact` 的完成定义是 Meta owner 自有链路影响预览,则必须证明 pending 摘要是设计边界,不是伪成功。 - 如果完成定义要求真实外部 runtime 影响,则 `previewFunctionChainImpact` 必须继续保持 `needs_verification`。 ### 缺口 3:FunctionChain activation 需要强证据证明保护边界不可绕过 已有 `FunctionChainGuard` 与 `MetaProtectionNodeGuard`,但 completed approval 需要当前代码的 XML 证据和 P1R gate 明确覆盖: - `published` 以外版本不能激活。 - expected active version 不匹配时拒绝。 - validation result 与 impact preview 不同源时拒绝。 - impact preview 包含 protection boundary violation 时拒绝。 - active 版本切换时旧 active 被关闭,新 active 唯一。 - commandId / requestHash 成功回放不重复写审计或状态。 ### 缺口 4:ProtectionNode 查询需要证明不是静态配置或 generic fallback 执行版必须要求测试证明: - list 从 `muse_meta_protection_node` 读取 active 节点。 - `chainKey` 过滤来自 `policySnapshot` 中的 `chainKey`。 - detail 返回结构化治理字段。 - missing node 返回 `META_PROTECTION_NODE_NOT_FOUND`。 - Controller 缺版本头或未知版本时不调用 Service。 - Controller 不注入 `MuseContractPersistenceService`。 ### 缺口 5:coverage gate 仍明确禁止剩余 5 个 operation completed `P1rMetaRealApiGateTest` 当前是正确的防误升门禁。执行版必须把 gate 修改分成两步: 1. 用户批准前:保持剩余 5 个 operation 为 `needs_verification`。 2. 用户批准后:只把这 5 个 operation 推进 `completed`,并断言 Account / Market / Content 仍保持 `dedicated / needs_verification`。 ### 缺口 6:需要 XML 防空跑证据 后续执行版必须列出 required test classes,并读取 Surefire XML 证明: ```text tests > 0 failures = 0 errors = 0 skipped = 0 ``` 最低应覆盖: - `ProtectionNodeServiceTest` - `FunctionChainServiceTest` - `AdminProtectionNodeControllerTest` - `AdminFunctionChainControllerTest` - `FunctionChainGuardTest` - `MetaProtectionNodeGuardTest` - `P1rMetaRealApiGateTest` - `P1rApiCoverageReportTest` - 新增或修订的 Meta Flyway `_test` ## 推荐审批粒度 推荐继续 operation-level approval: ```text APPROVED_COMPLETED_OPERATIONS += { "meta:listProtectionNodes", "meta:getProtectionNode", "meta:listFunctionChains", "meta:previewFunctionChainImpact", "meta:activateFunctionChainVersion" } ``` 不推荐本轮把 `meta` 加入 completed domain allowlist,原因: - MetaSchema 11 已经走 operation-level approval。 - 剩余 5 个 operation 的证据集中在 FunctionChain / ProtectionNode,不需要覆盖未来 Meta 新 operation。 - operation-level approval 能精确防止未来 Meta operation 误继承 completed。 ## 非目标 - 不修改 `docs/api-contracts/meta/openapi.yaml`。 - 不修改任何其它 OpenAPI 文件。 - 不修改 `muse-cloud/scripts/p1r-audit-api-coverage.py`。 - 不修改 `docs/superpowers/reports/p1r-api-coverage.json`。 - 不修改 `docs/superpowers/reports/p1r-api-coverage.md`。 - 不修改 Meta 业务实现代码。 - 不推进 Account / Market / Content completed。 - 不推进总 P1R completed。 - 不把 MetaSchema 11 个 operation 的 completed 证据扩写成剩余 5 个 operation 的证据。 ## 后续执行版必须包含 1. 剩余 5 个 operation 的完整清单与目标状态。 2. 用户批准前和批准后的允许修改文件清单。 3. scanner approval 模型:只允许新增 5 个 operation-level approval。 4. `P1rMetaRealApiGateTest` 从“剩余 5 个必须 needs_verification”改为“剩余 5 个批准后必须 completed”的策略。 5. `P1rApiCoverageReportTest` summary 从 `completed=112 / needsVerification=121` 到 `completed=117 / needsVerification=116` 的修改策略。 6. 真实 PostgreSQL Flyway `_test`:FunctionChain / ProtectionNode 相关表、索引、约束、trigger 和非法 insert 拒绝。 7. FunctionChain focused tests:list、preview、activate、replay、conflict、validation / impact preview 同源、protection boundary、audit。 8. ProtectionNode focused tests:list、detail、active filter、chainKey filter、missing node、结构化字段、版本头和权限。 9. P1R mixed gates:coverage report gate、Meta gate、Account / Market / Content 非目标 gate。 10. XML 防空跑:逐类读取 surefire XML 并断言 tests > 0。 11. protected diff gate:覆盖 7 个 OpenAPI、scanner 和 coverage report。 12. allowed-diff gate:覆盖 unstaged / staged / untracked,并使用 `core.quotePath=false`。 13. implementation review 复核项:新增 completed 只覆盖剩余 5 个 operation,Meta 最终 16/16 completed,Account / Market / Content 不变。 14. rollback 策略:撤回 scanner allowlist、coverage report、gate test 和新增 `_test`,恢复剩余 5 个 operation 为 `dedicated / needs_verification`。 ## 验收标准 本审阅版可以视为完成的条件: 1. 文件写入 `docs/agent-specs/2026-06-10-P1RMetaRemaining5CompletedApproval审阅版.md`。 2. `.agent` 记录 Meta 剩余 5 个 operation completed approval 审阅版状态。 3. `git diff --check` 通过。 4. OpenAPI、scanner、coverage report 无 diff。 5. 本审阅版通过 fresh spec/scope review 和 fresh quality/feasibility review。 ## 待确认项 1. 是否确认下一段优先处理 Meta 剩余 5 个 operation,而不是 Account / Market / Content。 2. 是否确认继续使用 operation-level approval,不把 `meta` 加入 domain-level completed allowlist。 3. 是否确认用户批准前不得修改 scanner、coverage report、coverage gate 或 Meta 业务代码。 4. 是否确认真实 Flyway `_test` 是剩余 5 个 operation completed approval 的硬门槛。