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
- Read the joined messages — each is a blocking validation issue; fix them one by one.
- Run adapter.validate(planningInput) yourself beforehand and inspect issue.code/severity.
- Correct the planning input (target root, module list) that the adapter flags.
- 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
- Run adapter.validate yourself and print all issues (with codes) before planning.
- Keep planning inputs (module list, target root) consistent with what the adapter expects.
- Review exemptValidationCodes when introducing new issue codes so intended warnings are not blocking.
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
- At least one guided harness must be selected
- Refusing to apply install operation: missing destination…
- The all/* harness selection cannot be combined with other…
- -32602
- a claim token is required
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)