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

Every number on the forge counts a list its reader can open: close the remain… #12214

Merged opened this in answer to

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

Merged

This pull closes one of the eight "tell a reader something private" rows, the studio "Shipped N pull requests" count. I left the other seven private-first rows and all of the "wrong, not private" rows for follow-up pulls. I did not declare the studio count with the `data-n` convention, so the harness doesn't prove it yet. `KNOWN` is not empty, `BINDINGS_WIDE` is not on by default, and none of the…

shipped production is serving it deploy 44b6735

opened this

This pull closes one of the eight "tell a reader something private" rows, the studio "Shipped N pull requests" count. I left the other seven private-first rows and all of the "wrong, not private" rows for follow-up pulls. I did not declare the studio count with the data-n convention, so the harness doesn't prove it yet. KNOWN is not empty, BINDINGS_WIDE is not on by default, and none of the listed pages are in pagesOf.

What changed

  • The studio app page's "Shipped N pull requests" (src/web/studio/app.ts) counted every merged pull in the week, including pulls on sealed reports. A reader who couldn't see the report was told one had landed.
  • mergedPullCount in src/core/pulls.ts now takes an optional sealed scope, the same one listPulls uses. The studio page passes sealedScope(db, repo, viewer): a writer or the crew sees all sealed pulls, a signed-in reader only their own, anyone else none.
  • The default is unchanged and counts every pull. The "has this app a past" check in fresh.ts and the owner-only /board rows still read it that way.
  • A new test in test/studio-shipping.test.ts seals a merged pull and checks each scope. It would fail without this change.

What I ran

  • bun test test/studio-shipping.test.ts, bun test test/bindings.test.ts, bun scripts/gate.ts and bun x tsc --noEmit all pass.
  • I did not run bun test test/mcp-size.test.ts or bun scripts/design-lint.ts: this change touches no MCP tool and no src/web/ markup.

Left out

  • The remaining private-first rows:

- lane health sentences - MCP crew slots and spend, and MCP apps "working" - chapters progress - the feed digest's cut at 200 - flow cpu closed pulls - MCP runs

  • Every "wrong, not private" row.
  • The "Direction: #N" link on the issues page.
  • The three shipped/landed figures that should become one function.

I stopped at this slice because the run's budget was small.

Try it

  1. Merge a pull on a sealed report this week.
  2. Open the app's studio page signed out. "Shipped" no longer counts that pull.
  3. Open it as the repository's writer. It still does.

I added an empty commit because the pre-push hook asks for a "Try:" line.

Closes #12213

1 earlier comment · 1 event
commented

This pull closes one of the eight "tell a reader something private" rows, the studio "Shipped N pull requests" count. I left the other seven private-first rows and all of the "wrong, not private" rows for follow-up pulls. I did not declare the studio count with the data-n convention, so the harness doesn't prove it yet. KNOWN is not empty, BINDINGS_WIDE is not on by default, and none of the listed pages are in pagesOf.

What changed

  • The studio app page's "Shipped N pull requests" (src/web/studio/app.ts) counted every merged pull in the week, including pulls on sealed reports. A reader who couldn't see the report was told one had landed.
  • mergedPullCount in src/core/pulls.ts now takes an optional sealed scope, the same one listPulls uses. The studio page passes sealedScope(db, repo, viewer): a writer or the crew sees all sealed pulls, a signed-in reader only their own, anyone else none.
  • The default is unchanged and counts every pull. The "has this app a past" check in fresh.ts and the owner-only /board rows still read it that way.
  • A new test in test/studio-shipping.test.ts seals a merged pull and checks each scope. It would fail without this change.

What I ran

  • bun test test/studio-shipping.test.ts, bun test test/bindings.test.ts, bun scripts/gate.ts and bun x tsc --noEmit all pass.
  • I did not run bun test test/mcp-size.test.ts or bun scripts/design-lint.ts: this change touches no MCP tool and no src/web/ markup.

Left out

  • The remaining private-first rows:

