## Context 公共 Outbox 的 `event_id` 与 `parent_event_id` 上限均为 64 字符。业务观测已有一个稳定 SHA-256 摘要实现,但停复机、网络和流量路径仍直接拼接 UUID 或 Integration ID;Repository 也未提前执行长度校验。 ## Goals / Non-Goals **Goals:** - 复用单一、稳定的事件 ID 压缩规则覆盖四条风险路径。 - 在公共持久化边界报告长度契约违规。 **Non-Goals:** - 不扩大数据库字段,不修改既有事件,不改变 API 或异步载荷结构。 - 不重构其他 Outbox 生产者。 ## Decisions 1. 在公共 Outbox 包提供最小稳定 ID 函数:原值未超限时原样返回,超限时保留短业务前缀并拼接 SHA-256 十六进制摘要至恰好不超过 64 字符。相比扩大 Schema,此方案保持既有契约;相比各调用点手写截断,可避免碰撞风险和重复实现。 2. 四条已确认风险路径在构造业务事实时调用同一函数,使事件载荷内 `event_id` 与信封一致,保持幂等消费校验。 3. Repository 在 GORM Create 前校验 `EventID`、`ParentEventID` 长度。该防线仅返回明确错误,不自动改写未知生产者的标识语义。 ## Risks / Trade-offs - [摘要后的 ID 可读性降低] → 保留业务前缀,完整业务定位仍在聚合、资源和载荷字段中。 - [历史超长请求的重试 ID 发生变化] → 历史写入已整体回滚,不存在需兼容的 Outbox 事实。 ## Migration Plan 部署代码后用 UUID 和 20 位主键验证四条构造路径及 Repository 边界,再执行现有构建与 OpenSpec 校验。回滚仅需恢复代码;无 Schema 与数据迁移。