{"record":{"id":"c16d5dcdfc8b4072","repo":"hasura/graphql-engine","slug":"error-in-model-permission-for-model-model-name","errorCode":null,"errorMessage":"Error in model permission for model '{model_name}'{}: {error}","messagePattern":"Error in model permission for model '(.+?)'(.+?): (.+?)","errorType":"validation","errorClass":"NamedModelPermissionError","httpStatus":null,"severity":"error","filePath":"v3/crates/metadata-resolve/src/stages/model_permissions/error.rs","lineNumber":14,"sourceCode":"use crate::stages::models;\nuse crate::types::error::ContextualError;\nuse crate::types::subgraph::Qualified;\nuse crate::{helpers::typecheck, types::error::TypePredicateError};\nuse error_context::{Context, Step};\nuse jsonpath::JSONPath;\nuse open_dds::data_connector::DataConnectorName;\nuse open_dds::{\n    models::ModelName, permissions::Role, query::ArgumentName, spanned::Spanned,\n    types::CustomTypeName,\n};\n\n#[derive(Debug, thiserror::Error)]\n#[error(\"Error in model permission for model '{model_name}'{}: {error}\",\n        match role { Some(role) => format!(\" for role '{role}'\"), None => String::new()}\n)]\npub struct NamedModelPermissionError {\n    pub model_name: Qualified<ModelName>,\n    pub role: Option<Spanned<Role>>,\n    pub error: ModelPermissionError,\n}\n\n#[derive(Debug, thiserror::Error)]\npub enum ModelPermissionError {\n    #[error(\"preset argument '{argument_name}' is defined more than once\")]\n    DuplicateModelArgumentPreset {\n        argument_name: Spanned<ArgumentName>,\n    },\n\n    #[error(\"model source is required for model '{model_name:}' to resolve predicate\")]\n    ModelSourceRequiredForPredicate {\n        model_name: Spanned<Qualified<ModelName>>,","sourceCodeStart":1,"sourceCodeEnd":32,"githubUrl":"https://github.com/hasura/graphql-engine/blob/724551b9ae87845594ef0408cff0e50eb6c90dc5/v3/crates/metadata-resolve/src/stages/model_permissions/error.rs#L1-L32","documentation":"Wrapper error from the model_permissions resolution stage: any error while resolving a model's permission block (predicate, preset, filter, etc.) is reported through NamedModelPermissionError, prefixed with the model name and optionally the role. The inner ModelPermissionError carries the actual cause; the error context points at the relevant metadata span.","triggerScenarios":"Any invalid entry in a model's `permissions` section in OpenDD metadata: bad filter predicate, failing preset value type, unknown role argument, etc., during metadata resolve/build.","commonSituations":"Editing permission YAML by hand, adding role presets, writing filter expressions that reference wrong fields or types, upgrading metadata where permission semantics changed.","solutions":["Read the trailing {error} detail — it names the specific ModelPermissionError variant to fix","Use the reported model name and role to locate the permissions block in the model's OpenDD metadata file","Fix the underlying cause (duplicate preset, bad predicate, unknown argument) and re-run metadata resolution / `ddn build`"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// When invoking metadata resolution programmatically (Rust):\nmatch resolve_metadata(metadata).await {\n    Err(e) if e.is::<NamedModelPermissionError>() => {\n        // e.model_name and e.role pinpoint the bad permissions block;\n        // e.error is the specific ModelPermissionError to act on\n        report_to_metadata_author(&e);\n    }\n    r => r,\n}","preventionTips":["Run `ddn build` locally before committing metadata changes","Keep permissions minimal and add them incrementally so failures are isolated"],"tags":["hasura","ddn","permissions","metadata","model"],"backgroundTag":"metadata-permission-resolution-failed","analyzedSha":"724551b9ae87845594ef0408cff0e50eb6c90dc5","analyzedAt":"2026-08-28T07:32:55.105Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}