* feat(skills): add brief contract — interaction modes + shared intake fields across workflows 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 * feat(skills): story spine + mode-first brief across creation workflows Story — the reverse-iceberg feedback: - New hyperframes-creative/references/story-spine.md, three rules for the narrated workflows: the hook speaks the viewer's outcome language, the value claim lands by beat 2 (implementation is the footnote of the story, not the spine), and the storyboard is presented as a proposal — 'This video tells [audience] that [message]' plus a per-frame why: drawn from narrativeRole - pr-to-video: feature-reveal reordered promise-first (impact leads, diff/mechanism follow as evidence); hooks ban file/function names; fix-explainer, refactor-walkthrough, changelog unchanged - product-launch-video / faceless-explainer hook rules aligned to the spine; website-to-video's beat summary gains the echo line + why:; general-video points at the spine from its plan step Brief — hardened after live-test drift: - Mode is now the first question (Collaborative recommended vs Autonomous), its own round, skipped when the request carries a signal; autonomous asks nothing further until one final preview-or-render question before render - Step 0 rewritten as a literal two-round question script in each shot-sequence workflow (website-to-video's editorial register, channel-agnostic); brief-contract.md §3 reduced to invariants so the procedure lives in exactly one place * feat(skills): split type minimums by viewing context typography.md: full-screen viewing keeps body 20px / headline 60px; in-feed destinations (X / LinkedIn / Instagram — brief-contract's destination field) scale to body >=32px, headline >=90px, data labels >=24px. First-pass values, to be calibrated against real renders. * feat(skills): storyboard proposal as a table + credits close by default - story-spine § 3: the proposal presents frames as a markdown table (frame · beat · on screen · why) instead of dense paragraphs; the three shot-sequence workflows and website-to-video's beat summary reference the same shape - pr-to-video: the credits close is now the default ending — every PR video ends on a contributors frame (committers by commit count, 1-6 avatars), with no taste judgment; the only skip is when no avatar was fetched, and the user can cut the frame in the proposal * fix(skills): address review nits on the brief/story contracts - embedded-captions: the identity procedure now states both sides of the preference gate inline (user picks; autonomous picks with a stated why) - website-to-video step-2-brief: note that its mode section is the workflow's application of brief-contract.md, not a second definition - brief-contract: resuming a project reads mode from STORYBOARD.md frontmatter — a recorded mode counts as set, closing the write-only gap * docs(skills): add a non-code receipts example to the brief contract Review nit (jrusso1020, #2058): the receipts example in § 3 was PR-video-shaped only. A destination-shaped example joins it so the rule reads as workflow-neutral.
8.0 KiB
Brief contract — interaction mode, shared brief fields, and question rules
Every creation workflow runs its intake step (Step 0 / brief) against this contract. It defines three things: the interaction mode (which controls all later gates, not just the brief), the shared brief fields, and the question rules. Each workflow maps these fields to its own values in its SKILL.md — including its enums, recommendation logic, and extra inputs. This file never includes workflow-specific content. Workflows without a real brief, such as /motion-graphics, use only § 1.
1. Interaction mode
There are two modes. Default: collaborative.
Signals.
- Ongoing autonomous signals — "autonomous", "surprise me", "decide for me", "just build it", "don't ask, just go", "LFG": the whole flow switches to autonomous from this point on.
- One-time acceptance — a bare "go" / "looks good" at a gate accepts only that gate's defaults; the mode does not change.
- The mode is set once — by a signal in the request, or by the brief's first question (§ 3) — and carries forward. No later step asks again. Once a storyboard exists, record it in
STORYBOARD.mdfrontmatter (mode: autonomous). When resuming an existing project, readmodefrom that frontmatter first — a recorded mode counts as already set, so don't ask again. - Mid-run switch: "stop asking / just finish it" → autonomous for the rest of the run. Clear feedback on a heads-up → collaborative resumes at the next gate.
Gate types. Autonomous mode changes only the first two types:
- Preference gates (which preset, voice, caption identity, want a preview?) — autonomous: decide yourself and state the decision with a one-line reason. Never stay silent.
- Checkpoint gates (storyboard approval, pre-render review) — autonomous: post the same summary you would have asked about as an inline heads-up, then continue. One exception: before rendering, ask once — preview first, or render (§ 3).
- Quality gates (
lint/validate/inspect, capture completeness, fetch failures, workflow-specific verification checklists) — never skip these in any mode. Errors still stop the run. Reasoning like "autonomous means bias toward action, so I'll skip verification" misuses the mode — bias toward action applies to deciding what to build, not whether to verify. - Routing and sign-in decisions — wrong routing is a quality problem: an ambiguous-intent confirmation, such as
/slideshow's "is this a deck?", still happens in autonomous mode. Auth sign-in follows/media-use→ Preflight: show the status as-is; collaborative waits for the user's choice, while autonomous notes it and continues offline.
Autonomous is not silent. Every question absorbed by the mode becomes a decision with a receipt — state the choice and its one-line reason inline as you go. Final delivery always includes the contact sheet, so review happens after the fact instead of not happening at all.
2. Field registry
The shared brief fields. Each workflow's SKILL.md declares which fields it uses, its own value set, how it derives recommendations, and — decisively — marks each field ask (always gets its own question) or state (stated in the intro text, never asked). The binding table's ask/state marking is authoritative; the default policies below apply only when a binding doesn't say otherwise. If a workflow does not use a field, such as /music-to-video having no narration, that field is simply absent from its binding — don't ask about it.
| Field | Meaning | Default policy |
|---|---|---|
mode |
collaborative / autonomous (§ 1) | detect signals; never ask again |
destination |
where the video will play (X / LinkedIn feed, YouTube, TikTok, embed) | infer from the request; if unknown and it would change aspect or type scale, include ONE question in the brief |
aspect |
canvas | derive from destination — social feed (X / LinkedIn / Instagram) → square 1080x1080; TikTok / Reels / Shorts → 1080x1920; YouTube / website embed / unknown-desktop → 1920x1080. State the derivation; never ask twice |
length |
target duration | the workflow derives its own recommendation and states the reason |
language |
narration + captions | use the user's language — state it, don't ask |
audience |
who will watch | infer from the input; confirm only when it would change the beats |
message |
the ONE thing the video must communicate | derive it and echo it in the brief — if the message cannot be stated in one sentence, the video is not ready for storyboarding |
angle |
what kind of story (workflow enum) | workflow-specific values; recommend one with a receipt |
narration |
yes / minimal / no (+ workflow slots such as VO_MODE) |
workflow-specific |
3. Question rules
The executable question script lives in each workflow's Step 0 as a literal two-round template. This section defines only the invariants that script satisfies:
- Round 1 asks the mode — one question, skipped when the request already carried a signal. Autonomous → no further questions: state the locked brief (all fields + receipts) as a heads-up and build straight through; the one remaining question, before render, is "preview first, or render?". Collaborative → Round 2.
- Round 2 asks the workflow's ask-marked fields — one question per field, recommended option first, each with its receipt. Skip a question only when the user already answered that field in their request; inference is not an answer.
- Receipts. Every recommended option states its basis — "~40s — small change, +44/−13 across 12 files"; "square 1:1 — you named the X/LinkedIn feed as the destination".
- Channel. Native question UI when the environment has one; otherwise plain text as one numbered list. "go" accepts all defaults.