{"record":{"id":"b4947d3108a6365c","repo":"Hmbown/CodeWhale","slug":"resolved","errorCode":null,"errorMessage":"resolved","messagePattern":"resolved","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/models/src/model_catalog.rs","lineNumber":324,"sourceCode":"        );\n        let bundled = cache(now, 3600, bundled_entries);\n\n        let mut provider_entries = BTreeMap::new();\n        provider_entries.insert(\n            \"sample/model\".to_string(),\n            entry(\"sample/model\", 2_000, MetadataProvenance::ProviderApi),\n        );\n        let provider_cache = cache(now, 3600, provider_entries);\n\n        let mut override_entries = BTreeMap::new();\n        override_entries.insert(\n            \"sample/model\".to_string(),\n            entry(\"sample/model\", 3_000, MetadataProvenance::UserOverride),\n        );\n\n        let merged =\n            MergedCatalog::from_sources(override_entries, Some(provider_cache), bundled, now);\n        let resolved = merged.resolve(\"sample/model\").expect(\"resolved\");\n        assert_eq!(resolved.context_window, Some(3_000));\n        assert_eq!(resolved.provenance, MetadataProvenance::UserOverride);\n    }\n\n    #[test]\n    fn stale_cache_is_ignored_for_facts() {\n        let now = Utc::now();\n        let mut bundled_entries = BTreeMap::new();\n        bundled_entries.insert(\n            \"sample/model\".to_string(),\n            entry(\"sample/model\", 1_000, MetadataProvenance::Bundled),\n        );\n        let bundled = cache(now, 3600, bundled_entries);\n\n        let mut provider_entries = BTreeMap::new();\n        provider_entries.insert(\n            \"sample/model\".to_string(),\n            entry(\"sample/model\", 9_000, MetadataProvenance::ProviderApi),","sourceCodeStart":306,"sourceCodeEnd":342,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/433685b2024e7bc4c99e1e2e326bcad39b4d9d65/crates/models/src/model_catalog.rs#L306-L342","documentation":"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.","triggerScenarios":"`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.","commonSituations":"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.","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"],"exampleFix":"// before\nlet resolved = merged.resolve(\"sample/model\").expect(\"resolved\");\n// after\nlet resolved = merged.resolve(\"sample/model\")\n    .unwrap_or_else(|| panic!(\"resolve failed; keys={:?}\", merged.entries.keys().collect::<Vec<_>>()));","handlingStrategy":"validation","validationCode":"assert!(merged.entries.contains_key(\"sample/model\"), \"override entry lost in merge: {:?}\", merged.entries.keys().collect::<Vec<_>>());","typeGuard":null,"tryCatchPattern":"let resolved = merged.resolve(\"sample/model\")\n    .unwrap_or_else(|| panic!(\"resolve failed; merged keys: {:?}\", merged.entries.keys().collect::<Vec<_>>()));","preventionTips":["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"],"tags":["rust","test","merge","catalog"],"backgroundTag":"record-not-found","analyzedSha":"433685b2024e7bc4c99e1e2e326bcad39b4d9d65","analyzedAt":"2026-09-15T12:24:24.634Z","contentChangedAt":"2026-09-15T12:24:24.634Z","schemaVersion":2},"datasetVersion":"2026-09-22T11:17:16.035Z"}