pbakaus/impeccable · error
concept-seed: every challenger tier needs at least one appro
Error message
concept-seed: every challenger tier needs at least one approved concept
What it means
selectApprovedChallengers() builds a roll of challenger concepts for a design direction/surface. It requires EVERY well tier (WELL_TIERS = ['graphic', 'interaction', 'atmosphere']) to have at least one concept with status === 'approved', because each tier contributes two challengers per roll and an empty tier would starve the result. The guard throws before any minimum-rating or mode filtering, since those filters degrade gracefully only when each tier still has a base pool.
Source
Thrown at plugin/skills/impeccable/scripts/lib/roll-selection.mjs:170
export function* selectApprovedChallengers({ scope, key, reroll = 0, minRating = null, mode = null, concepts }) {
const approved = concepts.filter(concept => concept.status === 'approved');
// Direction chooses a durable identity, so it draws worlds; surface designs
// one page inside a committed identity, so it draws compositions. Duals serve
// both. A tier with no matching-strength approvals falls back to its full
// approved pool rather than starving the roll.
const wanted = scope === 'direction'
? new Set(['world', 'dual'])
: new Set(['composition', 'dual']);
const approvedByTier = new Map();
for (const concept of approved) {
const tier = approvedByTier.get(concept.wellTier) || [];
tier.push(concept);
approvedByTier.set(concept.wellTier, tier);
}
if (WELL_TIERS.some(tier => !(approvedByTier.get(tier) || []).length)) {
throw new Error('concept-seed: every challenger tier needs at least one approved concept');
}
// Optional minimum-rating gate, applied per tier and skipped for any tier it
// would empty, so a thin tier degrades to its full approved pool.
if (minRating) {
for (const [tier, pool] of approvedByTier) {
const rated = pool.filter(concept => (concept.review?.rating || 0) >= minRating);
if (rated.length > 0) approvedByTier.set(tier, rated);
}
}
// Mode eligibility, per tier and skipped where it would empty a tier. Worlds
// used to be drawn with no mode awareness at all, so a build asking for an app
// UI could get six worlds that only make sense on a landing page. A world is an
// identity and identities transfer further than compositions do, so this is a
// ceiling the reviewer sets rather than a category assignment: eligible
// everywhere until someone says otherwise.
if (mode) {
for (const [tier, pool] of approvedByTier) {View on GitHub (pinned to d14711ae3d)
Solutions
- Approve at least one concept in each missing tier (graphic, interaction, atmosphere) before re-running the roll.
- If a tier genuinely has no concepts, generate/seed concepts for it in the concept-seed step first.
- Verify concept.wellTier values are set correctly so approvals are not miscategorized.
Example fix
// before — atmosphere has no approved concept
selectApprovedChallengers({ scope: 'surface', key, concepts });
// after — approve one atmosphere concept first
const atm = concepts.find(c => c.wellTier === 'atmosphere' && c.status === 'pending');
atm.status = 'approved';
selectApprovedChallengers({ scope: 'surface', key, concepts }); Defensive patterns
Strategy: validation
Validate before calling
import { WELL_TIERS } from './lib/roll-selection.mjs';
function hasApprovedInEveryTier(concepts) {
const approved = new Set(
concepts.filter(c => c.status === 'approved').map(c => c.wellTier)
);
return WELL_TIERS.every(tier => approved.has(tier));
}
if (!hasApprovedInEveryTier(concepts)) {
// approve more concepts or seed missing tiers before rolling
throw new Error('Approve at least one concept in each tier: graphic, interaction, atmosphere');
} Type guard
function tiersCovered(concepts) {
const approved = new Set(concepts.filter(c => c.status === 'approved').map(c => c.wellTier));
return ['graphic', 'interaction', 'atmosphere'].every(t => approved.has(t));
} Prevention
- Complete the review cycle across all three tiers (graphic, interaction, atmosphere) before rolling challengers.
- Ensure every concept has a correct wellTier so approvals are counted in the right bucket.
- If a tier is empty, seed/generate concepts for it in the concept-seed step first.
When it happens
Trigger: Calling selectApprovedChallengers({ scope, key, concepts }) where the concepts array has zero approved entries in one or more of the graphic/interaction/atmosphere tiers — e.g. only graphic and interaction concepts were reviewed and approved, atmosphere was left in 'pending' or 'rejected'.
Common situations: Running a challenger roll before the concept-seed review cycle completed all three tiers; a reviewer approved concepts in two tiers and skipped the third; a filtered concept list that accidentally excluded a tier.
Related errors
- invalid catalog: ${validation.errors.join('; ')}
- 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: --register steers a re-roll round; pass --rero
AI-assisted analysis of pbakaus/impeccable@d14711ae3d (2026-08-13).
Data as JSON: /api/errors/cf000e6ac6bd93bf.
Report an issue: GitHub.