# P1R Meta Completed Approval 审阅版
日期:2026-06-10
## 结论
推荐把 Meta 作为剩余业务域 completed approval 的第一候选,但当前 Meta 仍不是 `completed`。
本审阅版只冻结 Meta completed approval 的范围、证据缺口、推荐审批粒度和后续执行版要求。不修改 OpenAPI,不修改 scanner,不修改 coverage report,不修改业务代码,不把 Meta 或其它 domain 推进 `completed`。
推荐审批策略:
```text
Meta domain-level approval candidate
```
前提是后续执行版能一次性证明 Meta 16 个 operation 的真实运行态、数据迁移、状态机、权限、审计、幂等和失败路径证据。如果任一 operation 无法满足 completed 证据,必须退回 operation-level approval,不能整域推进。
## 审批路径
```mermaid
flowchart TB
Start["当前 coverage
Meta 16 dedicated / needs_verification"] --> Review["本审阅版
冻结 Meta completed 证据标准"]
Review --> FreshReview["fresh spec/scope review
fresh quality/feasibility review"]
FreshReview --> ExecDoc["执行版
列出测试、迁移、scanner/report/gate 修改"]
ExecDoc --> ExecReview["执行版 fresh 双 review"]
ExecReview --> UserApproval{"用户明确批准
Meta completed 推进?"}
UserApproval -->|否| Stop["保持 needs_verification"]
UserApproval -->|是| Implement["只按执行版允许路径修改
scanner / gate / report / 必要测试"]
Implement --> Verify["focused tests + P1R gates
真实 Flyway _test + XML 防空跑
allowed/protected diff"]
Verify --> ImplReview["fresh implementation 双 review"]
ImplReview --> FinalApproval{"用户批准提交和 push?"}
FinalApproval -->|否| LocalOnly["保留本地 evidence"]
FinalApproval -->|是| Commit["提交并 push"]
```
## 已验证事实
### 工作区与远端
- 工作区:`/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0`。
- 分支:`dev/1.0.0`。
- 当前远端:`origin/dev/1.0.0`。
- 本轮已执行 `git pull --ff-only origin dev/1.0.0`,结果为 `Already up to date.`。
- 当前 HEAD:
```text
85c5422 test(p1r): 收口 P1R-7 completed approval 门禁
```
### 当前 coverage 状态
当前 `docs/superpowers/reports/p1r-api-coverage.json` summary:
```text
totalOperations 233
completedOperations 101
needsVerificationOperations 132
incompleteOperations 0
genericPersistenceOperations 0
ssePlaceholderOperations 0
missingOperations 0
blockedOperations 0
```
Meta 当前状态:
```text
meta_count 16
implementationStatus dedicated:16
completionStatus needs_verification:16
```
Meta 16 个 operation:
| operationId | method/path | 当前状态 |
| --- | --- | --- |
| `listMetaSchemas` | `GET /admin-api/muse/governance/meta-schemas` | `dedicated / needs_verification` |
| `getMetaSchema` | `GET /admin-api/muse/governance/meta-schemas/{schemaKey}` | `dedicated / needs_verification` |
| `getMetaSchemaVersion` | `GET /admin-api/muse/governance/meta-schemas/{schemaKey}/versions/{version}` | `dedicated / needs_verification` |
| `saveMetaSchemaDraft` | `POST /admin-api/muse/governance/meta-schemas/{schemaKey}/drafts` | `dedicated / needs_verification` |
| `validateMetaSchemaDraft` | `POST /admin-api/muse/governance/meta-schemas/{schemaKey}/drafts/{draftVersion}/validate` | `dedicated / needs_verification` |
| `previewMetaSchemaDraftImpact` | `POST /admin-api/muse/governance/meta-schemas/{schemaKey}/drafts/{draftVersion}/impact-preview` | `dedicated / needs_verification` |
| `publishMetaSchemaDraft` | `POST /admin-api/muse/governance/meta-schemas/{schemaKey}/drafts/{draftVersion}/publish` | `dedicated / needs_verification` |
| `activateMetaSchemaVersion` | `POST /admin-api/muse/governance/meta-schemas/{schemaKey}/versions/{version}/activate` | `dedicated / needs_verification` |
| `rollbackMetaSchemaVersion` | `POST /admin-api/muse/governance/meta-schemas/{schemaKey}/versions/{version}/rollback` | `dedicated / needs_verification` |
| `deprecateMetaSchemaVersion` | `POST /admin-api/muse/governance/meta-schemas/{schemaKey}/versions/{version}/deprecate` | `dedicated / needs_verification` |
| `setMetaSchemaGrayRules` | `POST /admin-api/muse/governance/meta-schemas/{schemaKey}/versions/{version}/gray-rules` | `dedicated / needs_verification` |
| `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` |
### 已有 dedicated 实现证据
Meta 已有 dedicated Controller:
- `AdminMetaSchemaController`
- `AdminProtectionNodeController`
- `AdminFunctionChainController`
这三个 Controller 均使用 `/muse/governance/...` 类级路由,方法级 `@GetMapping` / `@PostMapping` 覆盖 Meta 16 个 operation,并通过 `@PreAuthorize` 绑定管理端权限。
这三个 Controller 都调用 `MetaApiVersionGuard.requireVersion(...)` 校验 `X-API-Version`,缺少版本头时不回退到旧合同兜底结果。
Meta 已有 dedicated Service / Guard / DAL:
- `MetaSchemaServiceImpl`
- `MetaSchemaValidationServiceImpl`
- `MetaSchemaImpactPreviewServiceImpl`
- `ProtectionNodeServiceImpl`
- `FunctionChainServiceImpl`
- `MetaCommandServiceImpl`
- `MetaAuditServiceImpl`
- `MetaVersionStateGuard`
- `MetaProtectionNodeGuard`
- `FunctionChainGuard`
- Meta DO / Mapper / Convert 文件
Meta 旧合同兜底路由已有退役测试:
- `AdminMuseMetaContractControllerTest.should_notKeepGenericMetaContractControllerOnClasspath`
### 已有状态机、幂等、审计与失败边界证据
`MetaSchemaServiceImpl` 已覆盖:
- save draft
- publish
- activate
- rollback
- deprecate
- gray rules
- command reservation
- command replay
- governance audit
`MetaCommandServiceImpl` 已覆盖:
- `reserveCommand(...)`
- `recordSucceeded(...)`
- request hash
- operation / actor / target envelope 校验
- 未完成 command 冲突
- succeeded command replay
`MetaAuditServiceImpl` 已把治理审计写入 `muse_meta_governance_audit`,并有测试证明审计不是复用 command `resultSnapshot` 冒充。
`MetaSchemaImpactPreviewServiceImpl` 依赖 `MetaImpactFacade`;默认 `UnavailableMetaImpactFacade` 在没有真实外部 owner bean 时抛出 `META_EXTERNAL_OWNER_UNAVAILABLE`,不是空成功。
### 已有 SQL 与测试证据
Meta 已有 migration:
- `muse-cloud/sql/muse/V10__extend_meta_real_api_schema.sql`
V10 追加:
- `muse_meta_command`
- `muse_meta_governance_audit`
- `muse_meta_validation_result`
- `muse_meta_impact_preview`
- `muse_meta_gray_rule`
- `muse_meta_function_chain_version`
- `muse_meta_function_chain_slot`
- `muse_meta_function_chain_node`
- `uk_muse_meta_schema_version_active_schema_id`
- `muse_meta_protection_node` 结构化字段
Meta 已有静态 SQL gate:
- `P1rMetaMigrationSqlTest`,3 个 `@Test`。
Meta 已有 coverage gate:
- `P1rMetaRealApiGateTest`,4 个 `@Test`。
该 gate 当前明确禁止 Meta operation 标记为 completed,并要求 Meta 保持 `dedicated / needs_verification`。
Meta 模块现有测试清单包含 16 个测试类,按源码 `@Test` 统计共 165 个测试方法;P1R Meta gate 额外包含 7 个测试方法。
## 推断
- Meta 是剩余四个业务域中最适合先走 completed approval 的候选,因为 operation 数量最少,主要围绕 Meta owner 自有治理事实,外部依赖比 Account / Market / Content 少。
- Meta 可以作为 domain-level approval 候选,但只有在后续执行版补齐真实 `_test`、XML 防空跑、审批后 coverage gate 和运行态失败路径证据后才成立。
- 当前 `P1rMetaRealApiGateTest` 的旧口径会阻止 Meta completed;后续用户批准前不能修改该 gate,用户批准后必须把它改成“只允许 Meta 16 个 operation completed,且不连带其它 domain”的审批后门禁。
## 假设
- 用户确认先从 Meta 推进剩余业务域 completed approval。
- 后续执行版允许在 fresh 双 review 与用户明确批准之后,修改 scanner、coverage report、`P1rMetaRealApiGateTest`、`P1rApiCoverageReportTest` 和必要的 Meta completed approval gate 测试。
- 如果真实 `_test` 或外部 owner fail-closed 证据证明某个 Meta operation 不满足 completed,用户接受把 Meta 从 domain-level approval 降级为 operation-level approval。
## 主要缺口
### 缺口 1:真实 Flyway `_test` 尚未覆盖 V10
当前只有 `P1rMetaMigrationSqlTest` 静态读取 V10 SQL。它证明 SQL 文本包含关键表、索引和字段,但不证明真实 PostgreSQL 可以执行,也不证明约束、partial unique index、trigger 和非法写入拒绝实际生效。
后续执行版必须新增真实 PostgreSQL `_test`,最低验证:
- schema version 到达 V10 或当前全量迁移目标中包含 V10。
- V10 追加表真实存在。
- `muse_meta_command` 的 `(tenant_id, command_id)` unique 生效。
- `muse_meta_schema_version` 的 active partial unique index 使用 `(tenant_id, schema_id)` 且同 schema 不能有两个 active 版本。
- `muse_meta_function_chain_version` 的 active partial unique index 生效。
- `muse_meta_protection_node` 结构化字段真实存在。
- V10 表的 `updated_at` trigger 可执行。
- 代表性非法 insert 被拒绝,例如重复 commandId、重复 active schema version、重复 active function chain version、必填字段为空。
### 缺口 2:当前 P1R gate 仍明确禁止 Meta completed
`P1rMetaRealApiGateTest.should_not_mark_meta_operations_as_completed` 和 `should_keep_current_meta_operations_dedicated_and_needs_verification` 当前是正确的防误升门禁。
后续执行版必须把 gate 修改分成两步:
1. 用户批准前:保持该 gate 不变,证明 Meta 仍未 completed。
2. 用户批准后:改为 completed approval gate,精确断言 Meta 16 个 operation 为 `dedicated / completed`,并断言 Account / Market / Content 仍为 `dedicated / needs_verification`。
### 缺口 3:外部 owner impact preview 需要明确 completed 口径
`MetaSchemaImpactPreviewServiceImpl` 调用 `MetaImpactFacade`。默认 `UnavailableMetaImpactFacade` 抛出 `META_EXTERNAL_OWNER_UNAVAILABLE`。
这说明当前系统没有伪造外部 owner 成功,但也意味着 completed approval 必须选择清楚:
- 如果 `previewMetaSchemaDraftImpact` 要算 completed,必须证明有真实 `MetaImpactFacade` 或明确接受 fail-closed 是该 operation 的完成口径。
- 如果真实外部 owner 不可用且该 operation 需要成功预览外部影响,必须保持该 operation `needs_verification`,不能把 bare mock 或空 summary 当 completed。
### 缺口 4:需要把 165 个 Meta 测试变成可审计 XML 证据
历史留痕记录 Meta 模块全量测试曾通过 165 个测试,但 completed approval 执行必须重新运行当前代码,并读取 Surefire XML 逐类证明:
```text
tests > 0
failures = 0
errors = 0
skipped = 0
```
后续执行版必须列出 required test classes 和最低测试数,不能只写 Maven exit 0。
### 缺口 5:scanner/report 修改必须是审批后动作
Meta completed approval 需要修改 scanner 的 completed allowlist 或 approval 模型,并重生成 coverage report。
这些动作只能在执行版 fresh 双 review 且用户明确批准后执行。用户批准前 protected diff 必须证明以下文件没有 staged/unstaged diff:
- `muse-cloud/scripts/p1r-audit-api-coverage.py`
- `docs/superpowers/reports/p1r-api-coverage.json`
- `docs/superpowers/reports/p1r-api-coverage.md`
## 推荐审批粒度
推荐先按 domain-level approval 设计 Meta 执行版:
```text
approved_completed_domains += {"meta"}
```
但执行版必须提供降级机制:
- 如果全部 16 个 operation 证据闭合,允许 domain-level approval。
- 如果 `previewMetaSchemaDraftImpact` 或其它高风险 operation 因外部 owner 不满足 completed 标准,必须降级为 operation-level approval。
- 降级时 scanner/report/gate 只能推进证据满足的 operation,不得把 Meta 整域加入 completed domain allowlist。
## 非目标
- 不修改 `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。
- 不把 P1R-7 Events completed approval 或 source owner propagation evidence 当作 Meta completed 证据。
## 后续执行版必须包含
1. Meta 16 operation 的完整清单与目标状态。
2. 允许修改文件清单;至少区分用户批准前和批准后。
3. scanner approval 模型:domain-level Meta 或 operation-level fallback,二选一并写明触发条件。
4. `P1rMetaRealApiGateTest` 从禁止 completed 到审批后 completed gate 的修改策略。
5. `P1rApiCoverageReportTest` summary 期望从 `completed=101 / needsVerification=132` 到目标值的修改策略。
6. 真实 PostgreSQL Flyway `_test`:目标 schema version、V10 表、索引、约束、trigger、非法 insert 拒绝。
7. Meta focused tests:16 个测试类逐类 XML 计数下限。
8. P1R mixed gates:包含 Meta gate、coverage report gate,以及用于证明非目标 domain 不被推进的 Account / Market / Content gate。
9. `/tmp/p1r-meta-completed-approval-scan.*` 隔离 scanner 预验证。
10. 真实 worktree scanner/report 重生成只允许在执行版双 PASS 和用户批准后执行。
11. protected diff gate,必须覆盖 7 个 OpenAPI、scanner 和 coverage report。
12. allowed-diff gate,必须覆盖 unstaged / staged / untracked,并使用 `core.quotePath=false`。
13. implementation review 复核项:新增 completed 只覆盖用户批准范围;非目标 domain 状态不变;XML 防空跑和 `_test` 证据完整。
14. rollback 策略:撤回 scanner allowlist、coverage report、gate test 和新增 `_test`,恢复 Meta 为 `dedicated / needs_verification`。
## 验收标准
本审阅版可以视为完成的条件:
1. 文件写入 `docs/agent-specs/2026-06-10-P1RMetaCompletedApproval审阅版.md`。
2. `.agent` 记录 Meta completed approval 审阅版状态。
3. `git diff --check` 通过。
4. OpenAPI、scanner、coverage report 无 diff。
5. 本审阅版通过 fresh spec/scope review 和 fresh quality/feasibility review。
## 待确认项
1. 是否确认 Meta 作为剩余业务域 completed approval 第一候选。
2. 是否确认先按 Meta domain-level approval 设计执行版,并保留 operation-level fallback。
3. 是否确认用户批准前不得修改 scanner、coverage report、coverage gate 或 Meta 业务代码。
4. 是否确认真实 Flyway `_test` 是 Meta completed approval 的硬门槛。