You are Worker F2 on the Bookshelf project (~/bookshelf). Wave 4, part 2: SHOW THE OWNER WHAT IT LOOKS LIKE, AND SHIP AN INSTALLABLE APK. FIRST READ (contract — follow exactly, do not restate): ~/bookshelf/docs/SPEC.md (see "Design language", "Screens", "Quality bar") ~/bookshelf/docs/HANDOFF.md (state + hazards already paid for — read the hazards) Waves 1-3 are DONE and verified: 91 unit tests pass, all six screens exist, and there is an existing Paparazzi setup (`ComponentGalleryPaparazziTest`, 10 PNGs of the shared components) that ALREADY WORKS — `~/bookshelf/tasks/gw recordPaparazziDebug` is green. Follow its patterns rather than inventing a new approach. Context that shapes this task: there is NO EMULATOR on this box (no KVM). Nothing in this project has ever actually been RUN — only compiled and unit-tested. Your screenshots are the ONLY way the owner can judge how their library app looks, and the signed APK is the only way they can run it for real. Both matter more than usual. ## Your scope 1. **Paparazzi screenshots of all SIX screens** — setup, library, detail, scan, locations, settings — each in BOTH light and dark. Render them with realistic populated state (a plausible shelf of books, covers as placeholder art), NOT empty states, plus the library empty state as its own shot since SPEC calls it out. The scan screen cannot show a live camera in Paparazzi — render its overlay/reticle and the result bottom sheet over a static backdrop, and say so in your report. 2. **Release signing + signed APK.** Generate a release keystore, wire a signingConfig into `app/app/build.gradle.kts`, and produce a signed release APK. Keystore and its passwords MUST be gitignored — put credentials in `app/keystore.properties` (gitignored) and read them from the build file, with a graceful fallback so the build still works for anyone without the keystore. Record the passwords in `app/keystore.properties` and state them in your report so the owner can rebuild. `minifyEnabled` is currently false for release — if you enable R8, you must prove the signed APK still builds AND that Room/Retrofit/kotlinx-serialization/ML Kit survive it (proguard rules). If you cannot prove it, leave R8 off and say so. 3. **Top-level `README.md`** — what the project is, the two-person shared-library model, architecture (offline-first Room + PocketBase, push-then-pull LWW sync), how to build, how to deploy the server (point at `server/deploy/`), how to install the APK, and an honest "current limitations" section. Reuse the real content in `server/README.md` and `docs/SPEC.md`; do not contradict them. ## Boundaries — Worker F1 is running RIGHT NOW in this repo - F1 owns `server/` and live-server sync testing, in package `org.modg.bookshelf.livesync`. DO NOT touch `server/` or anything under that package. - F1 may be fixing bugs in data.repo / data.remote / data.local. DO NOT edit those packages. If a screenshot needs a data-layer change, REPORT it instead. - You own `app/app/build.gradle.kts`, the root `README.md`, and all screenshot code. - Do not modify the six screens' behavior to make them easier to screenshot. If a screen is hard to render in isolation, that is a finding to report, not a licence to change it. ## Build/verify — use the serialized wrapper, never ./gradlew directly ~/bookshelf/tasks/gw assembleDebug ~/bookshelf/tasks/gw testDebugUnitTest ~/bookshelf/tasks/gw recordPaparazziDebug ~/bookshelf/tasks/gw assembleRelease ## Definition of done — actually run these, wait for them, report REAL exit codes 1. All four commands above exit 0. `testDebugUnitTest` keeps ZERO failures (91 tests currently pass — do not break them). 2. Screenshot PNGs exist on disk for all six screens x light/dark. List their paths. 3. A signed release APK exists. Give its exact path, size, and the output of `~/toolchain/android-sdk/build-tools/37.0.0/apksigner verify --print-certs ` (or an explanation if that tool is unavailable). 4. Do NOT commit the keystore or its passwords to git. Verify with `git status`. ## Do not repeat an earlier worker's mistake A worker once ended its turn saying "tests are running in the background, I'll report when done." That is a FAILURE. Run it, WAIT, report observed exit codes. A truthfully reported gap is worth more than a false green. ## Report (short — read by a token-constrained orchestrator) - real exit codes for all four commands - the screenshot PNG paths, and the signed APK path + size + signer info - anything in SPEC's design language you think the screens get WRONG, now that you can finally see them rendered. Be candid — the owner explicitly cares how this looks.