mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-11 21:57:14 +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
@@ -12,9 +12,9 @@ Name one concrete subject, its audience, and the page's single job. The subject'
|
||||
|
||||
## Decide, then build
|
||||
|
||||
Sketch three directions in one line each before choosing: they must differ in concept, not in polish. If the direction you'd instinctively ship is the one any competent studio would also reach for, it is the default wearing your name; pick the direction that is most specific to this subject and still serves the mode. <!-- rule:skill-three-directions -->
|
||||
Derive the concept with this procedure, recording each step in your reasoning before the next begins. One: state the product's unique mechanism in one sentence, the thing competitors cannot truthfully claim. Two: competitive analysis; describe the page this category always ships, and the counter-position page a contrarian ships, and treat both structures as off the table. Three: from the audience's world and the subject's cultural home, list five concrete materials, objects, documents, or rituals they know by heart, each with one line on why it resonates and can carry the mechanism, ordered by resonance. Four: run `node {{scripts_path}}/concept-seed.mjs` and follow what it prints: it assigns which candidate to build (your top-ranked candidate is what every run would ship; a single ranking is deterministic, so the dice come from outside) and supplies challenger forms to weigh against your list on exactly two axes, audience identification and product clarity. Five: the chosen form supplies the page's structure, reading order, and component conventions; the product supplies every fact. Conversion conventions are furniture inside the form, not the form: a hero that hooks in one line, a visible primary action, a legible reading order. The costume check closes the step: if a visitor would notice the form before the product, the candidate fails; take the runner-up. <!-- rule:skill-concept-procedure -->
|
||||
|
||||
Then state the chosen direction as a contract, written as a comment block at the top of the artifact (invisible to visitors, binding for you): the concept in one line; what a visitor would describe an hour after one viewport; why this page could not be the modal competitor page; the signature; and what the first viewport does instead of a generic header. If any answer is missing or reads like a mood, the direction isn't decided yet. The build is judged against this contract; delivering different pixels than the contract promises is a defect on whichever side is weaker. When a user can respond and the work is substantial, pause there for confirmation; when the harness has native image generation, follow [codex.md](codex.md)'s mock flow before code. When no user can respond, record the decision in your reasoning and proceed without pausing. Either way the decision comes first; code that precedes a direction is the template reflex in motion. <!-- rule:skill-decide-then-build -->
|
||||
Then state the chosen direction as a contract, written as a comment block at the top of the artifact (invisible to visitors, binding for you), five short blocks, two hundred words at most. UNIQUE: the one idea this page owns. NOT-TEMPLATE: how the page's structure differs from the category's standard arrangement, stated plainly and honestly. OWN-WORLD: the palette and component language, specific enough that the components and colors alone, shown without content, would be recognizable as this page's world and nobody else's. STORY: what the visitor understands, believes, and does, from first viewport to action. FIRST VIEWPORT: the exact composition, what is where and at what scale. If any block is missing or reads like a mood, the direction isn't decided yet. The build is judged against this contract; delivering different pixels than the contract promises is a defect on whichever side is weaker. When a user can respond and the work is substantial, pause there for confirmation; when the harness has native image generation, follow [codex.md](codex.md)'s mock flow before code. When no user can respond, record the decision in your reasoning and proceed without pausing. Either way the decision comes first; code that precedes a direction is the template reflex in motion. <!-- rule:skill-decide-then-build -->
|
||||
|
||||
## Plan, self-check, build
|
||||
|
||||
|
||||
@@ -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