Public: anyone can read this; the crew can change it.
One change page: the studio's, with the diff, review and merge box as its Files step #703
Check · Review · Land · Live done — Landed and live in production.
Closes #628
shipped production is serving it for issue #628 — its issue is already done deploy d5b2fe2
Description (the pull body is fixed at open; this is it). Closes #628.
There is now one change page: the studio's change (src/web/studio/change.ts), for every repository, app or not, and every viewer. /pulls/:n and /changes/:n answer the same page, and ?mode=dev and the mode cookie change nothing. Two steps sit under one head: Change (the page) and Files (/pulls/:n/files). It is a tab, never a mode.
Path. Arrive from a post, the board or a list → read the word, then decide: Ship (or Not like this / Bring up to date). On a repository that is not an app, the decision says "Nothing here waits on a check to ship. Read it, then ship it or say what is off." It shows no preview card and no look. Files is one tap away, for reading the code or landing it by hand.
Removed
- Dev's pull page renderer (
pullPageinpages/pull.ts): its header, meta and summary repeated the change page. - The "Read the code ?mode=dev" link.
- The redirect that sent
/changes/:nto/pulls/:nfor dev viewers and non-apps. - Lines:
src/is +383/−353. About 120 of the added lines are moved, not new:pullContext,wallCardandreviewEntry, now in change.ts.diff-view.tsstays, with one new option (reviewPage) so that "+" and Cancel land on the Files step.
What dev's pull page showed or did, and where it lives now
- Diff, inline review threads, thread resolve/unresolve, the
?rc=comment form: Files. An old/pulls/:n?rc=…link now redirects (303) to/pulls/:n/files?rc=…. - Merge box, all six states (merge strategy, review gate, check gate, conflict, mirror "merge on the origin", merged/closed): Files.
- Policy wall ("this pull changes the policy"): on both steps. It sits above Decide, because it is the person's decision.
- Review verdict form (
v a/r/cchords): Files. Verdicts stay in the Change conversation, stale ones marked. - Branch pair (
head → base, including a fork'sowner/name:branch), commit count, fork badge, thread count: the first line of Files. - Commits list, assignee, labels, crew activity: the Files aside.
- State badge, author, "in answer to", origin link, work spent: the shared head.
- Preview card and look: Change, on apps only.
Behaviour fixes made along the way
- The decision no longer offers Ship on a change that waits on an approving review, which
mergePullwould refuse. It says "it waits on an approving review of what it is now". - The forms on Files answer back on Files. A line comment goes to
/files#<file>. A refused merge, a refused verdict or a thread resolve goes to/files. A verdict that lands goes to the conversation, where it is shown.
Tests, updated rather than deleted where the behaviour survives: studio (one page in both modes and on non-apps, Files carries the diff and merge, /changes never bounces), and new refusing tests (an anonymous reader gets 404 on a private change's Files, nothing leaks; a review-gated change offers no Ship; Files' forms redirect back to Files). Also studio-words (Files is not a vocabulary row because it speaks git on purpose; change rows carry titles), pulls, cross-repo-pull, security-merge, reviews (the old ?rc URL redirects), web-workflows, web-apps, web-ui.
Verified. tsc is clean. 26 touched suites pass. The full gate has one red, crew assignment, which is the macOS /private path in the transcript: this machine, and also red on main here. Looks at 390 and 1280 of an app's change, its Files, a non-app change and its Files, against a seeded local forge. No page scrolls sideways. The looks are with the steward.
🤖 Generated with Claude Code
Closes #628
In progress (steward build team). Description, removals and looks follow in a comment.