Local content packs (#155): a versioned, user-controlled bundle of break
ideas (hint pools) and guided routines that the user imports/exports as a
plain JSON file. No cloud, no remote registry β everything is a local file
the user explicitly picks.
How often the off-tick task re-evaluates installed detector plugins.
Detectors gate breaks, which fire on the order of minutes, so a few
seconds of latency on a context change is imperceptible while keeping the
wasm work infrequent.
Recover from poison rather than silently swallow or panic. If the
current_break mutex was poisoned by a panicking writer, we still
want to publish into the slot β losing the publish breaks tray
countdown + cold-mount overlay invariants. The inner data is
always valid (we never leave the slot in a half-written state
between locks), so taking it back is safe.
Snapshot the profile list + active name and atomically write them
to disk. Called after every profile mutation (create / rename /
delete / reorder / reset) so a crash never loses a change.
The plugin registry lives beside settings.json in the same config dir.
Derived rather than threaded through Scheduler::new so adding it didnβt
change the constructor signature.