affaan-m/ECC · error · Error

unsupported Codex version

Error message

unsupported Codex version ${versionMatch[1]}; tool-less review requires exactly ${SUPPORTED_CODEX_VERSION}

What it means

The script pins Codex to exactly SUPPORTED_CODEX_VERSION ('0.146.0'). verifyToollessSupport() throws this error when `codex --version` reports any other version, because tool-less review behavior is only guaranteed for that exact release. The message includes the detected version and the required one.

Solutions

  1. Install the exact required version: `npm install -g @openai/codex@0.146.0`
  2. Check `which codex` / `codex --version` to make sure PATH resolves to the pinned install
  3. Pin the version in CI (e.g. install step with @0.146.0) to avoid drift
  4. If you intentionally want a different version, update SUPPORTED_CODEX_VERSION in review-with-codex.js after verifying tool-less behavior

Example fix

// before
$ codex --version
codex-cli 0.158.1   // newer than pin
// after
npm install -g @openai/codex@0.146.0
$ codex --version
codex-cli 0.146.0
Defensive patterns

Strategy: validation

Validate before calling

const { SUPPORTED_CODEX_VERSION } = require('./review-with-codex');
const { execSync } = require('child_process');
function codexVersionMatches() {
  const out = execSync('codex --version', { encoding: 'utf8' });
  const m = out.match(/^codex-cli\s+([^\s]+)$/m);
  return m != null && m[1] === SUPPORTED_CODEX_VERSION;
}

Try / catch

try {
  verifyToollessSupport();
} catch (err) {
  const m = err.message.match(/unsupported Codex version (\S+);/);
  if (m) {
    console.error(`Install codex-cli 0.146.0 (found ${m[1]}): npm i -g @openai/codex@0.146.0`);
  } else throw err;
}

Prevention

When it happens

Trigger: verifyToollessSupport() called by runTests/runReview; `codex --version` outputs a parseable `codex-cli <version>` line where versionMatch[1] !== '0.146.0' — any older or newer installed Codex.

Common situations: Automatic global npm updates bumped codex past the pin; CI images ship a different Codex version; a developer has multiple Codex installs and PATH resolves to the wrong one.

Understand the failure class

Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.

Related errors


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/2ef7d7c55c3fe985. Report an issue: GitHub.

Appendix: source

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

}

function verifyToollessSupport(dependencies = {}) {
  const spawn = dependencies.spawnSync || spawnSync;
  const options = {
    cwd: os.tmpdir(),
    env: buildEnvironment(dependencies.env || process.env),
    encoding: 'utf8',
    timeout: 5_000,
    maxBuffer: 256 * 1024,
    windowsHide: true,
  };
  const versionText = probeCodex(spawn, ['--version'], options, 'version');
  const versionMatch = versionText.match(/^codex-cli\s+([^\s]+)$/m);
  if (!versionMatch) {
    throw new Error('Codex version could not be verified for tool-less review');
  }
  if (versionMatch[1] !== SUPPORTED_CODEX_VERSION) {
    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(

View on GitHub (pinned to 8321021c54)