# Bloomie visual QA review workspace

Double-click `index.html` in this folder. It opens directly in a browser with no server, network, package installation or Flutter runtime. The HTML embeds the manifest metadata, CSS and JavaScript; PNGs load from `../screenshots/`.

For the Phase 18 review, choose **Review scope → Phase 18**, then **B11–B14** in order. Each batch has ten screenshots. See [the dedicated Phase 19 plan](phase19_review_plan.md) for the exact inventory, priorities, content flags, earlier Export comparisons and deferred device checks. The earlier B01 workflow below remains available.

Start with **B01** in the Batch filter. Rakesh and Seemal should each record observations, then reconcile outcomes. A11Y-05 is the final image in B01: review VQA-001's fixed legend for complete labels, natural wrapping, clear markers and balanced 2× layout. CAL-04 and CMP-04 in B04 provide comparison views.

## Hosted review on cPanel

The review page supports both local browsing and same-origin hosting. Upload the complete `qa` folder so `review/index.html` remains alongside `../screenshots/`. The Content Security Policy permits review screenshots from the same site while continuing to block third-party image sources.

## Generate local screenshots

From the repository root:

```powershell
flutter test test/visual_qa --dart-define=BLOOMIE_VISUAL_QA=true --update-goldens
```

Screenshots remain Git-ignored. The production Flutter app does not register or use these files. Normal `flutter test` does not generate PNGs. If a PNG is absent, the index displays **Screenshot not generated locally** and the command above. Generate the pack, then reload the page. If Windows reports a PNG file lock, close any image preview holding that file and retry.

## Browse and review

- Filter by batch, feature, review status, wording, viewport variant or priority; search IDs, state and notes.
- Click a thumbnail to enlarge. Use Previous/Next or left/right arrows to move within the current filtered sequence. Escape or Close returns to the grid. Arrow keys retain their usual behaviour in note fields and selectors.
- Inspect images at their natural size on a sufficiently wide browser window. Smaller windows scale images to fit; do not mistake this scaling for the app's actual text size.
- Review visual hierarchy/spacing/density/action/consistency; natural copy for ages 10–12 and 13–16; evidence strength; agency; privacy disclosure; and readable 2×/compact layouts.
- Screenshots cannot prove interactions, screen-reader behaviour or focus order. Record a follow-up device check where needed.
- Destructive-button labels can appear as block glyphs because of the documented widget-test font limitation. This is capture-only; verify destructive actions on a device before treating it as a production issue.

## Outcomes and notes

Supported outcomes: **Not reviewed**, **Approved**, **Changes required**, **Wording review required**, **Accessibility review required**, **Product decision required**.

The manifest is authoritative. Phase 17 affected entries are **Changes required**, with implementation recorded separately; unrelated entries remain **Not reviewed**. VQA-001 remains **fixed in code, awaiting human visual review**. No outcome or approval is assigned automatically.

Browser notes and outcomes are **temporary drafts in the current tab only**. There is no localStorage, backend, autosave or cross-device synchronisation. Reloading/closing loses drafts. Use **Download draft notes** before leaving; the browser may also warn about unsaved drafts, but do not rely on that warning. The status filter uses the draft outcome when present and otherwise the manifest status. Both are labelled separately.

The download includes every draft regardless of active filters: ID, batch, feature/state, temporary outcome, priority, wording flag, authoritative status, screenshot path and note. Its summary lists counts and IDs for each outcome, including Not reviewed. No draft means no inferred approval. Enter the reviewer name, save each person's download and reconcile both before requesting changes.

Suggested note: `A11Y-05 | Accessibility review required | P0 | Accessibility | Observation / next action | Reviewer`.

Download each reviewer's notes, reconcile differences, then explicitly request updates to the Git-tracked manifest and issue register. A local draft marked Approved is not product sign-off or a Git update. Record multiple concerns in notes and choose the outcome representing the unresolved decision. Provisional wording flags remain until separately reviewed and updated.

For new issues use the schema in `../visual_qa_issues.md`; link the exact screenshot ID. Review priority and issue severity are distinct. Do not implement production fixes as part of recording review notes.

## Maintain and validate

Source of truth for IDs, filenames, features, states, wording, status and notes: `../visual_qa_manifest.md`.
Batch membership, review focus, priority and existing issue references: `build_review.dart`.
Viewer sources: `review.css` and `review.js`.
Generated, Git-tracked outputs: `index.html`, `../visual_qa_review_plan.md` and `phase19_review_plan.md`.

After editing source metadata or viewer code, run:

```powershell
dart qa/review/build_review.dart
dart qa/review/build_review.dart --check
flutter test test/visual_qa
node --test qa/review/review_handoff_test.cjs
```

The generator requires exact equality between the 148 manifest paths and literal output paths in the deterministic capture definitions. Parameterised captures keep their output filenames explicit. It rejects duplicate IDs/paths, unsupported statuses, unknown/unassigned batch IDs and undocumented generated PNGs. Missing PNGs are allowed. The tests also detect stale generated output and enforce QA-only boundaries.

Only approved human outcomes should be written to the manifest. Generation copies existing statuses; it never creates approvals. Do not edit generated HTML/plan directly, commit PNGs or add a production viewer route.

## Phase 19 browser validation handoff

Automated browser smoke testing was blocked by the browser tool's local-file URL security policy. Pure handoff and QA infrastructure tests do not replace that browser check. On the local HTML, verify Phase 18 shows 40 records, B11–B14 each show ten, P0/P1/P2 show 30/8/2, and 2×/Compact show 4/2. Clear filters to recover all 148 records. Open a thumbnail, use Next/Previous and Close, add a clearly labelled disposable smoke note with status Not reviewed, download it and check its metadata and outcome summary. Clear that draft before starting real review. Missing PNG handling is covered by infrastructure tests; do not delete real captures to exercise it.
