mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-14 23:26:39 +03:00
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:
co-authored by
Claude Fable 5
parent
e7ed663ecd
commit
c1953a379d
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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.
|
||||
`);
|
||||
Reference in New Issue
Block a user