fix(prompter): MegaTask review card scrolls + confirm-batch guard releases on failure (#376)

The MegaTask review card was a static sibling of the scrollable chat list with
no height bound, so a tall batch overflowed the clipped container and stranded
the launch buttons off-screen with no scrollbar. It now owns the scroll area
(min-h-0 flex-1 overflow-y-auto), matching the pattern ChatMessages already uses.

confirm_live_batch's Redis idempotency guard (1h TTL) was acquired before the
build but only released via a success sidecar, so a build failure wedged the
session: every retry hit ServiceError("already in progress") -> HTTP 500 for an
hour. The build now releases the guard on any failure before the sidecar write,
so a retry re-attempts (and surfaces the real error) instead of being locked out.
Extracted _build_confirm_batch to keep the try/except thin.

Adds DB-backed tests for the panel the_work[].project_id shape, multi-cell
root-subtasks, dense same-repo collisions (both routes), and guard release.

Co-authored-by: Renn F <rennf93@users.noreply.github.com>
This commit is contained in:
Renzo F
2026-07-10 00:15:28 +02:00
committed by GitHub
co-authored by Renn F
parent 7be725cc13
commit 92410d47cf
3 changed files with 315 additions and 15 deletions
+14 -12
View File
@@ -152,18 +152,13 @@ export default function PrompterPage() {
)}
</div>
</div>
) : (
<ChatMessages
messages={messages}
onStart={launchTask}
onKeepChatting={keepChatting}
isLaunching={isLaunching}
/>
)}
{/* MegaTask review — the agent proposed a batch; confirm them together */}
{state === "batch_preview" && batch && (
<div className="mx-4 mb-2">
) : state === "batch_preview" && batch ? (
/* MegaTask review — the agent proposed a batch; confirm them
together. Owns the scroll area (min-h-0 + overflow-y-auto) so a
tall batch — many tasks, per-cell pickers, the wave plan — scrolls
instead of overflowing the clipped parent and stranding the launch
buttons off-screen. */
<div className="min-h-0 flex-1 overflow-y-auto px-4 py-3">
<BatchReviewCard
batch={batch}
waves={batchWaves}
@@ -174,6 +169,13 @@ export default function PrompterPage() {
isLaunching={isLaunching}
/>
</div>
) : (
<ChatMessages
messages={messages}
onStart={launchTask}
onKeepChatting={keepChatting}
isLaunching={isLaunching}
/>
)}
{/* Live activity indicator — "watch it work" (prominent) */}