luckiest-co 1.0.23 → 1.0.25

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 (35) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/bin/install.js +46 -12
  4. package/package.json +3 -2
  5. package/skills/luckiest-ad-creative/CHANGELOG.md +3 -0
  6. package/skills/luckiest-ad-creative/SKILL.md +4 -2
  7. package/skills/luckiest-design-website/CHANGELOG.md +3 -0
  8. package/skills/luckiest-design-website/SKILL.md +3 -2
  9. package/skills/luckiest-image/CHANGELOG.md +3 -0
  10. package/skills/luckiest-image/SKILL.md +4 -2
  11. package/skills/luckiest-launch/CHANGELOG.md +3 -0
  12. package/skills/luckiest-launch/SKILL.md +3 -3
  13. package/skills/luckiest-prompt-rewrite/CHANGELOG.md +3 -0
  14. package/skills/luckiest-prompt-rewrite/SKILL.md +4 -2
  15. package/skills/luckiest-social/CHANGELOG.md +3 -0
  16. package/skills/luckiest-social/SKILL.md +4 -2
  17. package/skills/luckiest-video/CHANGELOG.md +3 -0
  18. package/skills/luckiest-video/SKILL.md +4 -2
  19. package/skills/luckiest-video-studio/CHANGELOG.md +8 -0
  20. package/skills/luckiest-video-studio/SKILL.md +7 -3
  21. package/skills/luckiest-video-studio-cards/CHANGELOG.md +3 -0
  22. package/skills/luckiest-video-studio-cards/SKILL.md +4 -2
  23. package/skills/luckiest-video-studio-composition/ATTRIBUTION.md +22 -0
  24. package/skills/luckiest-video-studio-composition/CHANGELOG.md +30 -0
  25. package/skills/luckiest-video-studio-composition/LICENSE-iart +21 -0
  26. package/skills/luckiest-video-studio-composition/SKILL.md +212 -0
  27. package/skills/luckiest-video-studio-composition/references/grids-and-ratios.md +124 -0
  28. package/skills/luckiest-video-studio-composition/references/twenty-rules.md +47 -0
  29. package/skills/luckiest-video-studio-composition/scripts/frame_check.py +102 -0
  30. package/skills/luckiest-video-studio-recreate/CHANGELOG.md +3 -0
  31. package/skills/luckiest-video-studio-recreate/SKILL.md +5 -3
  32. package/skills/luckiest-video-studio-reel/CHANGELOG.md +3 -0
  33. package/skills/luckiest-video-studio-reel/SKILL.md +4 -2
  34. package/skills/luckiest-video-studio-talk/CHANGELOG.md +3 -0
  35. package/skills/luckiest-video-studio-talk/SKILL.md +4 -2
@@ -9,7 +9,7 @@
9
9
  "name": "luckiest",
10
10
  "source": "./",
11
11
  "description": "Plan, go, finish, plus bundled free Luckiest skills that work in Claude Code, web chat, and Cowork.",
12
- "version": "0.1.22",
12
+ "version": "0.1.24",
13
13
  "author": { "name": "Luckiest" }
14
14
  }
15
15
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "luckiest",
3
3
  "description": "Plan, go, finish. Guided planning, progress dashboards, and your luckiest.co tribe inside Claude Code.",
4
- "version": "0.1.22",
4
+ "version": "0.1.24",
5
5
  "author": { "name": "Luckiest" }
6
6
  }
