Skill Tracer
Skills › HyperFrames › hyperframes-registry › component-quality-bar.md

component-quality-bar.md

250 lines · skills/hyperframes-registry/references/component-quality-bar.md at a595755

Open on GitHub
1# Component quality bar
2
3What a catalog component has to be for us to keep shipping it. Every criterion here comes from a
4defect found and verified on this branch, not from taste.
5
6A registry component is a motion primitive an author installs into their own composition and
7ships. The catalog page is marketing; the installed file is the product. Every criterion below is
8therefore evaluated against **the item's own `<name>.html`, mounted alone**, never against
9`demo.html` and never against the catalog page, because both of those carry scaffolding the author
10does not receive.
12Read this before auditing, scoring or cutting anything. It exists so several people auditing in
13parallel reach the same verdict on the same item.

Component quality bar

What a catalog component has to be for us to keep shipping it. Every criterion here comes from a defect found and verified on this branch, not from taste.

A registry component is a motion primitive an author installs into their own composition and ships. The catalog page is marketing; the installed file is the product. Every criterion below is therefore evaluated against **the item's own <name>.html, mounted alone**, never against demo.html and never against the catalog page, because both of those carry scaffolding the author does not receive.

Read this before auditing, scoring or cutting anything. It exists so several people auditing in parallel reach the same verdict on the same item.

Raw lines 1 to 14
15## The one rule
17> An item earns its place when the file the author installs, mounted by itself on the ground it
18> was designed for, renders the subject its name promises and moves the way its description says.
19> Anything that fails that and cannot be fixed into something no other item already does is cut.

The one rule

An item earns its place when the file the author installs, mounted by itself on the ground it was designed for, renders the subject its name promises and moves the way its description says. Anything that fails that and cannot be fixed into something no other item already does is cut.
Raw lines 15 to 20
21## How an audit runs
23Two passes, in this order. The mechanical pass is free and runs across every item in seconds; the
24visual pass costs a browser and eyes, so it is spent only on what the mechanical pass could not
25decide. A mechanical signal is a **candidate**, never a verdict.
27| Pass | Cost | Decides |
28| -------------- | -------------- | ---------------------------------------------------------------------------------------- |
29| **Mechanical** | grep and hash | duplicates, missing timeline, banned hexes, empty markup, name gaps, unbounded variables |
30| **Visual** | render and eye | renders at all, implements its description, legible, deterministic |
32`hyperframes check` is not a visual gate. It passes compositions that render nothing: a blank plot
33produces no error, no warning and no layout finding, because an empty render is a valid render. No
34criterion below may rest on `check` alone.

How an audit runs

Two passes, in this order. The mechanical pass is free and runs across every item in seconds; the visual pass costs a browser and eyes, so it is spent only on what the mechanical pass could not decide. A mechanical signal is a candidate, never a verdict.

PassCostDecides
Mechanicalgrep and hashduplicates, missing timeline, banned hexes, empty markup, name gaps, unbounded variables
Visualrender and eyerenders at all, implements its description, legible, deterministic

hyperframes check is not a visual gate. It passes compositions that render nothing: a blank plot produces no error, no warning and no layout finding, because an empty render is a valid render. No criterion below may rest on check alone.

Raw lines 21 to 35
36### The mount harness
38Three ways to get a false verdict from a working item, all of them the harness's fault. Build the
39shell like this or the audit invents defects.
411. **Two shapes of item, two ways to mount.** If the file, with HTML comments stripped, contains a
42 `data-composition-id`, it is a sub-composition: mount it with
43 `data-composition-src="./<name>.html"` on a clip. If it does not, it is a snippet: paste it
44 inline inside a `class="clip"` div. Inlining a sub-composition nests a document in a document
45 and renders black, which reads exactly like a dead item.
462. **Use the item's own ground.** Take the background off its `demo.html` body rule. A snippet
47 whose ink defaults to `#18181b` is a 16:1 headline on its own `#f7f7f8` and an invisible 1.5:1
48 smudge on a dark stage. The stage is not evidence.
493. **Load GSAP and register a paused root timeline**, then snapshot with
50 `hyperframes snapshot . --at 0.05,1.2,2.5,4.0 --no-end` and read the contact sheet.
52An item whose own `data-duration` is shorter than the shell's will be blank in the last frames.
53That is arithmetic, not a defect.

