Skip to content

Take four more of the guide's screenshots automatically, and make a retake change less - #621

Merged
zaerl merged 3 commits into
trunkfrom
docs/automate-live-screenshots
Oct 5, 2026
Merged

zaerl merged 3 commits into
trunkfrom
docs/automate-live-screenshots

Conversation

@zaerl

@zaerl zaerl commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Why

Second part of #561. #620 retook the twelve screenshots the harness takes by itself. Sixteen more needed a person: nine because they show a state no seeded settings file can express, and six that no script took at all. Settings (#559) and dark mode (#560) will each change every picture in the guide again, so a picture that takes a person is one that will be stale. This moves the first four to the automatic tier.

What changes

Four shots join the automatic tier (npm run shots), which is now sixteen:

  • dev-server-running, which was live: the stood-in server's start now says where the site is served and where the mail server listens before it answers, as a real start does, so the window has a running server.
  • trac-ticket-panel and site-view, which were live: Trac's answer is the fixture's. The real one is read off the ticket's page in a window of its own, past Trac's human-check.
  • linked-pull-requests, which no script took: the card's two lists.

What the harness gained for them:

  • A shot can say which part of the window it is of when that is no one element (clip). A part that is not wholly inside the page is refused, so a card grown taller than the page fails the run and is not photographed with the footer across it.
  • Nothing a shot does opens the browser. A server that comes up opens its site there.
  • What a shot starts in the main process is ended after its picture, so no shot is handed a state by the one before.

So that a retake changes less:

  • No shot draws a text caret. The create-site dialog's picture had one in some runs and not in others.
  • The pictures are drawn in software (--disable-gpu). A curved edge was drawn a few pixels differently from run to run, in one picture every two or three runs. In software it is about one in ten. Every image is retaken for this, the twelve of Retake the guide's automatic screenshots against the redesigned window #620 included; none looks different.

Beside the images: the alt text of the four, in the six places they are used, the README among them.

Not in this pull request:

  • The eleven that are left: setup-wizard, the review dialog's three (submit-changes-diff, submit-destinations, github-sign-in), trunk-update-progress, apply-patch-conflict, and five that no script takes (carried-work-notice, site-with-tickets, ticket-list-card, ticket-list-unlinked, trunk-work-question). All but the first need a site with a real Git repository in it, which the fixture's empty folders are not; that is the next pull request.
  • The guide's prose. Four pages now say things beside these pictures that the pictures contradict (old button names, a URL that is no longer shown, "Show Trac attachments"); the list is in the review outcome.

How to test this

Platforms: macOS to reproduce the committed images; the harness runs on any. Nothing here ships in the app.

From the repository root, after npm ci:

npm run shots
git status --short docs/public/screenshots
  1. The run prints sixteen lines, each ✓ <name>.png, and exits 0. It opens the app's window four times; do not type while it runs, and no browser tab opens.
  2. On the machine and the UTC day the images were taken, git status usually shows nothing. About one run in ten it shows one image, changed by a handful of pixels on a rounded corner; take it again and it is gone.
  3. Open dev-server-running.png: under Server in the details, a Stop button, View site, wp-admin, Database, and the admin credentials. trac-ticket-panel.png: the ticket's summary, status, type, component, milestone and keywords, and two pull requests. linked-pull-requests.png: two pull requests and one patch, each with Apply….

What must not have happened: a real server started, a browser tab opened, or anything asked of GitHub or Trac; a crop with the header or the footer in it.

What cannot be promised: the same bytes on every run. I took the tier six times after the last change: five were identical and one differed in one image; and one shot taken ten times differed once, in eight pixels on its card's corners. I found no cause in the app (no transition, hover, caret or spinner there) and stopped at "less often".

Risks and limitations

  • Review: 2 passes, 7 findings fixed here, 2 follow-ups taken here. Details below.
  • Sixteen images change, twelve of them for the second day running. That is the cost of drawing in software, paid once.
  • The stood-in server is a running server of which nothing is running. The picture is of the window in that state; a link in it would lead nowhere.
  • The fixture's ticket, pull requests and patch are made up, and say so nowhere in the picture: #60000 is not that ticket on Trac.
  • The guide's text beside these pictures is still the old window's.

