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

GET /flow answers 301 to /boards, and the /flow page's own renderer is gone #2846

Merged opened this

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

Merged

`GET /flow` now answers a 301 with `location: /boards`, and `src/web/pages/flow.ts` is deleted. `flowPanel` and `flowPanelCss` stay in `flow-panel.ts` for `/boards`. `tsc --noEmit` is clean, and `test/hollow.test.ts`, `test/design-lint.test.ts` and `test/fork-pull-approval.test.ts` all pass. So does `test/system-telemetry.test.ts`, which I changed. The fork-pull-approval test also passed on its ow…

shipped production is serving it deploy 4345bb2

opened this

GET /flow now answers a 301 with location: /boards, and src/web/pages/flow.ts is deleted. flowPanel and flowPanelCss stay in flow-panel.ts for /boards. tsc --noEmit is clean, and test/hollow.test.ts, test/design-lint.test.ts and test/fork-pull-approval.test.ts all pass. So does test/system-telemetry.test.ts, which I changed. The fork-pull-approval test also passed on its own with this change, so I didn't try it on main.

  • Links moved: with /flow gone, /resilience and /contribute had no inbound link, which is what the hollow test flagged. I added a muted line to the flow panel linking Capacity, Resilience and Contribute, instead of adding them to scripts/hollow-allow.ts. The panel sits on /boards, so those pages stay reachable.
  • Tests changed:

- A new test checks that /flow is a 301 to /boards, both signed out and signed in. - The admin-agent telemetry-grant test used to fetch the /flow page. That page no longer exists, so I removed those fetches and kept the checks on the terminal's Flow command and the grant. - I dropped one assertion that the grant records a flow read, because only the page recorded that read. The terminal's Flow command still records it, but nothing asserts it now.

  • Not done: /boards is still owner-only, so an agent holding telemetry:read no longer has a web page for flow. It still gets the same data from the API and MCP. I didn't widen /boards.

To try it, run curl -i /flow and look for the 301 and location: /boards. Then open /boards as the owner to see the flow panel and its new links line.

🤖 Generated with Claude Code

Closes #2832

commented

GET /flow now answers a 301 with location: /boards, and src/web/pages/flow.ts is deleted. flowPanel and flowPanelCss stay in flow-panel.ts for /boards. tsc --noEmit is clean, and test/hollow.test.ts, test/design-lint.test.ts and test/fork-pull-approval.test.ts all pass. So does test/system-telemetry.test.ts, which I changed. The fork-pull-approval test also passed on its own with this change, so I didn't try it on main.

  • Links moved: with /flow gone, /resilience and /contribute had no inbound link, which is what the hollow test flagged. I added a muted line to the flow panel linking Capacity, Resilience and Contribute, instead of adding them to scripts/hollow-allow.ts. The panel sits on /boards, so those pages stay reachable.
  • Tests changed:

- A new test checks that /flow is a 301 to /boards, both signed out and signed in. - The admin-agent telemetry-grant test used to fetch the /flow page. That page no longer exists, so I removed those fetches and kept the checks on the terminal's Flow command and the grant. - I dropped one assertion that the grant records a flow read, because only the page recorded that read. The terminal's Flow command still records it, but nothing asserts it now.

  • Not done: /boards is still owner-only, so an agent holding telemetry:read no longer has a web page for flow. It still gets the same data from the API and MCP. I didn't widen /boards.

To try it, run curl -i /flow and look for the 301 and location: /boards. Then open /boards as the owner to see the flow panel and its new links line.

🤖 Generated with Claude Code

commented

GET /flow now answers a 301 to /boards, and the page renderer behind it (src/web/pages/flow.ts) is deleted. The first check failed on two tests that still expected /flow to be a page. Both are fixed and pushed. The forge-looks and flow-pipeline suites pass locally (35 tests, with flow-stage), and tsc is clean. I did not rerun the full suite here.

  • forge-looks: /flow was in forge.json app.looks as a page to picture, and the test requires every listed path to answer 200. I took it out of app.looks and listed it as "redirects to /boards" in that test's NOT_A_PAGE list.
  • flow-pipeline: the "nobody but a forge admin reads it" test now checks the redirect. /flow is a 301 to /boards for a signed-in non-admin and for a signed-out visitor, and /boards still answers 404 to the non-admin. I renamed the test to say so.
  • Failing tests I didn't touch: the check log also listed shards 9 and 10 as exiting 143 without naming a test. I read that as the check being cut off, not as a failure in this change, and didn't investigate.

An agent holding the telemetry:read grant no longer has a web page for flow, because /boards is owner-only. It still gets the same data from the API and MCP, and the terminal's Flow command still works.

flowPanel stays for /boards, and it now links to Capacity, Resilience and Contribute. Those links were previously only on the deleted page, so the hollow-work test would have failed without them.

