CLAUDE.md, AGENTS.md, ARCHITECTURE.md and TODO.md all said no browser exists
in this environment, so appearance had never been verified by anyone. Chrome
is on PATH. Its own --screenshot flag is what fails: it fires on the load
event, before this app's async IndexedDB read resolves, and captures a blank
page — which is presumably how the claim took hold.
scripts/screenshot.ts drives CDP instead: waits past the load event, seeds
IndexedDB via --eval-file and reboots the app with --reload, clicks with
--click, applies shadcn's class-based dark palette with --dark, and reports
console errors and uncaught exceptions. A page that renders blank from a
thrown error looks identical to an empty one, so the console output is half
the value.
Two defects found by simply looking:
- The month table's numeric columns had no horizontal padding, so figures ran
into each other: "+7,175.00 DKK4,200.00 DKK". Now padded.
- Dev logged "The script has an unsupported MIME type ('text/html')" on every
boot, because registerServiceWorker asks for sw.js and the "/*" catch-all
answered with the HTML shell. Dev now serves an inert worker.
Confirmed working, first time seen: the carry meter (including red where a post
is overspent), the Task 5 rule-history editor, the Task 6 "change from here"
control, and baked FX rates showing as "manual - 2026-09-01" in Settings.
Recorded in the docs, with the limits stated: this container's fontconfig maps
every generic family to a monospace face, so screenshots need a FONTCONFIG_FILE
override or you will chase a font bug that does not exist; Chrome starts from
an empty profile each run; and no screenshot can judge how a design feels.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
1.2 KiB
1.2 KiB
Agent guide
This repository's agent instructions live in CLAUDE.md — read it first.
It carries the project invariants, the gotchas that cost real bugs, and the
validation this codebase deliberately does not perform.
Then, depending on what you are doing:
- Changing anything structural →
ARCHITECTURE.md(layers, data flow, and why the non-obvious choices are what they are). - Picking up queued work →
TODO.md(ordered, each item carrying the reasoning already settled). - Making a product decision →
PRODUCT.md(who this is for, what must never break, and what must not be invented). - Wondering why something is the way it is →
docs/superpowers/specs/records the decisions and the alternatives that were rejected.
Two rules worth knowing before your first edit:
- Bun only.
bun test,bun run,bunx. Never npm, jest, vitest or vite. - There IS a browser here —
bun scripts/screenshot.ts <url> <out.png>drives headless Chrome and hands you a PNG to look at. Read CLAUDE.md's "Verification limits" first: the container's fonts lie, and offline, the install prompt, the.odsin a spreadsheet, and how anything feels still need a human. Say so rather than claiming it works.