The mount harness

Three ways to get a false verdict from a working item, all of them the harness's fault. Build the shell like this or the audit invents defects.

  1. Two shapes of item, two ways to mount. If the file, with HTML comments stripped, contains a data-composition-id, it is a sub-composition: mount it with data-composition-src="./<name>.html" on a clip. If it does not, it is a snippet: paste it inline inside a class="clip" div. Inlining a sub-composition nests a document in a document and renders black, which reads exactly like a dead item.
  2. Use the item's own ground. Take the background off its demo.html body rule. A snippet whose ink defaults to #18181b is a 16:1 headline on its own #f7f7f8 and an invisible 1.5:1 smudge on a dark stage. The stage is not evidence.
  3. Load GSAP and register a paused root timeline, then snapshot with hyperframes snapshot . --at 0.05,1.2,2.5,4.0 --no-end and read the contact sheet.

An item whose own data-duration is shorter than the shell's will be blank in the last frames. That is arithmetic, not a defect.

Raw lines 36 to 54
55## Fatal, cut the item
57Fatal means there is nothing worth keeping underneath the defect: no edit short of writing a
58different item fixes it, or the fix produces something the catalog already ships. Cite the named
59evidence; a fatal verdict without it does not count.
61**F1. Does not implement its own description.** The markup contains no trace of the subject the
62item is named and described for. Not "renders badly", but "the thing is absent from the file".
63`ecosystem-constellation`, `hero-device-assemble` and `terminal-to-browser-deploy` are the same
64file holding empty card divs with different headings.
65_Check:_ read the markup, then swap the name for any other item's name. If nothing in the file
66would have to change, the name is a label on a generic shell.
67_Evidence:_ the named subject has no element (no nodes in a constellation, no terminal in a
68terminal deploy).
70**F2. Redundant duplicate.** Same **motion fingerprint** and same **markup skeleton** as another
71item that survives. Fingerprint is the gsap call list with selectors neutralised, keeping props,
72durations and eases; skeleton is the tag sequence with classes and text stripped. One wipe
73currently ships eight times with the same properties, durations and easings; one word-stagger
74ships seven times.
75_Evidence:_ both hashes match a sibling, and the sibling wins the tie-break below.
77**F3. Renders nothing.** Frames are blank, or the named subject never appears, with the item
78mounted correctly on its own ground and its recipe applied.
79_Evidence:_ four blank frames plus the cause, in the item rather than the harness: a missing
80sibling asset, a `ReferenceError` in the console, a subject that never enters the viewport. A
81frame-capture artifact that renders correctly live is a false alarm, so confirm on a real page
82before recording it.
84**F4. The description is a different item.** The frames show the promised event never happening: a
85wipe that never reveals its second panel, a chart that draws no series. Not a wording gap.
87**F5. Cannot be made seekable.** Frame N genuinely depends on frame N-1 with no closed form and no
88bounded replay, and making it seekable would make it a different effect. Rare. Most accumulators
89have a trivial rewrite, so reach for this only after establishing there is none; a seeded,
90index-derived replacement for `Math.random()` is X7, not F5.
91_Evidence:_ two snapshots of the same timestamp reached by different seek paths differ.

Fatal, cut the item

Fatal means there is nothing worth keeping underneath the defect: no edit short of writing a different item fixes it, or the fix produces something the catalog already ships. Cite the named evidence; a fatal verdict without it does not count.

