{"record":{"id":"ba01738310bc7f1d","repo":"coleam00/Archon","slug":"model-binding-name-has-an-invalid-effort","errorCode":null,"errorMessage":"Model binding '${name}' has an invalid effort.","messagePattern":"Model binding '(.+?)' has an invalid effort\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/workflows/src/model-validation.ts","lineNumber":110,"sourceCode":"  if (!name.startsWith('@')) {\n    throw new Error(\n      `Alias name '${name}' must start with '@' (e.g. '@${name}'). Reserved tier names (small/medium/large) do not need '@'.`\n    );\n  }\n}\n\nfunction assertValidEntry(name: string, entry: RawAliasEntry): void {\n  if (typeof entry.provider !== 'string' || entry.provider.length === 0) {\n    throw new Error(`Alias '${name}' has invalid provider — must be a non-empty string.`);\n  }\n  if (typeof entry.model !== 'string' || entry.model.length === 0) {\n    throw new Error(`Alias '${name}' has invalid model — must be a non-empty string.`);\n  }\n}\n\nfunction assertValidPersistedPreset(name: string, entry: ModelAliasPreset): void {\n  if (entry.effort !== undefined && !isEffortValidForProvider(entry.provider, entry.effort)) {\n    throw new Error(`Model binding '${name}' has an invalid effort.`);\n  }\n}\n\nexport type RunModelPresetValidationIssue =\n  | { kind: 'unknown-provider'; provider: string; field: 'provider' }\n  | { kind: 'invalid-model'; provider: string; model: string; reason: string; field: 'model' }\n  | { kind: 'unsupported-effort'; provider: string; effort: string; field: 'effort' }\n  | {\n      kind: 'invalid-effort';\n      provider: string;\n      effort: string;\n      valid: readonly string[];\n      field: 'effort';\n    }\n  | { kind: 'unsupported-thinking'; provider: string; field: 'thinking' };\n\nfunction runModelPresetValidationMessage(issue: RunModelPresetValidationIssue): string {\n  switch (issue.kind) {","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/coleam00/Archon/blob/0773b9745896ef0612e709c80845a0f7db315b19/packages/workflows/src/model-validation.ts#L92-L128","documentation":"`assertValidPersistedPreset` validates persisted model bindings when they are read back from metadata (`readRunModelBindingsMetadata`). If a binding carries an `effort` that the provider does not accept (checked via `isEffortValidForProvider`), the library throws rather than silently dropping the effort — persisted state may be stale relative to the provider registry.","triggerScenarios":"Reading run model bindings from workflow metadata where a binding's `effort` value is not valid for its `provider` — e.g. effort persisted by an older binary or hand-edited metadata, or a provider whose supported effort set changed.","commonSituations":"Hand-editing workflow metadata `model_bindings`, upgrading Archon after a provider's valid effort levels changed, copying an effort value from one provider to another that doesn't support it.","solutions":["Remove the `effort` field from the offending binding so it resolves with provider defaults","Replace the effort value with one valid for that provider (check validEffortsForProvider / provider docs)","Re-save the binding through the normal run-override flow instead of editing metadata by hand"],"exampleFix":"// before (persisted metadata)\n{ \"name\": \"@fast\", \"provider\": \"openai\", \"model\": \"gpt-4o-mini\", \"effort\": \"maximal\" }\n// after\n{ \"name\": \"@fast\", \"provider\": \"openai\", \"model\": \"gpt-4o-mini\" }","handlingStrategy":"validation","validationCode":"import { isEffortValidForProvider } from '@archon/workflows/model-validation';\n// Validate persisted bindings before reading them into a run.\nfunction badBindings(bindings: { name: string; provider: string; effort?: string }[]): string[] {\n  return bindings\n    .filter((b) => b.effort !== undefined && !isEffortValidForProvider(b.provider, b.effort))\n    .map((b) => b.name);\n}","typeGuard":null,"tryCatchPattern":"try {\n  const bindings = readRunModelBindingsMetadata(metadata);\n} catch (err) {\n  if (err instanceof Error && err.message.includes('has an invalid effort')) {\n    const name = err.message.match(/'([^']+)'/)?.[1];\n    throw new Error(`Binding '${name}' has a stale effort for its provider; re-save it via the run override flow`, { cause: err });\n  }\n  throw err;\n}","preventionTips":["Do not hand-edit workflow metadata model_bindings; use the run override flow","Drop the effort field when copying a binding to a provider with different effort support","Re-persist bindings after upgrading if a provider's valid effort set changed","Validate persisted metadata in a maintenance/check command before runs"],"tags":["config","model-binding","persistence","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"0773b9745896ef0612e709c80845a0f7db315b19","analyzedAt":"2026-09-01T02:28:07.064Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}