From d3a4e9037096c0234c58b44fcbcc7df87ba8958b Mon Sep 17 00:00:00 2001 From: James Russo Date: Tue, 11 Aug 2026 11:57:32 -0700 Subject: [PATCH] fix(skills): stop embedded-captions shipping author-only paths; dedupe slideshow (#3225) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(skills): stop embedded-captions shipping author-only paths The skill is distributed via `hyperframes skills` (--copy, so the installed bundle matches the published tree), but three shipped files pointed at directories that only exist on the original author's machine. - references/test-set.md: deleted. Nothing in the skill referenced it (zero inbound links across all 140 files), and its corpus lives at ~/Downloads/heygen_relevant_videos/, so it was neither reachable nor runnable. - SKILL.md / dna/README.md: the retired 54-template archive was stated as living at a ~/Downloads path. Keeps the fact, drops the false location. - themes/PORTING.md: marked maintainer-only. It authors new theme DNAs rather than using the skill, nothing links it, and its inputs (the cap_fx3 demos, the frame corpora, CONTRACT.md) are not distributed. The paths stay as the author's original layout, now explicitly labelled as names for the inputs. The 10 references to ~/Downloads/hyperframes are untouched: those are the documented last resort in a real chain (HYPERFRAMES_ROOT -> in-repo -> that path), and every file carrying it also carries the env var. Regenerates skills-manifest.json, which hashes the whole skill directory. Closes #3219 — Rames Jusso (James's assistant) * fix(skills): delete themes/PORTING.md instead of marking it internal Nothing in the skill referenced it, its inputs are not distributed, and git history keeps it recoverable. Marking a dead procedure still ships the dead procedure. — Rames Jusso (James's assistant) * fix(skills): remove duplicated media-cleanup block in slideshow The media-cleanup and global-nav-mute sections appeared twice in skills/slideshow/SKILL.md. The two copies were not identical: the later one was missing the paragraph requiring custom media controls to sync through media events. Deletes the incomplete copy, keeps the complete one. Originally authored in #3218. Carried here re-signed because the org requires signed commits and both changes regenerate skills-manifest.json, which would otherwise conflict between the two PRs. Co-authored-by: Lance Curtis <69400491+imprimisxo@users.noreply.github.com> * chore(skills): regenerate manifest for slideshow + embedded-captions — Rames Jusso (James's assistant) * chore(skills): record the two embedded-captions deletions in the guard check-no-main-deletions.mjs deliberately has no blanket override, so each intentional deletion is named with its reason and shows up in review. — Rames Jusso (James's assistant) --------- Co-authored-by: Lance Curtis <69400491+imprimisxo@users.noreply.github.com> --- scripts/check-no-main-deletions.mjs | 8 +++ skills-manifest.json | 6 +- skills/embedded-captions/SKILL.md | 2 +- skills/embedded-captions/dna/README.md | 4 +- .../embedded-captions/references/test-set.md | 66 ------------------- skills/embedded-captions/themes/PORTING.md | 48 -------------- skills/slideshow/SKILL.md | 30 --------- 7 files changed, 14 insertions(+), 150 deletions(-) delete mode 100644 skills/embedded-captions/references/test-set.md delete mode 100644 skills/embedded-captions/themes/PORTING.md diff --git a/scripts/check-no-main-deletions.mjs b/scripts/check-no-main-deletions.mjs index c04e49651..4c21c323e 100644 --- a/scripts/check-no-main-deletions.mjs +++ b/scripts/check-no-main-deletions.mjs @@ -41,6 +41,14 @@ export const ALLOWED_DELETIONS = new Map([ "packages/studio/src/components/StudioFeedbackBar.tsx", "replaced by components/feedback/StudioFeedbackCard.tsx; too little shared content for git to pair as a rename", ], + [ + "skills/embedded-captions/references/test-set.md", + "#3219: orphaned in the shipped skill (zero inbound references across all 140 files) and its corpus lives only at ~/Downloads/heygen_relevant_videos/, so it was neither reachable nor runnable on any install", + ], + [ + "skills/embedded-captions/themes/PORTING.md", + "#3219: same, zero inbound references; a theme-authoring procedure whose inputs (cap_fx3 demos, frame corpora, CONTRACT.md) are not distributed with the skill", + ], ]); export function parseBase(argv, fallback = "origin/main") { diff --git a/skills-manifest.json b/skills-manifest.json index b1ab9a474..a8c0565d6 100644 --- a/skills-manifest.json +++ b/skills-manifest.json @@ -2,8 +2,8 @@ "source": "heygen-com/hyperframes", "skills": { "embedded-captions": { - "hash": "e8c2c3b6dfd04b39", - "files": 140 + "hash": "14e79d53c24e3945", + "files": 138 }, "faceless-explainer": { "hash": "c70b904aa68cf7e5", @@ -70,7 +70,7 @@ "files": 70 }, "slideshow": { - "hash": "71368acf61074198", + "hash": "6a24a84b0c1a75f9", "files": 2 }, "talking-head-recut": { diff --git a/skills/embedded-captions/SKILL.md b/skills/embedded-captions/SKILL.md index 0465617a7..07c994524 100644 --- a/skills/embedded-captions/SKILL.md +++ b/skills/embedded-captions/SKILL.md @@ -174,7 +174,7 @@ Pick by `safe-zones.json` (`heroAnchor.bandLuma`, `palette.temperature`) × cont The engine generates the **hero three-act** from the DNA (no authoring needed): co-visible captions dim (setup) → per-letter entrance with amplitude ∝ spoken loudness (impact) → breathe + glow until exit (afterglow). -(Legacy: `plan.template:"cinematic-cream"` maps to `dna:"cream"` automatically. The retired 54-template library lives outside the skill at `~/Downloads/embedded-captions-archive/standard-templates-54/`; `_motion.md` remains in-skill as the motion-verb reference catalog.) +(Legacy: `plan.template:"cinematic-cream"` maps to `dna:"cream"` automatically. The retired 54-template library is archived outside this repo and is not distributed with the skill; `_motion.md` remains in-skill as the motion-verb reference catalog.) --- diff --git a/skills/embedded-captions/dna/README.md b/skills/embedded-captions/dna/README.md index b65ef1efc..af5cdc74d 100644 --- a/skills/embedded-captions/dna/README.md +++ b/skills/embedded-captions/dna/README.md @@ -13,8 +13,8 @@ shallow presets — every render is already fitted to its footage. Every classic DNA's **home is Cinematic (column)** — that is where all ten were built and validated. (Standard/rail mode was retired 2026-06-12; the verbatim-rail -need is served by the `anchor` theme. The old rail combos live in -`~/Downloads/embedded-captions-archive/`.) +need is served by the `anchor` theme. The old rail combos are archived outside +this repo and are not distributed with the skill.) ## The ten diff --git a/skills/embedded-captions/references/test-set.md b/skills/embedded-captions/references/test-set.md deleted file mode 100644 index 35825a34f..000000000 --- a/skills/embedded-captions/references/test-set.md +++ /dev/null @@ -1,66 +0,0 @@ -# Test set — diverse scenes for template stability regression - -Canonical test corpus for verifying templates don't regress when we add -features. Pick cases that stress different parts of the pipeline — blend -mode, matte quality, baked-in graphics, luminance extremes, motion. - -## The test set - -All in `~/Downloads/heygen_relevant_videos/` (720×1290, ~8s, 9:16). Add -landscape + 1:1 as we grow. - -| Case | Scene | Stress test | -| --------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | -| `Sunset_Stroll` | Outdoor selfie at sunset, palm trees, boardwalk | **Bright backdrop** → default `screen` blend fails; needs dark text + `normal` blend | -| `Nature_Vibe` | Forest golden-hour + **baked timestamp** bottom-left + watermark top-right | Baked graphics avoidance; warm-mid luminance | -| `Gym_Grind` | Dark gym + dark tank top + phone-mirror selfie | **Low luminance** → matte difficulty; screen blend natural fit | -| `AI_Insights` | Podcast studio + neon "THE DIALOG" sign + window view | **Competing graphics in BG** (sign, city skyline); mid-tone | -| `Kitchen_Buzz` | Warm kitchen, apron, smiling | Baseline friendly case | -| `Tech_Trends` | Clean white studio + mic | **Max bright backdrop** — needs dark text or opaque BG | -| `Street_Talk` | Walking city street, handheld | Handheld motion + bright outdoor | -| `Outdoor_Hype` | Forest + **Instagram watermark** top + sun flare | Baked graphic + bright + motion | - -## Usage - -```bash -for case in Sunset_Stroll Nature_Vibe Gym_Grind AI_Insights; do - bash scripts/render-and-composite.sh /tmp/ts-${case} -done -``` - -## Regression checklist - -For every new template or significant change, re-run the test set and -verify: - -- [ ] Sunset_Stroll: captions legible on bright sunset (Cinematic cream/screen washes out → use **Standard mode**, opaque rail) -- [ ] Nature_Vibe: captions don't collide with baked timestamp (bottom-left) or watermark -- [ ] Gym_Grind: captions visible on dark gym despite dark subject -- [ ] AI_Insights: captions don't fight with "THE DIALOG" neon sign -- [ ] Tech_Trends: dark text + `normal` blend on pure white studio -- [ ] Each case: 0.5s+ per caption, no wrap-into-subject-head-zone -- [ ] Each case: FG layer for 9:16 portraits where subject fills frame - -## Bugs we've fixed via this test set - -- **2026-04-23**: Hardcoded `text-shadow: warm-glow + dark-drop` in all - templates ignored `cap_color` — dark text got overwhelmed by bright - halo on bright backgrounds. Fix: `TEXT_SHADOW` placeholder with - luminance-adaptive default. -- **2026-04-23**: Hardcoded `filter: brightness(1.12)` lightened dark - text, shifting it toward neutral. Fix: `TEXT_FILTER` placeholder that - drops brightness boost for dark colors. -- **2026-04-23**: `BLEND_MODE` and `CAP_COLOR` hardcoded in new - templates — plan.json overrides ignored. Fix: placeholders added to - all 4 templates. - -## Expansion plan - -Still need to add: - -- 1 × 16:9 landscape (from any heygen_relevant via letterboxing, or new source) -- 1 × 1:1 square (if available) -- 1 × multi-speaker (speaker diarization test) -- 1 × foreign language (CJK rendering test) -- 1 × shot-cut (PySceneDetect-required case) -- 1 × product/B-roll (no talking head — refuse gate) diff --git a/skills/embedded-captions/themes/PORTING.md b/skills/embedded-captions/themes/PORTING.md deleted file mode 100644 index 81713f731..000000000 --- a/skills/embedded-captions/themes/PORTING.md +++ /dev/null @@ -1,48 +0,0 @@ -# PORTING — turning a cap_fx3 demo into a first-class theme DNA - -One theme at a time. The demo is the spec; the engine is the law. - -## Inputs - -- Demo: `~/Downloads/cap_fx3//` — index.html (bg: scene-reaction + apex - setpiece), rail.html (fg alpha: body + furniture + front fx), postfx.json, - final_fx.mp4 + strip.png (ground truth of how it should look). -- Engine: `scripts/make-theme.cjs` — read the header + the existing paradigms - (rail/panel/poem/takeover) and setpieces (detonation/decode/drawon/assembly/ - -## Process - -1. DECOMPOSE the demo: body paradigm? body entrance/exit verbs? hero setpiece? - front fx? plate budget? linkages? Map each piece to an existing registry - entry or mark it NEW. -2. EXTEND the engine for the NEW pieces only — port the demo's GSAP logic into - generator functions, parameterized (sizes, colors, counts, seeds become DNA - params). Registries stay generic: paradigms/setpieces are the unit of code, - the DNA json is the unit of identity. Match the file's existing code style. - `node --check scripts/make-theme.cjs` after every edit. -3. WRITE `themes/.json` (drop the tNN\_ prefix). voice/when/register/fonts/ - palette/body/hero/fx/plate/linkages — follow anchor.json + ordnance.json shape. -4. VERIFY on the rooftop fixture: - - scaffold: `mkdir ~/Downloads/port_` + symlink source.mp4 / frames_fg / - frames_bg + cp matte.fps transcript.json safe-zones.json from - `~/Downloads/cap_multi/rooftop/` (frames_bg from `~/Downloads/cap_fx/_frames_bg`). - - theme.json: same lines/hero the demo used (read its rail.html data). - - `node scripts/make-theme.cjs ` → `preview-frames.cjs <4 key times>` - → READ the previews; compare against the demo's strip.png. Iterate ≤3 rounds. - - full render: `bash scripts/render-theme.sh ` → extract a 12-frame strip - around the apex → view → compare to the demo strip. Small deviations OK, - note them; the THEME must read identically at a glance. -5. REGRESSION: recompile one prior theme project (e.g. `~/Downloads/cap_anchor`, - plus the previous port in this batch) — make-theme must still compile and a - 2-frame preview must look unchanged. -6. REGISTER: add the identity row to CATALOG.md (voice/when/needs, author → - make-theme) and a line in themes/README.md if it has one. - -## Hard rules - -- The CONTRACT.md disciplines apply verbatim (determinism, physics doctrine, - body stability, apex-owns-frame, equal-length keyframes, fonts whitelist, - ≤ DUR scheduling): `~/Downloads/cap_fx3/CONTRACT.md`. -- Never edit existing setpieces'/paradigms' behavior unless fixing a bug — - existing themes must not change appearance. -- Do NOT commit; the orchestrator reviews and commits per batch. diff --git a/skills/slideshow/SKILL.md b/skills/slideshow/SKILL.md index fc8803e55..fffa3f99b 100644 --- a/skills/slideshow/SKILL.md +++ b/skills/slideshow/SKILL.md @@ -460,36 +460,6 @@ The same cross-realm rule applies here: global mute must reach iframe `