{"record":{"id":"da4bf1d4ba2f002f","repo":"dbt-labs/dbt-core","slug":"manifest-path-config-missing-for-manifest-node-pac","errorCode":null,"errorMessage":"manifest path config missing for manifest node package","messagePattern":"manifest path config missing for manifest node package","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/dbt-schemas/src/schemas/manifest/manifest.rs","lineNumber":437,"sourceCode":"///\n/// Manifest `path` conformance is package-relative: dependency resources must be normalized\n/// using that dependency package's `model-paths`, `test-paths`, etc., not the root project's.\nfn path_config_for_package<'a>(\n    resolver_state: &'a ResolverState,\n    package_name: &str,\n) -> &'a ManifestPathConfig {\n    let root_config = resolver_state\n        .manifest_path_configs\n        .get(&resolver_state.root_project_name);\n    if package_name == resolver_state.root_project_name {\n        return root_config.expect(\"root manifest path config missing\");\n    }\n\n    resolver_state\n        .manifest_path_configs\n        .get(package_name)\n        .or(root_config)\n        .expect(\"manifest path config missing for manifest node package\")\n}\n\n/// True only for public models imported via a publication artifact (cross-project\n/// mesh), whose source files don't exist locally. Public models from a\n/// locally-parsed package (`local:` / `git:` / `registry:`) always have a\n/// `ManifestPathConfig` registered and must keep their real paths so dbt-core\n/// can locate the compiled output — matches mantle's behaviour.\nfn is_public_model_from_publication(resolver_state: &ResolverState, model: &ManifestModel) -> bool {\n    let package = &model.__common_attr__.package_name;\n    model.access == Some(Access::Public)\n        && &resolver_state.root_project_name != package\n        && !resolver_state.manifest_path_configs.contains_key(package)\n}\n\n/// dbt-core manifest conformance: `original_file_path` stays project-relative,\n/// while `path` is serialized relative to the configured resource root.\n///\n/// Used for resources with one obvious root list: models, snapshots, seeds,","sourceCodeStart":419,"sourceCodeEnd":455,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-schemas/src/schemas/manifest/manifest.rs#L419-L455","documentation":"The fallback branch of `path_config_for_package`: for a non-root package, the code looks up the package's own `ManifestPathConfig` and falls back to the root config; if both are missing it panics. Per the adjacent comment, only public models imported via a publication artifact (cross-project mesh) legitimately lack local files; locally-parsed packages (`local:`/`git:`/`registry:`) must always have a registered config, so a panic here signals either a genuinely missing package registration or an unhandled mesh-import node path.","triggerScenarios":"`build_disabled_map`/`DbtManifest` resolving a node from package `<pkg>` where neither `manifest_path_configs[pkg]` nor the root config exists — package not registered during resolution, typo'd/renamed package name on the node, or a mesh public-model path hitting the non-mesh branch.","commonSituations":"A node's `package_name` doesn't match any registered project (dependency not installed or renamed); incomplete resolver state after partial parsing; cross-project public model imports in a build that doesn't mark them as mesh imports.","solutions":["Verify the referenced package is installed/registered (dependencies.yml + dbt deps) and its name matches the node's package","Ensure the package's `ManifestPathConfig` is registered in `resolver_state.manifest_path_configs` during resolution","For cross-project mesh public models, confirm the node is recognized by the mesh-import path that tolerates missing local configs"],"exampleFix":"// before\n.expect(\"manifest path config missing for manifest node package\")\n// after\n.ok_or_else(|| fs_err!(ErrorCode::InvalidConfig, \"no manifest path config for package {}\", package_name))?","handlingStrategy":"fallback","validationCode":"// before resolution\nif !resolver_state.manifest_path_configs.contains_key(package_name)\n    && package_name != resolver_state.root_project_name {\n    return Err(format!(\"package {} not registered in resolver state\", package_name));\n}","typeGuard":"fn package_is_registered(state: &ResolverState, pkg: &str) -> bool {\n    pkg == state.root_project_name || state.manifest_path_configs.contains_key(pkg)\n}","tryCatchPattern":"let config = std::panic::catch_unwind(|| path_config_for_package(resolver_state, pkg))\n    .ok()\n    .and_then(|r| r.ok());","preventionTips":["Run dbt deps so every referenced package is installed and registered","Check package_name matches the project name in dbt_project.yml exactly (case-sensitive)","Handle mesh public-model nodes on the dedicated path that tolerates missing local configs"],"tags":["manifest","resolver","panic","packages"],"backgroundTag":"missing-config-value","analyzedSha":"0267ce9170576975b76b64ce856b2e5848e96617","analyzedAt":"2026-09-07T21:53:39.732Z","contentChangedAt":"2026-09-07T21:53:39.732Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}