package/bin/install.js CHANGED
@@ -64,7 +64,7 @@ function parseConfigDirArg() {
64
64
  const explicitConfigDir = parseConfigDirArg();
65
65
  const hasHelp = args.includes('--help') || args.includes('-h');
66
66
 
67
- console.log(banner);
67
+ if (require.main === module) console.log(banner);
68
68
 
69
69
  // Show help if requested
70
70
  if (hasHelp) {
@@ -201,6 +201,28 @@ function hasUnzip() {
201
201
  * Sync owned skills from luckiest.co into ~/.claude/skills/<name>/.
202
202
  * Never logs the key or the Authorization header.
203
203
  */
204
+ /**
205
+ * Move extracted skill folders into skillsRoot, replacing older copies.
206
+ * Published zips hold one top-level <skill>/ folder per skill (a bundle holds
207
+ * several). Older zips put SKILL.md at the root; those install as fallbackName.
208
+ * Returns the names placed. Entries without a SKILL.md or with an unsafe name
209
+ * are skipped.
210
+ */
211
+ function placeSkills(extractDir, skillsRoot, fallbackName) {
212
+ const moves = fs.existsSync(path.join(extractDir, 'SKILL.md'))
213
+ ? [[extractDir, fallbackName]]
214
+ : fs.readdirSync(extractDir, { withFileTypes: true })
215
+ .filter((e) => e.isDirectory() && !e.name.startsWith('.'))
216
+ .filter((e) => fs.existsSync(path.join(extractDir, e.name, 'SKILL.md')))
217
+ .map((e) => [path.join(extractDir, e.name), e.name]);
218
+ for (const [src, name] of moves) {
219
+ const dest = path.join(skillsRoot, name);
220
+ fs.rmSync(dest, { recursive: true, force: true });
221
+ fs.renameSync(src, dest);
222
+ }
223
+ return moves.map(([, name]) => name);
224
+ }
225
+
204
226
  async function syncSkills() {
205
227
  // Self-heal the /luckiest:luckiest:* duplicate: older installers copied
206
228
  // commands into ~/.claude/commands/luckiest even when the marketplace
@@ -273,15 +295,23 @@ async function syncSkills() {
273
295
  const buf = Buffer.from(await zipRes.arrayBuffer());
274
296
 
275
297
  if (unzipAvailable) {
276
- const dest = path.join(skillsRoot, safeName);
277
- fs.mkdirSync(dest, { recursive: true });
278
- const tmpZip = path.join(os.tmpdir(), `luckiest-skill-${safeName}-${Date.now()}.zip`);
279
- fs.writeFileSync(tmpZip, buf);
298
+ // Extract into a private temp dir under skillsRoot (same disk, so the
299
+ // final move is a rename), then place each skill folder at the top level.
300
+ const tmpDir = fs.mkdtempSync(path.join(skillsRoot, '.luckiest-sync-'));
280
301
  try {
281
- execFileSync('unzip', ['-q', '-o', tmpZip, '-d', dest]);
282
- results.push({ name, version: version || 'unknown', path: dest });
302
+ const tmpZip = path.join(tmpDir, 'skill.zip');
303
+ fs.writeFileSync(tmpZip, buf);
304
+ const extractDir = path.join(tmpDir, 'x');
305
+ execFileSync('unzip', ['-q', tmpZip, '-d', extractDir]);
306
+ for (const placed of placeSkills(extractDir, skillsRoot, safeName)) {
307
+ results.push({
308
+ name: placed,
309
+ version: placed === safeName ? (version || 'unknown') : `bundled with ${safeName}`,
310
+ path: path.join(skillsRoot, placed),
311
+ });
312
+ }
283
313
  } finally {
284
- fs.unlinkSync(tmpZip);
314
+ fs.rmSync(tmpDir, { recursive: true, force: true });
285
315
  }
286
316
  } else {
287
317
  const zipPath = path.join(skillsRoot, `${safeName}.zip`);
@@ -681,7 +711,11 @@ async function main() {
681
711
  await syncSkills();
682
712
  }
683
713
 
684
- main().catch((err) => {
685
- console.error(` ${red}Install failed: ${err.message}${reset}`);
686
- process.exit(1);
687
- });
714
+ if (require.main === module) {
715
+ main().catch((err) => {
716
+ console.error(` ${red}Install failed: ${err.message}${reset}`);
717
+ process.exit(1);
718
+ });
719
+ }
720
+
721
+ module.exports = { placeSkills };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "luckiest-co",
3
- "version": "1.0.23",
3
+ "version": "1.0.25",
4
4
  "description": "Luckiest for Claude Code: plan, go, finish. Your luckiest.co skills and tribe, inside Claude.",
5
5
  "bin": {
6
6
  "luckiest-co": "./bin/install.js"
@@ -14,7 +14,8 @@
14
14
  "hooks",
15
15
  ".claude-plugin",
16
16
  "!**/__pycache__",
17
- "!**/*.pyc"
17
+ "!**/*.pyc",
18
+ "!bin/*.test.js"
18
19
  ],
19
20
  "license": "SEE LICENSE IN LICENSE",
20
21
  "engines": {
@@ -1,5 +1,8 @@
1
1
  # Changelog — luckiest-ad-creative
2
2
 
3
+ ## 1.1.1 — 2026-10-03
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.1.0 — 2026-07-06
4
7
  Skill updater pass: analytics integration.
5
8
 
@@ -3,7 +3,7 @@ name: luckiest-ad-creative
3
3
  description: "Generates, iterates, and scales ad creative — headlines, descriptions, primary text, or full ad variations — for any paid advertising platform, and iterates from real performance data. Use when the user mentions 'ad copy variations,' 'ad creative,' 'generate headlines,' 'RSA headlines,' 'bulk ad copy,' 'ad iterations,' 'creative testing,' 'ad performance optimization,' 'write me some ads,' 'Facebook ad copy,' 'Google ad headlines,' 'LinkedIn ad text,' or 'I need more ad variations.' Use whenever someone needs to produce ad copy at scale or iterate on existing ads. For campaign strategy and targeting, see luckiest-ads. For landing page copy, see luckiest-copywriting."
4
4
  license: See ATTRIBUTION.md
5
5
  metadata:
6
- version: "1.1.0"
6
+ version: "1.1.1"
7
7
  listing_id: luckiest-ad-creative
8
8
  author: luckiest
9
9
  ---
@@ -16,7 +16,7 @@ This skill drives an expert performance creative strategist. The goal is to gene
16
16
 
17
17
  On activation, call the Luckiest MCP check_updates tool with { listingId: "9ce2c363-e379-45f7-b7d2-c398992ed30f", installedSemver: "1.1.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
18
18
 
19
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-ad-creative", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
19
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-ad-creative", skill_version: "1.1.1", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
20
 
21
21
  ## Before Starting
22
22
 
@@ -152,6 +152,8 @@ For image and video ad creative, use generative AI tools and code-based video re
152
152
  - **Platform image specs** — Correct dimensions for every ad placement
153
153
  - **Cost comparison** — Pricing for 100+ ad variations across tools
154
154
 
155
+ **Composition:** if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas. Check the headline, product, and CTA against the placement's safe area.
156
+
155
157
  **Recommended workflow for scaled production:**
156
158
  1. Generate hero creative with AI tools (exploratory, high-quality)
157
159
  2. Build Remotion templates based on winning patterns
@@ -1,5 +1,8 @@
1
1
  # Changelog — luckiest-design-website
2
2
 
3
+ ## 1.0.1 — 2026-10-03
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.0.0 — 2026-09-04
4
7
  Rebranded from scrollcraft (scroll-craft by Nate Herk, MIT, upstream v0.2.0).
5
8
 
@@ -4,7 +4,7 @@ description: "Builds a premium, scroll-driven landing page for any business and
4
4
  license: See ATTRIBUTION.md
5
5
  allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
6
6
  metadata:
7
- version: "1.0.0"
7
+ version: "1.0.1"
8
8
  listing_id: luckiest-design-website
9
9
  author: luckiest
10
10
  ---
@@ -29,7 +29,7 @@ Do nothing further if `upToDate: true`. Never block on this check; if the tool
29
29
  is unavailable, proceed.
30
30
 
31
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> }`.
32
+ with `{ listing_id: "luckiest-design-website", skill_version: "1.0.1", matched: true, success: <true if the skill completed, false otherwise> }`.
33
33
  Metadata only, never prompt text. Never block on it; if the tool is
34
34
  unavailable, skip silently.
35
35
 
@@ -344,6 +344,7 @@ test on the peak or the close via `luckiest-ab-testing`.
344
344
  |---|---|---|
345
345
  | 0 | `luckiest-extract-design-system` | Tokens from an existing site when there is no brand kit |
346
346
  | 3 | `luckiest-image`, `luckiest-video` | Asset generation on models the user already has, instead of kie.ai |
347
+ | 3 | `luckiest-video-studio-composition` | Focal point, grid, and white space for hero stills and clips, if installed |
347
348
  | 4 | `luckiest-copywriting`, `luckiest-copywriting-humanize` | Act headlines, belief sentence, CTA label, de-slop pass |
348
349
  | 4 | `luckiest-schema` | JSON-LD and head metadata |
349
350
  | 4 | `luckiest-analytics` | Event plan: act reached, peak reached, CTA click |
@@ -1,5 +1,8 @@
1
1
  # Changelog — luckiest-image
2
2
 
3
+ ## 1.1.1 — 2026-10-03
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.1.0 — 2026-07-06
4
7
  Skill updater pass: analytics integration.
5
8
 
@@ -3,7 +3,7 @@ name: luckiest-image
3
3
  description: "When the user wants to create, generate, edit, or optimize images for marketing — blog heroes, social graphics, product mockups, profile banners, listing visuals, or brand assets. Also use when the user mentions 'AI image generation,' 'generate an image,' 'create a graphic,' 'product mockup,' 'hero image,' 'social media graphic,' 'banner image,' 'cover photo,' 'profile banner,' 'listing screenshot,' 'Flux,' 'Flux Kontext,' 'Midjourney,' 'DALL-E,' 'GPT Image,' 'ChatGPT Images,' 'Ideogram,' 'Gemini image,' 'Nano Banana,' 'Recraft,' 'Stable Diffusion,' 'Canva,' 'Figma,' 'image optimization,' 'compress images,' 'WebP,' or 'OG image.' Use this for general-purpose marketing image creation and optimization. For paid ad image creative and platform-specific ad specs, see luckiest-ad-creative. For video production, see luckiest-video."
4
4
  license: See ATTRIBUTION.md
5
5
  metadata:
6
- version: "1.1.0"
6
+ version: "1.1.1"
7
7
  listing_id: luckiest-image
8
8
  author: luckiest
9
9
  ---
@@ -16,7 +16,7 @@ An expert visual content producer that helps create marketing images using AI ge
16
16
 
17
17
  On activation, call the Luckiest MCP check_updates tool with { listingId: "bab8f465-a6db-49db-9623-87a62e2c6893", installedSemver: "1.1.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
18
18
 
19
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-image", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
19
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-image", skill_version: "1.1.1", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
20
 
21
21
  ## Before Starting
22
22
 
@@ -117,6 +117,8 @@ clean commercial photography style, 16:9 aspect ratio, 4K
117
117
  - Requesting complex text — use overlays instead for anything beyond short headlines
118
118
  - No style direction — "photorealistic," "flat illustration," "3D render"
119
119
 
120
+ **Composition:** if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas before writing the Composition part of the prompt or cropping to size.
121
+
120
122
  For detailed prompting guides per model, see [references/ai-image-prompting.md](references/ai-image-prompting.md).
121
123
 
122
124
  ### Dimensions: generate to ratio, crop to exact pixels
@@ -1,5 +1,8 @@
1
1
  # Changelog — luckiest-launch
2
2
 
3
+ ## 1.1.1 — 2026-10-03
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.1.0 — 2026-07-06
4
7
  Skill updater pass: analytics integration.
5
8
 
@@ -3,7 +3,7 @@ name: luckiest-launch
3
3
  description: "When the user wants to plan a product launch, feature announcement, or release strategy. Also use when the user mentions 'launch,' 'Product Hunt,' 'feature release,' 'announcement,' 'go-to-market,' 'beta launch,' 'early access,' 'waitlist,' 'product update,' 'how do I launch this,' 'launch checklist,' 'GTM plan,' or 'we're about to ship.' Use this whenever someone is preparing to release something publicly. For ongoing marketing after launch, see luckiest-marketing-ideas. For the offer being launched (bonuses, guarantees, scarcity, naming), see luckiest-offers."
4
4
  license: See ATTRIBUTION.md
5
5
  metadata:
6
- version: "1.1.0"
6
+ version: "1.1.1"
7
7
  listing_id: luckiest-launch
8
8
  author: luckiest
9
9
  ---
@@ -16,7 +16,7 @@ This skill helps the user plan SaaS product launches and feature announcements t
16
16
 
17
17
  On activation, call the Luckiest MCP check_updates tool with { listingId: "b65cba33-d644-4eda-b14b-aea9b19f203e", installedSemver: "1.1.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
18
18
 
19
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-launch", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
19
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-launch", skill_version: "1.1.1", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
20
 
21
21
  ## Before Starting
22
22
 
@@ -332,7 +332,7 @@ Even small changelog updates remind customers the product is evolving. This buil
332
332
  - [ ] Rented channel presence (social profiles optimized)
333
333
  - [ ] Borrowed channel opportunities identified (podcasts, influencers)
334
334
  - [ ] Product Hunt listing prepared (if using), launch date deconflicted
335
- - [ ] Launch assets created (screenshots, demo video, GIFs)
335
+ - [ ] Launch assets created (screenshots, demo video, GIFs). For framing, if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas
336
336
  - [ ] Onboarding flow ready
337
337
  - [ ] Analytics/tracking in place
338
338
  - [ ] Pre-mortem run: top failure modes identified and mitigated
@@ -1,5 +1,8 @@
1
1
  # Changelog — luckiest-prompt-rewrite
2
2
 
3
+ ## 1.2.1 — 2026-10-03
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.2.0 — 2026-07-06
4
7
  ### luckiest-thinker integration + analytics
5
8
  - Added a **Variant diversity** technique to Safe Techniques: when a request asks
@@ -4,7 +4,7 @@ description: Rewrites a rough idea or an existing prompt into a single productio
4
4
  license: See ATTRIBUTION.md
5
5
  user-invocable: true
6
6
  metadata:
7
- version: "1.2.0"
7
+ version: "1.2.1"
8
8
  listing_id: luckiest-prompt-rewrite
9
9
  author: luckiest
10
10
  ---
@@ -17,7 +17,7 @@ If it returns `upToDate: false`, surface the `notice` to the user. Do nothing fu
17
17
 
18
18
  ---
19
19
 
20
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-prompt-rewrite", skill_version: "1.2.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-prompt-rewrite", skill_version: "1.2.1", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
21
21
 
22
22
  ## PRIMACY ZONE — Identity, Hard Rules, Output Lock
23
23
 
@@ -278,6 +278,8 @@ Fable 5 follows brief, intent-level instructions better than Opus 4.8 — steer
278
278
 
279
279
  ---
280
280
 
281
+ **Composition for image and video targets:** if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas, and use its terms (rule of thirds, negative space, leading lines) in the composition part of the prompt.
282
+
281
283
  **Image AI — Generation** (Midjourney, DALL-E 3, Stable Diffusion, SeeDream)
282
284
  First detect: generation from scratch or editing an existing image?
283
285
 
@@ -1,5 +1,8 @@
1
1
  # Changelog — luckiest-social
2
2
 
3
+ ## 1.1.1 — 2026-10-03
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.1.0 — 2026-07-06
4
7
  Skill updater pass: analytics integration.
5
8
 
@@ -3,7 +3,7 @@ name: luckiest-social
3
3
  description: "When the user wants help creating, scheduling, or optimizing social media content for LinkedIn, Twitter/X, Instagram, TikTok, Facebook, or other platforms, or wants to do social listening and engagement triage. Also use when the user mentions 'LinkedIn post,' 'Twitter thread,' 'social media,' 'content calendar,' 'social scheduling,' 'engagement,' 'viral content,' 'what should I post,' 'repurpose this content,' 'tweet ideas,' 'LinkedIn carousel,' 'social media strategy,' 'grow my following,' 'TikTok video,' 'Reels,' 'Shorts,' 'video script,' 'video hook,' 'short-form video,' 'create a reel,' 'social listening,' 'brand mentions,' 'competitor monitoring,' 'top posts to comment on,' or 'find people asking for.' Use this for social media content creation, repurposing, scheduling, short-form video scripting, and social listening. For broader content strategy, see luckiest-content-strategy. For paid ads, see luckiest-ad-creative. For earned media, see luckiest-public-relations."
4
4
  license: See ATTRIBUTION.md
5
5
  metadata:
6
- version: "1.1.0"
6
+ version: "1.1.1"
7
7
  listing_id: luckiest-social
8
8
  author: luckiest
9
9
  ---
@@ -16,7 +16,7 @@ An expert social media strategist skill. The goal is to help create engaging con
16
16
 
17
17
  On activation, call the Luckiest MCP check_updates tool with { listingId: "e1b9c06a-7c04-4127-977c-9eb15cbac02f", installedSemver: "1.1.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
18
18
 
19
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-social", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
19
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-social", skill_version: "1.1.1", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
20
 
21
21
  ## Human-in-the-loop guardrail
22
22
 
@@ -63,6 +63,8 @@ Gather this context (ask if not provided):
63
63
 
64
64
  **For detailed platform strategies**: See [references/platforms.md](references/platforms.md)
65
65
 
66
+ **For post images, thumbnails, and video frames**: if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas for 9:16, 1:1, and 4:5.
67
+
66
68
  **For hashtag limits and character counts**: See [references/platform-limits.md](references/platform-limits.md)
67
69
 
68
70
  > Specs drift. Posting frequencies, character counts, and optimal video lengths change as platforms tune their algorithms. Treat the numbers in this skill as a starting baseline, not gospel — [references/platform-limits.md](references/platform-limits.md) is the source of truth, and when a limit is load-bearing for a deliverable, verify the current value before committing to it.
@@ -1,5 +1,8 @@
1
1
  # Changelog — luckiest-video
2
2
 
3
+ ## 1.1.1 — 2026-10-03
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.1.0 — 2026-07-06
4
7
  Skill updater pass: analytics integration.
5
8
 
@@ -3,7 +3,7 @@ name: luckiest-video
3
3
  description: "When the user wants to create, generate, or produce video content using AI tools or programmatic frameworks. Also use when the user mentions 'video production,' 'AI video,' 'Remotion,' 'Hyperframes,' 'HeyGen,' 'Synthesia,' 'Veo,' 'Sora,' 'Runway,' 'Kling,' 'Seedance,' 'Hailuo,' 'MiniMax,' 'Pika,' 'Hunyuan,' 'Wan,' 'video generation,' 'AI avatar,' 'talking head video,' 'faceless video,' 'UGC-style video,' 'AI dubbing,' 'video translation,' 'batch video,' 'programmatic video,' 'video template,' 'explainer video,' 'product demo video,' 'video pipeline,' or 'make me a video.' Use this for video creation, generation, and production workflows. For video content strategy and what to post, see luckiest-social. For paid video ad creative, see luckiest-ad-creative."
4
4
  license: See ATTRIBUTION.md
5
5
  metadata:
6
- version: "1.1.0"
6
+ version: "1.1.1"
7
7
  listing_id: luckiest-video
8
8
  author: luckiest
9
9
  ---
@@ -16,7 +16,7 @@ An expert video producer that helps create marketing videos using AI generation
16
16
 
17
17
  On activation, call the Luckiest MCP check_updates tool with { listingId: "2991a487-dd00-4f65-a9cd-b51fc34fedd1", installedSemver: "1.1.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
18
18
 
19
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-video", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
19
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-video", skill_version: "1.1.1", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
20
 
21
21
  ## Before Starting
22
22
 
@@ -173,6 +173,8 @@ cinematic color grading, 4K
173
173
  - Forgetting style — "cinematic," "documentary," "commercial"
174
174
  - Requesting text in video — AI models struggle with readable text
175
175
 
176
+ **Composition:** if `luckiest-video-studio-composition` is installed, read it to place the focal point, pick the grid, and keep white space and platform safe areas for each shot's framing before you write the camera part of the prompt.
177
+
176
178
  **For detailed prompting guides**: load [references/ai-video-prompting.md](references/ai-video-prompting.md) when writing or refining a generation prompt, choosing camera vocabulary, or troubleshooting weak results.
177
179
 
178
180
  ### When to Use AI Generation vs. Stock
@@ -1,5 +1,13 @@
1
1
  # Changelog — luckiest-video-studio
2
2
 
3
+ ## 1.6.0 (2026-10-03)
4
+ - New `luckiest-video-studio-composition` sub-skill: focal placement (thirds, phi
5
+ grid, golden spiral and triangles), white-space budgets, platform safe areas,
6
+ and the 20 photo composition rules adapted to video.
7
+ - Step 3 reads it for each scene's hold frame. Step 4 runs
8
+ `luckiest-video-studio-composition --review` (writes `qa/composition-review.md`)
9
+ before the motion review.
10
+
3
11
  ## 1.5.1 (2026-10-02)
4
12
  - Step 2 routes narrated videos of 30 seconds or more to the new
5
13
  `luckiest-video-studio-script` sub-skill, whose lines become scenes.
@@ -4,7 +4,7 @@ description: "Make product launch videos, product demos with motion design betwe
4
4
  license: See ATTRIBUTION.md
5
5
  allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
6
6
  metadata:
7
- version: "1.5.1"
7
+ version: "1.6.0"
8
8
  listing_id: luckiest-video-studio
9
9
  author: luckiest
10
10
  ---
@@ -25,7 +25,7 @@ further if `upToDate: true`. Never block on this check; if the tool is unavailab
25
25
  proceed.
26
26
 
27
27
  When the skill's work is done, call the Luckiest MCP `report_usage` tool once with
28
- `{ listing_id: "luckiest-video-studio", skill_version: "1.5.1", matched: true, success: <true if the skill completed, false otherwise> }`.
28
+ `{ listing_id: "luckiest-video-studio", skill_version: "1.6.0", matched: true, success: <true if the skill completed, false otherwise> }`.
29
29
  Metadata only, never prompt text. Never block on it; if the tool is unavailable,
30
30
  skip silently.
31
31
 
@@ -178,7 +178,8 @@ length.
178
178
  `hyperframes-keyframes`, `hyperframes-creative`, `hyperframes-cli`, then
179
179
  [references/step-3-compose.md](references/step-3-compose.md),
180
180
  [references/audio.md](references/audio.md), and the `luckiest-video-studio-motion`
181
- sub-skill for easing, duration, origin, and transitions. Do not enter the `hyperframes` intent
181
+ sub-skill for easing, duration, origin, and transitions. Read the `luckiest-video-studio-composition` sub-skill for
182
+ focal placement, grids, and white space at each scene's hold frame. Do not enter the `hyperframes` intent
182
183
  interview or its generic launch-video workflow; this skill owns the story.
183
184
 
184
185
  Build each motion and logo scene as its own sub-composition. For demo scenes,
@@ -206,6 +207,9 @@ node <skill-dir>/scripts/qa.mjs crossfade <output-dir>/composition # full-fra
206
207
  node <skill-dir>/scripts/qa.mjs motion <output-dir>/composition # ease-in entrances, scale 0 cards, short linear moves
207
208
  ```
208
209
 
210
+ Then run `luckiest-video-studio-composition --review` on the run. It writes
211
+ `qa/composition-review.md` with a verdict per scene. Fix every scene it blocks.
212
+
209
213
  Then run `luckiest-video-studio-motion --review` on the run. It writes
210
214
  `qa/motion-review.md` with a verdict per scene. Fix and re-render every scene it
211
215
  blocks before the judge.
@@ -1,5 +1,8 @@
1
1
  # Changelog: luckiest-video-studio-cards
2
2
 
3
+ ## 1.0.1 (2026-10-03)
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.0.0 (2026-09-30)
4
7
  - New sub-skill: 406 cards in the paper-collage and aurora-glass packs, a
5
8
  blueprint, two scene templates, and registry and new-pack scripts.
@@ -14,7 +14,7 @@ user-invocable: false
14
14
  license: MIT. See ATTRIBUTION.md
15
15
  allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
16
16
  metadata:
17
- version: "1.0.0"
17
+ version: "1.0.1"
18
18
  listing_id: luckiest-video-studio-cards
19
19
  author: luckiest
20
20
  ---
@@ -32,7 +32,7 @@ On activation, call the Luckiest MCP `check_updates` tool with
32
32
  `upToDate: false`, surface the `notice` once and continue. Never block on it.
33
33
 
34
34
  When done, call `report_usage` once with
35
- `{ listing_id: "luckiest-video-studio-cards", skill_version: "1.0.0", matched: true, success: <true|false> }`.
35
+ `{ listing_id: "luckiest-video-studio-cards", skill_version: "1.0.1", matched: true, success: <true|false> }`.
36
36
  Metadata only. Skip silently if unavailable.
37
37
 
38
38
  ## Standing rules
@@ -82,6 +82,8 @@ loaded from `composition/assets/fonts/` when the files are there.
82
82
 
83
83
  ## Step 3: Place
84
84
 
85
+ Read `luckiest-video-studio-composition` for the card's focal point, grid, and white space at its hold frame.
86
+
85
87
  - **tier1:** copy the branded card to `composition/compositions/<scene-id>.html`
86
88
  (its `tokens.css` link, `cards/<pack-id>/tokens.css`, is already relative to
87
89
  `composition/`, so it resolves in Studio and in the render), fill every
@@ -0,0 +1,22 @@
1
+ # Attribution
2
+
3
+ `luckiest-video-studio-composition` is a Luckiest sub-skill of `luckiest-video-studio`.
4
+
5
+ | Source | License | What this sub-skill uses | License file |
6
+ |---|---|---|---|
7
+ | **shot-composition** by iart.ai (`iart-ai/motion-design-skills`, https://github.com/iart-ai/motion-design-skills/tree/main/skills/shot-composition) | MIT, Copyright (c) 2026 iart.ai | Grid math and worked tables, rule-of-thirds placement, hierarchy order, negative space, depth layers and parallax speeds, safe-area table, camera-move values, and the anti-pattern framing | `LICENSE-iart` |
8
+ | **20 rules of photo composition** (SlideShare deck, https://www.slideshare.net/slideshow/20-rules-of-photo-composition/248755645) | Not stated | The list of 20 rule names only. Explanations, video adaptations, and tests are original | n/a |
9
+
10
+ ## Changes in this edition
11
+
12
+ - Refocused from general motion design to hold frames in `luckiest-video-studio`
13
+ runs (HyperFrames and GSAP).
14
+ - Added the golden ratio: phi grid, golden spiral, golden triangles, phi type
15
+ scale, with pixel tables per aspect.
16
+ - Added white-space budgets per scene type and the 20 rules with pass/fail tests.
17
+ - Added `--review` mode and rendered-still checks (squint, thumbnail, overlay).
18
+ - Removed cross-references to iart skills not installed here
19
+ (`animation-principles`, `motion-art-direction`, `gsap-web`, `remotion-video`,
20
+ `after-effects`). Easing and timing defer to `luckiest-video-studio-motion`.
21
+ - Replaced CSS scroll, pointer, and Three.js parallax code with GSAP. Dropped the
22
+ orbit and dolly-zoom recipes.
@@ -0,0 +1,30 @@
1
+ # Changelog — luckiest-video-studio-composition
2
+
3
+ ## 1.1.0 — 2026-10-03
4
+ - Description widened so it triggers for generated images, product photos,
5
+ mockups, thumbnails, ads, and launch videos, not only video-studio scenes.
6
+ - Image, ad creative, AI video, social, launch, website design, and prompt
7
+ rewrite skills now point here when it is installed.
8
+
9
+ ## 1.0.0 — 2026-10-03
10
+ - New sub-skill of luckiest-video-studio, based on iart.ai `shot-composition` (MIT).
11
+ - Placement systems: rule of thirds, phi grid, golden spiral, golden triangles,
12
+ centered symmetry, with pixel anchors for 16:9, 9:16, 1:1, 4:5.
13
+ - White-space budgets per scene type. Focal spacing at least 1.5x supporting spacing.
14
+ - `references/twenty-rules.md`: the 20 photo composition rules adapted to video,
15
+ each with a pass/fail test, mapped to motion-skill scene purposes.
16
+ - `--review` writes `qa/composition-review.md` with Approve or Block per scene.
17
+ - Rendered-still checks: squint blur, 160px thumbnail, anchor overlay.
18
+ - Network hook: after `--review`, offer to share the worst frame and its fix with
19
+ the tribe for a second eye.
20
+ - `scripts/frame_check.py` (Pillow): draws thirds, phi, golden triangle, and
21
+ safe-area overlays, writes squint and 160px thumbnail stills, and scores the
22
+ focal point against each anchor system (exit 1 when off by more than 3%).
23
+ - 9:16 safe areas corrected from 13/19/6/6% to 15/35/11/18%, with per-platform
24
+ pixels for TikTok, Reels, and Shorts. Source: postplanify.com and brandeal.ai
25
+ safe-zone guides, checked 2026-10-03.
26
+ - Trend pass: not run. `/newsjack` and `/luckiest-trends` were skipped for this
27
+ build. Safe-area percentages carry a re-check note instead.
28
+ - Thumbnail: description routes to `checklist` (matched "rule"). Real keyword
29
+ match but loose. A composition or grid scene would fit better; that is a
30
+ separate `/luckiest-micrographic` task.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 iart.ai
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,212 @@
1
+ ---
2
+ name: luckiest-video-studio-composition
3
+ description: >-
4
+ Frame composition for video scenes, generated images, product photos, mockups,
5
+ thumbnails, ads, and launch videos. Places the focal point, sets the grid, and
6
+ reserves white space using the rule of thirds, golden ratio (phi grid, golden
7
+ spiral, golden triangles), 12 column and 8px grids, platform safe areas, and the
8
+ 20 classic photo composition rules (leading lines, rule of odds, rule of space,
9
+ frame within a frame, and more). Also reviews frames and stills against those
10
+ rules. Used by luckiest-video-studio while composing, and by image, video, ad,
11
+ social, and prompt skills before they frame a shot. Trigger on "the frame feels
12
+ cluttered", "where should this go", "where should the subject go", "frame this",
13
+ "compose this shot", "use the rule of thirds", "golden
14
+ ratio layout", "more white space", "review the composition", "adapt this to 9:16", or "/luckiest-video-studio-composition". For easing
15
+ and transitions use luckiest-video-studio-motion. For building the whole video
16
+ use luckiest-video-studio.
17
+ argument-hint: "[run-dir] [--review] [--scene <id>] [--aspect 16:9|9:16|1:1|4:5]"
18
+ user-invocable: true
19
+ license: MIT. See ATTRIBUTION.md
20
+ allowed-tools: Bash, Read, Write, Edit, Glob, Grep
21
+ metadata:
22
+ version: "1.1.0"
23
+ listing_id: luckiest-video-studio-composition
24
+ author: luckiest
25
+ ---
26
+
27
+ # Composition for video frames
28
+
29
+ Decides where things sit in the frame and how much empty space surrounds them.
30
+ Every scene is judged at its **hold frame**, the frame where motion has settled
31
+ and the viewer reads it. Motion between holds belongs to
32
+ `luckiest-video-studio-motion`.
33
+
34
+ ## Staying current
35
+
36
+ On activation, call the Luckiest MCP `check_updates` tool with
37
+ `{ listingId: "luckiest-video-studio-composition", installedSemver: "1.1.0" }`. If
38
+ `upToDate: false`, surface the `notice` once and continue. Never block on it.
39
+
40
+ When done, call `report_usage` once with
41
+ `{ listing_id: "luckiest-video-studio-composition", skill_version: "1.1.0", matched: true, success: <true|false> }`.
42
+ Metadata only, never prompt text. Skip silently if unavailable.
43
+
44
+ ## Modes
45
+
46
+ | Mode | Use when | Output |
47
+ |---|---|---|
48
+ | Build (default) | Composing or fixing a scene | A composition plan per scene, then code that follows it |
49
+ | `--review` | After `npx hyperframes check` passes, before `luckiest-video-studio-motion --review` | `<run-dir>/qa/composition-review.md` |
50
+ | `--aspect` | Adapting a master to another aspect | Restack plan for that aspect |
51
+
52
+ ## 1. Pick one placement system per scene
53
+
54
+ Pick before placing anything. Mixing systems in one frame makes alignment drift.
55
+
56
+ | System | Use when | Anchor points (fraction of W and H) |
57
+ |---|---|---|
58
+ | **Rule of thirds** | Default. One subject plus supporting text | 0.333 / 0.667 |
59
+ | **Phi grid** (golden ratio) | Premium, editorial, calm. A subject that needs more breathing room on one side | 0.382 / 0.618 |
60
+ | **Golden spiral** | One hero object with a detail to land on (a phone screen, a logo mark) | Spiral eye at ~0.618 / 0.618 from the open corner |
61
+ | **Golden triangles** | Diagonal products, angled UI, a strong slant in the shot | Main diagonal plus perpendiculars from the other two corners |
62
+ | **Centered symmetry** | Logo reveals, single-word statements, end cards, deliberate stillness | 0.5 / 0.5, mirrored weight |
63
+
64
+ Phi and thirds differ by about 5% of the frame (on 1920px: 640 vs 733). Use phi
65
+ when the extra room on the open side matters. Do not claim a frame "uses the
66
+ golden spiral" unless the subject's detail actually lands on the spiral eye.
67
+
68
+ Formulas and pixel tables for every aspect are in
69
+ [references/grids-and-ratios.md](references/grids-and-ratios.md). Load it when
70
+ placing exact coordinates.
71
+
72
+ ## 2. Set the grid
73
+
74
+ - 12 columns for 16:9 and 1:1, 6 columns for 9:16.
75
+ - 8px base unit. Spacing from 8, 16, 24, 32, 48, 64, 96, 128. Type sizes on the
76
+ same scale.
77
+ - Every element edge lands on a column edge or a baseline. A 3px misalignment
78
+ reads as a mistake at 1080p.
79
+
80
+ ## 3. Reserve white space before placing content
81
+
82
+ White space is assigned, not left over. Set these budgets first, then fit
83
+ content into what remains.
84
+
85
+ | Scene type | Minimum empty area of the safe frame |
86
+ |---|---|
87
+ | Logo, statement, end card | 60% |
88
+ | Hero product with headline | 40% |
89
+ | Stat or data card | 30% |
90
+ | Dense explainer (diagram, UI walkthrough) | 20% |
91
+
92
+ - Space around the focal point is at least 1.5x the space between supporting
93
+ elements. Equal gaps everywhere make the frame read as a list, not a hierarchy.
94
+ - Related items sit closer to each other than to anything else (proximity).
95
+ - When a frame feels cluttered, remove an element before shrinking anything.
96
+
97
+ ## 4. Rank the hierarchy
98
+
99
+ One primary focal point per hold frame. Rank every element by
100
+ **size > contrast > color > position**. Secondaries must lose on at least two of
101
+ those four. Test it with the squint check in section 7.
102
+
103
+ ## 5. Apply the 20 composition rules
104
+
105
+ The full rule set, each adapted to motion graphics with a pass/fail test, is in
106
+ [references/twenty-rules.md](references/twenty-rules.md). Load it in Build mode
107
+ when a scene's placement is still undecided, and always in `--review`.
108
+
109
+ Rules that most often decide a video frame:
110
+
111
+ - **Rule of space / lead room.** A subject that moves or faces a direction gets
112
+ open space on that side. A speaker looking right sits on the left third.
113
+ - **Leading lines and diagonals.** UI edges, arrows, and gradients point at the
114
+ focal point, never off-frame.
115
+ - **Rule of odds.** Groups of 3 or 5 cards, icons, or logos read as designed.
116
+ Groups of 2 or 4 invite comparison. Use even numbers only when comparing.
117
+ - **Frame within a frame.** Device bezels, cards, and masks frame the subject.
118
+ One frame level per scene.
119
+ - **Left to right.** New content enters and progresses left to right (reverse
120
+ for RTL scripts). Reverse direction only to mean "back" or "against".
121
+ - **Balance.** A large element on one side is balanced by a smaller, higher
122
+ contrast element or by deliberate empty space on the other.
123
+
124
+ ## 6. Safe areas and aspects
125
+
126
+ Critical content (text, logos, faces, CTAs) stays inside title-safe. On 9:16,
127
+ platform UI covers the top 15%, the bottom 35%, and the right 18%, with TikTok's
128
+ action rail reaching 28% in from the right from mid-frame down. Per-platform
129
+ pixels are in the grids reference. Use one platform's row when the video targets
130
+ only that platform.
131
+
132
+ To adapt across aspects, master in 16:9 with the focal point near the vertical
133
+ center band. For 9:16, restack side-by-side elements vertically, enlarge type
134
+ 15-25%, and move the focal point up toward 0.4 H. Never make vertical by cropping
135
+ the master.
136
+
137
+ ## 7. Checks that catch what reading the code misses
138
+
139
+ Run these on a rendered still of each hold frame
140
+ (`npx hyperframes render --frame <t>` or a screenshot of the preview), then:
141
+
142
+ ```bash
143
+ python3 <skill-dir>/scripts/frame_check.py still.png --focal <x>,<y> [--aspect 9:16]
144
+ ```
145
+
146
+ It writes `still.overlay.png` (thirds cyan, phi gold, golden triangles magenta,
147
+ safe area red, focal point white), `still.squint.png`, and `still.thumb.png`, and
148
+ prints the focal point's distance to each anchor system. It exits 1 when the focal
149
+ point is not within 3% of any anchor. Ignore that failure for scenes planned as
150
+ centered symmetry.
151
+
152
+ Read all three images:
153
+
154
+ 1. **Squint.** The brightest or largest blob must be the intended focal point.
155
+ 2. **Thumbnail.** The focal point and the headline must still read at 160px.
156
+ 3. **Overlay.** The focal point sits on its planned anchor, and text, logos, and
157
+ faces stay inside the red safe area.
158
+ 4. **Empty area.** Estimate the empty share of the safe area against the budget
159
+ in section 3.
160
+
161
+ The script needs Pillow. If it is missing, ask before running
162
+ `pip install pillow`. If the user declines, do the checks by eye on the still
163
+ and say which checks were done by eye.
164
+
165
+ ## 8. Composition plan (Build mode output)
166
+
167
+ Per scene, write into the scene's entry in `storyboard.json` or alongside it:
168
+
169
+ - Placement system and the anchor the focal point sits on, in px.
170
+ - Grid: columns, margin, gutter, base unit.
171
+ - White-space budget and the scene type it came from.
172
+ - Hierarchy rank of every element.
173
+ - Which of the 20 rules the scene leans on (one to three, named).
174
+ - Safe areas and restack plan for each target aspect.
175
+
176
+ ## 9. Review mode
177
+
178
+ `--review` reads `storyboard.json` and the composition files, renders or
179
+ screenshots each hold frame, runs section 7, and checks each scene against the
180
+ 20 rules. Write `<run-dir>/qa/composition-review.md`:
181
+
182
+ | Scene | System | Focal on anchor | White space vs budget | Rules broken | Fix | Verdict |
183
+ |---|---|---|---|---|---|---|
184
+
185
+ Verdict is **Approve** or **Block**. Block when the focal point is ambiguous,
186
+ critical content leaves title-safe, the white-space budget is missed by more
187
+ than 10 points, or a scene breaks a rule without a stated reason. A broken rule
188
+ with a stated reason in the plan ("centered for stillness") passes.
189
+
190
+ After writing the review, offer once to share the worst-scoring frame and its
191
+ fix with the user's Luckiest tribe for a second eye. Never post automatically.
192
+
193
+ ## Anti-patterns
194
+
195
+ | Symptom | Fix |
196
+ |---|---|
197
+ | Everything centered on one vertical axis | Move the primary to a thirds or phi anchor. Keep center only for symmetry scenes |
198
+ | Two elements tie for attention | Shrink or desaturate one until it loses on two of the four hierarchy factors |
199
+ | Frame filled edge to edge | Cut an element, then meet the white-space budget |
200
+ | Subject faces or moves into the near edge | Flip placement so lead room is on the facing side |
201
+ | Vertical made by cropping | Restack per section 6 |
202
+ | Different placement systems in one frame | One system per scene |
203
+ | Hold frame different from what was planned | Plan the hold frame, not the first or last frame |
204
+
205
+ ## Reference files
206
+
207
+ - [references/grids-and-ratios.md](references/grids-and-ratios.md): thirds, phi,
208
+ spiral, and triangle math with pixel tables per aspect, grid math, safe areas,
209
+ depth layers, and camera moves in GSAP. Load when placing coordinates.
210
+ - [references/twenty-rules.md](references/twenty-rules.md): the 20 photo
211
+ composition rules adapted to video frames, each with a pass/fail test. Load for
212
+ undecided placement and for every review.
@@ -0,0 +1,124 @@
1
+ # Grids, ratios, safe areas, and camera framing
2
+
3
+ Load this when placing exact coordinates. Pixel values are rounded to the
4
+ nearest pixel. Adapted from iart.ai `shot-composition/references/camera-and-grids.md`
5
+ (MIT), with phi and triangle math added and code moved to GSAP.
6
+
7
+ ## Anchor points per aspect
8
+
9
+ Thirds lines at `W/3, 2W/3` and `H/3, 2H/3`. Phi lines at `0.382 W, 0.618 W`
10
+ and `0.382 H, 0.618 H`.
11
+
12
+ | Frame | Thirds x | Thirds y | Phi x | Phi y |
13
+ |---|---|---|---|---|
14
+ | 1920x1080 (16:9) | 640 / 1280 | 360 / 720 | 733 / 1187 | 413 / 667 |
15
+ | 1080x1920 (9:16) | 360 / 720 | 640 / 1280 | 413 / 667 | 733 / 1187 |
16
+ | 1080x1080 (1:1) | 360 / 720 | 360 / 720 | 413 / 667 | 413 / 667 |
17
+ | 1080x1350 (4:5) | 360 / 720 | 450 / 900 | 413 / 667 | 516 / 834 |
18
+
19
+ Power points are the four intersections of each set.
20
+
21
+ ## Golden triangles
22
+
23
+ Draw one corner-to-corner diagonal, then a perpendicular to it from each of the
24
+ other two corners. The two feet of those perpendiculars are the anchors.
25
+
26
+ ```
27
+ t1 = W² / (W² + H²) foot from the corner at (W, 0), on the diagonal (0,0)→(W,H)
28
+ t2 = H² / (W² + H²) foot from the corner at (0, H)
29
+ anchor = (t * W, t * H)
30
+ ```
31
+
32
+ | Frame | Anchor A | Anchor B |
33
+ |---|---|---|
34
+ | 1920x1080 | (1459, 820) | (462, 260) |
35
+ | 1080x1920 | (260, 462) | (820, 1459) |
36
+ | 1080x1080 | (540, 540) | (540, 540) |
37
+
38
+ On 1:1 both anchors collapse to the center. Use thirds or phi on square frames instead.
39
+ Mirror the diagonal to suit the direction of the subject's slant.
40
+
41
+ ## Golden spiral
42
+
43
+ The spiral is built from a golden rectangle (1:1.618). Video frames are not golden
44
+ rectangles, so the spiral is an approximation on 16:9 and 9:16. Its tight end
45
+ lands near the phi intersection on the side where the spiral closes. Place the
46
+ detail (screen, logo mark, face) there and let the larger subject sweep along the
47
+ outer arc. Rotate or flip the spiral to match where the detail is.
48
+
49
+ ## Golden ratio beyond placement
50
+
51
+ - Split a frame into a 61.8 / 38.2 content and empty zone for calm hero scenes.
52
+ - Type scale by phi: 16, 26, 42, 68, 110. It has bigger jumps than an 8px scale,
53
+ so use it for statement scenes and the 8px scale for dense scenes.
54
+ - A card at 1:1.618 reads as more considered than an arbitrary rectangle.
55
+
56
+ ## Grid math
57
+
58
+ ```
59
+ content_width = frame_width - 2 * margin
60
+ column_width = (content_width - (cols - 1) * gutter) / cols
61
+ column_x(i) = margin + i * (column_width + gutter) // 0-indexed
62
+ span_width(n) = n * column_width + (n - 1) * gutter
63
+ ```
64
+
65
+ | Frame | margin | gutter | cols | content | column | 4-col span |
66
+ |---|---|---|---|---|---|---|
67
+ | 1920x1080 | 100 | 24 | 12 | 1720 | 121.3 | 557.3 |
68
+ | 1080x1080 | 64 | 16 | 12 | 952 | 64.7 | 306.6 |
69
+ | 1080x1920 | 48 | 16 | 6 | 984 | 150.7 | 650.6 |
70
+
71
+ Spacing values are 4, 8, 16, 24, 32, 48, 64, 96, 128.
72
+
73
+ ## Safe areas
74
+
75
+ | Aspect | Top | Bottom | Left | Right | Reason |
76
+ |---|---|---|---|---|---|
77
+ | 16:9 (1920x1080) | 5% (54) | 5% (54) | 5% (96) | 5% (96) | Web and video. Use 10% for broadcast |
78
+ | 9:16 (1080x1920) | 15% (288) | 35% (672) | 11% (120) | 18% (192) | Strictest of TikTok, Reels, and Shorts combined (see below) |
79
+ | 1:1 (1080x1080) | 7% (76) | 7% (76) | 7% (76) | 7% (76) | Symmetric feed crop |
80
+ | 4:5 (1080x1350) | 8% (108) | 8% (108) | 6% (65) | 6% (65) | Taller feed crop |
81
+
82
+ 9:16 per platform, in px on 1080x1920 (checked 2026-10-03):
83
+
84
+ | Platform | Top | Bottom | Left | Right |
85
+ |---|---|---|---|---|
86
+ | TikTok | 240 | 660 | 120 | 120, and 300 from y=840 down for the action rail |
87
+ | Instagram Reels | 269 | 672 | 65 | 65 |
88
+ | YouTube Shorts | 288 | 672 | 48 | 192 |
89
+
90
+ Sources: postplanify.com/blog/social-media-safe-zones-2026-complete-guide,
91
+ brandeal.ai/en/blog/tiktok-safe-zone-guide. The combined row above takes the
92
+ largest value per side. When a video targets one platform, use that platform's
93
+ row for more room. Platform UI changes, so re-check this table when it is more
94
+ than six months old.
95
+
96
+ ## Depth layers
97
+
98
+ | Depth | Role | Parallax speed | Contrast |
99
+ |---|---|---|---|
100
+ | Background | Ambient | 0.1-0.3x | Low, often blurred or desaturated |
101
+ | Midground | Supporting | 0.5-0.7x | Mid |
102
+ | Foreground | Primary, the thing the eye follows | 1.0-1.5x | Sharp. Props crossing the subject blur 2-4px |
103
+
104
+ ```js
105
+ // GSAP parallax pan, one timeline, distinct speeds per layer
106
+ const dist = 300;
107
+ tl.to(".bg", { x: -dist * 0.2, duration: 1.6, ease: "power2.inOut" }, 0)
108
+ .to(".mid", { x: -dist * 0.6, duration: 1.6, ease: "power2.inOut" }, 0)
109
+ .to(".fg", { x: -dist * 1.2, duration: 1.6, ease: "power2.inOut" }, 0);
110
+ ```
111
+
112
+ ## Camera moves
113
+
114
+ One move per beat. Combining push, pan, and rotate reads as chaos.
115
+
116
+ | Move | Values | Ease | Use |
117
+ |---|---|---|---|
118
+ | Push-in | scale 1.0 → 1.12 over 1.6s, origin on the focal point | `power2.inOut` | Focus, intimacy |
119
+ | Pull-out | scale 1.15 → 1.0 over 1.8s, origin centered | `power2.inOut` | Reveal context |
120
+ | Pan | x 0 → -300 over 1.5s | `power2.inOut` | Reveal space. Keep the subject a third from the trailing edge so it leads |
121
+ | Whip-pan | out: x 0 → -120% over 0.28s, `power3.in`. In: 120% → 0 over 0.28s, `power3.out`, overlapped | see values | Energetic scene change |
122
+
123
+ Set `transformOrigin` to the focal point's anchor for pushes, so the subject stays
124
+ on its thirds or phi point while the frame grows around it.
@@ -0,0 +1,47 @@
1
+ # The 20 composition rules, adapted for video frames
2
+
3
+ The rule list follows the deck "20 rules of photo composition"
4
+ (https://www.slideshare.net/slideshow/20-rules-of-photo-composition/248755645,
5
+ fetched 2026-10-03). The explanations, video adaptations, and tests are written
6
+ for this skill.
7
+
8
+ Rules conflict on purpose (fill the frame vs negative space, thirds vs centered).
9
+ Each scene picks the rules that serve its purpose and states any rule it breaks.
10
+
11
+ | # | Rule | Video adaptation | Pass test |
12
+ |---|---|---|---|
13
+ | 1 | **Rule of thirds** | Focal point on a thirds line or power point. The default for product and speaker shots | Focal point within 3% of a thirds line |
14
+ | 2 | **Centered composition and symmetry** | Logo reveals, single statements, end cards. Symmetry reads as still and formal | Mirrored weight within ~10%. Center chosen on purpose, not by default |
15
+ | 3 | **Foreground interest and depth** | A blurred foreground prop or UI chip in front of the subject adds depth. Pair it with parallax | At least two depth layers moving at different speeds when the scene moves |
16
+ | 4 | **Frame within the frame** | Device bezels, cards, masks, and window chrome enclose the subject | One frame level. The inner frame does not touch the outer frame edge |
17
+ | 5 | **Leading lines** | UI edges, arrows, connector lines, and gradient directions point at the focal point | Every strong line ends at or points to the focal point, not off-frame |
18
+ | 6 | **Diagonals and triangles** | Tilted devices and angled cards add energy. Three elements arranged in a triangle feel stable | Diagonals run toward the focal point. Triangle groups have a clear apex |
19
+ | 7 | **Patterns and textures** | Repeated cards, grids of logos, and background textures give rhythm. Break the pattern once to mark the focal item | The focal item breaks the pattern by color, scale, or position |
20
+ | 8 | **Rule of odds** | Show 3 or 5 items. Odd groups give the eye a center item to rest on | Item count is odd, or even on purpose for a comparison |
21
+ | 9 | **Fill the frame** | Close crops on a UI detail or product surface for emphasis beats | The subject takes over ~70% of the frame. No unrelated element enters |
22
+ | 10 | **Leave negative space** | Empty area around the subject signals premium and gives text and motion room | Meets the white-space budget in SKILL.md section 3 |
23
+ | 11 | **Simplicity and minimalism** | One idea per hold frame. Cut decoration that does not support the beat | Removing any element would lose meaning |
24
+ | 12 | **Isolate the subject** | Separate the subject with blur, a darkened background, a spotlight gradient, or a solid field | The squint check finds the subject first |
25
+ | 13 | **Change your point of view** | Vary the virtual camera: top-down, low angle, 3D tilt on a device. Avoid every scene being flat front-on | Consecutive scenes do not repeat the same angle and scale |
26
+ | 14 | **Look for particular color** | One accent color marks the focal point. Everything else stays neutral | The accent color appears on the focal element and nowhere competing |
27
+ | 15 | **Rule of space** | Lead room. Open space goes in the direction the subject faces, points, or moves | The space ahead of the subject is wider than the space behind it |
28
+ | 16 | **Left to right rule** | Progress, timelines, and entering content flow left to right for LTR viewers. Reverse only to mean back or against | Direction matches meaning. Flip for RTL scripts |
29
+ | 17 | **Balance elements in the scene** | Offset a heavy element with a smaller, higher contrast one or with empty space on the opposite side | The frame does not feel like it tips toward one side when squinted |
30
+ | 18 | **Juxtaposition** | Place contrasting items side by side (before and after, old and new, problem and fix) to tell a story in one frame | The two items share size and alignment so only the difference reads |
31
+ | 19 | **Golden triangles** | Diagonal compositions place subjects on the triangle anchors (see grids-and-ratios.md) | Subject within 3% of a triangle anchor. Main lines follow the diagonal |
32
+ | 20 | **Golden ratio** | Phi grid at 0.382 and 0.618, golden spiral for one hero with a detail, 61.8/38.2 splits | Focal point within 3% of a phi line, or the spiral eye on the detail |
33
+
34
+ ## Choosing rules by scene purpose
35
+
36
+ Scene purposes match `luckiest-video-studio-motion`.
37
+
38
+ | Purpose | Lean on |
39
+ |---|---|
40
+ | Reveal | 3, 4, 12 |
41
+ | Emphasis | 9, 12, 14 |
42
+ | Bridge | 5, 15, 16 |
43
+ | Explain | 1, 7, 8, 16 |
44
+ | Cause | 6, 18 |
45
+ | Rhythm | 7, 8, 13 |
46
+ | Delight | 19, 20, 13 |
47
+ | Logo or end card | 2, 10, 11 |
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env python3
2
+ """Composition checks on a rendered hold-frame still.
3
+
4
+ Writes next to the still:
5
+ <name>.overlay.png thirds (cyan), phi (gold), golden triangles (magenta), safe area (red)
6
+ <name>.squint.png blurred copy, the brightest/largest blob should be the focal point
7
+ <name>.thumb.png 160px wide copy, focal point and headline must still read
8
+ With --focal X,Y, prints the distance to the nearest thirds/phi line and triangle anchor
9
+ as a fraction of the frame, and PASS when within 3%.
10
+
11
+ Usage: frame_check.py still.png [--aspect 16:9|9:16|1:1|4:5] [--focal 1280,360]
12
+ Needs Pillow (pip install pillow).
13
+ """
14
+ import argparse
15
+ import sys
16
+ from pathlib import Path
17
+
18
+ from PIL import Image, ImageDraw, ImageFilter
19
+
20
+ # top, bottom, left, right as fractions, from references/grids-and-ratios.md
21
+ SAFE = {"16:9": (.05, .05, .05, .05), "9:16": (.15, .35, .11, .18),
22
+ "1:1": (.07, .07, .07, .07), "4:5": (.08, .08, .06, .06)}
23
+ THIRDS = (1 / 3, 2 / 3)
24
+ PHI = (0.382, 0.618)
25
+ TOL = 0.03
26
+
27
+
28
+ def guess_aspect(w, h):
29
+ r = w / h
30
+ def ratio(k):
31
+ x, y = map(int, k.split(":"))
32
+ return x / y
33
+ return min(SAFE, key=lambda k: abs(r - ratio(k)))
34
+
35
+
36
+ def triangle_anchors(w, h):
37
+ d = w * w + h * h
38
+ t1, t2 = w * w / d, h * h / d
39
+ pts = [(t1 * w, t1 * h), (t2 * w, t2 * h)]
40
+ return pts + [(w - x, y) for x, y in pts] # mirrored diagonal
41
+
42
+
43
+ def focal_report(fx, fy, w, h):
44
+ lines = []
45
+ for name, fr in (("thirds", THIRDS), ("phi", PHI)):
46
+ dx = min(abs(fx / w - f) for f in fr)
47
+ dy = min(abs(fy / h - f) for f in fr)
48
+ d = min(dx, dy)
49
+ lines.append((name, d, d <= TOL))
50
+ d = min(max(abs(fx - ax) / w, abs(fy - ay) / h) for ax, ay in triangle_anchors(w, h))
51
+ lines.append(("triangle", d, d <= TOL))
52
+ return lines
53
+
54
+
55
+ def main():
56
+ ap = argparse.ArgumentParser()
57
+ ap.add_argument("still")
58
+ ap.add_argument("--aspect", choices=SAFE)
59
+ ap.add_argument("--focal")
60
+ a = ap.parse_args()
61
+
62
+ src = Path(a.still)
63
+ im = Image.open(src).convert("RGB")
64
+ w, h = im.size
65
+ aspect = a.aspect or guess_aspect(w, h)
66
+ stroke = max(2, w // 640)
67
+
68
+ ov = im.copy()
69
+ dr = ImageDraw.Draw(ov)
70
+ for fr, color in ((THIRDS, (0, 220, 255)), (PHI, (255, 190, 0))):
71
+ for f in fr:
72
+ dr.line([(f * w, 0), (f * w, h)], fill=color, width=stroke)
73
+ dr.line([(0, f * h), (w, f * h)], fill=color, width=stroke)
74
+ dr.line([(0, 0), (w, h)], fill=(255, 0, 200), width=stroke)
75
+ dr.line([(w, 0), (0, h)], fill=(255, 0, 200), width=stroke)
76
+ for ax, ay in triangle_anchors(w, h):
77
+ r = stroke * 4
78
+ dr.ellipse([ax - r, ay - r, ax + r, ay + r], outline=(255, 0, 200), width=stroke)
79
+ t, b, l, r_ = SAFE[aspect]
80
+ dr.rectangle([l * w, t * h, w - r_ * w, h - b * h], outline=(255, 40, 40), width=stroke)
81
+ if a.focal:
82
+ fx, fy = map(float, a.focal.split(","))
83
+ rr = stroke * 6
84
+ dr.ellipse([fx - rr, fy - rr, fx + rr, fy + rr], outline=(255, 255, 255), width=stroke * 2)
85
+
86
+ stem = src.with_suffix("")
87
+ ov.save(f"{stem}.overlay.png")
88
+ im.filter(ImageFilter.GaussianBlur(radius=max(8, w // 160))).save(f"{stem}.squint.png")
89
+ im.resize((160, max(1, round(160 * h / w))), Image.LANCZOS).save(f"{stem}.thumb.png")
90
+ print(f"{w}x{h} aspect {aspect}: wrote overlay, squint, thumb next to {src.name}")
91
+
92
+ if a.focal:
93
+ ok = False
94
+ for name, d, passed in focal_report(fx, fy, w, h):
95
+ ok |= passed
96
+ print(f" {name:8} {d:.1%} from nearest {'PASS' if passed else 'off'}")
97
+ print("focal:", "PASS" if ok else "FAIL (not within 3% of any anchor system)")
98
+ sys.exit(0 if ok else 1)
99
+
100
+
101
+ if __name__ == "__main__":
102
+ main()
@@ -1,5 +1,8 @@
1
1
  # Changelog — luckiest-video-studio-recreate
2
2
 
3
+ ## 1.0.1 — 2026-10-03
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.0.0 — 2026-10-01
4
7
  - New sub-skill: URL or mp4 to a per-shot prompt list (`prompts.md`,
5
8
  `prompts.json`), AI generation through the creative MCP with a cost check
@@ -16,7 +16,7 @@ user-invocable: true
16
16
  license: MIT. See ATTRIBUTION.md
17
17
  allowed-tools: Bash, Read, Write, Glob, AskUserQuestion
18
18
  metadata:
19
- version: "1.0.0"
19
+ version: "1.0.1"
20
20
  listing_id: luckiest-video-studio-recreate
21
21
  author: luckiest
22
22
  ---
@@ -34,7 +34,7 @@ On activation, call the Luckiest MCP `check_updates` tool with
34
34
  `upToDate: false`, surface the `notice` once and continue. Never block on it.
35
35
 
36
36
  When done, call `report_usage` once with
37
- `{ listing_id: "luckiest-video-studio-recreate", skill_version: "1.0.0", matched: true, success: <true|false> }`.
37
+ `{ listing_id: "luckiest-video-studio-recreate", skill_version: "1.0.1", matched: true, success: <true|false> }`.
38
38
  Metadata only, never prompt text. Skip silently if unavailable.
39
39
 
40
40
  ## Standing rules
@@ -88,7 +88,9 @@ documentary, commercial, 3D, anime), mood, transition out, and on-screen text.
88
88
  **Read:** `luckiest-video/references/ai-video-prompting.md` when it is installed,
89
89
  for camera vocabulary and model quirks, and
90
90
  `luckiest-video-studio-motion/references/vocabulary.md` for exact names of camera
91
- and transition moves (push in, whip, match cut, parallax).
91
+ and transition moves (push in, whip, match cut, parallax). Read
92
+ `luckiest-video-studio-composition` for the framing words in each prompt (rule of
93
+ thirds, leading lines, negative space).
92
94
 
93
95
  Write `<run-dir>/recreate/prompts.md` with:
94
96
 
@@ -1,5 +1,8 @@
1
1
  # Changelog: luckiest-video-studio-reel
2
2
 
3
+ ## 1.1.1 (2026-10-03)
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.1.0 (2026-09-30)
4
7
  - Verify step runs the coordinator's `qa.mjs` beat grid, pops, dead frames,
5
8
  legibility, and cross-fade gates on the rendered reel.
@@ -13,7 +13,7 @@ user-invocable: false
13
13
  license: MIT. See ATTRIBUTION.md
14
14
  allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
15
15
  metadata:
16
- version: "1.1.0"
16
+ version: "1.1.1"
17
17
  listing_id: luckiest-video-studio-reel
18
18
  author: luckiest
19
19
  ---
@@ -30,7 +30,7 @@ On activation, call the Luckiest MCP `check_updates` tool with
30
30
  `upToDate: false`, surface the `notice` once and continue. Never block on it.
31
31
 
32
32
  When done, call `report_usage` once with
33
- `{ listing_id: "luckiest-video-studio-reel", skill_version: "1.1.0", matched: true, success: <true|false> }`.
33
+ `{ listing_id: "luckiest-video-studio-reel", skill_version: "1.1.1", matched: true, success: <true|false> }`.
34
34
  Metadata only. Skip silently if unavailable.
35
35
 
36
36
  ## Standing rules
@@ -129,6 +129,8 @@ Do not also set `storyboard.json` `music`, or the bed plays twice.
129
129
 
130
130
  ## Step 4: Build
131
131
 
132
+ Read `luckiest-video-studio-composition` for each chapter's hold frame: focal point, grid, and the 9:16 safe areas.
133
+
132
134
  Copy [templates/reel.html](templates/reel.html) to
133
135
  `composition/compositions/reel.html` and fill its tokens. It already has the
134
136
  motif bounce, the type chapter with an invert, the grid wave, the lockup, and the
@@ -1,5 +1,8 @@
1
1
  # Changelog: luckiest-video-studio-talk
2
2
 
3
+ ## 1.2.1 (2026-10-03)
4
+ - Points at `luckiest-video-studio-composition` (when installed) for focal point, grid, white space, and safe areas.
5
+
3
6
  ## 1.2.0 (2026-09-30)
4
7
  - `scripts/grab-evidence.mjs`: screenshots the real pages a talk names and
5
8
  records where and when each was captured, so scenes show real evidence.
@@ -15,7 +15,7 @@ user-invocable: false
15
15
  license: MIT. See ATTRIBUTION.md
16
16
  allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
17
17
  metadata:
18
- version: "1.2.0"
18
+ version: "1.2.1"
19
19
  listing_id: luckiest-video-studio-talk
20
20
  author: luckiest
21
21
  ---
@@ -33,7 +33,7 @@ On activation, call the Luckiest MCP `check_updates` tool with
33
33
  `upToDate: false`, surface the `notice` once and continue. Never block on it.
34
34
 
35
35
  When done, call `report_usage` once with
36
- `{ listing_id: "luckiest-video-studio-talk", skill_version: "1.2.0", matched: true, success: <true|false> }`.
36
+ `{ listing_id: "luckiest-video-studio-talk", skill_version: "1.2.1", matched: true, success: <true|false> }`.
37
37
  Metadata only. Skip silently if unavailable.
38
38
 
39
39
  ## Standing rules
@@ -82,6 +82,8 @@ same selections, but frame and verify each ratio separately.
82
82
 
83
83
  ## Step 3: Map beats to storyboard scenes
84
84
 
85
+ Read `luckiest-video-studio-composition` so graphics leave the face clear and sit on the grid.
86
+
85
87
  Each stretch of the clip becomes one scene in `storyboard.json`:
86
88
 
87
89
  | Stretch | Scene |