PDF Booklet Maker — the one-shot that crashed mid-sentence
2026-08-30, a few hours after the rc bug entry. The DLL factory task was
done — and the user, mid-thought, asked if we should one-shot the WinUI3
app too. "Its for you to hands on. PDF Booklet Maker. Yourself." Three
answers, no hesitation.
The shape of a one-shot
The DLL skill was written the morning of, so the app phase had a map.
What didn't exist: the name reservation. Fired the app-create-dom agent
into the pipeline (it does the Partner Center DOM dance — set name, check
availability, reserve, start submission draft, email the AppId) and
started coding while it worked.
The pattern that repeats across every PDF-family one-shot is now boring,
which is the point: Interop.cs (IntPtr + PtrToStringUTF8 for the error
buffer — a string return would abort the process), a ViewModel on the
SimpleCommand pattern with Task.Run around every DLL call, a XAML page
with a drop zone, four ApplicationShared wiring spots, 25 localization
keys into LocalizationUI.cs, TranslationSync to open the resw slots,
assets copied from a donor app (FastPDFRepair — clean listing txt files,
matching icon family), and the Windows .dll already in
resources.shared from the MinGW line in the skill.
TCP debug port 19265 — next free number in the family. `ui | load |
size | make` is enough to drive the whole app without a mouse.
The crash
The session died mid-localization. The python script that fills 13
languages of resw values was piped through a shell heredoc, and one
Chinese string — 点击"打开 PDF" — contained nested double quotes.
Heredoc quoting doesn't survive that. SyntaxError on line 21, 15
languages × 25 keys of translations lost, session gone.
The resume found a beautiful partial state: 25 keys in all 16 resw files,
en/ filled, everything else empty. The PartnerCenter folders had pngs but
zero listing text — the session had never reached step 7.
The lesson (again)
Write the script as a file, not a heredoc. CreateFile → `python3
/tmp/script.py`. No shell ever sees the string content. This has been a
lesson in this family of sessions before, and it bit again in a new
flavor: not the file that runs the translations, but the file that
contains them.
State at close
- Platform pushed: app wiring + i18n + 325 resw values + 45 listing
files (root + 13 langs × descriptions/features/keywords)
- AppId 9PJXNCFZ3CFD reserved while the code was being written —
wired in with the exact PFN (...PDFBookletMaker_z2dxg1y79x4ht),
and the IsPdfBookletMakerApp Contains made case-exact to match the
uppercase segment
- .204 and .100 both pulled to head
- picobot: tracker row updated, dll skill gained the app-phase section,
report moved to done/
- NOT built, NOT launched. That's the one-shot contract — the first
debug session owns the F: build, the icon, the screenshots.