Merge pull request 'Say in to-be 27 how a value several modules share is set once (issue 415, ADR 0309, ADR 0319)' (#327) from design/415-shared-value-trust into main

This commit was merged in pull request #327.
This commit is contained in:
2026-10-12 11:54:01 +00:00
@@ -5,6 +5,7 @@ code: [mesh-controller internal/catalogue]
updated: 2026-10-12
decisions:
- "ADR 0312"
- "ADR 0319"
- "ADR 0309"
- "ADR 0262"
- "ADR 0225"
@@ -232,19 +233,25 @@ gains a setting by shipping its current value as the default, and `settings` lis
source: the default, the mesh, or the node. The first module to use it is the notifier, whose font size
and width are preferences. *How it is checked:* the table in ADR 0262.
*A setting left unset reads a value the modules share (2026-10-12, ADR 0309, changing ADR 0164 §7 and §8 and
ADR 0262 §3, §7, §8 and §10; the build is tracked by issue 415):* every module keeps declaring each setting it
takes, so any one module can still be set apart, and a setting may also name a mesh-wide value it shares with
other modules, such as `desktop.font-size`; the desktop modules are the first to declare the shared names they
read. When none of a module's own layers sets one of its settings, the setting reads the mesh-wide value of its
shared name, and only when that is unset too the module's own default. Read from the bottom, last winning: the
module's default, the shared value, the module's mesh-wide layer, the node's. `settings` sets and clears a
shared value without naming a module, and still refuses a write without a module that names no declared shared
name. Both the listing of one module and the listing of preferences across all modules name the shared name as
a value's source, beside the default, the mesh and the node. Setting a shared value is held to the strictest
rule among the settings that read it, so a trusted setting (ADR 0277) is never gone round through its shared
name. Whether a shared value is a number, a colour or a string is left to the typed-settings work, issues 346
and 410. *How it is checked:* the table in ADR 0309.
*A value several modules share is set once (2026-10-12, ADR 0309, changing ADR 0164 §7 and §8 and ADR 0262
§3, §7, §8 and §10, and ADR 0319, changing ADR 0164 §4 and §9 and ADR 0309 §2, §3, §5 and §6; the build is
tracked by issue 415):* a module keeps every setting it takes, and a preference may also name a mesh-wide
**shared name**, such as `desktop.font-size`. Unset in every layer of its own module, the preference
reads the shared value, and only when that is unset too its default; read from the bottom, last
winning: the default, the shared value, the module's mesh-wide layer, the node's. So a person sets
the interface font size once and every module that names it follows, while any one module or node
can still be set apart in its own layer. A shared value is a fourth place of change beside the three
of ADR 0164 (a new default no longer reaches an assignment whose shared value is set), and the plan
of a change to it names every assignment, of every module that reads it,
whose effective value moves. It is set and cleared through the `settings` verb without a module, and
both `settings` listings name the shared name as a value's source beside the default, the mesh and the
node. **A shared value reaches no trusted setting** (ADR 0319): a trusted setting may not declare a
shared name, and registration refuses one that does, so a shared value is never trusted and needs no
warrant; a trusted setting is set in its own module's layer, on the operator's warrant (ADR 0277) or at
the terminal, as before. A trusted setting that a stored manifest still declares with a shared name
never reads the shared value, and both listings say why beside it. Whether a shared value is a
number, a colour or a string waits for the typed-settings work (issues 346 and 410). *How it is
checked:* the tables in ADR 0309 and ADR 0319.
*The operator's value travels only where it is asked for (2026-09-30,
[issue 173](../../04-ISSUES/173-a-modules-settings-reach-every-fact-it-contributes/00-report.md)):*