a18: concept-seed mechanism — derive grounded shortlist, script assigns build index + challengers; contract adopts UNIQUE/NOT-TEMPLATE/OWN-WORLD/STORY/FIRST-VIEWPORT

Contract-probe campaign findings (evals repo, notes/fable-oneshot-craft-plan.md):
a single model's resonance ranking is deterministic (30/35 identical
concepts across 16 framings); dice must come from the script, mirroring
the palette-seed result. Derived candidates stay grounded in the
audience's world + subject's cultural home; challengers win only on
identification x clarity; incumbent-with-deliberate-idea overrides the
roll. Validated at contract level on 01-observability + r10-lektor
(teletext ranks #3 for lektor; assigned index 3 produced it).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Paul Bakaus
2026-07-13 18:18:22 -07:00
co-authored by Claude Fable 5
parent e7ed663ecd
commit c1953a379d
3 changed files with 156 additions and 2 deletions
+71
View File
@@ -0,0 +1,71 @@
{
"_comment": "Challenger pool for concept-seed.mjs. Each entry is a culturally legible FORM — a thing people already know how to read — that can supply a page's structure. Curate freely; the script samples 3 per run. Keep entries subject-agnostic (the derivation step supplies subject-grounded candidates; these are the outside provocations).",
"printed": [
"a naturalist's field guide, with specimen plates and identification keys",
"a broadsheet newspaper's sports section, with match reports and standings tables",
"a farmer's almanac, with seasonal charts and terse forecasts",
"a museum exhibition catalog, with plates, provenance notes, and wall-label captions",
"a repair manual's exploded-parts diagrams with numbered callouts",
"an auction house catalog, with lot numbers, estimates, and condition reports",
"a cookbook's recipe pages, with mise-en-place lists and numbered steps",
"a stamp collector's album, with mounted specimens and perforation notes",
"a paperback's back cover and front matter, with blurbs and a table of contents",
"sheet music, with movements, dynamics markings, and a program note",
"a zine, hand-assembled, with cut-paper collage and typewritten columns",
"a mail-order seed catalog, with variety grids and growing-zone tables",
"a pharmacopoeia monograph, with indications, dosage tables, and contraindications",
"an atlas spread, with map plates, legends, and an index of places"
],
"instruments": [
"a mission-control status wall, with countdown clocks and go/no-go polls",
"a ship's bridge instrument panel, with engine-order telegraph and compass repeaters",
"a recording studio mixing console, with channel strips and a patch bay",
"a flight-deck checklist card, with challenge-response items and memory items",
"a seismograph station's drum recorders and event logs",
"a darkroom contact sheet, with grease-pencil markups and frame selects",
"a weather station's synoptic chart, with fronts, isobars, and station models"
],
"places_signage": [
"a metro system's map and station signage, with lines, interchanges, and wayfinding",
"an airport departures board, with rows that flip and gate calls",
"a theater's playbill and lobby cards, with cast lists and act summaries",
"a race circuit's pit wall timing screens, with sector splits and tyre stints",
"a national park trailhead kiosk, with route markers and difficulty grades",
"a harbor's tide table board and small-craft advisories",
"a library card catalog, with call numbers and cross-reference cards"
],
"records_documents": [
"a court transcript, with examination, exhibits, and a verdict",
"a ship's log, with watch entries, positions, and weather remarks",
"an expedition's field notebook, with sketches, measurements, and daily entries",
"a laboratory notebook, with dated experiments, observations, and sign-offs",
"a customs declaration and passport stamp pages",
"a title deed and property survey, with plot boundaries and easements",
"a patent filing, with numbered claims and figure sheets"
],
"broadcast_ephemera": [
"a teletext service, with page numbers, block graphics, and channel colors",
"a printed TV programme guide, with time grids and circled listings",
"a radio station's program log and request-line cards",
"a cinema's projection booth reel-change cue sheets",
"a vinyl double-album gatefold, with liner notes, track listing, and credits panel",
"a video-rental shop, with hand-labeled cassettes and membership cards",
"a shortwave radio listener's QSL card collection and frequency schedules"
],
"commerce_packaging": [
"a seed packet's front-and-back panel layout, with sowing instructions",
"a hardware store's parts drawers, with bin labels and spec cards",
"a pharmacy prescription label and patient-information leaflet",
"a matchbook and cigar-band graphics, with foil stamping and tiny type",
"a produce market's chalkboard price signs and crate-side stencils",
"a bank passbook, with ruled entries and teller stamps"
],
"games_rituals": [
"a chess annotation sheet, with move pairs and evaluation symbols",
"a bingo hall's number board and dabbed cards",
"a scorekeeper's baseball scorecard, with position numbers and inning grids",
"a tarot spread, with card positions and a reading order",
"a board game's rulebook, with setup diagrams and turn order",
"a crossword page, with grid, clues across and down, and a setter's note"
]
}
+83
View File
@@ -0,0 +1,83 @@
#!/usr/bin/env node
/**
* Concept-seed picker: the dice half of the new-work concept procedure.
*
* The model derives a grounded shortlist of candidate FORMS from the
* audience's world and the subject's cultural home (see
* reference/new-work.md). Left alone, it then always builds its #1 —
* and a single model's resonance ranking is deterministic, so every run
* in a category ships the same one or two concepts. Measured: 30/35
* identical concepts across 16 prompt framings; the model cannot roll
* its own dice.
*
* This script rolls them from outside, the same trick that made the
* palette seed work:
* - BUILD INDEX (2-5): which entry of the model's own resonance-ordered
* shortlist to build. The dice never choose an ungrounded ingredient;
* they only refuse the argmax rut. (Index 1 is excluded: that's the
* concept every run would ship anyway.)
* - CHALLENGERS (3): outside forms from concept-ingredients.json, weighed
* against the derived candidates on exactly two axes — audience
* identification and product clarity. They win only when they beat the
* grounded list; measured behavior is that they lose to strong cultural
* material and win over thin categories, which is the intended shape.
*
* Usage:
* node scripts/concept-seed.mjs # roll at random
* node scripts/concept-seed.mjs --from <key> # deterministic (hash key)
*
* Env vars:
* IMPECCABLE_CONCEPT_SEED — same as --from; for reproducible eval runs.
*/
import crypto from 'node:crypto';
import { readFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const here = dirname(fileURLToPath(import.meta.url));
const pool = JSON.parse(readFileSync(join(here, 'concept-ingredients.json'), 'utf8'));
const args = process.argv.slice(2);
const fromIdx = args.indexOf('--from');
const key = fromIdx !== -1 ? args[fromIdx + 1] : (process.env.IMPECCABLE_CONCEPT_SEED || null);
function hashUnit(k, salt) {
const h = crypto.createHash('sha256').update(`${salt}:${k}`).digest();
return h.readUInt32BE(0) / 0xffffffff;
}
const unit = (salt) => (key ? hashUnit(key, salt) : Math.random());
const buildIndex = 2 + Math.floor(unit('index') * 4); // 2..5
const entries = Object.entries(pool)
.filter(([k]) => !k.startsWith('_'))
.flatMap(([, list]) => list);
const picks = [];
const taken = new Set();
for (let i = 0; picks.length < 3 && i < 60; i++) {
const idx = Math.floor(unit(`challenger-${i}`) * entries.length) % entries.length;
if (!taken.has(idx)) {
taken.add(idx);
picks.push(entries[idx]);
}
}
process.stdout.write(`CONCEPT SEED
BUILD INDEX: ${buildIndex}
After ordering your derived candidates by resonance, build the page whose
form comes from candidate number ${buildIndex}, exactly as if it had ranked
first: full commitment. Your top-ranked candidate is what every run in this
category would ship; the assignment exists to refuse that rut, not to
punish it.
CHALLENGERS (weigh against your derived candidates on the same two axes,
audience identification and product clarity; a challenger wins only when
it beats the grounded list on both):
1. ${picks[0]}
2. ${picks[1]}
3. ${picks[2]}
If a challenger wins, it replaces the assigned candidate. If the surface is
an existing world whose incumbent carries a deliberate, ownable idea, the
incumbent IS the chosen candidate: intensify its lineage and ignore the
roll entirely.
`);