# 02 — 在业务事务中可靠写入公共 Outbox

**What to build:** 业务开发者可以沿用现有 GORM 显式事务，在提交业务事实的同一事务中写入权威公共 Outbox 事件。事件身份和关联标识在事务内稳定持久化，业务写入或 Outbox 写入任一步失败都会整体回滚，事务中不会调用 Redis、Asynq 或外部系统。

**Blocked by:** 01 — 建立公共迁移所有权与检查门禁

**Status:** completed

**架构通道:** Application + Port/Adapter。

**完整业务边界:** 本票收口公共 Outbox 模型、事件信封、事务内追加 Port 和一个可观察的示例写入链路。明确不定义下游业务事件含义，不实现业务消费者，不引入 UnitOfWork、事务工厂或全仓事务重构。

- [x] 公共 Outbox 具有稳定唯一的事件 ID、事件类型、载荷版本、聚合与资源定位、请求与关联标识、结构化载荷、投递生命周期、重试、租约和安全错误摘要字段。
- [x] Outbox 内部状态固定为 `1=待投递、2=投递中、3=已投递、4=投递失败`，常量、模型注释和公开说明保持一致。
- [x] 业务事实和 Outbox 使用同一 GORM 事务句柄；任一写入失败时二者均不可见，未提交事件不会被投递侧读取。
- [x] 事件 ID、业务键及必要快照在事务内生成并持久化，重试过程中不会重新生成事件身份。
- [x] 事务内不执行 Redis、Asynq、HTTP、对象存储或其他外部调用，Domain 不依赖 GORM。
- [x] PostgreSQL 集成测试覆盖事务成功、业务写入失败、Outbox 写入失败、事件 ID 唯一约束和回滚行为。
