Created
Jun 24, 04:50
Started
Jun 24, 04:51
Completed
Jun 24, 13:45
DevOps handoff
Type
Feature
Shape
ui+db
Worktree Slug
agent-intent-timeline
Repositories
mcritchie-studio
Release Train
2026-06-23-devops-intent-ui
Branch
feat/agent-intent-timeline
Acceptance Criteria
Expected Test Plan
Checks Run
Agent Context
Operator-driven DevOps cycle upgrade. Three decisions locked with the operator: (1) 'agentic intent' (the agent that STARTS a stage's work, for the live ticker) is stored as a new kind ('transition'|'intent') on the existing append-only TaskEvent spine — NOT a separate table or task.metadata. One unified event log powers the consolidated timeline; live tickers read OPEN intent rows (an intent whose stage has not yet produced its transition). (2) Live /deployments updates use a custom ActionCable channel + the existing Alpine kanbanBoard() for animated, non-jumpy updates — that is the SEPARATE follow-up task on this same release train. (3) Split into 2 flat tasks: THIS one = intent model + consolidated timeline + Steffon/Avi fix; the websockets task depends on this one. ROOT CAUSE of Steffon/Avi missing from Stage Crew: bin/release writes the reviewed->assembled and assembled->shipped TaskEvents with a BLANK actor/source, so stage_agent_groups emits nothing for those stages. Fix is two-pronged: stamp actor=steffon on reviewed->assembled and actor=avi on assembled->shipped at the conductor (bin/release), AND make the crew helper fall back to each stage's canonical owner when the actor is blank/unresolved. Intent owners by stage: build lane = the task's pokemon mascot (already assigned at create); submitted->review = the ReviewerSelector pair (carl/shannon heavy/light) recorded when the 'Review submitted PRs' workflow starts; reviewed->assembled QA = steffon; assembled->shipped e2e = avi. seconds_in_from duration math must look back to the last TRANSITION event, ignoring intent rows. Key files: app/models/task_event.rb, app/models/task.rb (stage_event creation ~L520-600), app/helpers/stage_agents_helper.rb, app/views/components/_stage_agent_avatars.html.erb, app/views/tasks/show.html.erb (L207-258 crew+timeline), bin/task, bin/release, bin/reviewer-select, app/controllers/api/v1/tasks_controller.rb.
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.
Increment 1 of 2 (websockets is the follow-up on this release train). Agentic intent on the TaskEvent spine (kind=intent), consolidated /tasks/:id timeline, Steffon/Avi role-owner backfill, + intent wiring (reviewer-select --record, bin/task intent, POST /tasks/:slug/intent). All tiers green (1393 runs, 0 fail), rubocop clean, dor-check ✓. Review locally: http://localhost:3004/tasks/intent-timeline-demo (full crew + tokens/cost), /tasks/intent-live-demo (live review ticker), /deployments (board).
Review cascade: shannon[heavy] APPROVE (migration safe/reversible/indexed, duration-spine protected, no N+1, ui+db coverage complete) + carl[light] APPROVE. Non-blocking nits deferred (kind filters in reviewer_selector/retro). CI green.
Sealed-bid sizing
Edit →Alex (PM)
—
Avi (PO)
—
Dev
—
Actual
—
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.