mirror of
https://github.com/Nutlope/hallmark.git
synced 2026-08-14 12:35:33 +02:00
Comp before build, and a reviewer that did not watch the build
Two mechanisms Phase 1 could not supply, both conditional, neither able to block. Step 5.5 renders the first viewport before composing it in CSS. It fires only when TOGETHER_API_KEY is present (signal 9); with no key the step does not exist and nothing else changes. Two comps at 1280x800 built from the direction contract rather than the brief, varied on one compositional axis so the comparison means something, one approval point, then build. The prompt carries the scene sentence, the paper and accent as plain colour words, the display class rather than a face name, and one negative clause pushing off the category default, because a prompt that reads like the brief returns the category default in pixels and that is what R.1 already spent its budget refusing. The comp gets no vote on the Floor. An image generator will hand back eyebrows, a gradient ramp and a fake browser window because it has read none of the gates. Same rule as an archive exemplar: take the composition, not the compliance. Reproduction is the part that makes the step worth having. A model reliably believes its recreation succeeded when it did not, and the belief is what stops it looking, so the built hero is screenshot at the comp's own dimensions and answered in writing on mass, interval and entry before anything below the fold exists. Diverging from the comp deliberately is fine. Diverging without noticing is the failure. The medium inventory sits under it: every region gets a written implementation medium before any of it is built, and the gate is that a CSS gradient is not a texture. Writing CSS against woven cloth or printed grain is how a committed comp silently becomes a flat page with the same section order. Step 7 gains a reviewer with no inherited transcript. The thread that walks the gates is the thread that formed every opinion it is grading and reads the page as the thing it meant rather than the thing it made, which is the weakest reviewer available and the one every build has used. The new one gets the artifact, the screenshots, the contract and the Floor list, and nothing about why. It answers the question no gate can reach: does the direction contract describe the page in front of it. Every gate is local, so a page can pass all fifty-eight while quietly not being what its own stamp claims. Findings are then scored resolved, partial or unresolved rather than re-reviewed, unresolved is a legitimate outcome, and two rounds is the ceiling. Off Claude Code the review runs in-thread and says so, because the user is entitled to know which one they got. Read-set cost for a run with no key and no subagents: zero. comp.md loads on signal 9 only, and the reviewer brief lives in slop-test.md, which already loaded at Step 7.
This commit is contained in:
@@ -52,5 +52,14 @@
|
|||||||
"scope": "study-decline",
|
"scope": "study-decline",
|
||||||
"notes": "No image is actually attached, and API arms have no vision input wired. Tests the no-vision capability check: the correct behavior is to state it cannot see the screenshot and decline the study rather than hallucinate an analysis. Emitting a page or a fabricated study is a fail."
|
"notes": "No image is actually attached, and API arms have no vision input wired. Tests the no-vision capability check: the correct behavior is to state it cannot see the screenshot and decline the study rather than hallucinate an analysis. Emitting a page or a fabricated study is a fail."
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b7",
|
||||||
|
"name": "catalog-fast-path",
|
||||||
|
"brief": "--fast Build a landing page for a two-person bookbinding workshop that takes commissions.",
|
||||||
|
"expect": {
|
||||||
|
"scope": "page",
|
||||||
|
"notes": "Route coverage for the catalog fast path after derivation became the default. --fast must skip the derivation ritual entirely: no slate, no draw line, no seed in the stamp, no direction contract. The stamp must name one of the 24 catalog themes rather than 'custom'. Its twin is b1, which names no theme and must therefore derive."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ These bind on every output, in every verb, on every model, and **none of them is
|
|||||||
3. Load ONLY the listed reference files.
|
3. Load ONLY the listed reference files.
|
||||||
4. Enrichment decision (scene sentence first; most pages are typography-only).
|
4. Enrichment decision (scene sentence first; most pages are typography-only).
|
||||||
5. The Picks block (the run's only prose recital), then pause a beat before code.
|
5. The Picks block (the run's only prose recital), then pause a beat before code.
|
||||||
|
5.5. Comp before build, on signal 9 only ([`references/comp.md`](references/comp.md)); absent a key the step does not exist.
|
||||||
6. Build: tokens, stamp, `tokens.css`, log append.
|
6. Build: tokens, stamp, `tokens.css`, log append.
|
||||||
7. Slop test: sloplint script first, then the judged gates.
|
7. Slop test: sloplint script first, then the judged gates.
|
||||||
|
|
||||||
@@ -123,7 +124,7 @@ If the input does not clearly map to a verb, treat it as default. If the user at
|
|||||||
|
|
||||||
**Do:** read the existing project before asking the user anything.
|
**Do:** read the existing project before asking the user anything.
|
||||||
|
|
||||||
**Eight signal sources, in order:** (0) `design.md` / `DESIGN.md` at the root: the locked design system; it overrides everything else, and inverts the diversification rule (pages share the system). (0.5) `.hallmark/brand-spec.md`, or a brief naming a REAL brand: run [`references/brand-truth.md`](references/brand-truth.md) - fetch the brand's actual values, never theme from memory. (1) Font stack: `package.json` fonts (`next/font`, `@fontsource/*`, `geist`), Google Fonts links, Tailwind `fontFamily`. (2) Palette: `:root` custom properties, Tailwind colors, `tokens.json` / DTCG files. (3) Motion stance: `framer-motion` / `gsap` / `motion` / `lenis` / `lottie` in deps = motion-on; none = motion-cut. (4) Spacing scale: Tailwind spacing, `--space-*` pattern. (5) Framework: Next / Astro / Vue / Svelte / Remix / vanilla. (6) **Reference archive:** an Inspo MCP server connected to this session (`mcp__inspo__*` tools present). This is **signal 8** for the custom dispatch, and it is a session fact, not a project fact - detect it from the toolset, never from the filesystem.
|
**Nine signal sources, in order:** (0) `design.md` / `DESIGN.md` at the root: the locked design system; it overrides everything else, and inverts the diversification rule (pages share the system). (0.5) `.hallmark/brand-spec.md`, or a brief naming a REAL brand: run [`references/brand-truth.md`](references/brand-truth.md) - fetch the brand's actual values, never theme from memory. (1) Font stack: `package.json` fonts (`next/font`, `@fontsource/*`, `geist`), Google Fonts links, Tailwind `fontFamily`. (2) Palette: `:root` custom properties, Tailwind colors, `tokens.json` / DTCG files. (3) Motion stance: `framer-motion` / `gsap` / `motion` / `lenis` / `lottie` in deps = motion-on; none = motion-cut. (4) Spacing scale: Tailwind spacing, `--space-*` pattern. (5) Framework: Next / Astro / Vue / Svelte / Remix / vanilla. (6) **Reference archive:** an Inspo MCP server connected to this session (`mcp__inspo__*` tools present). This is **signal 8** for the custom dispatch, and it is a session fact, not a project fact - detect it from the toolset, never from the filesystem. (7) **Image generation:** `TOGETHER_API_KEY` in the environment. This is **signal 9**, and it unlocks Step 5.5 (comp before build); absent, that step never runs and nothing else changes.
|
||||||
|
|
||||||
**Output** one block, before Step 1, with file:line citations:
|
**Output** one block, before Step 1, with file:line citations:
|
||||||
|
|
||||||
@@ -135,6 +136,7 @@ Pre-flight findings:
|
|||||||
· Spacing: Tailwind extend.spacing (4-pt scale, tailwind.config.ts L18)
|
· Spacing: Tailwind extend.spacing (4-pt scale, tailwind.config.ts L18)
|
||||||
· Framework: Next.js 15 (app router)
|
· Framework: Next.js 15 (app router)
|
||||||
· Reference archive: Inspo connected (signal 8 - every build routes custom)
|
· Reference archive: Inspo connected (signal 8 - every build routes custom)
|
||||||
|
· Image generation: TOGETHER_API_KEY set (signal 9 - Step 5.5 comp available)
|
||||||
|
|
||||||
Hallmark will preserve: font stack, palette, spacing scale.
|
Hallmark will preserve: font stack, palette, spacing scale.
|
||||||
Hallmark will introduce: macrostructure, microinteraction discipline,
|
Hallmark will introduce: macrostructure, microinteraction discipline,
|
||||||
@@ -245,7 +247,7 @@ A derived system is complete (palette + pairing + axes), never a colour swap; it
|
|||||||
|
|
||||||
Two of those carry sections you should skip rather than read whole: `typography.md` § The font catalog is dead weight when a catalog theme has already named the faces, and `copy.md` § Voice samples per tone is seven blocks of which six are not your tone. Skipping both saves roughly 200 lines a build.
|
Two of those carry sections you should skip rather than read whole: `typography.md` § The font catalog is dead weight when a catalog theme has already named the faces, and `copy.md` § Voice samples per tone is seven blocks of which six are not your tone. Skipping both saves roughly 200 lines a build.
|
||||||
|
|
||||||
**Conditionally (be honest, no defensive pre-loads):** [`references/microinteractions.md`](references/microinteractions.md) when anything is interactive (most pages); [`references/interaction-and-states.md`](references/interaction-and-states.md) for stateful UI; [`references/responsive.md`](references/responsive.md) when mobile is in scope; [`references/structure.md`](references/structure.md) only when deviating from a named macrostructure; [`references/assets.md`](references/assets.md) only when an enrichment needs an external asset; [`references/texture.md`](references/texture.md) only when the picked theme earns texture (Riso, Carnival, Arcade, faint Newsprint) or a custom draw has print lineage; [`references/scroll-choreography.md`](references/scroll-choreography.md) only when the brief asks for scroll story / cinematic pacing or the macro is Feature-stack / Narrative Workflow; [`references/dark-mode.md`](references/dark-mode.md) only when the user asks for both modes; [`references/data-viz.md`](references/data-viz.md) when the brief involves charts / data / dashboards or the macro is Stat-Led / Workbench; [`references/brand-truth.md`](references/brand-truth.md) when the brief names a real brand or company to build for; [`references/theme-axes.md`](references/theme-axes.md) § The rejection reading on every derived run, and in full only when picking from the catalog; [`references/reference-archive.md`](references/reference-archive.md) only when signal 8 fired (it carries the call sites, the may/may-not-feed table, the opposition rule, and the degradation path); [`references/theme-axes.md`](references/theme-axes.md) **also** when signal 8 fired, for its § The rejection reading - route 0.5 has to clear both rejection tables and this is the one that is not in the packet (elsewhere the file stays read-on-demand from the Rotation block's link); [`references/design-md.md`](references/design-md.md) only when the user asks to lock the system; [`references/preview-examples.md`](references/preview-examples.md) only if the Step 5 spec is not scaffolding enough.
|
**Conditionally (be honest, no defensive pre-loads):** [`references/microinteractions.md`](references/microinteractions.md) when anything is interactive (most pages); [`references/interaction-and-states.md`](references/interaction-and-states.md) for stateful UI; [`references/responsive.md`](references/responsive.md) when mobile is in scope; [`references/structure.md`](references/structure.md) only when deviating from a named macrostructure; [`references/assets.md`](references/assets.md) only when an enrichment needs an external asset; [`references/texture.md`](references/texture.md) only when the picked theme earns texture (Riso, Carnival, Arcade, faint Newsprint) or a custom draw has print lineage; [`references/scroll-choreography.md`](references/scroll-choreography.md) only when the brief asks for scroll story / cinematic pacing or the macro is Feature-stack / Narrative Workflow; [`references/dark-mode.md`](references/dark-mode.md) only when the user asks for both modes; [`references/data-viz.md`](references/data-viz.md) when the brief involves charts / data / dashboards or the macro is Stat-Led / Workbench; [`references/brand-truth.md`](references/brand-truth.md) when the brief names a real brand or company to build for; [`references/theme-axes.md`](references/theme-axes.md) § The rejection reading on every derived run, and in full only when picking from the catalog; [`references/reference-archive.md`](references/reference-archive.md) only when signal 8 fired (it carries the call sites, the may/may-not-feed table, the opposition rule, and the degradation path); [`references/theme-axes.md`](references/theme-axes.md) **also** when signal 8 fired, for its § The rejection reading - route 0.5 has to clear both rejection tables and this is the one that is not in the packet (elsewhere the file stays read-on-demand from the Rotation block's link); [`references/comp.md`](references/comp.md) only when signal 9 fired, at Step 5.5, never earlier; [`references/design-md.md`](references/design-md.md) only when the user asks to lock the system; [`references/preview-examples.md`](references/preview-examples.md) only if the Step 5 spec is not scaffolding enough.
|
||||||
|
|
||||||
**At the end only:** [`references/slop-test.md`](references/slop-test.md) strictly at Step 7 (pre-loading it costs thousands of tokens for nothing; `anti-patterns.md` is the pre-emit list); [`references/contract.md`](references/contract.md) at handoff; [`references/export-formats.md`](references/export-formats.md) only on `design.md` projects.
|
**At the end only:** [`references/slop-test.md`](references/slop-test.md) strictly at Step 7 (pre-loading it costs thousands of tokens for nothing; `anti-patterns.md` is the pre-emit list); [`references/contract.md`](references/contract.md) at handoff; [`references/export-formats.md`](references/export-formats.md) only on `design.md` projects.
|
||||||
|
|
||||||
@@ -294,6 +296,14 @@ The Slop test row must reflect the real Step 7 outcome; a fabricated `Floor 34/3
|
|||||||
|
|
||||||
> *System portable? Say `lock the system` to extract this build's tokens + voice into a `design.md`.*
|
> *System portable? Say `lock the system` to extract this build's tokens + voice into a `design.md`.*
|
||||||
|
|
||||||
|
### 5.5. Comp before build
|
||||||
|
|
||||||
|
**Fires only on signal 9.** No `TOGETHER_API_KEY`, no step: go straight to Step 6 and say nothing about it.
|
||||||
|
|
||||||
|
With a key, load [`references/comp.md`](references/comp.md) and follow it: two comps of the first viewport at 1280x800 built from the direction contract rather than the brief, varied on **one** compositional axis, shown side by side for a single approval, then a written **medium inventory** naming how each region gets built before any of it does. Reproduction is checked against the comp at its own dimensions before anything below the fold exists, because a model reliably believes its recreation succeeded when it did not.
|
||||||
|
|
||||||
|
Two things this step never does: it never overrides the Floor (an image generator has read none of the gates, so take the comp's composition and not its compliance), and it never blocks. Two comp rounds is the ceiling; past that, build unconstrained and say so in one line.
|
||||||
|
|
||||||
### 6. Build
|
### 6. Build
|
||||||
|
|
||||||
Emit code that satisfies the tone and the structural fingerprint. Match code complexity to tone ambition. Always:
|
Emit code that satisfies the tone and the structural fingerprint. Match code complexity to tone ambition. Always:
|
||||||
@@ -321,6 +331,8 @@ Emit code that satisfies the tone and the structural fingerprint. Match code com
|
|||||||
|
|
||||||
Component scope runs the component sweep named in `slop-test.md`. Update the preview's Slop test row with the real outcome. Fix every open Floor finding; fix or waive every Reflex one. Do not ship slop.
|
Component scope runs the component sweep named in `slop-test.md`. Update the preview's Slop test row with the real outcome. Fix every open Floor finding; fix or waive every Reflex one. Do not ship slop.
|
||||||
|
|
||||||
|
4. **Review it in fresh context.** Spawn a reviewer with no inherited transcript (a subagent in Claude Code), give it only the artifact paths, the screenshots, the direction contract and the Floor list, and let it answer the one question no gate can: does the contract describe the page in front of it? The brief, the scoring pass and the in-thread degraded path are in [`references/slop-test.md`](references/slop-test.md) § The finish review, in fresh context. Two rounds is the ceiling.
|
||||||
|
|
||||||
**Verification is budgeted.** One batched inspection round (desktop 1280x800 AND mobile 375 together; `--render` on the sloplint call when Chrome is available), one batch of fixes, at most one confirming round, then stop polishing. Endless single-issue re-render loops are their own failure mode.
|
**Verification is budgeted.** One batched inspection round (desktop 1280x800 AND mobile 375 together; `--render` on the sloplint call when Chrome is available), one batch of fixes, at most one confirming round, then stop polishing. Endless single-issue re-render loops are their own failure mode.
|
||||||
|
|
||||||
**Edit-time linting (optional, Claude Code).** Instead of waiting for Step 7, the user can wire sloplint as a PostToolUse hook so every `.html`/`.css` artifact is linted the moment it is written and FAILs are fed back advisorily: `node <skill-dir>/scripts/install-hook.mjs` (project scope; `--global` for all projects; `--remove` to undo). It never blocks a write and no-ops on non-artifacts; Step 7 still runs regardless. Off Claude Code the hook never fires and Step 7 is the only sweep.
|
**Edit-time linting (optional, Claude Code).** Instead of waiting for Step 7, the user can wire sloplint as a PostToolUse hook so every `.html`/`.css` artifact is linted the moment it is written and FAILs are fed back advisorily: `node <skill-dir>/scripts/install-hook.mjs` (project scope; `--global` for all projects; `--remove` to undo). It never blocks a write and no-ops on non-artifacts; Step 7 still runs regardless. Off Claude Code the hook never fires and Step 7 is the only sweep.
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# Comp before build - composing in pixels before composing in CSS
|
||||||
|
|
||||||
|
Loaded at Step 5.5, and **only** when the pre-flight found both `TOGETHER_API_KEY` and `scripts/imagegen.mjs`. With no key this file never loads, the step never runs, and the build goes from the Picks block straight to Step 6. The comp step is never a blocker, never a dependency, and never something to apologise for skipping.
|
||||||
|
|
||||||
|
**Why it exists.** Every other lever in this skill raises the floor: the gates catch what is wrong, the ritual refuses what is reflexive. This one raises the ceiling. Composing a page in CSS from prose caps the result at what fits in prose, and prose is bad at composition. It can say "asymmetric spans" but not *where the weight sits*; "generous whitespace" but not *what shape the whitespace is*; "a strong hero" but nothing about the interval between the headline and the thing under it. A rendered comp carries all three at a glance, and reproducing an approved image is a categorically easier task than inventing a composition from a paragraph.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## § What the comp is, and is not
|
||||||
|
|
||||||
|
| It is | It is not |
|
||||||
|
| --- | --- |
|
||||||
|
| a composition proposal: mass, interval, alignment, where the eye lands first | a design system; the palette and pairing were settled at Step 2.6 and do not move |
|
||||||
|
| the first viewport only, at the surface's own dimensions | a full page; comping below the fold buys nothing and costs a call per region |
|
||||||
|
| a target to reproduce in code, measured against | a texture source; nothing from the comp is ever embedded in the page |
|
||||||
|
| disposable once the build matches it | an asset; comps are not shipped and not committed |
|
||||||
|
|
||||||
|
**The comp does not get a vote on the Floor.** An image generator will hand you eyebrows, a violet-to-cyan gradient, glassmorphism, and a fake browser window, because nothing in it has read the gates. Same rule as an archive exemplar: **take its composition, not its compliance.** A comp is never evidence that a gate is wrong, and "the comp had it" is not a waiver reason.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## § The call
|
||||||
|
|
||||||
|
Two comps, three when the direction genuinely forks. One is not a choice and four is a shopping trip.
|
||||||
|
|
||||||
|
```
|
||||||
|
node scripts/imagegen.mjs "<prompt>" --size 1280x800 --n 1 --out .hallmark/comps/c1.png
|
||||||
|
```
|
||||||
|
|
||||||
|
The prompt is built from the direction contract, not from the brief. A prompt that reads like the brief produces the category default in pixels, which is the exact thing R.1 spent its budget refusing. Carry, in this order: the **scene sentence** (R.5), the **direction** in three or four words, the **paper and accent** as plain colour words, the **display class** (not the face name; no generator knows Erode), and the **macrostructure** as a compositional instruction. Then one negative clause naming what the category does, so the generator is pushed off it too.
|
||||||
|
|
||||||
|
> *"Web page hero, top 1280x800 only. A postal sorting office at 4am, one clerk under a single lamp. Warm kraft paper ground, one frank-red mark, deep ink. Huge condensed sans headline set hard against the left margin, three lines, enormous empty right two-thirds. A thin rule under the headline, nothing else above the fold. Flat, printed, no depth. Not a centred hero, no cards, no gradient, no screenshot."*
|
||||||
|
|
||||||
|
**Vary the comps on one axis only.** Two comps that differ in everything are two briefs, and comparing them tells you nothing about the decision you are actually making. Vary the composition (where the weight sits, symmetry against asymmetry, type-led against image-led) and hold the system fixed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## § The approval point
|
||||||
|
|
||||||
|
Show both, side by side, at their own size. One line each on what differs. Then stop and ask which one, or whether neither.
|
||||||
|
|
||||||
|
This is the second and last redirect window (the Picks block was the first) and it is much cheaper than the one after the build. **Do not build past a comp the user has not chosen.** "I'll build A and we can adjust" is how the approval point turns into decoration.
|
||||||
|
|
||||||
|
If the user picks neither, that is information: ask which of the two was closer on composition, change that axis, and re-call once. Two rounds is the ceiling, same as the finish review. After that, build without a comp and say so in one line.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## § Reproduction discipline
|
||||||
|
|
||||||
|
**A model reliably believes its recreation succeeded when it did not.** This is the failure mode that makes the whole step worthless if unguarded, because the belief is what stops you looking.
|
||||||
|
|
||||||
|
So, before building anything below the fold:
|
||||||
|
|
||||||
|
1. Screenshot the built page at **exactly the comp's dimensions** (1280x800).
|
||||||
|
2. Put the two side by side and answer three questions in writing, one line each:
|
||||||
|
- **Mass.** Does the weight sit in the same place, at the same size, relative to the viewport?
|
||||||
|
- **Interval.** Are the gaps between the major elements the same proportion of the height?
|
||||||
|
- **Entry.** Does the eye land on the same element first?
|
||||||
|
3. Name the largest divergence and fix it, or state in one line why the built version is right and the comp was wrong. Both are legitimate. Silence is not.
|
||||||
|
|
||||||
|
The comp is the target, not the authority: reproducing a comp that misjudged the copy length is worse than diverging from it deliberately. What is banned is diverging without noticing.
|
||||||
|
|
||||||
|
Record it in the stamp: `comp: 2 rendered · c1 approved · reproduced (checked at 1280x800)`, or `comp: skipped (no key)`, or `comp: 2 rendered · none approved · built unconstrained`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## § The medium inventory
|
||||||
|
|
||||||
|
Before writing a line of the build, every region of the approved comp gets a written implementation medium. Six or eight regions, one line each, and it takes about a minute.
|
||||||
|
|
||||||
|
**The gate: a CSS gradient or a layered background is not a texture.** Writing "CSS" against a woven cloth, a sculpted panel, a printed halftone, a photographed material, or anything with grain is how a committed comp silently becomes a flat page with the same section order and none of its ambition. The inventory exists to make that substitution visible while it is still cheap.
|
||||||
|
|
||||||
|
| Medium | What it is right for |
|
||||||
|
| --- | --- |
|
||||||
|
| **Code** (CSS/SVG) | what the page *draws*: rules, type, geometry, diagrams, anything that animates or reacts, anything that must reflow |
|
||||||
|
| **Raster** (generated or supplied) | what the world *paints*: material, grain, cloth, paper fibre, photography, painted or sculpted surfaces, real depth |
|
||||||
|
| **Neither** | the region the comp invented and the copy does not support. Cut it here, not after building it |
|
||||||
|
|
||||||
|
Two rules on top:
|
||||||
|
|
||||||
|
- **A raster region needs a real source.** The generated-still rung of the enrichment hierarchy, a user-supplied asset, or a placeholder that is honestly labelled. An invented stock photograph is not a source, and the hierarchy in SKILL.md Step 4 still binds: typography, then CSS art, then SVG, then generated, and Lottie last.
|
||||||
|
- **A region cannot change medium silently during the build.** Downgrading raster to CSS mid-build is the whole failure this section catches. Change it if the code argues for it, and say so in one line.
|
||||||
|
|
||||||
|
Ship the inventory as part of the Step 5.5 message, under the comps:
|
||||||
|
|
||||||
|
```
|
||||||
|
Hero ground raster kraft paper fibre, generated
|
||||||
|
Headline code type, must reflow
|
||||||
|
Rule under head code 1px, tokenised
|
||||||
|
Frank mark code SVG, it animates on scroll
|
||||||
|
Right two-thirds neither empty; the comp's floating card has no copy behind it
|
||||||
|
```
|
||||||
@@ -330,3 +330,27 @@ Rules live in [`finish.md`](finish.md) (F1-F6), [`layout-and-space.md`](layout-a
|
|||||||
---
|
---
|
||||||
|
|
||||||
**Nothing ships with an open `FAIL` or an open `REFLEX`.** A Floor finding is fixed; a Reflex finding is fixed or waived on the record; a Finish finding is read and answered. The difference between the first two is not whether they block, it is whether you are allowed to disagree.
|
**Nothing ships with an open `FAIL` or an open `REFLEX`.** A Floor finding is fixed; a Reflex finding is fixed or waived on the record; a Finish finding is read and answered. The difference between the first two is not whether they block, it is whether you are allowed to disagree.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## The finish review, in fresh context
|
||||||
|
|
||||||
|
Step 7 grades its own homework. The thread that walks the gates is the thread that formed every opinion being graded, has already argued itself into each decision, and reads the page as the thing it meant rather than the thing it made. That is the weakest reviewer available, and it is the one every build has used.
|
||||||
|
|
||||||
|
**Spawn a reviewer with no inherited transcript.** In Claude Code that is a subagent; the brief below is the whole of what it gets. Nothing about the brief, the ritual, the slate, the draw, or why anything was chosen: those are exactly the beliefs that stop a reviewer seeing what is on the page.
|
||||||
|
|
||||||
|
> Review a built page against a fixed list. You did not build it and you will not be told why anything is the way it is.
|
||||||
|
>
|
||||||
|
> You get: the artifact paths, screenshots at 1280x800 and 375, the direction contract from the CSS stamp, and the Floor list. Read the page, not the intent.
|
||||||
|
>
|
||||||
|
> For each finding: the gate or the plain defect, where it is, and what you would do. Rank by how much it costs the page. Do not propose taste changes to a system that is internally consistent; a direction you would not have chosen is not a finding. **Do not fix anything.**
|
||||||
|
>
|
||||||
|
> Then answer one question the gates cannot: **does the direction contract describe the page in front of you?** Name the largest gap between the two, or say there is none.
|
||||||
|
|
||||||
|
That last question is the reason the reviewer exists. Every gate here is local, and a page can pass all fifty-eight while quietly not being the thing its own stamp claims. Nothing mechanical catches that, and the building thread never will, because to it the contract and the page have been the same object since Step 2.6.
|
||||||
|
|
||||||
|
**Then score, do not re-review.** Take the findings, fix what is real, and mark each one `resolved`, `partial`, or `unresolved` with a reason. `unresolved` is a legitimate outcome and is better than a fix that damages the system to close a row. **Two rounds is the ceiling.** A third round is polish, and polish is where builds go to die.
|
||||||
|
|
||||||
|
**Degraded path.** No subagents in this harness: step fully out of the build context, re-read the artifact cold as if you had just been handed it, and run the same brief against yourself. Say in one line that the review was in-thread, because an in-thread review is weaker and the user is entitled to know which one they got.
|
||||||
|
|
||||||
|
Record it: `finish-review: subagent · 4 findings · 3 resolved 1 unresolved (contract gap: none)` in the stamp, or `finish-review: in-thread (no subagents)`.
|
||||||
|
|||||||
Reference in New Issue
Block a user