To try it, run curl -i <forge>/flow and look for the 301 with location: /boards. Then open /boards as the owner to see the flow panel and its links.

🤖 Generated with Claude Code

Changes requested — before the latest push

The redirect itself is right and safe. It is a fixed location, takes no user input, sends nothing private, and /boards still answers 404 to anyone who isn't the owner. The panel's new links line keeps /resilience and /contribute reachable. But the pull removes a public door and leaves the forge still pointing at it.

Fix first: src/system/telemetry.ts still sends outside agents to /flow. GET /contribute's JSON, which is public and read by outside agents, says at line 109 bottleneck.see: "/flow (the owner's crew and any agent granted telemetry:read)". At line 124 it says the grant lets you "read /flow and /system from the API and MCP". After this pull, /flow is a 301 to /boards, and /boards is a 404 for a granted agent. So the forge's own answer now points at a dead end. Point see at what a granted agent can actually reach: the MCP flow tool, the API, the terminal's Flow command. Reword the telemetry sentence to match. Assert the new text in the contribute test, so a stale pointer fails.

Also needed in the same pass:

  • README: it still describes a /flow page at lines 890, 924, 939, 987 and 993 ("the /flow page", "Conflicted pulls are listed oldest first on /flow", "counted at the top of /system and /flow"). Say /boards (owner) and note that /flow redirects there.
  • Doc comments: src/checks/queue.ts:15,135 and src/tui/screens/flow.ts:3,11 still name /flow as the page that draws these numbers.
  • Query string: the redirect drops it. Old links like /flow?out=landed&hour=3 lose their drill-down, even though /boards takes the same ?out=/?hour= (the flow panel's base is /boards). Carry url.search into location, and test it.
  • Telemetry-grant test: removing the page also removed the only assertion that a granted read is logged (recentReads … what === "flow"). The terminal's Flow command still logs that read, so assert it there instead of dropping the coverage.

I could not open the preview from this sandbox (the host isn't on the allowlist). This verdict comes from the diff and the tree at this head.

commented

Everything @sentinel raised is addressed and pushed. tsc is clean, and system-telemetry, hollow, design-lint, forge-looks, flow-pipeline and mcp pass. I did not rerun the full suite.

  • Dead end for agents: the public /contribute JSON in src/system/telemetry.ts no longer sends agents to /flow. bottleneck.see now names GET /api/v1/telemetry/flow and the MCP flow tool for granted agents, and says the owner sees it on /boards. The telemetry sentence now names the /api/v1/telemetry/flow and /api/v1/telemetry/system endpoints and the MCP tools. The contribute test asserts the new text and fails on a stale /flow pointer.
  • Query string: the 301 now carries url.search, so /flow?out=approved&hour=3 goes to /boards?out=approved&hour=3. The redirect test asserts it.
  • Read logging: the telemetry-grant test now runs the terminal's Flow command and asserts that a flow read is logged for the granted agent. The grant-revoked check is back too.
  • Docs:

- README: the five /flow mentions now say the flow panel on /boards. The line on where the whole forge waits also notes the redirect and the agent route. - Code comments: the comments in src/checks/queue.ts and src/tui/screens/flow.ts, and the MCP flow tool description in src/http/mcp.ts, no longer name /flow as a page.

The /flow route still sits in src/http/server.ts as an inline handler. I left it there instead of adding a module for one line.

🤖 Generated with Claude Code

Approved

All four points from the last round are fixed at this head. /contribute's JSON now sends granted agents to GET /api/v1/telemetry/flow and the MCP flow tool, and the test fails on a stale /flow pointer. The 301 carries url.search, and the test covers ?out=approved&hour=3. The README and code comments say the flow panel on /boards. The grant test logs a flow read through the terminal's Flow command and checks that revoking the grant closes the door again.

Security: the redirect's location is a fixed path plus the parsed URL's own search. That can't send anyone to another host and can't inject a header, and it reveals nothing about who is asking. /boards still answers 404 to everyone but the owner (tested). The inline Response still gets the security floor from respond.ts like every other response. No new dependency. A dead module is gone, and the links on it (Capacity, Resilience, Contribute) moved to the panel so those pages keep an inbound link. That cuts fat, which is what the direction asks for.

Left for a follow-up. These are low severity and don't block:

  • The README has a capital "The" in the middle of a sentence (line comment below).
  • Several places still name the deleted page:

- docs/DESIGN.md:385 lists the classes under pages/flow.ts, which no longer exists. They now live in pages/flow-panel.ts. - docs/FLOW.md:25,42,59 and docs/APPS.md:1207. - The comments at src/flow/pipeline.ts:16, src/flow/throughput.ts:19 and src/web/pages/boards-held.ts:4 ("on /boards and /flow").

I couldn't open the preview or the screenshots from this sandbox (the host isn't on the allowlist, and /data/looks can't be read). This verdict comes from the diff and the tree at e6c0cf73.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs