Skip to main content

max / quasi

Say in the quasi-notifs header that a kind is app-wide A Kind is one switch for a whole app, so a notification answered per row of something the app owns is the app's own switch. The header now states that, and states what it costs: such a notification skips the outbox, so duplicate suppression and CatchUp do not cover it. Written to record where the line sits rather than to close the question. One per-row toggle exists across the tree today, and a second would be worth reopening this on. Also fixes two broken intra-doc links in config.rs found by the same doc build: is_key is private, and Reach::posture is behind the synckit feature.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01DwpiantpUgohzML4xr6KeQ
Author: Max Johnson <me@maxj.phd> · 2026-08-30 17:16 UTC
Signed with PGP, not checked
Commit: a04c7f72684eb5636739d19938773247f008d194
Parent: 408e5f5
2 files changed, +22 insertions, -2 deletions
@@ -10,7 +10,7 @@
10 10 //!
11 11 //! # The generated key is dotted, and that is what keeps it apart
12 12 //!
13 - //! `<kind>.enabled`, and `<kind>.<knob>` for each option. [`is_key`] refuses a
13 + //! `<kind>.enabled`, and `<kind>.<knob>` for each option. `is_key` refuses a
14 14 //! dot in either id for exactly this reason: the dot is the separator, so it
15 15 //! cannot also be inside a name.
16 16 //!
@@ -39,7 +39,7 @@
39 39 ///
40 40 /// [`synckit_config::Posture`] under another name, and the name is forced:
41 41 /// [`Posture`] here is already whether a kind ships on. The mapping is one to
42 - /// one and [`Reach::posture`] is it, so nothing chooses between two vocabularies
42 + /// one and `Reach::posture` (under the `synckit` feature) is it, so nothing chooses between two vocabularies
43 43 /// -- this crate cannot depend on `synckit-config` unconditionally, because that
44 44 /// crate carries a bundled SQLite and an app that only declares kinds should not
45 45 /// link one.
@@ -14,6 +14,26 @@
14 14 //! and keeping them apart is what stops the declaration from growing a
15 15 //! dependency on a host.
16 16 //!
17 + //! # A kind is app-wide, and a per-row switch is the app's
18 + //!
19 + //! A [`Kind`] is one switch for a whole app: its generated `<kind>.enabled`
20 + //! key answers on or off once, for everybody using that install. A
21 + //! notification whose on/off is answered per row of something the app owns,
22 + //! per email account, per project, per calendar, is the app's own switch and
23 + //! its own call to make. It is not declared here.
24 + //!
25 + //! What that costs, so the next reader does not take it for an oversight: a
26 + //! notification the app fires itself goes out without the [`Outbox`], so
27 + //! duplicate suppression and [`CatchUp`] do not cover it.
28 + //!
29 + //! This records where the line sits rather than closing the question.
30 + //! Measured across the tree on 2026-08-30, exactly one per-row toggle exists,
31 + //! goingson's `email_accounts.notify_new_emails`, and for that one the
32 + //! suppression is not a loss: two sync cycles that both save mail are two
33 + //! notifications a reader wants, and a restart syncs and produces fresh mail
34 + //! anyway, so there is nothing for [`CatchUp`] to catch up. A second per-row
35 + //! kind would change that count and be worth reopening this on.
36 + //!
17 37 //! # Const-friendly on purpose
18 38 //!
19 39 //! Every type here is constructible in a `const`, so an app's notification set