Summary
Cos reported a structural detector defect: state/flotilla-detector-state.json → desk_states is a bare integer per seat with no observed_at / reason / since, so labels cannot be aged. FO verified the bare-int store and corrected the integer mapping.
Verified
- Enum (
internal/surface/surface.go): 3 = StateIdle, 2 = StateWorking — not blocked.
- Status column
blocked is loop_posture, derived when idle + backlog BlockedN>0 + UnblockedN==0 (internal/loopposture/posture.go deriveIdle).
- Live 2026-08-06: six seats with
loop_posture=blocked each still had open ## Backlog [blocked] lines (ledger-consistent). One pattern to watch: an approval-sensitive desk uses [blocked] for “awaiting next dispatch / desk clear”, which freezes blocked posture by construction.
Ask (product)
Must-have for the blocked pulse symptom
- When status shows
blocked, expose why (which backlog markers / counts) — not only the label.
- Optional but high value: posture evidence carries
observed_at + short reason so a blocked label can be aged/audited.
- Document anti-pattern: do not leave meta “waiting for dispatch” items as open
[blocked] if the seat is intentionally idle-available.
Still worth shipping (Cos field ask)
- Enrich detector snapshot
desk_states from bare int → at least {state, observed_at} (reason on transition optional). Do not hand-edit live integers as the fix.
Non-goals
Provenance
- Cos:
flotilla-dispatch-d6182fd4 / productivity residual
- Finding record: a private deployment finding record retained by the operator.
Summary
Cos reported a structural detector defect:
state/flotilla-detector-state.json→desk_statesis a bare integer per seat with noobserved_at/reason/since, so labels cannot be aged. FO verified the bare-int store and corrected the integer mapping.Verified
internal/surface/surface.go): 3 =StateIdle, 2 =StateWorking— not blocked.blockedisloop_posture, derived when idle + backlogBlockedN>0+UnblockedN==0(internal/loopposture/posture.goderiveIdle).loop_posture=blockedeach still had open## Backlog[blocked]lines (ledger-consistent). One pattern to watch: an approval-sensitive desk uses[blocked]for “awaiting next dispatch / desk clear”, which freezes blocked posture by construction.Ask (product)
Must-have for the blocked pulse symptom
blocked, expose why (which backlog markers / counts) — not only the label.observed_at+ shortreasonso a blocked label can be aged/audited.[blocked]if the seat is intentionally idle-available.Still worth shipping (Cos field ask)
desk_statesfrom bare int → at least{state, observed_at}(reason on transition optional). Do not hand-edit live integers as the fix.Non-goals
desk_statesvalues.Provenance
flotilla-dispatch-d6182fd4/ productivity residual