F1. Does not implement its own description. The markup contains no trace of the subject the item is named and described for. Not "renders badly", but "the thing is absent from the file". ecosystem-constellation, hero-device-assemble and terminal-to-browser-deploy are the same file holding empty card divs with different headings. Check: read the markup, then swap the name for any other item's name. If nothing in the file would have to change, the name is a label on a generic shell. Evidence: the named subject has no element (no nodes in a constellation, no terminal in a terminal deploy).

F2. Redundant duplicate. Same motion fingerprint and same markup skeleton as another item that survives. Fingerprint is the gsap call list with selectors neutralised, keeping props, durations and eases; skeleton is the tag sequence with classes and text stripped. One wipe currently ships eight times with the same properties, durations and easings; one word-stagger ships seven times. Evidence: both hashes match a sibling, and the sibling wins the tie-break below.

F3. Renders nothing. Frames are blank, or the named subject never appears, with the item mounted correctly on its own ground and its recipe applied. Evidence: four blank frames plus the cause, in the item rather than the harness: a missing sibling asset, a ReferenceError in the console, a subject that never enters the viewport. A frame-capture artifact that renders correctly live is a false alarm, so confirm on a real page before recording it.

F4. The description is a different item. The frames show the promised event never happening: a wipe that never reveals its second panel, a chart that draws no series. Not a wording gap.

F5. Cannot be made seekable. Frame N genuinely depends on frame N-1 with no closed form and no bounded replay, and making it seekable would make it a different effect. Rare. Most accumulators have a trivial rewrite, so reach for this only after establishing there is none; a seeded, index-derived replacement for Math.random() is X7, not F5. Evidence: two snapshots of the same timestamp reached by different seek paths differ.

Raw lines 55 to 92
93## Fixable, keep and repair
95Real defects, but the item has a reason to exist that nothing else covers and the repair is
96bounded. Log the specific fix, never "needs polish".
98**X1. No timeline of its own.** No `__timelines` registration, so the installed artifact renders a
99still frame while the catalog page looks fine, because the generator transplants the demo's
100timeline into the preview. 97 of the 213 new components are in this state.
101_Repair:_ fold the trailing `Timeline integration:` recipe into a real `<script>` that builds a
102paused timeline and registers it. Roughly 10 to 15 minutes for a single-element item.
103_Escalates to fatal_ only when there is no motion anywhere to fold in, which usually means F1 too.
105**X2. Name claims a technique the code lacks.** Grep the code region, never the doc header: the
106header's prose is full of the exact words you are looking for, and will report a match on an item
107that has none.
108| Name pattern | Must contain |
109| -------------------------------- | -------------------------------------------------- |
110| `spring-*` | `elastic`, `back.`, `bounce` or a custom spring ease |
111| `mask-*`, `*-mask*` | `mask` or `clip-path` |
112| `frosted*`, `*glass*` | `backdrop-filter` |
113| `*3d*`, `*depth*`, `*orbit*`, `*camera*` | `perspective`, `rotateX`, `rotateY`, `translateZ` |
114| `*-draw`, `*-trace`, `*stroke*` | `stroke-dash` or `pathLength` |
115_Repair:_ add the technique, or rename the item. Renaming is often the honest fix.
117**X3. Illegible.** At 1920x1080 on its own ground: text under 4.5:1, or a subject whose smallest
118meaningful feature is under about 24px.
119_Repair:_ one value step, per `placeholder-material.md`. Text never sits below L1.
121**X4. Placeholder gradients.** The purple and blue palette standing in for content.
122_Repair:_ the monochrome ramp. Already done across the catalog, so a new instance is a regression,
123not a legacy defect.
125**X5. Hardcoded ink, no theme token.** A literal colour on the item's own text or subject with no
126`var(--...)` fallback chain, so it disappears when an author drops it on the opposite theme.
127_Repair:_ route it through the theme token with the literal as fallback.
129**X6. No markup of its own.** The file is a `<style>` and a `<script>` and nothing else, so
130mounting it renders an empty box.
131_Repair:_ ship sample markup, or declare it an attachment snippet in `registry-item.json` and give
132the demo a host element.
134**X7. Unseeded randomness.** Scatter derived from `Math.random()` rather than the element index.
135_Repair:_ derive from the index.
137**X8. Declared bounds it cannot honour.** A number variable with no `min`/`max`, so the control
138offers values the item cannot express, or a default it can never return to.
139_Repair:_ declare real bounds, or use a numeric field instead of a slider.

