Skip to content

The macOS screenshot recipe, less its coordinates - #6

Open
anderix wants to merge 10 commits into
mainfrom
ready-to-ship
Open

anderix wants to merge 10 commits into
mainfrom
ready-to-ship

Conversation

@anderix

@anderix anderix commented Sep 17, 2026

Copy link
Copy Markdown
Member

take-shots.sh is ship's generated harness, written by ship sync. shots.sh is the part that is Duckling's: four frames with a conversion under way or finished in each, light leading and one dark, each opening a different demo document so the set is a tour of what Duckling reads rather than four pictures of one file.

This is not finished and should not be merged as it stands. The control coordinates are empty strings. They are read off a reference frame at 1440x900 in each language, which is what shots.sh --reference takes, and no runner has taken one yet. They are left empty rather than guessed: the toolbar is laid out by its own text, so Umwandeln in puts the German controls where the English coordinates would miss.

Towards anderix/ship#19. Not started: anderix/ship#15, the missing .msix — the repository does not call the shared store-package action, which is what assembles and attaches the msix in the four store repositories that do — and anderix/ship#30.

🤖 Generated with Claude Code

https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP

anderix and others added 10 commits September 17, 2026 05:24
take-shots.sh is ship's generated harness, written by `ship sync`. shots.sh is
the part that is Duckling's: four frames with a conversion under way or
finished in each, light leading and one dark, each opening a different demo
document so the set is a tour of what Duckling reads.

The control coordinates are empty. They are read off a reference frame at
1440x900 in each language, which is what `shots.sh --reference` takes, and no
runner has taken one yet. Nothing here works until they are measured, and
measuring them is the next step rather than guessing them: the toolbar is laid
out by its own text, so `Umwandeln in` puts the German controls somewhere the
English coordinates would miss.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
`ship duckling` reached the msix step, found the release carried no `.msix`,
and stopped. `build-msix.ps1`, `AppxManifest.xml.in`, `identity.psd1` and the
Store assets were all already here; nothing ran them. The workflow said so
itself, in a comment: "Nothing here builds a release".

It calls the shared `store-package` action, which is what the four store
repositories that do package use. The package is built on every push, so the
packaging is proved on each commit, and attached where there is a release to
attach it to. The release event fires because a person's token creates the
release; the tag input covers a release created any other way, and a dispatch
with no tag builds and keeps the package without spending one.

`contents: write` for the upload alone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
The workflow built dist/Duckling.app, photographed the window for a person to
look at, and had no way to take the set a listing wants. ship's App Store step
found the German listing carrying no pictures, offered to take them, and had no
workflow to ask.

It calls the shared `mac-store-screenshots` action, which raises the desktop
past the 1024x768 a hosted runner comes up at and runs the recipes once per
language. Both languages: Duckling reads POTEXT_LANG before it asks the
platform, so the German set is a German window, and the demo documents are the
same in both.

`tag` is now optional, because a screenshots run has no tag to give, and the
release binary is built only where there is one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
The first run of the Store package step failed: `build-msix.ps1: no models at
.models`. Duckling ships its ONNX models inside the package, and the steps that
fetch them were gated on the screenshots input, so a run that was not taking
pictures had none.

They are unconditional now, and ahead of the package. The Linux lane already
fetches them that way, and the cache is keyed on the script where every pin
lives, so a run that is not the first pays for a cache read.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
The reference run came back "asked for 1440x900 and got 1100x728". The desktop
was raised to 1600x1200 and `set size` reported no error; the window was 1100
wide all the same, which is the size Duckling opens at and remembers.

`screenshot.sh` now reads the size back and asks again until it holds, and
refuses naming what it reached if it never does. This is ship's generated
driver, so the change is in internal/generate/templates and `ship sync` carries
it to every repository with a window to photograph; this copy is that template
rendered.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
The read-back said 260x228 while the frame that came out was 1100x728, so the
resize and the read-back were talking about different windows: an application
may have more than one, and the order System Events lists them in is not the
order they were made.

Both now take the largest, and a refusal lists every window with its size
rather than leaving the next person to guess which one answered.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
The reference frames came back with an empty queue. Duckling takes documents as
arguments rather than through the Finder open-document event, which is what
`open -a app doc` sends and what the driver does, so the document the harness
staged never reached it. packaging/submission-notes.md has the rest: under the
Store sandbox the argument route is blocked too, and the folder goes in through
Add folder, which is what a person does.

The coordinates are measured off 00-reference.png in each language's own
directory, taken at 1440x900 on a hosted runner. Per language because the
toolbar is laid out by its own text: "Umwandeln in" is wider than "Convert to",
so everything after it sits further right.

The row coordinate is still empty. Nothing has yet photographed a queue with
anything in it, and that is what this run is for.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
Rendered from ship's template, where the key table gained g. The recipe needs
it to put a path into the Add folder panel.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
The comment claimed ten. The control offers seven, read off
02-light-the-output-formats.png taken on a runner: DocLang, Markdown, JSON,
DocLang archive, LaTeX, ODT and DOCX. The listing copy makes no count, so
nothing store-facing said it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
The first attempt used Add folder and a directory path. The panel opened, took
the path, closed and added nothing: Cmd-Shift-G with a directory navigates into
it and selects nothing, and the Open button acts on a selection.

A path that names a file leaves that file selected. Add files takes it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BDPzwzMCSL2rhkrmGCAtP
@anderix

anderix commented Sep 18, 2026

Copy link
Copy Markdown
Member Author

Leaving this open, but it needs reconciling rather than merging or closing, and the reason is that main solved the same problem in parallel while this branch was in flight.

f2e340e on main, from 09-17 09:43, takes a Mac App Store set in both languages, and this branch was cut from cd80903 the evening before. The two are not one behind the other — they are two implementations. packaging/macos/shots.sh differs by 193 insertions against 88 deletions between them, take-shots.sh by 18 against 41, and every file this branch touches conflicts with main.

Each side holds something the other does not. Main has coordinates measured at 1440x900 in both languages, which this branch deliberately left as empty strings. This branch has ten commits of driver mechanics that main has no equivalent of: Cmd-Shift-G, sizing the window before photographing it, polling until the window reports that size, counting seven output formats off the frame, and the two document-entry paths through Add folder and Add files.

So the question is which driver to keep and whether main's coordinates survive the answer, and that is a judgement for whoever wrote both. duckling#5 is closed as fully superseded; this one is not that.

Context: git log --oneline origin/main..origin/ready-to-ship for the ten, and origin/ready-to-ship..origin/main for the five on the other side.

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