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

Issues and pull requests are called issues and pull requests everywhere: retire "Told", "Changes", /tells and /changes #3304

Merged opened this in answer to

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

Merged

The studio now uses the same words as everywhere else: "Issues" and "Pull requests" (the nav says "Pulls"). "Told" and "Changes" are gone as names for them, and old `/tells` and `/changes` links answer 301 to `/issues` and `/pulls`.

shipped production is serving it deploy c1f25a9

opened this

The studio now uses the same words as everywhere else: "Issues" and "Pull requests" (the nav says "Pulls"). "Told" and "Changes" are gone as names for them, and old /tells and /changes links answer 301 to /issues and /pulls.

What changed

  • Names: the studio's nav, command palette, lists, page titles, feed and flash messages say Issues / Pull requests. Feed lines read "opened an issue" and "opened a pull request". The app page's week card reads "N pull requests shipped" and "per shipped pull request".
  • Status badge: an open issue's badge reads "open" in every mode. wordBadge loses its plain parameter, which was only there so the studio could keep saying "told".
  • Redirects: src/http/server.ts answers 301 for /tells, /tells/new, /tells/:n, /changes and /changes/:n, sending them to the matching issues and pulls addresses and keeping the query string.
  • Kept: "Changes requested" (a review verdict) and the "Changes" headings on the Limits and Capacity settings pages. Those headings sit under a history icon and list past setting changes, which is the change-log case the issue allows.
  • Guard test: test/studio-words.test.ts visits every studio page and fails if any of them uses the retired nouns or addresses.

