oh-my-muse/docs/agent-specs/2026-06-10-P1RMetaRemaining5CompletedApproval执行版.md

19 KiB
Raw Blame History

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
  • 当前 HEAD16e9f4e 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 reviewPASS无阻塞项。
  • Feynman feasibility reviewPASS无阻塞项。

已采纳非阻塞建议:

  • 本执行版避免把 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

范围

目标

  1. 用真实门禁证明剩余 5 个 Meta operation 可进入用户批准点。
  2. 在用户批准后,只把这 5 个 operation 加入 operation-level completed approval。
  3. 保持 MetaSchema 11 个 completed 不变。
  4. 保持 Account / Market / Content 仍为 dedicated / needs_verification
  5. 保持总 P1R 不进入 completed。

非目标

  • 不修改任何 OpenAPI。
  • 不把 meta 加入 APPROVED_COMPLETED_DOMAINS
  • 不推进 Account / Market / Content。
  • 不推进总 P1R。
  • 不用 MetaSchema 11 个 operation 的 evidence 替代剩余 5 个 operation 的 evidence。
  • 不把 previewFunctionChainImpactexternalRuntime=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=117needsVerificationOperations=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 发现还必须修改 P1rContentRealApiGateTestP1rAccountRealApiGateTest 或其它任何非目标文件,必须先停下并说明原因,得到用户明确批准后才能扩大 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 才能包含 P1rEventsRealApiGateTestP1rAiRealApiGateTestP1rKnowledgeRealApiGateTestP1rMarketRealApiGateTest。任何额外路径都必须停止。

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_PASSWORDMUSE_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
  • P1rEventsRealApiGateTestP1rAiRealApiGateTestP1rKnowledgeRealApiGateTestP1rMarketRealApiGateTest 若获用户批准同步口径,只能同步 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

必须记录:

  • 推进前 summary233/112/121/0/0/0
  • 推进后 summary233/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

  1. APPROVED_COMPLETED_OPERATIONS 移除剩余 5 个 operation。
  2. 重跑 python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check,恢复 summary 到 233/112/121/0/0/0
  3. 恢复 P1rApiCoverageReportTestP1rMetaRealApiGateTest 对剩余 5 个 operation needs_verification 的断言。
  4. 删除或保留但禁用新增 P1rMetaFlywayMigrationIT 需由用户决定;不能让失败 _test 留在 required gate 中。
  5. memory 记录 rollback 原因。
  6. 不提交失败状态。

完成条件

执行版当前阶段完成条件:

  1. 本文件写入。
  2. .agent 追加执行版状态。
  3. git diff --check 通过。
  4. OpenAPI / scanner / coverage report 无 diff。
  5. fresh execution spec/scope review PASS。
  6. fresh execution quality/feasibility review PASS。

双 PASS 后仍需用户明确批准以下事项,才允许实现:

  1. 只审批剩余 5 个 Meta operation。
  2. 继续 operation-level approval不把 meta 加入 domain-level allowlist。
  3. 允许按本执行版修改 scanner、coverage report、P1R gate tests、新增 Flyway _test 和 memory。
  4. 允许同步 4 个 legacy P1R mixed gate 文件的 summary / Meta 状态断言:P1rEventsRealApiGateTestP1rAiRealApiGateTestP1rKnowledgeRealApiGateTestP1rMarketRealApiGateTest。未批准该项时不得启动实现。