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
- 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`
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
- Run `ddn build` locally before committing metadata changes
- Keep permissions minimal and add them incrementally so failures are isolated
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
- creating metadata file %s failed: %w
- Unknown type: {type_name}
- model '{0}'
- command '{0}'
- argument {argument_name:?} has an issue: {issue:?}
AI-assisted analysis of hasura/graphql-engine@724551b9ae (2026-08-28).
Data as JSON: /api/errors/c16d5dcdfc8b4072.
Report an issue: GitHub.