ErrLookup › nexu-io/open-design
nexu-io/open-design
🎨 The open-source Claude Design alternative. 🖥️ Local-first desktop app. 🖼️ Your coding agent becomes the design engine: prototypes, landing pages, dashboards, slides, images & video — real files, HTML/PDF/PPTX/MP4 export. 🤖 Claude Code / Codex / Cursor / Gemini / OpenCode / Qwen & 20+ CLIs via BYOK. · TypeScript · 1,981 source files
Analyzed at 5be4028344 on 2026-08-12. 540 documented errors.
| Code / Message | Type | Severity | Tags |
|---|---|---|---|
| invalid JSON in ${filePath}: ${message} | validation | error | cli, json, artifacts, validation, input-parsing |
| ${filePath} must contain a JSON object | validation | error | cli, json, artifacts, validation, input-parsing |
ARTIFACT_MANIFEST_INVALID invalid artifactManifest: ${message} | error_code | error | artifacts, manifest, validation, api, daemon |
ARTIFACT_MANIFEST_REQUIRED artifactManifest is required for ${name}; no safe default manifest can be inferr | error_code | error | artifacts, manifest, validation, api, daemon |
ARTIFACT_PUBLICATION_BLOCKED Artifact still contains unresolved pitch-deck placeholders: ${list}. Provide the | error_code | error | artifacts, publication-guard, pitch-deck, validation, daemon |
| sourceKind must be one of upload, url, repo, connector, arti | validation | error | automation, ingestion, validation, api, daemon |
| ingestion body is required | validation | error | automation, ingestion, validation, api, daemon |
| bodyMarkdown is required | validation | error | automation, ingestion, validation, api, daemon |
| proposal body is required | validation | error | automation, proposals, validation, api, daemon |
| proposal title is required | validation | error | automation, proposals, validation, api, daemon |
| proposal summary is required | validation | error | automation, proposals, validation, api, daemon |
| proposal patch is required | validation | error | automation, proposals, validation, api, daemon |
| proposal ${proposal.id} is ${proposal.status}, not reviewabl | exception | error | automation, proposals, state-machine, validation, daemon |
| proposal patch.after is not valid JSON | validation | error | automation, proposals, json, validation, daemon |
| delete proposal requires targetRef | validation | error | automation, proposals, memory, validation, daemon |
| proposal patch.after markdown is required | validation | error | automation, proposals, design-system, skill, validation, daemon |
| automation-template delete proposals are not supported yet | exception | error | automation, proposals, automation-template, not-implemented, daemon |
| automation proposal not found | exception | error | automation, proposals, not-found, concurrency, daemon |
| automation template ${key} is required | validation | error | automation, validation, daemon, templates |
| automation template must be an object | validation | error | automation, validation, templates |
| automation template id must be a safe slug | validation | error | automation, validation, slug, templates |
| automation template requires at least one valid stage | validation | error | automation, validation, templates, stages |
| cannot overwrite built-in automation template ${template.id} | validation | error | automation, conflict, built-in, templates |
WORKSPACE_AUTHORITY_UNAVAILABLE workspace membership authority is not configured | error_code | warning | workspace, auth, config, automation, retryable |
WORKSPACE_ACCESS_DENIED the automation Workspace is no longer writable by this member | error_code | error | workspace, authz, permission, automation |
WORKSPACE_PROJECT_PERMISSION_DENIED the reused project Workspace is no longer writable by this member | error_code | error | workspace, authz, project, permission |
| Could not fetch ${url} — the site may block server-side requ | exception | error | brands, network, scraping, deterministic-build |
| Enter a valid http(s) website URL. | validation | warning | brands, validation, url, user-input |
| brand not found: ${opts.id} | exception | error | brands, not-found, lifecycle |
| brand backing project not found: ${projectId} | exception | error | brands, data-integrity, not-found, database |
| brand not found: ${id} | exception | error | brands, not-found, finalize |
| brand.json not found in the extraction project — the agent h | exception | error | brands, agent, lifecycle, finalize |
| brand.json is not valid JSON. | exception | error | brands, validation, json, agent, finalize |
| brand.json failed validation: ${errorMessage(err)} | exception | error | brands, validation, schema, finalize |
| invalid brand id: ${input.brandId} | exception | error | brands, validation, path-traversal, security |
| invalid design system id: ${designSystemId} | exception | error | design-system, validation, path-traversal, security, brands |
| invalid brand id: ${brandId} | exception | error | brand, validation, path-traversal, id-validation |
| invalid brand asset url: ${String(url)} | exception | error | ssrf, url-validation, brand, network, safe-fetch |
| unsupported brand asset protocol: ${parsed.protocol} | exception | error | ssrf, url-validation, brand, protocol, safe-fetch |
| blocked non-public brand asset host: ${host} | exception | error | ssrf, network, security, brand, safe-fetch, metadata |
| brand asset host resolves to a non-public address: ${host} - | exception | error | ssrf, dns, rebinding, security, brand, safe-fetch |
| too many brand asset redirects (> ${MAX_BRAND_REDIRECTS}) | exception | warning | network, redirect, brand, safe-fetch, ssrf |
| invalid brand id: ${id} | exception | error | brand, id-validation, filesystem, validation |
| invalid brand id: ${id} | exception | error | brand, id-validation, design-system, filesystem |
| brand.json not found for brand "${id}" | exception | error | brand, design-system, lifecycle, filesystem, state |
| brand is not a JSON object | exception | error | brand, validation, schema, llm-output |
| brand: missing required `name` | exception | error | brand, validation, schema, required-field, llm-output |
| brand: `colors` must include at least the background, foregr | exception | error | brand, validation, schema, colors, required-field, llm-output |
| unknown flag: --${key}. Run with --help for the list of acce | exception | error | cli, argument-parsing, flag-validation, automation |
| flag --${key} requires a value | exception | error | cli, argument-parsing, flag-validation |
| --schedule is required. Forms: hourly:<minute> | daily:HH:MM | exception | error | cli, automation, schedule, argument-parsing, validation |
| --schedule hourly requires :<minute>, 0-59 | exception | error | cli, automation, schedule, argument-parsing, validation |
| --schedule ${kind} requires :HH:MM[:TZ] | exception | error | cli, automation, schedule, argument-parsing, validation |
| --schedule ${kind} time must be HH:MM (24h) | exception | error | cli, validation, automation, schedule, flag-parsing |
| --schedule weekly requires :DAY:HH:MM[:TZ] (DAY is 0-6 or su | exception | error | cli, validation, automation, schedule, flag-parsing |
| --schedule weekly day must be 0-6 or sun..sat (got "${parts[ | exception | error | cli, validation, automation, schedule, flag-parsing |
| --schedule weekly time must be HH:MM (24h) | exception | error | cli, validation, automation, schedule, flag-parsing |
| --schedule kind must be hourly|daily|weekdays|weekly (got "$ | exception | error | cli, validation, automation, schedule, flag-parsing |
| --target reuse needs --project <id> | exception | error | cli, validation, automation, flag-parsing |
| --target reuse=<projectId> needs a non-empty id | exception | error | cli, validation, automation, flag-parsing |
| --target must be "new-project" or "reuse=<projectId>" (got " | exception | error | cli, validation, automation, flag-parsing |
| codex mcp add failed: ${failureDetail(result)} | exception | error | codex, mcp, cli, integration, spawn |
| codex mcp remove failed: ${failureDetail(result)} | exception | error | codex, mcp, cli, integration, spawn |
| workspaceId is required | exception | error | workspace, validation, collab, state |
| authorized pull receipt has invalid ${key} | exception | error | collab, vela, receipt, validation, team-projects |
| authorized pull response is not valid JSON | exception | error | collab, vela, receipt, json, team-projects |
| authorized pull response must be an object | exception | error | collab, vela, receipt, json, validation, team-projects |
AUTHORIZED_TEAM_PROJECT_PULL_RECEIPT_EXPIRED authorized pull receipt is stale | exception | error | collab, vela, receipt, security, expiry, team-projects, retryable |
WORKSPACE_PROJECT_PERMISSION_DENIED workspace project creation is not allowed | exception | error | workspace, collab, permissions, authorization, project-creation |
| Project ${projectId} not found | exception | error | project, validation, collab, share |
| authoritative Team resource listing is unavailable | exception | warning | collab, team-resources, vela, configuration, authoritative-read |
| workspace_resource_share_denied | exception | error | collab, team-resources, permissions, authorization, share |
WORKSPACE_RESOURCE_AUTHORITY_UNAVAILABLE team resource authority is temporarily unavailable | exception | warning | network, collab, retryable, team-resources, vela |
invalid_generation invalid_generation | exception | error | billing, validation, protocol, typescript |
stale_generation stale_generation | exception | warning | billing, concurrency, optimistic-locking, retry |
interest_capacity_exceeded interest_capacity_exceeded | exception | warning | billing, capacity, validation |
generation_payload_mismatch generation_payload_mismatch | exception | error | billing, concurrency, protocol, data-integrity |
| petshare list page ${page} failed: ${resp.status} ${resp.sta | exception | warning | network, external-api, community-pets, transient, supabase |
| hatchery list failed: ${resp.status} ${resp.statusText} | exception | warning | network, external-api, community-pets, transient |
| download ${url} failed: ${resp.status} ${resp.statusText} | exception | warning | network, external-api, community-pets, download, transient |
| ${task.folder}: spritesheet too small (${bytes.length} bytes | exception | warning | community-pets, validation, data-integrity, download |
| ${task.folder}: spritesheet is not webp/png/gif | exception | warning | community-pets, validation, data-integrity, file-format |
CONNECTOR_EXECUTION_FAILED Composio OAuth state is missing or expired | exception | error | oauth, connectors, composio, authentication, state-management |
CONNECTOR_OUTPUT_TOO_LARGE connector output exceeds max serialized size | exception | error | connector, output, size-limit, composio, payload |
CONNECTOR_NOT_FOUND connector not found | exception | error | connector, not-found, catalog, lookup, composio |
CONNECTOR_EXECUTION_FAILED callbackUrl is required for Composio connectors | exception | error | connector, composio, oauth, callback, connect |
CONNECTOR_DISABLED connector is disabled | exception | error | connector, disabled, connect, catalog, authorization |
CONNECTOR_NOT_CONNECTED connector is not connected | exception | error | connector, auth, http-403, composio |
CONNECTOR_TOOL_NOT_FOUND connector tool is not allowed | exception | error | connector, validation, http-404, catalog |
CONNECTOR_SAFETY_DENIED connector tool is not auto-approved read-only by current safety policy | http | error | connector, safety, permissions, http-403 |
CONNECTOR_RATE_LIMITED connector tool run call limit exceeded | http | warning | connector, rate-limit, http-429, agent-loop |
| OD_CRITIQUE_SCORE_THRESHOLD (${scoreThreshold}) must be <= O | validation | error | critique, config, env-vars, range-error, boot |
| ${key} must be a positive integer, got "${raw}" | validation | error | critique, config, env-vars, range-error, boot |
| ${key} must be a non-negative finite number, got "${raw}" | validation | error | critique, config, env-vars, range-error, boot |
| OD_CRITIQUE_FALLBACK_POLICY must be one of ${FALLBACK_POLICI | validation | error | critique, config, env-vars, range-error, boot |
| ${RESOURCE_ROOT_ENV} must be under the workspace root or app | exception | error | daemon, paths, security, env-vars, path-traversal |
| OD_DATA_DIR is required when OD_SANDBOX_MODE is enabled | exception | critical | daemon, paths, sandbox, env-vars, boot |
| OD_DATA_DIR "${resolved}" is not writable: ${e.message} Curr | exception | critical | daemon, paths, permissions, filesystem, boot |
| comment note required | validation | error | db, comments, validation, data-integrity |
| invalid comment status | validation | error | db, comments, validation, enum |
| slide ${index + 1} has no file path | validation | error | deck-export, desktop, renderer, validation |
| slide ${index + 1} is not a base64 PNG/JPEG data URL | validation | error | deck-export, desktop, renderer, validation, base64 |
| no slides to export | validation | error | deck-export, validation, renderer, pptx |
| Cloudflare API token is required. | http | error | deploy, cloudflare, validation, config, credentials |
| Only HTML files can be deployed. | http | error | deploy, validation, html, file-path |
| Could not deploy referenced files (${parts.join('; ')}). | http | error | deploy, validation, assets, references |
| Vercel token is required. | http | error | deploy, vercel, validation, credentials |
| Cloudflare account ID is required. | http | error | deploy, cloudflare, validation, account-id |
| Cloudflare zone is required for a custom domain. | http | error | deploy, cloudflare, validation, custom-domain, zone |
| Select a valid Cloudflare domain for the custom domain. | http | error | deploy, cloudflare, validation, custom-domain, zone |
| Enter a valid subdomain prefix, for example "demo". | http | error | deploy, cloudflare, validation, custom-domain, dns |
cloudflare_zone_mismatch Cloudflare zone selection no longer matches the selected domain. | http | error | deploy, cloudflare, custom-domain, zone, stale-state |
cloudflare_zone_inactive Cloudflare custom domains require an active zone. | http | error | deploy, cloudflare, custom-domain, zone, dns |
cloudflare_zone_not_full Cloudflare custom domains require a full DNS zone. | http | error | deploy, cloudflare, custom-domain, zone, dns |
| Cloudflare Pages project name could not be generated. | http | error | deploy, cloudflare, validation, project-name, custom-domain |
| Cloudflare Pages assets must be ${formatMib(CLOUDFLARE_PAGES | http | error | cloudflare, deploy, assets, size-limit |
| Cloudflare reported an unknown asset hash: ${hash} | http | error | cloudflare, deploy, upstream, retry |
| Cloudflare returned a non-JSON response. | http | error | cloudflare, deploy, network, upstream |
| Vercel returned a non-JSON response. | http | error | vercel, deploy, network, upstream |
| Revision feedback is required | validation | error | design-systems, revision, validation |
| Editable design system not found | exception | error | design-systems, revision, storage |
| Could not create revision | exception | error | design-systems, revision, storage, race |
| Could not create token contract revision | exception | error | design-systems, token-contract, revision, storage, race |
BAD_REQUEST repository contains symbolic links, which are not allowed | validation | error | design-systems, github-import, security, symlink |
BAD_REQUEST local project path must be a directory | validation | error | design-systems, local-import, validation |
INTERNAL_ERROR could not allocate design system id | exception | error | design-systems, import, filesystem |
BAD_REQUEST shadcn reference did not resolve to a usable registry item (no name, cssVars, or | validation | error | design-systems, shadcn, validation |
| design system backing project is unavailable | exception | error | team, design-system, workspace, share, project, authorization |
| design system backing project belongs to another workspace | exception | error | team, design-system, workspace, share, authorization, data-integrity |
| workspace_resource_share_denied | exception | error | team, design-system, workspace, share, authorization, forbidden |
| design system backing project publish failed | exception | error | team, design-system, workspace, share, publish, vela |
WORKSPACE_RESOURCE_AUTHORITY_UNAVAILABLE team resource authority is temporarily unavailable | exception | error | team, design-system, workspace, share, retryable, authority, vela |
| zip contains too many files | validation | error | zip, claude-design, size-limit, import, zip-bomb |
| zip file too large: ${relPath} | validation | error | zip, claude-design, size-limit, import, zip-bomb |
| zip entry size mismatch: ${relPath} | validation | error | zip, claude-design, validation, data-integrity, import |
| zip is too large | validation | error | zip, claude-design, size-limit, import, zip-bomb |
| zip contains no files | validation | error | zip, claude-design, validation, import |
| zip does not contain an HTML file | validation | error | zip, claude-design, validation, html, import |
| invalid zip central directory | validation | error | zip, claude-design, validation, data-integrity, import |
| invalid zip central directory entry | validation | error | zip, parsing, validation, import, claude-design |
| encrypted zip entries are not supported | validation | error | zip, encryption, security, import, claude-design |
| unsupported zip compression method: ${method} | validation | error | zip, compression, deflate, import, claude-design |
| invalid zip: missing central directory | validation | error | zip, parsing, eocd, import, claude-design |
| invalid zip local header: ${entry.name} | validation | error | zip, parsing, local-header, import, claude-design |
| zip entry exceeds archive: ${entry.name} | validation | error | zip, truncation, validation, import, claude-design |
| invalid zip file name | validation | error | zip, security, path-traversal, null-byte, import |
| absolute zip paths are not allowed | validation | error | zip, security, path-traversal, absolute-path, import |
| path escapes project dir | validation | error | zip, security, path-traversal, symlink, import |
| project not found: ${projectId} | exception | error | finalize, project, not-found, validation |
CONFLICT finalize is already in progress for project ${projectId} | exception | error | finalize, concurrency, lockfile, conflict |
UPSTREAM_UNAVAILABLE upstream ${protocol} network error: ${message} | http | error | finalize, network, upstream, provider, dns, connection |
EMPTY_TRANSCRIPT conversation ${options.conversationId} has no messages to hand off | http | error | handoff, transcript, empty, validation, conversation |
| --deck cannot be combined with --page or --no-deck | validation | error | cli, validation, export, argument-conflict |
| --page/--no-deck is not valid with --format pptx | validation | error | cli, validation, export, argument-conflict, pptx |
FIGMA_IMPORT_FAILED unexpected prelude "${prelude}" | http | error | figma, import, file-format, binary, validation |
| aihubmix image (gemini) ${resp.status}: ${text.slice(0, 240) | exception | error | aihubmix, byok, gemini, image-generation, network, upstream |
| aihubmix gemini image response had no inline image data: ${J | exception | error | aihubmix, byok, gemini, image-generation, safety-filter, response-parse |
| collab cloud is not configured (OD_COLLAB_CLOUD_URL is unset | exception | error | config, integration, env, collab-cloud |
| collab cloud error ${status} (${code}) | exception | error | network, integration, http, collab-cloud |
| no ElevenLabs API key - configure it in Settings or set OD_E | exception | error | config, integration, credentials, elevenlabs |
| elevenlabs voices ${resp.status}: ${errText.slice(0, 240)} | exception | error | network, integration, http, elevenlabs |
| Unsupported protocol: ${protocol} | validation | error | validation, integration, protocol, provider-models |
| workspace balance response is invalid for ${requestedWorkspa | exception | error | integration, parsing, billing, vela |
billing_workspace_snapshot_unsupported workspace billing snapshot unsupported | exception | warning | billing, integration, version-compat, vela |
| vela login already running | exception | error | concurrency, login, integration, vela |
| vela login failed to start: ${result.error.message} | exception | error | login, integration, spawn, vela |
| vela login exited before authentication completed (code ${re | exception | error | login, integration, spawn, vela |
| vela login exited before device authorization started (code | exception | error | login, integration, spawn, vela |
| vela login attempt is no longer active | exception | warning | concurrency, login, integration, vela |
| vela binary not found; install vela or configure VELA_BIN | exception | critical | config, integration, binary, vela |
| failed to spawn vela login | exception | error | login, integration, spawn, system-resources, vela |
| xAI OAuth state not found or expired | exception | error | oauth, integration, auth, xai |
| xAI OAuth state mismatch: expected serverId=${XAI_PROVIDER_I | exception | error | oauth, integration, auth, validation, xai |
| registerLibraryAsset requires bytes, text, or absPath | validation | error | validation, library, api-contract |
| connector refresh source requires connector metadata | validation | error | validation, live-artifacts, data-integrity, connector |
| connector refresh output must be a JSON object | validation | error | connector, live-artifacts, refresh, json-schema |
| refresh source ${source.type} is not supported yet | exception | error | live-artifacts, refresh, source-type, not-implemented |
| No refresh source is available yet. | exception | warning | live-artifacts, refresh, unavailable, source-type |
| Refresh is disabled for this artifact source. | exception | warning | live-artifacts, refresh, permissions, consent |
| ${firstIssue.path}: ${firstIssue.message} | validation | error | live-artifacts, refresh, bounded-json, json-validation |
| ${field} must be a dot-separated JSON path | validation | error | live-artifacts, output-mapping, json-path, validation |
| ${field} contains unsupported JSON path segment: ${segment} | validation | error | live-artifacts, output-mapping, json-path, prototype-pollution, security |
| outputMapping.dataPaths.from array segment is invalid: ${seg | validation | error | live-artifacts, output-mapping, json-path, array |
| outputMapping.dataPaths.to array segments must be non-negati | validation | error | live-artifacts, output-mapping, json-path, array |
| ${field} must be a string | validation | error | live-artifacts, refresh, input-validation, typescript |
| ${field} must be a positive integer | validation | error | live-artifacts, refresh, input-validation |
| project_files.read_json requires input.path | validation | error | live-artifacts, project-files, input-validation |
| project_files.read_json only supports .json files | validation | error | live-artifacts, project-files, file-extension |
| project_files.read_json does not follow symlinks | validation | error | live-artifacts, project-files, symlink, security |
| project_files.read_json path escapes project dir | validation | critical | live-artifacts, project-files, path-traversal, security |
| project_files.read_json path must be a file | validation | error | live-artifacts, project-files, filesystem |
| project_files.read_json file exceeds 256KB | validation | error | live-artifacts, project-files, size-limit |
| project_files.read_json could not parse JSON at ${filePath} | exception | error | live-artifacts, project-files, json-parse |
| git command failed | exception | error | live-artifacts, git, refresh, subprocess |
| public_github_repository_metric requires input.url | validation | error | live-artifacts, github, input-validation |
| public_github_repository_metric input.url must be a valid UR | validation | error | validation, url-parsing, live-artifacts, github-api |
| public_github_repository_metric only supports https://api.gi | validation | error | validation, ssrf, allow-list, github-api, live-artifacts |
| public_github_repository_metric only supports /repos/{owner} | validation | error | validation, path-routing, github-api, live-artifacts |
| input.fields must be an array of strings | validation | error | validation, type-check, github-api, live-artifacts |
| public_github_repository_metric request failed with ${respon | exception | error | network, http-status, rate-limit, github-api, live-artifacts |
| unsupported local_file refresh tool: ${toolName} | validation | error | validation, routing, live-artifacts, refresh-source |
| local daemon refresh sources require source.type daemon_tool | validation | error | validation, routing, live-artifacts, refresh-source |
| unsupported local daemon refresh tool: ${options.source.tool | validation | error | validation, routing, live-artifacts, refresh-source |
| script elements are not supported in live artifact previews | validation | error | security, xss, html-template, live-artifacts, validation |
| iframe elements are not supported in live artifact previews | validation | error | security, xss, html-template, live-artifacts, validation |
| srcdoc attributes are not supported in live artifact preview | validation | error | security, xss, html-attribute, live-artifacts, validation |
| event handler attributes are not supported in live artifact | validation | error | security, xss, html-attribute, event-handler, live-artifacts, validation |
| javascript: URLs are not supported in live artifact previews | validation | error | security, xss, url-scheme, live-artifacts, validation |
| raw HTML insertion directives are not supported | validation | error | security, xss, html-directive, live-artifacts, validation |
| invalid array segment in template binding path: ${rawPath} | validation | error | template-binding, path-resolution, live-artifacts, validation |
| unsupported template binding path: ${rawPath} | validation | error | template-binding, path-resolution, live-artifacts, validation |
| template binding must resolve to a scalar: ${binding} | validation | error | template-binding, type-check, live-artifacts, validation |
| invalid template binding path: ${binding} | validation | error | template-binding, path-resolution, regex, live-artifacts, validation |
| unterminated tag in live artifact template | validation | error | live-artifacts, html-template, template-rendering, validation |
| unbalanced data-od-repeat element <${tagName}> | validation | error | live-artifacts, html-template, template-rendering, validation |
| invalid data-od-repeat directive: "${directive.spec}" (expec | validation | error | live-artifacts, html-template, template-rendering, validation, directive |
| nested data-od-repeat is not supported | validation | error | live-artifacts, html-template, template-rendering, directive, unsupported-feature |
| raw template interpolation is not supported | validation | error | live-artifacts, html-template, security, xss, validation |
| data-od-repeat source is not an array: ${arrayPath} | validation | error | live-artifacts, html-template, template-rendering, validation, data-binding |
| invalid live artifact id | validation | error | live-artifacts, storage, validation, filesystem-safety, path-escape |
| invalid live artifact refresh id | validation | error | live-artifacts, refresh, validation, id-format |
| live artifact refresh already active | exception | error | live-artifacts, refresh, concurrency, locking, filesystem |
| live artifact refresh is older than the latest committed ref | exception | error | live-artifacts, refresh, concurrency, ordering, stale-state |
| existing config at ${where} is not valid JSON: ${err instanc | validation | error | mcp, agent-install, json, config, validation |
| existing config at ${where} is not a JSON object | validation | error | mcp, agent-install, json, config, validation, schema |
| The MCP Apps bridge is unavailable. | exception | error | mcp-apps, brief, browser, bridge, host-capability |
| The host cannot publish the confirmed brief. | exception | error | mcp-apps, brief, browser, bridge, host-capability, publish |
| The host returned an invalid confirmation. | exception | error | mcp-apps, brief, browser, validation, confirmation, host-capability |
| The registered Open Design runtime is unavailable and cannot | exception | error | mcp, bootstrap, daemon, environment, launch |
| Open Design was launched headlessly but its daemon did not b | exception | error | mcp, bootstrap, daemon, timeout, launch, native-modules |
| pluginWorkflowId requires a validated externalPluginContext | validation | error | mcp, brief, plugin, validation, contract |
| The Open Design brief has expired or is unknown. Call collec | validation | warning | mcp, brief, session-state, ttl |
| The Open Design brief nonce is invalid. | validation | warning | mcp, brief, nonce, auth |
| The Open Design brief is incomplete. Missing: ${missing.join | validation | warning | mcp, brief, validation |
| This Open Design brief was already confirmed with different | validation | warning | mcp, brief, idempotency, state |
| artifactType must be one of: ${Object.keys(openDesignBriefCa | validation | warning | mcp, brief, validation, enum |
| projectTitle must be at most 256 characters | validation | warning | mcp, brief, validation |
| ${field} must be a non-empty string | validation | warning | mcp, brief, validation |
| ${field} must be an object | validation | warning | mcp, brief, validation |
| unknown MCP tool: ${name} | exception | error | mcp, dispatch, routing |
| dynamic client registration failed: HTTP ${res.status} ${res | exception | error | oauth, dcr, network |
| dynamic client registration response missing client_id | exception | error | oauth, dcr, protocol |
| auth server ${authServer.issuer} does not advertise a regist | exception | error | oauth, dcr, config |
| token endpoint rejected request: HTTP ${res.status} ${res.st | exception | error | oauth, token, network |
| token endpoint response missing access_token | exception | error | oauth, token, protocol |
| could not discover OAuth metadata for ${issuer} | exception | error | oauth, discovery, network |
| unsupported resource URI: ${uri} | exception | warning | mcp, resource, uri |
| ${name} is required (string). | validation | warning | mcp, validation |
| confirm_brief requires the same local MCP session that creat | exception | error | mcp, brief, session, wiring |
REFRESH_LOCKED live artifact refresh lock ownership mismatch | http | error | live-artifacts, locking, concurrency |
| raw API keys are not accepted by Open Design MCP. Configure | validation | error | mcp, security, byok, credentials |
| resume must be a boolean | validation | error | mcp, validation, input-coercion, runs |
| inputs must be an object | validation | error | mcp, validation, plugins, input-coercion |
| artifactManifest must be an object | validation | error | mcp, validation, artifacts, input-coercion |
| project arg omitted and active context lookup failed: ${erro | exception | error | mcp, network, daemon, project-resolution |
| project arg omitted and Open Design has no active project. T | exception | warning | mcp, project-resolution, active-context, session |
| project is required (string). | validation | error | mcp, project-resolution, invariant, validation |
| no projects on this daemon | exception | warning | mcp, project-resolution, state, setup |
| multiple projects match "${arg}": ${opts}. Pass the UUID ins | exception | warning | mcp, project-resolution, ambiguity |
| no project matches "${arg}" | exception | warning | mcp, project-resolution, not-found |
| daemon ${resp.status} on ${url}: ${body || resp.statusText} | http | error | mcp, network, http, daemon |
| file ${relPath} (${size} bytes) exceeds remaining budget | exception | warning | mcp, files, budget, performance |
| file ${relPath} (${contentBytes} bytes) exceeds remaining bu | exception | warning | mcp, files, budget, performance |
| --image path "${rel}" resolves outside the project directory | validation | error | media, security, path-traversal, validation |
| --image not found: ${rel} | validation | error | media, files, not-found, validation |
| --image is not a regular file: ${rel} | validation | error | media, files, validation |
| --image too large (${info.size} bytes; max ${MAX_IMAGE_BYTES | validation | warning | media, validation, size-limit, performance |
| --image has unsupported extension "${ext}". Use png, jpg, jp | validation | error | media, validation, unsupported-format |
| unsupported surface: ${surface} | validation | error | media, validation, surface, input-coercion |
| model required | validation | error | media, validation, required-field, model |
| unsupported audioKind: ${audioKind}. Allowed: music | speech | validation | error | validation, media, audio, argument-validation |
| unknown model: ${model}. Pass --model from the registered li | validation | error | validation, media, model-resolution, catalog |
| model "${model}" is not registered for surface "${where}". A | validation | error | validation, media, cross-surface, catalog |
| no OpenAI credential - configure an API key in Settings or s | exception | error | media, provider-config, openai, credentials, image |
| ${tag} ${resp.status}: ${truncate(text, 240)} | http | error | network, media, openai, azure, http-status, upstream |
| openai non-JSON response: ${truncate(text, 200)} | exception | error | network, media, openai, response-shape, proxy |
| openai response had no data[0] | exception | error | network, media, openai, response-shape, azure |
| openai image fetch ${imgResp.status} | http | error | network, media, openai, secondary-fetch, cdn |
| openai response had neither b64_json nor url | exception | error | network, media, openai, response-shape, moderation |
| no ImageRouter API key — configure it in Settings or set OD_ | exception | error | media, provider-config, imagerouter, credentials, image |
| Custom Image API base URL required — configure an OpenAI-com | validation | error | media, provider-config, custom-image, configuration |
| Custom Image API model required — configure the provider mod | validation | error | media, provider-config, custom-image, configuration, model-resolution |
| ${providerTag} ${resp.status}: ${truncate(text, 240)} | http | error | network, media, openai-compatible, http-status, upstream, imagerouter |
| ${providerTag} non-JSON response: ${truncate(text, 200)} | exception | error | network, media, openai-compatible, response-shape, proxy |
| ${providerTag} response had no data[0] | exception | error | network, media, openai-compatible, response-shape, imagerouter |
| ${providerTag} media fetch ${mediaResp.status} | exception | error | network, media, openai-compatible, secondary-fetch, cdn, imagerouter |
| ${providerTag} response had neither b64_json nor url | exception | error | network, media, openai-compatible, response-shape, moderation, imagerouter |
| no OpenAI credential — configure an API key in Settings or s | exception | error | media, provider-config, openai, credentials, audio, tts |
| ${tag} speech ${resp.status}: ${truncate(text, 240)} | exception | error | openai, tts, azure, audio, provider-error |
| openai speech returned zero bytes | exception | error | openai, tts, empty-response, provider-error |
| no Volcengine Ark API key — configure it in Settings or set | exception | error | volcengine, ark, seedance, api-key, config |
| volcengine task create ${taskResp.status}: ${truncate(taskTe | exception | error | volcengine, ark, seedance, video, provider-error |
| volcengine non-JSON: ${truncate(taskText, 200)} | exception | error | volcengine, ark, seedance, json, network |
| volcengine task response missing id | exception | error | volcengine, ark, seedance, response-shape |
| volcengine poll ${pollResp.status}: ${truncate(pollText, 240 | exception | error | volcengine, ark, seedance, video, polling |
| volcengine poll non-JSON: ${truncate(pollText, 200)} | exception | error | volcengine, ark, seedance, json, polling |
| volcengine task ${lastStatus}: ${reason} | exception | error | volcengine, ark, seedance, video, moderation |
| volcengine task did not finish in time (last status: ${lastS | exception | error | volcengine, ark, seedance, video, timeout |
| volcengine video fetch ${dlResp.status} | exception | error | volcengine, ark, seedance, video, download |
| volcengine image ${resp.status}: ${truncate(text, 240)} | exception | error | volcengine, ark, seedream, image, provider-error |
| volcengine image non-JSON: ${truncate(text, 200)} | exception | error | volcengine, ark, seedream, json, network |
| volcengine image response had no data[0] | exception | error | volcengine, ark, seedream, response-shape |
| volcengine image fetch ${imgResp.status} | exception | error | volcengine, ark, seedream, image, download |
| volcengine image response missing b64_json/url | exception | error | volcengine, ark, seedream, response-shape |
| no xAI credentials — sign in with your SuperGrok subscriptio | exception | error | xai, grok, api-key, oauth, config |
| grok image ${resp.status}: ${truncate(text, 240)} | exception | error | xai, grok, image, provider-error |
| grok image non-JSON: ${truncate(text, 200)} | exception | error | xai, grok, json, network |
| grok image response had no data[0] | exception | error | grok, xai, image-generation, response-shape, provider-api |
| grok image fetch ${imgResp.status} | exception | error | grok, xai, image-generation, network, secondary-fetch, provider-api |
| grok image response missing b64_json/url | exception | error | grok, xai, image-generation, response-shape, content-moderation, provider-api |
| no Nano Banana API key — configure it in Settings or set OD_ | exception | error | nano-banana, gemini, image-generation, credentials, config, provider-api |
| nano-banana image ${resp.status}: ${truncate(text, 240)} | exception | error | nano-banana, gemini, image-generation, http-status, credentials, provider-api |
| nano-banana image non-JSON: ${truncate(text, 200)} | exception | error | nano-banana, gemini, image-generation, response-shape, network, provider-api |
| nano-banana image response missing candidates[].content.part | exception | error | nano-banana, gemini, image-generation, response-shape, content-moderation, provider-api |
| no OpenRouter API key — configure it in Settings or set OPEN | exception | error | openrouter, image-generation, credentials, config, provider-api |
| openrouter image ${resp.status}: ${truncate(text, 240)} | exception | error | openrouter, image-generation, http-status, credentials, provider-api |
| openrouter image non-JSON response: ${truncate(text, 200)} | exception | error | openrouter, image-generation, response-shape, network, provider-api |
| openrouter image response contained no images for model ${wi | exception | error | openrouter, image-generation, response-shape, content-moderation, provider-api |
| openrouter image response missing image_url.url: ${truncate( | exception | error | openrouter, image-generation, response-shape, provider-api |
| openrouter image download ${imgResp.status} | exception | error | openrouter, image-generation, network, secondary-fetch, provider-api |
| openrouter video submit ${submitResp.status}: ${truncate(sub | exception | error | openrouter, video-generation, http-status, credentials, provider-api |
| openrouter video non-JSON: ${truncate(submitText, 200)} | exception | error | openrouter, video-generation, response-shape, network, provider-api |
| openrouter video submit returned no job id or polling_url: $ | exception | error | openrouter, video-generation, response-shape, async-polling, provider-api |
| openrouter poll ${pollResp.status}: ${truncate(pollText, 240 | exception | error | openrouter, video-generation, async-polling, http-status, network, provider-api |
| openrouter poll non-JSON: ${truncate(pollText, 200)} | exception | error | openrouter, video-generation, async-polling, response-shape, network, provider-api |
| openrouter job ${lastStatus}: ${reason} | exception | error | openrouter, video-generation, async-polling, content-moderation, provider-api |
| openrouter video timed out after ${elapsedSec}s waiting for | exception | error | openrouter, video-generation, polling-timeout, configuration |
| openrouter video download ${dlResp.status} | exception | error | openrouter, video-generation, download, http-status, network |
| no Leonardo.ai API key — configure it in Settings or set LEO | exception | error | leonardo, credentials, configuration, image-generation |
| unsupported leonardo.ai model: ${ctx.model} | exception | error | leonardo, model-selection, validation, configuration |
| leonardo.ai submit ${submitResp.status}: ${truncate(submitTe | exception | error | leonardo, http-status, upstream-error, api-rejection |
| leonardo.ai non-JSON: ${truncate(submitText, 200)} | exception | error | leonardo, json-parse, gateway, configuration |
| leonardo.ai response missing generationId | exception | error | leonardo, api-contract, response-shape, parse-error |
| leonardo.ai poll ${pollResp.status} | exception | error | leonardo, polling, http-status, transient |
| leonardo.ai generation failed | exception | error | leonardo, upstream-failure, moderation, terminal-status |
| leonardo.ai generation timed out after 2 minutes | exception | error | leonardo, polling-timeout, configuration, hardcoded-ceiling |
| leonardo.ai image fetch ${imgResp.status} | exception | error | leonardo, download, http-status, cdn |
| grok video submit ${submitResp.status}: ${truncate(submitTex | exception | error | grok, xai, http-status, upstream-error, api-rejection |
| grok video non-JSON: ${truncate(submitText, 200)} | exception | error | grok, xai, json-parse, gateway, configuration |
| grok poll ${pollResp.status}: ${truncate(pollText, 240)} | exception | error | grok, xai, polling, http-status, transient |
| grok poll non-JSON: ${truncate(pollText, 200)} | exception | error | grok, xai, json-parse, gateway, transient |
| grok task ${lastStatus}: ${reason} | exception | error | grok, xai, upstream-failure, terminal-status, moderation |
| grok video timed out after ${elapsedSec}s waiting for status | exception | error | grok, xai, video-generation, polling-timeout, configuration |
| grok video submit returned no inline video and no request_id | exception | error | grok, xai, api-contract, response-shape, parse-error |
| grok video fetch ${dlResp.status} | exception | error | grok, xai, download, http-status, cdn |
| xai tts ${resp.status}: ${truncate(errText, 240)} | exception | error | network, xai, tts, http-error, upstream |
| xai tts response had zero bytes | exception | error | xai, tts, upstream, empty-response |
| ElevenLabs ${kind} prompt must not be empty. Pass --prompt b | exception | error | elevenlabs, tts, sfx, validation, input |
| Vela ${command} returned no JSON output | exception | error | vela, cli, json, parsing, upstream |
| Vela ${command} returned invalid JSON: ${detail} | exception | error | vela, cli, json, parsing, upstream |
| Vela image returned unsupported mime_type ${mime} | exception | error | vela, image, mime, format |
| Vela ${label} did not write the requested output file | exception | error | vela, filesystem, output, upstream |
| Vela ${label} wrote an empty output file | exception | error | vela, filesystem, output, empty-file |
| Vela media accepts at most ${VELA_MAX_INPUT_IMAGES} input im | exception | error | vela, validation, input, limits |
| Vela model ${wireModel} does not publish a quality capabilit | exception | error | vela, quality, capabilities, validation |
| Vela model ${wireModel} does not publish quality ${tier}; su | exception | error | vela, quality, capabilities, validation |
| Vela model ${wireModel} does not publish output profiles, so | exception | error | vela, aspect-ratio, capabilities, validation |
| Vela model ${wireModel} does not publish aspect ${aspect}; s | exception | error | vela, aspect-ratio, capabilities, validation |
| Vela model ${wireModel} does not publish resolution ${reques | validation | error | vela, resolution, capabilities, validation |
| Vela model ${wireModel} is not in the published image catalo | validation | error | vela, quality, catalogue, validation |
| Vela image ${command} response is missing asset_id | exception | error | vela, response, schema, upstream |
| Vela image ${command} returned non-ready asset status ${stat | exception | error | vela, response, status, upstream |
| Vela image ${command} returned unexpected kind ${kind ?? 'mi | exception | error | vela, response, schema, upstream |
| Vela image ${command} returned invalid mime_type ${mime ?? ' | exception | error | vela, response, mime, upstream |
| Vela video only supports aspect ratios 16:9, 9:16, or 1:1; r | validation | error | vela, video, validation, media |
| Vela video only supports durations of 5 or 10 seconds; recei | validation | error | vela, video, validation, type-coercion |
| Vela video gen response is missing task_id | exception | error | vela, video, external-api, task-submission |
| Vela video get returned unexpected task_id ${returnedTaskId | exception | error | vela, video, polling, consistency-check |
| Vela video task ended with status ${lastStatus}: ${videoTask | exception | error | vela, video, task-failure, external-api |
| Vela video task returned unsupported status ${lastStatus} | exception | error | vela, video, status-handling, api-compat |
| Vela video task timed out after ${totalTimeoutMs}ms; last st | exception | error | vela, video, timeout, polling |
| anthropic ${resp.status}: ${await resp.text().catch(() => '' | http | error | anthropic, llm, http, memory-extraction, network |
| openai ${resp.status}: ${await resp.text().catch(() => '')} | http | error | openai, llm, http, memory-extraction, network |
| azure ${resp.status}: ${await resp.text().catch(() => '')} | http | error | azure, openai, llm, http, memory-extraction, network |
| google ${resp.status}: ${await resp.text().catch(() => '')} | http | error | google, gemini, llm, http, memory-extraction, network |
| ${agentName} CLI error: ${message} | exception | error | agent-cli, llm, memory-extraction, json-event-stream |
| Local CLI agent "${provider.agentId}" is not installed | exception | error | agent-cli, memory-extraction, configuration, registry |
| ${def.name} CLI is not installed or not on PATH | exception | error | agent-cli, memory-extraction, path, installation |
| Local CLI memory extraction is not supported for ${provider. | exception | error | agent-cli, memory-extraction, configuration |
| invalid memory id | validation | error | memory, validation, security, path-traversal |
| memory tree folders are derived and cannot be edited | validation | error | memory, validation, tree-structure |
| memory not found | validation | error | memory, not-found, state-management |
| memory entry requires `name` and a valid `type` | validation | error | memory, validation, type-checking |
| failed to read memory entry after write | exception | error | memory, filesystem, write-failure, race-condition |
symlink_in_payload legacy payload contains a symlink at "${displayPath}"; refusing to migrate | exception | error | security, migration, filesystem, symlink, daemon-startup, typescript |
| last30days v3 requires Python 3.12+. Detected Python {major} | console | error | python, version-check, runtime-requirement, startup-guard, cli |
| Unknown search source: {source} | exception | error | cli, argument-validation, python, config |
| --search requires at least one source. | exception | error | cli, argument-validation, python |
| Unsupported emit mode: {emit} | exception | error | cli, argument-validation, python, output-format |
| [last30days] Cannot read --synthesis-file: {exc} | console | error | cli, filesystem, python, argument-validation |
| [CompetitorsPlan] Cannot read plan file: {exc} | console | error | cli, filesystem, python, argument-validation, competitors |
| [CompetitorsPlan] Invalid JSON: {exc} | console | error | cli, json, python, argument-validation, competitors |
| [CompetitorsPlan] Top-level must be a dict of {entity: {targ | console | error | cli, json, python, argument-validation, competitors, schema |
| [Competitors] --competitors-list is empty.\n | console | error | cli, argument-validation, python, competitors |
| [Competitors] --competitors must be >= {COMPETITORS_MIN} (go | console | error | cli, argument-validation, python, competitors |
| BRAVE_API_KEY is required when web_backend='brave' | exception | error | config, api-key, python, web-search, grounding |
| EXA_API_KEY is required when web_backend='exa' | exception | error | config, api-key, python, web-search, grounding |
| SERPER_API_KEY is required when web_backend='serper' | exception | error | config, api-key, python, web-search, grounding |
| PARALLEL_API_KEY is required when web_backend='parallel' | exception | error | config, api-key, python, web-search, grounding |
| Unsupported web backend: {backend!r} | validation | error | config, python, web-search, grounding, argument-validation |
| Request failed with no error details | http | error | network, http, python, defensive-fallback, retry |
| Unsupported source: {source} | validation | error | python, argument-validation, normalization, contract |
| No sources are available for this run. | exception | error | config, python, pipeline, api-key, credentials, startup-guard |
| No X backend is available. | exception | error | config, backend-selection, x-twitter, credentials |
| Unsupported source: {source} | validation | error | validation, source-dispatch, allow-list, planner |
| Unsupported reasoning provider: {provider_name} | validation | error | config, provider, mock-mode, allow-list |
| Gemini selected but no Google API key is configured. | exception | error | config, credentials, gemini, provider |
| OpenAI selected but no valid OpenAI auth is configured. | exception | error | config, credentials, openai, auth-status, provider |
| xAI selected but XAI_API_KEY is not configured. | exception | error | config, credentials, xai, provider |
| OpenRouter selected but OPENROUTER_API_KEY is not configured | exception | error | config, credentials, openrouter, provider |
| {role} must use a Gemini 3.1 preview model. Got: {model} | validation | error | config, model-version, gemini, validation |
| Expected JSON response, got empty text | exception | error | parsing, json, llm-response, retry |
| Reddit rate limited (429) fetching {url} | http | error | network, rate-limit, reddit, http |
| render_for_html_comparison requires at least one report | validation | error | validation, rendering, comparison |
| render_comparison_multi requires at least one report | validation | error | validation, rendering, comparison |
| render_comparison_multi_context requires at least one report | validation | error | validation, rendering, comparison, context-mode |
| SubQuery must have at least one source | validation | error | validation, dataclass, planner, invariant |
| SubQuery weight must be positive, got {self.weight} | validation | error | validation, dataclass, ranking, invariant |
| representative_ids must be a subset of candidate_ids | validation | error | validation, dataclass, clustering, invariant |
| Command {cmd[0]} timed out after {timeout}s | exception | error | subprocess, timeout, resource, external-cli |
| Missing Xiaohongshu API base URL | validation | error | config, validation, xiaohongshu, api-base |
| requests library not available for webhook delivery | exception | error | dependencies, webhook, optional-import, notifications |
| Unknown config key: {args.key} | validation | error | cli, argparse, config, validation, last30days |
| source not found: {path} | exception | error | filesystem, path, validation, humanize-ppt, python |
| brief mode reads markdown/text raw material, not rendered de | validation | error | validation, file-format, powerpoint, humanize-ppt, python |
| Missing playwright. Run: python3 -m pip install playwright & | exception | error | dependency-missing, playwright, pdf, rendering, humanize-ppt |
| --ppt-master-python must be Python 3.10 or newer: {requested | validation | error | python, version-check, subprocess, config, humanize-ppt |
| slide relationship is missing for {rel_id or 'unknown id'} | validation | error | powerpoint, ooxml, validation, file-corruption, pptx-qa |
| slide part is missing: {resolved} | validation | error | powerpoint, ooxml, zip, file-corruption, pptx-qa, validation |
| slide_plan must be a non-empty JSON array of slides | validation | error | json, validation, data-shape, humanize-ppt, preview |
| Cannot parse line: {line} | validation | error | parsing, validation, transcript, chat-overlay, regex |
| Unsupported message line shape: {line} | validation | error | parsing, validation, transcript, chat-overlay |
| Unsupported container: {config['container']} | validation | error | config, validation, chat-overlay, json |
| Unsupported avatarMode: {config['avatarMode']} | validation | error | config, validation, chat-overlay, avatar |
| Unsupported deviceFrame: {config['deviceFrame']} | validation | error | config, validation, chat-overlay, device-frame |
| Unsupported nicknameMode: {config['nicknameMode']} | validation | error | config, validation, chat-overlay, nickname |
| Unsupported deliveryFormat: {config['deliveryFormat']} | validation | error | config, validation, chat-overlay, delivery, video |
| container=none does not support deviceFrame=iphone-dynamic-i | validation | error | config, validation, cross-field, chat-overlay, device-frame |
| Unsupported side for participant {speaker}: {side} | validation | error | config, validation, chat-overlay, participants |
| Unsupported preset for participant {speaker}: {preset_key} | validation | error | config, validation, chat-overlay, avatar, participants |
| Participant {speaker} config must use uploadPath, not upload | validation | error | config, validation, chat-overlay, field-rename, participants |
| avatarMode=preset does not allow uploadPath for participant | validation | error | config-validation, chat-motion-overlay, avatar-mode |
| avatarMode=upload requires uploadPath for participant {speak | validation | error | config-validation, chat-motion-overlay, avatar-mode |
| Unsupported avatar key for participant {speaker}: {avatar_ke | validation | error | transcript-parsing, chat-motion-overlay, avatar-mode |
| Participant {speaker} appears on both {participant['side']} | validation | error | transcript-parsing, chat-motion-overlay, participant-config |
| Participant {speaker} has conflicting transcript avatar hint | validation | error | transcript-parsing, chat-motion-overlay, participant-config |
| avatarMode=mixed requires at least one upload path | validation | error | config-validation, chat-motion-overlay, avatar-mode |
| Refusing to use dangerous output directory: {output_dir}. Ch | exception | error | filesystem-safety, chat-motion-overlay, bundle-prep |
| Refusing to overwrite unmanaged output directory: {output_di | exception | error | filesystem-safety, chat-motion-overlay, bundle-prep |
| Output directory already exists: {output_dir}. Use --force t | exception | warning | filesystem-safety, chat-motion-overlay, bundle-prep |
| Configured uploadPath for participant {participant['name']} | exception | error | filesystem-safety, chat-motion-overlay, bundle-prep, avatar-mode |
| Generated chatSpec.ts has an unexpected shape | validation | error | test-harness, chat-motion-overlay, spec-shape |
| source atlas must be {ATLAS_WIDTH}x{ATLAS_HEIGHT}; got {sour | exception | error | image-processing, hatch-pet, atlas |
| refusing to resize source atlas because its aspect ratio doe | exception | error | image-processing, hatch-pet, atlas |
| {state} row needs {frame_count} frames, found {len(files)} u | exception | error | image-processing, hatch-pet, atlas |
| job manifest not found: {path} | exception | error | manifest, hatch-pet, filesystem-safety |
| invalid imagegen-jobs.json: jobs must be a list | exception | error | manifest, hatch-pet, data-validation |
| unknown job id: {job_id} | exception | error | manifest, hatch-pet, data-validation |
| refusing to mirror without --confirm-appropriate-mirror | exception | error | safety-guard, hatch-pet, mirroring |
| --decision-note must explain why mirroring is appropriate | exception | error | safety-guard, hatch-pet, mirroring |
| running-right must be complete before deriving running-left | exception | error | hatch-pet, workflow-ordering, manifest, imagegen |
| running-left is not configured for conditional mirroring | exception | error | hatch-pet, manifest, mirror-policy, config |
| running-right decoded strip not found: {source} | exception | error | hatch-pet, filesystem, decoded, missing-file |
| {output} already exists; pass --force to replace it | exception | warning | hatch-pet, idempotency, overwrite-guard |
| unknown state(s): {', '.join(unknown)} | exception | error | hatch-pet, cli-args, states, validation |
| invalid chroma key color: {value}; expected #RRGGBB | exception | error | hatch-pet, chroma-key, validation, cli-args |
| could not find {frame_count} sprite components in {strip_pat | exception | error | hatch-pet, frame-extraction, components, chroma-key |
| missing generated strip for {state}: {strip_path} | exception | error | hatch-pet, filesystem, states, missing-file |
| job {job_id} has no {field} | exception | error | hatch-pet, manifest, validation, provenance |
| job {job_id} is missing source_sha256; ingest visual outputs | exception | error | hatch-pet, manifest, provenance, hash, integrity |
| job {job_id} source image no longer exists: {source} | exception | error | hatch-pet, filesystem, missing-file, generated-images |
| job {job_id} decoded output is missing: {output} | exception | error | hatch-pet, filesystem, decoded, missing-file |
| job {job_id} source image hash does not match imagegen-jobs. | exception | error | hatch-pet, integrity, hash, provenance |
| job {job_id} decoded output does not match its recorded sour | exception | error | hatch-pet, integrity, decoded, hash |
| job {job_id} may not use deterministic mirror provenance | exception | error | hatch-pet, provenance, manifest, mirror |
| running-left mirror job must derive from running-right | exception | error | hatch-pet, provenance, mirror, manifest |
| running-left mirror job is missing an approved mirror_decisi | exception | error | hatch-pet, mirror, provenance, review, manifest |
| running-left mirror job is missing source_sha256 | exception | error | hatch-pet, mirror, hash, provenance, manifest |
| running-left mirror job is missing output_sha256 | exception | error | hatch-pet, mirror, hash, provenance, manifest |
| running-left mirror source image no longer exists: {source} | exception | error | hatch-pet, mirror, filesystem, missing-file, decoded |
| running-left mirrored output is missing: {output} | exception | error | filesystem, mirror, validation, pet-pipeline |
| running-left mirror source must be decoded/running-right.png | exception | error | manifest, mirror, path-validation, pet-pipeline |
| running-left mirror output must be decoded/running-left.png | exception | error | manifest, mirror, path-validation, pet-pipeline |
| running-left mirror source hash does not match imagegen-jobs | exception | error | integrity, sha256, mirror, pet-pipeline |
| running-left mirrored output hash does not match imagegen-jo | exception | error | integrity, sha256, mirror, pet-pipeline |
| running-left mirrored output is not an exact horizontal mirr | exception | error | integrity, mirror, pixel-exact, pillow, pet-pipeline |
| job {job_id} was marked as a local/synthetic row ({', '.join | exception | error | manifest, provenance, synthetic, pet-pipeline |
| job {job_id} uses a synthetic test source; rerun with real $ | exception | error | synthetic, test-mode, provenance, pet-pipeline |
| job {job_id} has invalid secondary fallback provenance | exception | error | manifest, provenance, secondary-fallback, pet-pipeline |
| job {job_id} was not recorded as a built-in $imagegen output | exception | error | manifest, provenance, imagegen, pet-pipeline |
| job {job_id} source image is inside the pet run directory; d | exception | error | path-validation, provenance, sandbox, pet-pipeline |
| job {job_id} source image is not a built-in $imagegen output | exception | error | path-validation, codex-home, provenance, pet-pipeline |
| invalid imagegen-jobs.json: jobs must be a list | exception | error | manifest, schema, json, pet-pipeline |
| imagegen jobs are not complete; run pet_job_status.py and fi | exception | error | manifest, job-status, workflow, pet-pipeline |
| pet_request.json is missing pet_id, display_name, or descrip | exception | error | request, required-fields, packaging, pet-pipeline |
| unknown state(s): {', '.join(unknown)} | exception | error | cli, states, enum, pet-pipeline |
| job manifest not found: {path} | exception | error | filesystem, manifest, cli, pet-pipeline |
| invalid imagegen-jobs.json: jobs must be a list | exception | error | manifest, schema, json, pet-pipeline |
| unknown job id(s): {', '.join(sorted(missing))} | exception | error | cli, job-id, manifest, pet-pipeline |
| json.dumps(response["error"], indent=2) | exception | error | network, openai-api, rate-limit, auth, pet-pipeline |
| image API response did not contain data[0] | exception | error | openai-api, image-generation, response-shape, system-exit |
| image API response did not contain data[0].b64_json | exception | error | openai-api, image-generation, response-shape, base64, system-exit |
| job {job.get('id')} has invalid input_images | exception | error | manifest, json-schema, validation, system-exit |
| job {job.get('id')} has invalid input image entry | exception | error | manifest, json-schema, validation, system-exit |
| path traversal detected in input_images for job {job.get('id | exception | error | security, path-traversal, manifest, validation, system-exit |
| input image for job {job.get('id')} not found: {path} | exception | error | filesystem, dependencies, manifest, system-exit |
| OPENAI_API_KEY is not set | exception | error | environment, secrets, openai-api, system-exit |
| job {job_id} is missing prompt_file or output_path | exception | error | manifest, json-schema, validation, system-exit |
| path traversal detected in prompt_file for job {job_id} | exception | error | security, path-traversal, manifest, validation, system-exit |
| path traversal detected in output_path for job {job_id} | exception | error | security, path-traversal, manifest, validation, system-exit |
| expected {ATLAS_SIZE[0]}x{ATLAS_SIZE[1]}, got {image.width}x | exception | error | spritesheet, atlas, image-dimensions, validation, pillow |
| expected PNG or WebP, got {image.format} | exception | error | spritesheet, image-format, validation, pillow |
| pet name is required | exception | error | cli, arguments, validation, system-exit |
| pet name must contain at least one letter or digit | exception | error | cli, slugify, validation, system-exit |
| {target_dir} already contains pet files; pass --force to ove | exception | warning | cli, filesystem, overwrite-protection, system-exit |
| job manifest not found: {path} | exception | error | filesystem, manifest, cli, system-exit |
| invalid imagegen-jobs.json: jobs must be a list | exception | error | manifest, json-schema, validation, system-exit |
| invalid chroma key color: {value}; expected #RRGGBB | exception | error | cli, chroma-key, validation, regex, system-exit |
| pet id must contain at least one letter or digit | exception | error | cli, slugify, validation, system-exit |
| {run_dir} already exists and is not empty; pass --force to r | exception | error | filesystem, cli, hatch-pet, idempotency |
| reference not found: {source} | exception | error | filesystem, cli, hatch-pet, validation |
| file not found: {path} | exception | error | filesystem, cli, hatch-pet, validation |
| review does not contain row-level results | exception | error | data-validation, cli, hatch-pet, schema |
| row prompt not found: {prompt_path} | exception | error | filesystem, cli, hatch-pet, validation |
| invalid imagegen-jobs.json: jobs must be a list | exception | error | data-validation, cli, hatch-pet, schema |
| unknown row job id: {state} | exception | error | data-validation, cli, hatch-pet, schema |
| job manifest not found: {path} | exception | error | filesystem, cli, hatch-pet, validation |
| invalid imagegen-jobs.json: jobs must be a list | exception | error | data-validation, cli, hatch-pet, schema |
| unknown job id: {job_id} | exception | error | data-validation, cli, hatch-pet, schema |
| source image is inside the pet run directory; record the ori | exception | error | filesystem, cli, hatch-pet, provenance |
| source image does not look like a built-in $imagegen output; | exception | error | filesystem, cli, hatch-pet, provenance |
| job {job.get('id')} does not list input_images; grounded row | exception | error | data-validation, cli, hatch-pet, schema |
| job {job.get('id')} has an invalid input image entry | exception | error | data-validation, cli, hatch-pet, schema |
| job {job.get('id')} is missing required grounding image(s): | exception | error | filesystem, cli, hatch-pet, validation |
| source image not found: {source} | exception | error | filesystem, cli, hatch-pet, validation |
| job {args.job_id} is not ready; missing dependency result(s) | exception | error | data-validation, cli, hatch-pet, ordering |
| job {args.job_id} has no output_path | exception | error | data-validation, cli, hatch-pet, schema |
| {output} already exists; pass --force to replace it | exception | error | filesystem, cli, hatch-pet, idempotency |
| cursor at {self.y} exceeds footer rail {self.cap}; reduce bl | exception | error | layout, pptx, presentation, overflow |
| Cursor exceeded rail at '{label}': y={self.y} cap={self.cap} | exception | error | python, python-pptx, layout, presentation, overflow, fidelity-audit |