# P1R4 AI 真实 API 规格计划 日期:2026-05-30 ## 背景 本次进入 P1R-4 AI Real API spec + implementation plan + review gate 阶段,只完成 AI 域真实 API 的事实盘点、规格、执行计划和阶段留痕,不进入代码实现。 P1R-4 的核心不是继续增强 `MuseContractPersistenceService`,也不是把 `streamAiTask` 的占位 SSE 事件包装成真实结果,而是设计如何把 AI 41 个 operation 推进到 `dedicated / needs_verification`。 ## 执行位置 ```text /Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0 ``` 分支: ```text dev/1.0.0 ``` 开始时已执行: ```bash git status --short --branch git pull --ff-only origin dev/1.0.0 ``` 结果: ```text ## dev/1.0.0...origin/dev/1.0.0 Already up to date. HEAD 7f5553d ``` ## 已验证事实 P1R 覆盖矩阵中 AI 域当前状态: ```text generic_persistence / incomplete 40 sse_placeholder / incomplete 1 ``` 同时保持: - completed operations = 0 - Content 51 个 operation 为 `dedicated / needs_verification` - Meta 16 个 operation 为 `dedicated / needs_verification` - Account 33 个 operation 为 `dedicated / needs_verification` 当前代码事实: - AI 合同入口仍是 `AdminMuseAiContractController` 和 `AppMuseAiContractController`。 - 40 个非 SSE operation 仍通过 `MuseContractPersistenceService` 通用持久化处理 AI 路由,不是 P1R 完成证据。 - `streamAiTask` 当前只发送一次固定摘要 `muse ai task stream ready` 的 `done` 事件后立即完成,被 scanner 识别为 `sse_placeholder / incomplete`。 - `muse-module-ai-server` 已有 Yudao AI 基础服务、Spring AI model factory 和 provider tests,但没有持有 AI OpenAPI 41 个 operation 的 Muse dedicated controller / DTO / 状态机 / P1R 门禁。 当前 DDL 事实: - V4 已有 `muse_ai_generation`、`muse_ai_suggestion`、`muse_agent`、`muse_agent_version`、`muse_agent_slot_binding`、`muse_prompt`、`muse_prompt_version`、`muse_quality_policy`、`muse_quality_policy_version`、`muse_tool_grant`。 - V7 已有 `muse_domain_operation_record`。 - V8 已有 `muse_domain_workflow_task`。 - 这些表不能直接证明 AI task runtime、New-API correlation、SSE event replay、job state、source status、API access log 和 business audit 的真实闭环。 P1R-3 数据库验收事实: ```text flyway_success=true migrations_executed=11 target_schema_version=11 flyway_latest=11:extend account real api schema v11_tables=12 ``` 因此 P1R-4 如新增或修改 DDL,阶段收口前必须继续在同一 PostgreSQL 实例 `_test` 数据库跑真实 Flyway。 ## 本阶段产物 - 规格:`docs/superpowers/specs/2026-05-30-P1R-4-ai-real-api-design.md` - 计划:`docs/superpowers/plans/2026-05-30-P1R-4-ai-real-api.md` - 留痕:`docs/memorys/2026-05-30-P1R4AI真实API规格计划.md` ## Review 结果 本阶段按要求使用 fresh subagent 做了两轮文档 review,review 子代理均使用 `gpt-5.5` + `xhigh`。 Spec compliance review 最终结果: ```text PASS ``` Quality / feasibility review 最终结果: ```text PASS ``` 已按首轮 quality review 的阻塞意见补齐: - `muse-server` 当前只依赖 `muse-module-ai-contract-server` 的运行时装配风险,计划已要求实现阶段显式引入 `muse-module-ai-server` 或证明短期双依赖下合同兜底精确避让。 - P1R-4 新增或修改 DDL 时的真实 PostgreSQL / Flyway `_test` 验收步骤,计划已补可复制命令、隔离 test DB、`filesystem:sql/muse` locations、V12 成功断言和失败处理。 - New-API runtime 最小契约,计划已补 `RuntimeCommand`、`RuntimeResult`、`RuntimeFailure`、timeout 默认值、retry budget/backoff、错误分类、事务边界、correlation、失败状态映射和脱敏要求。 quality review 仍给出两条非阻塞建议: - 实现阶段建议在 Task 2 产出 V12 后立即提前跑一次真实 Flyway `_test`,最终 Task 11 再复核。 - Task 10 / Task 11 的 Maven gate 建议显式确认目标测试类和非零测试数,避免 `-Dsurefire.failIfNoSpecifiedTests=false` 被误用。 ## 关键设计结论 - P1R-4 目标状态只能是 `dedicated / needs_verification`,不能写成 `completed`。 - AI owner 采用 `muse-module-ai`,新增 Muse 合同专用 Controller / Application Service / DTO / DAL / DDL,不复用通用持久化完成口径。 - 推荐新增 `V12__extend_ai_real_api_schema.sql`,扩展 V4 AI 表并补齐 AI command、runtime call、task event、job、source event、source status projection、evaluation run、API access log projection 和 business audit event。 - `createAiTask` 只接受任务意图和可验证引用;source snapshot 和 runtime permission envelope 必须由服务端生成。 - New-API runtime 必须有 timeout、失败分类、重试预算、correlation、脱敏 request/response summary;不可用时 fail closed,不能 fake success。 - `streamAiTask` 属于 P1R-4,但只能实现 AI task 级 SSE;统一 `/app-api/muse/events` 留给 P1R-7。 - Tool Grant 只能消费 Security facade 批准结果;AI runtime 不得自授权或扩权。 - Knowledge / RAGFlow 和 Market 主流程不属于 P1R-4;不可用时使用合同内 source status / action policy 表达阻断或重验。 - API access log / business audit 必须脱敏;敏感详情读取本身必须写入审计。 - OpenAPI 未声明字段不得添加到响应,未声明 response status 不得泄露到响应。 ## 当前阶段边界 本阶段只完成规格、计划、review 和 memory 留痕,没有实现代码。 未修改: - `docs/api-contracts/ai/openapi.yaml` - `docs/superpowers/reports/p1r-api-coverage.*` - `muse-cloud/scripts/**` - `muse-cloud/muse-module-ai/**` 实现代码 - `muse-cloud/sql/muse/**` 当前不应把任何 AI operation 标为 `completed`。 ## 下一步 进入 P1R-4 实现前,应从 `docs/superpowers/plans/2026-05-30-P1R-4-ai-real-api.md` Task 1 开始,按 fresh subagent + spec compliance review + quality / feasibility review 执行。 实现阶段完成口径: - AI 41 个 operation 退出 `generic_persistence` / `sse_placeholder`。 - AI 41 个 operation 全部为 `dedicated / needs_verification`。 - Content 51 个 operation 保持 `dedicated / needs_verification`。 - Meta 16 个 operation 保持 `dedicated / needs_verification`。 - Account 33 个 operation 保持 `dedicated / needs_verification`。 - completed operations 仍为 0,除非后续有真实端到端验收证据并单独批准。 - 不修改 OpenAPI 或 scanner 掩盖缺口。 - 如新增 V12 DDL,阶段收口前必须在同一 PostgreSQL 实例 `_test` 数据库跑真实 Flyway。 ## 2026-05-31 实现阶段收口更新 ### 实现任务范围 本轮实现阶段继续在以下真实 worktree 执行: ```text /Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0 ``` 分支: ```text dev/1.0.0 ``` 实现阶段按 `docs/superpowers/plans/2026-05-30-P1R-4-ai-real-api.md` 执行 Task 1-12,并使用 fresh subagent 落地;每个 implementation task 后按计划执行两类 review: 1. spec compliance review。 2. quality / feasibility review。 Task 1-12 覆盖范围: 1. Preflight 与覆盖基线冻结。 2. AI 基础设施与 V12 DDL。 3. Prompt / Quality Policy / Evaluation Run。 4. Agent / Tool Grant / Agent Slot。 5. AI Task / Runtime / Suggestion 创建基础。 6. AI Task SSE Stream。 7. Suggestion / Source Status / Source Event。 8. Job Admin/App Query、Cancel、Retry。 9. API Access Log / Business Audit。 10. Retire AI 合同兜底与覆盖门禁。 11. PostgreSQL / Flyway `_test` 迁移验收。 12. 最终验证、报告对账与 memory。 这些 review 和门禁只证明当前仓库内 dedicated 入口、状态机边界、报告和测试门禁符合 P1R-4 规格计划;没有真实端到端验收前,不代表 AI runtime、New-API、Security、Knowledge、Market 或统一事件流已经完成。 ### Coverage 最终状态 2026-05-31 Task 12 fresh 验证后的 coverage 对账: ```text AI 41 dedicated / needs_verification Content 51 dedicated / needs_verification Meta 16 dedicated / needs_verification Account 33 dedicated / needs_verification completedOperations = 0 ``` `ssePlaceholderOperations = 1` 仍存在,但对应的是 P1R-7 `streamEvents`: ```text events streamEvents GET /app-api/muse/events P1R-7 End-to-End Acceptance incomplete ``` P1R-4 的 `streamAiTask` 已退出 `sse_placeholder`,但仍是 `needs_verification`,不能写成 completed。 ### 运行态装配事实 `muse-server` 当前使用 `muse-module-ai-server`: ```text muse-cloud/muse-server/pom.xml:109 muse-module-ai-server ``` P1R-4 不再依赖运行时 `muse-module-ai-contract-server` 作为 41 个 AI 路由的兜底入口;旧合同 Controller 文件已从 contract server 删除,route ownership gate 证明 AI 路由由 dedicated Controller 持有。 ### V12 PostgreSQL / Flyway `_test` 证据 2026-05-31 Task 12 已重新使用 `~/.config/muse-repo/infra.env` 中的 PostgreSQL 凭据,在同实例隔离库运行 Flyway IT: ```text Database: jdbc:postgresql://100.64.0.8:5433/muse_local_p1r4_test (PostgreSQL 17.10) flyway_success=true migrations_executed=12 target_schema_version=12 flyway_latest=12:extend ai real api schema ``` `P1rAiFlywayMigrationIT` 使用 `filesystem:sql/muse`,先清理隔离 `_test` 库的 `public` schema,再执行 V1-V12 全量迁移。关键表: ```text muse_ai_command muse_ai_runtime_call muse_ai_task_event muse_ai_job muse_ai_source_event muse_ai_source_status_projection muse_ai_evaluation_run muse_api_access_log_projection muse_business_audit_event ``` 关键索引: ```text uk_muse_ai_job_active_retry_group idx_muse_api_access_log_tenant_time idx_muse_api_access_log_actor_time idx_muse_business_audit_tenant_time ``` ### Task 12 fresh 验证命令和结果 ```bash python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check ``` 结果:通过,重新生成 `docs/superpowers/reports/p1r-api-coverage.json` 和 `docs/superpowers/reports/p1r-api-coverage.md`。 ```bash jq -r '[.operations[] | select(.targetStage == "P1R-4 AI Real API" or .domain == "ai")] | group_by(.implementationStatus + "/" + .completionStatus)[] | [(.[0].implementationStatus + "/" + .[0].completionStatus), length] | @tsv' docs/superpowers/reports/p1r-api-coverage.json jq -r '["content","meta","account"][] as $d | [$d, ([.operations[] | select(.domain==$d)] | group_by(.implementationStatus + "/" + .completionStatus)[] | (.[0].implementationStatus + "/" + .[0].completionStatus + ":" + (length|tostring)))] | @tsv' docs/superpowers/reports/p1r-api-coverage.json jq -r '.summary | [.completedOperations,.ssePlaceholderOperations] | @tsv' docs/superpowers/reports/p1r-api-coverage.json ``` 结果: ```text dedicated/needs_verification 41 content dedicated/needs_verification:51 meta dedicated/needs_verification:16 account dedicated/needs_verification:33 0 1 ``` ```bash 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,P1rMetaRealApiGateTest,P1rAccountRealApiGateTest,P1rAiMigrationSqlTest,P1rAiRouteOwnershipTest,P1rAiRealApiGateTest \ -Dsurefire.failIfNoSpecifiedTests=false ``` 结果:通过;`P1rApiCoverageReportTest`、`P1rContentRealApiGateTest`、`P1rMetaRealApiGateTest`、`P1rAccountRealApiGateTest`、`P1rAiMigrationSqlTest`、`P1rAiRouteOwnershipTest`、`P1rAiRealApiGateTest` 共 35 tests,0 failures,0 errors,0 skipped。 ```bash cd muse-cloud JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \ mvn -o test -pl muse-module-ai/muse-module-ai-server -am \ -Dtest=AdminMuseAuditControllerAnnotationTest,MuseApiAccessLogQueryServiceTest,MuseApiAccessLogProjectionMapperTest,MuseBusinessAuditQueryServiceTest,MuseAiAuditServiceTest,MuseAiTaskStreamServiceTest,MuseJobServiceTest,MuseAiRuntimeProjectionServiceTest,MuseAiJobMapperTest \ -Dsurefire.failIfNoSpecifiedTests=false ``` 结果:通过;9 个目标测试类共 66 tests,0 failures,0 errors,0 skipped。输出中存在 Mockito 动态 agent 预警;`MuseAiTaskStreamServiceTest` 覆盖失败路径时有预期 WARN,不是测试失败。 ```bash cd muse-cloud JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \ mvn -o test -pl muse-server -am \ -Dtest=P1rAiFlywayMigrationIT \ -Dp1r.flyway.url="jdbc:postgresql://${MUSE_POSTGRES_HOST}:${MUSE_POSTGRES_PORT}/muse_local_p1r4_test" \ -Dp1r.flyway.user="$MUSE_POSTGRES_USERNAME" \ -Dp1r.flyway.password="$MUSE_POSTGRES_PASSWORD" \ -Dp1r.flyway.locations="filesystem:sql/muse" \ -Dsurefire.failIfNoSpecifiedTests=false ``` 结果:通过;1 test,0 failures,0 errors,0 skipped;PostgreSQL 17.10,V1-V12 全量迁移成功。 ### 未验证和 residual risk - 当前状态仍是 `needs_verification`,没有任何 operation 标记为 `completed`。 - 尚未完成真实端到端 acceptance;coverage 与 Maven gate 不能替代真实用户流、真实 New-API runtime、Security owner、Knowledge / RAGFlow、Market owner 和生产式事件链路验收。 - P1R-7 统一 `/app-api/muse/events` 的 `streamEvents` placeholder 仍然存在,明确不属于 P1R-4 范围。 - 本轮 Task 12 已成功重跑 Flyway IT;如果后续环境缺少 `MUSE_POSTGRES_PASSWORD` 等凭据,只能引用本段 surefire / Flyway 输出作为既有证据,并重新运行非凭据 gates。 ### 变更面记录 - OpenAPI:未修改 `docs/api-contracts/ai/openapi.yaml`。 - Scanner:未修改 `muse-cloud/scripts/p1r-audit-api-coverage.py`。 - Coverage:更新 `docs/superpowers/reports/p1r-api-coverage.json` 和 `docs/superpowers/reports/p1r-api-coverage.md`,不包含 completed 状态。 - SQL:新增 `muse-cloud/sql/muse/V12__extend_ai_real_api_schema.sql`。 - Java:`muse-server` 装配 `muse-module-ai-server`;删除 AI contract server 旧兜底 Controller;新增 AI dedicated Controller / Application Service / DTO / DAL / Mapper / Facade / Guard / SSE / audit / job / source / task 相关代码与 P1R gate tests。 ## 2026-06-01 P1R-4 review blocker 修复与最终验证 本轮继续 P1R-4 实现阶段,针对 fresh spec / quality review 暴露的阻塞问题做了三轮修复和复审;最终两类 fresh review 均 PASS。 ### 已验证事实 - `P1rAiRouteOwnershipTest` 已从纯静态扫描增强为 Spring `RequestMappingHandlerMapping` / `HandlerMethod` 运行态归属门禁,验证 AI 41 个 route 由 dedicated AI Controller 持有,不属于旧 `*MuseAiContractController`。 - 新增 `muse-cloud/sql/muse/V13__add_ai_runtime_payload_store.sql`,为 `createAiTask` 的短生命周期 provider payload 提供数据库恢复路径;payload 使用 `EncryptTypeHandler`,不进入 `job.input_summary`、`runtime_call.request_summary`、audit summary 或 coverage。 - `MuseAiRuntimePayloadStore` 从单机内存 TTL 改为 DB backed short TTL store;runtime 成功、不可重试失败、异常无 response、cancelled 终态都会按 `tenantId + job DB pk` 删除 runtime payload;仅 retryable failure 保留 payload 给下一轮 attempt。 - `adminRetryJob` 对带 `userInstructionLength/hash` 的失败 AI task job,会在 active payload 存在时复制 payload 到 retry job;payload 缺失或过期时不创建必然失败的 retry job。 - `MuseAiRuntimeClient.RuntimeCommand.toString()` 已覆盖 Java record 默认输出,只输出脱敏排障字段和 `hasProviderPayload`,不输出 `providerExecutionPrompt`、`inputSummary`、prompt 字段名或用户指令正文。 - `cancelJob` 对 queued/running/streaming job 推进到 `cancelled` 后,同步删除 runtime payload;对应 admin/user cancel、linked task、tenant fallback 均有测试覆盖。 - V13 cleanup SQL 覆盖 expired、consumed、soft-deleted 残留;mapper 测试已断言 `deleted = TRUE` 分支。 ### fresh review gate 最终 fresh spec compliance review:PASS。 最终 fresh quality / feasibility review:PASS。 非阻塞风险: - cancel running/streaming 只能保证本地 job/task 状态、payload 删除和 runtime 结果不覆盖 `cancelled`;无法中断已经发出的 provider HTTP 调用,仍可能产生外部调用成本。 - `idx_muse_ai_runtime_payload_cleanup` 对 expired/consumed 有帮助;pure `deleted=true` 且未过期的行主要靠 DELETE 条件扫到,索引不是最优形态。 - Maven 默认 Java 可能是 17;P1R-4 验证必须显式使用 Java 21。 ### 最终验证命令和结果 ```bash python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check ``` 结果:通过,重新生成 `docs/superpowers/reports/p1r-api-coverage.json` 和 `docs/superpowers/reports/p1r-api-coverage.md`。 coverage 对账: ```text AI 41 dedicated / needs_verification Content 51 dedicated / needs_verification Meta 16 dedicated / needs_verification Account 33 dedicated / needs_verification completedOperations = 0 ssePlaceholderOperations = 1 ``` 唯一剩余 `sse_placeholder` 是 `events / streamEvents / P1R-7 End-to-End Acceptance / incomplete`,不属于 P1R-4。 AI module focused tests: ```bash cd muse-cloud JAVA_HOME=$(/usr/libexec/java_home -v 21) mvn -o test \ -pl muse-module-ai/muse-module-ai-server -am \ -Dtest=MuseAiRuntimeJobDispatcherTest,MuseAiJobMapperTest,MuseAiTaskServiceTest,MuseAiRuntimeClientTest,MuseAiRuntimeProjectionServiceTest,MuseAiTaskStreamServiceTest,MuseJobServiceTest,MuseAiAuditServiceTest \ -Dsurefire.failIfNoSpecifiedTests=false ``` 结果:通过;`114 tests, 0 failures, 0 errors, 0 skipped`。 P1R AI gate tests: ```bash cd muse-cloud JAVA_HOME=$(/usr/libexec/java_home -v 21) mvn -o test \ -pl muse-server -am \ -Dtest=P1rAiRealApiGateTest,P1rAiRouteOwnershipTest,P1rAiMigrationSqlTest \ -Dsurefire.failIfNoSpecifiedTests=false ``` 结果:通过;`20 tests, 0 failures, 0 errors, 0 skipped`。 真实 PostgreSQL / Flyway `_test`: ```bash cd muse-cloud set -a . ~/.config/muse-repo/infra.env set +a P1R4_TEST_DB="${P1R4_TEST_DB:-muse_local_p1r4_test}" JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" \ mvn -o test -pl muse-server -am \ -Dtest=P1rAiFlywayMigrationIT \ -Dp1r.flyway.url="jdbc:postgresql://${MUSE_POSTGRES_HOST}:${MUSE_POSTGRES_PORT}/${P1R4_TEST_DB}" \ -Dp1r.flyway.user="$MUSE_POSTGRES_USERNAME" \ -Dp1r.flyway.password="$MUSE_POSTGRES_PASSWORD" \ -Dp1r.flyway.locations="filesystem:sql/muse" \ -Dsurefire.failIfNoSpecifiedTests=false ``` 结果:通过;PostgreSQL 17.10,同实例隔离库 `muse_local_p1r4_test`,V1-V13 全量迁移成功。 ```text flyway_success=true migrations_executed=13 target_schema_version=13 flyway_latest=13:add ai runtime payload store v13_tables=muse_ai_command,muse_ai_runtime_call,muse_ai_task_event,muse_ai_job,muse_ai_source_event,muse_ai_source_status_projection,muse_ai_evaluation_run,muse_api_access_log_projection,muse_business_audit_event,muse_ai_runtime_payload v13_indexes=uk_muse_ai_job_active_retry_group,idx_muse_api_access_log_tenant_time,idx_muse_api_access_log_actor_time,idx_muse_business_audit_tenant_time,uk_muse_ai_runtime_payload_job,idx_muse_ai_runtime_payload_active,idx_muse_ai_runtime_payload_cleanup ``` 其他最终检查: ```text git diff --check PASS,无输出 git diff -- docs/api-contracts/ai/openapi.yaml muse-cloud/scripts/p1r-audit-api-coverage.py PASS,无输出 ``` ### New-API 探索事实和缺口 New-API 只读探索确认: - Base URL:`http://100.64.0.8:3000` - Health:`GET /api/status` 可用,返回 200。 - OpenAI-compatible endpoints:`GET /v1/models`、`POST /v1/chat/completions`。 - Auth:`Authorization: Bearer `。 - Muse internal sync:`POST /api/internal/muse/users/sync`,需要 `X-Muse-Service-Secret`。 - `GET /v1/models` 使用 Muse token 返回 200,模型数 23。 - `POST /v1/chat/completions` smoke 在 `qwen3.5-plus`、`doubao-seed-2.0-lite` 上出现超时;因此不能把真实 New-API 端到端验收写成已完成。 ### 当前完成口径 P1R-4 本阶段 dedicated gate 已达成: - AI 41 个 operation 全部为 `dedicated / needs_verification`。 - `streamAiTask` 已退出 `sse_placeholder`,改为 task 级 SSE dedicated 实现。 - `completedOperations = 0`。 - Content 51、Meta 16、Account 33 保持 `dedicated / needs_verification`。 - 未修改 AI OpenAPI 合同,未修改 coverage scanner 掩盖缺口。 仍不能写成 completed: - 真实 New-API chat completions 端到端尚未跑通。 - Security owner 仍是 facade / projection / unavailable 边界,未做完整外部 owner 验收。 - Knowledge / RAGFlow、Market、统一 `/app-api/muse/events` 仍不属于 P1R-4,本轮未验收。 - 真实用户流、生产式事件链路、provider 已发出请求的 cancel 中断能力仍是后续验收项。