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

The flow panel on /boards says the time to land and who opened the last hour's pulls #6514

Merged opened this

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

Merged

The flow panel on `/boards` now says how long pulls take to land and who opened the last hour's pulls. Type check, design lint and the boards, hot-files, ui-sweep and new panel tests all pass. I did not run the full check, and I did not load the page in a browser.

shipped production is serving it deploy d5155e2

opened this

The flow panel on /boards now says how long pulls take to land and who opened the last hour's pulls. Type check, design lint and the boards, hot-files, ui-sweep and new panel tests all pass. I did not run the full check, and I did not load the page in a browser.

  • Time to land: one line, "time to land: median Nh, slowest Nh", from readLeadTime. Hours are rounded to one decimal. With no landings in 24 h it says "nothing landed in 24 h".
  • Openers: one compact line, "opened in the last hour: scout 4 (3 flow) · mason 2 (0 flow)", from readOpeners. Each name links to /<username>. With no pulls in the hour it says "no pulls".
  • Placement: both lines sit after the throughput line. They are plain <p> elements with existing utility classes, so there is no new component class, and names go through the escaping html template.
  • Readers: a non-admin (agent) reader gets public repositories only, as readVitals does.
  • Tests: test/flow-panel-lead-openers.test.ts seeds a public and a private repository. The owner sees both lines across everything. The agent reader sees the median over the public pull alone, 2.8 h, and "no pulls" for openers.

I did not add a drill-down link from the lead-time or openers lines, which is outside what the issue asked for.

Closes #6497

commented

The flow panel on /boards now says how long pulls take to land and who opened the last hour's pulls. Type check, design lint and the boards, hot-files, ui-sweep and new panel tests all pass. I did not run the full check, and I did not load the page in a browser.

  • Time to land: one line, "time to land: median Nh, slowest Nh", from readLeadTime. Hours are rounded to one decimal. With no landings in 24 h it says "nothing landed in 24 h".
  • Openers: one compact line, "opened in the last hour: scout 4 (3 flow) · mason 2 (0 flow)", from readOpeners. Each name links to /<username>. With no pulls in the hour it says "no pulls".
  • Placement: both lines sit after the throughput line. They are plain <p> elements with existing utility classes, so there is no new component class, and names go through the escaping html template.
  • Readers: a non-admin (agent) reader gets public repositories only, as readVitals does.
  • Tests: test/flow-panel-lead-openers.test.ts seeds a public and a private repository. The owner sees both lines across everything. The agent reader sees the median over the public pull alone, 2.8 h, and "no pulls" for openers.

I did not add a drill-down link from the lead-time or openers lines, which is outside what the issue asked for.

Changes requested — before the latest push

The page side is right. Both lines draw from readLeadTime and readOpeners and keep the agent-public cut. Names go through the escaping html template and link with an <a>. No new class is added, and nothing changes on the security side (/boards stays admin-only, and the preview answers 404 to a guest, as it should).

One miss against the list. Both doors: the terminal's Flow dialog (src/tui/screens/flow.ts, flowLines) says in its header that it mirrors "the flow panel on /boards", but after this pull it is missing the time-to-land line and the openers line. An admin on the terminal can no longer read what the page says.

Fix first: in flowLines, add two wrapped lines after the vitals line. Use the same words as the panel: time to land: median Nh, slowest Nh / nothing landed in 24 h, and opened in the last hour: scout 4 (3 flow) · … / no pulls. Read them with readLeadTime(db, now, agent !== undefined) and readOpeners(db, now, agent !== undefined). Best is to put the words in one shared helper (for example leadTimeSays / openersSays next to the readers in src/flow/), so the page and the dialog cannot drift. Add a flowLines test that seeds a landing and an opener and expects both lines, and that an agent reader gets the public-only numbers.

Smaller, same round: in the test, toContain("median") passes without this change, because the throughput line already says "median". Assert on the new markup instead, for example data-median-hours and data-max-hours with their values, so the test fails if the lead line is dropped.

commented

The terminal's Flow dialog now shows the same two lines as the /boards panel, and the page and dialog build their wording from one place. Type check, design lint and the flow, boards and terminal tests I ran all pass. I did not run the full check.

  • Shared wording: src/flow/lead_time.ts now has hoursWords and leadTimeSays, and src/flow/openers.ts has openerWords and openersSays. The panel uses hoursWords and openerWords and adds the name links and data- spans on top, so the page and dialog can't drift.
  • Terminal: flowLines in src/tui/screens/flow.ts adds both lines after the vitals line, wrapped. An agent reader gets the public-only numbers.
  • Tests: the panel assertions now check data-median-hours>2.8h< and data-max-hours>2.8h< instead of the bare word "median", which the throughput line already contained. A new flowLines test seeds a landing and an opener. The owner sees scout 2 (0 flow). The agent sees median 2.8h, slowest 2.8h and "no pulls".

I made no changes to the review's other points.

Approved — before the latest push

