# W1 dispatch brief — releases#348, instance axes (INSTANCE-AXES #351, greenlit 2026-09-25)

**Lane:** `feat/351-w1-axes` off seed **`54f2b041`** (branch `seed/351-instance-axes`: CONTEXT.md model `3526a2fe` + REQ mints). The seed is NOT on main yet: main is held until v0.73.0 publishes, then the seed lands by ff and your lane sits on top of it unchanged.
**Builder:** todlando. **Rulings:** `.spt/preserved/instance-axes/RULINGS.md` (read it whole). **Model:** CONTEXT.md "instance state", "dormant / suspended instance" (the two-axes block), "resolution policy".

## REQs to activate (lane's FIRST commit)
| REQ | stages |
|---|---|
| REQ-INSTANCE-AXIS-SPLIT | doc, impl, unit, int |
| REQ-ACTIVATION-COUNTER | impl, unit, int |
| REQ-ACTIVATION-TRIGGERS | impl, unit, int |
| REQ-AUTO-SUSPEND-MODES | impl, unit |
| REQ-AUTO-SUSPEND-VERBS | doc, impl, unit |
Amend by replacement in the same lane: REQ-INST-3 (its stage note carries "auto-suspend opt-in default OFF", "detach/attention-shift rest warm" and knob wording are now false). Do not touch REQ-INST-10 (that is #345's lane).

## Ruled — build it, do not re-derive it
1. Controlled axis = attach/detach only; viewers never count. Attach/detach NEVER moves the instance axis. Today's resting table rests warm on Detach: that edge is deleted, not reweighted.
2. Active ⇒ warm AND online. Suspend (manual or `enable` auto-suspend) or node loss of the active instance VACATES active. No auto-pass.
3. Only transition to dormant: a sibling became active (read via the counter).
4. Counter: replicated per-id, highest-seen + 1, tie on node id. Absent field = 0.
5. Triggers: busy report with USER_INPUT (broker.rs:6398 already consumes it); non-busy-only message from a DIFFERENT id; coming warm with no active sibling (boot/wake/attach, no window); explicit wake incl. shell wake-watcher. `api presence` is not a trigger: retire it or document it as such.
6. Auto-suspend {mode, after}: disable / dormant-enable / enable; condition uncontrolled AND idle (activity sentinel) AND (dormant under dormant-enable), unbroken; default {dormant-enable, 15 min}; migrate every existing value to the default. Verbs + bare effective-value print + docs section in instances/overview. Release-note line: auto-suspend turns on fleet-wide.

## Not ruled — decide with the code in front of you, say which and why
- Where the "stealing message" classification is read: at the delivery edge that already knows the window, or at the transition host. One site, not two.
- How a node learns a remote sibling became active fast enough that two instances are never both active for longer than one gossip round — and what the int asserts about that window.

## Pre-flight (standing)
Claim the pool from inside your worktree; census writers before any capture; `cargo check` → targeted units → int; env -u every OWL_/SPT_ var for local suites; stop-and-refer any NEW class of decision. New e2e binaries that autostart a daemon are HEAVY at birth (IR-156 detector will tell you).

## Gate
I gate at your head: compile gate, targeted units, the int (two-host rung for the counter + vacancy), `traceable-reqs check`, `xtask check`. Next in your queue after this: #345 (resolver), then #346 (trust warning → now-signal).
