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>
8.9 KiB
8.9 KiB
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 server,source owner 失败或未接入时 Events stream 不伪造事件。muse-cloud/muse-module-events/**已提供 Events 侧发布契约、commandId/ source tuple 幂等、payload 脱敏、accepted/rejected/blocked状态和 focused tests;Task 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.java有taskId、sequenceNo、eventType、ownerUserId、jobId、correlationId、payloadSummary、emittedAt等 task SSE 事实字段。muse-cloud/muse-module-ai/muse-module-ai-server/src/main/java/cn/iocoder/muse/module/ai/dal/dataobject/muse/MuseAiSourceEventDO.java有sourceOwner/sourceType/sourceId/sourceRevision、ownerUserId、commandId、eventSummary等 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.java有sourceOwner/sourceType/sourceId/sourceRevision、ownerUserId、commandId、sourceHash、eventSummary等 source event 事实字段。muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/dal/dataobject/muse/MuseKnowledgeProjectionTaskDO.java有status、attemptNo、retryCount、retryable、nextRetryAt字段。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.java有outboxStatus、retryCount、nextRetryAt、lastAttemptAt等 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搜索claim、SKIP LOCKED、@Scheduled、XxlJob、dead_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.java有commandId、correlationId、retryCount、nextRetryAt、requestSummary、responseSummary等调用事实字段。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.java含deviceInfo和ipAddress,代码注释明确这些包含敏感值,Controller 不应直接返回原始 JSON。muse-cloud/muse-module-member/muse-module-member-server/src/main/java/cn/iocoder/muse/module/member/convert/account/AccountConvert.java有convertSecurityEventSummary和sanitizedSecurityEventSnapshot,可生成脱敏摘要,但这只是读取/转换能力,不是可复用 Events publish outbox。- 对 member account 应用层和 mapper 搜索
claim、SKIP LOCKED、@Scheduled、XxlJob、dead_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。