# Claude QA Report — Privacy: Period Tracker

```
Status: Current
Owner: _null
Last reviewed: 2026-08-18
Governs: the QA verdict — build SHAs, round summaries, the overall judgment
Review trigger: Any QA round run
```

> The QA verdict. Companion to [`ClaudeQACoverage.md`](ClaudeQACoverage.md)
> (what each pass reached) and [`ClaudeQAPlan.md`](ClaudeQAPlan.md) (the
> playbook).
>
> **Defects are issues, not entries here.** A defect found in a round is filed
> in the tracker with a severity label, where it can be assigned, closed by a
> commit, and counted. This file keeps the part a tracker is bad at: a judgment
> about whether the thing is fit to ship.

## Current run-state

- **Last QA round:** Round 4 — 2026-08-18, partial (A and B pass; C, D, E, F, G and H partial)
- **Last verified build SHA:** `f43e1c2`
- **Last tested device / environment:** emulator `PeriodMinSdk26`, API 26, Pixel 6 profile, debug build, at font scales 1.0, 1.3 and 2.0
- **Overall status:** Five of eight batches are done and Batch 06 has begun:
  Settings is now the screen §36 describes, and Delete My Data is reachable,
  confirmed and irreversible. The app has run at its minimum Android version and
  at the largest accessibility font scale, and both found defects that had been
  shipping unnoticed — a navigation bar that wrapped its labels mid-word, and a
  privacy option whose label was not clickable at all, so the control deciding
  what a lock screen shows could only be changed by hitting the radio button
  exactly. Both are fixed. The pattern is now four rounds old and unchanged:
  **every defect of consequence in this project has been found by a person using
  the app, and none by a test.** The tests are what stop them coming back. The
  standing gaps are the same shape — nobody has yet looked at an actual locked
  screen, and TalkBack has still never been run, which is now the single most
  valuable unspent hour.

## Open defects

**Do not list them here, and do not read a defect count out of this file.** The
Command Center's docs report parses this document for open `P0` / `P1` / `P2`
counts, and under this convention they are always zero — the defects are in the
tracker, which is the whole point. The zeros here mean *this file does not hold
them*, never *there are none*.

Filed as issues in this repository's tracker, labelled by what they cost:

- **P0** — ships broken, or loses data
- **P1** — materially wrong, but shippable
- **P2** — cosmetic or low impact
- **release-blocker** — a release built today would be *wrong*, not merely
  incomplete

Severity is what it costs, not how annoying it is to fix. Every defect needs the
build SHA it was found at — a finding that cannot be re-tested cannot be closed
— so put it in the issue body.

## Round notes

One entry per round, the verdict only. What each pass reached, and what it could
not, lives in [`ClaudeQACoverage.md`](ClaudeQACoverage.md) and is deliberately
not repeated here.

- **Round 4 — 2026-08-18 at `f43e1c2`, partial.** Batch 06 began, and driving
  it found two defects in controls that already looked finished: navigation
  labels wrapping mid-word at font scale 2.0, and a privacy option whose row was
  inert because only its radio button was clickable. Verdict: the privacy
  controls now behave as their own dialog promises — checked by setting a
  preference, deleting all data, and confirming the preference survived.
- **Round 3 — 2026-08-18 at `0451fbe`, partial.** Fertility and reminders landed
  and pass F became runnable for the first time. Verdict: fit to keep building,
  not fit to ship — the privacy promise is proved against the notification
  object and never against a locked screen. Two defects, both in how Android
  behaves rather than in the app's logic, and both found by running on a device.
- **Round 2 — 2026-08-18 at `19edf4c`, partial.** Every screen Batch 03 built
  was driven by hand. Verdict: the product became coherent, and three defects
  surfaced that no unit test would have caught — one of them dark mode, broken
  since Batch 01.
- **Round 1 — 2026-08-18 at `adc5075`, partial.** Two passes were all the first
  build could support. Verdict: sound enough to keep going, and the first thing
  tried by hand crashed the app with 70 unit tests green — which is the argument
  for driving it at all.
