wake-alarm/wake_alarm
Krzysztof kuhy Rudnicki 981396442d Do not ring at all on a shared free day
Fourth app onto freedays (~/utils/freedays), the shared pool of
pre-declared days when every gate app stands down.

_skip_reason is the right seam: it already exists to say why the alarm
must not fire, and the free-day check joins the day gate and the
once-per-day latch as another clock-independent reason. It goes first
because it is the cheapest and the most absolute.

"free day" means the alarm does not ring -- not that it rings later. The
orchestrator is never started, so neither the alarm nor the workout lock
behind it appears. That is the one app in this fleet where standing down
is a physical event rather than an absent dialog, so it is worth being
explicit: nothing happens that morning.

Fail closed, as everywhere else: an unreadable pool reads as "not free"
and the alarm rings normally. Silence is never the failure mode -- there
is a test that a corrupt pool still wakes you up.

The pool is one local file read, so the per-minute tick stays a
millisecond-scale process with no network in it.

The pylint hook's gatelock pin had drifted all the way back to v0.4.1;
it moves to v0.7.3 alongside crdt-sync and freedays. pip refuses two
different direct URLs for one distribution, so that stale pin would have
made the hook environment unresolvable rather than merely old.

requirements.txt also takes pytest-randomly 5.0.0 and ruff 0.16.6, which
the freshness gate flagged once the file was touched. 171 tests, 100%
coverage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 15:28:54 +02:00
..
tests Do not ring at all on a shared free day 2026-09-07 15:28:54 +02:00
__init__.py Add tests and fix pre-commit issues across all projects 2026-04-12 20:45:24 +02:00
_alarm_payload.py Stop trusting an alarm the phone published months ago 2026-08-30 16:37:13 +02:00
_constants.py Stop trusting an alarm the phone published months ago 2026-08-30 16:37:13 +02:00
_log_dedupe.py Grade against 3.14 too, not just run on it 2026-08-29 11:39:33 +02:00
_log_sink.py Phase 1: structured JSONL logging with cross-process dedupe 2026-08-26 23:00:08 +02:00
_logging_setup.py Phase 1: structured JSONL logging with cross-process dedupe 2026-08-26 23:00:08 +02:00
_state.py Retire the PC's waking role; keep the trigger 2026-08-30 15:24:02 +02:00
_sync_transport.py Stop trusting an alarm the phone published months ago 2026-08-30 16:37:13 +02:00
_sync.py Stop trusting an alarm the phone published months ago 2026-08-30 16:37:13 +02:00
_trigger.py Do not ring at all on a shared free day 2026-09-07 15:28:54 +02:00