{ "pack_id": "video-showcase", "title": "Video showcase", "version": "0.1.0", "summary": "A collection of nouns and verbs for making a truthful demo video: script, storyboard, shot list, capture plan, audio cue sheet, styles, captions, evidence links and showcase checks, with verbs from script to review and the owner's publication record; scenes, assembly, rendering and encoded-video checks use the video and motion pack.", "dependencies": [ "video-motion" ], "boundaries": [ "Use only synthetic or demo data on screen. No credentials, real personal data, private tabs or notifications may appear in any capture.", "Keep every output inside the requester's scope. Publishing, uploading or posting the video is the owner's separate decision.", "Narration is recorded by a person; any generated media is labeled.", "Importing the pack writes nothing and enqueues nothing." ], "nouns": [ { "slug": "pack", "category": "noun.skill_pack", "role": "pack", "title": "A collection of nouns and verbs for making a truthful demo video", "value": { "lets_workers": "Make a truthful demo video as ordinary claimed work: script, storyboard, screen capture, human narration, captions and audio layers here; drawn scenes, assembly, rendering in 16:9 with an optional 9:16 cut and encoded-video checks with the video and motion pack's verbs; then review, where every on-screen number links to its evidence.", "flow": [ { "verb": { "$verb": "video-showcase.draft-script" }, "when": "First, from the requester's video brief." }, { "verb": { "$verb": "video-showcase.storyboard" }, "when": "After the script; produces the storyboard, shot list and capture plan." }, { "verb": { "$verb": "video-showcase.capture-screen" }, "when": "Per capture in the plan; captures can run as separate attempts." }, { "verb": { "$verb": "video-showcase.record-narration" }, "when": "A person records the script; no model is used." }, { "verb": { "$verb": "video-showcase.transcribe-captions" }, "when": "After narration exists." }, { "verb": { "$verb": "video-motion.draft-scene" }, "when": "For storyboard scenes that are drawn rather than captured: title cards and diagrams." }, { "verb": { "$verb": "video-showcase.prepare-audio" }, "when": "After narration exists: music, sound effects and ambience under the license policy, mixed into one bed." }, { "verb": { "$verb": "video-motion.plan-sequence" }, "when": "After media, narration and captions exist: cuts, crossfades, layers and captions." }, { "verb": { "$verb": "video-motion.render-sequence" }, "when": "After the sequence plans cleanly: 16:9 and the optional 9:16 cut." }, { "verb": { "$verb": "video-motion.check-video" }, "when": "After each render." }, { "verb": { "$verb": "video-showcase.review-video" }, "when": "By a person or a different worker, with the showcase checks." }, { "verb": { "$verb": "video-showcase.record-publication" }, "when": "Last: the owner releases the approved cut, or holds it, and records which." } ], "shared_words": { "scene recipe": "A declarative scene, drafted with video-motion.draft-scene.", "media": "A hash-pinned recording, image or audio file, in the video and motion pack's media format.", "sequence": "The ordered clips, layers, cuts and crossfades that video-motion.plan-sequence writes and video-motion.render-sequence renders.", "render": "Deterministic frame production with no model call per frame.", "QA": "The video and motion pack's encoded-video checks, plus this pack's showcase checks for evidence, rights, labels, duration and caption style." }, "aspects": { "16:9": "1920x1080, the primary output", "9:16": "1080x1920, the optional vertical cut" }, "style_guide": { "$pin": "style-guide" }, "privacy": "Use only synthetic or demo data on screen. No credentials, real personal data, private tabs or notifications may appear in any capture.", "publication": "Keep every output inside the requester's scope. Publishing, uploading or posting the video is the owner's separate decision.", "showcase_checks": { "$pin": "showcase-checks" } }, "relations": [ [ "requires_noun", "style-guide" ], [ "requires_noun", "showcase-checks" ], [ "requires_noun", "asset-policy" ], [ "requires_noun", "style-presets" ], [ "requires_noun", "template.audio-cue-sheet" ], [ "requires_noun", "template.publication-record" ], [ "requires_noun", "template.video-brief" ], [ "requires_noun", "template.script" ], [ "requires_noun", "template.storyboard" ], [ "requires_noun", "template.shot-list" ], [ "requires_noun", "template.capture-plan" ], [ "requires_noun", "template.evidence-link" ], [ "requires_noun", "template.caption-track" ], [ "requires_noun", "template.review-notes" ], [ "requires_noun", "video-motion:tool.playwright" ], [ "requires_noun", "video-motion:tool.chromium" ], [ "requires_noun", "video-motion:tool.ffmpeg" ], [ "requires_noun", "video-motion:template.media" ], [ "requires_noun", "video-motion:checks.video" ] ] }, { "slug": "style-guide", "category": "noun.skill_pack", "role": "style_guide", "title": "Demo video style guide", "category_reason": "A reusable production method with its guardrails, read by every verb in this pack.", "value": { "defaults_note": "These are adjustable defaults. The requester's video brief overrides them.", "formats": { "primary": "16:9 at 1920x1080, 30 frames per second, H.264 (yuv420p) with AAC audio at 48 kHz.", "optional": "9:16 at 1080x1920 for short vertical cuts.", "captions": "A sidecar caption file (SRT or WebVTT) always; burned-in captions when the brief asks for them." }, "content_rules": [ "Show the real product working with synthetic or demo data.", "Every number on screen links to its evidence: a test run, a counts record, an event log, a receipt or a dated public source.", "Label any generated still, voice or clip as generated.", "Prefer a human narrator reading the script in their own voice.", "One idea per beat; plain words; no claims the evidence does not support." ], "caption_rules": [ "At most 2 lines per cue and 42 characters per line.", "Each cue on screen for 1 to 7 seconds.", "At most 17 characters per second.", "Keep captions inside the inner 90 percent of the frame." ], "audio_rules": [ "Integrated loudness about -16 LUFS with true peak at or below -1 dBTP for web playback. Set it as the sequence's loudness target; the video and motion pack's render and check verbs apply and measure it.", "Music, if any, stays well under the narration." ], "privacy": "Use only synthetic or demo data on screen. No credentials, real personal data, private tabs or notifications may appear in any capture." } }, { "slug": "showcase-checks", "category": "noun.benchmark_suite", "role": "showcase_checks", "title": "Showcase checks: evidence, rights, labels, duration and caption style", "category_reason": "A fixed set of deterministic checks that a truthful showcase adds on top of the encoded-video checks.", "value": { "checks": [ { "id": "duration", "threshold": "Within 5 percent of the brief's target_seconds.", "method": "The measured duration in the video QA report from video-motion.check-video." }, { "id": "caption-style", "threshold": "At most 2 lines, at most 42 characters per line, at most 17 characters per second.", "method": "Deterministic check of the caption track against the style guide's caption rules, on top of the video and motion pack's caption checks." }, { "id": "asset-licenses", "threshold": "Every music, sound-effect, still and third-party clip has a license from the audio and asset policy, with attribution where required.", "method": "Deterministic join of sequence clips and audio cues with media nouns' rights fields against the policy's allowed list." }, { "id": "evidence-coverage", "threshold": "Every claim id in the script has an evidence link with result verified.", "method": "Deterministic join of script claims and evidence links." }, { "id": "generated-media-labeled", "threshold": "Every media noun marked synthetic is labeled on screen or in the description, not only in file metadata.", "method": "Deterministic join of sequence clips and media nouns, plus a visual check." } ], "rules": [ "Encoded-video checks (streams, frames, spot checks, black and frozen frames, loudness, caption timing and the disclosure in file metadata) are defined once in the video and motion pack and run by its check-video verb. These checks add only what a truthful showcase needs on top.", "Every check reports its measurement, not only pass or fail.", "A check that cannot run is not_run with the reason, never pass; one that does not apply is not_applicable with the reason.", "Thresholds come from the style guide unless the brief overrides them; record which applied." ], "video_checks": { "$pin": "video-motion:checks.video" } }, "relations": [ [ "requires_noun", "style-guide" ], [ "requires_noun", "video-motion:checks.video" ] ] }, { "slug": "asset-policy", "category": "noun.skill_pack", "role": "asset_policy", "title": "Audio and asset license policy", "category_reason": "A reusable guardrail every verb that adds music, sound effects, stills or third-party clips must follow.", "value": { "allowed": [ { "license": "CC0-1.0", "attribution": "Not required; credit is still kind." }, { "license": "CC-BY-4.0", "attribution": "Required, in the description and on the end card." }, { "license": "owner-recorded", "attribution": "Not required." }, { "license": "licensed-with-receipt", "attribution": "As the license says.", "evidence": "The stored license file or receipt, pinned by digest." } ], "refused": [ "A missing or unknown license.", "CC-BY-ND for music or sound placed in a video: syncing audio to moving images counts as an adaptation under the CC 4.0 licenses.", "CC-BY-NC unless the owner confirms the video is non-commercial.", "Audio or clips copied from a streaming service or another video.", "Generated audio or images whose model terms forbid this use." ], "rules": [ "Every media noun records license, source or receipt, creator and attribution text.", "Generated media is labeled generated and records the generator and its terms.", "Music stays under the narration; duck it while the narrator speaks." ], "sources": [ "https://creativecommons.org/licenses/by/4.0/legalcode", "https://creativecommons.org/publicdomain/zero/1.0/legalcode" ] } }, { "slug": "style-presets", "category": "noun.skill_pack", "role": "style_presets", "title": "Layer style presets: titles, lower thirds, captions, highlights and end cards", "category_reason": "Reusable visual conventions every render and assembly verb applies.", "value": { "fonts": [ { "family": "Inter", "license": "OFL-1.1" }, { "family": "Atkinson Hyperlegible", "license": "OFL-1.1" } ], "presets": [ { "id": "title", "size_px_at_1080p": 72, "position": "center", "background": "none" }, { "id": "lower_third", "size_px_at_1080p": 40, "position": "bottom left inside the title-safe area", "background": "panel at 80 percent opacity" }, { "id": "caption", "size_px_at_1080p": 44, "position": "bottom center, above player controls", "background": "panel at 70 percent opacity" }, { "id": "highlight", "stroke_px": 6, "shape": "rounded rectangle", "motion": "fade in over 0.3 s" }, { "id": "end_card", "size_px_at_1080p": 56, "includes": "title, address to try it, attributions" } ], "rules": [ "Text contrast at least 4.5:1 against what is behind it, or 3:1 for text 24 px and larger.", "Keep text inside the inner 90 percent of the frame.", "One accent color; never color alone to carry meaning." ] } }, { "slug": "template.audio-cue-sheet", "category": "noun.scene_recipe", "role": "template", "title": "Template: an audio cue sheet: narration, music, sound effects and ambience with timing, gain, ducking and licenses", "value": { "describes": "an audio cue sheet: narration, music, sound effects and ambience with timing, gain, ducking and licenses", "schema": { "type": "object", "additionalProperties": false, "required": [ "cues", "loudness_target_lufs", "true_peak_dbtp" ], "properties": { "cues": { "type": "array", "minItems": 1, "maxItems": 200, "items": { "type": "object", "additionalProperties": false, "required": [ "cue_id", "layer", "media_ref", "start_s", "end_s", "gain_db", "license" ], "properties": { "cue_id": { "type": "string", "minLength": 1, "maxLength": 40 }, "layer": { "type": "string", "enum": [ "narration", "music", "sound_effect", "ambience" ] }, "media_ref": { "type": "string", "minLength": 1, "maxLength": 300 }, "start_s": { "type": "number", "minimum": 0, "maximum": 7200 }, "end_s": { "type": "number", "minimum": 0, "maximum": 7200 }, "gain_db": { "type": "number", "minimum": -60, "maximum": 12 }, "fade_in_s": { "type": "number", "minimum": 0, "maximum": 30 }, "fade_out_s": { "type": "number", "minimum": 0, "maximum": 30 }, "duck_under_narration_db": { "type": "number", "minimum": -40, "maximum": 0 }, "license": { "type": "string", "minLength": 1, "maxLength": 120 }, "attribution": { "type": "string", "minLength": 0, "maxLength": 300 } } } }, "loudness_target_lufs": { "type": "number", "minimum": -40, "maximum": 0 }, "true_peak_dbtp": { "type": "number", "minimum": -10, "maximum": 0 } } }, "rules": [ "Every cue names its license, allowed by the asset policy.", "Music is ducked under narration." ] }, "category_reason": "A cue sheet binds audio media to the timeline like a scene binds assets." }, { "slug": "template.publication-record", "category": "noun.eval_run", "role": "template", "title": "Template: the owner's record of whether and where the approved cut was released", "value": { "describes": "the owner's record of whether and where the approved cut was released", "schema": { "type": "object", "additionalProperties": false, "required": [ "decision", "file_sha256", "recorded_by", "recorded_at" ], "properties": { "decision": { "type": "string", "enum": [ "released", "held" ] }, "platform": { "type": "string", "minLength": 0, "maxLength": 120 }, "address": { "type": "string", "minLength": 0, "maxLength": 400 }, "visibility": { "type": "string", "enum": [ "public", "unlisted", "private" ] }, "released_at": { "type": "string", "minLength": 0, "maxLength": 40 }, "file_sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "attributions_in_description": { "type": "boolean" }, "generated_media_labeled": { "type": "boolean" }, "recorded_by": { "type": "string", "enum": [ "owner" ] }, "recorded_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}", "maxLength": 40 } } }, "rules": [ "file_sha256 equals the approved encoded output's digest.", "recorded_by is the owner." ] }, "category_reason": "A publication record is a verification run comparing what was released with what was approved." }, { "slug": "template.video-brief", "category": "noun.seed_hypothesis", "role": "template", "title": "Template: the requester's video brief: audience, goal, must-show, limits and evidence sources", "value": { "describes": "the requester's video brief: audience, goal, must-show, limits and evidence sources", "schema": { "type": "object", "additionalProperties": false, "required": [ "audience", "goal", "must_show", "must_not_show", "target_seconds", "formats", "evidence_sources", "narration" ], "properties": { "audience": { "type": "string", "minLength": 1, "maxLength": 300 }, "goal": { "type": "string", "minLength": 1, "maxLength": 300 }, "must_show": { "type": "array", "minItems": 1, "maxItems": 12, "items": { "type": "string", "minLength": 1, "maxLength": 200 } }, "must_not_show": { "type": "array", "minItems": 0, "maxItems": 12, "items": { "type": "string", "minLength": 1, "maxLength": 200 } }, "target_seconds": { "type": "integer", "minimum": 10, "maximum": 1200 }, "formats": { "type": "array", "minItems": 1, "maxItems": 2, "items": { "type": "string", "enum": [ "16:9", "9:16" ] } }, "evidence_sources": { "type": "array", "minItems": 1, "maxItems": 20, "items": { "type": "string", "minLength": 1, "maxLength": 300 } }, "narration": { "type": "string", "enum": [ "human_voice", "captions_only" ] }, "tone": { "type": "string", "minLength": 1, "maxLength": 200 }, "deadline": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}", "maxLength": 40 } } }, "rules": [ "The brief is the requester's; workers do not change it.", "Every number the video may show must come from a listed evidence source." ], "example": { "audience": "SYNTHETIC: developers who want to try the project in five minutes.", "goal": "Show one task going from request to a checked result.", "must_show": [ "The request being created", "A worker claiming it", "The checked result and its receipt" ], "must_not_show": [ "Real accounts", "Credentials", "Unverified numbers" ], "target_seconds": 120, "formats": [ "16:9", "9:16" ], "evidence_sources": [ "Local test run output", "The counts record of a local demo namespace" ], "narration": "human_voice" } }, "category_reason": "A brief frames what the video must prove and how success will be judged." }, { "slug": "template.script", "category": "noun.scene_recipe", "role": "template", "title": "Template: a narration script split into timed beats, with every on-screen number listed as a claim", "value": { "describes": "a narration script split into timed beats, with every on-screen number listed as a claim", "schema": { "type": "object", "additionalProperties": false, "required": [ "total_seconds", "beats", "claims" ], "properties": { "total_seconds": { "type": "integer", "minimum": 5, "maximum": 1200 }, "beats": { "type": "array", "minItems": 1, "maxItems": 40, "items": { "type": "object", "additionalProperties": false, "required": [ "beat_id", "seconds", "narration", "visual_intent", "claim_ids" ], "properties": { "beat_id": { "type": "string", "minLength": 1, "maxLength": 40, "pattern": "^[a-z0-9-]+$" }, "seconds": { "type": "number", "minimum": 0.5, "maximum": 120 }, "narration": { "type": "string", "minLength": 0, "maxLength": 600 }, "on_screen_text": { "type": "string", "minLength": 0, "maxLength": 120 }, "visual_intent": { "type": "string", "minLength": 1, "maxLength": 300 }, "claim_ids": { "type": "array", "minItems": 0, "maxItems": 6, "items": { "type": "string", "minLength": 1, "maxLength": 40 } } } } }, "claims": { "type": "array", "minItems": 0, "maxItems": 30, "items": { "type": "object", "additionalProperties": false, "required": [ "claim_id", "text", "value", "unit" ], "properties": { "claim_id": { "type": "string", "minLength": 1, "maxLength": 40, "pattern": "^[a-z0-9-]+$" }, "text": { "type": "string", "minLength": 1, "maxLength": 200 }, "value": { "type": [ "number", "string" ] }, "unit": { "type": "string", "minLength": 1, "maxLength": 60 } } } } } }, "rules": [ "Beat durations sum to total_seconds within 5 percent.", "Every number in narration or on-screen text appears in claims with an id." ], "example": { "total_seconds": 20, "beats": [ { "beat_id": "hook", "seconds": 6, "narration": "One request, one worker, one checked result.", "visual_intent": "Title card over the dashboard", "claim_ids": [] }, { "beat_id": "proof", "seconds": 14, "narration": "This run passed every check.", "on_screen_text": "12 of 12 checks passed", "visual_intent": "Screen capture of the result page", "claim_ids": [ "checks-passed" ] } ], "claims": [ { "claim_id": "checks-passed", "text": "12 of 12 checks passed", "value": 12, "unit": "checks" } ] } }, "category_reason": "The script binds narration and on-screen text to timed beats that scenes are built from." }, { "slug": "template.storyboard", "category": "noun.scene_recipe", "role": "template", "title": "Template: scenes with visuals, sources, durations and transitions", "value": { "describes": "scenes with visuals, sources, durations and transitions", "schema": { "type": "object", "additionalProperties": false, "required": [ "scenes" ], "properties": { "scenes": { "type": "array", "minItems": 1, "maxItems": 40, "items": { "type": "object", "additionalProperties": false, "required": [ "scene_id", "beat_ids", "visual", "source", "seconds", "transition_in" ], "properties": { "scene_id": { "type": "string", "minLength": 1, "maxLength": 40, "pattern": "^[a-z0-9-]+$" }, "beat_ids": { "type": "array", "minItems": 1, "maxItems": 8, "items": { "type": "string", "minLength": 1, "maxLength": 40 } }, "visual": { "type": "string", "minLength": 1, "maxLength": 400 }, "source": { "type": "string", "enum": [ "screen_capture", "rendered_scene", "still", "title_card" ] }, "seconds": { "type": "number", "minimum": 0.5, "maximum": 120 }, "transition_in": { "type": "string", "enum": [ "cut", "crossfade" ] }, "notes": { "type": "string", "minLength": 0, "maxLength": 300 } } } } } }, "rules": [ "Every beat appears in at least one scene.", "Transitions are cuts or crossfades only." ] }, "category_reason": "A storyboard is the declarative scene layout of the video." }, { "slug": "template.shot-list", "category": "noun.scene_recipe", "role": "template", "title": "Template: the shots to capture or render, each tied to a scene and aspect ratios", "value": { "describes": "the shots to capture or render, each tied to a scene and aspect ratios", "schema": { "type": "object", "additionalProperties": false, "required": [ "shots" ], "properties": { "shots": { "type": "array", "minItems": 1, "maxItems": 80, "items": { "type": "object", "additionalProperties": false, "required": [ "shot_id", "scene_id", "kind", "source_plan", "seconds", "aspects" ], "properties": { "shot_id": { "type": "string", "minLength": 1, "maxLength": 40, "pattern": "^[a-z0-9-]+$" }, "scene_id": { "type": "string", "minLength": 1, "maxLength": 40 }, "kind": { "type": "string", "enum": [ "screen_capture", "rendered_scene", "still", "title_card" ] }, "source_plan": { "type": "string", "minLength": 1, "maxLength": 300 }, "seconds": { "type": "number", "minimum": 0.5, "maximum": 120 }, "aspects": { "type": "array", "minItems": 1, "maxItems": 2, "items": { "type": "string", "enum": [ "16:9", "9:16" ] } } } } } } }, "rules": [ "Every scene has at least one shot.", "Each shot names its capture plan entry or scene recipe." ] }, "category_reason": "A shot list binds each scene to the assets that will fill it." }, { "slug": "template.capture-plan", "category": "noun.scene_recipe", "role": "template", "title": "Template: scripted screen captures: target, data, viewport, steps and privacy checks", "value": { "describes": "scripted screen captures: target, data, viewport, steps and privacy checks", "schema": { "type": "object", "additionalProperties": false, "required": [ "captures", "privacy_checks" ], "properties": { "captures": { "type": "array", "minItems": 1, "maxItems": 40, "items": { "type": "object", "additionalProperties": false, "required": [ "capture_id", "shot_id", "target", "data", "viewport", "steps", "seconds" ], "properties": { "capture_id": { "type": "string", "minLength": 1, "maxLength": 40, "pattern": "^[a-z0-9-]+$" }, "shot_id": { "type": "string", "minLength": 1, "maxLength": 40 }, "target": { "type": "string", "minLength": 1, "maxLength": 300 }, "data": { "type": "string", "enum": [ "synthetic", "demo_account" ] }, "viewport": { "type": "object", "additionalProperties": false, "required": [ "width", "height" ], "properties": { "width": { "type": "integer", "minimum": 320, "maximum": 3840 }, "height": { "type": "integer", "minimum": 240, "maximum": 2160 } } }, "device_scale_factor": { "type": "number", "minimum": 1, "maximum": 3 }, "steps": { "type": "array", "minItems": 1, "maxItems": 40, "items": { "type": "object", "additionalProperties": false, "required": [ "action" ], "properties": { "action": { "type": "string", "enum": [ "goto", "click", "type", "wait", "scroll", "hover" ] }, "target": { "type": "string", "minLength": 0, "maxLength": 300 }, "text": { "type": "string", "minLength": 0, "maxLength": 300 }, "wait_ms": { "type": "integer", "minimum": 0, "maximum": 60000 } } } }, "seconds": { "type": "number", "minimum": 0.5, "maximum": 300 } } } }, "privacy_checks": { "type": "array", "minItems": 1, "maxItems": 10, "items": { "type": "string", "minLength": 1, "maxLength": 200 } } } }, "rules": [ "Use only synthetic or demo data on screen. No credentials, real personal data, private tabs or notifications may appear in any capture.", "Targets are local or demo deployments the requester controls." ], "example": { "captures": [ { "capture_id": "result-page", "shot_id": "proof-1", "target": "http://localhost:/result/demo", "data": "synthetic", "viewport": { "width": 1920, "height": 1080 }, "device_scale_factor": 1, "steps": [ { "action": "goto", "target": "http://localhost:/result/demo" }, { "action": "wait", "wait_ms": 1500 } ], "seconds": 14 } ], "privacy_checks": [ "Browser profile is fresh and signed out of every account.", "Notifications are disabled." ] } }, "category_reason": "A capture plan is a reproducible camera setup for screen recordings." }, { "slug": "template.evidence-link", "category": "noun.eval_run", "role": "template", "title": "Template: the evidence behind one on-screen number", "value": { "describes": "the evidence behind one on-screen number", "schema": { "type": "object", "additionalProperties": false, "required": [ "claim_id", "on_screen_text", "value", "unit", "source", "check" ], "properties": { "claim_id": { "type": "string", "minLength": 1, "maxLength": 40, "pattern": "^[a-z0-9-]+$" }, "on_screen_text": { "type": "string", "minLength": 1, "maxLength": 200 }, "value": { "type": [ "number", "string" ] }, "unit": { "type": "string", "minLength": 1, "maxLength": 60 }, "source": { "type": "object", "additionalProperties": false, "required": [ "kind", "ref", "observed_at" ], "properties": { "kind": { "type": "string", "enum": [ "test_run", "counts_record", "event_log", "receipt", "public_source" ] }, "ref": { "type": "string", "minLength": 1, "maxLength": 400 }, "observed_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}", "maxLength": 40 } } }, "check": { "type": "object", "additionalProperties": false, "required": [ "method", "result", "checked_at" ], "properties": { "method": { "type": "string", "minLength": 1, "maxLength": 400 }, "result": { "type": "string", "enum": [ "verified", "unverified", "stale", "contradicted" ] }, "checked_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}", "maxLength": 40 } } } } }, "rules": [ "One link per claim id.", "Only verified links may appear in a final cut." ], "example": { "claim_id": "checks-passed", "on_screen_text": "12 of 12 checks passed", "value": 12, "unit": "checks", "source": { "kind": "test_run", "ref": "SYNTHETIC: local test run log, run 7, summary line", "observed_at": "2026-10-29" }, "check": { "method": "Reran the test command and compared the summary line.", "result": "verified", "checked_at": "2026-10-29" } } }, "category_reason": "An evidence link points to the run, record or receipt that produced a number and records how it was checked." }, { "slug": "template.caption-track", "category": "noun.scene_recipe", "role": "template", "title": "Template: timed captions transcribed from the narration, with differences from the script", "value": { "describes": "timed captions transcribed from the narration, with differences from the script", "schema": { "type": "object", "additionalProperties": false, "required": [ "language", "cues", "source_media", "deviations_from_script" ], "properties": { "language": { "type": "string", "minLength": 1, "maxLength": 20 }, "source_media": { "type": "string", "minLength": 1, "maxLength": 300 }, "cues": { "type": "array", "minItems": 1, "maxItems": 600, "items": { "type": "object", "additionalProperties": false, "required": [ "start_s", "end_s", "text" ], "properties": { "start_s": { "type": "number", "minimum": 0, "maximum": 7200 }, "end_s": { "type": "number", "minimum": 0, "maximum": 7200 }, "text": { "type": "string", "minLength": 1, "maxLength": 90 } } } }, "deviations_from_script": { "type": "array", "minItems": 0, "maxItems": 60, "items": { "type": "object", "additionalProperties": false, "required": [ "beat_id", "script", "spoken" ], "properties": { "beat_id": { "type": "string", "minLength": 1, "maxLength": 40 }, "script": { "type": "string", "minLength": 0, "maxLength": 600 }, "spoken": { "type": "string", "minLength": 0, "maxLength": 600 } } } }, "corrected_by": { "type": "string", "enum": [ "none", "human", "agent" ] } } }, "rules": [ "Cues follow the style guide's caption rules.", "Differences between script and speech are listed, not silently fixed." ] }, "category_reason": "Captions are timed text bound to the narration media." }, { "slug": "template.review-notes", "category": "noun.eval_run", "role": "template", "title": "Template: a reviewer's notes and decision on one cut", "value": { "describes": "a reviewer's notes and decision on one cut", "schema": { "type": "object", "additionalProperties": false, "required": [ "reviewer_kind", "claims", "notes", "decision" ], "properties": { "reviewer_kind": { "type": "string", "enum": [ "human", "agent" ] }, "claims": { "type": "array", "minItems": 0, "maxItems": 30, "items": { "type": "object", "additionalProperties": false, "required": [ "claim_id", "result" ], "properties": { "claim_id": { "type": "string", "minLength": 1, "maxLength": 40 }, "result": { "type": "string", "enum": [ "upheld", "disputed", "unverifiable" ] }, "note": { "type": "string", "minLength": 0, "maxLength": 400 } } } }, "notes": { "type": "array", "minItems": 0, "maxItems": 20, "items": { "type": "string", "minLength": 1, "maxLength": 400 } }, "decision": { "type": "string", "enum": [ "ready_for_owner_decision", "revise", "reject" ] } } }, "rules": [ "The reviewer is a person or a worker other than the cut's assembler.", "A decision never publishes anything." ] }, "category_reason": "Review notes record a verification pass over the cut and its claims." } ], "verbs": [ { "slug": "draft-script", "kind": "verb.solve_draft", "title": "Draft the script", "claimant": "agent", "summary": "Write a timed narration script from the video brief, listing every on-screen number as a claim with an id.", "outcome": "A script noun and one unverified evidence-link draft per claim.", "ready_outcome": "script_ready", "pinned": [ "style-guide" ], "slots": [ { "name": "video_brief", "category": "noun.seed_hypothesis", "description": "Pin of the requester's video brief." } ], "produces": [ { "name": "script", "template": "template.script" }, { "name": "evidence_links", "template": "template.evidence-link", "max": 30 } ], "steps": [ "Verify the brief pin. Read the style guide.", "Write beats in plain words, one idea per beat, within the brief's target length.", "List every number that will be spoken or shown as a claim with an id. Draft its evidence link from the brief's evidence sources with result unverified.", "Leave a claim out rather than include a number you cannot trace.", "Propose a storyboard verb with the script and brief pinned.", "Keep every output inside the requester's scope. Publishing, uploading or posting the video is the owner's separate decision." ], "acceptance": [ { "id": "script-matches-template", "check": "The script validates against template.script's schema.", "method": "deterministic" }, { "id": "durations-sum", "check": "Beat durations sum to total_seconds within 5 percent, and total_seconds is within 10 percent of the brief's target.", "method": "deterministic" }, { "id": "claims-linked", "check": "Every claim id has exactly one evidence-link draft.", "method": "deterministic" }, { "id": "plain-language", "check": "A viewer from the brief's audience can follow each beat.", "method": "judgment" } ], "bounds": { "max_elapsed_seconds": 1200 } }, { "slug": "storyboard", "kind": "verb.solve_draft", "title": "Storyboard the video", "claimant": "agent", "summary": "Turn the script into scenes, a shot list and a capture plan that a capture worker and a renderer can follow exactly.", "outcome": "Storyboard, shot-list and capture-plan nouns.", "ready_outcome": "storyboard_ready", "pinned": [ "style-guide" ], "slots": [ { "name": "script", "category": "noun.scene_recipe", "description": "Pin of the script." }, { "name": "video_brief", "category": "noun.seed_hypothesis", "description": "Pin of the video brief." } ], "produces": [ { "name": "storyboard", "template": "template.storyboard" }, { "name": "shot_list", "template": "template.shot-list" }, { "name": "capture_plan", "template": "template.capture-plan" } ], "steps": [ "Verify the pins. Map every beat to at least one scene.", "Prefer real screen captures of the working product; use rendered scenes for titles, diagrams and transitions.", "Write a capture plan step by step with viewport 1920x1080, synthetic or demo data and privacy checks.", "Mark which shots need a 9:16 variant when the brief asks for one.", "Propose one capture-screen verb per capture and a render-scenes verb for rendered shots.", "Keep every output inside the requester's scope. Publishing, uploading or posting the video is the owner's separate decision." ], "acceptance": [ { "id": "templates-valid", "check": "Storyboard, shot list and capture plan validate against their templates.", "method": "deterministic" }, { "id": "beats-covered", "check": "Every beat id appears in a scene, and every scene has a shot.", "method": "deterministic" }, { "id": "captures-planned", "check": "Every screen_capture shot has a capture plan entry with privacy checks.", "method": "deterministic" }, { "id": "feasible", "check": "A capture worker could follow each capture without guessing.", "method": "judgment" } ], "bounds": { "max_elapsed_seconds": 1200 }, "follows": [ "video-showcase.draft-script" ] }, { "slug": "capture-screen", "kind": "verb.compile_dag", "title": "Capture the screen", "claimant": "agent_or_human", "summary": "Run the capture plan's scripted steps against local or demo targets and store each recording as a hash-pinned media noun.", "outcome": "One media noun per capture, each with its digest, dimensions and duration.", "ready_outcome": "media_ready", "model_use": "none", "pinned": [ "video-motion:tool.playwright", "video-motion:tool.chromium", "style-guide" ], "slots": [ { "name": "capture_plan", "category": "noun.scene_recipe", "description": "Pin of the capture plan." }, { "name": "shot_list", "category": "noun.scene_recipe", "description": "Pin of the shot list." } ], "params": { "capture_ids": { "schema": { "type": "array", "maxItems": 40, "items": { "type": "string" } }, "default": [], "description": "Captures to run in this attempt. Empty means all." } }, "produces": [ { "name": "media", "template": "video-motion:template.media", "max": 40 } ], "steps": [ "Verify the pins and the pinned Playwright and Chromium builds before running anything.", "Use a fresh browser profile, signed out of every account, with notifications off.", "Run each capture's steps exactly, at its viewport, against its local or demo target only. Set the recording size to the viewport explicitly; the default is smaller.", "Store each recording as a blob, compute its SHA-256, and write a media noun in the video and motion pack's media format with provenance captured and synthetic false.", "Stop and return blocked if any frame would show a credential, real personal data or an unplanned site." ], "acceptance": [ { "id": "media-matches-template", "check": "Every media noun validates against the video and motion pack's template.media schema.", "method": "deterministic" }, { "id": "digest-matches", "check": "Each media noun's blob digest equals the SHA-256 of the stored bytes.", "method": "deterministic" }, { "id": "dimensions-match", "check": "Width and height match the capture plan's viewport, with the recording size set to it explicitly.", "method": "deterministic" }, { "id": "privacy-clean", "check": "A frame-by-frame skim shows no credential, personal data or unplanned site.", "method": "judgment" } ], "bounds": { "max_elapsed_seconds": 1800, "max_captures": 40 }, "network": [ "local_only", "Only the local or demo targets named in the capture plan. No other sites, accounts or services." ], "capabilities": [ "read permitted noun versions", "a qualified Playwright and Chromium build", "store blobs in the requester's scope", "write candidate nouns in the requester's scope" ], "follows": [ "video-showcase.storyboard" ], "notes": [ "A person may claim this verb and record the plan by hand; the media noun and checks are the same." ] }, { "slug": "record-narration", "kind": "verb.solve_draft", "title": "Record the narration", "claimant": "human", "summary": "A person reads the script in their own voice and uploads the take; no model is involved.", "outcome": "A narration media noun, or no_change if the person decides to keep an earlier take.", "ready_outcome": "narration_ready", "model_use": "none", "pinned": [ "style-guide" ], "slots": [ { "name": "script", "category": "noun.scene_recipe", "description": "Pin of the script to read." } ], "produces": [ { "name": "narration", "template": "video-motion:template.media" } ], "steps": [ "Read the script aloud in a quiet room; small departures from the script are fine and will be captured by transcription.", "Record at 48 kHz, mono or stereo, without music.", "Upload the take as a blob in your team's scope and write a media noun in the video and motion pack's media format with kind audio, provenance captured, synthetic false and the license the person grants. The renderer accepts CC0-1.0, CC-BY-4.0 or MIT for a person's recording.", "Nobody else's voice and no synthetic voice is used in this verb.", "When the take is stored, propose a transcribe-captions verb with it pinned." ], "acceptance": [ { "id": "media-matches-template", "check": "The narration noun validates against the video and motion pack's template.media schema with kind audio.", "method": "deterministic" }, { "id": "digest-matches", "check": "The blob digest equals the SHA-256 of the stored bytes.", "method": "deterministic" }, { "id": "not-generated", "check": "provenance is captured and synthetic is false.", "method": "deterministic" }, { "id": "listenable", "check": "The take is clear enough to transcribe.", "method": "judgment" } ], "bounds": { "max_elapsed_seconds": 86400 }, "capabilities": [ "upload a blob in the requester's scope", "write candidate nouns in the requester's scope" ], "follows": [ "video-showcase.storyboard" ] }, { "slug": "transcribe-captions", "kind": "verb.ingest", "title": "Transcribe captions", "claimant": "agent", "summary": "Transcribe the narration into timed captions and list where the speech differs from the script.", "outcome": "A caption track that follows the style guide's caption rules.", "ready_outcome": "captions_ready", "pinned": [ "style-guide" ], "slots": [ { "name": "narration", "category": "noun.scene_recipe", "description": "Pin of the narration media noun." }, { "name": "script", "category": "noun.scene_recipe", "description": "Pin of the script." } ], "produces": [ { "name": "caption_track", "template": "template.caption-track" } ], "steps": [ "Verify the pins and the narration blob's digest.", "Transcribe with the speech-to-text tool or model your allowance permits; record which one in the execution report.", "Split cues by the style guide's caption rules and align them to the audio.", "List each difference between script and speech instead of silently correcting it.", "Keep every output inside the requester's scope. Publishing, uploading or posting the video is the owner's separate decision." ], "acceptance": [ { "id": "track-matches-template", "check": "The caption track validates against template.caption-track's schema.", "method": "deterministic" }, { "id": "layout-rules", "check": "Every cue has at most 2 lines, 42 characters per line and 17 characters per second.", "method": "deterministic" }, { "id": "cues-ordered", "check": "Cues are in time order, do not overlap and end before the narration ends.", "method": "deterministic" }, { "id": "transcript-faithful", "check": "Captions match what was said, not what the script hoped.", "method": "judgment" } ], "bounds": { "max_elapsed_seconds": 1200 }, "follows": [ "video-showcase.record-narration" ] }, { "slug": "prepare-audio", "kind": "verb.compile_dag", "title": "Prepare the audio layers", "claimant": "agent", "summary": "Lay out music, sound effects and ambience on a cue sheet with licenses checked, and mix them into one music bed; the video and motion pack's render verb places the narration, ducks the bed under it and normalizes loudness.", "outcome": "An audio cue sheet and the music bed as a media noun, or no_change when the video needs only narration.", "ready_outcome": "audio_ready", "model_use": "none", "pinned": [ "asset-policy", "style-guide", "video-motion:tool.ffmpeg", "video-motion:rules.audio" ], "slots": [ { "name": "narration", "category": "noun.scene_recipe", "description": "Pin of the narration media noun." }, { "name": "audio_assets", "category": "noun.scene_recipe", "description": "Pins of music, sound-effect and ambience media nouns.", "many": true, "max": 40, "required": false }, { "name": "storyboard", "category": "noun.scene_recipe", "description": "Pin of the storyboard, for timing." } ], "produces": [ { "name": "audio_cue_sheet", "template": "template.audio-cue-sheet" }, { "name": "music_bed", "template": "video-motion:template.media" } ], "steps": [ "Verify every pin and every audio blob digest.", "Use only assets whose license the asset policy allows and the renderer accepts; leave any other asset out and list it in unknowns with the reason.", "Place cues on the storyboard's timing and mix music, effects and ambience into one bed with the pinned FFmpeg build; leave narration out of the bed.", "Record each cue's license and attribution on the cue sheet, and write the bed as a media noun in the video and motion pack's media format." ], "acceptance": [ { "id": "cue-sheet-matches-template", "check": "The cue sheet validates against template.audio-cue-sheet's schema.", "method": "deterministic" }, { "id": "bed-matches-template", "check": "The music bed validates against the video and motion pack's template.media schema.", "method": "deterministic" }, { "id": "licenses-allowed", "check": "Every cue's license is on the asset policy's allowed list and is one the renderer accepts.", "method": "deterministic" }, { "id": "bed-peak", "check": "The bed's true peak, measured with ebur128, is at or below -1 dBTP.", "method": "deterministic" }, { "id": "mix-balanced", "check": "Music and effects will sit clearly under the narration.", "method": "judgment" } ], "bounds": { "max_elapsed_seconds": 1800 }, "capabilities": [ "read permitted noun versions", "a qualified FFmpeg build", "store blobs in the assigned scope", "write candidate nouns" ], "follows": [ "video-showcase.record-narration" ] }, { "slug": "review-video", "kind": "verb.verify_gate", "title": "Review the cut", "claimant": "agent_or_human", "summary": "A person or a different worker watches the cut with its QA report and evidence links and decides whether it is ready for the owner.", "outcome": "Review notes with a decision; publishing remains the owner's separate act.", "ready_outcome": "review_ready", "pinned": [ "style-guide", "showcase-checks", "video-motion:checks.video" ], "slots": [ { "name": "encoded_output", "category": "noun.scene_recipe", "description": "Pin of the encoded output to review." }, { "name": "qa_report", "category": "noun.eval_run", "description": "Pin of its video QA report from video-motion.check-video." }, { "name": "sequence", "category": "noun.scene_recipe", "description": "Pin of the sequence that was rendered." }, { "name": "video_brief", "category": "noun.seed_hypothesis", "description": "Pin of the video brief, for the target length." }, { "name": "script", "category": "noun.scene_recipe", "description": "Pin of the script." }, { "name": "caption_track", "category": "noun.scene_recipe", "description": "Pin of the caption track." }, { "name": "evidence_links", "category": "noun.eval_run", "description": "Pins of the evidence links.", "many": true, "max": 30, "required": false } ], "produces": [ { "name": "review_notes", "template": "template.review-notes" } ], "steps": [ "Confirm you did not plan or render this cut; if you did, return blocked.", "Run every showcase check and record its measurement; not_run and not_applicable carry reasons.", "Watch the whole cut. Check each claim against its evidence link.", "Check rights and labels for every generated or third-party asset.", "Decide ready_for_owner_decision, revise or reject. Never publish." ], "acceptance": [ { "id": "notes-match-template", "check": "The review notes validate against template.review-notes's schema.", "method": "deterministic" }, { "id": "showcase-checks-present", "check": "Every check in showcase-checks appears once with its measurement.", "method": "deterministic" }, { "id": "claims-covered", "check": "Every claim id in the script has a review result.", "method": "deterministic" }, { "id": "qa-passed-or-explained", "check": "A ready decision requires a video QA report with passed true.", "method": "deterministic" }, { "id": "watchable", "check": "The video makes its point clearly for the brief's audience.", "method": "judgment" } ], "bounds": { "max_elapsed_seconds": 3600 }, "review": "distinct_reviewer", "follows": [ "video-motion.check-video" ] }, { "slug": "record-publication", "kind": "verb.verify_gate", "title": "Release and record it (person)", "claimant": "human", "summary": "The owner releases the approved cut on a platform of their choice, outside the fabric, or holds it, and records which file went where and when.", "outcome": "A publication record whose file digest matches the approved cut, or no_change when the owner holds the video.", "ready_outcome": "publication_recorded", "model_use": "none", "pinned": [ "asset-policy" ], "slots": [ { "name": "encoded_output", "category": "noun.scene_recipe", "description": "Pin of the approved encoded output." }, { "name": "review_notes", "category": "noun.eval_run", "description": "Pin of the review notes that marked it ready for the owner." } ], "produces": [ { "name": "publication_record", "template": "template.publication-record" } ], "steps": [ "Releasing the video is the owner's separate act on the platform of their choice; this verb records what happened.", "Check that the review notes say ready_for_owner_decision before releasing anything.", "Confirm the uploaded file has the same SHA-256 as the approved encoded output.", "Record the platform, address, date and visibility, and whether attributions and generated-media labels are in the description.", "If you hold the video instead, finish with no_change and say why." ], "acceptance": [ { "id": "record-matches-template", "check": "The record validates against template.publication-record's schema.", "method": "deterministic" }, { "id": "digest-matches", "check": "file_sha256 equals the approved encoded output's blob digest.", "method": "deterministic" }, { "id": "review-ready", "check": "The pinned review notes have decision ready_for_owner_decision.", "method": "deterministic" }, { "id": "recorded-by-owner", "check": "recorded_by is owner and the submitting key belongs to the owner.", "method": "deterministic" } ], "bounds": { "max_elapsed_seconds": 604800 }, "capabilities": [ "read permitted noun versions", "write candidate nouns" ], "follows": [ "video-showcase.review-video" ] } ] }