# W4 #350 lane notes (todlando, 2026-09-27)

Branch `feat/351-w4-shells`, rebased on 5eea489e (W3 green head). Ruling: w4-ruling-picks.md, and RULINGS R5-1.

## Condition 4: the growth number (measured, not estimated)
- **Measurement:** `cargo test -p spt-store --lib shellout -- --ignored --nocapture`
  (`measure_outbound_growth_per_sensory_frame`). 1,000 typical sensory rows, after a WAL checkpoint.
- **Output:** `OUTBOUND_GROWTH frame_bytes=103 op_id_bytes=109 per_row_bytes=274 per_day_at_1hz_bytes=23673600`
- **What it means:** 274 bytes per queued sensory frame. At 1 frame/s during a vacancy that is about 23.7 MB/day, or about 0.99 MB/hour.
- **Outside a vacancy the queue grows by zero.** The fast path ships a payload with nothing queued ahead of it and writes no row, per the unit `submit_ships_at_once_queues_in_a_vacancy_and_keeps_its_op_id`.
- **Rows are kept for audit.** Delivered rows are never deleted, in keeping with the module's posture, and there is no TTL (per the ruling). The growth therefore accrues only from vacancy traffic.

## Deviations from the census picks (each stated)
- **Queue location:** `<owner-perch>/shell-outbound/<shell-id>/spool.db`, not `<shell-perch>/outbound/`. This is how condition 3 is met by construction: `teardown_shell` removes only the shell perch, so the queue survives. The unit drives the real `teardown_shell`.
- **Op id storage:** the op id is stored on the row, in a new nullable `op_id` column on the spool schema. It is minted once, before the first attempt. A held fast-path attempt spools under the same id.
- **Reply-window confound in rig 7d:** W forgets its recent-outbound record before the unstamped probe. Cell 6a's handoff made L→W a "reply" for 15 minutes, which would have admitted the probe past the closed posture.
- **Q3 ruling (a):** sensory frames carry `sent-at`, stamped at emit on the shell node's clock.
- **Rig broker name:** the rig broker now uses the production `endpoint::broker_socket_name()`, so the production shipper reaches it (every cell).

## Evidence
- **clippy:** `cargo clippy --workspace --all-targets -D warnings` rc 0.
- **Targeted nextest:** 75/75. The local vacancy int passed separately, 1/1: the production trigger (`daemon_rest_event` Wake → `cascade_shells_on_edge` → `nudge_drain`) drains in order.
- **Two-host cell 7:** NOT RUN YET (needs the kitsubito rig).
