mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-14 23:26:39 +03:00
Sync generated provider output
This commit is contained in:
@@ -84,7 +84,7 @@ For `shape`, return the selected direction to [shape.md](shape.md) and stop befo
|
||||
|
||||
## 6. Build with full commitment
|
||||
|
||||
When an approved comp exists, the comp is king, and the build happens in phases. Phase one is reproduction: rebuild the comp at its own breakpoint until a screenshot at the comp's width and height overlaps it near pixel-perfectly, materials, components, elevation, assets, and implied design language included. Exactly three concessions exist: fonts (the closest obtainable face), icons (exact match unless the user already chose an icon library), and genuine defects in the generated comp such as spelling errors. Everything else must match, and models systematically believe their HTML, CSS, and SVG recreation succeeded when it did not, so the overlap comparison is the authority, never your conviction: set the screenshot beside the comp at identical dimensions after every region, and when a region keeps losing that comparison, stop recreating it in code and produce it as a rendered asset composited into the page. Only when reproduction holds does phase two begin: static regions that should live become animated or interactive, reveals and motion are added, then responsiveness across the surface's devices. Where the comp does not cover the whole surface, continue building the remainder inside the comp's recorded world and design language; a component the comp never shows inherits the recorded system's corner language, line weights, and materials, and may not introduce container styles, border weights, or chrome the comp never uses.
|
||||
When an approved comp exists, the comp is king, and the build happens in phases. Phase one is reproduction: rebuild the comp at its own breakpoint until a screenshot at the comp's width and height overlaps it near pixel-perfectly, materials, components, elevation, assets, and implied design language included. Exactly three concessions exist: fonts (the closest obtainable face), icons (exact match unless the user already chose an icon library), and genuine defects in the generated comp such as spelling errors. Everything else must match, and models systematically believe their HTML, CSS, and SVG recreation succeeded when it did not, so the overlap comparison is the authority, never your conviction: set the screenshot beside the freshly reopened comp image at identical dimensions after every region, never beside your memory of it, and when a region keeps losing that comparison, stop recreating it in code and produce it as a rendered asset composited into the page. The comp also outranks every written record of it: when the recorded brief or inventory commits to less than the comp shows, a softer texture, a sparser field, a sculpted plate reduced to flat CSS, correct the record upward to the comp; qualifiers like subtle, restrained, and low-contrast, and counts rounded down to a comfortable fraction, are how approved materials die between approval and build. A produced material must then survive to the screen: a texture buried under a nearly opaque color wash ships the wash, not the material, so judge every material by the screenshot beside the comp, never by the stylesheet. Only when reproduction holds does phase two begin: static regions that should live become animated or interactive, reveals and motion are added, then responsiveness across the surface's devices. Where the comp does not cover the whole surface, continue building the remainder inside the comp's recorded world and design language; a component the comp never shows inherits the recorded system's corner language, line weights, and materials, and may not introduce container styles, border weights, or chrome the comp never uses.
|
||||
|
||||
Build the assigned direction, not a safer interpretation of it. The form supplies structure, reading order, component conventions, and native motion; the product supplies every fact. Commit every atom: nav, buttons, inputs, and links are rebuilt in the form's vocabulary, and a stock component inside a committed form is a lapse. Land the first build fully committed; committing is the hard part, and the passes that follow exist to make the committed thing clear and effective, never to dilute it. In unattended work, the safe rendition is the known risk.
|
||||
|
||||
|
||||
@@ -96,31 +96,38 @@ function* rank(items, input, idFor = item => item.id) {
|
||||
.map(entry => entry.item);
|
||||
}
|
||||
|
||||
// Two independent exclusions, and either one is enough to hold a world back.
|
||||
// Rating grades quality: a 3-star earns a second ticket, a 1-star marginal keep
|
||||
// leaves the pool. Breadth says whether a world can serve an arbitrary build at
|
||||
// all, so a niche world leaves however good it is, keeping its approval for
|
||||
// direct briefs. Breadth was split out of rating because the only way to hold a
|
||||
// narrow world back used to be calling it marginal, which made "excellent but
|
||||
// narrow" unrecordable and corrupted ratings as a calibration signal.
|
||||
// Rating sets how many tickets a world holds; breadth decides whether it draws
|
||||
// at all. A niche world leaves the pool however good it is, keeping its approval
|
||||
// for direct briefs. Breadth was split out of rating because the only way to
|
||||
// hold a narrow world back used to be calling it marginal, which made "excellent
|
||||
// but narrow" unrecordable and corrupted ratings as a calibration signal.
|
||||
//
|
||||
// Two tickets for a 3-star, one for everything else, was too sharp. Measured
|
||||
// against the catalog as it stood: 3-star worlds absorbed 57% of the graphic
|
||||
// draw from 65 of 163 eligible worlds, 46% of atmosphere from 13 of 43, and
|
||||
// 75% of interaction from 15 of 25. The reviewer's complaint, that the same
|
||||
// worlds keep coming back, is what a rating multiplier does to a pool whose
|
||||
// thinnest tier holds 25 worlds.
|
||||
//
|
||||
// So a 3-star no longer outdraws a 2-star, and a 1-star draws at half rather
|
||||
// than not at all. A marginal keep is still worth showing sometimes: the
|
||||
// judgement it records is "narrow or unexceptional", not "wrong", and excluding
|
||||
// it entirely made a rating do a job breadth already does properly.
|
||||
const RATING_TICKETS = { 1: 1, 2: 2, 3: 2 };
|
||||
const ticketsForRating = rating => RATING_TICKETS[rating] ?? 2;
|
||||
|
||||
function challengerTickets(pool) {
|
||||
return pool.flatMap(concept => {
|
||||
const rating = concept.review?.rating;
|
||||
if (rating === 1 || concept.review?.breadth === 'niche') return [];
|
||||
return rating === 3
|
||||
? [{ concept, ticket: 0 }, { concept, ticket: 1 }]
|
||||
: [{ concept, ticket: 0 }];
|
||||
if (concept.review?.breadth === 'niche') return [];
|
||||
return Array.from({ length: ticketsForRating(concept.review?.rating) },
|
||||
(_, ticket) => ({ concept, ticket }));
|
||||
});
|
||||
}
|
||||
|
||||
function compositionTickets(pool) {
|
||||
return pool.flatMap(composition => {
|
||||
const rating = composition.review?.rating;
|
||||
if (rating === 1) return [];
|
||||
return rating === 3
|
||||
? [{ composition, ticket: 0 }, { composition, ticket: 1 }]
|
||||
: [{ composition, ticket: 0 }];
|
||||
});
|
||||
return pool.flatMap(composition => Array.from(
|
||||
{ length: ticketsForRating(composition.review?.rating) },
|
||||
(_, ticket) => ({ composition, ticket })));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user