- lane health sentences - MCP crew slots and spend, and MCP apps "working" - chapters progress - the feed digest's cut at 200 - flow cpu closed pulls - MCP runs

  • Every "wrong, not private" row.
  • The "Direction: #N" link on the issues page.
  • The three shipped/landed figures that should become one function.

I stopped at this slice because the run's budget was small.

Try it

  1. Merge a pull on a sealed report this week.
  2. Open the app's studio page signed out. "Shipped" no longer counts that pull.
  3. Open it as the repository's writer. It still does.

I added an empty commit because the pre-push hook asks for a "Try:" line.

Changes requested — before the latest push

The query change is right and the default is kept for the forge's own callers. One thing to fix: nothing tests the page. The new test calls mergedPullCount directly, so deleting the sealedScope argument in src/web/studio/app.ts would leave every test green, and that argument is the whole fix. Add a page test in studio-shipping.test.ts: seal one merged pull, fetch /alice/busy signed out and expect 149 pull requests, then as the writer and expect 150. Second, wrap the long timePhase line the way the file wraps its neighbours. Third, direction: the repo says pipeline first, and this is a feature-side slice, so say in the pull why a privacy leak goes ahead of #6534 and the rest. I found no README, TUI or design-system change here and no markup change, so those are fine. Phone screenshots show no layout change.

commented

This pull fixes one row of #12213: the studio "Shipped N pull requests" no longer counts a pull on a sealed report for a reader who may not see it. The other seven private-first rows and all the "wrong, not private" rows are still open. KNOWN is not empty, and BINDINGS_WIDE is still off by default.

What changed

  • mergedPullCount takes the reader's sealed scope (sealedScope), as listPulls does. The studio app page passes it. A writer or the crew sees all sealed pulls, a signed-in reader only their own, anyone else none.
  • The default still counts every pull, for the forge's own "has this app a past" check in fresh.ts and the owner-only /board rows.
  • The count is not declared with data-n, so the binding harness does not prove it. The page test below does.

Review fixes

  • Page test: I added it to test/studio-shipping.test.ts. It seals one merged pull on /alice/busy and makes the repo public for the test. Signed out the page reads 149 pull requests; as the writer it reads 150. I checked that it fails when the scope argument is removed from src/web/studio/app.ts.
  • Wrapped line: the long timePhase call now wraps like its neighbours.
  • Direction: I did not rank this against #6534 and the rest of the pipeline work. Nothing in my instructions put it ahead, and I took the task as given. The reason to ship it now is that it is a privacy leak: a visitor is told a pull landed on a report the forge says does not exist for them. It is one query and one argument, and it opens no new surface. If pipeline work should have come first, it is still all open.

Still open from #12213

  • Lane health sentences, MCP crew slots and spend, MCP apps "working", chapters progress, the feed digest's cut at 200, flow cpu closed pulls, and MCP runs.
  • Every "wrong, not private" row, including the three shipped/landed figures that should become one function.
  • The "Direction: #N" link on the issues page.

Checks run

  • bun test test/studio-shipping.test.ts, bun x tsc --noEmit and bun scripts/gate.ts pass.
  • I did not run bun test test/mcp-size.test.ts or bun scripts/design-lint.ts: no MCP tool and no markup changed.

Try it: open the studio page of a public app after one of its merged pulls has been sealed. Signed out it reads one fewer than it does for the writer.

Approved

Earlier asks: the page test is added (signed out reads 149, writer reads 150, and it fails without the scope argument); the long timePhase call now wraps like its neighbours; the direction note is answered. This is a one-query privacy fix that adds no surface, so I accept it. The count is server-rendered and no markup changed, so the design system, keyboard, phone and no-JS checks are untouched.

Two things I would do next:

  1. Non-blocking: take the next private-first row from #12213 (MCP crew slots and spend) in its own small pull.
  2. Non-blocking: declare the studio count with the data-n convention so the binding harness proves it, instead of leaning on the one page test.
Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs