dreative 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -98,10 +98,13 @@ async function main() {
98
98
  // Codex may not auto-discover skills — leave a pointer in AGENTS.md (idempotent).
99
99
  const agentsMd = path.join(process.cwd(), "AGENTS.md");
100
100
  const marker = "<!-- dreative-skill -->";
101
- const pointer = `\n${marker}\n## Dreative (frontend design skill)\nFor ANY frontend design work (redesign, restyle, build pages, animations, motion, 3D, micro-interactions) or when the user says "open dreative" / wants to edit the UI visually: read \`.codex/skills/dreative/SKILL.md\` first and follow it.\n`;
101
+ const pointer = `\n${marker}\n## Dreative (frontend design skill)\nFor ANY frontend design work (redesign, restyle, build pages, animations, motion, 3D, micro-interactions) or when the user says "open dreative" / wants to edit the UI visually: read \`.codex/skills/dreative/SKILL.md\` first and follow it.\nIf that file is missing (e.g. fresh clone — \`.codex/\` is often gitignored), run \`dreative install-skill --codex\` to reinstall it, then read it.\n`;
102
102
  const existing = fs.existsSync(agentsMd) ? fs.readFileSync(agentsMd, "utf-8") : "";
103
- if (!existing.includes(marker))
104
- fs.writeFileSync(agentsMd, existing + pointer);
103
+ // Replace any previous dreative block (marker through the end of its paragraph) so upgrades refresh the pointer text.
104
+ const stripped = existing.includes(marker)
105
+ ? existing.replace(new RegExp(`\\n?${marker}[\\s\\S]*?(?=\\n{2,}(?!$)|$)`), "")
106
+ : existing;
107
+ fs.writeFileSync(agentsMd, stripped + pointer);
105
108
  }
106
109
  console.log(`installed skill to ${destDir}${forCodex ? " (Codex mode: AGENTS.md pointer added)" : ""}`);
