Hmbown/CodeWhale · error
resolved
Error message
resolved
What it means
In `merge_order_is_user_override_then_provider_then_bundled`, `merged.resolve("sample/model").expect("resolved")` panics when the merged catalog has no entry for the model id. Since the test just inserted the id into `override_entries` and called `MergedCatalog::from_sources`, the panic means merge/precedence logic dropped the user-override entry.
Solutions
- Verify the override entries map passed to `from_sources` actually contains the exact id being resolved
- Check id normalization in `resolve` vs the inserted key (string equality vs normalized)
- Inspect `from_sources` layering so user overrides are always retained in the merged map
- Print `merged.entries` keys before resolve to see what survived the merge
Example fix
// before
let resolved = merged.resolve("sample/model").expect("resolved");
// after
let resolved = merged.resolve("sample/model")
.unwrap_or_else(|| panic!("resolve failed; keys={:?}", merged.entries.keys().collect::<Vec<_>>())); Defensive patterns
Strategy: validation
Validate before calling
assert!(merged.entries.contains_key("sample/model"), "override entry lost in merge: {:?}", merged.entries.keys().collect::<Vec<_>>()); Try / catch
let resolved = merged.resolve("sample/model")
.unwrap_or_else(|| panic!("resolve failed; merged keys: {:?}", merged.entries.keys().collect::<Vec<_>>())); Prevention
- When changing merge precedence, dump the merged keys for a fixture id before asserting
- Keep model-id normalization identical at insert and lookup
- Add one precedence test per layer (override/provider/bundled) so regressions localize
When it happens
Trigger: `MergedCatalog::from_sources` failing to include the override layer, or `resolve` looking up by a normalized id that differs from the inserted `"sample/model"` key; also occurs if `from_sources` is passed layers in an order that discards rather than overrides.
Common situations: Refactoring merge precedence in `model_catalog.rs`; changing model-id normalization (case, provider prefix) so the inserted key no longer matches the lookup key; switching from BTreeMap overlay to a replace-last-wins merge.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
AI-assisted analysis of Hmbown/CodeWhale@433685b202 (2026-09-15).
Data as JSON: /api/errors/b4947d3108a6365c.
Report an issue: GitHub.
Appendix: source
Thrown at crates/models/src/model_catalog.rs:324
);
let bundled = cache(now, 3600, bundled_entries);
let mut provider_entries = BTreeMap::new();
provider_entries.insert(
"sample/model".to_string(),
entry("sample/model", 2_000, MetadataProvenance::ProviderApi),
);
let provider_cache = cache(now, 3600, provider_entries);
let mut override_entries = BTreeMap::new();
override_entries.insert(
"sample/model".to_string(),
entry("sample/model", 3_000, MetadataProvenance::UserOverride),
);
let merged =
MergedCatalog::from_sources(override_entries, Some(provider_cache), bundled, now);
let resolved = merged.resolve("sample/model").expect("resolved");
assert_eq!(resolved.context_window, Some(3_000));
assert_eq!(resolved.provenance, MetadataProvenance::UserOverride);
}
#[test]
fn stale_cache_is_ignored_for_facts() {
let now = Utc::now();
let mut bundled_entries = BTreeMap::new();
bundled_entries.insert(
"sample/model".to_string(),
entry("sample/model", 1_000, MetadataProvenance::Bundled),
);
let bundled = cache(now, 3600, bundled_entries);
let mut provider_entries = BTreeMap::new();
provider_entries.insert(
"sample/model".to_string(),
entry("sample/model", 9_000, MetadataProvenance::ProviderApi),View on GitHub (pinned to 433685b202)