Repository navigation
Show a running build in Chat's run strip and Chat, say that Build plan approves, and keep the runs card within Chat - #883
Merged
Merged
Conversation
A build ran for an hour on a hosted deployment while Chat said nothing of
it: only that someone asked chopin to break the plan into tasks. Chat now
has one quiet line for each pull request a build opens ("Build opened #12
for “Scaffold the crate”.") and one when it ends ("Build finished: 2
tasks, #12 and #13.", or why it stopped or didn't start; a rebuild says
which pull requests it updated). The `#` is a link to the pull request,
drawn by the system row only for a GitHub pull request link whose label is
its own number, and a build's line has a wrench in place of the system
icon.
The lines are worked out from the stored implementation state each time it
is announced (tasks/build-notices.ts), after the change was persisted. Each
has an ID made from the build and the pull request, so a repeat is one
line; a document opened long after its builds seeds what it has seen and
says nothing of them. They are posted through a new backend callback under
the document lock, on the open room or the document opened for it, as the
research notices are.
Assistant-model: Claude Opus 5.5
Assistant-workflow: inline (subagent)
Assistant-verification: bun test apps/server/src/tasks/build-notices.test.ts (4 pass)
Assistant-verification: bun test apps/server/src/agent apps/server/src/tasks (572 pass)
Assistant-verification: bun test apps/web/src/chat/transcript.test.tsx (19 pass)
Assistant-verification: bun run types
Assistant-verification: bun run ci
User-preference: "make a Build visible and approvable where people work"
Co-authored-by: Alex Lavaee <lavaman131@github.com>
…equests During a build Chat's run strip listed only the Planner's workflow runs, so a build that took an hour was visible only in Build. The strip now starts with the document's running build, read from the same snapshot as Build: one line with a pulsing dot, "Build" (or "Building changes" for a rebuild), "1 of 2 tasks" and its age, unfolded into the task being built, its agent's latest activity, the pull requests it has opened as #12 links, and Open Build. Beside it a running workflow folds itself unless it waits on people. It shows whether or not the Planner runs here, and leaves the strip the moment the build ends; Chat's line about how it ended stays. The browser spec pairs the fake connector, pauses its agent on its first task, checks the row on a desktop window and at a phone's width, opens Build from it, then lets the agent finish and checks Chat's lines and that the strip lets the build go. It fails on main, where the strip never shows. Assistant-model: Claude Opus 5.5 Assistant-workflow: inline (subagent) Assistant-verification: bun test apps/web/src/build-model.test.ts (60 pass) Assistant-verification: bun test apps/web/src/chat/run-card.test.tsx (22 pass) Assistant-verification: bun run types Assistant-verification: bun run ci Assistant-verification: bun run e2e e2e/implementation-launcher.e2e.ts e2e/chat-run-strip.e2e.ts e2e/run-card.e2e.ts e2e/build-restart.e2e.ts e2e/stopped-build-editing.e2e.ts e2e/chat-row-edges.e2e.ts e2e/chat-hover-contrast.e2e.ts e2e/chat-long-transcript.e2e.ts e2e/chat-phone.e2e.ts e2e/message-toolbar-layout.e2e.ts e2e/pane-work.e2e.ts --workers=2 (77 passed, 1 skipped, 1 failed: chat-row-edges "scrolling a long Chat moves only its thumb", 160 forced layouts from Playwright's own script, the same on main) User-preference: "make a Build visible and approvable where people work" Co-authored-by: Alex Lavaee <lavaman131@github.com>
…sks wait for one After chopin rewrote a document's tasks it told people the new version "is a draft, so it still needs approval", but nothing anywhere offered an approval, and pressing Build went ahead. The code is clear that a person's press is the approval: queueBuild approves the exact draft it starts, and a built document's rebuild works from the document's own edits, not from the task graph, with no review. The Planner was only told "Only people may approve, lock or start implementation". edit_implementation_graph's description and the Planner's instructions now say that the Build plan press approves the saved draft and starts it, and a saved draft's result carries a note for the Planner to read before it says what happens next: on a document not yet built, Build plan builds exactly this draft; on a built one, Build carries the document's edits onto its pull requests and the draft is not what it runs. Build's card under "Not built yet" says "Build plan approves these tasks and builds them." Assistant-model: Claude Opus 5.5 Assistant-workflow: inline (subagent) Assistant-verification: bun test apps/server/src/agent apps/server/src/tasks (572 pass) Assistant-verification: bun run types Assistant-verification: bun run ci User-preference: "make a Build visible and approvable where people work" Co-authored-by: Alex Lavaee <lavaman131@github.com>
…s last line clear of it The maintainer saw Chat's transcript run under the workflow runs card. The transcript does end at the card's top edge, but a line scrolled past it ended on a hard cut against the card, which reads as the card covering it. Its last 16px now fade into the pane, as its top edge already fades under the header. The fade is drawn over the scroller, never inside it, so scrolling restyles nothing (a scroll-state query on the scroller restyled the whole transcript once it left the bottom); resting on the newest line it lies on the transcript's own bottom space, under no text. A browser spec seeds a long Chat and four runs and checks, on a desktop window and a phone, that at the transcript's end its scroll area, newest message and scrollbar end above the card, that the newest message clears the fade, and that this holds as runs unfold, as every run shows, and as they fold again. DESIGN.md records the build in the strip, Chat's build lines and the edge. Assistant-model: Claude Opus 5.5 Assistant-workflow: inline (subagent) Assistant-verification: bun run types Assistant-verification: bun run ci Assistant-verification: bun run e2e e2e/chat-row-edges.e2e.ts e2e/chat-run-strip.e2e.ts e2e/chat-hover-contrast.e2e.ts --workers=2 (10 passed with the forced-layout line of "moves only its thumb" logged instead of asserted: 160 forced layouts, as on main; dirty objects 15 and restyles 12, as on main) User-preference: "nit, but the scroll box gets clipped under the workflow widget" Co-authored-by: Alex Lavaee <lavaman131@github.com>
…it never pushes the composer away With several workflow runs unfolded the card under Chat's transcript grew to its full height: in a 600px window it measured 906px, squeezed the transcript to 12px above the window's top and pushed the composer below its bottom, on a desktop window and on a phone alike. Only a single run's "every stage" lane had a bound. The card's wrapper, in main Chat and in a thread, now takes at most half of Chat's height and scrolls beyond that, with its scrolling contained. The browser spec unfolds five runs of six stages in a 1280 × 600 window and a 390 × 664 phone and checks that the card is at most half of Chat and scrolls, that the transcript keeps its place and height, that the card ends above the composer and the composer inside Chat and the window, that the last run's stages are reached by scrolling the card, and that the newest message stays clear of it. Without the rule it fails (906 against 289). Assistant-model: Claude Opus 5.5 Assistant-workflow: inline (subagent) Assistant-verification: bun run e2e e2e/chat-run-strip.e2e.ts --project=harness --workers=2 (2 passed; the new test fails without the rule) User-preference: "nit, but the scroll box gets clipped under the workflow widget" Co-authored-by: Alex Lavaee <lavaman131@github.com>
lavaman131
force-pushed
the
build-visibility
branch
from
November 13, 2026 00:00
126b9d2 to
ab5e7f0
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Make a Build visible and approvable where people work
What the maintainer saw
On a hosted deployment:
Causes
queueBuildapproves the exact draft it starts, and a built document's rebuild works from the document's own edits, not from the task graph. Only the Planner didn't know. Its tool said "Only people may approve, lock or start implementation" and nothing more, so it told people a draft waited for an approval that doesn't exist.What changed
1. Build plan is the approval, and the Planner says so (
agent/tools.ts,agent/planner.ts,build-view.tsx)edit_implementation_graph's description and the Planner's instructions say the Build plan press approves the saved draft and starts it, so it never tells people tasks still need approval.notefor the Planner to read before it says what happens next:2. A running build heads Chat's run strip (
build-model.tsbuildRun,chat/run-card.tsx,chat.tsx,room-workspace.tsx)#12links, and Open Build.3. Chat says what the build did (
tasks/build-notices.ts,tasks/notifications.ts,main.ts,chat/transcript.tsx)#links to its pull request, and the line shows a wrench instead of the system icon. The system row only links a GitHub pull request URL whose label is its own number; any other Markdown stays as text.4. The transcript's lower edge fades (
chat/overlay-scrollbar.css)5. The runs card takes at most half of Chat (
chat/run-card.css,chat.tsx,threads/thread-panel.tsx)apps/web/DESIGN.mdrecords the strip row, Chat's build lines, the edge and the card's limit.Evidence
Synthetic, from the browser spec's fake connector, paused on its first task (desktop 1280 wide, and at a phone's width).
Chopin's app view is light only, so there are no dark shots.
Contrast (computed colours read from the rendered page, WCAG ratios):
#12linkTests
New
implementation-launcher.e2e.ts: "a running build heads Chat's run strip with its task, and Chat says when it opens each pull request and when it finishes". It pairs the fake connector and pauses it on the first task, then checks:It fails on main, which shows no row.
chat-run-strip.e2e.ts(harness project):Unit tests:
build-notices.test.ts: opened once per pull request, finished, stopped, didn't start, rebuild.build-model.test.ts:buildRun.run-card.test.tsx: the row's markup and folding.transcript.test.tsx: pull request links in system lines.Checks run
bun run typesandbun run cipass.Rebased onto
8cb7e623f, which includes the full-height row shade and the image viewer; the only conflicts were in DESIGN.md's Chat row paragraph, where both changes are kept. The build row is a.run-row > .run-head, so it gets the row-shade change's hairline and shade with no change of its own. Earlier, on8634eefaf, which includes build-pr-lifecycle: The only conflict was two newdescribeblocks appended tobuild-model.test.ts; both are kept. The Chat lines read open pull requests fromlive.pullRequests, which now lists only open ones, and a rebuild's updates from its commits, so a closed pull request is never named as updated.bun test apps/web/src: 1,666 pass.bun test apps/server/src/tasks apps/server/src/agent apps/server/src/plan apps/server/src/chat: 1,873 pass.bun run build:Initial JavaScript is the same as main. The card's 74 B limit lands in the initial stylesheet with
run-card.css.Browser specs,
--workers=2, after rebasing onto8634eefaf: implementation-launcher, chat-run-strip, run-card and stopped-build-editing passed 33, with 1 skipped (the opt-in live ACP case). Before that rebase, chat-hover-contrast and chat-phone also passed.Before the rebase: build-restart, chat-row-edges, chat-long-transcript, message-toolbar-layout and pane-work also passed, except one test,
chat-row-edges"scrolling a long Chat moves only its thumb". It fails on main the same way on this machine: 160 forced layouts from Playwright's own injected script. With that line logged rather than asserted, its other limits hold: 15 dirty objects and 12 restyles, as on main.bun run design:behavior: 104 passed and 2 failed under load:connecting-indicatorandchat-media(narrow), where the design-audit page didn't load in time. Run alone,connecting-indicatorpassed, andchat-mediapassed 14 of 14.Judgement calls
edit_implementation_graphthere would be cleaner, but could break a flow I can't see. The Planner is told the draft isn't what Build runs.