Fixable, keep and repair

Real defects, but the item has a reason to exist that nothing else covers and the repair is bounded. Log the specific fix, never "needs polish".

X1. No timeline of its own. No __timelines registration, so the installed artifact renders a still frame while the catalog page looks fine, because the generator transplants the demo's timeline into the preview. 97 of the 213 new components are in this state. Repair: fold the trailing Timeline integration: recipe into a real <script> that builds a paused timeline and registers it. Roughly 10 to 15 minutes for a single-element item. Escalates to fatal only when there is no motion anywhere to fold in, which usually means F1 too.

X2. Name claims a technique the code lacks. Grep the code region, never the doc header: the header's prose is full of the exact words you are looking for, and will report a match on an item that has none.

Name patternMust contain
spring-*elastic, back., bounce or a custom spring ease
mask-*, *-mask*mask or clip-path
frosted*, *glass*backdrop-filter
*3d*, *depth*, *orbit*, *camera*perspective, rotateX, rotateY, translateZ
*-draw, *-trace, *stroke*stroke-dash or pathLength

Repair: add the technique, or rename the item. Renaming is often the honest fix.

X3. Illegible. At 1920x1080 on its own ground: text under 4.5:1, or a subject whose smallest meaningful feature is under about 24px. Repair: one value step, per placeholder-material.md. Text never sits below L1.

X4. Placeholder gradients. The purple and blue palette standing in for content. Repair: the monochrome ramp. Already done across the catalog, so a new instance is a regression, not a legacy defect.

X5. Hardcoded ink, no theme token. A literal colour on the item's own text or subject with no var(--...) fallback chain, so it disappears when an author drops it on the opposite theme. Repair: route it through the theme token with the literal as fallback.

X6. No markup of its own. The file is a <style> and a <script> and nothing else, so mounting it renders an empty box. Repair: ship sample markup, or declare it an attachment snippet in registry-item.json and give the demo a host element.

X7. Unseeded randomness. Scatter derived from Math.random() rather than the element index. Repair: derive from the index.

X8. Declared bounds it cannot honour. A number variable with no min/max, so the control offers values the item cannot express, or a default it can never return to. Repair: declare real bounds, or use a numeric field instead of a slider.

Raw lines 93 to 140
141## Duplicates, which one survives
143A group is the set of items sharing both hashes from F2. Exactly one survives, chosen in order:
1451. **The one whose name describes what the shared motion actually does.** A group where one member
146 is a directional wipe and the rest borrowed it keeps the directional wipe.
1472. **Then the one with subject-specific markup.** More elements that only make sense for that
148 name, not more elements.
1493. **Then the one already on `origin/main`.** Removing a shipped item breaks installs.
1504. **Never a member whose name claims something the shared implementation does not do.**
151 `frosted-glass-wipe` has no `backdrop-filter`, `spring-scale-in` has no spring, `mask-reveal-up`
152 has no mask, so none of those three is the survivor. Such a member is F2 and X2 at once, and X2
153 cannot be fixed without breaking the group. If no member is honest, keep the plainest name.
155**If every member of a group fails F1, the group is cut entire.** Do not preserve a survivor to
156soften the count. Twelve names on one empty card shell is one bad item, not twelve, and keeping one
157of them keeps the bad item.
159Same motion with genuinely different subjects is not a duplicate. A bar chart, a line chart and a
160dashboard populate can share a stagger; the subject is the item.

