Box State Transitions
Box State Transitions
Entity: BoxEntity States: Created, Planned, Picking, PackedVerified, Shipped, Delivered, ReturnInitiated, Returning, Received, Reconciled, Closed
State Diagram
┌─────────────┐
│ Created │ ◄── box container registered
└──────┬──────┘
│ assign_to_cycle
▼
┌─────────────┐
│ Planned │ ◄── contents committed logically
└──────┬──────┘
│ start_picking
▼
┌─────────────┐
│ Picking │ ◄── warehouse scanning garments
└──────┬──────┘
│ verify (all scanned, variance resolved)
▼
┌──────────────┐
│PackedVerified│ ◄── contents confirmed
└──────┬───────┘
│ ship
▼
┌─────────────┐
│ Shipped │ ◄── outbound in transit
└──────┬──────┘
│ deliver
▼
┌─────────────┐
│ Delivered │ ◄── at user location
└──────┬──────┘
│ initiate_return (automatic)
▼
┌───────────────┐
│ReturnInitiated│ ◄── expecting return
└──────┬────────┘
│ return_pickup
▼
┌─────────────┐
│ Returning │ ◄── inbound in transit
└──────┬──────┘
│ receive
▼
┌─────────────┐
│ Received │ ◄── at facility
└──────┬──────┘
│ reconcile
▼
┌─────────────┐
│ Reconciled │ ◄── contents verified
└──────┬──────┘
│ close
▼
┌─────────────┐
│ Closed │ ◄── available for reuse
└─────────────┘
Transition Contracts
T-B001: (none) → Created
Trigger: New box container registered in system.
Preconditions:
box_barcodeis unique- Box is physically available
Actions:
- Create BoxEntity with
container_state = 'Created' - Set
box_barcode - Emit event:
BoxCreated
Postconditions:
- Box exists and can be assigned to cycles
T-B002: Created → Planned (or Closed → Planned for reuse)
Trigger: Box assigned to cycle, contents determined.
Preconditions:
box.container_state IN ('Created', 'Closed')cycle.cycle_state == 'Scheduled'ORcycle.cycle_state == 'Committed'planned_contentsdetermined (list of garment_ids)
Actions:
- Set
box.container_state = 'Planned' - Set
box.cycle_id = cycle.cycle_id - Set
box.planned_contents = [garment_ids] - Clear
box.actual_contents - Emit event:
BoxPlanned
Postconditions:
- Box is committed to cycle
- Planned contents recorded for variance detection
T-B003: Planned → Picking
Trigger: Warehouse begins packing.
Preconditions:
box.container_state == 'Planned'cycle.cycle_state == 'Committed'
Actions:
- Set
box.container_state = 'Picking' - Emit event:
BoxPickingStarted
Postconditions:
- Box ready to receive scanned garments
- Garments can transition to
Packed
T-B004: Picking → PackedVerified
Trigger: All planned garments scanned, no variance OR variance resolved.
Preconditions:
box.container_state == 'Picking'box.actual_contentscontains garmentsbox.has_variance == falseORvariance_resolutionprovided
Actions:
- If variance existed:
- Record
PackingVarianceevent with planned vs actual - If
variance_resolution == 'commit_observed': RecordCompensatingAllocationevent - If
variance_resolution == 'corrected': Verify planned == actual
- Record
- Set
box.container_state = 'PackedVerified' - Emit event:
BoxPackedVerified
Postconditions:
- Box contents are final
- Ready for shipment
Error Codes:
E006- Box variance unresolved
T-B005: PackedVerified → Shipped
Trigger: Box handed to carrier.
Preconditions:
box.container_state == 'PackedVerified'box.tracking_outbound != null
Actions:
- Set
box.container_state = 'Shipped' - Emit event:
BoxShipped
Postconditions:
- Custody transferred to carrier
- Tracking available
Error Codes:
E016- No tracking number
T-B006: Shipped → Delivered
Trigger: Delivery confirmation received.
Preconditions:
box.container_state == 'Shipped'- Delivery signal received (carrier or proxy)
Actions:
- Set
box.container_state = 'Delivered' - Emit event:
BoxDelivered
Postconditions:
- User has custody
- Box is with user
T-B007: Delivered → ReturnInitiated
Trigger: Automatic at wear window end.
Preconditions:
box.container_state == 'Delivered'cycle.cycle_statetransitions toReturnWindowOpen
Actions:
- Set
box.container_state = 'ReturnInitiated' - Emit event:
BoxReturnInitiated
Postconditions:
- System expects return
- Reminders scheduled
T-B008: ReturnInitiated → Returning
Trigger: Return pickup/dropoff confirmed.
Preconditions:
box.container_state == 'ReturnInitiated'- Return signal received (carrier pickup, drop-off scan)
Actions:
- Set
box.container_state = 'Returning' - Set
box.tracking_returnif available - Emit event:
BoxReturning
Postconditions:
- Box is in transit back
- Carrier has custody
T-B009: Returning → Received
Trigger: Box scanned at facility.
Preconditions:
box.container_state == 'Returning'- Box barcode scanned at receiving
Actions:
- Set
box.container_state = 'Received' - Emit event:
BoxReceived
Postconditions:
- Box is at facility
- Contents pending verification
T-B010: Received → Reconciled
Trigger: Contents verified against expected.
Preconditions:
box.container_state == 'Received'- All garments in
actual_contentshave been inspected
Actions:
- Set
box.container_state = 'Reconciled' - Compare returned contents to
actual_contents(what was shipped) - If discrepancy: Record
ReturnVarianceevent - Emit event:
BoxReconciled
Postconditions:
- Contents accounted for
- Variances recorded for settlement
T-B011: Reconciled → Closed
Trigger: Cycle settlement complete.
Preconditions:
box.container_state == 'Reconciled'cycle.cycle_stateisSettledorClosed
Actions:
- Set
box.container_state = 'Closed' - Clear
box.cycle_id - Clear
box.planned_contents - Clear
box.actual_contents - Clear tracking numbers
- Emit event:
BoxClosed
Postconditions:
- Box available for reuse
- History preserved in events
Variance Handling
Packing Variance Detection
During Picking state:
- Operator scans garment
- System checks if garment is in
planned_contents - If not:
has_variance = true, records unplanned garment - At pack completion: If
actual_contents != planned_contents, block transition toPackedVerified
Variance Resolution Options
- Correct the pack:
- Remove unplanned garments (transition back to Available)
- Add missing planned garments (scan them)
- Re-verify until
actual_contents == planned_contents
- Commit to observed:
- Create
CompensatingAllocationevent - Record that cycle will ship observed set
- Update fit intelligence to expect observed, not planned
- Proceed to
PackedVerified
- Create
Return Variance Detection
During Received → Reconciled:
- Scan returned contents
- Compare to
actual_contents(what shipped) - If garment missing: Record
MissingGarmentevent - If extra garment: Record
ExtraGarmentevent (wrong box returned?) - All variances trigger investigation workflow
Variance Events
| Event | Trigger | Data |
|---|---|---|
PackingVariance |
Planned ≠ Actual at pack | planned[], actual[], diff[] |
CompensatingAllocation |
Shipping with variance | reason, observed_contents[] |
ReturnVariance |
Returned ≠ Shipped | expected[], returned[], missing[], extra[] |
MissingGarment |
Garment not in return | garment_id, last_known_state |
ExtraGarment |
Unexpected garment in return | garment_id, expected_box_id |