hasura/graphql-engine · error · NamedModelPermissionError

Error in model permission for model '{model_name}'{}: {error

Error message

Error in model permission for model '{model_name}'{}: {error}

What it means

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.

Source

Thrown at v3/crates/metadata-resolve/src/stages/model_permissions/error.rs:14

use crate::stages::models;
use crate::types::error::ContextualError;
use crate::types::subgraph::Qualified;
use crate::{helpers::typecheck, types::error::TypePredicateError};
use error_context::{Context, Step};
use jsonpath::JSONPath;
use open_dds::data_connector::DataConnectorName;
use open_dds::{
    models::ModelName, permissions::Role, query::ArgumentName, spanned::Spanned,
    types::CustomTypeName,
};

#[derive(Debug, thiserror::Error)]
#[error("Error in model permission for model '{model_name}'{}: {error}",
        match role { Some(role) => format!(" for role '{role}'"), None => String::new()}
)]
pub struct NamedModelPermissionError {
    pub model_name: Qualified<ModelName>,
    pub role: Option<Spanned<Role>>,
    pub error: ModelPermissionError,
}

#[derive(Debug, thiserror::Error)]
pub enum ModelPermissionError {
    #[error("preset argument '{argument_name}' is defined more than once")]
    DuplicateModelArgumentPreset {
        argument_name: Spanned<ArgumentName>,
    },

    #[error("model source is required for model '{model_name:}' to resolve predicate")]
    ModelSourceRequiredForPredicate {
        model_name: Spanned<Qualified<ModelName>>,

View on GitHub (pinned to 724551b9ae)

Solutions

  1. Read the trailing {error} detail — it names the specific ModelPermissionError variant to fix
  2. Use the reported model name and role to locate the permissions block in the model's OpenDD metadata file
  3. Fix the underlying cause (duplicate preset, bad predicate, unknown argument) and re-run metadata resolution / `ddn build`
Defensive patterns

Strategy: try-catch

Try / catch

// When invoking metadata resolution programmatically (Rust):
match resolve_metadata(metadata).await {
    Err(e) if e.is::<NamedModelPermissionError>() => {
        // e.model_name and e.role pinpoint the bad permissions block;
        // e.error is the specific ModelPermissionError to act on
        report_to_metadata_author(&e);
    }
    r => r,
}

Prevention

When it happens

Trigger: 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.

Common situations: Editing permission YAML by hand, adding role presets, writing filter expressions that reference wrong fields or types, upgrading metadata where permission semantics changed.

Related errors


AI-assisted analysis of hasura/graphql-engine@724551b9ae (2026-08-28). Data as JSON: /api/errors/c16d5dcdfc8b4072. Report an issue: GitHub.