Doctrine · Constants
Every number, and who set it
One table of named values. Each row says which layer supplied it, including the rows nobody has touched.

The cascade
Resolution is a single pass over layers. Highest wins, then the result is clamped. It runs once, before a decision pass, and does not move during it.
| Layer | Written by | Overridable |
|---|---|---|
| Doctrine bounds | compiled | never. Clamps every layer above. |
| Defaults | the build | yes |
| Baseline | you, saved | yes |
| Site | you, per site | yes |
| Operator override | a live declaration, time-boxed | wins, and is still clamped |
A clamp is recorded, not silently applied. Careless authoring is possible; unsafe authoring is not.
Posture and rules are not layers
Posture gates. Rules derive. A rule that wants a different number for one pass emits a derivation that lives inside that decision and dies with it. The constant never moves, so the screen showing it never lies about what is configured.
This is why a value owned by a rule is displayed here rather than hidden. Removing it would change behaviour; showing it as a plain editable number would be a lie about who controls it. It appears as what it is, with a link to the rule.
Total attribution
A trace entry is emitted for every key, always, including keys no layer touched, which resolve to their default and say so.
A trace with holes in it is a trace an operator learns to distrust, and an operator who distrusts the trace stops reading it.
You can name your own
This is the one table where creating a row means something. A site can name a constant of its own, because only a rule can consume a value nobody wrote code for.
A constant you invent and no rule reads is inert. That is the correct behaviour and it is worth knowing before you add ten of them.
What lives elsewhere
Each subsystem owns its own numbers, and they are shown on that subsystem's page rather than here. Alerting has a page. Fusion has a page, gaining a block per algorithm. A value in two places is a value two people can set differently.
Where to go next
- Policy & rules for what reads these.
- Solver configuration for the planning weights.