mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-11 21:57:14 +03:00
Catalog: mode-aligned staging surfaces (persuade/operate/read/experience), star ratings on approvals feeding challenger draw weights, family retirements, authoring strategy and territory guide, rework and breadth authoring rounds, composition mining from rejected worlds. Seed: six challengers (two per tier), --reroll chains, --mode staging filter, rating-weighted draws. New-work: Present/visualize/re-roll flow, image-gen requirement, register-neutral vocabulary. Pipeline: per-mode staging prompts with split frames, hero-from-board reference generation, render-safety guards. Labs: ratings UI, unrated filter, mode chips, composition approve-guard. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
41 lines
1.7 KiB
JavaScript
41 lines
1.7 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import { dirname, join } from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { readConceptCatalog, validateConceptCatalog } from './lib/concept-catalog.mjs';
|
|
import { readCompositionCatalog, validateCompositionCatalog } from './lib/composition-catalog.mjs';
|
|
|
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
const { catalog, reviewData } = readConceptCatalog(
|
|
join(here, 'concept-ingredients.json'),
|
|
join(here, 'concept-reviews.json')
|
|
);
|
|
const result = validateConceptCatalog(catalog, reviewData, { minimumTotal: 260 });
|
|
|
|
const compositionState = readCompositionCatalog(
|
|
join(here, 'composition-ingredients.json'),
|
|
join(here, 'composition-reviews.json')
|
|
);
|
|
const compositionResult = validateCompositionCatalog(compositionState.catalog, compositionState.reviewData);
|
|
|
|
let failed = false;
|
|
if (result.errors.length > 0) {
|
|
for (const error of result.errors) process.stderr.write(`concept-catalog: ${error}\n`);
|
|
failed = true;
|
|
} else {
|
|
process.stdout.write(
|
|
`concept-catalog: ${result.stats.concepts} concepts across ${result.stats.families} families in ${result.stats.wells} wells; ` +
|
|
`${result.stats.approved} approved, ${result.stats.pending} pending, ${result.stats.rejected} rejected\n`
|
|
);
|
|
}
|
|
if (compositionResult.errors.length > 0) {
|
|
for (const error of compositionResult.errors) process.stderr.write(`composition-catalog: ${error}\n`);
|
|
failed = true;
|
|
} else {
|
|
process.stdout.write(
|
|
`composition-catalog: ${compositionResult.stats.compositions} compositions across ${compositionResult.stats.families} families; ` +
|
|
`${compositionResult.stats.approved} approved, ${compositionResult.stats.rejected} rejected\n`
|
|
);
|
|
}
|
|
if (failed) process.exitCode = 1;
|