בס״ד

Queue Triage Cadence — design spec

docs/superpowers/specs/2026-05-27-queue-triage-cadence-design.md · last changed (pre-VM history) · rendered from GitHub master

Queue Triage Cadence — design spec

Date: 2026-05-27 · Status: design (build next) · Owner: start-here.gs (the bot)

Sam, 2026-05-27: "Figure out a way of how it's gonna automatically see priorities, follow up, working / not working, late / not late. Best move suggestions. Maybe figuring out or recognizing why I'm procrastinating."

The consolidation (Projects board) is the view. This is the engine that keeps the queue triaged automatically, on the existing pulse cadence — so Sam never hand-sorts 65 cards again. It is advisory and read-only: it suggests and flags, it does not auto-close (per Sam's "close loops but don't risk things on a misread" + Rule 10 sacrificial/dry-run).


1. Signals the bot computes per card

Signal Rule Data needed
Late / not late due date < today AND not done → LATE a due column (or parse "due …" / a date from the title)
Working / idle last Event on this card within N days (default 3) → WORKING; else IDLE Events tab (last-touched timestamp per card_id)
Stalled OPEN + IDLE > 7 days + not DEFERRED → STALLED Events + status
Follow-up due WAITING_ON_OTHER + IDLE > 4 days → NUDGE (chase the other party) status + Events
Dynamic priority base P-level, bumped one notch if LATE or due within 48h due + P-level
Blocked-on-Sam NEED_INFO sitting → feed to proactive elicitation (chip ONE item at a time, card 027-036) status

2. Best-move suggestion

The single highest-leverage card that is doable right now: P0/P1, not WAITING_ON_OTHER, not DEFERRED, not NEED_INFO, oldest-first among ties. Output: "Best next move: #X — ."</em> One move, not a list — kills the choice paralysis.</p> <h2>3. Procrastination recognition (the thoughtful layer)</h2> <p>Recognize the <em>pattern</em>, name it kindly, offer the unstick — <strong>structural help, not nagging</strong> (per <span class="memlink">user_sam_cashflow_diagnosis</span> "structure not character"; don't moralize).</p> <div class="tblwrap"><table> <thead> <tr> <th>Pattern</th> <th>What it means</th> <th>The bot's move</th> </tr> </thead> <tbody> <tr> <td>Card deferred ≥ 3×</td> <td>avoidance or no clear next step</td> <td>"You've pushed #X three times — want me to break it into one 5-minute first step?"</td> </tr> <tr> <td>P0 IDLE while P2/P3s get DONE</td> <td>the P0 is scary/ambiguous → doing easy stuff to avoid it</td> <td>surface it gently + offer to draft the first move (e.g., the Eden detail, the HOA wire steps)</td> </tr> <tr> <td>NEED_INFO sitting</td> <td>waiting on himself</td> <td>proactive elicitation: ask for ONE missing piece, one room/device at a time</td> </tr> <tr> <td>Money/legal card lingering</td> <td>often emotional, not logistical (HOA, Eden, taxes)</td> <td>name the first concrete step + offer to do the part Claude can (draft, schedule, remind)</td> </tr> </tbody> </table></div> <p>Track <code>defer_count</code> per card (increment on each DEFER) to power the first row.</p> <h2>4. Cadence + output</h2> <ul> <li>Runs inside the <strong>existing pulse</strong> (<code>pulseDigest_</code>, every 30 min activity-gated) + a <strong>daily 7 AM</strong> pass that feeds the morning brief.</li> <li>Output = a short triage line, not a wall: <em>"Late: 2 (#016 HOA, #014 1070). Stalled: 3. Best next move: #009 Eden. You keep dodging #016 — 4 days idle, foreclosure clock. Want the wire steps?"</em></li> <li>Surfaces to Telegram (plain ASCII) + the Projects board gets LATE/STALLED/WORKING pills once the data layer exists.</li> <li>Respects Shabbos/Yom Tov silence + the money/legal/family ASK-gate (suggests, never auto-acts).</li> </ul> <h2>5. Data layer to add (the only real prerequisite)</h2> <ol> <li><strong><code>due</code> column</strong> on Action_Queue (optional per card) + a <code>DUE # date</code> command.</li> <li><strong>last-touched lookup</strong> from the Events tab keyed by card_id (already logged — just needs a read+max).</li> <li><strong><code>defer_count</code></strong> column, ++ on each DEFER.</li> </ol> <h2>6. Build order (dry-run first, Rule 10)</h2> <ol> <li>Add the 3 data fields + <code>DUE</code> command.</li> <li><code>triageQueue_()</code> — pure read, returns the signals JSON. Test in dry-run (logs only).</li> <li>Wire its output into <code>pulseDigest_</code> + the morning brief.</li> <li>Add LATE/STALLED pills to <code>build_projects_board.py</code> once <code>due</code>/Events are exposed via the QUEUE/STATE read.</li> <li>Procrastination heuristics last (needs <code>defer_count</code> history to accumulate).</li> </ol> <h2>7. Why this is the cadence, not a one-time cleanup</h2> <p>Consolidation isn't a purge you do once — the queue regrows. The durable answer is a <strong>standing triage</strong> that re-groups (the Projects view), re-prioritizes (dynamic priority), and re-surfaces the stuck/dodged items every cycle. Ties to cards 027-023 (queue hygiene) + 027-038 (bot-as-hub) + the morning spine <span class="memlink">project_morning_execution_spine</span>.</p> </article></div> <div class="foot"><b>Source trail</b> · docs/superpowers/specs/2026-05-27-queue-triage-cadence-design.md @ master · rendered 2026-07-02 7:23 PM EDT by scripts/build-docs.py · the .md in the repo is the truth; this page is the phone-readable view</div> </body></html>