luckiest-co 1.0.17 → 1.0.18

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.
Files changed (160) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/package.json +1 -1
  4. package/skills/luckiest-ab-testing/SKILL.md +1 -1
  5. package/skills/luckiest-ad-creative/SKILL.md +1 -1
  6. package/skills/luckiest-ads/SKILL.md +1 -1
  7. package/skills/luckiest-advisors/SKILL.md +1 -1
  8. package/skills/luckiest-aeo-grader/SKILL.md +1 -1
  9. package/skills/luckiest-ai-seo/SKILL.md +1 -1
  10. package/skills/luckiest-analytics/SKILL.md +1 -1
  11. package/skills/luckiest-aso/SKILL.md +1 -1
  12. package/skills/luckiest-churn-prevention/SKILL.md +1 -1
  13. package/skills/luckiest-co-marketing/SKILL.md +1 -1
  14. package/skills/luckiest-coder/SKILL.md +1 -1
  15. package/skills/luckiest-coder-brainstorming/SKILL.md +1 -1
  16. package/skills/luckiest-coder-consistency/SKILL.md +1 -1
  17. package/skills/luckiest-coder-constitution/SKILL.md +1 -1
  18. package/skills/luckiest-coder-debugging/SKILL.md +1 -1
  19. package/skills/luckiest-coder-dispatching-parallel-agents/SKILL.md +1 -1
  20. package/skills/luckiest-coder-executing-plans/SKILL.md +1 -1
  21. package/skills/luckiest-coder-finishing-a-branch/SKILL.md +1 -1
  22. package/skills/luckiest-coder-git-worktrees/SKILL.md +1 -1
  23. package/skills/luckiest-coder-guard/SKILL.md +1 -1
  24. package/skills/luckiest-coder-qa/SKILL.md +1 -1
  25. package/skills/luckiest-coder-receiving-code-review/SKILL.md +1 -1
  26. package/skills/luckiest-coder-requesting-code-review/SKILL.md +1 -1
  27. package/skills/luckiest-coder-shipping/SKILL.md +1 -1
  28. package/skills/luckiest-coder-subagent-driven-development/SKILL.md +1 -1
  29. package/skills/luckiest-coder-tdd/SKILL.md +1 -1
  30. package/skills/luckiest-coder-verification/SKILL.md +1 -1
  31. package/skills/luckiest-coder-writing-plans/SKILL.md +1 -1
  32. package/skills/luckiest-coder-writing-skills/SKILL.md +1 -1
  33. package/skills/luckiest-cold-email/SKILL.md +1 -1
  34. package/skills/luckiest-community-marketing/SKILL.md +1 -1
  35. package/skills/luckiest-competitor-profiling/SKILL.md +1 -1
  36. package/skills/luckiest-competitors/SKILL.md +1 -1
  37. package/skills/luckiest-content-strategy/SKILL.md +1 -1
  38. package/skills/luckiest-copy-editing/SKILL.md +1 -1
  39. package/skills/luckiest-copywriting/SKILL.md +1 -1
  40. package/skills/luckiest-cro/SKILL.md +1 -1
  41. package/skills/luckiest-customer-research/SKILL.md +1 -1
  42. package/skills/luckiest-design-website/ATTRIBUTION.md +38 -0
  43. package/skills/luckiest-design-website/CHANGELOG.md +104 -0
  44. package/skills/luckiest-design-website/LICENSE +21 -0
  45. package/skills/luckiest-design-website/SKILL.md +372 -0
  46. package/skills/luckiest-design-website/UPSTREAM-CHANGELOG.md +526 -0
  47. package/skills/luckiest-design-website/engine/scrollcraft.css +432 -0
  48. package/skills/luckiest-design-website/engine/scrollcraft.js +1167 -0
  49. package/skills/luckiest-design-website/evals/evals.json +33 -0
  50. package/skills/luckiest-design-website/references/assets.md +286 -0
  51. package/skills/luckiest-design-website/references/device-diag.html +214 -0
  52. package/skills/luckiest-design-website/references/devices.md +466 -0
  53. package/skills/luckiest-design-website/references/feel.md +277 -0
  54. package/skills/luckiest-design-website/references/registry-examples.md +305 -0
  55. package/skills/luckiest-design-website/references/taste.md +304 -0
  56. package/skills/luckiest-design-website/references/template.html +138 -0
  57. package/skills/luckiest-design-website/references/uniqueness.md +480 -0
  58. package/skills/luckiest-design-website/references/verify.md +381 -0
  59. package/skills/luckiest-design-website/references/worldflight.md +349 -0
  60. package/skills/luckiest-design-website/references/worlds.md +178 -0
  61. package/skills/luckiest-design-website/scripts/doctor.mjs +177 -0
  62. package/skills/luckiest-design-website/scripts/encode.sh +80 -0
  63. package/skills/luckiest-design-website/scripts/kie.mjs +202 -0
  64. package/skills/luckiest-design-website/scripts/serve.mjs +52 -0
  65. package/skills/luckiest-design-website/scripts/shoot.mjs +644 -0
  66. package/skills/luckiest-design-website/scripts/workspace.mjs +106 -0
  67. package/skills/luckiest-design-website/scripts/worldflight-assert.mjs +273 -0
  68. package/skills/luckiest-design-website/templates/FINGERPRINTS.md +65 -0
  69. package/skills/luckiest-directory-submissions/SKILL.md +1 -1
  70. package/skills/luckiest-emails/SKILL.md +1 -1
  71. package/skills/luckiest-extract-design-system/SKILL.md +1 -1
  72. package/skills/luckiest-free-tools/SKILL.md +1 -1
  73. package/skills/luckiest-image/SKILL.md +1 -1
  74. package/skills/luckiest-launch/SKILL.md +1 -1
  75. package/skills/luckiest-lead-magnets/SKILL.md +1 -1
  76. package/skills/luckiest-marketing-ideas/SKILL.md +1 -1
  77. package/skills/luckiest-marketing-plan/SKILL.md +1 -1
  78. package/skills/luckiest-marketing-psychology/SKILL.md +1 -1
  79. package/skills/luckiest-model-router/SKILL.md +1 -1
  80. package/skills/luckiest-offers/SKILL.md +1 -1
  81. package/skills/luckiest-onboarding/SKILL.md +1 -1
  82. package/skills/luckiest-paywalls/SKILL.md +1 -1
  83. package/skills/luckiest-popups/SKILL.md +1 -1
  84. package/skills/luckiest-pricing/SKILL.md +1 -1
  85. package/skills/luckiest-product-marketing/SKILL.md +1 -1
  86. package/skills/luckiest-programmatic-seo/SKILL.md +1 -1
  87. package/skills/luckiest-prompt-rewrite/SKILL.md +1 -1
  88. package/skills/luckiest-prospecting/SKILL.md +1 -1
  89. package/skills/luckiest-public-relations/SKILL.md +1 -1
  90. package/skills/luckiest-referrals/SKILL.md +1 -1
  91. package/skills/luckiest-revops/SKILL.md +1 -1
  92. package/skills/luckiest-sales-enablement/SKILL.md +1 -1
  93. package/skills/luckiest-schema/SKILL.md +1 -1
  94. package/skills/luckiest-seo-audit/SKILL.md +1 -1
  95. package/skills/luckiest-session-handoff/SKILL.md +1 -1
  96. package/skills/luckiest-signup/SKILL.md +1 -1
  97. package/skills/luckiest-site-architecture/SKILL.md +1 -1
  98. package/skills/luckiest-sms/SKILL.md +1 -1
  99. package/skills/luckiest-social/SKILL.md +1 -1
  100. package/skills/luckiest-thinker/SKILL.md +1 -1
  101. package/skills/luckiest-trends/SKILL.md +1 -1
  102. package/skills/luckiest-video/SKILL.md +1 -1
  103. package/skills/luckiest-website-cloner/ATTRIBUTION.md +29 -0
  104. package/skills/luckiest-website-cloner/CHANGELOG.md +8 -0
  105. package/skills/luckiest-website-cloner/LICENSE +21 -0
  106. package/skills/luckiest-website-cloner/SKILL.md +289 -0
  107. package/skills/luckiest-website-cloner/references/builtin-browser-recipes.md +74 -0
  108. package/skills/luckiest-website-cloner/references/compositing.md +65 -0
  109. package/skills/luckiest-website-cloner/references/fidelity-fast-path.md +92 -0
  110. package/skills/luckiest-website-cloner/references/playwright-cli-recipes.md +68 -0
  111. package/skills/luckiest-website-cloner/references/teardown.md +142 -0
  112. package/skills/luckiest-website-cloner/references/visual-qa.md +102 -0
  113. package/skills/luckiest-website-cloner/scripts/build-bundle.cjs +12 -0
  114. package/skills/luckiest-website-cloner/scripts/motion-probe.js +423 -0
  115. package/skills/luckiest-website-cloner/scripts/surface-map.js +392 -0
  116. package/skills/luckiest-website-cloner/scripts/tokens-probe.js +178 -0
  117. package/skills/luckiest-website-cloner-dom/ATTRIBUTION.md +4 -0
  118. package/skills/luckiest-website-cloner-dom/CHANGELOG.md +8 -0
  119. package/skills/luckiest-website-cloner-dom/LICENSE +21 -0
  120. package/skills/luckiest-website-cloner-dom/SKILL.md +170 -0
  121. package/skills/luckiest-website-cloner-dom/references/asset-resolution.md +93 -0
  122. package/skills/luckiest-website-cloner-dom/references/interaction-fingerprints.md +85 -0
  123. package/skills/luckiest-website-cloner-remix/ATTRIBUTION.md +4 -0
  124. package/skills/luckiest-website-cloner-remix/CHANGELOG.md +8 -0
  125. package/skills/luckiest-website-cloner-remix/LICENSE +21 -0
  126. package/skills/luckiest-website-cloner-remix/SKILL.md +202 -0
  127. package/skills/luckiest-website-cloner-remix/references/directions.md +82 -0
  128. package/skills/luckiest-website-cloner-remix/references/reskin.md +84 -0
  129. package/skills/luckiest-website-cloner-remix/references/tweak-panel.md +72 -0
  130. package/skills/luckiest-website-cloner-remix/scripts/apply-overrides.cjs +105 -0
  131. package/skills/luckiest-website-cloner-remix/scripts/gallery.cjs +71 -0
  132. package/skills/luckiest-website-cloner-remix/scripts/tokenize-css.cjs +127 -0
  133. package/skills/luckiest-website-cloner-remix/scripts/tweak-panel.js +169 -0
  134. package/skills/luckiest-website-cloner-shaders/ATTRIBUTION.md +11 -0
  135. package/skills/luckiest-website-cloner-shaders/CHANGELOG.md +8 -0
  136. package/skills/luckiest-website-cloner-shaders/LICENSE +21 -0
  137. package/skills/luckiest-website-cloner-shaders/SKILL.md +129 -0
  138. package/skills/luckiest-website-cloner-shaders/references/capture-backends.md +89 -0
  139. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/SKILL.md +123 -0
  140. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/capture-backends.md +201 -0
  141. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/evidence-policy.md +93 -0
  142. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/operating-contract.md +82 -0
  143. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/qa-failure-policy.md +100 -0
  144. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/recon-kernel.md +206 -0
  145. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/replay-policy.md +145 -0
  146. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/shaders-com.md +212 -0
  147. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/source-analysis.md +112 -0
  148. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/surface-discovery.md +113 -0
  149. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/target-lock.md +205 -0
  150. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/three-shader-reconstruction.md +155 -0
  151. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/tool-capability-matrix.md +57 -0
  152. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/unicorn-studio.md +387 -0
  153. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/scripts/fetch-rendered-dom.mjs +178 -0
  154. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/scripts/scan-bundle.sh +80 -0
  155. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/extraction-report.md +41 -0
  156. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/known-gaps.md +14 -0
  157. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/qa-report.md +74 -0
  158. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/replay-manifest.json +147 -0
  159. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/run-state.json +75 -0
  160. package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/scout-card.json +106 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nate Herk
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,372 @@
1
+ ---
2
+ name: luckiest-design-website
3
+ description: "Builds a premium, scroll-driven landing page for any business and holds it to a real design floor. Scroll is the timeline: video scrubs under the wheel, sections pin and advance, rails pan sideways, headlines assemble, the ground shifts colour. Interviews the human first, picks one of eight page grammars plus a bespoke signature move so no two builds share a skeleton, writes copy with luckiest-copywriting, builds from own footage or generated assets, ships real semantic HTML, then verifies by screenshotting its own scroll and grading contrast, dead scroll and INP. Use for 'scrollytelling', 'scroll animation site', 'a site where scrolling plays a video', 'Apple-style landing page', 'interactive landing page', 'make my brand a scroll experience', 'rebuild my landing page as an experience', 'this looks like a template', 'this looks AI-made', 'design my website', or any page that should feel like an experience rather than a document."
4
+ license: See ATTRIBUTION.md
5
+ allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
6
+ metadata:
7
+ version: "1.0.0"
8
+ listing_id: luckiest-design-website
9
+ author: luckiest
10
+ ---
11
+
12
+ # luckiest-design-website
13
+
14
+ Scroll is the only input every visitor already knows. This skill treats it as a
15
+ timeline: the wheel is a scrubber, the page is a film with real text on top, and
16
+ each section behaves differently enough that the visitor keeps going.
17
+
18
+ **What it produces:** an interview brief, a page grammar, a journey, a feeling
19
+ curve with one engineered peak, a scroll score, one signature move, page copy,
20
+ assets, one real HTML page on a token-driven design floor, and a strip of
21
+ screenshots proving it holds at every scroll position.
22
+
23
+ ## Staying current
24
+
25
+ On activation, call the Luckiest MCP `check_updates` tool with
26
+ `{ listingId: "c17e533c-42eb-48f2-a0ed-6ef717051512", installedSemver: "1.0.0" }`. If it
27
+ returns `upToDate: false`, surface the `notice` to the user once, then continue.
28
+ Do nothing further if `upToDate: true`. Never block on this check; if the tool
29
+ is unavailable, proceed.
30
+
31
+ When the skill's work is done, call the Luckiest MCP `report_usage` tool once
32
+ with `{ listing_id: "luckiest-design-website", skill_version: "1.0.0", matched: true, success: <true if the skill completed, false otherwise> }`.
33
+ Metadata only, never prompt text. Never block on it; if the tool is
34
+ unavailable, skip silently.
35
+
36
+ ## The spine
37
+
38
+ Four rules. Everything else follows from them.
39
+
40
+ 1. **Variety is the product.** At least four device families per page, never
41
+ the same device twice in a row. Read [references/devices.md](references/devices.md)
42
+ when scoring acts.
43
+ 2. **The world is photographic** unless the brand is genuinely illustrated.
44
+ Clay diorama and low-poly are banned defaults. Read
45
+ [references/worlds.md](references/worlds.md) before writing an asset prompt.
46
+ 3. **No continuous chain** unless the brief literally says "one continuous
47
+ journey". Varying the device hides the cut for free.
48
+ 4. **Structure is its own axis.** A different world is not a different page.
49
+ Read [references/uniqueness.md](references/uniqueness.md) before picking a
50
+ grammar.
51
+
52
+ ## Step 0: The interview
53
+
54
+ **Always interview the human before generating anything.** Nine questions, one
55
+ pass, answers written verbatim into `<workspace>/builds/<name>/BRIEF.md`.
56
+
57
+ 1. **Vibe in three to five words**, plus up to three references from any medium
58
+ except websites. Naming sites is how a page ends up looking like one.
59
+ 2. **The scroll journey, section by section, in their words.**
60
+ 3. **The energy curve.** Where calm, where intense.
61
+ 4. **How should someone feel, stage by stage, and what is the ONE moment they
62
+ should remember?** This becomes the feeling curve and the peak. See
63
+ [references/feel.md](references/feel.md).
64
+ 5. **One thing this site should do that no site they have seen does.** The seed
65
+ of the signature move. "Be memorable" is not an answer.
66
+ 6. **How far from premium-minimal?** Offer the range in uniqueness.md §5.
67
+ 7. **One unbroken world, or distinct scenes?** The biggest structural fork.
68
+ Offer both plainly. Continuous world is
69
+ [references/worldflight.md](references/worldflight.md).
70
+ 8. **What assets and brand material exist?** Footage, photos, product shots, a
71
+ brand kit, an existing site. "Nothing" is fine and means a generated world.
72
+ 9. **Spend cap for generated assets, in dollars.** Zero is a first-class answer
73
+ and routes the build to own-assets plus CSS-only devices. See Step 3.
74
+
75
+ If they have an existing site and no brand kit, run `luckiest-extract-design-system`
76
+ on the URL to pull colours, fonts, spacing and radius into starter tokens.
77
+ Those tokens seed the six colour roles and two fonts in Step 4. A hard rule in a
78
+ real brand kit beats anything in this skill.
79
+
80
+ BRIEF.md must also contain the feeling curve, the peak (as the sentence a
81
+ visitor would say to a friend), the completed "It's the site where ___"
82
+ sentence, and any authored silence, so verification can tell it from dead
83
+ scroll. Spec: [references/feel.md](references/feel.md).
84
+
85
+ **If the human is unreachable** on a fully autonomous run, first offer to raise
86
+ an assist-request to the user's Luckiest tribe: a person who knows the brand
87
+ answers questions 1, 4 and 5 better than a model guessing in the brand's voice.
88
+ Only if that is declined or unavailable, self-author BRIEF.md, mark it
89
+ `Self-authored, not interviewed` at the top, and say so in the final report.
90
+
91
+ ## Bootstrap
92
+
93
+ Once, after the interview, before Step 1.
94
+
95
+ ```bash
96
+ node <skill>/scripts/doctor.mjs # node, full ffmpeg, playwright, Chrome, key, workspace
97
+ node <skill>/scripts/workspace.mjs --ensure # resolves the workspace, seeds an empty registry
98
+ ```
99
+
100
+ `doctor` exists because the common setup faults surface later as misleading
101
+ errors: a stripped ffmpeg reports a missing filter as a syntax error in your
102
+ command. Say which items are missing rather than working around them silently.
103
+ Verified on macOS and Windows; the scripts also search Linux paths.
104
+
105
+ The workspace resolves, first hit wins: `SCROLLCRAFT_HOME`, then the nearest
106
+ `.scrollcraft.json` walking up from the cwd, then `<project root>/scrollcraft`.
107
+ Builds land in `<workspace>/builds/<name>/`, the registry is
108
+ `<workspace>/FINGERPRINTS.md`, and it starts empty on purpose. The engine, env
109
+ vars and workspace file keep their upstream names so the mature scripts run
110
+ unchanged; the skill's name is what changed.
111
+
112
+ Copy `engine/scrollcraft.js` and `engine/scrollcraft.css` into the build folder.
113
+ **Never edit the engine per project.** Theme it with tokens, write your own
114
+ markup, and drive anything bespoke off the `--sc-p` custom property it
115
+ publishes. A runtime that builds the page from a config object is exactly why
116
+ every site built on one looks the same.
117
+
118
+ `KIE_AI_API_KEY` is only needed to generate assets, and only if the user chose
119
+ kie.ai in Step 3. Reference the env var name; never ask the user to paste the
120
+ key into chat. The key is sent as a bearer token to two kie.ai hosts
121
+ (`api.kie.ai` for jobs, `kieai.redpandaai.co` for `--ref` image upload), and
122
+ the only local file that leaves the machine is the reference image the user
123
+ passes explicitly.
124
+
125
+ ## Step 1: The brief, journey first
126
+
127
+ Ask only what Step 0 did not cover, open-ended, never as a made-up industry menu:
128
+
129
+ 1. What is this, and who is it for?
130
+ 2. What must the visitor believe by the end? One sentence. Three means pick one.
131
+ 3. What does the visitor do next? One action, one label, used everywhere.
132
+ 4. Art direction: offer the worlds in worlds.md as a real choice.
133
+
134
+ Then write the journey: four to seven beats, each a shift in what the visitor
135
+ knows or feels (Recognition, Tension, Turn, Substance, Range, Commitment is one
136
+ shape, not the shape). Sections serve beats. A section that serves no beat is
137
+ cut. Show the journey and get it right before generating a single asset.
138
+
139
+ ## Step 2: Grammar, gate, then score
140
+
141
+ In order. Detail in [references/uniqueness.md](references/uniqueness.md).
142
+
143
+ **Pick a grammar.** Eight, mutually exclusive: filmic one-shot, chaptered
144
+ editorial, live surface, continuous world, typographic poster, gallery, split
145
+ stage, rhythmic cutlist. Nav, hero and close follow from it. Choosing filmic
146
+ one-shot means saying in the report why the other seven lost.
147
+
148
+ **Invent the signature move.** One bespoke interaction coded in the page, not a
149
+ parameter change to a kit device. Interview question 5 is the seed.
150
+
151
+ **Run the fingerprint gate.** The build must differ from every row in
152
+ `<workspace>/FINGERPRINTS.md` on at least 4 of 6 dimensions: grammar, nav, hero
153
+ device, act-sequence shape, close pattern, signature move. Fail it and change
154
+ the plan, not the registry.
155
+
156
+ **Write the feeling curve before the score table.** One line per act: the
157
+ emotion, then what causes it. Name the peak and give it the largest span.
158
+
159
+ Then score each beat with a device and write the table (beat, device, why).
160
+ Checks before building:
161
+
162
+ - The grammar's bans hold.
163
+ - Four or more device families, none twice in a row, at most two `scrub` acts.
164
+ - No two adjacent acts carry the same feeling.
165
+ - One peak, largest span by a visible margin, quieter act before it.
166
+ - Total length 8 to 14 viewport-heights.
167
+ - **Lightweight devices go to CSS first.** `reveal`, `parallax`, `in` and
168
+ `drift` can run on `animation-timeline: scroll()` / `view()` behind
169
+ `@supports`, off the main thread, with the engine's JS as the fallback. Keep
170
+ the engine for `scrub`, `pin`, `pan` and anything reading `--sc-p`. Fewer
171
+ scroll listeners is the cheapest INP win on the page.
172
+
173
+ ## Step 3: Assets
174
+
175
+ Route by the spend cap from question 9:
176
+
177
+ | Cap | Route |
178
+ |---|---|
179
+ | $0 | User's own footage and photos only. Grade and encode them (assets.md, "Real footage"). Stills-only acts where no footage exists. |
180
+ | Small | Stills from `luckiest-image` or kie.ai, at most two clips. |
181
+ | Real budget | kie.ai stills and camera moves via `scripts/kie.mjs`, or `luckiest-video` for a model the user already pays for. |
182
+
183
+ Whatever generates them, three things decide premium versus generated:
184
+
185
+ - **One style preamble, reused verbatim in every prompt.** Six images become
186
+ one shoot. Write it once, never paraphrase.
187
+ - **Look at every asset before using it.** Rerolling is cheaper than shipping a
188
+ bad frame.
189
+ - **Encode for scrubbing, not playback.** `scripts/encode.sh` sets a dense GOP;
190
+ a normal web encode scrubs like mud. Cut phone clips portrait.
191
+
192
+ ```bash
193
+ node <skill>/scripts/kie.mjs still "<style preamble>\n\n<scene>" out/01.png --ar 16:9 [--ref brand.png]
194
+ node <skill>/scripts/kie.mjs shot "<camera move>" out/01.png out/01.mp4 --dur 5
195
+ bash <skill>/scripts/encode.sh out/01.mp4 assets/01.mp4
196
+ bash <skill>/scripts/encode.sh out/01.mp4 assets/01-m.mp4 mobile
197
+ ```
198
+
199
+ Full pipeline, prompt scaffolds, ratios kie.ai actually accepts, and the cost
200
+ ceiling arithmetic: [references/assets.md](references/assets.md). Report
201
+ per-call sums as a planning ceiling, never as measured spend.
202
+
203
+ ## Step 4: Build the page
204
+
205
+ **Copy first, markup second.** Run `luckiest-copywriting` against BRIEF.md and
206
+ the journey: one headline per act, the belief sentence, the one CTA label, in
207
+ the awareness stage the traffic arrives at. Then run
208
+ `luckiest-copywriting-humanize` as the finishing pass. The refuse list in
209
+ taste.md and the filler-verb ban apply to copy as much as to layout: no
210
+ "Build the future" class headlines, no invented numbers, no em dashes.
211
+
212
+ Write real HTML: real `<h1>`, real `<p>`, real links, real reading order. The
213
+ engine reads `data-sc-*` attributes off your markup and never generates DOM.
214
+ Start from `references/template.html` and then delete what you keep verbatim,
215
+ because a page that keeps its structure looks like every other page that did.
216
+ Device patterns: [references/devices.md](references/devices.md). Spacing, type,
217
+ colour, depth, motion and the refuse list: read
218
+ [references/taste.md](references/taste.md) before writing markup, not after.
219
+
220
+ Theme by overriding tokens, six colours and two fonts:
221
+
222
+ ```css
223
+ :root {
224
+ --sc-canvas: #0A0806; --sc-surface: #16110E;
225
+ --sc-ink: #F5EBDD; --sc-ink-soft: #A2968A;
226
+ --sc-accent: #FF5A3D; --sc-accent-ink: #15110F;
227
+ --sc-font-display: "Archivo", system-ui, sans-serif;
228
+ --sc-font-text: "Geist", system-ui, sans-serif;
229
+ }
230
+ ```
231
+
232
+ Two things a scroll page still owes search and measurement, both cheap here
233
+ because the copy is real markup:
234
+
235
+ - **Head and structured data.** Title, meta description, OG image from the
236
+ hero poster, and one JSON-LD block. Run `luckiest-schema` for the block; a
237
+ service company is `LocalBusiness` or `Organization`, a product is `Product`.
238
+ - **Events.** Run `luckiest-analytics` for the tracking plan: `act_reached`
239
+ per act, `peak_reached`, `cta_click`, and one scroll-depth event. The peak
240
+ reach rate is the number that tells you whether the page works.
241
+
242
+ ## Step 5: Verify by scrolling it
243
+
244
+ Not optional. A scroll page has no single state; the failures live between the
245
+ two positions you looked at. Procedure: [references/verify.md](references/verify.md).
246
+
247
+ ```bash
248
+ cd <build> && npm i playwright-core # once
249
+ node <skill>/scripts/serve.mjs --root . --port 4500 &
250
+ node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/shots
251
+ node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/mobile --width 390 --height 844
252
+ node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/reduced --reduced-motion
253
+ ```
254
+
255
+ The harness walks every act at six positions, waits for the scrub video to
256
+ settle, and reports dead scroll, cues that never reach full opacity, contrast
257
+ measured on the composited page at the brightest frame under each line, and
258
+ legs stuck on a poster. It writes a contact sheet.
259
+
260
+ Then the passes the harness cannot do:
261
+
262
+ 1. **Read `sheet.png`.** Composition, motion, meaning.
263
+ 2. **Tab through** for focus order.
264
+ 3. **The feel check** (feel.md §6): scroll cold, one word per act, then diff
265
+ against the intended curve. Where they disagree the page is wrong.
266
+ 4. **Performance budget.** Load the page with the DevTools performance panel or
267
+ a `PerformanceObserver` for `event` and `largest-contentful-paint`: LCP
268
+ under 2.5s on the hero poster, INP under 200ms while scrubbing. Video scrub
269
+ is the usual INP offender on phones; if the mobile run cannot hold 200ms,
270
+ the mobile variant of that act falls back to the poster plus CSS motion
271
+ rather than shipping a stutter. Safari 26.2+ reports both metrics, so the
272
+ phone can now be measured, not guessed at.
273
+ 5. **A real phone.** Headless Chrome cannot reproduce an iPhone's decoder,
274
+ autoplay policy, Low Power Mode or touch scroll. On the first mobile defect
275
+ report, deploy `references/device-diag.html` beside the site and let the
276
+ device answer.
277
+ 6. **The close, through a conversion lens.** Run `luckiest-cro` on the final
278
+ act only: one action, label matches the page, nothing competing, the page
279
+ resolves and holds rather than fading into a footer.
280
+
281
+ Fix, shoot again, and report what was verified and what was not.
282
+
283
+ ## Hard rules
284
+
285
+ Ship-blockers. Each one makes a page read as machine-made.
286
+
287
+ | Never | Instead |
288
+ |---|---|
289
+ | Clay diorama, low-poly, claymation as the default world | Photographic. worlds.md |
290
+ | A "scroll" cue, arrow or animated mouse | Nothing. They know |
291
+ | `01 / 06` section counters | Delete. Sequence is not information |
292
+ | An eyebrow above every heading | At most one per three sections |
293
+ | Em dash anywhere visible | Period, comma, colon, parentheses |
294
+ | Centred copy in every act | Vary the anchor: lead, trail, centre, split |
295
+ | Same device twice in a row | Score the journey properly |
296
+ | Generating before the interview | Step 0, or mark BRIEF.md self-authored |
297
+ | No engineered peak, or three competing | One peak: asset budget, silence before it, most scroll room |
298
+ | An ending that fades into a footer | The close resolves and holds |
299
+ | Acts planned before the feeling curve | Curve first |
300
+ | No bespoke signature move | Invent one. A recoloured spotlight is not one |
301
+ | Fewer than 4 of 6 fingerprint dimensions cleared | Change the plan, not the registry |
302
+ | Editing the engine | Bespoke JS in the page off `--sc-p` and your own `data-sc-*` |
303
+ | Filmic one-shot by habit | Pick from all eight and say why seven lost |
304
+ | Full-frame dark overlay for contrast | A scrim only where the text sits |
305
+ | Text baked into an image | Real markup |
306
+ | Invented statistics | Real numbers or no counter |
307
+ | `transition: all`, animating width/height/top/left | `transform`, `opacity`, `clip-path` |
308
+ | Gradient text, neon glow, blue-purple AI gradients | Weight and size; offset blurred shadows |
309
+ | Uniform 16px radius and identical card heights everywhere | Hierarchy through intentional variation, or no cards |
310
+ | Inter or a system font as the display face by default | A display family chosen for this brand |
311
+ | Audio on a scrub clip | Strip it. encode.sh does |
312
+ | A build that stutters past 200ms INP on the phone | Poster plus CSS motion for that act on mobile |
313
+ | Shipping without Step 5 | Run Step 5 |
314
+
315
+ ## Output
316
+
317
+ The build folder including BRIEF.md, then a short report: grammar and why the
318
+ other seven lost, signature move, fingerprint gate result per row, journey,
319
+ feeling curve and peak, feel-check diff, score table, copy source, what was
320
+ generated and what it cost as a ceiling, what was verified with screenshots,
321
+ INP and LCP readings, and anything not verified. Say if the brief was
322
+ self-authored. Give the local URL. Then append the row to
323
+ `<workspace>/FINGERPRINTS.md`.
324
+
325
+ To put it on the web, `vercel:deploy` from the build folder works as-is: the
326
+ page is static HTML plus assets.
327
+
328
+ ## Share with your tribe
329
+
330
+ After the report, offer, never auto-post: "Want me to share this build's
331
+ grammar, signature move and contact sheet with your Luckiest tribe? Anyone
332
+ building a scroll page will see a shape that is already taken and one that
333
+ worked." If they accept, share the fingerprint row and `sheet.png` only. Never
334
+ share BRIEF.md, brand assets, client names or unpublished copy. If they
335
+ decline, stop.
336
+
337
+ Then offer to seed a follow-up Luckiest plan with the three things a shipped
338
+ page needs next: the analytics events wired, a real-phone check, and one A/B
339
+ test on the peak or the close via `luckiest-ab-testing`.
340
+
341
+ ## Luckiest skills this composes with
342
+
343
+ | Step | Skill | What it contributes |
344
+ |---|---|---|
345
+ | 0 | `luckiest-extract-design-system` | Tokens from an existing site when there is no brand kit |
346
+ | 3 | `luckiest-image`, `luckiest-video` | Asset generation on models the user already has, instead of kie.ai |
347
+ | 4 | `luckiest-copywriting`, `luckiest-copywriting-humanize` | Act headlines, belief sentence, CTA label, de-slop pass |
348
+ | 4 | `luckiest-schema` | JSON-LD and head metadata |
349
+ | 4 | `luckiest-analytics` | Event plan: act reached, peak reached, CTA click |
350
+ | 5 | `luckiest-cro` | The close act, judged as a conversion surface |
351
+ | after | `luckiest-ab-testing` | One test on the peak or the close |
352
+
353
+ ## References, and when to load each
354
+
355
+ - [references/uniqueness.md](references/uniqueness.md): before choosing a
356
+ grammar, the signature move, or running the gate.
357
+ - [references/feel.md](references/feel.md): writing the feeling curve and the
358
+ peak; running the feel check.
359
+ - [references/devices.md](references/devices.md): scoring acts and writing
360
+ device markup.
361
+ - [references/worldflight.md](references/worldflight.md): only when the answer
362
+ to question 7 is "one unbroken world".
363
+ - [references/worlds.md](references/worlds.md): before the first asset prompt.
364
+ - [references/taste.md](references/taste.md): before writing markup.
365
+ - [references/assets.md](references/assets.md): generating, grading, encoding.
366
+ - [references/verify.md](references/verify.md): running and reading the harness.
367
+ - [references/template.html](references/template.html): the starting skeleton.
368
+ - [references/device-diag.html](references/device-diag.html): real-phone clip diagnosis.
369
+ - [references/registry-examples.md](references/registry-examples.md): the
370
+ upstream author's twelve-row registry, illustration only.
371
+ - [UPSTREAM-CHANGELOG.md](UPSTREAM-CHANGELOG.md): what broke on each upstream
372
+ build and the rule that came out of it.