Created
Jun 25, 21:32
Started
Jun 25, 21:33
Completed
Jun 26, 01:50
DevOps handoff
Type
Feature
Shape
ui+db
Worktree Slug
assembled-column-deploy-crew
Repositories
mcritchie-studio
Release Train
—
Branch
feat/assembled-column-deploy-crew
Acceptance Criteria
Expected Test Plan
Checks Run
Agent Context
Board-UI feature on the ASSEMBLED column (primarily the /deployments 6-lane board's assembled lane; mirror on /tasks board cards where it applies). GOAL (operator): when Avi works a deployment, his INTENT shows in the assembled card's crew, and the assembled column becomes a live indicator of WHAT is currently being deployed + by whom. CURRENT BEHAVIOR (read first): app/helpers/stage_agents_helper.rb — crew model has FOUR fixed compartments (Build · Review · Assembled · Shipped) per crew_clusters/crew_columns (~L92-169), BUT a lane only renders when it has entries, and the comment (~L145) says 'Only a shipped task earns the fourth (shipped) lane' — so an ASSEMBLED task renders only 3 clusters (build · review · assembled); the 4th deploy/ship slot is absent until shipped. The avatars partial is app/views/components/_stage_agent_avatars.html.erb; board cards app/views/tasks/_task_card.html.erb + _board.html.erb. TWO-PART FIX: (1) On the assembled column, RESERVE + render the 4th (shipped/deploy) slot even while the task is still 'assembled' (an empty slot reserves its grid column so nothing reflows on hover — match the existing fixed-compartment idiom). (2) POPULATE that slot from the deploy/ship INTENT: bin/task intent --to shipped (or assembled->shipped) --actor <slug> records an agentic intent (an agent STARTING a stage) that already renders for the review pair pre-->reviewed (see reviewer-select records intents + the live-ticker pattern). stage_lane('shipped') already maps a shipped-stage entry to :shipped, so a ship INTENT entry should flow into by_lane[:shipped] — verify the intent->entries pipeline (how intents become crew entries / stage_agent_groups) and ensure a ship intent on an ASSEMBLED task surfaces in the reserved 4th slot WITH a live ticker (live_since), exactly like the build-lane live counter while building. So: Avi (or the conductor at the ship step) records the ship intent -> his avatar + live ticker appears in the assembled card's 4th slot -> visible 'being deployed by Avi' indicator. Per the deploy-flow design, assembled is Steffon's (Platform Engineer) QA lane and shipped is Avi's ship lane — decide whether the 4th slot shows the ship-owner (Avi) intent, or both assembled-owner + ship intent; default to surfacing whoever holds the active deploy intent. TESTS (ui+db shape, component+integration): helper unit — an assembled task with a recorded ship intent yields a reserved+populated 4th cluster (live_since set); board integration — the assembled card renders 4 fixed slots and shows the deploy-intent avatar + ticker. WATCH the board Alpine test gotchas (Nokogiri can't read Alpine @click/x-data; assert on rendered static markup / data-* not Alpine directives) and the x-show-owns-display rule. Match existing avatar/cluster styling; dark-mode parity. Out of scope: changing the deploy flow itself or bin/release; this is display + intent surfacing only.
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.
Review pair APPROVED: carl (heavy) + jasper (light). (a) Reserved 4th slot: assembled yields [build,review,assembled,shipped] -> grid-cols-4; empty ship intent = dashed crew-empty placeholder, no reflow; blocked stays 3 lanes. (b) Ship intent fills live: in_progress_work resolves NEXT_PIPELINE_STAGE[assembled]=shipped, intent_stage_agents resolves actor (avi) or STAGE_OWNER backfill, live_since=intent time; Playwright e2e proves in-place fill, no reload. CRITICAL (verified at source): purely additive — record_intent_event only inserts a child TaskEvent (never assigns stage), sync_session_mascot double-gated (stage-change + BUILD_STAGES) so never fires; deploy face is the intent actor, never the mascot; preservation tests at helper + integration tiers (devops hash + mascot survive verbatim). CI green on head e1ea93f. Non-blocking: checks_run fingerprint cites a pre-squash SHA — Steffon re-stamp on assembly.
Merge conflict vs origin/release after release-mascot-and-timer landed (overlaps e2e/seed.rb + core release models). Rebase feat branch onto origin/release, resolve, push, re-submit — approvals still stand pending a clean rebase.
Merge conflict resolved. A parallel conductor session merged #207/#209/#211/#212/#213 into origin/release while this review batch ran; #210 then conflicted ONLY on the shared e2e/seed.rb fixture (vs #212's release-card seed). Merge-forwarded origin/release into the branch, resolved e2e/seed.rb keeping BOTH demo seeds (deploy-crew-task + release-mascot Pokemon/Release) with a single superset puts; ruby -c clean, pushed 2ef555b (CI re-running). Feature code (helper/avatars/tests) untouched by the merge. Restoring to reviewed (was carl-heavy + jasper-light APPROVED). NOTE: an active RC rel-20260625-c1a9ad (5 mcr + 1 turf) is assembled by the other conductor WITHOUT #210 — merging #210 now would reopen it; hold for coordination.
Sealed-bid sizing
Edit →Alex (PM)
—
Avi (PO)
—
Dev
—
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.