Created
Jul 05, 21:41
Started
Jul 05, 22:54
Completed
Jul 06, 00:49
DevOps handoff
Type
Feature
Shape
ui-only
Worktree Slug
agents-activities-page-redesign
Repositories
mcritchie-studio
Release Slug
—
Branch
feat/agents-activities-page-redesign
Acceptance Criteria
Expected Test Plan
Checks Run
Agent Context
Reimagine /alex/heartbeat/activities as a new /agents/activities page (collection route on agents resource; param :slug would otherwise swallow it). Operator decisions: (1) KEEP the old heartbeat pages untouched, add new alongside. (2) Mobile = priority columns: agent+activity always visible, cost/details/grades collapse behind a per-row expand on narrow screens. (3) Filter = multi-select OR, URL-saved (?sessions=slug1,slug2; empty=all). (4) Action rows: clean key-method chip in Action column bottom, raw tool-input JSON in Details column bottom. ACTIVITIES TABLE — 6 cols x 3 sub-rows: [Agent] avatar+name stacked (reuse heartbeat_agent_cell: soul face over base Pokemon mascot). [Activity] top=category badge (Explore/Verify...) + goal (reason_slug e.g. 'Read qa-release SOP before sweep'); middle=arrow + result (outcome_slug) wrapped in components/overflow_fade (fade/marquee); bottom=key command chip (key_method) if present. [Cost] top=cost, middle=model, bottom=tokens (in/out). [Details] top=timestamp (Jul 5, 20:24) + done/open badge; middle=task slug; bottom='X actions' + spinner if activity still open (closed_at nil). [Alex grade] + [McRitchie grade] identical: Good/Not radio + (x) nullify; notes occupy bottom two sub-rows. Reuse ActionGrade (grader alex/mcr), existing grade endpoints + _activity_inline_grade/_activity_grade_mark partials. ACTION DRILL-DOWN (click activity to expand, Alpine, preloaded) — mirrors activities but: [Agent] same. [Action] TWO sub-sections: top = '#<seq> <KIND>' badge LEFT of summary (e.g. 'Search deployments view for wrap-related classes'); bottom = primary command = clean key_method chip. [Cost] TWO sub-sections: top cost, bottom tokens (DROP model). [Details] top='#<seq> <KIND>' + [ok] outcome badge; bottom = raw tool-input JSON (input field, Image #4). [Alex]+[McRitchie] grade cells persist on actions too (ActionGrade agent_action_id target already supported; render inline, no migration). SORT: activities AND actions newest->oldest in all views (actions currently chronological in expand — reverse). FILTER SIDEBAR: opens a panel listing all Pokemon sessions (SessionMascot: session_id, mascot_slug; use session_mascot_labels + pokemon avatars). Click to add/remove session filters; multi-select OR; state in ?sessions= URL param. Combines cross-session all_activities + per-session filtering into one UI. Shape ui-only (no migration; grades already persist). Reuse AgentActivity/AgentAction/ActionGrade models, heartbeat helpers, overflow_fade component. Build in ONE worktree with parallel agents on disjoint partials: A=_activities_table, B=_action_row, C=_activities_filter, D=responsive CSS. Tests: integration (route renders, ?sessions filter narrows, action expand) + view-component (table + action-row partials) + helper unit.
Stage Timeline
Who handled each stage, the time it took (measured), and the model / tokens / cost reported (best-effort) — plus who's on it right now. — means the agent didn't report that metric.
Conversation
QA review feedback, agent handoffs, and follow-up notes for this task.
Avi review APPROVED (shannon primary UI + carl light backend) → reviewed; ready for Steffon qa-release sweep. All 7 acceptance bullets met on HEAD 7c677a36. Backend PASS (Carl): collection route beats :slug member (assert_routing green), newest-first ordering enforced in the query at BOTH levels (activities + grouped actions), multi-select ?sessions= parse is safe/parameterized (empty=all), action-grade intent=clear mirrors the shipped activity clear (idempotent, grader-guarded, rescue_and_log), heartbeat regression clean (6 methods MOVED verbatim into ActivityFeed concern, no shadowing; only heartbeat_controller.rb/heartbeat_helper.rb/routes.rb touched — no heartbeat views/routes changed). UI PASS: strong primitive reuse (heartbeat_agent_cell +size param, components/overflow_fade, key_method_chip), Alpine clean (double-quoted x-data, x-show owns display, no <template x-if>, action-row inherits parent open via stacked scope, @click.stop on grade cells, filter uses @click backdrop not @click.outside), table-layout:fixed kills the expand column-jump, mobile .aa-collapsible hides cost/details/grades behind the row-tap reveal. NOTE (non-blocking): bin/dor-check reads STALE because the local full-suite cert tree (3524feeb) predates patches 3-5; GitHub CI test job (full rails test + test:system, superset of local full-suite which skips the system lane) is GREEN on the exact HEAD 7c677a36, which supersedes the stale local fingerprint — builder may re-stamp the cert but the sweep re-verifies on QA. Optional test top-ups Carl flagged: intent=clear invalid-grader 422, idempotent clear (no grade), and the sessions[]= array-param filter form (only comma form tested). Minor UI polish for a later pass: drill-down/mobile-detail rows lack x-cloak so all rows briefly render expanded pre-Alpine-hydrate (transient FOUC); session_filter_options runs unscoped GROUP BY on every load (fine at ops scale).
Sealed-bid sizing
Edit →Alex (PM)
—
Avi (PO)
LARGE
Dev
LARGE
Actual
XL
We emailed a one-tap sign-in link to . It expires shortly and can only be used once.
No email? Check spam, or close this and try again.