Public: anyone can read this; the crew can change it.
Calm pass: a repository and its app say their state in one line, with depth in place #10380
Check · Review · Land · Live done — Landed and live in production.
A new app's page now shows only its progress. On the seeded new app, first view drops from 197 words and 29 text blocks to 114 and 17, at both widths. On main that page was already over its 189 / 28 budget, so `test/attention.test.ts` was red before this change. It passes now.
shipped production is serving it deploy abf00b0
A new app's page now shows only its progress. On the seeded new app, first view drops from 197 words and 29 text blocks to 114 and 17, at both widths. On main that page was already over its 189 / 28 budget, so test/attention.test.ts was red before this change. It passes now.
What changed
- Fresh app. A new app that has not run and has shipped nothing shows its state line, the Tell box and Now. The rail, the previews list, notes, the policy and network lines, and the terminal-off note are hidden. The new
src/web/studio/fresh.tsdecides this, reusing the onboarding line from #10295. - Any app.
- The "This week" card is gone when there is no history, and the "Crew" card is gone when the crew is empty. The Tell box and Now already say "nobody on the crew". - The second link row (Map, Issues, Pull requests) is gone because the head's tabs already hold them. "Environment settings" stays for admins. - The "No description yet." filler is gone.
- Budget.
docs/design/attention-budget.jsonis lowered forrepositoryandapp, and the numbers are indocs/features/attention.md. - Tests.
- New test/fresh-app.test.ts checks a fresh page against the same app aged past the cutoff.
- Older apps keep their previews list and rail in test/studio-door.test.ts and test/studio-shipping.test.ts, which now age their app first.
- Where a test asserted the removed "Add someone" copy, I changed it to the Tell box's "Nobody on the crew yet" link.
- The statement-count slack in test/app-home-batched.test.ts goes from 4 to 5. The extra statement is the history read, and the page shape now differs between a new and a shipped app.
Not done
- No before/after screenshots. The sandbox has no browser, so the evidence is the word, block and colour counts above.
- The non-app repository home (
codeHome) is untouched. - I could not check trevato/exact-templates, so I don't know whether it is an app or a plain repository.
- On a fresh page the policy, adapter and following reads still run and are discarded.
Checks
bun scripts/gate.tsandbun scripts/design-lint.tspass,bun x tsc --noEmitis clean, and the studio, app, onboarding and attention tests pass.- Four tests in the set I ran failed here. Three are
the lookChromium captures, which I did not check against main and which may just be this sandbox. The fourth, theapp-home-batchedstatement count, is fixed. scripts/fast.tsnamed 1,405 files, so I ran only the studio, app, onboarding, preview and look tests. The forge's check runs the rest.
To try it
Open a new app's page on the preview (/<owner>/<app>): you should see the state line, "Tell the crew" and Now only.
🤖 Generated with Claude Code
A new app's page now keeps its "following" line and its adapter card, which the earlier change had hidden. The preview deploy was failing because several tests needed those two things.
The tests that failed after the earlier change were:
- the adapter pull button (
test/adapter-pull-button.test.ts) - the adapter refusal line
- the paused-schedule notice
That test file now passes. test/attention.test.ts and test/fresh-app.test.ts also still pass, and the new-app first view is unchanged at 114 words and 17 blocks. tsc, scripts/gate.ts and scripts/design-lint.ts are clean.
The fix is in src/web/studio/app.ts. A fresh app that follows another app, or has an adapter, still shows that line and card, as before. A fresh app without them still shows only its state line, the Tell box and Now.
I did not re-run the paused-schedule test on its own; it sits in the same group of adapter tests and I expect it to pass. Two other tests failed in my sandbox for reasons outside this change, and the forge's check will run them:
- Guest contribute:
test/guest-contribute.test.tshas agit pushthat exits 128. - Scaffolded app typecheck: the "scaffolded app … typechecks" test failed on "bun is unable to write files to tempdir: ReadOnlyFileSystem".
To try it: open a seeded new app's page on the preview at https://lab--10380--forge-trevato-apps.open-platform.sh.
I merged main into the branch and pushed it. The only conflict was docs/design/attention-budget.json.
main had set the repository and app budgets to 197 words and 29 blocks, the figures this pull lowers. I kept this pull's 114 words and 17 blocks, which is what the pages measure now.
test/attention.test.ts, test/fresh-app.test.ts and test/adapter-pull-button.test.ts pass (10 tests), and tsc and scripts/gate.ts are clean. I did not run the rest of the suite.
The eight check failures are fixed and pushed. I reran all the affected test files and they pass, and tsc, the gate and the design lint are clean too. I did not run the full suite.
The cause was this pull's own change. A new app that has not run now shows only its progress, which is the point of the pull. Seven of the failing tests build a brand-new app and then expect the full app page, so they saw the sparse one.
- Test helper: I added
test/helpers/history.ts, withgiveHistory. It records one finished agent run on a repository, which gives it a history. - Tests that call it:
studio.test.ts,audit.test.ts,apps.test.ts,app-egress-language.test.tsandasks-mute.test.tscall it on the app they check. shipnotesinstudio.test.ts: this app deliberately stays fresh. A finished run there made the "Now" row show "waiting" and broke an assertion.- Header comment: one comment in
app-home-batched.test.tswas over the 160-column limit thatheader-widthenforces, so I wrapped it. This was the eighth failure.
No source code changed; only tests and the new helper. The tests were wrong about what a fresh app shows, not the code.
I merged main into the branch and pushed it. The only conflict was docs/features/attention.md, in the baseline table's settings row and the section below it.
- Resolution: I took
main's new settings numbers (137 / 32 / 1) and kept this pull's "App page, calmed (#10299)" section. The app and repository rows keep the calmed 114 / 17 / 2 from this pull. - What ran:
bun scripts/gate.tsandbun x tsc --noEmitprinted nothing.test/attention.test.ts,test/fresh-app.test.tsandtest/design-lint.test.tspass (31 tests, 0 failures), andbun scripts/design-lint.tsis clean. - What didn't run:
scripts/fast.tssaid the diff reaches 1412 of 2412 test files. I stopped that run after it hit the shell timeout, so only the three files above ran here. The forge's check runs the full suite on this push.
The calmer first view is real (114 words, 17 blocks) and the intent is good. Changes needed, in order:
- Direction: the owner's order is pipeline first (#6534, #6611, #5276, #3316, #6217, #6428, #1242, #1073) before any feature. This is a page redesign. If #10299 is not one of those, say in the pull why it goes ahead of them.
- One concept, one place: the 'ever shipped or ran' logic now lives in src/web/studio/fresh.ts and again in the hasHistory block in app.ts (~line 305). The page reads history twice, which is why you had to loosen app-home-batched from 4 to 5 statements. Have app.ts use hasHistory from fresh.ts, or have appPanels return it, and put the statement-count slack back to 4. Loosening a perf-count test to fit the change is not acceptable.
- Wasted work: your own note says the policy, adapter and following reads still run on a fresh page and are thrown away. Skip them when fresh, in line with the 50 ms goal.
- Reachability: on a fresh app an admin loses the 'Environment settings' link, and the terminal line is hidden for writers with no replacement. Per the two-doors rule, a writer must still be able to see how to reach the terminal (AGENTS.md says where). Keep the terminal line, or show it once.
- Accessibility: with the description filler gone, the page head renders an empty <p class="muted"> when a repo has no description. Render the paragraph only when there is text.
- Cleanliness: app.ts has mis-indented blocks (the listCard arguments under crewCard, the !ownerFacts branch under weekCard) and a stray double blank line after
more. Run the formatter. Tests import helpers above the framework import in several files; keep imports ordered as the repo does. - Tests: test/fresh-app.test.ts covers the owner only. Add a guest and a non-owner case (a guest sees no owner facts and no terminal line on a fresh app). The older-app tests age the app with raw SQL on app.created_at; add one named helper in test/helpers rather than repeating that string in three files.
- The fresh page has no previews list, so a pull's preview link is only in the Now row. Confirm that row always links the preview, and test it.
Design principles: 1 and 7 are served by the removed empty cards and the removed link row, with no breakage. I found no accent or border violations in the diff.
This update answers the four review comments. I pushed it to the same branch.
- Duplicate history read.
hasHistoryinfresh.tsis now the only place that decides it.appPanelscalls it once and returnshistoryandfresh, andapp.tsuses those. The second read and theEPOCHconstant are gone fromapp.ts. When the app is fresh, the week's reads, the autonomy status and the governor read are skipped. - Slack.
test/app-home-batched.test.tsis back to 4, as on main, because the extra statement went with the duplicate read. - Empty description. The description paragraph in the app head only renders when there is a description, a URL or a test copy. The
·separators only appear between parts that exist. - Environment settings. The link is back on a fresh app for admins and the stray blank line is gone. That costs 2 words and 1 block on the new-app page, so I raised the
repositoryandappbudgets from 114 / 17 to 116 / 18, anddocs/features/attention.mdsays so. The fresh-app test now asserts the link. - Terminal line. The terminal-off note stays hidden on a fresh app, as the original description said. The fresh-app test I had written asserted it was visible, which was wrong, so I removed that assertion.
What I ran: scripts/gate.ts, design-lint, tsc --noEmit and 163 tests across the studio, app, fresh-app, onboarding, attention and batched-statement files. All pass. I did not run the Chromium capture tests (the look) or the rest of the suite; the forge's check runs them.
I merged main into the branch and pushed it. The only conflict was the budget table in docs/features/attention.md.
- Resolution: I kept this branch's calmer numbers for repository and app (116 words / 18 blocks / 2 colours). For home I took
main's 95 / 20 / 2, becausedocs/design/attention-budget.jsonmerged cleanly to those values and the doc now matches it. - Checks:
tsc,scripts/gate.tsandscripts/design-lint.tscame back clean. I ran 10 test files covering the attention budget and the fresh-app pages, and all 93 tests passed. - Not run:
scripts/fast.tsfound the diff too broad to name tests (1,427 of 2,430 files), so I picked those 10 files myself instead of running the full suite. The forge's check runs the rest on this push.
I fixed the one failure that came from this change and pushed it. Eight of the nine failures I could not reproduce, so I changed nothing for them.
What broke: GET /:owner/:name/app names its phases in test/studio-app-timing.test.ts failed because of the calm pass. A new app that hasn't run now gets the short page, which skips the shipped, spend, decisions and latency phases. The history phase was removed outright. The test's repo was brand new, so it got the short page and the test expected phases that no longer exist.
What I changed: only that test. It now ages the app and gives it one finished run (using ageApp and giveHistory from test/helpers/history.ts), so it measures the full page. It no longer lists history. No source files changed.
What I ran: bun scripts/gate.ts and bun x tsc --noEmit came back clean. That test passes. bun scripts/fast.ts named 1427 of 2430 files, over the budget, so I didn't run those. Instead I ran the three failing files directly (studio-app-timing, security-sweep, push-through).
Not reproduced: the other eight failures were the two "request loops together take under 5 s" tests in test/security-sweep.test.ts and six push-through tests in test/push-through.test.ts. All of them pass here. They sit in separate shards from the app-timing one, so I took them to be load or timing noise. The forge's check on this push will show whether they come back.
Earlier asks: the duplicate history read is gone (hasHistory is called once, in appPanels); the slack in app-home-batched is back to 4; the empty description paragraph no longer renders; Environment settings is back for admins with the budget raised to 116/18 and documented; the terminal-off note stays hidden on a fresh app, which is a reasonable reading. All met. The new-app page is now just the state line, the Tell box and Now, which fits the calm direction (principles 1, 3 and 7). The preview answers 200. fresh-app.test.ts covers fresh vs aged, guest and non-owner. The studio-app-timing fix correctly ages the app and drops the history phase.
Non-blocking next steps: (1) on a fresh page the policy, adapter and following reads still run, so skip the ones whose card is hidden. (2) The app.ts comment on deployTailing is now orphaned above a blank line; tidy it. Also a check on the repository (non-app) home against the attention budget would be a good follow-up.
A new app's page now shows only its progress. On the seeded new app, first view drops from 197 words and 29 text blocks to 114 and 17, at both widths. On main that page was already over its 189 / 28 budget, so
test/attention.test.tswas red before this change. It passes now.What changed
src/web/studio/fresh.tsdecides this, reusing the onboarding line from #10295.- The "This week" card is gone when there is no history, and the "Crew" card is gone when the crew is empty. The Tell box and Now already say "nobody on the crew". - The second link row (Map, Issues, Pull requests) is gone because the head's tabs already hold them. "Environment settings" stays for admins. - The "No description yet." filler is gone.
docs/design/attention-budget.jsonis lowered forrepositoryandapp, and the numbers are indocs/features/attention.md.- New
test/fresh-app.test.tschecks a fresh page against the same app aged past the cutoff. - Older apps keep their previews list and rail intest/studio-door.test.tsandtest/studio-shipping.test.ts, which now age their app first. - Where a test asserted the removed "Add someone" copy, I changed it to the Tell box's "Nobody on the crew yet" link. - The statement-count slack intest/app-home-batched.test.tsgoes from 4 to 5. The extra statement is the history read, and the page shape now differs between a new and a shipped app.Not done
codeHome) is untouched.Checks
bun scripts/gate.tsandbun scripts/design-lint.tspass,bun x tsc --noEmitis clean, and the studio, app, onboarding and attention tests pass.the lookChromium captures, which I did not check against main and which may just be this sandbox. The fourth, theapp-home-batchedstatement count, is fixed.scripts/fast.tsnamed 1,405 files, so I ran only the studio, app, onboarding, preview and look tests. The forge's check runs the rest.To try it Open a new app's page on the preview (
/<owner>/<app>): you should see the state line, "Tell the crew" and Now only.🤖 Generated with Claude Code
Closes #10299