← Qnative (provisional) · c5

review-2.md

Review stop 2: Activity and the session page (qnative c5, 2026-11-11)

Reader: Mark. What this is: the second of c5's three pages under "This machine" (design c131 D21 S4), built after you walked review-1's calls: every one stood, and the one change you asked for (a stale lock reads as off, 48d97df) is in. Activity is qdash's Activity on one machine, as you chose at the walk: the band, the history and the ledger, with the session page built now rather than later. The captures are in both atlases under thread p2-activity (design de64db8979).

What to look at, in order

CaptureWorldWhat to read
c5-app-activity-meridian-day90-lightnina-mbpThe band: 16 sessions in 30 days, per day with the non-compliant days in the warning tone; tokens and cost by harness (one person here, so the web's Users ⇄ Teams views become harnesses). The usage row: tokens per day for the top providers (inferred, the PROJECTED badge), models and harnesses on the same day columns; the Tokens ⇄ Cost toggle switches all three.
c5-app-activity-pilot-lightpriya-x131 sessions, three harnesses, three providers; the flagged days.
c5-app-activity-minimal-light · -fresh-lightchen-mba · day 0Four sessions with one running; nothing yet, said plainly on every card.
c5-app-activity-ledger-*nina, priyaRecent Work: harness (with the worst flag as a pill), model, tools, session, started, duration (or running), workspace, tokens, spend; the status quick filter, a harness filter and a flagged filter in the bar; a row opens the session.
c5-app-session-meridian-day90-lightninaThe newest session: the harness as the mark and name, the person, the status and the id in the subline, the metadata (Show All Metadata for the account, the id and the command); Transcript ⇄ Surface; the transcript turn by turn with each tool call, its arguments and its result; the raw events behind a toggle; the rail with tokens, est. cost, tool calls and policy events, the harness, account, repo, date and files; then More detail (actions, commands, egress, sensitive files, DLP, models) and the run's Surface.
c5-app-session-flagged-*nina, priyaA flagged session: the policy event counted in the rail; a denied call reads as such in the transcript and the actions.
c5-app-session-minimal-lightchenA running session: the transcript so far, the running pill in the rail.

Try it: cargo run -p app -- --data synthetic, Activity in the rail, the period pill, the Status filter, a row.

What was built

  • The worlds carry every session's detail and Surface (2e9286d): cut-world.py crawls /api/sessions?run= and /api/surface?run= for every session; 112 details across the four worlds, the contract test reads them, the generator keeps an event's open keys ([key: string]: unknown) as a flattened map and reads output as a string or a token count. The worlds grew from 1.1 MB to 2.5 MB (pilot 1.7 MB); the binary follows by about 1.4 MB. Design's copies need scripts/sync-worlds.sh there (call 7).
  • The layer gained DataHistoryGraph: one column per day, lanes side by side or stacked, unit blocks up to a week and bars past it, the nice unit so the tallest column fits 64 px, ticks thinned past fifteen, the legend below; columns shrink to the card and never grow past their natural width. Drawn from flex boxes, so it is themed; no hover tip yet (call 2).
  • Activity (pages/activity.rs): the band, the usage row, Recent Work; the per-day rollup (by_day) anchors the columns on the rows themselves, so they sum to the ledger under any filter, as on the web.
  • The session page (pages/session.rs): qdash's detail page in its five parts, less the Device line and the parked Working section (one machine; the header carries the metadata).
  • Route Activity at /activity, Session(run) at /activity/detail?runId=; the rail's "This machine" group is Status, Sensor, Activity; the app map knows both pages (23); three stories plus the ledger one; the nozzle reads a session and a run's Surface.

Figures

No new strobe reading: the idle re-read owed from review-1 is still owed (you asked to be told when it is convenient to step away), and it should be taken with Activity open as well as Status. The debug build's Activity on pilot reads 31 rows with their charts in one frame; the worlds' growth is the one budget line that moved this step (above).

The wipe

There is no lab mock of Activity yet: c132's session said its mock follows D21 (/pages/native/activity) and will say when it lands; until then the reference is qdash's own page (:3030/activity when the seed runs), from which the fleet → personal translation above departs on purpose.

The calls for you

#CallBuilt asOverturn by
1The band. You asked to see both for a bake-off: with the band (built) and without it (the history and the ledger alone, the counts left to Status's found-here set).with the banda story app-activity-lean for the comparison; say so and it is a small change
2The day tip. The web shows the day's breakdown on hover (compliant · non-compliant; the top three and "other"). Not ported: the native graph has no hover yet.the legend and the provenance line carry the sumsport the tip (a tooltip on each column)
3"Started" against a frozen clock. The ledger says "136d ago" because the world is anchored on 2026-07-01 and the app reads the real clock, as the web does on the same world.as the webshift the world's clock to the launch day at load (synthetic-data.md §Time), or show the date
4Working folded into the header. qdash parks the duration cell and the metadata grid in a Working section "under review"; here the header carries Harness, Repo, Started and, under Show All Metadata, Account, Session and Command; the duration sits in the rail's Date.foldeda Working section as on the web
5The Surface's Person row on one machine (the person is you).kept, as the web's chipdrop it
6The flag pill rides the harness cell (the web rides the flagged filter on the session column with no mark).a pill beside the namethe web's way
7The worlds' size. Every session's detail is bundled (pilot 1 MB); the 30-day window's details would be a third of it.all of themcap the crawl at the 30-day window and let an older row say its detail is not in the world
8D22's connected rule (the plane for what it owns, this machine for what only it sees): the nozzle still serves one source per process; the connected stories read everything through the plane.unchangedthe nozzle's next step, with Connect
9Total Sessions' lanes (from c132's wipe of its Activity mock over these captures): the build stacks each day compliant · non-compliant, as qdash's Activity does (design c110); the lab's mock stacks by harness.by complianceby harness (the lab's), or both as a toggle

The lab's mocks of Status, Sensor and Activity now wipe over these captures on /pages/native/bake-off (c132, after its re-sync); the lab keeps the world's own dates, as the captures do.

Ruled (Mark, 2026-11-11, the walk of the eight calls) and built

#RulingBuilt
1Keep the band; a lean story for the bake-offapp-activity-lean (the usage row and the ledger alone), captured on nina beside the full page (design d963d5a8a4, retaken without its band in 1ce2141fa0)
2The day tip later, with the layer's tooltipsrecorded
3Shift the world's clock at loadnozzle::clock: every ISO date or timestamp in every synthetic answer moves by the whole days from the world's day 90 to today, the time of day kept; the footer says clock +133d. QPOINT_CLOCK=frozen keeps the world's dates. The stories freeze it, so a capture agrees with the lab mock to the digit (D6); app-activity-today shows the shift. c132's lab reads the raw worlds: its useNativeWorld would need the same offset for the wipe to agree on time words (told).
4Working stays folded into the headerrecorded
5The Person row staysrecorded
6The flag pill staysrecorded
7Cap the session details at the 30-day windowcut-world.py crawls the window's sessions' details; the four worlds recut: 1.7 MB (pilot 1.0, nina 0.5, minimal 0.2); an older row's detail answers "not in this world", which the page says plainly; the session stories pick from the window
8D22's connected rule: with Connectrecorded
9c5 re-syncs the lab's world copiesdesign 39953031a8 (scripts/sync-worlds.sh)
10Total Sessions stacks by harness (call 9 above, from c132's wipe)each day stacked by the harness that ran, every harness, most sessions first, as the lab's mock; the flag stays in the ledger's pill and the flagged filter; the Activity thread recaptured (design 705f44ee3f)

Not done, and why

  • The day tip (call 2); the usage charts' "other / not inferred" lane the web adds on hover.
  • A story with a filter applied (the quick filter is the web's, the capture would only show the bar).
  • The strict drift test (--features types/strict) now skips deny_unknown_fields on SessionEvent by design (its keys are open).
  • The lab mock of Activity (c132's); the strobe re-read on an idle Mac.

Qpoint Brand Style Guide