19 KiB
P1R Meta Remaining 5 Completed Approval 执行版
日期:2026-06-10
结论
本执行版只为 Meta 剩余 5 个 operation 的 completed approval 提供可执行门禁方案。当前阶段只允许进入 fresh execution review,不允许实现,不允许修改 scanner / coverage report / OpenAPI / 业务代码,不允许推进任何 operation 到 completed。
审批对象只包含:
meta:listProtectionNodes
meta:getProtectionNode
meta:listFunctionChains
meta:previewFunctionChainImpact
meta:activateFunctionChainVersion
推荐继续使用 operation-level approval:
APPROVED_COMPLETED_OPERATIONS += remaining 5 Meta operations
APPROVED_COMPLETED_DOMAINS 不加入 meta
目标状态只允许从:
total=233 completed=112 needsVerification=121 incomplete=0 genericPersistence=0 ssePlaceholder=0
推进到:
total=233 completed=117 needsVerification=116 incomplete=0 genericPersistence=0 ssePlaceholder=0
Account 33、Market 32、Content 51 必须继续保持 dedicated / needs_verification。本执行版通过 review 不等于用户批准推进 completed。
前置事实
工作区
- 正确 worktree:
/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0。 - 当前分支:
dev/1.0.0。 - 当前 HEAD:
16e9f4e test(p1r): 收口 Meta completed approval 门禁。 - 当前 branch tracking 与
origin/dev/1.0.0对齐;这不等于 working tree clean,因为当前已有本阶段文档改动。
已通过 review
审阅版:
docs/agent-specs/2026-06-10-P1RMetaRemaining5CompletedApproval审阅版.md
fresh review 结果:
- Hegel scope review:PASS,无阻塞项。
- Feynman feasibility review:PASS,无阻塞项。
已采纳非阻塞建议:
- 本执行版避免把 branch up-to-date 与 working tree clean 混用。
- 本执行版把批准前禁止修改与批准后 allowed diff 分阶段写清。
当前 coverage
totalOperations 233
completedOperations 112
needsVerificationOperations 121
incompleteOperations 0
genericPersistenceOperations 0
ssePlaceholderOperations 0
Meta 当前状态:
meta dedicated/completed:11
meta dedicated/needs_verification:5
仍未 completed 的 5 个 operation:
| operation key | method/path |
|---|---|
meta:listProtectionNodes |
GET /admin-api/muse/governance/protection-nodes |
meta:getProtectionNode |
GET /admin-api/muse/governance/protection-nodes/{nodeKey} |
meta:listFunctionChains |
GET /admin-api/muse/governance/function-chains |
meta:previewFunctionChainImpact |
POST /admin-api/muse/governance/function-chains/{chainKey}/impact-preview |
meta:activateFunctionChainVersion |
POST /admin-api/muse/governance/function-chains/{chainKey}/versions/{version}/activate |
范围
目标
- 用真实门禁证明剩余 5 个 Meta operation 可进入用户批准点。
- 在用户批准后,只把这 5 个 operation 加入 operation-level completed approval。
- 保持 MetaSchema 11 个 completed 不变。
- 保持 Account / Market / Content 仍为
dedicated / needs_verification。 - 保持总 P1R 不进入 completed。
非目标
- 不修改任何 OpenAPI。
- 不把
meta加入APPROVED_COMPLETED_DOMAINS。 - 不推进 Account / Market / Content。
- 不推进总 P1R。
- 不用 MetaSchema 11 个 operation 的 evidence 替代剩余 5 个 operation 的 evidence。
- 不把
previewFunctionChainImpact的externalRuntime=pending误写成真实外部 runtime completed。
阶段化允许改动
当前阶段:执行版 review 前
只允许:
docs/agent-specs/2026-06-10-P1RMetaRemaining5CompletedApproval审阅版.md
docs/agent-specs/2026-06-10-P1RMetaRemaining5CompletedApproval执行版.md
docs/agent-specs/.agent
不得修改:
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/*.java
muse-cloud/muse-module-meta/**
docs/api-contracts/**
执行版双 PASS 且用户明确批准后
允许最小修改:
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/P1rMetaRealApiGateTest.java
muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rMetaFlywayMigrationIT.java
docs/memorys/2026-06-10-P1RMetaRemaining5状态推进.md
docs/agent-specs/.agent
docs/agent-specs/2026-06-10-P1RMetaRemaining5CompletedApproval执行版.md
当前 legacy P1R mixed gate 中,以下 4 个文件硬编码了 completedOperations=112 或 Meta 11 completed / 5 needs_verification。如果用户只批准剩余 5 个 operation completed,但不批准同步这些 legacy gate 口径,implementation 必须停止,不能修改 scanner/report,也不能跳过 mixed gate。
只有在用户明确批准“同步 legacy P1R mixed gate 口径”后,才允许最小修改以下 4 个测试文件,修改范围仅限把 summary 和 Meta 状态断言同步到 completedOperations=117、needsVerificationOperations=116、Meta 16 completed / 0 needs_verification,并继续断言 Account / Market / Content 不被连带推进:
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
以下非目标 domain gate 文件只允许运行和读取 XML,不预置为本轮可修改范围:
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/P1rAccountRealApiGateTest.java
如果 implementation 发现还必须修改 P1rContentRealApiGateTest、P1rAccountRealApiGateTest 或其它任何非目标文件,必须先停下并说明原因,得到用户明确批准后才能扩大 allowed diff。
Protected Diff Gate
任何阶段都必须保护 7 个 OpenAPI:
git -c core.quotePath=false diff --name-only -- \
docs/api-contracts/account/openapi.yaml \
docs/api-contracts/ai/openapi.yaml \
docs/api-contracts/content/openapi.yaml \
docs/api-contracts/events/openapi.yaml \
docs/api-contracts/knowledge/openapi.yaml \
docs/api-contracts/market/openapi.yaml \
docs/api-contracts/meta/openapi.yaml
git -c core.quotePath=false diff --cached --name-only -- \
docs/api-contracts/account/openapi.yaml \
docs/api-contracts/ai/openapi.yaml \
docs/api-contracts/content/openapi.yaml \
docs/api-contracts/events/openapi.yaml \
docs/api-contracts/knowledge/openapi.yaml \
docs/api-contracts/market/openapi.yaml \
docs/api-contracts/meta/openapi.yaml
输出必须为空。
执行版双 PASS 且用户批准前,还必须保护 scanner/report:
git -c core.quotePath=false diff --name-only -- \
muse-cloud/scripts/p1r-audit-api-coverage.py \
docs/superpowers/reports/p1r-api-coverage.json \
docs/superpowers/reports/p1r-api-coverage.md
git -c core.quotePath=false diff --cached --name-only -- \
muse-cloud/scripts/p1r-audit-api-coverage.py \
docs/superpowers/reports/p1r-api-coverage.json \
docs/superpowers/reports/p1r-api-coverage.md
输出必须为空。
Allowed Diff Gate
最终 allowed diff 必须覆盖 unstaged / staged / untracked,并使用 core.quotePath=false,避免中文路径被转义导致误判。
批准前 allowed set:
allowed='^(docs/agent-specs/\\.agent|docs/agent-specs/2026-06-10-P1RMetaRemaining5CompletedApproval审阅版\\.md|docs/agent-specs/2026-06-10-P1RMetaRemaining5CompletedApproval执行版\\.md)$'
{
git -c core.quotePath=false diff --name-only
git -c core.quotePath=false diff --cached --name-only
git -c core.quotePath=false ls-files --others --exclude-standard
} | sed '/^$/d' | sort -u | while IFS= read -r path; do
if ! printf '%s\n' "$path" | grep -Eq "$allowed"; then
echo "unexpected_diff=$path"
exit 1
fi
done
echo "allowed_diff_gate=PASS"
用户批准后 allowed set 必须扩展到“阶段化允许改动”中的批准后文件;若用户同时明确批准 legacy P1R mixed gate 口径同步,allowed set 才能包含 P1rEventsRealApiGateTest、P1rAiRealApiGateTest、P1rKnowledgeRealApiGateTest、P1rMarketRealApiGateTest。任何额外路径都必须停止。
Scanner 修改策略
只允许在用户批准后修改:
muse-cloud/scripts/p1r-audit-api-coverage.py
允许新增:
"meta:listProtectionNodes",
"meta:getProtectionNode",
"meta:listFunctionChains",
"meta:previewFunctionChainImpact",
"meta:activateFunctionChainVersion",
禁止:
APPROVED_COMPLETED_DOMAINS = {"ai", "knowledge", "meta"}
completed 仍必须满足:
implementationStatus == "dedicated"。- operation key 在 approved domain 或 approved operation allowlist 内。
- 非真实实现状态不能 completed。
TDD 与状态推进顺序
RED
先修改 gate 预期,不改 scanner/report,确认失败:
目标失败应来自旧 report 仍是:
completed=112
needsVerification=121
remaining Meta 5 = needs_verification
命令:
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,P1rMetaRealApiGateTest \
-Dsurefire.failIfNoSpecifiedTests=false
预期:
BUILD FAILURE
失败断言应指向 summary 117/116 或剩余 5 个 operation expected completed。
GREEN
用户批准后,修改 scanner allowlist 并重建 report:
python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check
预期 summary:
233 117 116 0 0 0
Meta 预期:
meta dedicated/completed:16
非目标 domain 预期:
account dedicated/needs_verification:33
content dedicated/needs_verification:51
market dedicated/needs_verification:32
真实 Flyway _test
新增测试文件:
muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rMetaFlywayMigrationIT.java
目标:
- clean 隔离 PostgreSQL
_test数据库。 - 使用
filesystem:sql/muse。 - target 至少 V10。
- 执行 V1-V10 SQL migrations。
- 证明 FunctionChain / ProtectionNode schema 在真实 PostgreSQL 可用。
安全要求:
- 只允许 JDBC database name 以
_test结尾。 - JDBC URL query 不允许携带 password/token/secret/api_key。
- 密码只能从
P1R_FLYWAY_PASSWORD或MUSE_POSTGRES_PASSWORD环境变量读取。 - Surefire XML 中必须脱敏 URL / user。
最低断言:
target_schema_version=10
successful_migration_count >= 10
muse_meta_function_chain_version exists
muse_meta_function_chain_slot exists
muse_meta_function_chain_node exists
muse_meta_protection_node exists
uk_muse_meta_function_chain_version exists
uk_muse_meta_function_chain_version_active exists
trg_muse_meta_function_chain_version_updated_at exists
trg_muse_meta_function_chain_slot_updated_at exists
trg_muse_meta_function_chain_node_updated_at exists
ProtectionNode 结构化字段存在
重复 function chain version 被拒绝
重复 active function chain version 被拒绝
缺少必填字段被拒绝
updated_at trigger 可执行
运行命令:
cd muse-cloud
export P1R_FLYWAY_PASSWORD="$MUSE_POSTGRES_PASSWORD"
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \
mvn -o test -pl muse-server -am \
-Dtest=P1rMetaFlywayMigrationIT \
-Dp1r.flyway.url="$MUSE_POSTGRES_URL_FOR_META_REMAINING_5_TEST" \
-Dp1r.flyway.user="$MUSE_POSTGRES_USER" \
-Dp1r.flyway.locations=filesystem:sql/muse \
-Dflyway.postgresql.transactional.lock=false \
-Dsurefire.failIfNoSpecifiedTests=false
如果本地没有 _test 连接配置,不能伪造通过;必须记录 blocker。
Focused Tests
批准后至少运行:
cd muse-cloud
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \
mvn -o test -pl muse-module-meta/muse-module-meta-server,muse-server -am \
-Dtest=ProtectionNodeServiceTest,FunctionChainServiceTest,AdminProtectionNodeControllerTest,AdminFunctionChainControllerTest,FunctionChainGuardTest,MetaProtectionNodeGuardTest,P1rMetaMigrationSqlTest,P1rMetaFlywayMigrationIT \
-Dsurefire.failIfNoSpecifiedTests=false
最低 XML 类清单:
ProtectionNodeServiceTest tests>=3
FunctionChainServiceTest tests>=12
AdminProtectionNodeControllerTest tests>=7
AdminFunctionChainControllerTest tests>=7
FunctionChainGuardTest tests>=4
MetaProtectionNodeGuardTest tests>=5
P1rMetaMigrationSqlTest tests>=3
P1rMetaFlywayMigrationIT tests>=1
每个 XML 必须:
failures=0
errors=0
skipped=0
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,P1rMetaRealApiGateTest,P1rEventsRealApiGateTest,P1rAiRealApiGateTest,P1rKnowledgeRealApiGateTest,P1rMarketRealApiGateTest,P1rContentRealApiGateTest,P1rAccountRealApiGateTest \
-Dsurefire.failIfNoSpecifiedTests=false
最低断言:
P1rApiCoverageReportTest断言 completed summary 为 117。P1rMetaRealApiGateTest断言 Meta 16 个 operation 全部dedicated / completed。P1rEventsRealApiGateTest、P1rAiRealApiGateTest、P1rKnowledgeRealApiGateTest、P1rMarketRealApiGateTest若获用户批准同步口径,只能同步 summary 和 Meta 16/0 断言,并继续证明非目标 domain 不被推进。- Account / Market / Content gate 继续断言各自
dedicated / needs_verification。 - AI / Knowledge / Events 既有 completed 状态不被破坏。
previewFunctionChainImpact 口径
当前 FunctionChainServiceImpl 对外部 runtime 影响使用:
affectedAIRuntimeTasks=0
externalRuntime=pending
执行时必须证明这是 Meta owner 自有 FunctionChain 影响预览的明确边界,而不是伪造外部 runtime 成功。
最低要求:
- 测试证明 preview 持久化
externalErrorSummary或等价摘要包含 pending 边界。 - 测试证明 preview 只声明 Meta owner 可计算的 slot / protection node changes。
- 文档或 memory 明确说明本轮不证明 AI runtime / New-API / SSE 外部影响闭环。
如果 review 或实现发现 previewFunctionChainImpact 的 completed 标准必须包含真实外部 runtime 影响,则该 operation 必须保持 needs_verification,本轮只能推进其余 operation。
XML 防空跑
必须读取 surefire XML,不接受 Maven exit 0 单独作为通过证据。
建议命令:
python3 - <<'PY'
from pathlib import Path
from xml.etree import ElementTree as ET
required = {
"ProtectionNodeServiceTest": 3,
"FunctionChainServiceTest": 12,
"AdminProtectionNodeControllerTest": 7,
"AdminFunctionChainControllerTest": 7,
"FunctionChainGuardTest": 4,
"MetaProtectionNodeGuardTest": 5,
"P1rMetaMigrationSqlTest": 3,
"P1rMetaFlywayMigrationIT": 1,
"P1rApiCoverageReportTest": 1,
"P1rMetaRealApiGateTest": 1,
"P1rEventsRealApiGateTest": 1,
"P1rAiRealApiGateTest": 1,
"P1rKnowledgeRealApiGateTest": 1,
"P1rMarketRealApiGateTest": 1,
"P1rContentRealApiGateTest": 1,
"P1rAccountRealApiGateTest": 1,
}
roots = [
Path("muse-cloud/muse-module-meta/muse-module-meta-server/target/surefire-reports"),
Path("muse-cloud/muse-server/target/surefire-reports"),
]
for class_name, minimum in required.items():
matches = []
for root in roots:
matches.extend(root.glob(f"TEST-*{class_name}.xml"))
if not matches:
raise SystemExit(f"missing_xml={class_name}")
element = ET.parse(matches[0]).getroot()
tests = int(element.attrib.get("tests", "0"))
failures = int(element.attrib.get("failures", "0"))
errors = int(element.attrib.get("errors", "0"))
skipped = int(element.attrib.get("skipped", "0"))
if tests < minimum or failures or errors or skipped:
raise SystemExit(
f"bad_xml={class_name} tests={tests} failures={failures} errors={errors} skipped={skipped}"
)
print(f"{class_name}\t{tests}\tPASS")
PY
Coverage 验证
批准后 scanner 必须真实重建 report:
python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check
jq -r '.summary | [.totalOperations,.completedOperations,.needsVerificationOperations,.incompleteOperations,.genericPersistenceOperations,.ssePlaceholderOperations] | @tsv' docs/superpowers/reports/p1r-api-coverage.json
jq -r '.operations[] | select(.domain=="meta") | [.operationId,.implementationStatus,.completionStatus] | @tsv' docs/superpowers/reports/p1r-api-coverage.json
预期:
233 117 116 0 0 0
Meta 16 行均为:
dedicated completed
Account / Market / Content 聚合必须保持:
account dedicated/needs_verification:33
market dedicated/needs_verification:32
content dedicated/needs_verification:51
Memory 留痕
批准后实现完成且验证通过,新增:
docs/memorys/2026-06-10-P1RMetaRemaining5状态推进.md
必须记录:
- 推进前 summary:
233/112/121/0/0/0。 - 推进后 summary:
233/117/116/0/0/0。 - 新增 completed 仅限剩余 5 个 Meta operation。
- 没有修改 OpenAPI。
- 没有把
meta加入 domain-level completed allowlist。 - Account / Market / Content 未推进。
- 真实 Flyway
_test、focused tests、P1R mixed gates、XML 防空跑、protected diff、allowed-diff 证据。
Rollback
如果实现后发现证据不足或 review FAIL:
- 从
APPROVED_COMPLETED_OPERATIONS移除剩余 5 个 operation。 - 重跑
python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check,恢复 summary 到233/112/121/0/0/0。 - 恢复
P1rApiCoverageReportTest与P1rMetaRealApiGateTest对剩余 5 个 operationneeds_verification的断言。 - 删除或保留但禁用新增
P1rMetaFlywayMigrationIT需由用户决定;不能让失败_test留在 required gate 中。 - memory 记录 rollback 原因。
- 不提交失败状态。
完成条件
执行版当前阶段完成条件:
- 本文件写入。
.agent追加执行版状态。git diff --check通过。- OpenAPI / scanner / coverage report 无 diff。
- fresh execution spec/scope review PASS。
- fresh execution quality/feasibility review PASS。
双 PASS 后仍需用户明确批准以下事项,才允许实现:
- 只审批剩余 5 个 Meta operation。
- 继续 operation-level approval,不把
meta加入 domain-level allowlist。 - 允许按本执行版修改 scanner、coverage report、P1R gate tests、新增 Flyway
_test和 memory。 - 允许同步 4 个 legacy P1R mixed gate 文件的 summary / Meta 状态断言:
P1rEventsRealApiGateTest、P1rAiRealApiGateTest、P1rKnowledgeRealApiGateTest、P1rMarketRealApiGateTest。未批准该项时不得启动实现。