qdash TODOs — 2026-10-01 review
Execute Mark's 2026-10-01 product-review notes for `/activity` through `/todos`
Why
The 2026-10-01 review rebuilt Activity's overview. Two cards go: Sessions and Harness Installs. The per-day sessions chart moves up beside Tokens and Cost, and the usage charts switch from counting sessions to counting tokens. c103 is closed, so this sheet gets its own cycle.
Objective
- Ingest the
/Activitysection of the 2026-10-01 block. - Write one plan under
todos-2026-10-01/, with decisions and defaults. - Execute it: preview, then executor, then review.
Scope
- qdash: the Activity page (
pages/activity/index.vue,components/team/Sessions{Band,History}.vue),lib/actor-bands.tssessionsBand/usageByDay,composables/team/sessions.ts. c109's index Activity micros (lib/index-micros.ts) follow the band. - Out: the sheet's
## Organizationsection. Mark asked for/Activityonly, and that section's "rollup all the DataMachines" idea overlaps c109's index.
Key Changes
todos-2026-10-01 planned (2026-10-02): journal 2026_10_01, /Activity section. This produced 1 plan under todos-2026-10-01/: 01-sessions (Activity becomes two rows of three — Total Sessions · Tokens · Cost / Providers · Models · Harnesses by tokens ⇄ cost; Sessions and Harness Installs archived; Tokens and Cost get Users ⇄ Teams). No sweep. Mark, 2026-10-02: the Sessions card's child notes (Total Sessions, compliant / non-compliant) came before the call to nix that card; the per-day "Sessions started" chart is what moves up as Total Sessions, its lanes read compliant · non-compliant; row 2 is Providers · Models · Harnesses, with one Tokens ⇄ Cost toggle for the row; Tokens and Cost each get their own Users ⇄ Teams toggle. Baseline todos-2026-10-01/baselines/sessions{,-full}.png.
todos plan 01 executed (2026-10-02): Activity (todos-2026-10-01/01-sessions.md; no twin record). Row 1 is Total Sessions · Tokens · Cost: the Sessions and Harness Installs cards are archived (and useInstallationList left useSessionList with them); the per-day chart moved up from the history row as Total Sessions — val = sessions, provenance "N running" (+ the newest-200 cap wording), lanes compliant · non-compliant (keys stay clean / flagged), its day hover moved with it (TeamSessionsDayTip, shared with row 2). Tokens and Cost each carry their own Users ⇄ Teams toggle in #title-right: sessionsBand now sums per user (local part only — the harness left the label) and per team (teamOf from /api/teams via teamByUser; no team or no user → unassigned), provenance "top 3 users = N % of tokens" / "top 3 of 4 teams = N % of cost". Row 2 is Providers · Models · Harnesses as "Tokens per day" / "Cost per day" behind one Tokens ⇄ Cost toggle: usageByDay and byDay take an optional valueOf (default 1, so other callers are unchanged), lanes rank by that sum, topPct is a share of it, and dayTotals lets the hover's "other / none" make the day add up. Seed values confirmed in the pane — 7d: 52 sessions, 1 running; Tokens 24m, Users wei 3.3M · elena 3M · omar 2.5M (37 %), Teams Payments 8.1M · Data 5.6M · Frontend 5.3M (79 %); Cost $331, Users elena $70.25 · priya $57.05 · wei $37.65 (50 %), Teams Payments $156.22 · Frontend $69.86 · Data $63.06 (87 %); Models by tokens sonnet-4-6 · gpt-5.5-codex · haiku-4-5, by cost sonnet-4-6 · haiku-4-5 · opus-4-8. 30d: 200 sessions (newest 200); Tokens 93.6m, Users marcus 12.1M · wei 11.4M · tomas 10.2M, Teams Payments 38.1M · Data 21.9M · Platform 20.1M; Cost $1.5k, Teams Payments $699.26 · Data $316.64 · Frontend $244.50; Harnesses by cost Claude Code · Cursor CLI · Codex CLI (by tokens Claude Code · Codex CLI · Cursor CLI). Each Users ⇄ Teams toggle moves only its card, the row toggle moves all three descriptions / lanes / hovers, Cost still links to /cost, flagged=1 narrows every number (7d: 7 sessions, 3.3m tokens, $37). 01.6 needed bars: the plan's premise was wrong — under legendBelow DataHistoryGraph sizes its columns area to its natural width (~890 px at 30 days) and its shrinkable columns never shrink, so the charts broke out of their thirds; new TeamSessionsDayGraph keeps blocks up to 7 days and past that draws bars with 2 px day gaps, its own wrapper (w-0 min-w-full) keeping the natural width out of the card's min-content, and scoped rules holding the columns area to the card and letting thinned tick labels spill (tick labels only — LAYER-CANDIDATE: a fit prop). Index: c109's Activity micros follow the band, 8 → 6 (Total sessions · Tokens · Cost on the Users view · Providers / Models / Harnesses used on the tokens lens); / shows 52 · 24m · $331 · 4 · 7 · 6 at 7d. Tests npm test 586 → 587 + bible-check clean (installs + status-segments specs out; users/teams, tokens ⇄ cost ranking, usageByDay valueOf, compliant labels in). Decisions on their defaults: 01.1 Active Sessions not built (README Later), 01.2 user only, 01.3 UxTabGroup, 01.4 val = sessions with "N running", 01.5 row toggle right-aligned on its own line, 01.6 bars past 7 days (see above), 01.7 index 8 → 6. Mark, 2026-10-02, during the run: the toggles are black and white and shorter — UxTabGroup's definition changed in the layer (py-0 text-12 on a leading-5 line; selected bg-content text-surface, others transparent text-content, border-content; unreleased; dist waits on the release); a full-width hairline under row 2's toggle line (the page header rule's edges, 8 px above the row's titles); legend labels ellipsize again (the fit-graph tick rule had caught them). After shot todos-2026-10-01/after/sessions{,-full}.png; atlas pair public/cycles/design/c110-todos1001-sessions-{before,after}{,-full}.png (subject page/sessions). Committed qdash bd33012f (feat/new-pages, not pushed; dist not regenerated — the published layer 0.9.28 lacks the new UxTabGroup look), layer 85f9edb (main, not released), design registry description + this record in the design commit.
todos plan 01 corrected (2026-10-02, Mark): Mark, 2026-10-02: at 2k+ sessions (simulated) — the charts get a max height — DataHistoryGraph maxHeight (opt-in), 64 px on Activity (one constant, MAX_HEIGHT in TeamSessionsDayGraph; the unit coarsens so the tallest column fits — real seed 7d 48 px, 30d 28–56 px; sim 7d 44–56 px, 30d 44–52 px; never clipped). Total Sessions stacks compliant / non-compliant (DataHistoryGraph stacked, opt-in; row 2 stays side by side), $ amounts ≥ $1k get separators and drop cents (fmtMoneyBar in moneyShare, so every listing's ranked money bars: $3,409, $70.25). Mark, 2026-10-02: a dev-only ?sim=1 on Activity, ~2.6k sessions cloned from the seed (display testing; seed and cap untouched) — lib/session-sim.ts (2,556 over 30 calendar days, one 260 spike, ~15 % non-compliant, 14 running, deterministic, spec'd) behind a transport swap in useSessionList gated on import.meta.dev; a SIMULATED badge and subtitle in the header, no "newest 200" provenance, a simulated row opens the served session it was cloned from; the index keeps the real feed. At sim 30d: 2.6k sessions, Tokens 1.2b, Cost $19k (Teams Payments $8,849 · Data $4,167 · Frontend $3,003). npm test 587 → 593 + bible-check clean. Committed qdash 747d21e7 (2k fixes) + f6025fd4 (sim), layer bf5b909 (stacked + maxHeight, not released — 0.9.29, released meanwhile, carries the UxTabGroup look but not these), design registry + demo (stacked and maxHeight scenarios) + this line. Dist not regenerated (needs the layer release).
todos plan 01 shipped (2026-10-02, Mark: "make it so"): layer release, qdash dist, recapture. The v0.9.30 tag (d2642dc, DataHistoryGraph stacked + maxHeight) was pushed but never started a publish run, so 0.9.30 is not in the registry. Another session's v0.9.31 (3e060fd, DataRankedBars labelWidth 'auto') sits on top of it and is the published release carrying both props; that session committed all six consumer lockfiles at 0.9.31 (design efb2e7858, qdash 055e1365, bob-wire 2a42f56, app.qpoint.io f5faf10, www.qpoint.io 7b9c975, qflow e0e76f6; none pushed). qdash dist was regenerated against the published 0.9.31 (39782184 on feat/new-pages, not pushed). Checked that the build leaves out the dev-only ?sim=1: import.meta.dev compiles to sim:!1, simulateSessions/simWindow are tree-shaken, and only the dead badge-text branch and the sim_of ?? run_id fallback remain. The :3030 dev server was restarted in place (nuxt.config.ts touched, no content change) because its watcher was stale. The after shot was recaptured (todos-2026-10-01/after/sessions{,-full}.png: stacked Total Sessions, 64 px cap, black-and-white toggles, hairline), and the published c110-todos1001-sessions-after{,-full}.png were overwritten in place (manifest entries unchanged).
Outcome
(open)
Visual record
4 captures — heroes, page slices, and full-page renders. Click to view.



