Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
d2b3a95 · 2026-09-26 · dotbar: hide dead sessions from ALL panels (colour groups + parked), fix claude.exe liveness, never hide parked tickets (TK-12236, TK-12174)
- isClaudeComm accepted only /claude(\s|$)/, so the native installer's .../bin/claude.exe
made a LIVE parked tab read as 'recycled' and vanish; now claude/claude.exe/node/codex
- filterSessions: same ps probe drops dead-tty rows from the colour groups; ps failure = fail-open
- parked TICKETS are never hidden (always-show rule); closed -> liveness 'closed', off-board -> unknown
- negative tests: fake dead tty hidden, live kept, unknown kept; mutation-verified red
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GEE4jWy9RBmz5QnR2xcvno
a5d20f8 · 2026-09-25 · bar: add dw / non-dw ticket chips under the five state chips
Same active population cut by business instead of state (dw + non-dw == the five
state counts, asserted). Segmentation copies the Fleet board's classifier verbatim;
a test re-reads board.html and fails on drift. Offline board -> both read '-', never 0.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AeMJYTDYXnN6A6A1mW7Yud
7010761 · 2026-09-25 · dotbar: start-bar comment now says Jev paid is ARMED (Steve 2026-09-23, TK-12078)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RyJoXLrB22bwqavSf2ex1S
426230a · 2026-09-25 · dotbar: document claimed-vs-unclaimed bg-spare liveness + negative test (TK-12236 contrarian follow-up)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RyJoXLrB22bwqavSf2ex1S
9053da3 · 2026-09-25 · dotbar: DW / Non-DW folder chips scope the bar to one folder (TK-12234)
Server tags each live + parked session with realm (dw|other) from the ticket's
project/title, then the doing label, then the claude cwd (realm.js, incremental
index of the tk event log). UI adds 📁 DW / 📁 Non-DW chips; picking one filters
every colour chip, dropdown, parked item and the live total. Persisted in
localStorage. Tests incl. a negative case (never a false DW).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BhKndRAeekFseXqd9WFzYA
fde99cb · 2026-09-25 · dotbar: always show every state — all 5 ticket states + all colour groups, offline shown not hidden
Steve 2026-09-25: "nav bar should be including all from orig nav bar... blocked, parked,
doing, idle etc., remember!!" The original Swift TicketBar kept its state tiles up
permanently; the Electron port hid zero-count states AND hid the whole ticket row when
the board was unreachable. After this morning's reboot pm2 came back empty, ticket-board
(:9794) never restarted, and every ticket chip silently vanished.
- ticket-states.js: blocked/open/idle/doing/parked always rendered; three states per chip
(measured / measured-zero dimmed / NOT-measured "–" + offline), never a fake 0.
- server: tickets snapshot carries ok:false on a failed fetch; /api/tickets returns states.
- colour groups: every real colour always shown (zero dimmed, no pulse); only 'no dot' hides.
- tests: healthy + 2 negative fault-injection cases (board never fetched / went down).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bo75Y1rV4if7AbvCEQohXT
c915cfa · 2026-09-25 · dotbar: boot guard uses process.versions.electron (require.main!==module under Electron left the bar windowless) (TK-12225)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0161EawVb2Kb9BdpD5NGbtN3
4f3c60e · 2026-09-25 · dotbar: floatingPosFor falls back to orphaned display pos on macOS display-ID churn (TK-12225)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0161EawVb2Kb9BdpD5NGbtN3
a32c6bf · 2026-09-23 · dotbar/jev: isolate tests from real cost ledger + reconcile paidCallsToday to the enforced count
Verification caught two defects in the count-cap change:
- Tests exercising the paid-log path called the real defaultLogSpend -> cost-tracker
log.js -> the REAL ~/.claude/cost-ledger.jsonl, writing phantom typesafe_jev rows
on every `npm test` (no money spent — mock transport — but polluting prod data and
pre-consuming the live caps). Fix: every paid-firing test now injects a mock logSpend
via the opts DI seam. Proven: full suite writes 0 rows to the real ledger (line count
unchanged across a run). The 7 rows already written were backed up and removed (rest
byte-identical).
- /api/jev showed paidCallsToday:0 while the ledger held 7 rows — the displayed stat
(a per-refresh snapshot, only set when armed) diverged from the value the cap enforces
(countPaidCallsToday). Fix: getStats() now derives paidCallsToday LIVE from the same
ledger (shared defaultReadLedger), so displayed == enforced regardless of paidEnabled;
a fail-closed read surfaces as null. Added an observability regression test.
13/13 pass. Bar re-verified: paidEnabled:false, paidCalls:0, paidCallsToday:0, $0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1ab5eb8 · 2026-09-23 · dotbar/jev: price-independent daily call-COUNT cap as the real paid backstop
The dollar cap sums the ledger at a PLACEHOLDER $0.001/call rate, so with the
real TypeSafe price unknown it may never trip under cache-gated volume —
effectively uncapped in real dollars. Add maxPaidCallsPerDay (default 800, env
DOTBAR_JEV_MAX_CALLS) that bounds worst-case spend to (calls x unknown price)
regardless of the rate. countPaidCallsToday() counts today's app+api ledger
rows, fail-closes to Infinity on any read error, composes with the dollar cap
(paid fires only if under BOTH), reserves in-loop so a burst within one refresh
can't exceed the cap, and surfaces paidCallsToday/maxPaidCallsPerDay/
countCapBlocked on /api/jev. start-bar.command stages the arm flags OFF
(DOTBAR_JEV_PAID=0, auto-snapshotted in de2776c). Negative tests prove the
guard goes red on injected at-cap + burst faults and countPaidCallsToday
fail-closes; 12/12 pass. No paid call fired; bar stays on the $0 builtin.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d56df0f · 2026-09-23 · dotbar: mark orphaned sessions (live claude, no iTerm2 tab) so open-terminal only shows for focusable tabs
Cross-references iTerm2's attached-session ttys (split-pane-safe index walk) against
allcolordots' process-based live list. Rows whose claude survives under iTermServer with
no tab now render 'orphaned - no tab' instead of a dead-end 'open terminal' button.
Fixes 'open terminal never works' (79% of rows were orphans).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cf77e2f · 2026-09-23 · Jev classifies dotbar dot colors ($0 builtin default; paid TypeSafe flip gated off)
Re-decide each active terminal's displayed dot color through a Jev-style typed
choice at the dotbar's own getDots() seam. allcolordots.sh is untouched (no fleet
regression); Jev unavailable/capped/errors falls back to the heuristic color.
$0 builtin classifier by default; paid path unreachable unless DOTBAR_JEV_PAID=1
and provably under a $5/day cap (fail-closed). Per-terminal state-hash cache gates
reclassification to real transitions only. /api/jev exposes the counters.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019excZ7L7VE14hbPqKQqH3i
26f22db · 2026-09-23 · dotbar: ticket states as vertical chips with right-edge labels
Render blocked/open/idle/doing/parked as individual vertical .chip elements
(colour dot + count left, state word pushed to the right edge via margin-left:
auto) matching the colour-dot chips above, replacing the cramped horizontal
🔴/⚪/⚫ segment footer. Only non-zero states show; each still opens the Fleet
board filtered to its section. Moved into the top cluster (before the spacers)
so they read as a continuation of the list, not a bottom footer.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019excZ7L7VE14hbPqKQqH3i
385c3af · 2026-09-23 · dotbar: free-position persistence — bar stays where dragged, across restarts (TK-12072)
Steve: "once moved, keep the nav bar where relocated" → free-position mode.
electron-main.js:
- .barcfg gains floating(bool) + pos(displayId→{x,y,w,h}); readCfg defaults both
cleanly so an old .barcfg still loads docked (backward-compatible).
- per-window 'moved' listener flips floating on and saves getBounds() once the bar
leaves its docked spot by >4px; a programmatic-move guard (progUntil, 250ms window
around every internal setBounds via setWinBounds) plus a docked-divergence check
stop our own setBounds from being mis-captured as a user drag.
- boundsFor returns the saved pos (clamped to the visible work area) while floating
and never re-snaps; createBarFor opens at the saved pos; off-screen/gone-display
positions clamp back on-screen so the bar is always grabbable.
- pollAutohide no-ops while floating (no edge to slide to).
- setOrientation/cycleOrientation exit floating and re-dock to the edge (escape hatch).
- grip setters (setBarH/W/Len) patch the saved pos w/h so a floating bar resizes and
remembers its size; flushCfg on before-quit so a drag-then-quit isn't lost.
start-bar.command: drop a stray DOTBAR_DEBUG=1 an auto-snapshot committed mid-test.
Verified by cycling the live launchd app: floating restores at exact (800,400,520,48);
docked cfg still edge-snaps ignoring pos; off-screen (5000,5000) clamps to (2040,957).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019excZ7L7VE14hbPqKQqH3i
25e5616 · 2026-09-23 · Harden ram-sniper toggle + ticket-fetch resilience (TK-12071 test findings)
Fix #2: resolve the ram-sniper daemon by exact PID (a shell interpreter
executing the script) and kill by PID, replacing the broad `pkill -f
bin/ram-sniper.sh` that SIGTERM'd any process merely mentioning the path
(editors, pgrep shells). See pgrep-f-matches-own-watcher-shell.
Fix #1: keep-last-good in getTickets/refreshTickets, mirroring getDots.
A dead ticket board makes curl return '' which JSON.parse('[]')'d cleanly
to [] and zeroed every count; now an empty/unparseable body returns null
and the last-good snapshot is kept instead.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019excZ7L7VE14hbPqKQqH3i
36f503b · 2026-09-23 · dotbar: fix ticket-segment clicks — Electron can't window.open() an external URL; POST to /api/open-board which shells to macOS open (same pattern as reveal)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
fa6b41e · 2026-09-23 · dotbar: each ticket state (blocked/open/idle/doing/parked) is individually clickable → loads that filtered Fleet board section
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
0347444 · 2026-09-23 · dotbar: ticket summary centered in the middle band, 5 live states (blocked/open/idle/doing/parked), fix auth + 8MB buffer for the 4.5MB board payload
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
4ad7b46 · 2026-09-23 · dotbar: merge ticket-board summary (BLOCKED/DOING/OPEN counts) + retire TicketBar (launchd bootout, code preserved)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
b05080a · 2026-09-23 · dotbar: RAM chip shows real memory pressure, not cache-inflated used% (96%->44%) + green/amber/red bands
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
fa809cb · 2026-09-23 · dotbar: visible dotted resize grip + one-click Compact/Full toggle button
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017VyZZwbLBMfoBmdLGuxBuD
60eea92 · 2026-09-22 · Fix RAM missing on the bar: move RAM/CPU readout into the always-visible left chip cluster
The bar is a right-docked vertical strip; the RAM chip was in #meta (bottom of
the column) with RAM/CPU as a split .cnt/.nm pair, so RAM clipped while CPU showed.
Now it sits with the dot chips (top of the strip) as one atomic .cnt span
(🧠 RAM% ⚙ CPU%), plus the 🔫 ON/OFF toggle. Verified rendering on both displays.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AztR94xH5K8nBe9ssBoagG
34abb18 · 2026-09-22 · Add RAM Sniper to the nav bar: live RAM%/CPU% chip, ON/OFF daemon toggle, top-hogs dropdown
- server.js: /api/ram (top -l1 + sysctl + ps, zero-dep, cached 2s) and
POST /api/ram/toggle (start/stop ~/bin/ram-sniper.sh, pgrep-f path-qualified)
- index.html: 🧠 RAM% ⚙ CPU% chip in #meta, 🔫 ON/OFF toggle, click-to-open
top-memory dropdown reusing the existing panel pattern
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AztR94xH5K8nBe9ssBoagG
b102cca · 2026-09-20 · desktop-dotbar: collapsed PARKED chip/panel from the durable registry
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QZehHfR2cgtmFvznNavrn5
d88f4e1 · 2026-09-17 · dotbar: horizontal contract/expand for the top bar (right-end length grip)
Top bar was locked to full screen width. Add a left-anchored barLen config +
setBarLen IPC (main+preload) and a top-only right-end #gripx (ew-resize) that
drags the bar's horizontal span; snaps back to full at the screen edge, clamped
per display, persisted in .barcfg. Side docks unchanged (main #grip owns width).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mx9jXp5vC4sft858UfivPN
2415402 · 2026-09-17 · chore: v1.1.0 — nav bar edge auto-hide + orientation toggle (session close)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017XJaU3fPAuhfFTynAAJmev
62b3811 · 2026-09-17 · dotbar (TK-11885): edge auto-hide + top/left/right orientation toggle
Both nav-bar behaviors Steve asked for, in the in-scope Electron app:
(a) EDGE AUTO-HIDE — 📌 Pinned / 👁 Auto-hide toggle. When on, each strip
slides off its docked edge leaving a 3px peek and slides back in when the
cursor hits that edge. Cursor-polled (screen.getCursorScreenPoint every
110ms) because the panel is non-focusable, so DOM hover can't see an
off-screen bar; hysteresis via a 320ms hide-grace so it doesn't flap; an
open dropdown or an active grip-drag pins it open.
(b) ORIENTATION top<->left<->right — one-click dock cycle, so a SIDE bar can
be reverted back to a TOP bar. Side docks render the strip as a vertical
column (chips stacked, controls at the bottom), grip becomes an ew-resize
width handle; prefs persist to .barcfg.
Default state (top + pinned) is byte-identical to prior behavior — the
auto-hide poll early-returns when off, so no regression at rest. All 18
orientation x open x hidden bounds combos verified on both displays.
Reversible, local Electron/CSS/JS only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017XJaU3fPAuhfFTynAAJmev
534bea8 · 2026-09-16 · dotbar: surface Arrange outcome on the button instead of swallowing errors
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MtzMyVz6sH79QSHLZzQMEZ
2f67aa2 · 2026-09-16 · dotbar: render a strip on EVERY display (Arrange button reachable on both monitors)
One BrowserWindow per screen, pinned to each display's top edge; dropdown-open tracked
per-window, grip-resize applied to all; rebuilds on monitor plug/unplug. (Steve 2026-09-16)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Szengr4hMUDtYdw3jSCfA
71dbcd1 · 2026-09-16 · dotbar: add top-strip Arrange button — one-click re-tile every screen via the dot-screen router
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Szengr4hMUDtYdw3jSCfA
0d25ad6 · 2026-09-16 · dotbar: drop bare-Tab global resize hotkeys; keep drag grip (DTD-D 2026-09-16)
A bare Tab/Shift+Tab registered via Electron globalShortcut is consumed OS-wide
while armed, so Tab silently died in the focused app whenever the mouse hovered
the top-of-screen strip; mouseleave could also be missed, leaving Tab hijacked.
An informed DTD panel (Claude+Codex+Qwen unanimous) chose D: remove the keyboard
path entirely since the drag grip already covers resize, eliminating the whole
bug class (no global shortcut, no arm/disarm state).
Also:
- perf: setBarH no longer writes .barh to disk or re-asserts always-on-top on
every pointermove during a grip drag; disk write is debounced to drag-settle.
- grip hit target: anchor the grip fully inside the closed-bar window so it isn't
a ~4px sliver (it's the sole resize affordance now).
- gitignore the runtime .barh file (its sibling .port was already ignored).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FFLLQmm7wJFvyHQkBb5Y21
f72f77b · 2026-09-16 · dotbar: keep-last-good so a slow/empty scan never flaps the live count to 0
The allcolordots scan can take 60-90s on a loaded box with many sessions; a timed-out
or empty scan returns 0 rows and was overwriting the good snapshot with total:0 (the bar
flipped back to '0 live'). Now refresh() only replaces the snapshot on a real result (>0)
or the first run, and the execFile cap is 120s. The bar holds the last good count between
slow refreshes instead of zeroing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AuZ7T3ffxRGXj5rrwgbquD
ef1d433 · 2026-09-16 · dotbar: fix '0 live' (scan timeout) + resizable bar (drag/Tab/Shift+Tab)
- 0 live: allcolordots --json takes ~9s but server execFile cap was 8s -> every
refresh timed out -> empty -> '0 live'. Bumped to 25s. Now shows 48 live.
- Resizable strip: drag the bottom grip (screen-Y absolute setBarH), or Tab=expand /
Shift+Tab=contract while the pointer is over the bar (hover-scoped globalShortcut so
Tab isn't hijacked fleet-wide). Height clamped 22-140px, persisted to .barh.
- Launcher: start-bar.command used `command -v node` which is empty under launchd
kickstart (no homebrew in PATH) -> server never started on a launchd restart. Added
absolute-path fallback so launchctl kickstart works.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AuZ7T3ffxRGXj5rrwgbquD
aa5dd2c · 2026-09-15 · TK-11794: pulse the 4 needs-Steve dots on the bar; green/pink stay solid
The REAL visible pulse (Steve 2026-09-15 dot-flash directive): a CSS @keyframes
dotpulse animation on the always-on-top bar — one already-running process animates
the waiting rows, no per-tab background loop. WAIT set {lightblue,orange,purple,
yellow} (exact match to server.js /api/dots color keys) gets .pulse on both the
bar chip .dot and the panel-row .rdot; green/pink are excluded so they render
solid. Respects prefers-reduced-motion (animation:none). Verified live on :9787
(HTTP 200, a lightblue session present and pulsing).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HKMY3eXqwFUCfqDShfUVnH
ca97694 · 2026-09-15 · Gate dbg() debug.log writes behind DOTBAR_DEBUG=1 to prevent unbounded log growth
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pnon7dut9MfPekhhm9YY4Q