Duplicates, which one survives

A group is the set of items sharing both hashes from F2. Exactly one survives, chosen in order:

  1. The one whose name describes what the shared motion actually does. A group where one member is a directional wipe and the rest borrowed it keeps the directional wipe.
  2. Then the one with subject-specific markup. More elements that only make sense for that name, not more elements.
  3. **Then the one already on origin/main.** Removing a shipped item breaks installs.
  4. Never a member whose name claims something the shared implementation does not do. frosted-glass-wipe has no backdrop-filter, spring-scale-in has no spring, mask-reveal-up has no mask, so none of those three is the survivor. Such a member is F2 and X2 at once, and X2 cannot be fixed without breaking the group. If no member is honest, keep the plainest name.

If every member of a group fails F1, the group is cut entire. Do not preserve a survivor to soften the count. Twelve names on one empty card shell is one bad item, not twelve, and keeping one of them keeps the bad item.

Same motion with genuinely different subjects is not a duplicate. A bar chart, a line chart and a dashboard populate can share a stagger; the subject is the item.

Raw lines 141 to 161
162## Never cut
164Protection is per criterion, not blanket. A protected item still answers every other row.
166**N1. Load-bearing colour** is exempt from X4 only. `chromatic-aberration-wipe` (the RGB split is
167the effect), `confetti` (multi-hue is the celebration), `matrix-decode` (green is its identity),
168`mesh-gradient-bg` (the gradient is the subject), `multi-device-splay`. `us-map`'s gradient is a
169sequential choropleth scale, which is colour carrying data.
171**N2. Real product depiction** is exempt from X4 and F1. A Figma logo inside a Figma mock is not
172slop; the HyperFrames wordmark in `logo-brand-close` is the subject. Judge the placeholder content,
173not the depicted product.
175**N3. Deliberate static** is exempt from X1. An item whose description promises no motion is not
176failing X1. A style snippet or a passive overlay is allowed to sit still.
178**N4. Environment sets** are exempt from F3. An item that is a backdrop rather than a shot is not
179failing F3 for being calm. Measured PSNR between frames separates the two: sets score 45 or higher,
180things that genuinely run score 17 to 24. Judge against the description.
182**N5. A rest state that is the recipe's `from` state** is exempt from F3. `confetti` ships
183`.particle` spans sitting at opacity 0 until the timeline fans them out. Still is not dead.
185**N6. Attachment snippets** are exempt from F3. A text splitter has no markup by design. Grade X6.
187**N7. The 36 items already on `origin/main`** are out of audit scope.

Never cut

Protection is per criterion, not blanket. A protected item still answers every other row.

N1. Load-bearing colour is exempt from X4 only. chromatic-aberration-wipe (the RGB split is the effect), confetti (multi-hue is the celebration), matrix-decode (green is its identity), mesh-gradient-bg (the gradient is the subject), multi-device-splay. us-map's gradient is a sequential choropleth scale, which is colour carrying data.

N2. Real product depiction is exempt from X4 and F1. A Figma logo inside a Figma mock is not slop; the HyperFrames wordmark in logo-brand-close is the subject. Judge the placeholder content, not the depicted product.

N3. Deliberate static is exempt from X1. An item whose description promises no motion is not failing X1. A style snippet or a passive overlay is allowed to sit still.

N4. Environment sets are exempt from F3. An item that is a backdrop rather than a shot is not failing F3 for being calm. Measured PSNR between frames separates the two: sets score 45 or higher, things that genuinely run score 17 to 24. Judge against the description.

**N5. A rest state that is the recipe's from state** is exempt from F3. confetti ships .particle spans sitting at opacity 0 until the timeline fans them out. Still is not dead.

N6. Attachment snippets are exempt from F3. A text splitter has no markup by design. Grade X6.

**N7. The 36 items already on origin/main** are out of audit scope.

