docs: record Round 2 QA and the Batch 03 log entry
Round 2 covers every screen Batch 03 built, pass by pass, with each partial and not-run row carrying why. Three new standing gaps, all of them things nobody has done rather than things that failed: TalkBack has never been run, text has never been scaled, and nothing has run at minSdk. The rule this session keeps demonstrating is now stated plainly in both files: the defects in this project are found by running it, not by reading it.
This commit is contained in:
parent
19edf4c920
commit
7185708547
|
|
@ -32,6 +32,69 @@ written and stay true. It is exempt from review for the same reason a receipt is
|
||||||
|
|
||||||
## Entries
|
## Entries
|
||||||
|
|
||||||
|
### 2026-08-18 — Batch 03 shipped: every screen the app has, and three defects only looking could find
|
||||||
|
|
||||||
|
All six Batch 03 issues closed and the milestone with them. Period stopped being
|
||||||
|
a data layer with a debug surface and became something you can actually use:
|
||||||
|
onboarding that ends in a forecast, a Today screen whose six states each say
|
||||||
|
something different and true, two-tap logging, a calendar, and Insights.
|
||||||
|
|
||||||
|
**Placeholder artwork, as §42 asks for it.** Every illustration and calendar
|
||||||
|
marker is a Compose vector path behind a replaceable name — no raster anywhere
|
||||||
|
under `src/`. The visual language is overlapping circular forms and nothing
|
||||||
|
else, because §42's forbidden list is a product decision: this app gets opened
|
||||||
|
in public and a glance over a shoulder should learn nothing. Note the deliberate
|
||||||
|
contrast with `docs/data/img/`, where a placeholder is still forbidden and #8
|
||||||
|
stays open; `docs/design/README.md` now explains why the two differ rather than
|
||||||
|
leaving it looking inconsistent.
|
||||||
|
|
||||||
|
**Three defects, none findable by reading:**
|
||||||
|
|
||||||
|
1. **Dark mode was broken for the whole of Batch 01.** `PeriodTheme` never
|
||||||
|
wrapped its content in a `Surface`, so any `Text` without an explicit colour
|
||||||
|
inherited Material's default — black — and the app's background never
|
||||||
|
painted. Light mode looked right by accident, because dark-on-cream is what
|
||||||
|
was wanted anyway. 129 tests were green throughout.
|
||||||
|
2. **"Period ended" appeared to do nothing.** The logic was correct: a period
|
||||||
|
that ends today still includes today, so the state genuinely does not change.
|
||||||
|
The screen was identical afterwards and the button read as broken, which is
|
||||||
|
worse than being broken somewhere visible.
|
||||||
|
3. **The today-underline collided with the spotting dot** on the one day that
|
||||||
|
was both. Invisible in the colour screenshot and obvious the moment it was
|
||||||
|
converted to greyscale — which is how §43 says to check, and why the check is
|
||||||
|
written that way rather than trusting that shapes differ because they were
|
||||||
|
designed to.
|
||||||
|
|
||||||
|
Two more came from tests doing their job: the typical-range quartiles were
|
||||||
|
indexed off `size` rather than `size - 1`, so a regular cycle with one long gap
|
||||||
|
was reported as "typical range 29–61 days" on the screen whose only job is to
|
||||||
|
say what has been learned; and Room's own executor meant a test's virtual clock
|
||||||
|
returned before the writes landed, which read as an empty database rather than
|
||||||
|
as a timing bug.
|
||||||
|
|
||||||
|
**The habit is now five pieces of work old and worth writing down as a rule: the
|
||||||
|
defects in this project are found by running it.** Three guards were green over
|
||||||
|
exactly what they claimed to check, dark mode was broken for a whole batch, and
|
||||||
|
a button looked broken while behaving correctly. None of it was visible in the
|
||||||
|
source.
|
||||||
|
|
||||||
|
- **Closed:** #15, #16, #17, #18, #19, #20 — and the `Batch 03 — Core UX`
|
||||||
|
milestone.
|
||||||
|
- **Next action:** Batch 04 — Fertility. File its issues first; the milestone is
|
||||||
|
empty. The work is estimated ovulation and the fertile window from the
|
||||||
|
forecast and a configurable luteal-phase assumption (§17, §18), the calendar
|
||||||
|
and Today states that already have their shapes and their `null` placeholders
|
||||||
|
waiting, and the not-contraception disclaimer everywhere fertility appears.
|
||||||
|
`CycleStatus` and `CalendarMarks` both already take fertility parameters and
|
||||||
|
currently receive null — Batch 04 is largely filling those in rather than
|
||||||
|
adding surfaces.
|
||||||
|
- **Blockers:** Unchanged. #8 needs the three branding marks drawn by a person.
|
||||||
|
#9 needs the Command Center webhook URL and secret, which are not readable
|
||||||
|
from this machine. Neither blocks Batch 04. Worth doing before much more UI:
|
||||||
|
run TalkBack once, scale the font to maximum once, and run the app once on a
|
||||||
|
device at `minSdk` 26 — all three are recorded as standing gaps and none has
|
||||||
|
ever been done.
|
||||||
|
|
||||||
### 2026-08-18 — Batch 02 shipped: the prediction engine, and three bugs the tests found
|
### 2026-08-18 — Batch 02 shipped: the prediction engine, and three bugs the tests found
|
||||||
|
|
||||||
All five Batch 02 issues closed and the milestone closed with them. The app now
|
All five Batch 02 issues closed and the milestone closed with them. The app now
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,40 @@ Review trigger: Any QA round run
|
||||||
> like a pass that succeeded, and that is how untested code ships believing it
|
> like a pass that succeeded, and that is how untested code ships believing it
|
||||||
> was tested.
|
> was tested.
|
||||||
|
|
||||||
|
## Round 2 — 2026-08-18 at `19edf4c`, partial
|
||||||
|
|
||||||
|
Batch 03 built every screen the app has, and each was driven by hand on the
|
||||||
|
emulator as it landed rather than in one pass at the end. Same environment:
|
||||||
|
`PeriodQA`, API 36, Pixel 6 profile, debug build.
|
||||||
|
|
||||||
|
| Pass | Result | Notes |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| A — First run | **Pass** | Clean install reaches onboarding; all seven screens walked; the flow produces a forecast and a relaunch goes straight to Today. |
|
||||||
|
| B — Core loop | **Pass** | Two-tap logging confirmed on the device: "Started period" → "Yes — today" → "Logged ✓". Editing, ending, and spotting reclassification all exercised. |
|
||||||
|
| C — Failure paths | **Partial** | Duplicate-date logging, an end date before a start, and a future date in the picker all handled. Airplane mode, denied permissions and a process killed mid-write still untried. |
|
||||||
|
| D — Persistence | **Partial** | Onboarding completion, records and settings all survive force-stop and relaunch. Reboot and update-over-install untried. |
|
||||||
|
| E — Forecast under hard histories | **Partial** | The §51 cases pass as unit tests against both engines, and the not-yet path was driven through the UI. The variable and outlier histories have still not been entered by hand. |
|
||||||
|
| F — Notification privacy | **Not run** | Nothing sends a notification yet — Batch 05. The onboarding *choice* was verified: Discreet is selected before the user touches anything. |
|
||||||
|
| G — Accessibility | **Partial** | Every calendar day, the confidence indicator and the hero countdown carry content descriptions, checked by reading the view hierarchy. **The calendar was verified in actual greyscale** and all five marks remain distinguishable. TalkBack itself, and font scaling, still untried. |
|
||||||
|
| H — Data ownership | **Partial** | Delete-all covered by an instrumented test. Export, app lock and artifact inspection do not exist yet. |
|
||||||
|
|
||||||
|
### What driving it found that tests did not
|
||||||
|
|
||||||
|
Three defects, none of which any unit test would have caught:
|
||||||
|
|
||||||
|
1. **Dark mode was broken for the whole of Batch 01.** `PeriodTheme` never
|
||||||
|
wrapped its content in a `Surface`, so text without an explicit colour
|
||||||
|
inherited black and the app background never painted. Light mode looked
|
||||||
|
correct by accident.
|
||||||
|
2. **"Period ended" appeared to do nothing.** The logic was right — a period
|
||||||
|
ending today still includes today — but the screen was identical afterwards,
|
||||||
|
so the button read as broken.
|
||||||
|
3. **Today's underline collided with the spotting dot**, on the one day that was
|
||||||
|
both. Invisible in the colour screenshot, obvious in greyscale.
|
||||||
|
|
||||||
|
The pattern is now four rounds old and worth stating as a rule: **the defects in
|
||||||
|
this project are found by opening it, not by reading it.**
|
||||||
|
|
||||||
## Round 1 — 2026-08-18 at `adc5075`, partial
|
## Round 1 — 2026-08-18 at `adc5075`, partial
|
||||||
|
|
||||||
Not a full round. Batch 01 produced the first build, and this covered the two
|
Not a full round. Batch 01 produced the first build, and this covered the two
|
||||||
|
|
@ -74,6 +108,12 @@ at its own `minSdk`.**
|
||||||
Things no round has ever covered, carried forward until they are. This list
|
Things no round has ever covered, carried forward until they are. This list
|
||||||
existing is not a failure; it not existing while the gaps do is.
|
existing is not a failure; it not existing while the gaps do is.
|
||||||
|
|
||||||
|
- **TalkBack has never actually been run.** Content descriptions are written and
|
||||||
|
were checked by reading the view hierarchy, which proves they exist and not
|
||||||
|
that they make sense in sequence. Pass G is not complete until somebody
|
||||||
|
navigates a screen with their eyes shut.
|
||||||
|
- **Font scaling untried.** The hero number is 72sp; at the largest accessibility
|
||||||
|
scale it may not fit beside anything.
|
||||||
- **No device at `minSdk`.** Everything so far ran on API 36. The two NewApi
|
- **No device at `minSdk`.** Everything so far ran on API 36. The two NewApi
|
||||||
bugs above would have crashed on Android 8 through 13 and nothing except lint
|
bugs above would have crashed on Android 8 through 13 and nothing except lint
|
||||||
could see them. Lint is a good guard and it is not a substitute for one run on
|
could see them. Lint is a good guard and it is not a substitute for one run on
|
||||||
|
|
|
||||||
|
|
@ -19,19 +19,22 @@ Review trigger: Any QA round run
|
||||||
|
|
||||||
## Current run-state
|
## Current run-state
|
||||||
|
|
||||||
- **Last QA round:** Round 1 — 2026-08-18, partial (passes A and B; C, D and H partial)
|
- **Last QA round:** Round 2 — 2026-08-18, partial (A and B pass; C, D, E, G and H partial; F not applicable yet)
|
||||||
- **Last verified build SHA:** `adc5075`
|
- **Last verified build SHA:** `19edf4c`
|
||||||
- **Last tested device / environment:** emulator `PeriodQA`, API 36, Pixel 6 profile, debug build
|
- **Last tested device / environment:** emulator `PeriodQA`, API 36, Pixel 6 profile, debug build
|
||||||
- **Overall status:** The Batch 01 foundation works end to end on a device — log
|
- **Overall status:** Three batches are done and the app is now a real product
|
||||||
a period, see a forecast with an honest window and confidence, edit it and
|
you can use end to end: onboarding that ends in a forecast, a Today screen
|
||||||
watch the forecast move — and the first partial QA round found two defects
|
whose six states each say something different and true, two-tap logging, a
|
||||||
that 70 passing unit tests could not: tapping the app's primary button twice
|
calendar whose marks survive greyscale, and an Insights screen that mostly
|
||||||
crashed it, and two date APIs on the recalculation path would have crashed
|
declines to make claims it has not earned. The prediction engine is the one
|
||||||
every device below Android 14. Both are fixed, with regression tests. That
|
§12 specifies and is measurably better than the prototype it replaced. What
|
||||||
ratio is the honest summary of where this project stands: the logic is well
|
the rounds keep showing is that this project's defects are found by opening
|
||||||
covered and the product has barely been used, so the next round matters more
|
the app rather than by reading it — dark mode was broken for an entire batch
|
||||||
than the last one. Nothing has been tested at the minimum Android version this
|
with 129 tests green, and the calendar's marks collided in a way only a
|
||||||
app claims to support.
|
greyscale screenshot revealed. The gaps that matter now are the ones nothing
|
||||||
|
has touched: TalkBack has never been run, text has never been scaled up, and
|
||||||
|
nothing has run on a device at the minimum Android version this app claims to
|
||||||
|
support.
|
||||||
|
|
||||||
## Open defects
|
## Open defects
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue