From 938248dfcf3a37119fa4d664bd54da1366e282ef Mon Sep 17 00:00:00 2001 From: Ragnor Comerford Date: Fri, 5 Jun 2026 12:36:28 +0200 Subject: [PATCH] refactor(config): drop merge_layers `..` so new fields can't be silently unmerged MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit merge_layers destructured OmnigraphConfig with a `..` rest-pattern, so a config field added later would be silently dropped from the cross-layer fold (a drift trap). Bind every field explicitly (intentionally-ignored ones as `_`) so a new field fails to compile here until it is dispositioned — the compiler is the guard. --- crates/omnigraph-config/src/merge.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/crates/omnigraph-config/src/merge.rs b/crates/omnigraph-config/src/merge.rs index bf548f7..d7671ce 100644 --- a/crates/omnigraph-config/src/merge.rs +++ b/crates/omnigraph-config/src/merge.rs @@ -37,6 +37,12 @@ pub fn merge_layers(layers: Vec) -> (OmnigraphConfig, Provenance) { let mut loaded_from_file = false; for LoadedLayer { layer, config } in layers { + // No `..` rest-pattern: every field is bound explicitly so a config field + // added later FAILS TO COMPILE here until it is dispositioned (merged or + // deliberately ignored). The compiler is the drift-guard. The `_`-bound + // fields are intentionally not merged: `project` has no consumer; `server` + // is folded into `serve` at load (empty here); `legacy_keys` drives the + // per-layer warnings the caller emits before merge. let OmnigraphConfig { version: layer_version, defaults, @@ -50,10 +56,9 @@ pub fn merge_layers(layers: Vec) -> (OmnigraphConfig, Provenance) { queries, base_dir: layer_base_dir, loaded_from_file: layer_loaded, - // Ignored: `project` (no consumer) and `server` (folded into `serve` - // at load) are empty here; `legacy_keys` drives per-layer warnings the - // caller emits before merge. - .. + project: _, + server: _, + legacy_keys: _, } = config; if layer_version.is_some() {