Raw lines 162 to 188
189## Mechanical first pass
191| Signal | How | Maps to |
192| ------------------- | ------------------------------------------------------------------------------------- | ------- |
193| No timeline | `grep -L __timelines` over each composition | X1 |
194| Duplicate | motion fingerprint AND markup skeleton hashes, matched pairwise | F2 |
195| Empty shell | markup skeleton matches an unrelated item, or is `<h3>` + `<p>` + generic panels only | F1 |
196| No markup at all | element count of the comment-, style- and script-stripped file is 0 | X6 |
197| Placeholder palette | grep the six banned hexes | X4 |
198| Name gap | the X2 table, grepped over the code region only | X2 |
199| Unbounded number | read `min`/`max` in `registry-item.json` | X8 |
200| Non-determinism | grep `Math.random`, `Date.now`, `performance.now`, `requestAnimationFrame` | X7, F5 |

Mechanical first pass

SignalHowMaps to
No timelinegrep -L __timelines over each compositionX1
Duplicatemotion fingerprint AND markup skeleton hashes, matched pairwiseF2
Empty shellmarkup skeleton matches an unrelated item, or is <h3> + <p> + generic panels onlyF1
No markup at allelement count of the comment-, style- and script-stripped file is 0X6
Placeholder palettegrep the six banned hexesX4
Name gapthe X2 table, grepped over the code region onlyX2
Unbounded numberread min/max in registry-item.jsonX8
Non-determinismgrep Math.random, Date.now, performance.now, requestAnimationFrameX7, F5
Raw lines 189 to 201
202## Visual pass, required for a verdict
204Render at least four frames across the duration from the **composition**, not the demo, mounted per
205the harness rules above, and look at them. Then, for anything not scoring clean, confirm on the
206real catalog page before recording it.
208Record per item: the criteria it fails, the evidence you saw, and fatal or fixable. An unviewed
209item is not a pass.

Visual pass, required for a verdict

Render at least four frames across the duration from the composition, not the demo, mounted per the harness rules above, and look at them. Then, for anything not scoring clean, confirm on the real catalog page before recording it.

Record per item: the criteria it fails, the evidence you saw, and fatal or fixable. An unviewed item is not a pass.

Raw lines 202 to 210
211## Calibration
213Ten items scored with this rubric, frames rendered and looked at. Three of them corrected the
214rubric rather than the other way round.
216| Item | Expected | Frames actually showed | Verdict |
217| ---------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------ |
218| `ecosystem-constellation` | fatal | Sidebar with three pill buttons and three empty white panels. No nodes, no edges. Identical at all four timestamps. | **Cut** F1, F2, F4 |
219| `terminal-to-browser-deploy` | fatal | Pixel-identical to the above, only the `<h3>` and one subtitle differ. No terminal, no browser. | **Cut** F1, F2, F4 |
220| `frosted-glass-wipe` | fatal | One card reading "Before", static, forever; the "After" panel stays clipped. Recipe byte-identical to `directional-wipe`. | **Cut** F2, F4, X2 |
221| `char-slam-explode` | pass | Letters scattered at 0.05s, assembled into "Impact" by 1.2s, held. Real per-character motion. | **Keep** |
222| `echo-trail` | pass | Card travels left to right with a decaying blurred echo trail behind it. Legible on its own light ground. | **Keep** |
223| `logo-brand-close` | pass | "H" resolves into the full wordmark, tagline and URL land after it. Staged, legible. | **Keep** |
224| `blur-in` | borderline | Still, but the still is the correct rest state: legible headline, unique implementation, theme-token ink. | **Keep**, X1 |
225| `spring-scale-in` | borderline | Legible on its own `#f7f7f8`. Ease is `power3.out`, no spring anywhere. Shares its recipe with six others. | **Cut** F2, X2 |
226| `confetti` | borderline | Card and mesh, no particles visible. Source ships `.particle` spans the recipe fans out from opacity 0. | **Keep**, X1 |
227| `bottom-up-letters` | borderline | Four blank frames. The file is a splitter with no markup at all. | **Keep**, X6 |
229Three corrections the calibration forced, all of them false cuts:
231- `spring-scale-in` first scored X3 at roughly 1.5:1. That was the harness's dark stage, not the
232 item. Hence "use the item's own ground".
233- `confetti` first scored F3. Its rest state is its recipe's `from` state. Hence N5.
234- `char-slam-explode` first scored F3 with four black frames. It is a sub-composition and was being
235 inlined. Hence the two-shapes rule.
237A rubric that cuts a working item is wrong even when the verdict is convenient.

