diff --git a/README.md b/README.md
index 8328845..589d88f 100644
--- a/README.md
+++ b/README.md
@@ -536,6 +536,9 @@ job dependencies; it follows the legacy layout contract, not general YAML.
`selection_json::select_json` preserves legacy integer JSON selections. Selected
floats, JSON extensions and nesting above 127 containers refuse with named
`input-selection-*` reasons; extension diagnostics identify the token and byte offset.
+`selection::selected` resolves the preferred `.fractal`/legacy `.st` layout at
+the supplied Git tree and reads strict UTF-8 there, never from the checkout.
+Selected blobs above 16 MiB refuse with `error` before decoding or selection.
### Main-push tree-equality evidence
diff --git a/crates/mergemaster-evidence/src/evidence/legacy_verify.rs b/crates/mergemaster-evidence/src/evidence/legacy_verify.rs
index 77acd33..ffab221 100644
--- a/crates/mergemaster-evidence/src/evidence/legacy_verify.rs
+++ b/crates/mergemaster-evidence/src/evidence/legacy_verify.rs
@@ -7,6 +7,7 @@ pub mod lane_entry;
pub mod lane_git;
pub mod lanes;
pub mod routing;
+pub mod selection;
pub mod selection_json;
pub mod workflow;
use super::legacy_policy::kind_rules::KindRule;
diff --git a/crates/mergemaster-evidence/src/evidence/legacy_verify/lane_git.rs b/crates/mergemaster-evidence/src/evidence/legacy_verify/lane_git.rs
index 28b8e86..505ca5d 100644
--- a/crates/mergemaster-evidence/src/evidence/legacy_verify/lane_git.rs
+++ b/crates/mergemaster-evidence/src/evidence/legacy_verify/lane_git.rs
@@ -134,9 +134,13 @@ pub fn lane_definition(
}
const LANES: &str = ".st/required-lanes.json";
-const PREFERRED: &str = ".fractal/required-lanes.json";
-fn config_path(repo: &Path, commit: &str) -> Result