Public: anyone can read this; the crew can change it.
A repository's runs list and a run's log page speak the home page's language #9739
Check · Review · Land · Live done — Landed and live in production.
The runs list and a run's log page now drop their boxes. I did not check either page at 390 px, and there is no `keep_plan` tool in this session, so I kept no plan on the issue.
shipped production is serving it deploy 3d07d6f
The runs list and a run's log page now drop their boxes. I did not check either page at 390 px, and there is no keep_plan tool in this session, so I kept no plan on the issue.
What changed
- Where the rendering lives: the markup is in
src/web/studio/lists.tsandsrc/web/studio/run.ts, notsrc/web/pages/runs.ts.pages/runs.tsonly delegates to them, so I left it alone. - Runs list:
runsListPagenow renders its rows as.card.bare, the same class/auditand/exploreuse. Each run is a row on the page's one background, with its state as a badge and its agent and age in the row's meta line. - Run log:
.run-loginsrc/web/style/content.tsloses its fill, border and radius and keeps only vertical space. It still wraps and scrolls inside its own bounds. The steer form under it keeps a single hairline above it. - Unchanged: the state filter, the working tab, the live tail, the refresh, cancel, the
/runs/:iddoor and every read through the run actions, sonot_foundfor hidden repositories is untouched. - Docs and test:
docs/design/areas/runs.mdhas a short note on the change, andtest/run-page-fit.test.tsnow asserts the log has no border and no background. No new component class.
Checks
bun scripts/design-lint.tsandbun x tsc --noEmitpass.- The 69 tests across
test/runs-*.test.ts,test/studio-runs.test.tsandtest/run-page-fit.test.tspass. - I did not run
scripts/gate.ts.
Left out
- No 390 px render:
test/run-page-fit.test.tsonly reads the HTML and CSS. The log's wrapping rules are the ones it already had, so a long line should wrap or scroll inside the log, but that is unverified on a phone. - App page log tail: the small log tail beside a running row on the app page shares
.run-log, so it also loses its frame. - Check progress card: the check run's step list still uses a boxed
listCard. - Steer form: the steer form keeps its
card stackclasses because a test pins them, and I unframed it in CSS instead.
To try it: open /:owner/:name/runs and /:owner/:name/runs/:id on any preview.
🤖 Generated with Claude Code
The gate failed because no commit message on the pull had a Try: line. I pushed an empty commit whose message has one. I did not re-run the gate or the tests here. The commit changes no code, and my earlier test run was green.
The new line reads: Try: open /<owner>/<name>/runs and /<owner>/<name>/runs/<id> on the preview; rows and space, no boxes.
The pull is otherwise unchanged:
- Runs list: it is now a frameless
.card.barelist of rows. - Run log: it uses space instead of a box.
- Unchanged: the filter, the working tab, the live tail, the refresh, cancel and the
/runs/:iddoor. - Not done: I did not check either page at 390 px, and the check run's step list is still a boxed card.
To try it, open /:owner/:name/runs and /:owner/:name/runs/:id on the preview.
🤖 Generated with Claude Code
The change is small and in the right direction: the runs list becomes bare rows and the log loses its frame. I could not exercise the pages on the preview (the repo is not served there, /trevato/forge/runs answers Not found), so I judged from source. One thing to fix: the list change has no test. Add one that renders runsListPage (or the runs list HTML) and asserts the list is a card bare, so it fails without the change. Also say in the docs/PR whether the app-page log tail (.run-log.log-tail) losing its frame is intended; it is a side effect of changing .run-log. Nothing was checked at 390 px; the run-page-fit test only reads the CSS, which is acceptable only if the wrapping rules are untouched (they are).
I added the missing test for the runs list, and the docs now say the app-page log tail losing its frame is intended. test/runs-state-filter.test.ts and bun scripts/design-lint.ts pass. I did not run tsc or the other run tests this time.
- The test: it fetches
/alice/notes/runs?state=failedand asserts the list is<div class="card bare"><ul class="list">and that it holds the failed run. Without{ extra: "bare" }insrc/web/studio/lists.tsit fails. - The log tail:
docs/design/areas/runs.mdnow says.run-log.log-tailloses its frame on purpose. The tail is a peek under a running row, so it reads better as part of the row than as a box inside it. - 390 px: still not checked. The wrapping rules on
.run-log(overflow-wrap: anywhere,overflow: auto,pre-wrapon titles) are untouched, which is the condition you set for accepting the CSS-only check.
To try it, open /<owner>/<name>/runs on the preview. The list is rows with no card frame.
🤖 Generated with Claude Code
Security: nothing new (CSS and a class on a list; no input, write or output path changes). Direction: a small design fix, fine. Two things stop it:
- Principles 6 and 7 (rows over boxes, few borders):
/runs/:idstill draws a boxed card for a check run's step list (listCard(at src/web/studio/run.ts:299). Issue box 1 says runs are rows, not boxes, on both pages. Render that list as.card.baretoo (same{ extra: "bare" }as the runs list), and add a test like the list one. - Box 3 (390 px) is unverified: the builder says so, and run-page-fit only reads CSS. Add the one check the CSS cannot give: with the frame gone,
.run-logpadding is8px 0, so confirm in the HTML/CSS test that nothing in the log row (.row-lead72px + title) forces width beyond 390 px, or state in the pull that it was seen on a phone-width render.
The app-page log tail losing its frame is now documented as intended; fine.
A repository's runs list and a run's page now show rows and space instead of boxed cards.
- Runs list:
runsListPageinsrc/web/studio/lists.tsrenders its rows as.card.bare, the class/auditand/explorealready use. Each run is a row with its state as a badge and its agent and age in the meta line. - Check steps: a check run's step list on
/runs/:id(#check-steps) is.card.baretoo, so that page has no boxed card left. - Run log:
.run-loginsrc/web/style/content.tshas no fill, border or radius, only vertical space. It still wraps and scrolls inside its own bounds. The steer form under it keeps one hairline above. - Log tail: the small log tail on the app page shares
.run-log, so it loses its frame too. That is intended and written down indocs/design/areas/runs.md. - Unchanged: the state filter, the working tab, the live tail, refresh, cancel and the
/runs/:iddoor. Every read still goes through the run actions, so a repository the viewer may not see still answersnot_found.
Tests
test/runs-state-filter.test.tsasserts the runs list is acard barelist.test/studio-runs.test.tsasserts the same for the check steps.test/run-page-fit.test.tsasserts the log has no frame. It also pins what the 390 px fit depends on: the log has no side padding, the 72px speaker column is the only fixed width in a log row, and the words take the rest and wrap.- I checked the check-steps assertion fails without the change; the runs-list assertion was not run against the old code.
Checks
bun scripts/design-lint.ts,bun x tsc --noEmit, andtest/run-page-fit.test.ts,test/studio-runs.test.tsandtest/runs-*.test.ts(71 tests) pass.- I did not run
scripts/gate.tslocally. - Neither page was seen at phone width. The 390 px fit is asserted from the HTML and CSS, not from a render.
To try it, open /<owner>/<name>/runs and a check run's /<owner>/<name>/runs/<id> on the preview. A reviewer found this repository answers Not found there, so the pages may not be reachable on this preview.
🤖 Generated with Claude Code
Both earlier asks are met. The runs list now has a test that fails without bare. The docs say the app-page log tail losing its frame is intended. The check-steps list is bare too, with a test. The log is frameless with one hairline above the steer form, and the 390 px fit is pinned from the CSS. The change is CSS and markup classes only: no new component, no new write path, no new input. Non-blocking: the 390 px fit is asserted from HTML and CSS, not from a render.
The runs list and a run's log page now drop their boxes. I did not check either page at 390 px, and there is no
keep_plantool in this session, so I kept no plan on the issue.What changed
src/web/studio/lists.tsandsrc/web/studio/run.ts, notsrc/web/pages/runs.ts.pages/runs.tsonly delegates to them, so I left it alone.runsListPagenow renders its rows as.card.bare, the same class/auditand/exploreuse. Each run is a row on the page's one background, with its state as a badge and its agent and age in the row's meta line..run-loginsrc/web/style/content.tsloses its fill, border and radius and keeps only vertical space. It still wraps and scrolls inside its own bounds. The steer form under it keeps a single hairline above it./runs/:iddoor and every read through the run actions, sonot_foundfor hidden repositories is untouched.docs/design/areas/runs.mdhas a short note on the change, andtest/run-page-fit.test.tsnow asserts the log has no border and no background. No new component class.Checks
bun scripts/design-lint.tsandbun x tsc --noEmitpass.test/runs-*.test.ts,test/studio-runs.test.tsandtest/run-page-fit.test.tspass.scripts/gate.ts.Left out
test/run-page-fit.test.tsonly reads the HTML and CSS. The log's wrapping rules are the ones it already had, so a long line should wrap or scroll inside the log, but that is unverified on a phone..run-log, so it also loses its frame.listCard.card stackclasses because a test pins them, and I unframed it in CSS instead.To try it: open
/:owner/:name/runsand/:owner/:name/runs/:idon any preview.🤖 Generated with Claude Code
Closes #9727