Related

Part of #561, which is part of #542. Follows #620.


Design decisions and alternatives considered
  • Back to the automatic tier, after Retake docs screenshots for the 1.0 UI (build watch, wp-admin link, ticket facts) #298 moved them out of it. They were moved because a seeded settings file cannot express a serving server or a ticket's facts, and a picture of a state the app never reaches is worse than none. What changed is the means: the outside is answered for the app, as the journeys answer it, and the app reaches the state by itself.
  • The server's start says what a real start says, in the stand-in, for every shot; and not a helper a shot calls afterwards. The first try was the helper, and its message arrived before the window was listening for it.
  • A crop given as a rectangle and not a wrapper element added to the app for a picture's sake.
Review outcome (required — see AGENTS.md)

Pass 1: 5 [fix here] · 2 [follow-up]. Pass 2 (on the fix-up): 2 [fix here] · 0 [follow-up]. All 7 fixed, both follow-ups taken here.

  • Review: completed — a separate agent context, read-only; head d4a6d17 / base 7a7d013; the four images opened and each alt text read against its picture in every place it is used, the stood-in start compared with the real handler message by message, every way out of the app a shot could reach traced; 5 [fix here], 2 [follow-up].
    • Fixed: the running server's Stop button was drawn hovered, the pointer being where it had pressed Start; the fixture's ticket was opened after the pull request and patch that cite it; a crop would have taken in the header or the footer silently if a card grew; the patch's address was not the shape Trac's is; two header comments.
    • Follow-ups, taken here: the debug.log tail one shot starts outlived it; the mail's and the logs' shots were not retaken after the stand-in changed (they were, and did not change).
    • Listed and left for the text: the prose that these pictures now contradict, in running-the-site.md (button names, a red dot, a URL below the button, credentials next to it), editors.md (where the path and the menu are), trac-tickets.md ("panel", a red Closed pill, "Show Trac attachments") and getting-started.md (the site URL).
  • Review: completed — a second separate agent context, read-only; head dfd2a59 / base 7a7d013; 2 [fix here], 0 [follow-up].
    • Fixed: the tail was ended before each shot's reload, where on the first shot of a launch the page may not have loaded; the crop's check had no allowance for a height that is not a whole number.
    • Asked, and answered "no cause in the app": why one picture differed by a 3×3 patch between runs. Its suggestion, drawing in software, is taken.
  • Since review: dfd2a59 → 5f05c28 is those two fixes, the software drawing, and one thing found by taking the shots again: the caret. Not reviewed again. The tier was then taken six times, and one shot ten times, with the results under "How to test this". npm run lint and npm test pass.
Implementation notes
  • scripts/screenshots/fixtures.cjs: TICKET_FROM_TRAC, SERVER_URL; standInForTheOutside also answers trac:list-attachments and url:open, and its playground:start sends smtp:started and playground:url before it answers.
  • scripts/screenshots/capture.cjs: clip; --disable-gpu; no caret; the tails ended after each shot.
  • scripts/screenshots/shots.cjs: openReadySite, readTicketFromTrac, insideThePage; the four shots; three live entries removed.
Screenshots or recording

The images are the change: docs/public/screenshots/ in the diff, which GitHub shows before and after.

🤖 Generated with Claude Code

zaerl and others added 3 commits October 5, 2026 16:04
…rver, a ticket's facts, the site view

