From 3cbfeae3fa08914692a828faef72285095504290 Mon Sep 17 00:00:00 2001 From: Miao Yang Date: Tue, 7 Jul 2026 21:15:57 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat(skills):=20add=20brief=20contract=20?= =?UTF-8?q?=E2=80=94=20interaction=20modes=20+=20shared=20intake=20fields?= =?UTF-8?q?=20across=20workflows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New hyperframes-core/references/brief-contract.md, the shared intake contract every creation workflow now runs its brief against: - §1 interaction mode: collaborative (default) vs autonomous, ongoing vs one-time signals, mode set once and carried forward, and a gate taxonomy (preference / checkpoint / quality / routing) — autonomous skips waiting, never verification - §2 field registry: destination→aspect derivation (feed → 1:1, Shorts/TikTok → 9:16, else 16:9), message, angle, length, audience, language, narration — each workflow binds fields as ask or state - §3 question rules: one round with one question per asked field (native question UI mandatory when available, recommended option first with a receipt), never drop a question as inferable, and a mode legend advertised in the intro text instead of asked Wired into the surfaces: - hyperframes router: detect mode at entry, derive aspect from destination instead of stating 16:9 - product-launch-video / pr-to-video / faceless-explainer: ask/state binding tables at Step 0; Step 3/6 checkpoint-gate branches (autonomous posts a heads-up with a preview hint before render) - website-to-video: local mode definition now defers to the contract - music-to-video, general-video, embedded-captions, talking-head-recut, slideshow, motion-graphics: mode semantics wired per gate type - storyboard-format: new optional 'mode' frontmatter key - pr-to-video: length tier is a ceiling, not a floor — a one-headline PR recommends inside the 30–90s sweet spot regardless of diff size --- skills-manifest.json | 26 +++++----- skills/embedded-captions/SKILL.md | 4 ++ skills/faceless-explainer/SKILL.md | 29 +++++++---- skills/general-video/SKILL.md | 2 +- skills/hyperframes-core/SKILL.md | 29 +++++------ .../references/brief-contract.md | 48 +++++++++++++++++++ .../references/storyboard-format.md | 13 ++--- skills/hyperframes/SKILL.md | 4 +- skills/motion-graphics/SKILL.md | 2 + skills/music-to-video/SKILL.md | 10 ++-- skills/pr-to-video/SKILL.md | 32 +++++++++---- skills/product-launch-video/SKILL.md | 29 +++++++---- skills/slideshow/SKILL.md | 2 +- skills/talking-head-recut/SKILL.md | 4 +- skills/website-to-video/SKILL.md | 4 +- 15 files changed, 168 insertions(+), 70 deletions(-) create mode 100644 skills/hyperframes-core/references/brief-contract.md diff --git a/skills-manifest.json b/skills-manifest.json index 5bb238f236..86a31dc1b6 100644 --- a/skills-manifest.json +++ b/skills-manifest.json @@ -2,11 +2,11 @@ "source": "heygen-com/hyperframes", "skills": { "embedded-captions": { - "hash": "d870992d206c9ddc", + "hash": "169f74d84d52860c", "files": 144 }, "faceless-explainer": { - "hash": "80882d8135b2aeac", + "hash": "82987c3d87648710", "files": 18 }, "figma": { @@ -14,11 +14,11 @@ "files": 1 }, "general-video": { - "hash": "6cb3fbdf9b860ba6", + "hash": "c0beee735bee14ac", "files": 1 }, "hyperframes": { - "hash": "4e0795ead8c8bfa3", + "hash": "14e7ce906fab5923", "files": 1 }, "hyperframes-animation": { @@ -30,8 +30,8 @@ "files": 7 }, "hyperframes-core": { - "hash": "6683808c1c4beebd", - "files": 13 + "hash": "cb4b275446b8de6b", + "files": 14 }, "hyperframes-creative": { "hash": "18a14a79da6cbc06", @@ -50,19 +50,19 @@ "files": 97 }, "motion-graphics": { - "hash": "f5a432862116b39a", + "hash": "2f7d2bd5a7576141", "files": 23 }, "music-to-video": { - "hash": "42aba6b650599962", + "hash": "920107da254d8fc1", "files": 132 }, "pr-to-video": { - "hash": "71dce61cff0233f2", + "hash": "d7caab8e0aac7191", "files": 22 }, "product-launch-video": { - "hash": "ac4e1e4aa671fe27", + "hash": "38114c90d19cbab2", "files": 20 }, "remotion-to-hyperframes": { @@ -70,15 +70,15 @@ "files": 70 }, "slideshow": { - "hash": "764746e9199213b6", + "hash": "2b93ef9099bb1c9a", "files": 2 }, "talking-head-recut": { - "hash": "fbb95a4c6062c41a", + "hash": "e954e659a81cb937", "files": 27 }, "website-to-video": { - "hash": "d81ede8e9cabd09b", + "hash": "db7cfa04c6939cc9", "files": 32 } } diff --git a/skills/embedded-captions/SKILL.md b/skills/embedded-captions/SKILL.md index b128a83933..463a8c4ccf 100644 --- a/skills/embedded-captions/SKILL.md +++ b/skills/embedded-captions/SKILL.md @@ -59,6 +59,10 @@ encodes everything routing needs: reading surface, voice, recommend-for, scene needs, adjacency notes for the genuinely-close pairs (loud↔ordnance, neon↔neonsign, cream↔stardust). +The identity pick is a **preference gate** (`../hyperframes-core/references/brief-contract.md` § 1): +in autonomous mode ("surprise me" / "decide for me"), pick from your shortlist +yourself and state the one-line why instead of asking. + Procedure: probe the clip → shortlist 2–3 identities from the catalog → recommend ONE with a one-line why → **the user picks** → author that identity's file. Identities are engine-locked (no cross combos; opening one is a diff --git a/skills/faceless-explainer/SKILL.md b/skills/faceless-explainer/SKILL.md index 895f57592b..d818af0c47 100644 --- a/skills/faceless-explainer/SKILL.md +++ b/skills/faceless-explainer/SKILL.md @@ -11,7 +11,7 @@ Use this skill to turn a body of text into an explainer video: pick a design sys > **Confirm the route before Step 0.** You are the orchestrator. Run each step, verify its gate, and only then continue. This skill is for **explaining a topic from text, with no product and no website to capture**. Route other intents elsewhere: a product launch/promo → `/product-launch-video`; a tour of a real site → `/website-to-video`; a GitHub PR → `/pr-to-video`; captions on existing footage → `/embedded-captions`; a short unnarrated motion graphic → `/motion-graphics`. If the user says only "make a video" or the route is uncertain, read `/hyperframes` first. -You are the orchestrator. Work in `videos//`. Run steps in order and pass each gate before continuing. User-gated steps are Step 0, Step 3, and Step 6. Do every step yourself except Step 5, where you dispatch one sub-agent per frame. Do not put design or motion rules here; those live in the frame-worker sub-agent, this skill's local `../hyperframes-animation/rules/` + `../hyperframes-animation/blueprints/`, and `hyperframes-creative`. +You are the orchestrator. Work in `videos//`. Run steps in order and pass each gate before continuing. User-gated steps are Step 0, Step 3, and Step 6. Read `../hyperframes-core/references/brief-contract.md` before Step 0 — it defines the interaction mode (collaborative vs autonomous), the shared brief fields, and how to ask; the mode governs how the Step 0/3/6 gates behave. Do every step yourself except Step 5, where you dispatch one sub-agent per frame. Do not put design or motion rules here; those live in the frame-worker sub-agent, this skill's local `../hyperframes-animation/rules/` + `../hyperframes-animation/blueprints/`, and `hyperframes-creative`. Workflow: Step 0 setup → `hyperframes.json`; Step 1 brief → `capture/extracted/`; Step 2 design system → `frame.md`; Step 3 storyboard/script → `STORYBOARD.md` and `SCRIPT.md`; Step 3.1 audio → `audio_meta.json`; Step 4 visual design → enriched `STORYBOARD.md`; Step 5 frames → `compositions/frames/NN-*.html` and `index.html`; Step 6 final render → `renders/video.mp4`. @@ -27,7 +27,19 @@ Initialize only if `hyperframes.json` is missing. Name `` from the topi **Show sign-in status before the brief** — run `npx hyperframes auth status` and **relay its output verbatim (don't paraphrase or rewrite it).** It reports whether voice/BGM will use HeyGen or local engines and, when not signed in, how to sign in. **If not signed in, STOP and wait for the user to choose — sign in, or say "go"/"offline" to continue with local engines — before asking the brief or anything else.** Treat it as a real decision point, not a passing note; don't fold the choice into the brief question, and don't write keys into a per-repo `.env`. (In autonomous mode, note the status and continue offline.) See `../media-use` → Preflight for the canonical guidance. -**Gate:** `hyperframes.json` exists, and angle, length, aspect ratio, and language are locked; sign-in status was shown (signed in, or continuing offline). +**Confirm the brief in one round** per the brief contract — every asked field gets its own question with a recommended default plus a one-line receipt; "go" accepts all. + +**Ask** (each its own question, every run — never drop one as "inferable"): + +- **angle** — how the topic is taught (concept / how-to / listicle / narrative); default: infer from the text's own shape (state the basis). +- **length** — default inside the 30–90s sweet spot, scaled to how much the text actually teaches (state the basis). +- **destination → aspect** — per the contract's derivation (social feed → 1:1; Shorts / TikTok → 9:16; else 16:9). + +**State in the intro text** (don't ask): **message** (the explainer's thesis, echoed back in one sentence), **language** (the user's). (`VO_MODE` is asked in Step 1 only when a script was pasted.) + +In autonomous mode, state the locked brief as a heads-up and proceed. + +**Gate:** `hyperframes.json` exists, and the brief fields (angle, length, destination → aspect, message, language) are locked; sign-in status was shown (signed in, or continuing offline). --- @@ -74,9 +86,9 @@ Read `references/story-design.md`, `../hyperframes-animation/blueprints-index.md Use `story-design.md` for the explainer structure (concept / how-to / listicle / story), hook strategy, clarity techniques, emotional beats, the type-enum mapping, and `VO_MODE`. The video's sequence comes from **narrative design, not the input text's paragraph order** — reorder, merge, omit, compress. As a **soft guide**, consult the role→blueprint menu in `../hyperframes-animation/blueprints-index.md`: for each beat, write the voiceover in the shape its candidate blueprint implies and tag that candidate `blueprint:` id when one fits. Teaching truth still decides which beats exist — never force a beat to fit a blueprint, and never invent a beat just because a proven shape is available. Faceless visuals are invented downstream, so frames do **not** carry an asset inventory: leave `asset_candidates` empty unless the user supplied a real `public/` image. Use the exact required fields from the storyboard and script references. -After drafting, show a frame-by-frame summary. In that same message ask the user two things: (a) to approve or request changes, and (b) whether they want a live preview of the storyboard scaffold (`npx hyperframes preview`) — open it only on a yes. Iterate until approved, and carry the preview choice to Step 6. +After drafting, show a frame-by-frame summary. In that same message ask the user two things: (a) to approve or request changes, and (b) whether they want a live preview of the storyboard scaffold (`npx hyperframes preview`) — open it only on a yes. Iterate until approved, and carry the preview choice to Step 6. This is a **checkpoint gate** (brief contract § 1): in autonomous mode, post the same summary as a heads-up and proceed without waiting — skip the preview question and carry "not asked" to Step 6. -**Gate:** `STORYBOARD.md` exists, every frame has the required narrative fields, `SCRIPT.md` exists when narration is needed, and the user approved the frame-by-frame plan. +**Gate:** `STORYBOARD.md` exists, every frame has the required narrative fields, `SCRIPT.md` exists when narration is needed, and the user approved the frame-by-frame plan (autonomous: the summary was posted as a heads-up). --- @@ -168,23 +180,23 @@ If a command fails, surface stderr and stop — don't pile on recovery commands. **Known false-positive — do not chase it.** `inspect` may report a handful of `text_box_overflow` errors of ~1–4px on the **caption** highlight words (selector `#caption-word-*` / `.caption-line`). The caption pill uses a deliberately snug `line-height` (set once in `scripts/captions.mjs`) and has **no `overflow:hidden`**, so a heavy display glyph's ink spills a few px into the pill's own padding — nothing is actually clipped. Treat these as expected and proceed. Do **not** inflate the caption `line-height` (it balloons the pill, which is worse). Only act on a `text_box_overflow` when it names a **frame** element (`#el-NN-*`), not a caption word. -After checks pass, pause for user review. The video is assembled, viewable, and editable in Studio. Manage preview only once across Step 3 and Step 6: open it if the user asked earlier, offer it if they declined earlier, and do not ask again if they are already reviewing in Studio. +After checks pass, pause for user review. The video is assembled, viewable, and editable in Studio. Manage preview only once across Step 3 and Step 6: open it if the user asked earlier, offer it if they declined earlier, and do not ask again if they are already reviewing in Studio. In autonomous mode the review pause is a checkpoint gate: post a one-line heads-up (checks passed, render starting — `npx hyperframes preview` if they want to look first), proceed to render without waiting, then deliver the MP4 with the contact sheet and the frame ids so revisions can target a single frame. Preview: `npx hyperframes preview` -Render only after user approval: +Render only after user approval (autonomous mode: after the checks pass): `npx hyperframes render --skill=faceless-explainer --quality high --output renders/video.mp4` Do not rerun `lint`, `validate`, `inspect`, or `snapshot` after rendering unless the user asks. -**Gate:** `lint`, `validate`, and `inspect` passed before render; user approved at the review pause; `renders/video.mp4` exists. Final reply states MP4 path and final duration. +**Gate:** `lint`, `validate`, and `inspect` passed before render; user approved at the review pause (autonomous: checks passed and the delivery includes the contact sheet); `renders/video.mp4` exists. Final reply states MP4 path and final duration. --- ## Quick Reference -**Formats:** landscape `1920x1080` by default; portrait `1080x1920`; square `1080x1080`. Set the format once in the storyboard frontmatter. +**Formats:** landscape `1920x1080`; portrait `1080x1920`; square `1080x1080` — derived from the destination (brief contract § 2). Set the format once in the storyboard frontmatter. **Faceless deltas vs a captured-asset workflow:** no Step 1 capture (synthetic `tokens.json` + `visible-text.txt`); no `asset-descriptions.md` and no `capture/assets/`; no asset-staging in Step 4; `asset_candidates` empty by default; every visual is invented by the Step 5 workers (typography / abstract graphics / diagrams / data-viz). A user-supplied `public/` image is the only real asset path. @@ -194,6 +206,7 @@ The reusable, domain-agnostic shot shapes live in `../hyperframes-animation/blue | Read | When | | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `[../hyperframes-core/references/brief-contract.md](../hyperframes-core/references/brief-contract.md)` | Step 0: the interaction mode, brief fields, and how to ask. | | `[../hyperframes-creative/frame-presets/](../hyperframes-creative/frame-presets/)` | Step 2: choose and adopt a frame preset. | | `[../hyperframes-creative/references/design-spec.md](../hyperframes-creative/references/design-spec.md)` | Step 2: apply brand tokens correctly. | | `[references/story-design.md](references/story-design.md)` | Step 3: plan the explainer story. | diff --git a/skills/general-video/SKILL.md b/skills/general-video/SKILL.md index 7fde74fb39..97917d6383 100644 --- a/skills/general-video/SKILL.md +++ b/skills/general-video/SKILL.md @@ -27,7 +27,7 @@ For vague, exploratory requests ("make something for our brand", "a cool intro") - **Priority** — what matters most? motion quality / content accuracy / brand fidelity / speed? - **Variations** — one best shot, or 2-3 meaningfully different options (different pacing, energy, or structure — not just color swaps)? -For specific requests ("add a title card", "fix the timing on scene 3"), skip discovery. +For specific requests ("add a title card", "fix the timing on scene 3"), skip discovery. If the request carries an ongoing autonomous signal ("surprise me", "just build it" — `hyperframes-core/references/brief-contract.md` § 1), skip discovery too: default to one best shot and state your calls with one-line receipts as you make them. ### Step 1 — Design system → `hyperframes-creative` diff --git a/skills/hyperframes-core/SKILL.md b/skills/hyperframes-core/SKILL.md index 9b2fc009f5..26375214ae 100644 --- a/skills/hyperframes-core/SKILL.md +++ b/skills/hyperframes-core/SKILL.md @@ -11,20 +11,21 @@ This skill is the **technical contract** — how to build one hyperframes projec ## References -| File | Read it to… | -| ------------------------------------ | ------------------------------------------------------------------------------------------------- | -| `references/minimal-composition.md` | start from the smallest renderable composition skeleton | -| `references/composition-patterns.md` | choose monolithic vs modular; structure a modular `index.html`; pick a sub-comp archetype | -| `references/data-attributes.md` | look up any `data-*` (root / clip / sub-comp host / legacy aliases); use `class="clip"` | -| `references/tracks-and-clips.md` | pick `data-track-index`, handle same-track overlap / z-index, time a clip relative to another | -| `references/sub-compositions.md` | wire a sub-composition (host attrs, `