Effective Configuration Diff¶
Diagnostic tool — instantiates Controlled Inheritance Propagation
Computes the fully-resolved effective settings for a node and labels each value with where it came from, so you can see what was inherited versus overridden locally.
Effective Configuration Diff answers the question every inheritance system eventually forces: given all the layers, what is this thing actually running with, and where did each value come from? It flattens the whole inheritance chain into a single resolved end-state — the effective configuration — and annotates every key with its provenance: inherited from which ancestor, or set locally. Its defining move is making the invisible visible. It decides nothing about propagation or precedence — the tree and the cascade already did that — it reports the outcome and its lineage, and as a diff it highlights how one node's effective state differs from another's, from its parent's, or from what it was before a change.
Example¶
An IT team manages roughly 5,000 laptops through a mobile-device-management (MDM) platform where policy inherits org → department → team → device. A finance user reports that their laptop refuses to install a needed plugin. The device's own profile says nothing about plugins — because the blocking rule is inherited three levels up. The team runs an effective-config view for that one device: it resolves every layer and prints the effective policy with provenance — plugin_allowlist: [] (inherited from Org / Security), disk_encryption: on (inherited from Dept / Finance), wallpaper: custom (set locally).
Now the cause is legible: the block is an organization-wide security default, not a device misconfiguration. Diffing this device against a healthy peer confirms the only meaningful difference is a department-level override, so the fix belongs at the department scope, not the device. The tool turns "why is it like this?" into a labeled, comparable answer in seconds.
How it works¶
- Resolve the chain. Walk the full lineage and reduce each key to its winning value, consuming the tree's fall-through and the cascade's precedence.
- Tag provenance. Label every resolved value with the exact ancestor it was inherited from, or mark it a local override.
- Diff on demand. Compare node-vs-node ("why does A behave differently from B?"), node-vs-ancestor ("what has this node actually changed?"), or before-vs-after a proposed edit.
- Report state, not rules. Its output is purely the resolved values and their origins; it adds no new propagation logic.
Its distinguishing move is the came-from label on every value: it is the provenance annotation, not the resolution logic, that makes this its own mechanism.
Tuning parameters¶
- Diff basis — what you compare against: a sibling node, the parent scope, a prior snapshot, or the bare defaults — each answers a different question.
- Provenance depth — whether a value shows only its immediate source or the full chain of who-set-what-and-was-overridden. Full chains explain shadowing but get noisy.
- Inherited-value display — show every effective key, or only the ones that differ from the parent (the overrides). All-keys is complete; diff-only is legible.
- Snapshot cadence — on-demand resolution, or stored snapshots you can diff over time to catch drift between environments that should match.
- Redaction — whether resolved secrets are shown, masked, or hidden, since the effective view concentrates everything into one place.
When it helps, and when it misleads¶
Its strength is that it is the antidote to inheritance's "action at a distance": instead of guessing what a leaf inherits, you see the resolved value and its origin, which collapses most "why is it configured like this?" investigations. As a diff it also catches configuration drift between environments that were supposed to stay identical.
Its failure mode is that the effective view is a snapshot, and it misleads exactly when resolution is dynamic. If values are computed at runtime, depend on request context, or the source order is not stable, the diff shows one resolution among many and invites false confidence. It also shows what a value is and where it came from, but never why the override exists — provenance is not justification. This mirrors the gap between desired and observed state that control-loop systems track: a picture of "effective now" is not a guarantee of "effective always."[1] The discipline is to resolve under the real runtime inputs, timestamp snapshots, and treat the effective view as evidence to investigate with rather than a certificate that the configuration is correct.
How it implements the components¶
Effective Configuration Diff realizes the observability side of the archetype — it produces no propagation, only a clear picture of its result:
effective_state_view— its core output: the fully-resolved settings after all inheritance and precedence have been applied.inherited_local_state_marker— every value is tagged inherited-from-ancestor or set-locally, so shadowing and overrides are visible at a glance.
It does NOT define how values propagate or which one wins — those are Configuration Inheritance Tree and CSS Cascade and Specificity Rule; nor does it predict a change's downstream reach before you make it — that's Lineage Impact Analysis Report.
Related¶
- Instantiates: Controlled Inheritance Propagation — the read-side view that makes resolved inheritance inspectable.
- Consumes: Configuration Inheritance Tree (or any lineage substrate) supplies the layers, and CSS Cascade and Specificity Rule supplies the precedence, that this tool resolves and labels.
- Sibling mechanisms: Configuration Inheritance Tree · CSS Cascade and Specificity Rule · Object-Oriented Class Inheritance · Inheritance Lint or Static Analysis · Lineage Impact Analysis Report · Override Expiry Workflow · Prototype Delegation Chain · Permission Inheritance with Explicit Denial · Policy Inheritance Matrix · Platform Variant Option Model · Schema Extension and Override Check · Template Clause Override Register · Trait or Mixin Composition Rule
References¶
[1] In control-loop systems such as Kubernetes controllers, a reconciliation loop continuously drives observed state toward a declared desired state. The lesson an effective-config snapshot borrows is that "the resolved value right now" and "the resolved value in general" can diverge whenever resolution is dynamic. ↩