{"record":{"id":"1a16401d6c996209","repo":"hasura/graphql-engine","slug":"model-source-is-required-for-model-model-name","errorCode":null,"errorMessage":"model source is required for model '{model_name:}' to resolve predicate","messagePattern":"model source is required for model '(.+?)' to resolve predicate","errorType":"validation","errorClass":"ModelPermissionError","httpStatus":null,"severity":"error","filePath":"v3/crates/metadata-resolve/src/stages/model_permissions/error.rs","lineNumber":30,"sourceCode":"\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>>,\n    },\n\n    #[error(\"preset argument '{argument_name}' value has a type error: {type_error}\")]\n    ModelArgumentValuePresetTypeError {\n        argument_name: Spanned<ArgumentName>,\n        value_path: JSONPath,\n        type_error: typecheck::TypecheckError,\n    },\n\n    #[error(\n        \"a preset argument '{argument_name}' has been set for the model '{model_name}' but no such argument exists for this model\"\n    )]\n    ModelArgumentPresetArgumentNotFound {\n        model_name: Spanned<Qualified<ModelName>>,\n        argument_name: Spanned<ArgumentName>,\n    },","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/hasura/graphql-engine/blob/724551b9ae87845594ef0408cff0e50eb6c90dc5/v3/crates/metadata-resolve/src/stages/model_permissions/error.rs#L12-L48","documentation":"ModelSourceRequiredForPredicate: a model permission uses a row-level filter predicate (e.g. a select `filter`), but the model has no source configured. Predicates compile against the model's data source, so a source-less model cannot support filter permissions.","triggerScenarios":"Adding a `filter` to a model permission in OpenDD metadata while the model has no `source` block (only a `command` or type binding without source configuration).","commonSituations":"Converting a command-based model to have permissions, removing a model source but leaving filters behind, or writing permissions for a model that was never bound to a data connector.","solutions":["Add a `source` to the model so the predicate can be resolved against the data connector","Or remove the `filter` from the permission if row filtering is not intended for this model","If a source exists, verify the model references it correctly (source configuration is on the model, not the type)"],"exampleFix":"# before\nkind: Model\nversion: v1\ndefinition:\n  name: users\n  # no source\npermissions:\n  - role: user\n    select:\n      filter: { id: { eq: X-Hasura-User-Id } }\n\n# after\nkind: Model\nversion: v1\ndefinition:\n  name: users\n  source:\n    dataConnectorName: pg\n    collection: users\npermissions:\n  - role: user\n    select:\n      filter: { id: { eq: X-Hasura-User-Id } }","handlingStrategy":"validation","validationCode":"for model in models:\n    perms = model.get('permissions', [])\n    has_filter = any('filter' in list(p.values())[0] for p in perms if p.values())\n    assert not has_filter or 'source' in model['definition'], \\\n        f\"model {model['definition']['name']} has filter permission but no source\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only add row-level filters to models bound to a data connector source","Keep a lint rule: permission filters require model.source"],"tags":["hasura","ddn","permissions","model-source","predicate"],"backgroundTag":"model-source-required","analyzedSha":"724551b9ae87845594ef0408cff0e50eb6c90dc5","analyzedAt":"2026-08-28T07:32:55.105Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}