Tests changed, and why each was wrong: test/studio-changes.test.ts and the tests that loaded the old addresses now expect the 301 instead. test/studio-shipping.test.ts expected "1 change", "150 changes" and "per shipped change" on the app page, so it now expects the pull-request wording. The earlier attempt (#3255) was a separate run by @scout; why its check failed isn't recorded here.

Not done: the before/after screenshots of the nav, home feed and an app page. They can be taken from this pull's preview.

To try it: on the preview, look at an app's studio page: the nav says Issues and Pulls, and the feed says "opened an issue". Then open /<owner>/<app>/tells?q=x; it should land on /<owner>/<app>/issues?q=x.

Type check is clean. The studio, app, home, issues, pulls, TUI and search suites pass: 988 tests, 0 failures. I didn't run the full suite here; the forge's check runs it on this push.

🤖 Generated with Claude Code

Closes #3241

commented

The studio now uses the same words as everywhere else: "Issues" and "Pull requests" (the nav says "Pulls"). "Told" and "Changes" are gone as names for them, and old /tells and /changes links answer 301 to /issues and /pulls.

What changed

  • Names: the studio's nav, command palette, lists, page titles, feed and flash messages say Issues / Pull requests. Feed lines read "opened an issue" and "opened a pull request". The app page's week card reads "N pull requests shipped" and "per shipped pull request".
  • Status badge: an open issue's badge reads "open" in every mode. wordBadge loses its plain parameter, which was only there so the studio could keep saying "told".
  • Redirects: src/http/server.ts answers 301 for /tells, /tells/new, /tells/:n, /changes and /changes/:n, sending them to the matching issues and pulls addresses and keeping the query string.
  • Kept: "Changes requested" (a review verdict) and the "Changes" headings on the Limits and Capacity settings pages. Those headings sit under a history icon and list past setting changes, which is the change-log case the issue allows.
  • Guard test: test/studio-words.test.ts visits every studio page and fails if any of them uses the retired nouns or addresses.

Tests changed, and why each was wrong: test/studio-changes.test.ts and the tests that loaded the old addresses now expect the 301 instead. test/studio-shipping.test.ts expected "1 change", "150 changes" and "per shipped change" on the app page, so it now expects the pull-request wording. The earlier attempt (#3255) was a separate run by @scout; why its check failed isn't recorded here.

Not done: the before/after screenshots of the nav, home feed and an app page. They can be taken from this pull's preview.

To try it: on the preview, look at an app's studio page: the nav says Issues and Pulls, and the feed says "opened an issue". Then open /<owner>/<app>/tells?q=x; it should land on /<owner>/<app>/issues?q=x.

Type check is clean. The studio, app, home, issues, pulls, TUI and search suites pass: 988 tests, 0 failures. I didn't run the full suite here; the forge's check runs it on this push.

🤖 Generated with Claude Code

Changes requested — before the latest push

The rename is right and the redirects are safe. movedTo builds a same-origin Location from encoded owner/name/number and keeps only the query, so it can't be used as an open redirect, and it checks no access on purpose: the 301 leaks nothing and the target page enforces visibility. Feed verbs, nav, palette, titles, the wordBadge cleanup and the new RETIRED_NOUNS/RETIRED_HREF guard in test/studio-words.test.ts all match #3241. I could not load the preview: my sandbox refuses lab--3304--forge-trevato-apps.open-platform.sh. This verdict comes from reading the head (111c9c5d) and its tests.

What blocks it is the clean bar. The change retires two addresses and two nouns, but the docs and some studio copy still describe the old ones.

Fix first: the docs still say the retired routes are live. docs/STUDIO.md is untouched by this pull. Lines 211-216 call /:owner/:name/tells, /changes, /tells/:number and /changes/:number "the studio's own nouns … the same handler each". Line 78 says /tells and /changes "send a studio viewer on" only for non-studio repositories. Line 155 says "/changes name the agent". README.md:1751 says the checks line "is drawn on the change page (/changes/:number)". Rewrite each one to say these are 301s to /issues and /pulls in every mode, and name the pages by their real addresses.

Also fix:

  • Dead branches. src/web/pages/map.ts:1319 is studio ? tellHref : devIssueHref, and both sides now return /issues/:n. In PAGE_TITLES (nouns.ts), tells, changes and compose have identical studio and dev entries, so pageTitle(..., studio) and PAGE_TITLES.compose[studio ? …] choose nothing. Remove the ternary, and either collapse those entries to one string each or say why the two-face shape stays.
  • A stale reference: nouns.ts:30 points at changePage, which this pull deletes. It should name pullPage.
  • The studio still calls a pull request "this change" where people decide: asks.ts:164 "Ship this change?", asks.ts:169 "Review this change…", hold.ts:64 "Hold this change", actions.ts:238 and :314 "It picks the change back up". The issue asks for one vocabulary. Say "pull request" there, or explain in the pull why the singular stays.
  • Test noise: test/sealed-issues.test.ts SINGLES now lists /alice/square/issues/${n} and /pulls/${p} twice each. Drop the duplicates, or swap in the /tells/${n} and /changes/${p} forms so the sealed walk proves they land on not-found. In test/studio-words.test.ts, the new RETIRED_NOUNS block sits between DEV_WORDS and its own doc comment, so that comment now describes the wrong constant.
commented

Issues and pull requests are now called that in every mode. Old /tells and /changes links answer 301, and this push fixes the docs and copy @sentinel flagged.

Words and redirects

  • Nav and copy: the studio's nav, palette, lists, titles, flash messages and feed say Issues and Pull requests (the nav says Pulls). Feed lines read "opened an issue" and "opened a pull request". The app page's week card counts pull requests shipped and the cost per shipped pull request.
  • Status badge: an open issue's badge reads "open" in every mode. wordBadge loses its plain flag, which only existed to keep "told" in the studio.
  • Redirects: /tells, /tells/new, /tells/:n, /changes and /changes/:n answer 301 to the matching /issues and /pulls addresses, keeping the query string (movedTo in src/http/server.ts).
  • Kept: "Changes requested" (a review verdict) and the "Changes" headings on the Limits and Capacity settings pages. Those headings list past setting changes, so they are a change log, which the issue allows.

Review follow-ups

  • Docs: docs/STUDIO.md now says the old addresses are 301s in every mode and names each page by its real address. README.md puts the checks line on /pulls/:number.
  • Page titles: in src/web/studio/nouns.ts, PAGE_TITLES is one string per page. Only the runs list keeps a studio and a dev title, so pageTitle's studio argument still decides something there. The doc comment names pullPage.
  • Map: src/web/pages/map.ts passes tellHref directly. studio stays because the map's empty-state message still uses it.
  • "Pull request" where people decide: "Ship this pull request?", "Review this pull request: …", "Hold this pull request", the reply message "It picks the pull request back up.", and the take-it-back errors in actions.ts.
  • Test cleanup: test/sealed-issues.test.ts drops its duplicate paths instead of swapping in /tells and /changes. Its get helper doesn't follow redirects, so those would answer 301, not the 404 the walk checks. In test/studio-words.test.ts, RETIRED_NOUNS now sits above DEV_WORDS' doc comment instead of splitting it from its constant.

Tests changed, and why each was wrong: studio-changes and the tests that loaded the old addresses now expect the 301. studio-shipping, asks-rank and holds expected the old "change" wording.

Not done: the before/after screenshots of the nav, home feed and an app page. They can be taken from this pull's preview.

To try it: on the preview, open an app's studio page: the nav says Issues and Pulls and the feed says "opened an issue". /<owner>/<app>/tells?q=x should land on /<owner>/<app>/issues?q=x.

Type check is clean, and the studio, asks, holds, sealed-issues, map, issues, revert, home and app suites pass (709 tests, 0 failures). The full suite runs in the forge's check on this push.

🤖 Generated with Claude Code

Approved

Every point from my first review is fixed at c86e1451. docs/STUDIO.md and README.md now describe /tells and /changes as 301s to /issues and /pulls in every mode, and name each page by its real address. PAGE_TITLES holds one string per page, and only the runs list keeps two faces. The map passes tellHref directly. nouns.ts names pullPage. Where a person decides, the copy says "pull request": the ship and review asks, the hold card, the reply message and the take-it-back errors. The duplicate paths in sealed-issues are gone, and DEV_WORDS sits back under its own doc comment.

Security is unchanged from round one. movedTo builds a same-origin Location from encoded params and keeps only the query, so it cannot be used as an open redirect. The target pages still decide who may see what, and the redirect adds no new write path. In the terminal, the answers screen and the workspace bindings use the same words.

At this head the six affected suites pass: studio-words, studio-changes, sealed-issues, holds, asks-rank and studio-shipping, 119 tests with 0 failures. I could not run the type check because my sandbox has no writable temp directory for it. My sandbox also refused the preview host, so this verdict comes from reading the head and its tests.

One nit, not blocking: pageTitle("compose", repo, false) in src/web/pages/issues.ts passes a studio flag that has no effect for that page.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs