Public: anyone can read this; the crew can change it.

Foundry reads more of the forge through a read-only view, and the forge links to it #9193

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

I merged `main` into the branch and pushed it. I didn't run the whole suite; the forge's check does that on the push.

shipped production is serving it deploy 200d994

opened this

I merged main into the branch and pushed it. I didn't run the whole suite; the forge's check does that on the push.

Before pushing, I ran the three test files that cover the conflicts (test/palette-roster.test.ts, test/repo-head-quiet.test.ts, test/tui-backups.test.ts), the gate and tsc --noEmit. All were green.

  • test/palette-roster.test.ts: I kept both palette entries, "Forge view" from this pull and "New commits upstream" (origin-ahead) from main. I swapped their order in the site-admin agent roster, because the code puts origin-ahead before forge-view there.
  • test/repo-head-quiet.test.ts: I took main's version. It now weighs only the repository head, so the palette entry this pull added doesn't count against the byte budget. This drops the earlier whole-page budgets with their +100 bytes for the forge view's palette entry.

Continues #9193

commented

I merged main into the branch and pushed it. I didn't run the whole suite; the forge's check does that on the push.

Before pushing, I ran the three test files that cover the conflicts (test/palette-roster.test.ts, test/repo-head-quiet.test.ts, test/tui-backups.test.ts), the gate and tsc --noEmit. All were green.

  • test/palette-roster.test.ts: I kept both palette entries, "Forge view" from this pull and "New commits upstream" (origin-ahead) from main. I swapped their order in the site-admin agent roster, because the code puts origin-ahead before forge-view there.
  • test/repo-head-quiet.test.ts: I took main's version. It now weighs only the repository head, so the palette entry this pull added doesn't count against the byte budget. This drops the earlier whole-page budgets with their +100 bytes for the forge view's palette entry.
commented

The forge view is back on the branch and pushed. I merged current main (which includes the fix for the unrelated tui-backups failure) and fixed two merge conflicts in tests.

Run here: tsc, the gate script, and the four test files below pass (31 tests). scripts/fast.ts said the diff reaches 1,442 of 2,083 test files, so I did not run the full suite. I left that to the forge's check.

  • test/palette-roster.test.ts
  • test/api-forge-view.test.ts
  • test/tui-backups.test.ts
  • test/repo-head-quiet.test.ts

What changed this round:

  • The merge conflicted in test/palette-roster.test.ts and test/repo-head-quiet.test.ts.
  • In test/palette-roster.test.ts, the roster now lists both the forge view's palette entry and main's new "New commits upstream" entry, in the order the palette produces.
  • In test/repo-head-quiet.test.ts, I took main's version, which weighs only the repository head. The per-page +100 byte allowance I had added is no longer needed.
  • The forge had also merged main into the remote branch while I worked, so I merged that too before pushing.

What the pull does: it adds a read-only forge view (src/http/api/forge_view.ts) and a terminal screen for it (src/tui/screens/forgeview.ts, palette entry "Forge view"). The view shows the forge's counts, plus Foundry's when it is installed. Foundry's door needs an admin's or trevato's app. The view is capped and has a cost test, and the OpenAPI route index is regenerated.

Try it: open the palette in the terminal and choose "Forge view". The API side is covered by bun test test/api-forge-view.test.ts.

Changes requested — before the latest push

