affaan-m/ECC · error

${blockingIssues.map(issue => issue.message).join('; ')}

Error message

${blockingIssues.map(issue => issue.message).join('; ')}

What it means

planInstallTargetScaffold runs adapter.validate(planningInput) and joins every validation issue with severity 'error' (not exempted by exemptValidationCodes) into a single thrown Error. It is an aggregate validation gate: scaffolding is aborted unless the adapter considers the plan valid. The message is a semicolon-joined list of all blocking issue messages.

Solutions

  1. Read the joined messages — each is a blocking validation issue; fix them one by one.
  2. Run adapter.validate(planningInput) yourself beforehand and inspect issue.code/severity.
  3. Correct the planning input (target root, module list) that the adapter flags.
  4. If a code should be non-blocking, verify whether it belongs in exemptValidationCodes rather than bypassing validation.

Example fix

// before
planInstallTargetScaffold({ target, modules: ['agents', 'agents'] });
// after
const issues = adapter.validate(planningInput).filter(i => i.severity === 'error');
if (issues.length === 0) planInstallTargetScaffold({ target, modules: ['agents'] });
Defensive patterns

Strategy: validation

Validate before calling

const issues = adapter.validate(planningInput).filter(i => i.severity === 'error');
if (issues.length > 0) {
  issues.forEach(i => console.error(`[${i.code}] ${i.message}`));
  process.exitCode = 1;
}

Try / catch

try {
  const plan = planInstallTargetScaffold(options);
} catch (e) {
  // message is ';'-joined issue list — split and surface each one
  e.message.split('; ').forEach(msg => console.error('Blocking issue:', msg));
  throw e;
}

Prevention

When it happens

Trigger: Calling planInstallTargetScaffold (directly or via plan/scaffoldPlan) while adapter.validate returns error-severity issues, e.g. target root missing, conflicting modules, invalid module list, or an unsupported target state.

Common situations: Running the installer with modules that conflict for the chosen target; installing into a directory that fails adapter validation; stale install state producing error-severity issues; enabling an exempt-able code that is not in exemptValidationCodes.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at scripts/lib/install-targets/registry.js:65

  return adapter;
}

function planInstallTargetScaffold(options = {}) {
  const adapter = getInstallTargetAdapter(options.target);
  const modules = Array.isArray(options.modules) ? options.modules : [];
  const exemptValidationCodes = new Set(Array.isArray(options.exemptValidationCodes) ? options.exemptValidationCodes : []);
  const planningInput = {
    repoRoot: options.repoRoot,
    projectRoot: options.projectRoot || options.repoRoot,
    homeDir: options.homeDir,
    env: resolveInvocationEnvironment(options),
  };
  const validationIssues = adapter.validate(planningInput);
  const blockingIssues = validationIssues.filter(issue => (
    issue.severity === 'error' && !exemptValidationCodes.has(issue.code)
  ));
  if (blockingIssues.length > 0) {
    throw new Error(blockingIssues.map(issue => issue.message).join('; '));
  }
  const targetRoot = adapter.resolveRoot(planningInput);
  const installStatePath = adapter.getInstallStatePath(planningInput);
  const operations = adapter.planOperations({
    ...planningInput,
    modules,
  });

  return {
    adapter: {
      id: adapter.id,
      target: adapter.target,
      kind: adapter.kind,
    },
    targetRoot,
    installStatePath,
    validationIssues,
    operations,

View on GitHub (pinned to 8321021c54)