107
110
  console.log(` core: SKILL.md, DESIGN.md`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dreative",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Layout-first visual editor skill for coding CLIs: extract your app's UI into editable wireframes, tweak with drag-drop + ref images, then the agent applies the diff back to your code.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -259,6 +259,61 @@ library (Phosphor/Radix/Tabler/HugeIcons; Lucide only on request), one strokeWid
259
259
  globally. Logo walls: real SVG marks (`https://cdn.simpleicons.org/<slug>`) or
260
260
  generated monograms — logos only, no category captions, below the hero.
261
261
 
262
+ ### Generated media (probe your environment, then use it)
263
+
264
+ Before designing, check what media generation your environment actually offers —
265
+ image-gen tools, video-gen tools, or a CLI that can produce them — and treat any
266
+ capability found as a first-class design material, not a nice-to-have:
267
+
268
+ - **Images**: generate hero photography, product/context shots, and textures at
269
+ the section's exact aspect ratio, prompted for the brand's physical subject
270
+ and the page's light temperature so they grade into the palette. Generate the
271
+ grain tile and any masks/mattes too instead of hand-rolling SVG.
272
+ - **Video**: a generated 5–10s seamless loop is one of the biggest single UI
273
+ upgrades available — use it as: a hero background (muted, `autoplay loop
274
+ playsinline`, poster frame, `prefers-reduced-motion` swaps to the poster);
275
+ the budget "living surface" (a pre-rendered fluid/particle/atmosphere loop
276
+ instead of a GPGPU sim — cinematic.md's budget recipe); hover-preview loops
277
+ on work cards; or an image-sequence for scroll-scrubbed narratives (export
278
+ frames, scrub per motion.md).
279
+ - **Integrate with motion, don't just embed** — a raw `<video>`/`<img>` dropped
280
+ in a section is not the treatment. Generated media enters the page THROUGH the
281
+ motion system; pick 1–2 treatments per page from this vocabulary (or invent in
282
+ its spirit), matched to the register:
283
+ - **Pixel/dither reveal**: video or image materializes from coarse blocks —
284
+ a shader that lerps sample resolution from ~24px mosaic to full res (or a
285
+ stepped `image-rendering: pixelated` downscale swap for the budget path),
286
+ driven by scroll progress or hover. Reads as digital-craft; dark-tech and
287
+ editorial registers.
288
+ - **Floating media**: images hover in depth with slow damped drift (±6-10px,
289
+ 4-8s loops, each at a different phase), subtle parallax by depth layer, and
290
+ a soft contact shadow — the immersive "paper sheets in space" look without
291
+ WebGL. Cap at 3-5 floaters per view.
292
+ - **Mask-shaped video**: the loop plays inside display type (`background-clip:
293
+ text` / SVG mask on a 10vw+ headline), an arch/circle clip-path, or the
294
+ brand mark — the video becomes typography/identity rather than a rectangle.
295
+ - **Scroll-scrubbed sequence**: generated frames scrubbed by scroll for
296
+ assemble/morph/rotate narratives (motion.md's canvas product story).
297
+ - **Velocity-touched media**: scroll/drag velocity stretches, RGB-splits, or
298
+ ripples the media plane for a beat, settling with damped decay
299
+ (cinematic.md §2) — needs the WebGL media-plane sync.
300
+ - **Hover-woken loops**: stills that crossfade into their video loop on
301
+ hover/focus (240ms), pause + rewind-to-poster on leave; works as generated
302
+ "living thumbnails" on work/product cards.
303
+ - **Curtain/split reveal**: media enters behind a 2-4 panel wipe or an
304
+ expanding inset clip (`clip-path: inset(40% 30%) → inset(0)`), timed with
305
+ the section's line-mask type reveal so image and headline arrive as one
306
+ choreographed beat.
307
+ Whatever the treatment, honor the floors: reduced-motion gets the poster
308
+ frame, hover treatments have focus equivalents, and the effect is justified
309
+ in one sentence like any other motion (§6).
310
+ - Discipline: same rationing as everything else — one video loop per view,
311
+ compress hard (H.264/AV1, ≤ 2–4MB per loop, no audio track), lazy-load below
312
+ the fold, and never let generated media replace REAL product screenshots or
313
+ the client's actual photography when those exist.
314
+ - If no generation capability exists, say so and fall back down the §7 priority
315
+ list — never fake a video with a div animation.
316
+
262
317
  ## 8. Content and copy
263
318
 
264
319
  ≤ 8-word section headlines, ≤ 25-word subtext, one copy register per page, quotes
@@ -323,6 +378,69 @@ recomposition → full replacement only when unsalvageable. Honor existing
323
378
  accessibility wins and analytics hooks. Preserve prior element-level edits when
324
379
  `previousFile` is set.
325
380
 
381
+ ### The preservation contract (mandatory for ANY redesign of existing code)
382
+
383
+ Redesigns fail catastrophically in one specific way: the agent rebuilds the page
384
+ from its mental image of it and silently drops what it forgot — links, ids, form
385
+ fields, whole features. Doctrine prose does not prevent this; only a mechanical
386
+ before/after check does. The contract protects **content and function**, never
387
+ structure — a restructure/reimagine still rebuilds markup, components, and
388
+ routing as drastically as the rung demands.
389
+
390
+ **Step 1 — Manifest (before editing anything).** Per page/view being redesigned,
391
+ read the ORIGINAL source and write a manifest file (scratch or
392
+ `.dreative/preserve/<page>.json`) enumerating:
393
+
394
+ - **Links & routes**: every `href` / `to` / `router.push` / `navigate` target.
395
+ - **Interactive elements**: every button/menu/toggle/input with its handler or
396
+ action (name + one line of what it does), every form with its field names,
397
+ types, validation, and submit target.
398
+ - **Identity hooks**: every `id`, `data-*` attribute, `aria-*` label, analytics
399
+ hook, test id, and anchor target. These are external contracts — other code,
400
+ CSS, tests, and deep links point at them.
401
+ - **Visible text**: every heading, label, button caption, tooltip, empty-state,
402
+ and legal string (verbatim).
403
+ - **Data views & states**: every list/table/feed and what feeds it (API call,
404
+ prop, store), every conditional view — tabs, modals, auth states, wizard
405
+ steps, loading/empty/error branches.
406
+ - **Public API**: the component's exports, props, and context it consumes —
407
+ callers must not break.
408
+
409
+ **Step 2 — Redesign at the confirmed rung.** Every manifest entry must land
410
+ somewhere in the new code. Restructuring means an entry may MOVE (a tab becomes
411
+ a section, a sidebar item becomes a command-palette entry, a table becomes
412
+ cards) — moving is encouraged; vanishing is a bug. If the new design has no room
413
+ for something, relocate it (overflow menu, secondary view, settings page) —
414
+ never delete a feature to make a layout work. Rewriting copy is allowed only at
415
+ the reimagine rung or on explicit request, and each rewrite is logged as
416
+ intentional.
417
+
418
+ **Step 3 — Verify mechanically (not by vibes).** After writing the new code,
419
+ walk the manifest item by item and grep the new source for each link target,
420
+ handler/action, id/data-attribute, field name, visible string, and data view.
421
+ Anything unmatched is either fixed on the spot or listed as an intentional
422
+ change with a reason. Then report a **preservation ledger** to the user:
423
+ "kept 14/14 links, 9/9 actions, 6/6 form fields, all 4 tab views; moved the
424
+ sort dropdown into the toolbar; rewrote 2 headings (reimagine rung)". A
425
+ redesign without a ledger is not done.
426
+
427
+ **Step 4 — Render check.** Every data view and conditional state that rendered
428
+ before must render after: open (or mentally walk) each tab/modal/state, not
429
+ just the default view. A page that "looks designed" but shows an empty shell
430
+ where a table used to be is a failed redesign regardless of how good the hero
431
+ looks.
432
+
433
+ ### Motion is a deliverable, not a garnish
434
+
435
+ When the user asked for motion/animation (explicitly, or by picking the motion /
436
+ interaction / immersive / cinematic skills), shipped motion is verified like a
437
+ feature: before declaring done, name the specific animations implemented (which
438
+ element, which trigger, which duration/ease) and confirm they exist in the code
439
+ and appear in the self-critique screenshots. "The design system implies motion"
440
+ does not count; entrance choreography, scroll behavior, and micro-interactions
441
+ must be literally present. If zero animations survive to the final code, the
442
+ request was not fulfilled — go back and add them before reporting done.
443
+
326
444
  ### The transformation-depth ladder (offer it, then execute it)
327
445
 
328
446
  A redesign request has a depth, and styling is only the shallowest rung. When the
@@ -387,6 +505,11 @@ the output is not done.
387
505
  14. Every block id from the layout appears as `data-dreative-id` (design-page only).
388
506
  15. Dark mode (when in scope): semantic-token swap, surface-lightness depth,
389
507
  desaturated accents, tested both modes.
508
+ 16. Redesign of existing code: preservation manifest written BEFORE editing;
509
+ every link, id, handler, form field, visible string, data view, and
510
+ conditional state verified present (or logged as intentional) in the new
511
+ code; preservation ledger reported. If motion skills were chosen, the
512
+ implemented animations are named and present in the code.
390
513
 
391
514
  ## 13. Mobile & touch adaptation (how ambitious effects degrade)
392
515
 
@@ -7,7 +7,7 @@ description: Frontend design skill + optional visual round-trip editor. Use for
7
7
 
8
8
  You (the coding agent) are the intelligence. Dreative has **two modes**:
9
9
 
10
- - **Mode A — Direct design (default).** The user asks you to design, redesign, restyle, animate, or build UI. Read `DESIGN.md` (and any specialist `skills/<name>.md` the work calls for — motion, 3d, interaction), then design/edit the real code directly. No server, no extraction, no wireframes. When you finish, add one closing note: *"Tip: run `dreative start` / say 'open dreative' if you want to tweak this visually — I'll extract the pages into an editable canvas."* That's the only place the editor should come up; never force the round-trip on a plain design request. **Depth first:** when the request implies more than a fresh coat of paint ("redesign", "change it entirely", "make it like <reference site>"), present DESIGN.md §11's transformation-depth ladder (restyle → re-layout → restructure → reimagine) as explicit options and let the user pick BEFORE designing; a confirmed restructure/reimagine means rebuilding markup, component trees, and routing for real — never just editing stylesheets on the old skeleton. **Skill picker:** in the same pre-design question (use the agent's structured question tool, e.g. AskUserQuestion, multi-select), offer the specialist skills with a one-line plain-language description each so the user chooses the treatments they want — recommend the ones the request obviously implies and mark them "(Recommended)":
10
+ - **Mode A — Direct design (default).** The user asks you to design, redesign, restyle, animate, or build UI. Read `DESIGN.md` (and any specialist `skills/<name>.md` the work calls for — motion, 3d, interaction), then design/edit the real code directly. No server, no extraction, no wireframes. When you finish, add one closing note: *"Tip: run `dreative start` / say 'open dreative' if you want to tweak this visually — I'll extract the pages into an editable canvas."* That's the only place the editor should come up; never force the round-trip on a plain design request. **Depth first:** when the request implies more than a fresh coat of paint ("redesign", "change it entirely", "make it like <reference site>"), present DESIGN.md §11's transformation-depth ladder (restyle → re-layout → restructure → reimagine) as explicit options and let the user pick BEFORE designing; a confirmed restructure/reimagine means rebuilding markup, component trees, and routing for real — never just editing stylesheets on the old skeleton. **Preservation contract (non-negotiable when redesigning existing code):** BEFORE editing any existing page, build the preservation manifest per DESIGN.md §11 (every link, id/data-attribute, handler, form field, visible string, data view, and conditional state — tabs, modals, auth branches); AFTER redesigning, mechanically verify each entry survives in the new code and report the preservation ledger. Restructure moves things; it never loses them. **Real motion engineering:** when motion/3d/immersive/cinematic treatments are chosen, deliver them with the proper libraries per the skill files (GSAP + ScrollTrigger, Lenis, `motion/react`, three.js/R3F) — actually add the dependencies to the project (`npm i gsap lenis` etc.), wire providers/render loops, and build the choreography. A static page with a few CSS transitions does not fulfill a motion request; the target is unseen.co-grade coordinated animation, the shipped result must clear the motion-dial inventory in `skills/motion.md` §9, and the self-critique pass must name the specific animations shipped. **Generated media:** probe your environment for image/video generation tools before designing and use them per DESIGN.md §7 — generated hero imagery, textures, and especially seamless video loops (hero backgrounds, pre-rendered living surfaces, hover previews) integrated into the motion system are among the highest-impact upgrades available. **Skill picker:** in the same pre-design question (use the agent's structured question tool, e.g. AskUserQuestion, multi-select), offer the specialist skills with a one-line plain-language description each so the user chooses the treatments they want — recommend the ones the request obviously implies and mark them "(Recommended)":
11
11
  - **motion** — scroll animations, staggered entrances, parallax, kinetic type
12
12
  - **interaction** — micro-interactions: hover states, magnetic buttons, cursor effects, tactile feedback
13
13
  - **3d** — WebGL / three.js scenes, shader backgrounds, 3D product showcases
@@ -25,7 +25,7 @@ Everything below §0 describes Mode B; the design doctrine paragraphs apply to b
25
25
 
26
26
  **References the user gives you.** If the user attaches screenshots/images, read them with your image tools and treat them as the visual target (extract palette, type feel, layout family, motion cues from any described behavior). If the user names reference URLs, fetch them (browser tools if available, else web fetch of the HTML — look at real script/font/class evidence, not just the text) and distill what specifically to borrow before designing; never guess at a named reference from memory alone when you can look.
27
27
 
28
- **Self-critique pass (Mode A, required before declaring done).** Doctrine at write-time is weaker than judgment at review-time. After implementing a design: run the app and screenshot the result (browser tools / the project's dev server) at desktop AND ~390px mobile width, then grade the screenshots against this rubric — (1) would a stranger name the brand's register and audience from one glance? (2) does it pass DESIGN.md §2's slop tests *as rendered* (not as intended)? (3) is the signature element actually visible and working? (4) any overflow, contrast failure, unloaded font/image, or motion jank? (5) does mobile hold up per DESIGN.md §13? Fix what fails and re-check once. If you cannot screenshot (no browser available), say so explicitly and walk the rendered DOM/CSS mentally against the same rubric — never silently skip the pass.
28
+ **Self-critique pass (Mode A, required before declaring done).** Doctrine at write-time is weaker than judgment at review-time. After implementing a design: run the app and screenshot the result (browser tools / the project's dev server) at desktop AND ~390px mobile width, then grade the screenshots against this rubric — (1) would a stranger name the brand's register and audience from one glance? (2) does it pass DESIGN.md §2's slop tests *as rendered* (not as intended)? (3) is the signature element actually visible and working? (4) any overflow, contrast failure, unloaded font/image, or motion jank? (5) does mobile hold up per DESIGN.md §13? (6) preservation ledger clean — every link, action, form field, text string, and tab/modal/state from the manifest present or logged as intentional? (7) if motion treatments were chosen: are the animation libraries actually installed and imported, and can you name ≥3 specific shipped animations (element + trigger + duration) visible in the running page? Fix what fails and re-check once. If you cannot screenshot (no browser available), say so explicitly and walk the rendered DOM/CSS mentally against the same rubric — never silently skip the pass.
29
29
 
30
30
  ## 0. Setup
31
31
 
@@ -170,6 +170,51 @@ All of 3d.md §7 and immersive.md §6, plus:
170
170
  on real DOM, click-and-hold in JS only. 70% of the mood, runs on anything —
171
171
  the right call below motion dial 8 or on content-heavy sites.
172
172
 
173
+ ## 6.5 The unseen.co replication blueprint (build order)
174
+
175
+ When the brief is "make it like unseen.co" (or this genre at dial 9–10), build
176
+ in THIS order — each layer works before the next starts. Do not attempt it as
177
+ one monolithic rewrite; do not stop after step 2 and call it done.
178
+
179
+ **Manifest:** `npm i gsap lenis three @react-three/fiber @react-three/drei
180
+ @react-three/postprocessing` (React) or `gsap lenis three` (vanilla/OGL).
181
+ Wire Lenis + ScrollTrigger per motion.md §8 first.
182
+
183
+ **Layer stack (bottom → top):** persistent WebGL canvas (fixed, full-viewport)
184
+ → real DOM content (the accessible document) → HUD chrome (fixed corners) →
185
+ grain overlay → custom cursor. Each is its own component/layer mounted in the
186
+ root layout, outside the router swap point (immersive.md §1).
187
+
188
+ 1. **Smooth scroll + type system.** Lenis running, line-mask reveals on every
189
+ heading (motion.md §8), the two-family type mix (grotesk + true-italic
190
+ serif accents in one headline), numbered HUD chrome (`01 Index`…). The page
191
+ should already feel 60% of the genre with zero WebGL.
192
+ 2. **The living surface.** One canvas, one simulation family (§1). Start with
193
+ the highest effort/impact ratio: a shader plane with fbm + domain-warp fed
194
+ by palette uniforms and damped `uMouse` velocity (3d.md §4), or the
195
+ pre-rendered-video budget path (§6). Grain overlay goes in now — it glues
196
+ DOM and canvas into one graded image.
197
+ 3. **Scroll = camera.** Tall scroll container drives a camera dolly / scene
198
+ progress via damped scrub (immersive.md §4). Section copy floats in at
199
+ progress stops. This is the "one continuous shot" that separates the genre
200
+ from a parallax page.
201
+ 4. **Media through the surface.** Sync DOM image/work-card rects to texture
202
+ planes in the canvas (measure with `getBoundingClientRect` on resize +
203
+ scroll, don't guess) so hover/velocity distortion touches them; keep the
204
+ real DOM images underneath for a11y/fallback (§1). Velocity-reactive
205
+ stretch/RGB-split on scroll flicks, hard-clamped (§2).
206
+ 5. **Gestures + cursor.** Pick 2–3 from §2 (drag-to-explore, click & hold,
207
+ cursor-as-instrument), each labeled, each with a keyboard/boring
208
+ equivalent. Custom cursor: one dot, damped follow, contextual labels.
209
+ 6. **Doors and passages.** Preloader (real progress, choreographed reveal into
210
+ the idling scene — immersive.md §2), entry gate if sound ships (§3), route
211
+ transitions driven by the simulation (§4).
212
+ 7. **The floor.** Reduced-motion still frame, degrade ladder, contrast scrim,
213
+ mobile strategy (poster or halved sim), pause on hidden (§5).
214
+
215
+ Ship checkpoint after every layer: run it, screenshot it, keep it working.
216
+ A failed step 4 must not take down steps 1–3.
217
+
173
218
  ## 7. Changing an existing site into this
174
219
 
175
220
  Same rule as immersive.md §8: this register cannot be CSS'd onto a conventional
@@ -145,3 +145,78 @@ tell. Instead:
145
145
  ("PLAY VIDEO ⟲") slowly rotates around the pointer while it's over the media
146
146
  region — SVG `<textPath>` on a circle, damped position follow, constant
147
147
  rotation. Replaces the play button; fine pointers only, real button fallback.
148
+
149
+ ## 8. Setup blueprints — install and WIRE the stack (do not skip)
150
+
151
+ Doctrine without dependencies ships a static page. When this skill is active,
152
+ actually add the libraries to the project and wire them before designing
153
+ sections. Pick the stack per §0, then:
154
+
155
+ **GSAP + ScrollTrigger + Lenis (brand pages, the unseen.co-family stack):**
156
+
157
+ ```
158
+ npm i gsap lenis
159
+ ```
160
+
161
+ ```js
162
+ // one module, imported once at app root (e.g. src/lib/motion.ts)
163
+ import gsap from "gsap";
164
+ import { ScrollTrigger } from "gsap/ScrollTrigger";
165
+ import Lenis from "lenis";
166
+
167
+ gsap.registerPlugin(ScrollTrigger);
168
+ export const lenis = new Lenis({ lerp: 0.1, smoothWheel: true });
169
+ lenis.on("scroll", ScrollTrigger.update);
170
+ gsap.ticker.add((t) => lenis.raf(t * 1000));
171
+ gsap.ticker.lagSmoothing(0);
172
+ ```
173
+
174
+ React: run that inside a `useEffect` in a `<SmoothScroll>` provider mounted in
175
+ the root layout (destroy on unmount); Next.js needs `"use client"` on it.
176
+ ONE Lenis instance, ONE gsap ticker — never per-component.
177
+
178
+ **motion/react (React product+brand):** `npm i motion` — import from
179
+ `"motion/react"`. Shared transition vocabulary in one exported object
180
+ (`export const spring = { type: "spring", stiffness: 300, damping: 30 }`), used
181
+ everywhere; `MotionConfig reducedMotion="user"` at the root.
182
+
183
+ **Easing tokens (either stack):** commit page-wide —
184
+ `expo.out` / `cubic-bezier(0.16, 1, 0.3, 1)` for entrances/reveals,
185
+ `power2.inOut` for scrubbed/camera moves, springs for interactive. Define once
186
+ (gsap defaults via `gsap.defaults({ ease: "expo.out" })` or CSS custom
187
+ property `--ease-out-expo`), reference everywhere.
188
+
189
+ **Line-mask headline reveal (the canonical premium move, copy this shape):**
190
+
191
+ ```jsx
192
+ // each line: <div class="overflow-hidden"><div class="line">…</div></div>
193
+ gsap.set(".line", { yPercent: 110 });
194
+ gsap.to(".line", {
195
+ yPercent: 0, duration: 0.9, ease: "expo.out", stagger: 0.08,
196
+ scrollTrigger: { trigger: el, start: "top 80%", once: true },
197
+ });
198
+ ```
199
+
200
+ Use GSAP `SplitText` (free) with `type: "lines", mask: "lines"` instead of
201
+ hand-wrapping when available; `aria-label` the original string per §4.
202
+
203
+ ## 9. Definition of done — the shipped-motion inventory
204
+
205
+ A motion request is fulfilled only if the final code contains, verifiably
206
+ (grep the imports, name the elements):
207
+
208
+ - **Dial 4–6 (product/calm brand):** composed hero entrance timeline (§2), the
209
+ three global feel constants (interaction.md §0), 1–2 `whileInView`/triggered
210
+ section reveals, animated states (loading/success). No smooth scroll.
211
+ - **Dial 7–8 (expressive brand):** all of the above PLUS Lenis smooth scroll,
212
+ line-mask headline reveals on hero + section headings, one scrubbed scroll
213
+ sequence (pin, parallax system, or progress-bound narrative), one signature
214
+ pointer effect (interaction.md §1), and a page/route transition treatment.
215
+ - **Dial 9–10 (award-site):** all of the above PLUS the immersive.md or
216
+ cinematic.md architecture actually built (persistent stage/canvas, preloader
217
+ choreography, spatial or sim-driven route transitions, custom cursor).
218
+
219
+ Before reporting done, list which inventory items shipped and where (element +
220
+ trigger). "The page has hover states" does not clear dial 7+. If a listed item
221
+ was deliberately cut, say so and why. This inventory is what the SKILL.md
222
+ self-critique pass checks against.