Repository navigation
Review site: rounds, live diff, papercuts and Approve - #31
Merged
Merged
Conversation
HIDDEN moves from devserver.py to gitread.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
…ktrees Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
The note tab goes away. A bar at the bottom of the page holds the branch select, the "from" and "to" versions and the switch "Show changes". The page marks new words with ins and old words with del, and shows a removed block struck through. textdiff.js reads dt and dd too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
On a narrow screen the bar is one row: the comparison and the switch. A tap on the comparison opens the selects. scroll-padding-bottom keeps find-in-page and focus above the bar. An older round now replaces only the content of main, so the header keeps its listeners. All nodes of the older version are moved: a copy of the list comes first. A failed text request is not kept, so a second try loads it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
The server removes the notes API, --notes and show.py. With env PAPERCUTS_URL it adds the widget tag for the chosen branch and the relay origin to the CSP. A second container, the relay, writes .papercuts/papercuts.db. The skill and the hook now use papercuts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
.github/papercuts.json sets store local, so papercuts in any worktree never files a GitHub issue. The hook looks in the main clone. The CSP test now compares real directives. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
The Approve button and approve.py write a request for the newest round. The host unit checks, pushes, opens the PR and runs ship.sh with the approved sha. ship.sh takes an optional sha for gh pr merge --match-head-commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
The host moves the request away and reads only a small regular file. It checks the head and the worktree again after check.py. A merged PR skips the push, and a kill writes state failed. A new request waits until the run ends. The button hides on Working changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
The README explains the worktrees, the rounds, the bar, the local papercuts store, the Approve button and approve-install.sh, and the .env keys. The compose header makes the three folders before up. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
- The reload stamp has the commit of the worktree. A commit changes only the main .git folder. - .papercuts is hidden: a papercut does not reload the page, and the store is not served. - A valid branch that is not here gives the main clone and a line in the bar, not 400. - After done, the bar loads the versions again. A published round has no Approve button. - After 60 s with no status of the request, the bar says that no host took it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
A pair of blocks goes to Myers only if its shared words can pass the 40 % limit. Myers runs for at most 300 pairs in one run of changed blocks. 150 rewritten paragraphs of 10k words took 8 s. Now they take about 150 ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
The default --root is the parent of the common .git folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
- An agent runs approve.py only when Tim tells it to, in the conversation or in a papercut. - Make the worktrees folder before the stack starts. approve-install.sh needs gh on PATH. - loginctl enable-linger keeps the button working after a reboot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why the change
Tim iterates on texts with agents on the review site, and he could not see what one round changed or publish from there, so the review site now shows each round as marks in the page, takes feedback with papercuts in a local store, and publishes a branch with one Approve click.
Special things to note
SITEinscripts/deploy.shand no page CSP in the files changed. The review server adds the relay origin to the CSP at serve time only..papercuts/papercuts.dbof the main clone (gitignored,"store": "local"in.github/papercuts.json), never to GitHub issues of this public repo.scripts/check.py, pushes<sha>:refs/heads/<branch>without force, andscripts/ship.sh <pr> <sha>merges with--match-head-commit. The review container gets only the request folder as a writable mount. An agent runs Approve only when Tim says so.Screenshots
Review bar on a branch with two rounds, 412 px
Review bar on a branch with two rounds, 1440 px
The bar opened on a phone, 412 px
Change outline
The review server learns about git: it serves the worktree of the chosen branch and lists its rounds (commits after the merge base with master).
Files and their jobs:
Approve, from click to t7d.dev:
Tests: 72 unit tests, 12 node tests,
scripts/check.py0 problems, andcheck_review.py(browser check at 1440, 390 and 320 px, light and dark) all pass. An end-to-end run on a dev copy of the stack covered two rounds, the marks, one papercut into the local store, and Approve with a fake ship against a local bare origin.🤖 Generated with Claude Code
https://claude.ai/code/session_01KFxuEteUiyeGMzLJ2VGnGc