pbakaus/impeccable · error · 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'. The safer/bolder register was written for direction rounds (product worlds) only and has no defined behavior on surface rounds (grounded structures). The no-lineup rule that register depends on is direction-only, so the function refuses instead of silently no-op'ing.
Source
Thrown at skill/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
- Only pass register when scope='direction'.
- Drop register for surface-scope calls.
Example fix
// before
await seedConcepts({ scope: 'surface', reroll: 1, register: 'bolder' }); // -> throws
// after
await seedConcepts({ scope: 'direction', reroll: 1, register: 'bolder' }); Defensive patterns
Strategy: validation
Validate before calling
// Enforce the register+scope precondition together.
function validateRegisterScope({ register, scope }) {
if (register != null && scope !== 'direction') {
throw new Error('register applies to direction rounds only');
}
} Prevention
- Only pass register when scope is 'direction'.
- For surface rounds, leave register unset.
- Remember the no-lineup rule register depends on is direction-only.
When it happens
Trigger: Passing register='bolder' together with scope='surface'; leaving scope at its default 'surface' while setting register.
Common situations: A caller that always forwards register regardless of scope; a user assuming register applies to every roll.
Related errors
- concept-seed: --register steers a re-roll round; pass --rero
- concept-seed: --scope must be direction or surface
- concept-seed: --reroll must be a non-negative integer
- concept-seed: --register must be safer or bolder
- concept-seed: --mode must be persuade, operate, read, or exp
AI-assisted analysis of pbakaus/impeccable@d14711ae3d (2026-08-13).
Data as JSON: /api/errors/f12166b8ade20657.
Report an issue: GitHub.