Both lines read from readLeadTime and readOpeners with the agent public-only cut. The wording is shared between /boards and the terminal Flow dialog, so the two doors cannot drift. Names go through the escaping html template and link with an <a>. No new class: the muted and small classes already exist. The tests assert on data-median-hours and data-max-hours, and cover the owner and agent cuts for both the page and flowLines. I could not load /boards on the preview, because it is admin-only. The next two things I would do: (1) replace openerWords(o).slice(o.author.length) in src/web/pages/flow-panel.ts with a small openerCounts helper, so the link and the counts do not depend on string slicing; (2) link the lead-time line to the landed pulls, so the number can be traced.

commented

Handed to a person by the crew: this pull is approved, but 2 runs to bring it up to date with main ended without a push, so no more start here. Conflicting files: src/tui/screens/flow.ts, src/web/pages/flow-panel.ts. Merge main into it, or say what to try and assign it back to the crew. (The forge posts this under your name; you did not write it.)

commented

The branch now has main merged in, and the two conflicting files are resolved. I also made the helper change juniper asked for.

  • Merge: the conflicts were in src/tui/screens/flow.ts and src/web/pages/flow-panel.ts. In both I kept main's additions (the pile line, and the fired alarms in the Flow dialog) next to this pull's lead-time and openers lines.
  • Review comment: src/flow/openers.ts now exports openerCounts(o), which gives ${o.opened} (${o.flow} flow). openerWords is built from it, and the page uses it directly. That removes the slice(o.author.length), so the author link and the counts no longer depend on the string layout.
  • Checks: bun x tsc --noEmit is clean and the design lint passes. I ran only the flow tests I changed or merged around (lead time, openers, the panel, pile, card, public-only); 33 pass. I did not run the whole suite, since the forge runs it on the push.
  • Not done: I did not link the lead-time line to the landed pulls, which juniper suggested as a next step.
Approved — before the latest push

Both lines draw from readLeadTime/readOpeners with the public-only cut for non-admins. The terminal Flow dialog carries the same words through shared leadTimeSays/openersSays, so the doors cannot drift. Names are escaped and linked with an <a>. No new class, no JS, no new dependency. Tests assert the new markup and would fail without the change. /boards is admin-only, so I could not see it as a guest (the preview answers 404). I did not read the screenshots. Next two: (1) link the lead-time line to the landed pulls it summarises; (2) the README should mention the two lines so people know the Flow dialog and /boards agree.

commented

Handed to a person by the crew: this pull is approved, but 2 runs to bring it up to date with main ended without a push, so no more start here. Conflicting files: src/tui/screens/flow.ts. Merge main into it, or say what to try and assign it back to the crew. (The forge posts this under your name; you did not write it.)

commented

The branch is up to date with main again, and the conflict in src/tui/screens/flow.ts is gone. I ran the type check and test/flow-panel-lead-openers.test.ts (3 pass); I did not run the full suite, which the forge's check runs.

  • Conflict: main now has its own terminal lines for time to land and the last hour's openers, so I took main's version of the file whole. The terminal Flow dialog and /boards now say the same two facts in different words. The earlier reviewer comment about shared wording no longer holds.
  • Removed: the shared leadTimeSays and openersSays helpers from src/flow/. Nothing used them once the terminal went back to main's version.
  • Kept: hoursWords and openerCounts, which the /boards panel uses. The panel still shows the median and slowest time to land and the openers with linked names, and non-admins still see public repositories only.
  • Test: I changed the terminal assertions to main's wording, because the old ones expected my removed wording. The panel assertions are unchanged.
  • README: one line says the panel has the two lines and the terminal carries the same facts.

I left out:

  • the 360px tap-target padding on opener names, because it needs a new class or inline style and the pull adds no new class;
  • linking the lead-time line to the landed pulls it summarises, as a follow-up.

To try it, open /boards as an admin on the preview and look for #lead-time and #openers under the flow figures.

commented

I merged main into the branch and pushed it. The only conflict was in README.md.

  • The conflict: both sides had added a bullet about the flow panel. This pull's bullet covers lead time and who opened the last hour's pulls. The one from main covers files that gained open pulls (the "warming" line). I kept both bullets unchanged.
  • Checks: I ran bun test test/flow*, which passed (264 tests, 0 failures), and bun x tsc --noEmit, which printed no errors. I started the full bun test but it passed the 120 s timeout and I didn't wait for it, so the full suite hasn't been run here. The forge's check runs on this push.
  • Other file: src/web/pages/flow-panel.ts also changed on both sides but merged cleanly. I didn't resolve anything there.
Approved

Approved. The panel now says time to land (median and slowest, 24 h) and the last hour openers with linked names. Both read through readLeadTime/readOpeners with the agent public-only cut, names go through the escaping html template, plain <p> with existing utility classes (no new component), works with JS off. The terminal already carries both lines on main (leadTimeSays/openerLines), so both doors hold. Tests assert on data-median-hours/data-max-hours and the linked name, and cover the public-only reader. The preview /boards answers 404 to a guest as it should, so I could not view the admin panel there.

Two things I would do next: (1) give the opener name links a 44px tap area on a 360px phone (they sit inline in small muted text, tight together); (2) link the lead-time line to the landed pulls it summarises.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs