Skip to content

feat(handbook): Maestro Tier 3 flows + screenshot-driven handbook#441

Merged
TaprootFreak merged 4 commits into
developfrom
feat/maestro-handbook-flows
May 16, 2026
Merged

feat(handbook): Maestro Tier 3 flows + screenshot-driven handbook#441
TaprootFreak merged 4 commits into
developfrom
feat/maestro-handbook-flows

Conversation

@TaprootFreak
Copy link
Copy Markdown
Contributor

Summary

Adds 19 Maestro Tier 3 flows that double as visual-regression baselines for the RealUnit Wallet handbook (docs/handbook/de/index.html). Each flow navigates to one screen; a wrapper script captures it with xcrun simctl io booted screenshot and writes the PNG into docs/handbook/screenshots/.

  • Flows: full onboarding + settings journey (welcome → create-wallet → seed reveal+verify → PIN → biometric prompt → dashboard → settings: languages / currency / network / wallet-address / backup → re-reveal seed via PIN gate).
  • Capture pipeline (scripts/run-handbook-flows.sh): simctl shutdown/erase/boot/install before the batch (Keychain wipe — clearState alone leaves the wallet + PIN behind), then per flow maestro test followed by xcrun simctl io booted screenshot staged through /tmp.
  • Why xcrun, not Maestro takeScreenshot: Flutter BackdropFilter (SeedBlurCard) renders to GPU layers that the XCUITest screenshot API misses — Maestro's output is solid black. The simulator compositor captures them correctly.
  • Handbook: docs/handbook/de/index.html extended with a 7-section TOC; each test card links its source YAML on GitHub. docs/handbook/README.md documents the regeneration workflow.

Test plan

  • scripts/run-handbook-flows.sh runs end-to-end, all 19 flows pass
  • All 19 PNGs render correctly (including the four BackdropFilter screens 04 / 05 / 18 / 19)
  • docs/handbook/de/index.html opens locally without a webserver; all 19 images resolve via relative paths
  • Reviewer: open docs/handbook/de/index.html in a browser and verify the TOC + screenshot grid renders

Follow-ups (separate PRs)

  • Online hosting (handbook.realuni.app / dev-handbook.realuni.app) — Dockerfile.handbook here + Cloudflare/Tunnel config in DFXswiss/server. Domain realuni.app is at Infomaniak; tunnel target is dfxprd.

Setup for the User-Guide + Test-Doku-in-einem handbook,
modelled on zk-coins/app/public/handbook but adapted for
Flutter / Maestro Tier 3 (deferred Phase 3 of #314 in
docs/testing.md).

Today: one .maestro flow (01-welcome.yaml) + three screenshots
+ static HTML page that mirrors the zkCoins layout (sticky TOC,
spec sections, callouts). Reproducible locally — no online
hosting:

  flutter build ios --simulator --debug
  xcrun simctl install booted build/ios/iphonesimulator/Runner.app
  scripts/run-handbook-flows.sh
  open docs/handbook/de/index.html

Next stages add more flows (Create Wallet, Restore, KYC, Buy,
Sell, etc.) — each is a new YAML file + new section block in
docs/handbook/de/index.html. README under docs/handbook/
documents the workflow.
Extends the handbook scaffold from one welcome flow to the full
onboarding + settings journey, captured as visual-regression
baselines and rendered into docs/handbook/de/index.html.

Flows (.maestro/handbook/):
  01 welcome           02 create-vs-restore       03 sw-wallet-terms
  04 seed-hidden       05 seed-revealed           06 verify-seed
  07 onboarding-done   08 pin-setup               09 pin-confirm
  10 biometric-prompt  11 dashboard               12 settings
  13 languages         14 currency                15 network
  16 wallet-address    17 backup-pin              18 seed-hidden(s)
  19 seed-revealed(s)

Capture pipeline (scripts/run-handbook-flows.sh):
  * simctl shutdown/erase/boot/install before the batch — Maestro
    clearState does not wipe the iOS Keychain, so a stale wallet+PIN
    would survive between runs.
  * Per flow: maestro test, then xcrun simctl io booted screenshot.
    Maestro's own takeScreenshot renders BackdropFilter layers
    (SeedBlurCard) as solid black; xcrun uses the simulator
    compositor and captures them correctly.
  * Stages PNG in /tmp first to dodge the simctl io TCC restriction
    on ~/Documents.

Handbook (docs/handbook/de/index.html):
  * TOC + 7 spec sections covering all 19 screens.
  * Each test card links its source YAML on GitHub.
  * Info callout documents the xcrun + simctl erase choice.

README (docs/handbook/README.md) explains the workflow for adding
a new flow.
@TaprootFreak TaprootFreak marked this pull request as ready for review May 16, 2026 20:20
The scaffold PR (#439) was squash-merged onto develop while this
branch already had the file renamed to .maestro/handbook/01-welcome.yaml.
The merge re-introduced the old path from develop's side; remove it
so only the handbook/ copy remains.
@TaprootFreak TaprootFreak merged commit ac72eb1 into develop May 16, 2026
1 check passed
@TaprootFreak TaprootFreak deleted the feat/maestro-handbook-flows branch May 16, 2026 20:49
TaprootFreak added a commit that referenced this pull request May 18, 2026
## Summary

Container image and build workflows that publish the handbook to Docker
Hub so it can be served online via Cloudflare Tunnel (target hosts:
\`handbook.realuni.app\` / \`dev-handbook.realuni.app\`). The hosting
side — compose stack + tunnel ingress + DNS — is a separate PR against
\`DFXswiss/server\`.

- \`Dockerfile.handbook\` + \`handbook.nginx.conf\`:
\`nginx:1.27-alpine\` serving \`docs/handbook/\`, redirects \`/\` →
\`/de/\`.
- \`.github/workflows/handbook-dev.yaml\`: on push to \`develop\`
(paths-filtered to \`docs/handbook/\`, the Dockerfile, or the workflow
itself) → build + push \`dfxswiss/realunit-app-handbook:beta\`.
- \`.github/workflows/handbook-prd.yaml\`: same for \`:latest\` on
\`main\`.
- No SSH-deploy step yet. The pull side lives in \`DFXswiss/server\` and
gets wired up once the compose stack + tunnel ingress exist for
\`realunit-app-handbook\`.

## Why split this from the handbook content PR (#441)?

#441 is purely local artefacts (Maestro flows, screenshots, HTML). This
PR is hosting infrastructure with org-level secrets (\`DOCKER_USERNAME\`
/ \`DOCKER_PASSWORD\`) and a different review surface.

## Test plan

- [x] Dockerfile builds locally (deferred — OrbStack not running on this
machine; CI will validate)
- [ ] CI: \`Handbook DEV image\` workflow succeeds on first run via
\`workflow_dispatch\` after merge
- [ ] Image \`dfxswiss/realunit-app-handbook:beta\` exists on Docker Hub
- [ ] \`docker run -p 8080:8080 dfxswiss/realunit-app-handbook:beta\`
serves the handbook on http://localhost:8080/de/

## Follow-ups

- \`DFXswiss/server\` PR: \`realuni.app\` Cloudflare zone + DNS, tunnel
ingress (\`handbook.realuni.app\` → dfxprd, \`dev-handbook.realuni.app\`
→ dfxdev), \`dfxdev/realunit-app-handbook/\` +
\`dfxprd/realunit-app-handbook/\` compose stacks, \`domains.md\` entry.
**Prerequisite for that PR**: \`realuni.app\` zone must exist in the DFX
Cloudflare account, NS pointed from Infomaniak to Cloudflare.
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