oh-my-muse/docs/archive/2026-06-05-P1R-7a-source-owner-compatibility.md
lili 0c119d7c6f docs: 归档已完成阶段过程文档至 docs/archive(git mv 保历史)
9 篇工作已完成的过程文档(P1R解锁3篇+agent基建交付+superpowers报告2篇+P1R任务memory+已合并object-storage计划+已折入总览的completion brainstorm)移至 docs/archive/。保留:design-docs(SSOT)、主台账、现状基线、对抗复盘/P0冻结令(知识网根基,被AGENTS/.agents/台账引用)、meta-schema当前2篇、p1r-api-coverage.json(被引数据)、memorys/README。归档非删除,git 可恢复。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 02:50:00 -07:00

8.9 KiB
Raw Blame History

P1R-7a source owner publish 兼容性盘点

结论AI、Knowledge、Market、Member(Account) 四个候选 source owner 在当前代码状态下都不同时满足 P1R-7a source owner publish 最小接入门槛;本阶段不新增任何 source owner worker不修改 source owner 代码,统一事件传播进入 P1R-7b / needs_verification。

已验证事实

执行边界

  • docs/superpowers/plans/2026-06-05-P1R-7a-events-sse.md 的 Task 6 要求先只读盘点 owner 是否同时具备安全公开事实、可复用 outbox/job/retry、稳定 commandId/source tuple、只依赖 muse-module-events-api、以及 focused tests 能覆盖 success/failure/repeat/blocked/dead_letter/replay不满足任一条件时不得在 P1R-7a 新建 worker。
  • docs/superpowers/specs/2026-06-05-P1R-7-events-sse-review.md 要求 Events owner 不反向依赖 AI、Knowledge、Market、Account/Member serversource owner 失败或未接入时 Events stream 不伪造事件。
  • muse-cloud/muse-module-events/** 已提供 Events 侧发布契约、commandId / source tuple 幂等、payload 脱敏、accepted/rejected/blocked 状态和 focused testsTask 6 的剩余判断点是 source owner 是否已有可复用补偿入口。

AI

  • muse-cloud/muse-module-ai/muse-module-ai-server/src/main/java/cn/iocoder/muse/module/ai/dal/dataobject/muse/MuseAiTaskEventDO.javataskIdsequenceNoeventTypeownerUserIdjobIdcorrelationIdpayloadSummaryemittedAt 等 task SSE 事实字段。
  • muse-cloud/muse-module-ai/muse-module-ai-server/src/main/java/cn/iocoder/muse/module/ai/dal/dataobject/muse/MuseAiSourceEventDO.javasourceOwner/sourceType/sourceId/sourceRevisionownerUserIdcommandIdeventSummary 等 source event 事实字段。
  • muse-cloud/muse-module-ai/muse-module-ai-server/src/main/java/cn/iocoder/muse/module/ai/dal/mysql/muse/MuseAiTaskEventMapper.java 只提供 latest、terminal、按 task replay、按 sequence 增量查询;未提供 publish claim、publish status、retry、blocked 或 dead_letter 更新入口。
  • muse-cloud/muse-module-ai/muse-module-ai-server/src/main/java/cn/iocoder/muse/module/ai/dal/mysql/muse/MuseAiSourceEventMapper.java 只提供分页查询;未提供 worker claim 或补偿状态转换。
  • muse-cloud/muse-module-ai/muse-module-ai-server/src/main/java/cn/iocoder/muse/module/ai/application/muse/MuseAiRuntimeJobDispatcher.java 只领取 job_type = 'ai_task_runtime' 的 queued job不能直接复用于 Events publish outbox。
  • muse-cloud/muse-module-ai/muse-module-ai-server/src/main/java/cn/iocoder/muse/module/ai/application/muse/MuseSourceEventServiceImpl.java 注释明确 source event retry 只提交 AI job 投影,等待后续 worker/owner 消费,不能把来源传播伪造为完成。
  • 判定AI 有 owner-visible 事件事实和稳定标识基础,但缺少针对 Events publish 的可复用 outbox/job/retry/dead_letter 入口P1R-7a 不接入,进入 P1R-7b / needs_verification。

Knowledge

  • muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/dal/dataobject/muse/MuseKnowledgeSourceEventDO.javasourceOwner/sourceType/sourceId/sourceRevisionownerUserIdcommandIdsourceHasheventSummary 等 source event 事实字段。
  • muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/dal/dataobject/muse/MuseKnowledgeProjectionTaskDO.javastatusattemptNoretryCountretryablenextRetryAt 字段。
  • muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/application/muse/MuseKnowledgeSourceEventService.java 在创建 source event 后同步更新 source binding projection并将 projection task 直接写为 completed;代码注释明确这是为了避免制造无执行者的 queued 任务。
  • muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/dal/mysql/muse/MuseKnowledgeProjectionTaskMapper.java 只提供 selectByTaskId 和按状态分页查询;未提供 claim/retry/dead_letter 入口。
  • 判定Knowledge 有 owner-visible source/projection 事实,但 projection task 不是可执行补偿队列P1R-7a 不接入,进入 P1R-7b / needs_verification。

Market

  • muse-cloud/muse-module-market/muse-module-market-server/src/main/java/cn/iocoder/muse/module/market/dal/dataobject/muse/MuseMarketAccountProjectionDO.javaoutboxStatusretryCountnextRetryAtlastAttemptAt 等 Market Account 投影 outbox 字段。
  • muse-cloud/muse-module-market/muse-module-market-server/src/main/java/cn/iocoder/muse/module/market/application/muse/MarketAccountProjectionProvider.java 当前同步写 member 侧 muse_account_record_projection,成功后记录 synced,失败后记录 blocked 并向上抛错。
  • muse-cloud/muse-module-market/muse-module-market-server/src/main/java/cn/iocoder/muse/module/market/dal/mysql/muse/MuseMarketAccountProjectionMapper.java 只有按 projectionId 查询和 upsertBySourceRevision;未提供领取 retryable outbox、重试成功、dead_letter 或 replay 的 worker 入口。
  • muse-cloud/muse-module-market/muse-module-market-server/src/main/java/cn/iocoder/muse/module/market/application/muse/MarketSourceStatusServiceImpl.java 只校验并插入 source status event未提供异步补偿模式。
  • muse-cloud/muse-module-market/muse-module-market-server/src/main/java/cn/iocoder/muse/module/market 搜索 claimSKIP LOCKED@ScheduledXxlJobdead_letter 等 worker 信号,只命中 Account projection outbox 字段写入,未发现可复用 worker。
  • 判定Market 有部分 outbox 状态事实,但当前用于同步投影记录,不满足 Events publish worker 的 claim/retry/dead_letter/replay 最小接入门槛P1R-7a 不接入,进入 P1R-7b / needs_verification。

Member(Account)

  • muse-cloud/muse-module-member/muse-module-member-server/src/main/java/cn/iocoder/muse/module/member/dal/dataobject/account/AccountIntegrationCallDO.javacommandIdcorrelationIdretryCountnextRetryAtrequestSummaryresponseSummary 等调用事实字段。
  • muse-cloud/muse-module-member/muse-module-member-server/src/main/java/cn/iocoder/muse/module/member/dal/mysql/account/AccountIntegrationCallMapper.java 只提供按 correlationId 和 accountUserId 查询;未提供 worker claim 或补偿状态转换。
  • muse-cloud/muse-module-member/muse-module-member-server/src/main/java/cn/iocoder/muse/module/member/dal/dataobject/account/MemberSecurityEventDO.javadeviceInfoipAddress代码注释明确这些包含敏感值Controller 不应直接返回原始 JSON。
  • muse-cloud/muse-module-member/muse-module-member-server/src/main/java/cn/iocoder/muse/module/member/convert/account/AccountConvert.javaconvertSecurityEventSummarysanitizedSecurityEventSnapshot,可生成脱敏摘要,但这只是读取/转换能力,不是可复用 Events publish outbox。
  • 对 member account 应用层和 mapper 搜索 claimSKIP LOCKED@ScheduledXxlJobdead_letter 等 worker 信号,未发现可复用 Events publish 补偿入口。
  • 判定Member(Account) 有调用事实和安全事件脱敏能力,但缺少 publish outbox/job/retry/dead_letter/replay 入口P1R-7a 不接入,进入 P1R-7b / needs_verification。

推断

  • 四个 owner 若在 P1R-7a 强行接入,都需要新增本域 Events publish outbox/worker/status 机和 focused tests这已经超出 Task 6 的“已有成熟 outbox/job 可选最小接入”边界。
  • Market 的 MuseMarketAccountProjectionDO 命名为 outbox但从当前 provider、mapper 和测试看,它主要记录 Market -> Account 同步状态,不是通用事件发布补偿队列。
  • Member 的 security event 可以作为后续通知候选事实,但必须先设计本域发布 outbox 和脱敏 payload contract避免直接发布 deviceInfo/ipAddress

假设

  • 本报告只基于当前 worktree 的代码、计划、审阅版和只读搜索结果;未连接数据库或远程环境验证历史数据内容。
  • P1R-7b 可以在保持依赖方向不变的前提下,为至少一个 source owner 新增本域 publish outbox worker再只依赖 muse-module-events-api 调用 EventsPublishApi

P1R-7b 待办

  • AI补齐 task/source event 到 Events publish 的本域 outbox 状态、claim/retry/dead_letter/replay 入口和 focused tests。
  • Knowledge将 source/projection 事件从同步完成记录扩展为可补偿发布 outbox避免制造无执行者 queued task。
  • Market明确 Market Account projection outbox 与 Events publish outbox 的职责边界;若复用,需要新增 claim/retry/dead_letter/replay 语义。
  • Member(Account):新增安全事件/额度通知的脱敏 publish outbox不允许直接发布原始 deviceInfo/ipAddress