원클릭으로
edg-validate
Validate an edg config file (YAML or DSL), interpret errors, and suggest fixes.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Validate an edg config file (YAML or DSL), interpret errors, and suggest fixes.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Generate or modify edg workload configurations (YAML or DSL) from a natural language description of the desired schema and workload.
Help compose edg expressions. Explain functions, debug syntax, and generate the right incantation for a given use case.
Convert an edg config between database drivers (e.g., pgx to mysql) or between formats (YAML to DSL, DSL to YAML).
| name | edg-validate |
| description | Validate an edg config file (YAML or DSL), interpret errors, and suggest fixes. |
| user-invocable | true |
You validate edg workload configurations (YAML or DSL) by running edg validate and interpreting the results.
Identify the config file. If the user specifies a path, use it. Otherwise, look for .yaml, .yml, or .edg files in the current directory or examples/ that look like an edg config. The format is detected by file extension: .edg → DSL, .yaml/.yml → YAML.
Identify the driver. If the user specifies a driver, use it. Otherwise, infer from the config content:
STRING type, gen_random_uuid(), string_to_array, unnest -> pgxCHAR(36), UUID(), JSON_TABLE -> mysqlUNIQUEIDENTIFIER, NEWID(), OPENJSON, NVARCHAR -> mssqlVARCHAR2, SYSTIMESTAMP, XMLTABLE, CONNECT BY, __values__( -> oracle__values__ (without parentheses) is cross-driver and doesn't help identify the driver{"create":, {"insert":, {"find":, {"drop": (JSON command syntax) -> mongodbCREATE KEYSPACE, KEYSPACE, fully-qualified ks.table names -> cassandrapgxRun validation:
edg validate --driver <driver> --config <path>
Interpret the output. If validation fails, explain what went wrong and suggest a fix. Common issues include:
ref_* call references a dataset that no init or seed query populatesquery when exec is needed, or vice versacount/size for batch types, or using batch args with non-batch typesexec_batch/query_batch or prepared: true inside a transaction, or an empty transaction with no queriesApply fixes. If the user asks, edit the config file to fix the issues and re-validate.
Suggest staging. After validation passes, suggest edg stage to preview generated data without a database:
edg stage --config <path> --format csv -o ./preview
This expands all sections (up, seed, deseed, down) to files. Useful for verifying data distributions, referential integrity, and column naming before running against a real database.
| Error pattern | Likely cause | Fix |
|---|---|---|
Unknown function foo | Typo or unsupported expression | Check spelling against the expressions reference |
Dataset x not found | Missing init query or name mismatch | Add an init query named x with type: query, or fix the dataset name |
| Expected exec, got query | SELECT used with type: exec | Change to type: query |
| Batch requires count | exec_batch without count field | Add count and size fields |
| Expression compile error | Invalid expr-lang syntax | Check for missing quotes, unmatched parens, or invalid operators |
| Cannot be a batch type inside a transaction | exec_batch/query_batch in transaction | Change to exec/query and move batching outside the transaction |
| Cannot use prepared statements inside a transaction | prepared: true in transaction | Remove prepared: true from queries inside the transaction |
| Must contain at least one query | Empty transaction | Add queries to the transaction or remove it |
| Worker is missing a name | Worker entry without name | Add a name field to the worker |
| Rate must have positive times and interval | Invalid rate value (zero/negative) | Use format times/interval e.g. 1/10s, 3/1m |
| Invalid rate format | Malformed rate string | Use times/interval format (e.g. 1/10s, 5/1m30s) |
| Must specify rate or delay, not both | Worker has both rate and delay | Remove one; use rate for recurring, delay for one-shot |
| Must specify either rate or delay | Worker has neither rate nor delay | Add rate: times/interval or delay: duration |
complete: model "X" returned no tool call (retrying) | LLM failed to return structured data after 3 retries | Use a model with better tool calling support (e.g. qwen3:8b over qwen2.5) or check the tool schema |
complete: property "X" should be Y, got Z | LLM returned wrong type (e.g. schema definition instead of value) | Model is echoing schema back; retry logic handles this automatically up to 3 times. If persistent, use a larger model |
complete API 4xx | LLM API returned an error | Check --complete-url, --complete-api-key, and that the model exists |
complete_array: expected N items, got M | LLM returned wrong number of items | Model ignored count instruction; retry logic handles this up to 3 times. Use a larger model if persistent |
complete_array: item N: property "X" should be Y, got Z | Element in array has wrong type | Same as complete validation but per-element. Check tool schema types match expected output |
context deadline exceeded | LLM request timed out (120s limit) | Model too slow or overloaded; reduce batch concurrency or use a faster model |
| stage "X" run_weights references unknown query | Stage-level run_weights key doesn't match any run item name | Fix the key name or add a matching run item |
| run item N is missing a name (required when run_weights is set) | Stage or top-level run_weights set but a run item has no name | Add a name field to every run item |
if without then | if block missing required then branch | Add a then branch with at least one query |
match without when | match block missing required when clauses | Add at least one when clause with eq and queries |
when without eq or queries | Incomplete when clause | Each when must have both eq (expression) and queries (list) |
if/match/noop/rollback with extra fields | Conditional entry has name, type, args, or query | Remove extra fields; conditional entries are standalone |
rollback outside transaction | - rollback used in standalone run item | Move inside a transaction or use - noop instead |
rollback_if outside transaction | rollback_if used in standalone run item | Move inside a transaction |
| Mutually exclusive fields | Entry combines if + match, if + rollback_if, etc. | Use only one special field per entry |
Standalone if/match with run_weights | Conditional blocks cannot be weighted | Remove conditionals from weighted sections or remove run_weights |
X requires a license | Feature (embeddings, completions, sync, scaffold, jobs, metrics) used without --license or EDG_LICENSE | Set --license flag or EDG_LICENSE env var with a valid pro license key |
license does not include pro entitlement | License key is valid but missing the pro entitlement | Upgrade license to include pro entitlement |
| DSL parse error at line N col M: expected X, got Y | Syntax error in .edg file | Check DSL syntax at the reported location - common issues: missing backticks around SQL, missing { after section keyword, unclosed parentheses |
| DSL parse error: unexpected "stages" | stages is not supported in DSL | Convert to YAML format to use stages |
| DSL parse error: unexpected "if" / "match" | Conditionals not supported in DSL | Convert to YAML format to use conditionals |
| DSL parse error: unknown query option "X" | Unrecognized option in query parentheses | Valid options: count, size, object, type, template, prepared, batch_format, ignore, request_timeout, workers, rollback_if, print, post_print, wait, rate, delay |