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

  1. Verify the override entries map passed to `from_sources` actually contains the exact id being resolved
  2. Check id normalization in `resolve` vs the inserted key (string equality vs normalized)
  3. Inspect `from_sources` layering so user overrides are always retained in the merged map
  4. 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 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)