affaan-m/ECC · error · Error

Codex ${versionMatch[1]} cannot guarantee tool-less review;

Error message

Codex ${versionMatch[1]} cannot guarantee tool-less review; required stable feature toggles unavailable: ${unavailable.join(', ')}

What it means

Thrown by verifyToollessSupport() after parsing `codex features list` output. For each name in REQUIRED_TOOLLESS_FEATURES (apps, shell_tool, browser_use, unified_exec, etc.), the parsed stage must be 'stable'. Any feature that is missing from the output or staged as 'under development'/'experimental'/'deprecated'/'removed' is collected into `unavailable` and reported. This guarantees the tool-less review cannot accidentally enable a tool.

Source

Thrown at skills/council-multi-model/scripts/review-with-codex.js:163

    throw new Error(
      `unsupported Codex version ${versionMatch[1]}; `
      + `tool-less review requires exactly ${SUPPORTED_CODEX_VERSION}`
    );
  }

  const featuresText = probeCodex(spawn, ['features', 'list'], options, 'feature');
  const stages = new Map();
  for (const line of featuresText.split('\n')) {
    const match = line.trim().match(
      /^(\S+)\s+(stable|under development|experimental|deprecated|removed)\s+(true|false)$/
    );
    if (match) stages.set(match[1], match[2]);
  }
  const unavailable = REQUIRED_TOOLLESS_FEATURES.filter(
    (feature) => stages.get(feature) !== 'stable'
  );
  if (unavailable.length > 0) {
    throw new Error(
      `Codex ${versionMatch[1]} cannot guarantee tool-less review; `
      + `required stable feature toggles unavailable: ${unavailable.join(', ')}`
    );
  }
  return versionMatch[1];
}

function buildEnvironment(sourceEnv = process.env) {
  const allowed = [
    'PATH', 'HOME', 'USERPROFILE', 'CODEX_HOME',
    'TMPDIR', 'TMP', 'TEMP', 'SystemRoot', 'ComSpec', 'PATHEXT',
  ];
  return Object.fromEntries(
    allowed.filter((name) => sourceEnv[name]).map((name) => [name, sourceEnv[name]])
  );
}

function runReview(prompt, options, dependencies = {}) {

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Run `codex features list` by hand and check the stage column for each named feature.
  2. Reinstall the canonical Codex 0.146.0 build whose features are all stable.
  3. If a feature was legitimately renamed, update REQUIRED_TOOLLESS_FEATURES in the script to match and re-validate.

Example fix

// before
Error: Codex 0.146.0 cannot guarantee tool-less review; required stable feature toggles unavailable: shell_tool, browser_use

// after: reinstall the canonical build and re-check
$ codex features list | grep -E 'shell_tool|browser_use'
shell_tool stable true
browser_use stable true
Defensive patterns

Strategy: validation

Validate before calling

function assertRequiredFeaturesStable(featuresText, required) {
  const stages = new Map();
  for (const line of (featuresText || '').split('\n')) {
    const m = line.trim().match(/^(\S+)\s+(stable|under development|experimental|deprecated|removed)\s+(true|false)$/);
    if (m) stages.set(m[1], m[2]);
  }
  const missing = required.filter(f => stages.get(f) !== 'stable');
  if (missing.length) throw new Error(`required features not stable: ${missing.join(', ')}`);
}

Type guard

function allRequiredFeaturesStable(featuresText, required) {
  const stages = new Map();
  for (const line of (featuresText || '').split('\n')) {
    const m = line.trim().match(/^(\S+)\s+(stable|under development|experimental|deprecated|removed)\s+(true|false)$/);
    if (m) stages.set(m[1], m[2]);
  }
  return required.every(f => stages.get(f) === 'stable');
}

Try / catch

try {
  verifyToollessSupport({ spawnSync });
} catch (error) {
  if (/cannot guarantee tool-less review/.test(error.message)) {
    // reinstall canonical codex build with stable toggles, then retry
  } else {
    throw error;
  }
}

Prevention

When it happens

Trigger: A Codex 0.146.0 build where one or more of the required feature toggles is not stable, e.g. shell_tool is 'experimental' or browser_use is missing from `codex features list`. The error names the offending features.

Common situations: A patched/forked Codex build with different feature stages; a nightly that reclassifies a feature; a feature renamed between builds so the regex no longer matches it (it then counts as unavailable).

Related errors


AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13). Data as JSON: /api/errors/822c553ac3cea459. Report an issue: GitHub.