Three of the nine shots that needed a person at a real site, and one that
no script took, join the automatic tier (#561):

- dev-server-running: the stood-in server's start now says where the site
  is served and where the mail server listens, as a real start does
  before it answers, so the window has a running server.
- trac-ticket-panel and site-view: Trac's answer is the fixture's, where
  the real one is read off the ticket's page past its human-check.
- linked-pull-requests: the card's two lists, cut out of the window from
  the first list's heading to the card's foot. A shot can now say what
  part of the window it is of when that is no one element.

Nothing a shot opens goes to the browser: a server that comes up opens
its site there. The alt text of the four images, in the six places they
are used, says what the new pictures show.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… the fixture's ticket older than its patches

From the review. A shot that cuts a part out of the window is refused if
the part is not wholly inside the page: a card grown taller than the page
would otherwise be photographed with the header or the footer across it.
The debug.log tail a started server leaves in the main process is ended
before the next shot, so that no shot is handed a state by the one before.

The running server's Stop button was drawn as if about to be pressed: the
pointer was still where it had pressed Start. The fixture's ticket was
opened after the pull request and the patch that cite it, and its patch's
address was not the shape Trac's is.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e changes less

From the second review, and from taking the shots again after it.

One picture in every two or three runs differed from the last by a few
pixels on the corner of a badge or a card: a curved edge is drawn a little
differently depending on what was redrawn before it. A retake then showed
an image as changed that was not. With the GPU off that is about one run
in ten; it is not never. Every image is retaken for it; none looks
different.

The create-site dialog's picture had the name field's caret in it in some
runs and not in others, since a caret blinks. No shot draws one now.

The tail a shot leaves is ended after its picture and not before the next
shot's reload, where the page may not have loaded yet on the first shot of
a launch. A crop is allowed a pixel past the page's edge, for heights that
are not whole numbers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 5, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: WordPress/contributor-toolkit/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 03c41255-dbd1-4e96-b05e-b855f0ad8363

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@zaerl zaerl self-assigned this Oct 5, 2026
@zaerl
zaerl merged commit d1616d2 into trunk Oct 5, 2026
10 checks passed
@zaerl
zaerl deleted the docs/automate-live-screenshots branch October 5, 2026 14:35
zaerl added a commit that referenced this pull request Oct 5, 2026
… that is a real checkout (#631)

## Why

Third part of #561. After
#621 sixteen of the
guide's screenshots were taken by `npm run shots` and eleven still
needed a person. Ten of those eleven need what the fixture's empty
folders are not: a site with a real Git checkout in it. This gives the
fixture one, and moves the first five across. Settings (#559) and dark
mode (#560) will each change every picture in the guide again, so a
picture that takes a person is one that will be stale.

## What changes

**Five shots join the automatic tier**, which is now twenty-one. All
five were live:

- `submit-changes-diff`: the review dialog's diff, of one changed line
and one new test file.
- `submit-destinations`: the same dialog's three destinations on a Core
site.
- `github-sign-in`: the Open a pull request card while it waits for the
code to be entered.
- `apply-patch-conflict`: the ticket's patch applied over an edit to the
same line.
- `trunk-update-progress`: an update at its third step.

**A fixture that is a checkout.** The `repo:` variants are a real
repository under the fixture's folder, made with the app's bundled Git
binary through the helpers the journeys' and unit tests' sites are made
with. The shot then does the rest through the app: links the ticket,
edits a file, opens the review, applies the patch, or updates from an
origin (a second repository beside it, on `file://`) that is one commit
ahead. Each has a repository and a launch of its own, since it writes to
both.

**More of the outside answered for the app:** GitHub's account and
sign-in, the ticket's patch from Trac, an install and a build. The
sign-in's code is made up.

**What the harness gained for them:**

- A shot can ask for a taller window than the one on screen
(`viewport`). The destinations need it: three cards, one under another.
- A spinner is drawn standing still. It turned between one run and the
next, and the picture with it.
- The fixture's folders are removed with the helper that unlocks Git's
read-only objects first, and a launch's profile folder is removed when
the launch ends.

**Beside the images:** the alt text of the five, and one more image
changes, `linked-pull-requests`, because the size its card gives for the
ticket's patch is now the patch's own.

**Not in this pull request:**

- The six that are left: `setup-wizard`, and five that no script takes
(`carried-work-notice`, `site-with-tickets`, `ticket-list-card`,
`ticket-list-unlinked`, `trunk-work-question`, all in the ticket
branches page). The five are the next pull request, on this fixture.
`setup-wizard` may have to stay a person's: the setup it shows starts
only when a clone finishes.
- The guide's prose. Two pages now say things beside these pictures that
the pictures contradict; the list is in the review outcome.

## How to test this

Platforms: macOS to reproduce the committed images; the harness is
written to run on any, and I have run it on macOS only. Nothing here
ships in the app.

From the repository root, on the current head, after `npm ci`:

```
npm run shots
git status --short docs/public/screenshots
```

1. The run prints twenty-one lines, each `✓ <name>.png`, and exits 0. It
opens the app's window nine times; do not type while it runs, and no
browser tab opens.
2. On the machine and the UTC day the images were taken, `git status`
usually shows nothing.
3. Open `apply-patch-conflict.png`: a red notice that the checkout was
not changed, then `src/wp-includes/summary-length.php`, "Near" a line of
code, and the lines that did not fit. `trunk-update-progress.png`: step
3 of 3, with the install skipped. `submit-destinations.png`: a heading
and three destinations in two cards, nothing cut off below "Change
these".

**What must not have happened:** anything asked of GitHub or Trac, an
`npm install` or a build started, a browser tab opened; a folder named
`wpct-docs-fixture` or `wpct-userdata-…` left in the temporary directory
after the run; a crop with part of another column in it.

**What cannot be promised:** the same bytes on every run. After the last
change to what is drawn I took the tier four times, and once more after
the last commit, and the five runs gave the same bytes; the corner of a
card drawn a few pixels differently, about one run in ten, is from
#621 and nothing
here removes it.

**What I could not test:** Windows. Two things here are written for it
and not run on it: the removal of the fixture's repositories, and the
size of window a launch lays out for, which is asked of the window and
assumes Windows' menu bar is not counted in it.

## Risks and limitations

- Review: 2 passes, 9 findings fixed here, 2 follow-ups taken here, 1
left. Details below.
- **The fixture's ticket, pull requests, patch and PHP file are made
up**, and say so nowhere in the picture: #60000 is not that ticket on
Trac, and `summary-length.php` is not a file of WordPress.
- **The update's picture is of a build that is not running.** The build
is answered for the app and never ends; the picture is of the card at
that step.
- The harness now requires `tests/unit/helpers/git.cjs`. A change to how
the tests build a repository changes how the fixture does.
- The guide's text beside these pictures is still the old window's.

## Related

Part of #561, which is part of #542. Follows
#621.

---

<details>
<summary>Design decisions and alternatives considered</summary>

- **A real repository, and the app's own flows on it**, and not a seeded
state. What these five show (a diff, a refused patch, an update's steps)
the app computes from Git; a picture of numbers written into a settings
file would be a picture of a state the app never reaches.
- **One repository and one launch per shot.** Each shot writes to its
checkout and to the app's settings, and a shot handed the checkout of
the one before would depend on the order they are taken in. It costs
five launches.
- **The origin is a repository on disk**, so the update's fetch is a
real fetch and asks nothing of the network.
- **The patch is generated from the fixture file's own lines**, with its
hunk header counted and not typed, so that changing the file cannot
leave a patch that no longer describes it.
- **The fixture's PHP is of nothing in WordPress.** The first version
was close enough to a real function and its comment to read as a copy of
it.

</details>

<details>
<summary>Review outcome (required — see AGENTS.md)</summary>

**Pass 1: 8 [fix here] · 3 [follow-up]. Pass 2 (on the fix-up): 1 [fix
here] · 0 [follow-up]. All 9 fixed, 2 follow-ups taken here, 1 left.**

- **Review:** completed — a separate agent context, read-only; head
`b688f1c` / base `d1616d2`; the five images opened and each alt text
read against its picture, every request a shot's flow makes of the main
process traced to a stand-in or to something local, the fixture's Git
checked for reading nothing of the host's; lint, tests and the shots not
run; 8 [fix here], 3 [follow-up].
- Fixed: the fixture's folders were removed with a plain removal, which
Windows refuses for Git's read-only objects, and since every variant
starts by cleaning, the second would not have started; the update's shot
waited a second and a half where it now waits for the step it is a
picture of; the patch's hunk header was off by one and its single line
of context made the notice say "Near `*/`"; the fixture's PHP followed a
real function's comment closely; the checkout's site was not marked as
set up; the destinations' crop would have taken a cut-off column
silently, and had no room above its heading; the size of window a launch
lays out for was read from the page, which learns of a resize late; one
alt text misquoted its picture.
- Follow-ups, taken here: the size the ticket's card gave for the patch
was not the patch's; every launch left its profile folder behind.
- Follow-up left: the notice's own sentence, "None of this patch's 1
change still fit your checkout", whose verb does not follow its count.
It is the app's wording and not this change's; the alt text quotes it as
it is.
- Listed and left for the text: in `submitting-changes.md`, the diff
"titled **Your changes**" (it is "Your changes for ticket #60000"), "Two
buttons sit above the diff" (there is also Discard all changes), which
of two subtitles a linked ticket's diff has, and "Each card" (Trac and
the mentor share one); in `submit-github-pr.md`, **Not now**, which is
not on screen during sign-in.
- **Review:** completed — a second separate agent context, read-only;
head `e14eb32` / base `d1616d2`; the patch evaluated from its constants
and followed through the app's path rewrite and its choice of the "Near"
line, the removal helper read for following a link out of the fixture,
the four retaken images opened; ESLint run on the harness, `npm test`
and the shots not run; 1 [fix here], 0 [follow-up].
- Fixed: a profile folder that could not be removed would have taken the
place of a shot's own error, or ended a run whose pictures were taken.
It is now said and left.
- Nothing found: the removal helper, the patch, the fixture's PHP, the
patch's size, the wait for the update's step, the crop's padding, the
changed comments. On the window's size it found nothing by reading and
says, as I do above, that Windows was not run.
- **Since review:** `e14eb32 → 91fffb0` is that one fix, not reviewed
again: a `try` around one removal. After it the tier was taken once more
with no image changed, and `npm run lint` and `npm test` pass.

</details>

<details>
<summary>Implementation notes</summary>

- `scripts/screenshots/fixtures.cjs`: `buildRepoFixture`, the
`SUMMARY_*` file and `TICKET_PATCH` made from it; `standInForTheOutside`
also answers `trac:fetch-attachment`, `github:account`,
`github:sign-in`, `github:sign-in-cancel`, `npm:install` and
`npm:run-script`; `cleanFixtureSites` runs before every variant and uses
`removeRepo`.
- `scripts/screenshots/capture.cjs`: `viewport` per shot, the default
asked of the window; no animation; the profile folder removed after each
launch.
- `scripts/screenshots/shots.cjs`: `linkTheTicket`, `editTheCheckout`,
`openTheReview`; the five shots; five live entries removed, one left.
- No app code changes, so the Electron suite, the journeys and the
packaged smoke were not run.

</details>

<details>
<summary>Screenshots or recording</summary>

The images are the change: `docs/public/screenshots/` in the diff, which
GitHub shows before and after.

</details>

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
zaerl added a commit that referenced this pull request Oct 5, 2026
## Why

Fourth part of #561. After
#631 six of the
guide's screenshots were still a person's to take, and five of those no
script took at all: the pictures on the ticket branches page. Settings
(#559) and dark mode (#560) will each change every picture in the guide
again, so a picture that takes a person is one that will be stale. This
takes the five automatically, on the checkout fixture of #631.

## What changes

**Five shots join the automatic tier**, which is now twenty-six of
twenty-seven:

- `site-with-tickets`: a Core site with a ticket in hand and the card of
its other tickets at the foot of the page.
- `ticket-list-card`: that card, with a ticket linked.
- `ticket-list-unlinked`: the same card with none linked, two tickets in
it.
- `trunk-work-question`: what the app asks when a ticket is linked over
an edit on trunk.
- `carried-work-notice`: the ticket's card after the edit came along.

**Tickets the site was left with are the fixture's.** A row in the list
has an age ("Edited 1 day ago"), which a shot cannot give it through the
app: every ticket it left would have been left just now. So for these
variants the fixture makes what the app makes when a ticket is started
and left with nothing done: a branch where trunk was, and the record of
it (which ticket, where it branched, when it was last worked on). The
hours are chosen well inside the wording they come out as, so a picture
is the same at any time of day.

**The checkout fixture's trunk commit is dated** as the seeded sites'
code is, two days back. It was dated the moment it was made, so a site's
details said its code was newer than the site.

**What the harness gained for them:**

- A wait for a button that can be pressed and not only one that is on
the page. A row's buttons are disabled until a link has wholly ended.
- A whole-window picture can refuse to be taken when the page has
outgrown the window (`site-with-tickets` is taken in a window 1480 high,
since its second card is at the foot of the page).

**One change outside the harness:** `commitFiles` in
`tests/unit/helpers/git.cjs` takes a `date`. It is the fixture layer the
tests build their repositories with; no test passes the option, and
without it the command is the one it was.

**Beside the images:** the alt text of the five, and the sentence in
`CONTRIBUTING.md` about which pictures need a person.

**Not in this pull request:**

- `setup-wizard`, the one picture still taken by a person. It can be
taken automatically too, and is the next pull request, with the removal
of the live tier it leaves empty.
- The guide's prose. The ticket branches page now says things beside
these pictures that the pictures contradict; the list is in the review
outcome.

## How to test this

Platforms: macOS to reproduce the committed images; the harness is
written to run on any, and I have run it on macOS only. Nothing here
ships in the app.

From the repository root, on the current head, after `npm ci`:

```
npm run shots
git status --short docs/public/screenshots
```

1. The run prints twenty-six lines, each `✓ <name>.png`, and exits 0. It
opens the app's window fourteen times; do not type while it runs, and no
browser tab opens.
2. On the machine and the UTC day the images were taken, `git status`
usually shows nothing. Some runs show one or two images changed by a
handful of pixels on a rounded corner (4 of the 17 runs I made today,
always in a picture older than this change, 12 pixels in the one I
measured); take it again and it is gone. That is more often than the one
in ten #621
measured: there are more pictures to a run now.
3. Open `ticket-list-unlinked.png`: two rows, #60000 "Edited 3 hours
ago" above #61002 "Edited 1 day ago", each with Continue working and
Delete this ticket’s work, none greyed. `carried-work-notice.png`: a
blue notice that 1 uncommitted change came along into #60000, and under
it "You have 1 unsubmitted change for ticket #60000".
`site-with-tickets.png`: under Details, "Trunk as of" is two days before
the run, the day "Created" gives.

**What must not have happened:** a button in a ticket's row drawn greyed
or as if the pointer were on it; anything asked of GitHub or Trac; a
folder named `wpct-docs-fixture` or `wpct-userdata-…` left in the
temporary directory after the run.

**What I could not test:** Windows. And on Windows the fixture is under
the user's temporary folder, so a whole-window picture taken there would
have the user's name in "Local path"; that was so before this change,
and the committed pictures are taken on macOS, where the path is
`/tmp/wpct-docs-fixture/…`.

## Risks and limitations

- Review: 2 passes, 5 findings fixed here, 2 follow-ups taken here, 1
left. Details below.
- **Three of the five pictures start from a state the fixture wrote**,
where #631's start from one the app made: the tickets a site was left
with. The record is the app's own, key for key, and the reviewer checked
it against the code that writes it; a change to what the app records for
a ticket would have to be made here too.
- **A shared test helper changes.** `npm test` passes, and I checked by
hand that a commit made with a date carries it as author's and
committer's, and that one made without is dated now.
- The fixture's tickets are made up: #60000 and #61002 are not those
tickets on Trac.
- The guide's text beside these pictures is still the old window's.

## Related

Part of #561, which is part of #542. Follows
#631.

---

<details>
<summary>Design decisions and alternatives considered</summary>

- **Seeded tickets, and not tickets left through the app.** Through the
app the rows all read "Edited just now", in a page whose text is about
coming back to a ticket days later. The age is the one thing a shot
cannot make; everything else about a left ticket is a branch and three
values, which is what is written.
- **One day and three hours, and not a week.** Past a week the row gives
a date, written the way the computer writes dates, which changes with
the day and the machine.
- **A taller window for the two cards**, and not a page scrolled to its
foot: the picture is of a site with a ticket in hand and others below,
and scrolled it would lose the ticket in hand.
- **The date as an option of the fixture layer's commit.** The first
version ran the Git binary from the harness, with the commit's identity
written out again: a third way to the binary beside the app's and the
tests'.

</details>

<details>
<summary>Review outcome (required — see AGENTS.md)</summary>

**Pass 1: 3 [fix here] · 3 [follow-up]. Pass 2 (on the fix-up): 2 [fix
here] · 0 [follow-up]. All 5 fixed, 2 follow-ups taken here, 1 left.**

Both passes were made before the rebase onto #631's merge, on commits
that are the same changes as these; the heads below are the ones
reviewed.

- **Review:** completed — a separate agent context, read-only; head
`551457e` on `91fffb0`, the head #631 merged; the five images opened and
each alt text read against its picture, the seeded record compared with
what linking and leaving a ticket write, every request the five flows
make traced to a stand-in or to something local; ESLint run on the
harness, `npm test` and the shots not run; 3 [fix here], 3 [follow-up].
- Fixed: the notice's picture did not wait for the line that says there
is one unsubmitted change, which a read of its own brings later, and
could come out without it; two pictures waited for a row's buttons to be
on the page and not to be ones that can be pressed; a comment said
leaving a ticket is the one thing a shot does not do through the app,
where editing the checkout is another.
- Follow-ups, taken here: `CONTRIBUTING.md` said a running server and a
real diff need a person; the checkout's trunk was dated the day of the
run, newer than the site.
- Follow-up left: on Windows the fixture's path has the user's name in
it. See "What I could not test".
- Listed and left for the text, in `ticket-branches.md`: "each row is a
**Continue working on #NNNNN** link" and "**Continue working on**" twice
more (it is a Continue working button); "**edited 2 days ago**"
(capitalised, and the pictures' are a day and three hours); "Delete this
ticket's" with a straight apostrophe; "came along into #62281" and "1
unsubmitted change for ticket #29798" (the pictures' ticket is #60000);
and the delete question, which the app now words "Delete all work on
ticket #61002?" and "This can’t be undone."
- **Review:** completed — a second separate agent context, read-only;
head `c0cd36e` on `91fffb0`; the dated commit followed through the
fixture's order and the app's reading of trunk's date, the trial click
checked against how the row's buttons are disabled, the two retaken
images opened; ESLint run on the harness, `npm test` and the shots not
run; 2 [fix here], 0 [follow-up].
- Fixed: the harness dated its commit by running the Git binary itself
(now an option of the fixture layer's commit); a comment said a row's
buttons can be pressed after the card has read the ticket, an order the
app does not promise.
  - A style note, taken: one wait the trial click already does.
- **Since review:** `c0cd36e → ce66772` is those fixes, not reviewed
again; it is what changes `tests/unit/helpers/git.cjs`. The three
commits were then rebased onto #631's merge with no conflict and are
`1765fc9`, `48b78ea`, `f56f33f`. On that head: `npm run lint` and `npm
test` pass, and a retake of the tier changed no image.

</details>

<details>
<summary>Implementation notes</summary>

- `scripts/screenshots/fixtures.cjs`: `OTHER_TICKET`, `PARKED_TICKETS`;
`buildRepoFixture` makes the branches and writes their record; the trunk
commit dated `FRESH.trunkDate`.
- `scripts/screenshots/shots.cjs`: `waitUntilPressable`, `fixTheLine`,
`askToLinkOverAnEdit`; the five shots.
- `tests/unit/helpers/git.cjs`: `git` and `gitOk` take an environment,
`commitFiles` a `date`.
- No app code changes, so the Electron suite, the journeys and the
packaged smoke were not run.

</details>

<details>
<summary>Screenshots or recording</summary>

The images are the change: `docs/public/screenshots/` in the diff, which
GitHub shows before and after.

</details>

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
@zaerl zaerl added this to the v2.0.0 milestone Oct 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant