pbakaus/impeccable · error

concept-seed: --register applies to direction rounds only

Error message

concept-seed: --register applies to direction rounds only

What it means

Thrown when --register is set but --scope is not 'direction'. Registers (safer/bolder) only steer direction rounds; surface scope has a different deal structure (three grounded structures, no lineup) where the register concept does not apply.

Source

Thrown at plugin/skills/impeccable/scripts/concept-seed.mjs:319

  platform = null,
  candidateCount = 7,
  catalogDir = CATALOG_DIR,
  _resolvedData = undefined,
} = {}) {
  if (scope !== 'surface' && scope !== 'direction') {
    throw new Error('concept-seed: --scope must be direction or surface');
  }
  if (!Number.isInteger(reroll) || reroll < 0) {
    throw new Error('concept-seed: --reroll must be a non-negative integer');
  }
  if (register !== null && register !== 'safer' && register !== 'bolder') {
    throw new Error('concept-seed: --register must be safer or bolder');
  }
  if (register !== null && reroll < 1) {
    throw new Error('concept-seed: --register steers a re-roll round; pass --reroll <n> with it');
  }
  if (register !== null && scope !== 'direction') {
    throw new Error('concept-seed: --register applies to direction rounds only');
  }
  if (mode !== null && !SEED_MODES.has(mode)) {
    throw new Error('concept-seed: --mode must be persuade, operate, read, or experience');
  }
  // Grain needs no mode: how much of the product is in play is independent of
  // which register of work it is.
  if (grain !== null && !COMPOSITION_GRAINS.includes(grain)) {
    throw new Error(`concept-seed: --grain must be one of ${COMPOSITION_GRAINS.join(', ')}`);
  }
  if (platform !== null && !COMPOSITION_PLATFORMS.includes(platform)) {
    throw new Error(`concept-seed: --platform must be one of ${COMPOSITION_PLATFORMS.join(', ')}`);
  }
  if (!Number.isInteger(candidateCount) || candidateCount < 5 || candidateCount > 7) {
    throw new Error('concept-seed: --candidate-count must be an integer from 5 to 7');
  }
  const unit = (salt) => {
    const h = crypto.createHash('sha256').update(`${scope}:${salt}:${key}`).digest();
    return h.readUInt32BE(0) / 0xffffffff;

View on GitHub (pinned to d14711ae3d)

Solutions

  1. Drop --register when using --scope surface (the surface deal does not support it).
  2. If you want register steering, use --scope direction --reroll <n> --register safer|bolder.

Example fix

# before
$ node concept-seed.mjs --scope surface --reroll 1 --register bolder ...

# after
$ node concept-seed.mjs --scope surface --reroll 1 ...
Defensive patterns

Strategy: validation

Validate before calling

if (register != null && scope !== 'direction') {
  throw new Error('--register applies only to --scope direction');
}

Type guard

function registerScopePairValid(register, scope) {
  return register == null || scope === 'direction';
}

Try / catch

try {
  await seedConcepts({ scope, register });
} catch (err) {
  if (/register applies to direction rounds only/.test(err.message)) {
    console.error('Drop --register when using --scope surface.');
  } else throw err;
}

Prevention

When it happens

Trigger: Passing --register safer|bolder with --scope surface. The guard is register !== null && scope !== 'direction'.

Common situations: User wants a bolder surface; a wrapper always forwards the register flag regardless of scope; confusion that register is a direction-only axis.

Related errors


AI-assisted analysis of pbakaus/impeccable@d14711ae3d (2026-08-13). Data as JSON: /api/errors/fdc81b767006fa5b. Report an issue: GitHub.