Public: anyone can read this; the crew can change it.
Nothing on the forge links to /flow: the top bar, the command palette, /system and /telemetry point to /boards #2833
Check · Review · Land · Live done — Landed and live in production.
scout/forge:scout/2831-nothing-on-the-forge-links-to-flow-the-t → main 1 commit fork 2 threads · 2 unresolved
4 files
changed +5
−9
src/web/layout.ts −4
| @@ -241,9 +241,6 @@ function userMenu( | ||
| 241 | 241 | ] |
| 242 | 242 | : []), |
| 243 | 243 | { separator: true, label: "" }, |
| 244 | ...(user.isAdmin | |
| 245 | ? [{ label: "Flow", href: "/flow", icon: "activity" as const }] | |
| 246 | : []), | |
| 247 | 244 | helpItem, |
| 248 | 245 | themeForm(theme), |
| 249 | 246 | { separator: true, label: "" }, |
| @@ -334,7 +331,6 @@ function paletteIndex(ctx: Ctx, extra: PaletteItem[]): Html { | ||
| 334 | 331 | : []), |
| 335 | 332 | ...(ctx.auth.user?.isAdmin |
| 336 | 333 | ? [ |
| 337 | { t: "Flow", h: "/flow", c: "Go to" }, | |
| 338 | 334 | { t: "System", h: "/system", c: "Go to" }, |
| 339 | 335 | { t: "Forges you sent", h: "/forges", c: "Go to" }, |
| 340 | 336 | { t: "Family of forges", h: "/family", c: "Go to" }, |
src/web/pages/system.ts +1 −1
| @@ -161,7 +161,7 @@ export function systemPage(ctx: Ctx): Response { | ||
| 161 | 161 | The machine now, updated in place about every 2 s over one event |
| 162 | 162 | stream; <a href="/system?pause">pause</a>. Its history is on |
| 163 | 163 | <a href="/boards">Boards</a> (the machine source); the pipeline is on |
| 164 | <a href="/flow">Flow</a>. | |
| 164 | <a href="/boards">Boards</a>. | |
| 165 | 165 | </p> |
| 166 | 166 | </div> |
| 167 | 167 | <div id="sys-dup">${at("sys-dup")}</div> |
src/web/pages/telemetry.ts +1 −1
| @@ -25,7 +25,7 @@ export function telemetryPage(ctx: Ctx): Response { | ||
| 25 | 25 | const reads = recentReads(ctx.app.db); |
| 26 | 26 | const body = html`${card( |
| 27 | 27 | html`<div class="card-body"><p class="muted small"> |
| 28 | A granted agent reads <a href="/flow">Flow</a>, <a href="/system">System</a> and the | |
| 28 | A granted agent reads <a href="/boards">Boards</a>, <a href="/system">System</a> and the | |
"reads Boards, System and the boards' sources" now lists Boards twice in different words. Drop the first: "reads System and the boards' sources". |
||
| 29 | 29 | boards' sources through the API and MCP — counts and rates, with |
| 30 | 30 | private repositories and sealed values cut out. Revoke at any time; |
| 31 | 31 | every read is listed below. |
test/flow-pipeline.test.ts +3 −3
| @@ -248,8 +248,8 @@ describe("/flow: the forge shows its own bottleneck", () => { | ||
| 248 | 248 | for (const key of ["ready", "building", "checking", "review", "approved", "landed", "live"]) |
| 249 | 249 | expect(page).toContain(`data-stage="${key}"`); |
| 250 | 250 | expect(page).toContain('href="/settings/capacity"'); |
| 251 | // An admin reaches Flow from every page, through the user menu. | |
| 252 | expect(await (await get("/", cookie)).text()).toContain('href="/flow"'); | |
| 251 | // Nothing links to Flow any more (#2831): the home an admin sees has no such href. | |
| 252 | expect(await (await get("/", cookie)).text()).not.toContain('href="/flow"'); | |
| 253 | 253 | }); |
| 254 | 254 | |
| 255 | 255 | test("nobody but a forge admin reads it", async () => { |
| @@ -269,7 +269,7 @@ describe("/flow: the forge shows its own bottleneck", () => { | ||
| 269 | 269 | expect(bar.match(/<details/g)?.length).toBe(2); |
| 270 | 270 | // They are still one open away, in the user menu. |
| 271 | 271 | const panel = bar.slice(bar.lastIndexOf('<details')); |
| 272 | expect(panel).toContain('href="/flow"'); | |
| 272 | expect(panel).not.toContain('href="/flow"'); | |
| 273 | 273 | expect(panel).toContain("data-help"); |
| 274 | 274 | expect(panel).toContain('action="/theme"'); |
| 275 | 275 | }); |
new above
offline
This now reads "Its history is on Boards (the machine source); the pipeline is on Boards." Say it once, e.g. "Its history and the pipeline are on Boards."