Skip to content

The release kit composes: looks, moments, poster templates, motion, the picture pass and the judge - #133

Draft
hblee12294 wants to merge 8 commits into
mainfrom
kit-quality
Draft

The release kit composes: looks, moments, poster templates, motion, the picture pass and the judge#133
hblee12294 wants to merge 8 commits into
mainfrom
kit-quality

Conversation

@hblee12294

Copy link
Copy Markdown
Member

The kit that vos deliver writes was a crop of a recording: one frame at eight aspects, bled to every edge, no ground, no message, no motion. The premium launch assets it is measured against are compositions of a subject: a designed ground with room, a window that is an object, a message in its own column, a clip that enters and ends on a poster. This PR makes those layers defaults and data, and gives the pipeline eyes.

studio-core

  • frame.inset: per-side card placement as fractions of the frame; a negative side bleeds the card past the edge. frame.shadowContact and frame.shadowColor. ON_FRAME and computeCardLayout change together (cardInset.test.ts pins parity and the no-inset byte parity).
  • look.ts (pure): three house looks (plate, gradient, dark), lookFromBrand, cardInset (card or hero placement from the two aspects), applyLook.
  • lower/motion.ts: frame.entrance (tilt-in, pull-out, rise) writes the head of the tilt or zoom track plus a card-pose track; a segment hold is a rated piece every reader inherits; doc.endCard expands into a hold plus the house overlays over a receding card; frame.focusFollow lets a cover crop follow the camera. A doc with none of them lowers byte-identically.
  • The channel specs carry a word policy, a safe rect and a default poster template per destination.

cli

  • vos deliver: the look from BRAND.md beside the take (or --look); still moments from the step timeline with blank and duplicate frames dropped and said (--times step:<id>); every card destination composed from a bundled poster template (split-cover, card-on-gradient; a program with a config.template contract, filled with the brand's colours and faces and LAUNCH.md's headline, the shot baked as an object); each video planned by kind (entrance, end card, beat captions from actions.json, a music bed and click sounds where the channel plays sound, the 9:16 reframe); a loop the take outruns takes its first seconds.
  • vos validate <kit.json> --picture: blank, duplicate, subject, separation, halfsize, sliced, safe, contrast, firstlast, each with a code, a severity, a fix hint and a box.
  • vos judge <kit.json> --against <manifest>: pairwise sheets beside a reference set, the rubric, a verdict slot, the win rate. No model runs inside the verb.
  • vos brand writes a look role.

Tests: studio-core 593, cli 254, all green; eslint and typecheck clean across packages. A changeset bumps studio-core and cli minor.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MLwe3sd8rp4eFvGxzAyySx

… and a hairline

studio-core gains frame.inset (per-side placement as fractions of the frame; a negative side bleeds the card past the edge), frame.shadowContact and frame.shadowColor, and a pure look module: three house looks (plate, gradient, dark), lookFromBrand, cardInset (card or hero placement from the two aspects) and applyLook. ON_FRAME and computeCardLayout change together; cardInset.test.ts pins their parity and the no-inset byte parity.

vos deliver presents card-genre stills with no poster and every video cut in a look: --look plate|gradient|dark|none, --brand <file>, else the BRAND.md beside the take decides from its look role or its own ground, else the house gradient. Screenshot-genre stills never take one. kit.json records the look. vos brand writes the look role from the site's ground.
…rames dropped and said

vos deliver picks its still moments from the story instead of the camera: every step's gesture end plus a 0.4 s settle (the response, not the travel), then the zoom apexes, then an even spread. Each candidate is captured once at probe size as the real page and measured from its pixels: a candidate under the take's own ink floor (a wallpaper, an empty canvas) is dropped, and two candidates that hash alike collapse to one, every drop said in skipped[]. --times takes step:<id>[+offset] beside seconds and percents. kit.json records the moments and their sources.

picture.ts holds the pure primitives (a dependency-free PNG decoder, ink coverage, a difference hash, the ground/card/shadow measurement); moments.ts the rungs and the pick.
… pixels

The kit verifier gains a picture pass beside the spec pass. Every finding carries a code, a severity, a message written from the failure it was built on, a fix hint and a box: blank (a wallpaper or an empty canvas where the product should be), duplicate (cards of one frame; two is a warning, three is an error; screenshot sets compare within their own destination), subject (a card off the 60 to 92 percent band or a crop where a card was asked for; a composed store screenshot, read from the manifest), separation (a light card on a light ground with no shadow halo and no drawn edge), halfsize (a tile that loses its edges when shrunk), and, where the manifest records text boxes, sliced, safe and contrast (APCA Lc 60/75); a video's first and last frames are read through ffmpeg when it is on PATH.

The measurement takes two thresholds: the strong box is the content, the faint box is the object with its halo and hairline, the shadow is a halo that darkens toward the card, and a drawn edge is the median of a column. channel-specs.json carries a structured text policy and safe rect per destination, generated into DESTINATIONS.
A poster template is a program with a contract (config.template: the slot that carries the release's shot, the params the brand and the release fill, the text elements and their limits, a layout per aspect). Two ship with the CLI, every word, colour and face a data binding: split-cover (a headline column beside the shot, bled off the right and the bottom, the wordmark low-left) and card-on-gradient (the shot alone on a mesh gradient, the store's tile rule). The filler places the shot per destination in design px, writes the values into data and params, and reports the text boxes it placed for the picture checks.

vos deliver renders every card destination from its default template (channel-specs names it) unless --poster names another, a file, a hosted vos, or none. The shot is captured once at the hero moment and baked as an object (padded, rounded, a soft shadow, a hairline on a light ground) before it enters the template. Values come from BRAND.md's roles (faces resolved against the hosted font catalog) and LAUNCH.md's headline and kicker beside the take, or --headline/--kicker; with no headline the headline templates stand down for card-on-gradient, said in words. kit.json records the template and the text boxes per card.
A poster card's composition is the template's, so its subject is the shot: the filler reports where each slot's card landed, kit.json records it, and the picture pass reads ink inside the shot and its width against the band instead of hunting for a card on a designed ground. Supplied values win over a template's own defaults (the kicker showed the template's default). The softened ink mixes 28 percent toward the ground so a kicker clears the body contrast floor.
… by destination, the vertical reframe

studio-core: frame.entrance (tilt-in, pull-out, rise) writes the head of the tilt or zoom track and a card-pose track (scale, rise, opacity), so the card's only rotation is still the tilt track; a segment's hold freezes its last frame for its seconds as a rated piece every reader inherits; doc.endCard expands into a hold plus the house title, caption and label overlays over a receding card; frame.focusFollow lets a cover crop follow the camera's focus. A doc with none of them lowers byte-identically.

vos deliver plans each video destination by kind: every cut but a loop opens on an entrance and closes on an end card built from the headline, the release line and the wordmark; a step's caption in actions.json lands as a lower-third at its moment on cuts that take words; destinations that play sound take a bed from the catalog by LAUNCH.md's music slug or mood and a click sound on every press when the take has no mic; the 9:16 cut is a reframe whose crop follows the camera. A loop destination the take outruns takes the take's first seconds up to its cap instead of being skipped.
…bric, a verdict slot

For every still that has a reference of its role in a manifest (a template family, a card genre, a video's first frame), the verb composes two sheets at a common height (the asset left, then right, so order cannot bias the call), writes the rubric beside them and a judge.json the judge fills; the win rate is reported beside the spec and picture counts. No model runs in the verb. The entrance keeps the card visible on the first frame and rests the camera while the card arrives.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant