Migration state per topic
| Topic | Family | Posts ledger | Claim leg | Requires line_id | Migration state | Replay | Days clean | 24h |
|---|---|---|---|---|---|---|---|---|
| csd.intake.created | intake | no | none | yes | not_started | refused | 0 | 0 |
| csd.parcel.booked | receipt | yes | reserve only | yes | not_started | refused | 0 | 0 |
| csd.item.received | receipt | yes | none | yes | not_started | refused | 0 | 0 |
| csd.disposition.set | disposition | yes | return_in | yes | not_started | refused | 0 | 0 |
| csd.exchange.issued | exchange | yes | exchange_out | yes | not_started | refused | 0 | 0 |
| csd.refund.processed | refund | yes | refund_credit | yes | not_started | refused | 0 | 0 |
| csd.repair.opened | repair | stock lane only | repair_out | yes | not_started | refused | 0 | 0 |
| csd.repair.closed | repair | stock lane only | repair_in | yes | not_started | refused | 0 | 0 |
| csd.reservation.place | reservation | yes | custody | yes · CSD sends none | shadow | refused | 4 | 22 |
| csd.reservation.release | reservation | yes | custody | yes · CSD sends none | shadow | refused | 4 | 17 |
Replay is refused for every topic here because none has reached i3_owns. The refusal is a 409 carrying the topic's current state in the body, not a silent no-op. The registry CHECK ck_cet_replay makes an inconsistent row unwritable, so a topic can never be marked replayable while a sibling still owns its ledger effect.