# P1R7 Source Owner Propagation 全局执行版
## 结论
本执行版只定义 P1R-7 Source Owner Propagation 的全局落地顺序、子阶段拆分、review gate、验证门槛和当前 AI 草稿处理规则;不实现代码,不提交,不推送,不推进 completed。
总执行主线:
```mermaid
flowchart TB
GlobalReview["全局审阅版
已双 review PASS"] --> GlobalPlan["全局执行版
本文件,待双 review"]
GlobalPlan --> Freeze["冻结全局合同
用户可见 Events 不替代内部 Source/Authorization"]
Freeze --> P7bPlan["P1R-7b 子计划
AI terminal event"]
P7bPlan --> P7bImpl["P1R-7b 实现
AI outbox + worker + Events evidence"]
P7bImpl --> NextDecision{"下一 owner 选择"}
NextDecision --> P7c["P1R-7c Knowledge
source status / projection notification"]
NextDecision --> P7e["P1R-7e Account
security / quota notification 备选"]
P7c --> P7d["P1R-7d Market
lifecycle / governance notification"]
P7e --> P7d
P7d --> P7f["P1R-7f Content
用户可见 content/task notification"]
P7f --> Approval["P1R-7 completed approval
用户单独批准"]
```
硬边界:
1. 当前 AI outbox / V17 / docs 草稿在 P1R-7b 子计划修订并双 review PASS 前不得继续测试、提交、推送或作为完成证据。
2. 全局方案只定义“用户可见 Events 发布链路”,不替代正式 Source / Authorization 内部传播链路。
3. 每个 owner 的实现都必须 fresh implementer + fresh spec review + fresh quality / feasibility review。
4. completed approval 必须另起任务,不能由任何 dedicated gate 或 owner evidence 自动推出。
## 范围
本执行版负责:
- 固化 P1R-7 全局 source owner propagation 合同。
- 定义后续 P1R-7b/c/d/e/f 子计划顺序和拆分条件。
- 定义每个子计划必须继承的通用验证门槛。
- 定义当前 dirty AI 草稿如何进入 P1R-7b 子计划复审。
本执行版不负责:
- 不改业务代码、迁移、OpenAPI、scanner、coverage JSON/Markdown。
- 不运行 Maven / pnpm / Flyway / coverage scanner full verification。
- 不清理或回退当前 dirty/untracked baseline。
- 不把 `streamEvents`、P1R-7、Market 或任何 owner 标为 `completed`。
## 已验证事实
### 工作区与 review gate
1. 正确工作区为 `/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0`。
2. 当前分支为 `dev/1.0.0`,远端 `origin/dev/1.0.0` 已 ff-only 对齐。
3. 当前 HEAD 为 `fa29753 test(p1r): 收口 Events SSE 门禁`。
4. 当前 `git status --short --branch` 显示未提交 AI P1R-7b 草稿、V17 migration 草稿和 `docs/agent-specs/` 文档草稿。
5. 受保护文件定向 `git status --short` 无输出。
6. `docs/agent-specs/2026-06-06-P1R7SourceOwnerPropagation全局审阅版.md` 已通过 fresh spec review:
- Kant / `019e9987-ca59-7370-bc49-9938eb93c70f` / PASS。
7. 同一全局审阅版已通过 fresh quality / feasibility review:
- Hubble / `019e998b-2d82-7200-9289-c6c8dd37f744` / PASS。
### Coverage 与状态边界
1. 当前 coverage summary:
- `totalOperations = 233`
- `completedOperations = 100`
- `needsVerificationOperations = 133`
- `incompleteOperations = 0`
- `genericPersistenceOperations = 0`
- `ssePlaceholderOperations = 0`
2. Events 当前唯一 operation 为 `streamEvents GET /app-api/muse/events = dedicated / needs_verification`。
3. Market 当前 32 operations 均为 `dedicated / needs_verification`。
4. P1R-7a 收口文档明确:P1R-7a 未接入 source owner propagation,未运行 source owner publish tests。
### 全局设计事实
1. `CLAUDE.md` 将 Source 传播定为“事件驱动 + 各模块自治”。
2. `design-docs/架构-02-核心数据结构与双轨模型.md` 明确不需要独立 source 模块。
3. `design-docs/后端-03-关键流程实现与接口契约.md` 明确异步失败不得回滚已提交 Canonical。
4. P1R-7a 执行版已固定 source owner 本域 outbox + worker 调用 Events API;Events server 不反向依赖 source owner server。
5. Events owner 当前已有 `EventsPublishApi`、`EventsPublishReqDTO`、commandId/source tuple 幂等、payload sanitizer、accepted-only 可见查询和 SSE stream。
## 推断
1. 全局执行顺序应先冻结通用合同,再修订 P1R-7b AI 子计划;否则当前 AI 草稿可能继续携带单点设计里的事务和 dirty baseline 风险。
2. AI 仍是第一实现切片,因为它已有 terminal fact、ownerUserId、runtime job 和 focused test 基础。
3. Knowledge 适合作为第二个 source status propagation owner,但如果后续目标更偏用户通知而非来源状态传播,Account security event 可以作为更低风险 second slice 备选。
4. Market 应排在 AI/Knowledge 之后,因为 Market Account projection outbox 与 Events publish outbox 职责不同,直接复用风险较高。
5. Content 需要先界定内部领域事件与用户可见事件,否则容易把 BlockSavedEvent 等内部 trigger 过度推送到 SSE。
## 假设
1. 后续 owner 允许在本域新增 publish outbox 或等价状态表。
2. 后续 owner server 允许新增 `muse-module-events-api` 依赖。
3. 现有 Events OpenAPI 事件类型足够覆盖第一轮用户可见摘要;如果不够,应另起合同变更审批。
4. 当前 AI 草稿可以作为 P1R-7b 子计划的候选素材,但必须经过执行版修订、双 review 和本地验证后才能继续。
## 全局合同
### 依赖合同
1. Source owner server 可以依赖 `muse-module-events-api`。
2. Source owner server 不得依赖 `muse-module-events-server`。
3. `muse-module-events-server` 不得依赖 AI / Knowledge / Market / Member / Content server。
4. `muse-server` 可以装配 Events server 与各 source owner server。
5. 每个 owner 子计划必须包含 Maven dependency tree 验证命令。
### 发布 envelope 合同
每个 owner 子计划必须固定:
| 字段 | 要求 |
|---|---|
| `commandId` | 稳定短幂等键,长度 `<= 128`,推荐 `_evt:` |
| `tenantId` | 必填,worker 必须恢复租户上下文 |
| `ownerUserId` | 必填,决定 SSE 可见性 |
| `sourceOwner` | 固定 owner 枚举 |
| `sourceType` | 固定业务事实类型 |
| `sourceId` | 本域事实稳定 id 或业务 id |
| `sourceRevision` | 本域事实版本;缺失时必须在子计划解释占位语义 |
| `eventType` | 只能使用 Events OpenAPI 已声明类型 |
| `resourceType/resourceId` | UI 定位对象,不参与替代 source tuple 幂等 |
| `payloadSummary` | OpenAPI allowlist 安全摘要 |
| `emittedAt` | 本域事实发生时间 |
### 用户可见事件判定
每个候选事件进入 SSE 前必须满足:
1. 用户需要实时感知。
2. 用户可据此采取动作或理解当前工作状态。
3. payload 能压缩为 OpenAPI 已声明 schema 的安全摘要。
4. 不需要暴露内部 source propagation、授权快照、worker、风控或 provider raw 细节。
5. 能提供稳定 source tuple、commandId、ownerUserId 和 emittedAt。
默认不进入 SSE:
1. 内部 followup trigger。
2. projection rebuild / worker heartbeat / retry job 状态。
3. 需要完整正文、知识资料、provider raw、授权详情或安全原始证据才能解释的事件。
### Outbox 合同
每个 owner 子计划必须包含:
1. `queued/running/retryable/published/dead_letter` 或等价状态。
2. `attempt_count` 或等价 claim 次数字段。
3. `max_attempt` 配置。
4. `next_retry_at`。
5. `claimed_at`。
6. `claim_expires_at`。
7. 固定退避策略。
8. claim 索引。
9. `FOR UPDATE SKIP LOCKED` 或等价原子领取机制。
10. `ON CONFLICT DO NOTHING` / `insertIgnore` + 回查,禁止把唯一约束异常作为正常幂等路径。
11. `published_event_id` / `published_sequence_no` 或等价回写字段。
12. `last_error_code` / `last_error_message` 安全错误摘要。
13. 中文日志,包含 owner、tenantId、ownerUserId、source tuple、outboxId、attempt、状态转换和错误摘要。
### Payload 合同
每个 owner 子计划必须列出:
1. 允许的 `eventType`。
2. 每个 `eventType` 的 payload allowlist。
3. 需要丢弃或归一化的敏感字段。
4. payload invalid 时的 fail-closed 状态和错误码。
5. rejected/blocked 后不得进入 SSE 可见查询的验证方式。
## 子阶段执行顺序
### Task 0:冻结总执行版
目标:
- 本文件完成 fresh spec review + fresh quality / feasibility review 双 PASS。
- 双 PASS 前不修订 P1R-7b 子计划,不继续 AI 草稿测试或实现。
验收:
- Reviewer 明确 PASS。
- 如有 FAIL,先修订本文件并重审。
- protected files 仍无改动。
### Task 1:P1R-7b 子计划修订
目标:
- 修订 `docs/agent-specs/2026-06-06-P1R7bSourceOwnerPropagation执行版.md`。
- 将它从“AI 单点执行版”改为“全局执行版下的 AI 第一切片子计划”。
- 明确当前 AI 草稿的处理策略:修订沿用、拆分提交或用户批准后清理。
必须补充:
1. 继承本执行版的依赖合同、envelope 合同、outbox 合同和 payload 合同。
2. 明确 AI 只发布用户可见 terminal `done/error` 摘要。
3. 明确 AI outbox 创建不得依赖捕获 `DuplicateKeyException` 作为正常幂等路径。
4. 明确 P1R-7b 只处理 AI,不处理 Knowledge / Market / Account / Content。
5. 明确 P1R-7b 不推进 completed。
Review gate:
- Fresh spec compliance review。
- Fresh quality / feasibility review。
- 双 PASS 前不得继续当前 AI 草稿实现。
### Task 2:P1R-7b AI 实现收口
目标:
- 在 P1R-7b 子计划双 PASS 后,处理当前 AI 草稿或由 fresh implementer 重做。
- 实现 AI terminal event -> AI publish outbox -> AI worker -> EventsPublishApi -> `muse_unified_event` -> SSE 可见证据。
必须验证:
1. AI focused tests。
2. Outbox mapper/service/worker tests。
3. Events publish accepted/rejected/blocked/duplicate tests。
4. SSE visible query tests。
5. Dependency tree:AI 只依赖 events-api,不依赖 events-server;Events server 不依赖 source owner server。
6. Migration SQL test 和 Flyway `_test`。
7. protected files 无改动。
Review gate:
- 每个实现 Task fresh implementer。
- 每个实现 Task fresh spec review。
- 每个实现 Task fresh quality / feasibility review。
### Task 3:第二 owner 选择决策
目标:
- 在 AI 第一切片通过后,只读评估第二 owner 是 Knowledge source status 还是 Account security notification。
选择规则:
1. 如果目标是 source status propagation 证据优先,选择 Knowledge。
2. 如果目标是用户可见通知链路低风险扩展优先,选择 Account security event。
3. 不因 Market 有 outbox 命名而优先选择 Market。
4. Content 进入前必须先冻结内部事件与用户可见事件判定。
5. 如果 Account security event 先于 Market 落地,阶段编号仍保留 P1R-7e,不重命名 P1R-7d,避免阶段编号反向改写历史计划。
输出:
- `docs/agent-specs/YYYY-MM-DD-P1R7c...审阅版.md`。
- fresh spec review + fresh quality review。
### Task 4:P1R-7c / P1R-7e 子计划与实现
目标:
- 按 Task 3 决策进入 Knowledge 或 Account。
- 每个 owner 都必须先产出单独审阅版,再产出单独执行版;审阅版和执行版各自 fresh spec review + fresh quality / feasibility review 双 PASS 后,才允许进入该 owner 实现。
必须继承:
- 本执行版的全局合同。
- P1R-7b 的复用经验,但不得复制 AI payload / 状态机细节到不匹配 owner。
### Task 5:Market 与 Content 后续切片
目标:
- Market 先拆清 Account projection outbox 与 Events publish outbox 职责。
- Content 先拆清内部 followup trigger 与用户可见 Events notification。
进入条件:
- 至少已有两个 owner 的 Events publish 链路通过验证,或者用户明确要求优先 Market / Content。
### Task 6:P1R-7 completed approval 预检
目标:
- 汇总 Events owner + 各 source owner evidence。
- 只读判断是否具备 completed approval 申请条件。
必须包含:
1. coverage 当前状态。
2. 所有 owner 的测试证据。
3. HTTP / SSE / DB / Flyway / dependency / protected file evidence。
4. 未覆盖 owner 和未覆盖失败路径清单。
边界:
- 该 task 只做预检,不自动标 completed。
- completed approval 必须用户单独批准。
## 验证命令模板
每个 owner 子计划必须按实际模块填充以下模板:
```bash
cd /Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0
git status --short --branch
git status --short -- docs/api-contracts/market/openapi.yaml docs/api-contracts/ai/openapi.yaml docs/api-contracts/knowledge/openapi.yaml docs/api-contracts/events/openapi.yaml muse-cloud/scripts/p1r-audit-api-coverage.py docs/superpowers/reports/p1r-api-coverage.json docs/superpowers/reports/p1r-api-coverage.md
```
```bash
cd muse-cloud
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" mvn -o -pl -am -Dtest= -Dsurefire.failIfNoSpecifiedTests=false test
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" mvn -o -pl muse-server -am -Dtest= -Dsurefire.failIfNoSpecifiedTests=false test
JAVA_HOME=$(/usr/libexec/java_home -v 21) PATH="$JAVA_HOME/bin:$PATH" mvn -o -pl -am dependency:tree
```
Flyway `_test` 必须使用独立测试库,且必须显式清空 JVM 代理参数或证明代理不会影响内网 PostgreSQL 连接。
## 当前 dirty baseline 处理规则
当前未提交 AI P1R-7b 草稿包括:
- AI module POM、runtime projection service、job service 与相关测试改动。
- AI publish outbox service / mapper / DO 新文件。
- `muse-cloud/sql/muse/V17__extend_ai_events_publish_outbox.sql`。
- P1R-7b migration SQL/Flyway test 草稿。
- `docs/agent-specs/` 文档草稿。
处理规则:
1. 本执行版双 PASS 前,不继续测试或实现这些草稿。
2. P1R-7b 子计划修订时必须显式决定这些草稿是“修订沿用”还是“废弃重做”。
3. 如果选择修订沿用,必须补证据证明草稿已符合本执行版全局合同。
4. 如果选择废弃重做,必须先征得用户明确批准后才能清理相关 dirty/untracked 文件。
5. 任何情况下不得回退用户或其他代理的无关改动。
## 完成条件
本总执行版完成条件:
1. 本文件存在且内容覆盖全局合同、子阶段顺序、验证模板、dirty baseline 处理规则。
2. Fresh spec compliance review PASS。
3. Fresh quality / feasibility review PASS。
4. protected files 无改动。
5. 输出下一步:修订 P1R-7b 子计划,而不是直接继续 AI 实现。
6. 本轮 reviewer 只读审查文档,不运行 full verification;review PASS 不能解释为实现验证 PASS。
P1R-7 全链路完成条件不在本文件完成范围内;它必须在 P1R-7 completed approval 任务中单独判断。
## 回滚策略
本执行版只新增文档;若 review FAIL:
1. 只修订本文件和必要的 `.agent` 说明。
2. 不回退代码草稿。
3. 不修改 protected files。
4. 不运行 full verification。
若后续实现阶段发现全局合同错误:
1. 停止对应 owner 实现。
2. 回到全局审阅版 / 执行版修订。
3. 重新 fresh spec review + fresh quality review。