Calibration

Ten items scored with this rubric, frames rendered and looked at. Three of them corrected the rubric rather than the other way round.

ItemExpectedFrames actually showedVerdict
ecosystem-constellationfatalSidebar with three pill buttons and three empty white panels. No nodes, no edges. Identical at all four timestamps.Cut F1, F2, F4
terminal-to-browser-deployfatalPixel-identical to the above, only the <h3> and one subtitle differ. No terminal, no browser.Cut F1, F2, F4
frosted-glass-wipefatalOne card reading "Before", static, forever; the "After" panel stays clipped. Recipe byte-identical to directional-wipe.Cut F2, F4, X2
char-slam-explodepassLetters scattered at 0.05s, assembled into "Impact" by 1.2s, held. Real per-character motion.Keep
echo-trailpassCard travels left to right with a decaying blurred echo trail behind it. Legible on its own light ground.Keep
logo-brand-closepass"H" resolves into the full wordmark, tagline and URL land after it. Staged, legible.Keep
blur-inborderlineStill, but the still is the correct rest state: legible headline, unique implementation, theme-token ink.Keep, X1
spring-scale-inborderlineLegible on its own #f7f7f8. Ease is power3.out, no spring anywhere. Shares its recipe with six others.Cut F2, X2
confettiborderlineCard and mesh, no particles visible. Source ships .particle spans the recipe fans out from opacity 0.Keep, X1
bottom-up-lettersborderlineFour blank frames. The file is a splitter with no markup at all.Keep, X6

Three corrections the calibration forced, all of them false cuts:

  • spring-scale-in first scored X3 at roughly 1.5:1. That was the harness's dark stage, not the item. Hence "use the item's own ground".
  • confetti first scored F3. Its rest state is its recipe's from state. Hence N5.
  • char-slam-explode first scored F3 with four black frames. It is a sub-composition and was being inlined. Hence the two-shapes rule.

A rubric that cuts a working item is wrong even when the verdict is convenient.

Raw lines 211 to 238
239## Checklist
241Per item, in order. Stop at the first fatal.
243- [ ] Mounted the right way for its shape, on its own ground, with GSAP and a paused root.
244- [ ] F1: the markup contains the named subject.
245- [ ] F2: motion fingerprint and markup skeleton are not both shared with a survivor.
246- [ ] F3: it renders something with the recipe applied, or it is protected by N3 to N6.
247- [ ] F4: the frames show the event the description promises.
248- [ ] F5: frame N is computed from N.
249- [ ] X1 through X8 logged with the specific fix.
250- [ ] Verdict cites the evidence the criterion names, not an impression.

Checklist

Per item, in order. Stop at the first fatal.

  • [ ] Mounted the right way for its shape, on its own ground, with GSAP and a paused root.
  • [ ] F1: the markup contains the named subject.
  • [ ] F2: motion fingerprint and markup skeleton are not both shared with a survivor.
  • [ ] F3: it renders something with the recipe applied, or it is protected by N3 to N6.
  • [ ] F4: the frames show the event the description promises.
  • [ ] F5: frame N is computed from N.
  • [ ] X1 through X8 logged with the specific fix.
  • [ ] Verdict cites the evidence the criterion names, not an impression.
Raw lines 239 to 250