linshenkx/prompt-optimizer · error · VariableError

PREDEFINED_VARIABLE_OVERRIDE

PREDEFINED_VARIABLE_OVERRIDE

Error message

Cannot override predefined variable: ${name}

What it means

VariableManager.setVariable throws VariableError with code PREDEFINED_VARIABLE_OVERRIDE when a caller attempts to set a variable whose name matches one of the manager's predefined (built-in) variables. Predefined variables are reserved by the system and cannot be overwritten through the public API. The check is performed by isPredefinedVariable(name) before any mutation occurs.

Solutions

  1. Filter out predefined variables before calling setVariable (expose/use a listPredefinedVariables or isPredefinedVariable check)
  2. Namespace user-created variables (e.g. prefix 'user.') to avoid collisions
  3. If the value genuinely needs updating, use a custom variable name instead of the predefined one

Example fix

// before
variableManager.setVariable('APP_NAME', 'My App') // APP_NAME is predefined

// after
if (!variableManager.isPredefinedVariable('APP_NAME')) {
  variableManager.setVariable('APP_NAME', 'My App')
} else {
  variableManager.setVariable('user.appName', 'My App')
}
Defensive patterns

Strategy: validation

Validate before calling

if (variableManager.isPredefinedVariable(name)) {
  // skip, rename, or warn — do not call setVariable
}

Type guard

const isSafeVariableName = (vm: VariableManager, name: string): boolean =>
  !vm.isPredefinedVariable(name)

Try / catch

try {
  vm.setVariable(name, value)
} catch (e) {
  if (e instanceof VariableError && e.code === 'PREDEFINED_VARIABLE_OVERRIDE') return
  throw e
}

Prevention

When it happens

Trigger: Calling setVariable(name, value) where name is in the predefined variable set (e.g. system-provided names registered at construction). Custom user variables are unaffected; only names colliding with predefined ones trigger this.

Common situations: User-supplied variable names forwarded directly to setVariable; migration/import tooling that re-registers all variables including built-ins; frontend forms that don't filter out predefined names from the editable list.

Related errors


AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27). Data as JSON: /api/errors/9b09f6e23423c14f. Report an issue: GitHub.

Appendix: source

Thrown at packages/ui/src/services/VariableManager.ts:121

            return 'Name cannot start with a number.'
          case 'reservedName':
            return 'Name is reserved.'
          case 'invalidCharacters':
            return 'Name cannot contain whitespace or braces ({}).' 
          default:
            return 'Name is invalid.'
        }
      })()
      throw new VariableError(
        `Invalid variable name: ${name}. ${reasonText}`,
        name,
        undefined,
        'INVALID_VARIABLE_NAME'
      );
    }

    if (this.isPredefinedVariable(name)) {
      throw new VariableError(
        `Cannot override predefined variable: ${name}`,
        name,
        undefined,
        'PREDEFINED_VARIABLE_OVERRIDE'
      );
    }

    if (value.length > VARIABLE_VALIDATION.MAX_VALUE_LENGTH) {
      throw new VariableError(
        `Variable value too long: ${value.length} > ${VARIABLE_VALIDATION.MAX_VALUE_LENGTH}`,
        name,
        undefined,
        'VALUE_TOO_LONG'
      );
    }

    this.customVariables[name] = value;
    this.saveToStorage();

View on GitHub (pinned to 3e677b1d9f)