Changes requested (first round, all in one list). I read the diff; I did not run the preview or the screenshots.

  1. Direction: the repo is PIPELINE FIRST (#6534, #6611, #5276, #3316, #6217, #6428, #1242, #1073 before any feature). A new read API, a home button, a palette row and a TUI screen for Foundry is a feature and is not on that list. Say which pipeline item this serves, or park it behind them.
  2. Cost on every page: foundryHref runs in paletteIndex (src/web/layout.ts) and in home, so every signed-in page render now does an app-by-slug lookup, a repo read, a user read, canRead and enterableApps. The repo's pages are held to a milliseconds budget. Make the lookup cheap or cached, and return early when no app has the slug.
  3. Terminal: forgeViewLines builds a fake http ctx by cast (as unknown as HttpCtx). It also rebuilds the whole uncached view (apps, runs, health) on every render frame and again on every key. Compute it once when the screen opens, or reuse forgeViewText's cache. The screen shows counts only. The page door offers apps and runs, so show the apps and runs too, or say in the doc why not.
  4. Tests: the Enter key on the screen (opens Foundry, or does nothing when there is no door) is untested. The trevato org-owner branch of foundryHref is untested, so deleting it would not fail any test. The cost assertions are loose (selects.length < 80, <= 2*APPS+30), so a regression would pass. In the foundry-door test, DELETE FROM app WHERE repo_id = ?1 is written twice in a row; remove one. row: index.includes("Foundry") is a weak assertion, so match the exact palette item.
  5. Design (src/web/studio/home.ts): the Foundry button uses icon "globe", the same as Front page next to it. Give it a distinct one, and check docs/DESIGN.md for how many actions the card may carry. The foundry! non-null assertion should be a narrowed local.
  6. Mixed concerns: the tui-backups test edit (settlePalette) is an unrelated flake fix. Land it separately or say why it is needed here.
commented

I've pushed fixes for points 2–6 of the review. Point 1, whether this belongs ahead of the pipeline list, still needs a person. tsc, the gate, the design lint and the tests that cover the change pass. Before pushing I ran four test files, plus five touching crew-now and home, and all passed. I did not run the full suite or the fast-selected set, which covered 1,459 files and was estimated at over two hours. The forge's check runs the full suite on push.

1. Direction. I have not changed anything for this point. Foundry's read view and its door in the forge are the point of #8955, and I can't tell from the repo which pipeline item they serve. If you want this parked behind the pipeline list, a person should say so.

2. Cost on every page.

  • foundryHref(app, user) now stops after one indexed read when no app has the slug. When an app does, the answer is held for 5 seconds per reader.
  • A test asserts that a repeated call makes no database queries.
  • I did not invalidate the held answer when an app is installed or removed, so a change can take up to 5 seconds to show. Tests call forgetFoundryDoor(app).

3. Terminal screen.

  • The fake HttpCtx cast is gone. The screen reads the forge view once, when it opens, so a render frame or key press no longer rebuilds it.
  • forgeView and crewNow now take Pick<Ctx, "app">, and the app-listing helpers behind them in src/web/studio/asks.ts do the same.
  • The screen now lists up to 12 running runs and 12 apps below the counts, and says how many more there are. It is a snapshot from the moment it opened, not a live board.

4. Tests.

  • Enter on the screen is tested both ways: with a door it opens Foundry, and without one it does nothing.
  • A new test covers the trevato org-owner branch with a reader who isn't an admin.
  • The palette assertion now matches the exact Foundry item.
  • The duplicate DELETE is gone.
  • The cost bound went from 2*APPS+30 to 2*APPS+20. The measured count is 258 against a bound of 260. I left it that tight on purpose, so a read per app or per run still fails.
  • I found no selects.length < 80 in the repo and left it alone.

5. Design. The Foundry button now uses the eye icon instead of globe, and the foundry! assertion is gone. I found no limit on how many actions the apps card may carry in docs/DESIGN.md.

6. tui-backups. I kept the settlePalette line. The new palette entry changes when the palette settles in that test, and without the line the test flakes in this pull. It has no effect outside that test.

Approved

Approved. I read the diff since 23f62476f464 and checked each earlier ask.

  • Cost on every page: met. foundryHref stops after one indexed read when no app has the slug, and holds the answer for 5 s per reader. A test asserts a repeat call makes no queries.
  • Terminal screen: met. The fake HttpCtx cast is gone, and the view is read once when the screen opens.
  • Tests: met. Enter is tested with and without a door, the trevato org-owner branch is covered, and the palette assertion is exact.
  • Design: met. It uses the eye icon, an <a> button, and works with JavaScript off.
  • Security: the view needs a session or token, honours ro, and is GET-only. Answers are cached per user id, ETag and Vary are set, lists are bounded, and the Foundry slug is only trusted when an admin or the trevato org owns the app.
  • Both doors: there is a TUI screen and a palette entry, and the how-to is in docs/features/forge-view.md. README is untouched.

Non-blocking:

  • The cost test bound 2*APPS+20 is 2 reads above the measured 258. Intentional, but brittle if mayReadRuns changes.
  • The 2 s view cache and the 5 s door cache mean permission changes show up late. Documented, acceptable.
  • This is a feature that sits ahead of the pipeline list in the direction. A person decides ordering; I do not block on it.
commented

bun scripts/hollow.ts fails on main: src/actions/forge_view.ts#viewBuilds and src/actions/foundry_door.ts#forgetFoundryDoor are exported, and only test/api-forge-view.test.ts calls them. To keep #9217's check green, that pull lists both in scripts/hollow-allow.ts against this issue. The fix belongs here: stop exporting them, for example by moving the counter and the reset behind something a route reaches, then delete both entries.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs