This runbook documents how to update the Phase 1 proof screenshots in
docs/assets/proof-web.png and docs/assets/proof-mobile.png.
The committed PNGs are actual captures from the live web host and an iOS Simulator running the Expo mobile host. The SVG files in this directory are deprecated backup receipts only; use them only when live bitmap capture is impossible and call that out in the proof comment.
Run the oracle before taking screenshots:
pnpm install
pnpm run checkThe key test is scripts/proof-oracle.test.ts. It replays the scripted proof
steps through the headless, DOM, and React Native renderers, then asserts the
same final state, intent log, and structural snapshots. The screenshots are
visual evidence from the hosts; the oracle is the behavioral receipt.
-
Start the web host from the repository root:
pnpm run example:web
-
In another terminal, drive Chromium and capture the page.
The current committed
proof-web.pngwas captured at1280x900after enteringAgassiandDfasf23f@sdf.com, then pressingSubmit #1.If Playwright is already available, run this from the repository root:
node - <<'NODE' const { chromium } = require("playwright") ;(async () => { const browser = await chromium.launch() const page = await browser.newPage({ viewport: { width: 1280, height: 900 }, deviceScaleFactor: 1 }) await page.goto("http://localhost:4173", { waitUntil: "networkidle" }) await page.locator("input").nth(0).fill("Agassi") await page.locator("input").nth(1).fill("Dfasf23f@sdf.com") await page.getByRole("button", { name: /Submit #1/ }).click() await page.waitForTimeout(250) await page.screenshot({ path: "docs/assets/proof-web.png", fullPage: true }) await browser.close() })().catch((error) => { console.error(error) process.exit(1) }) NODE
If
require("playwright")is unavailable, install Playwright into a temporary directory instead of adding it to this repo:tmpdir=$(mktemp -d) npm --prefix "$tmpdir" install playwright@1.61.1 "$tmpdir/node_modules/.bin/playwright" install chromium NODE_PATH="$tmpdir/node_modules" node - <<'NODE' const { chromium } = require("playwright") ;(async () => { const browser = await chromium.launch() const page = await browser.newPage({ viewport: { width: 1280, height: 900 }, deviceScaleFactor: 1 }) await page.goto("http://localhost:4173", { waitUntil: "networkidle" }) await page.locator("input").nth(0).fill("Agassi") await page.locator("input").nth(1).fill("Dfasf23f@sdf.com") await page.getByRole("button", { name: /Submit #1/ }).click() await page.waitForTimeout(250) await page.screenshot({ path: "docs/assets/proof-web.png", fullPage: true }) await browser.close() })().catch((error) => { console.error(error) process.exit(1) }) NODE rm -rf "$tmpdir"
-
Stop the web host and remove the generated web bundle:
rm -f examples/web/public/app.js
-
Install the mobile host dependencies:
cd examples/mobile pnpm installDo not commit
examples/mobile/node_modulesor.expounless the package-management policy changes. -
Start the standard Expo iOS flow:
pnpm run ios
Accept Expo's alternate port prompt if
8081is already occupied. The Metro config aliasesreactandreact-nativetoexamples/mobile/node_modulesso workspace source underpackages/resolves against the Expo host's React Native install. -
In the iOS Simulator, dismiss any Expo dev overlay, enter the same proof values, and submit the form. The current committed mobile PNG was captured after entering
AgassiandDfasf23f@sdf.com, then tappingSubmit #1. -
Capture the simulator framebuffer from the repository root:
xcrun simctl io booted screenshot docs/assets/proof-mobile.png
-
Stop Expo and remove generated mobile artifacts that should not be committed:
rm -rf examples/mobile/.expo examples/mobile/node_modules
The older deterministic receipts remain at:
docs/assets/proof-web.svgdocs/assets/proof-mobile.svg
They are retained only as a fallback when a browser or simulator cannot be
used. If you update them, keep them deterministic, label them as fallback proof,
and do not replace the PNG references in docs/proof.md while live PNG captures
are available.
pnpm run check
pnpm run example:web:build
rm -f ./examples/web/public/app.js
git status --shortCommit only intentional docs, screenshot asset, and capture-enabling config changes.