docs: mark M4 done
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wmy1BpCKi8KeSjaWhYuCPV
This commit is contained in:
+37
-9
@@ -10,14 +10,13 @@ Status legend: ✅ done · 🚧 in progress · ⬜ not started
|
|||||||
|
|
||||||
## Current state (one line)
|
## Current state (one line)
|
||||||
|
|
||||||
✅ **M3 done.** Clockula's alarms ring. Next-fire resolution is a pure function
|
✅ **M4 done.** Clockula has a face. Four tabs under an M3 Expressive navigation
|
||||||
over a repeat mask and a zone, DST-correct in both directions; skip and snooze
|
bar that becomes a wide rail on a tablet, with the back-stack policy and the
|
||||||
each have a persisted watermark; the engine registers only the single next alarm
|
live pill's whole decision written as pure functions rather than as composable
|
||||||
via `setAlarmClock`, is driven by five thin receivers, and rings through a
|
state; the ring screen is real, with a maths or hold challenge that always has a
|
||||||
foreground service that survives process death and reboot and never degrades to
|
way out — three wrong answers or sixty seconds, whichever comes first. The tabs
|
||||||
silence. Schema v2 adds `alarm_states`, and M2's reboot blind spot is closed.
|
themselves are still empty states: **M5** (the alarms screen — list, editor,
|
||||||
**M4** (the app shell — navigation host, four tabs, the live pill, and the ring
|
time picker, repeat days, per-alarm overrides) is next.
|
||||||
screen's UI) is next.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -166,7 +165,7 @@ plumbing.
|
|||||||
no device was attached; an auto-silenced alarm is silently missed, with no
|
no device was attached; an auto-silenced alarm is silently missed, with no
|
||||||
missed-alarm notification until someone asks for one.
|
missed-alarm notification until someone asks for one.
|
||||||
|
|
||||||
### ⬜ M4 — App shell
|
### ✅ M4 — App shell
|
||||||
- Navigation host, four tabs, M3 navigation bar, adaptive rail on wide layouts.
|
- Navigation host, four tabs, M3 navigation bar, adaptive rail on wide layouts.
|
||||||
- The **live pill** (`PLAN.md` §9) — shared running-state surface, pause + stop
|
- The **live pill** (`PLAN.md` §9) — shared running-state surface, pause + stop
|
||||||
from any tab.
|
from any tab.
|
||||||
@@ -174,6 +173,35 @@ plumbing.
|
|||||||
dismiss challenge that cannot strand the user.
|
dismiss challenge that cannot strand the user.
|
||||||
- Motion from the kit's `identity` module; predictive back.
|
- Motion from the kit's `identity` module; predictive back.
|
||||||
|
|
||||||
|
✅ 480 JVM tests, 154 of them new, and still **no Robolectric** — which had to
|
||||||
|
be earned rather than kept. Everything that decides something moved out of the
|
||||||
|
composables: `ShellNavigation` (what a tab tap does to the back stack, and
|
||||||
|
that back from a tab goes to Alarms while back from Alarms leaves the app),
|
||||||
|
`LivePillSelector` (which of several running things the pill is about),
|
||||||
|
`ClockFormat`, and `ChallengeGate`. The adaptive part is
|
||||||
|
`NavigationSuiteScaffold` taking its own default — the short bar on a phone,
|
||||||
|
the wide rail on a tablet — rather than a hand-rolled width branch that would
|
||||||
|
miss the tabletop posture. The pill shows for paused and expired timers too,
|
||||||
|
not only running ones: pausing from the pill must not make the pill disappear
|
||||||
|
under the thumb that pressed it. Its value comes from the snapshot, so a timer
|
||||||
|
that reaches zero flips to "finished" before M6's expiry write lands. The
|
||||||
|
challenge's escape hatch opens on three wrong answers **or** sixty seconds of
|
||||||
|
ringing, for every challenge kind, asserted as one parameterised invariant;
|
||||||
|
snooze is never gated; a completed hold *is* the dismissal, and an
|
||||||
|
accessibility click completes the hold, because a challenge TalkBack cannot
|
||||||
|
answer is exactly the stranding the requirement forbids. floret-kit went to
|
||||||
|
0.5.0 for one change: `CollapsingScaffold`'s `onBack` is nullable, so a
|
||||||
|
top-level tab draws no back arrow that would pop nothing.
|
||||||
|
|
||||||
|
Knowingly open: M4 ships no in-app way to *start* a timer or the stopwatch, so
|
||||||
|
the live pill cannot be demonstrated by hand until M6/M7 — it is proven by its
|
||||||
|
unit tests and by an instrumentation test that seeds the repository directly,
|
||||||
|
and no debug button was added to paper over it. The nine new instrumentation
|
||||||
|
tests compile in the gate but have never run on hardware, as no device was
|
||||||
|
attached. `POST_NOTIFICATIONS` is asked for once on first launch; explaining a
|
||||||
|
denial, and the exact-alarm and full-screen-intent grant deep links, moved
|
||||||
|
wholly to M10's self-check, which is the screen with room to say why.
|
||||||
|
|
||||||
### ⬜ M5 — Alarms screen
|
### ⬜ M5 — Alarms screen
|
||||||
List, create, edit, delete, enable/disable. Time picker, repeat-day selector,
|
List, create, edit, delete, enable/disable. Time picker, repeat-day selector,
|
||||||
label, ringtone picker, vibrate, snooze settings, per-alarm overrides. Next-fire
|
label, ringtone picker, vibrate, snooze settings, per-alarm overrides. Next-fire
|
||||||
|
|||||||
Reference in New Issue
Block a user