Privacy-Period-Tracker/docs
null 255808f2fc feat: a guard that every drawable has a night twin
The light/dark pairing was held by a @Preview and nothing else. A preview fails
no build and nothing runs it, and the KDoc on OnboardingPreviews.kt already said
why that matters: "a set of eight where seven have a night variant looks
completely fine in light mode."

The failure mode is what makes this worth a guard. A missing drawable-night file
does not crash, does not warn, and does not fall back to nothing — Android
resolves the light drawable and draws it on a dark screen. The only other way to
find it is to open that one screen in that one theme, which is how #44 was found
and how it sat unnoticed until somebody looked.

checkThemedDrawables walks both directions: a light asset with no night twin,
and a night asset with no light one. The second is the same defect from the
other side and renders as nothing rather than as the wrong picture.

Exemptions are a named map with a reason each, rather than a narrowed scope.
ic_launcher_monochrome is the only entry: the launcher tints it from the system
palette, so a night copy would be a second source of truth for one shape. A
scope that only listed today's eight illustrations would not cover tomorrow's,
and the defect this guards against is a file somebody forgot.

Proved four ways, because prove-guard.sh cannot drive this one — it replaces a
string inside a file, and this guard's failure mode is a file that is not there,
in a set that is all .webp. GUARDS.md gains section 9 for that class of guard,
and the manual recipe from section 1 was run instead:

  - a night twin deleted        -> exactly 1 violation, naming art_welcome
  - a dark-only asset added     -> exactly 1 violation, naming art_orphan
  - both restored               -> green, 64 resources across 5 folder pairs
  - roots pointed at a folder
    that does not exist         -> "no drawables were found ... not a pass"

The fourth is the one worth copying. Refusing to report a pass over an empty
observation is itself a thing to prove: a guard that finds nothing and says
"clean" is the failure GUARDS.md was written after, and two guards in this
project have done exactly that.

closes #42

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 21:37:43 -05:00
..
architecture feat: a guard that every drawable has a night twin 2026-08-19 21:37:43 -05:00
data feat: the wordmark has its space, and logo and banner say so 2026-08-18 22:12:33 -05:00
design feat: app lock, with no way to reset a forgotten PIN 2026-08-19 04:02:47 -05:00
history docs: log the app lock, and the three defects testing found 2026-08-19 04:05:53 -05:00
planning docs: correct 57 claims the code and tracker disagreed with 2026-08-18 16:33:14 -05:00
qa feat: Delete My Data, and fix a privacy option nobody could tap 2026-08-18 21:03:16 -05:00
security feat: app lock, with no way to reset a forgotten PIN 2026-08-19 04:02:47 -05:00
DOC_TRUST_MAP.md docs: eleven app screenshots, from a seeded demo history 2026-08-19 01:47:52 -05:00
TOOLS.md docs: correct 57 claims the code and tracker disagreed with 2026-08-18 16:33:14 -05:00
WORK_CYCLE.md docs: a check-in needs the project UUID, not the slug 2026-08-18 16:35:06 -05:00