@maccesar/aiskills 1.21.1 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -83
- package/lib/commands/doctor.js +10 -5
- package/lib/config.js +4 -4
- package/lib/symlink.js +5 -4
- package/package.json +2 -1
- package/skills/release/SKILL.md +26 -0
- package/skills/release/agents/openai.yaml +6 -0
- package/{commands/release.md → skills/release/references/workflow.md} +46 -39
- package/skills/technical-demo-videos/SKILL.md +146 -0
- package/skills/technical-demo-videos/agents/openai.yaml +4 -0
- package/skills/technical-demo-videos/evals/evals.json +62 -0
- package/skills/technical-demo-videos/references/audio-timing.md +40 -0
- package/skills/technical-demo-videos/references/package-contract.md +33 -0
- package/skills/technical-demo-videos/references/publishing-metadata.md +36 -0
- package/skills/technical-demo-videos/references/recording-workflow.md +40 -0
- package/skills/technical-demo-videos/references/story-direction.md +37 -0
- package/skills/technical-demo-videos/references/vertical-social-video.md +24 -0
- package/skills/technical-demo-videos/references/vscode-default-profile.md +49 -0
- package/skills/technical-demo-videos/references/youtube-master.md +42 -0
- package/skills/technical-demo-videos/references/youtube-publishing.md +126 -0
- package/skills/technical-demo-videos/scripts/events_to_cues.py +89 -0
- package/skills/technical-demo-videos/scripts/normalize_youtube_master.py +210 -0
- package/skills/technical-demo-videos/scripts/recording_runtime.py +427 -0
- package/skills/technical-demo-videos/scripts/youtube_publish.py +517 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: technical-demo-videos
|
|
3
|
+
description: Plan and produce reproducible macOS screen-recorded technical demonstrations from a project path and a conversational goal. Use when the user wants a coding, CLI, build, simulator, emulator, or app workflow recorded in VS Code, including reviewable scripts, timed narration, captions, retakes, or final video assembly. Present the recording plan for approval before controlling the UI or starting a capture.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Technical Demo Videos
|
|
7
|
+
|
|
8
|
+
Turn a natural-language request into a reviewable production plan and, after approval, a reproducible recording package. Treat domain-specific projects such as Titanium, Flutter, native mobile, web, or a CLI as inputs; do not encode one repository, framework, command, or directory layout in this skill.
|
|
9
|
+
|
|
10
|
+
Act as the project's technical screenwriter, director, producer, screen operator, voice-script writer, and editor. Translate the user's informal explanation into a concise visual story that is technically accurate, pleasant to watch, and practical to reproduce. These roles are responsibilities, not permission to override the user's creative brief, change the product, publish media, spend money, or begin recording without approval.
|
|
11
|
+
|
|
12
|
+
## Required workflow
|
|
13
|
+
|
|
14
|
+
Read only the references needed for the current phase, but read each applicable reference before drafting advice or acting:
|
|
15
|
+
|
|
16
|
+
| Task | Required reference |
|
|
17
|
+
|---|---|
|
|
18
|
+
| Storyboard, narration intent, or take review | [references/story-direction.md](references/story-direction.md) |
|
|
19
|
+
| Production package or artifact cleanup | [references/package-contract.md](references/package-contract.md) |
|
|
20
|
+
| macOS or VS Code automation | [references/recording-workflow.md](references/recording-workflow.md) and [references/vscode-default-profile.md](references/vscode-default-profile.md) |
|
|
21
|
+
| Audio alignment or final duration | [references/audio-timing.md](references/audio-timing.md) |
|
|
22
|
+
| Upload-ready horizontal master | [references/youtube-master.md](references/youtube-master.md) |
|
|
23
|
+
| Vertical or social derivative | [references/vertical-social-video.md](references/vertical-social-video.md) |
|
|
24
|
+
| Publishing copy and settings | [references/publishing-metadata.md](references/publishing-metadata.md) |
|
|
25
|
+
| Automated YouTube publication | [references/youtube-publishing.md](references/youtube-publishing.md) |
|
|
26
|
+
|
|
27
|
+
In proposals, review notes, and handoff documents, cite each concrete production recommendation from this skill as `[source: references/<file>.md]`. Cite technical claims using the applicable domain skill or official primary documentation. If a claim cannot be verified from the inspected project or a consulted source, prefix it with `FROM_MEMORY (unverified):` instead of presenting it as fact.
|
|
28
|
+
|
|
29
|
+
## Establish the request
|
|
30
|
+
|
|
31
|
+
Resolve these facts from the user's message and the inspected project:
|
|
32
|
+
|
|
33
|
+
- source project path;
|
|
34
|
+
- demonstration goal and intended audience;
|
|
35
|
+
- exact command or UI operation;
|
|
36
|
+
- target platform, device, simulator, or emulator;
|
|
37
|
+
- files, terminal output, and runtime result that prove success;
|
|
38
|
+
- spoken language, caption language, and desired voice workflow;
|
|
39
|
+
- artifact destination and naming convention.
|
|
40
|
+
|
|
41
|
+
Preserve meaningful series conventions. When a project slug combines an order and the demonstrated command, such as `02-images`, keep that slug across the plan, recorder, recipe, takes, event logs, narration, captions, and final render. Do not invent a marketing title that breaks traceability unless the user requests one.
|
|
42
|
+
|
|
43
|
+
Infer safe details from the project and existing conventions. Ask only when a missing choice would materially change the demonstration. Use the applicable domain skill or official documentation to validate commands and expected results. Do not execute the showcased command during planning unless a harmless preflight is necessary and the user authorized implementation rather than review only.
|
|
44
|
+
|
|
45
|
+
## Route technical knowledge
|
|
46
|
+
|
|
47
|
+
This skill owns production and recording decisions; it is not the technical authority for every stack. Detect the project's languages, framework, build system, requested feature, and teaching angle before drafting the proposal. Assemble the smallest useful panel of installed skills, which may combine:
|
|
48
|
+
|
|
49
|
+
- **platform and framework expertise:** mobile and web frameworks, application platforms, databases, build systems, CLIs, or release tooling;
|
|
50
|
+
- **software judgment:** architecture, senior engineering, refactoring, security, performance, testing, maintainability, or framework-specific best practices;
|
|
51
|
+
- **presentation quality:** UI/UX, visual hierarchy, accessibility, responsive design, technical writing, diagrams, or documentation;
|
|
52
|
+
- **deliverable expertise:** voice, captions, image work, presentations, or publishing when the brief actually needs them.
|
|
53
|
+
|
|
54
|
+
This routing is a hard gate: do not draft the recording plan, visible sequence, narration intent, recipe, or recorder until every applicable domain skill has been loaded and its required task-specific references have been read. If a requested command, option, API, or behavior belongs to another installed skill, treat that skill and its cited sources as the technical authority. Verify the exact behavior in the inspected project or implementation when the documentation leaves any uncertainty. Never fill a technical gap with a plausible-looking command, option, output path, or product claim.
|
|
55
|
+
|
|
56
|
+
Use those skills to establish:
|
|
57
|
+
|
|
58
|
+
- the exact valid command and required working directory;
|
|
59
|
+
- prerequisites, configuration, credentials, devices, and expected duration;
|
|
60
|
+
- success and failure signals;
|
|
61
|
+
- files or runtime behavior that prove the claim;
|
|
62
|
+
- framework-specific actions that should or should not appear on screen.
|
|
63
|
+
|
|
64
|
+
Apply specialists only when their perspective materially affects this video. A command-only demo may need the framework skill and engineering judgment but no UI redesign. A UI walkthrough may need UI/UX and accessibility guidance in addition to the framework skill. An architecture explanation may need diagrams and software-architecture analysis without changing the application.
|
|
65
|
+
|
|
66
|
+
Then apply this skill to turn those verified facts into the visual sequence, narration intent, automation, and edit. If no suitable domain skill is installed, inspect the project and consult official primary documentation when current or uncertain facts matter. Never invent a command or expected result merely to complete a script.
|
|
67
|
+
|
|
68
|
+
Reconcile advice in this order: the user's explicit brief and scope, factual platform constraints, observable project behavior, safety and correctness, then stylistic recommendations. Clearly label an optional best practice as a recommendation; do not present it as a prerequisite. Mention the specialist skills used in the written proposal so the user can review the basis of the technical and creative decisions.
|
|
69
|
+
|
|
70
|
+
## Phase 1: propose before recording
|
|
71
|
+
|
|
72
|
+
Inspect the source project without changing it. Draft a production package and present the plan to the user before any UI automation or screen recording. The proposal must include:
|
|
73
|
+
|
|
74
|
+
1. the exact initial frame and preparation that will remain outside the video;
|
|
75
|
+
2. every visible action in order, including commands exactly as typed;
|
|
76
|
+
3. the proof shown after each meaningful action;
|
|
77
|
+
4. estimated visual timing and narration beats;
|
|
78
|
+
5. files that will be generated and files that will remain untouched;
|
|
79
|
+
6. cleanup behavior and any external cost, login, device, or permission dependency.
|
|
80
|
+
|
|
81
|
+
Shape the proposal as a short story: establish what exists before the command, show the action without wasted motion, prove the promised result, and finish on the strongest useful frame. Every spoken claim must have matching visual evidence. Remove dead time, redundant file browsing, terminal noise, and actions that do not advance the demonstration. Narration explains meaning while the image supplies evidence; it should not mechanically read filenames already visible.
|
|
82
|
+
|
|
83
|
+
Use a beat table with these columns unless the user requests another format: `Beat`, `Estimated time`, `On screen`, `Operator action`, `Narration intent`, and `Proof/exit condition`. Follow it with the proposed exact command text, initial-frame checklist, expected generated artifacts, and open questions or risks.
|
|
84
|
+
|
|
85
|
+
Write the draft `recording-plan.md` and recipe/recorder files when the user asked to create the production package, but mark them as draft. Then stop and request review. Approval of the concept is not approval to begin recording.
|
|
86
|
+
|
|
87
|
+
Read [references/story-direction.md](references/story-direction.md) when drafting or revising the proposal. Read [references/package-contract.md](references/package-contract.md) when creating the package. Read [references/recording-workflow.md](references/recording-workflow.md) before generating or running macOS/VS Code automation. Also read [references/vscode-default-profile.md](references/vscode-default-profile.md), load an approved workstation profile when one exists, and preserve its calibrated layout across takes. When none exists, calibrate once outside capture and save the resulting values with the production package.
|
|
88
|
+
|
|
89
|
+
## Phase 2: generate the reproducible package
|
|
90
|
+
|
|
91
|
+
After the plan is approved, generate one permanent recorder and its data under the episode's `production/` subfolder. Build the recorder from reusable primitives in `scripts/recording_runtime.py`, but copy that runtime into the production package so recreation does not depend on this installed skill or its future version. Reserve the episode root for the final upload-ready MP4, external SRT, and one publishing-metadata document.
|
|
92
|
+
|
|
93
|
+
The recorder must:
|
|
94
|
+
|
|
95
|
+
- accept or derive the source project path without embedding a random temporary path;
|
|
96
|
+
- create a fresh disposable copy for every take unless the workflow genuinely requires the original; select a short, dedicated copies directory from the recipe, `TECHNICAL_DEMO_COPIES_ROOT`, or the runtime default, append a random slug, and keep helpers in a separate system-temp directory so printed absolute paths remain readable;
|
|
97
|
+
- verify preconditions before opening applications;
|
|
98
|
+
- prepare the initial frame before capture begins;
|
|
99
|
+
- identify and assert the exact target window before every UI action block;
|
|
100
|
+
- record real event timestamps from the same clock as capture;
|
|
101
|
+
- refuse to overwrite existing recordings or user-provided audio;
|
|
102
|
+
- let validation-only checks inspect draft, approved, and finalized packages, while allowing a real capture only when the recipe is explicitly approved and its timing is ready;
|
|
103
|
+
- stop capture before closing the project window;
|
|
104
|
+
- close only the window it opened and remove all temporary copies and helpers in `finally` cleanup.
|
|
105
|
+
|
|
106
|
+
For VS Code captures, make the accepted workstation-profile preparation part of every generated recorder. Project-specific recipes begin after that common preparation and contain only the actions that tell the episode's story. Store display selection, logical geometry, shortcuts, terminal-divider coordinates, and panel behavior as profile data rather than scattering machine-specific values through the recorder.
|
|
107
|
+
|
|
108
|
+
Retakes modify the same permanent recorder or declarative recipe. Names such as `take-02` identify output media, never different throwaway automation scripts.
|
|
109
|
+
|
|
110
|
+
## Phase 3: announce and capture
|
|
111
|
+
|
|
112
|
+
Immediately before a real capture, send a commentary message beginning with `🎬` that says recording is about to start and asks the user not to move the mouse or keyboard. Allow a short visible lead time before starting. Never begin a capture in the same tool call that first announces it.
|
|
113
|
+
|
|
114
|
+
Do all setup outside the recording: open the isolated project window, arrange panels, open the terminal, choose the correct device or simulator state, and remove Welcome or unrelated tabs. Capture only the approved sequence. Do not introduce extra pauses merely to fit provisional narration.
|
|
115
|
+
|
|
116
|
+
When a simulator or emulator is needed only for a later proof beat, boot it, wait for readiness, warm the build, and terminate any previously running copy of the demonstrated app without activating the simulator window. Bring that app to the foreground only at the scheduled recorded action. This keeps preparation invisible and avoids leaving an old runtime state on screen.
|
|
117
|
+
|
|
118
|
+
After capture, perform only inexpensive structural checks: confirm that capture exited, the video and event log exist, and the disposable copy was removed. Then ask the user how the take looked before extracting frames, building contact sheets, transcribing, or performing detailed visual analysis. The user watched the live sequence and is the primary first reviewer.
|
|
119
|
+
|
|
120
|
+
Inspect frames only when the user requests it, reports a specific problem that needs diagnosis, or could not watch the take. Correct confirmed automation defects by editing the same recorder and creating a new take. Do not generate final narration for a rejected take.
|
|
121
|
+
|
|
122
|
+
## Phase 4: narration and delivery
|
|
123
|
+
|
|
124
|
+
Choose the timing authority explicitly. The default is capture-first: write narration after an accepted visual sequence, derive cue boundaries from its event log, then create narration text, cue JSON, and external SRT. When the user wants an externally generated voice track to determine the video duration, use audio-first instead: approve final narration before capture, preserve ordinary paragraph breaks, measure the returned audio, and only then lock and execute the visual recipe. Keep an audio-first recipe in draft until those measurements exist.
|
|
125
|
+
|
|
126
|
+
For voice-generator input, use fluent prose and normal paragraph breaks by default. Do not inject pause-control tags such as `[short pause]`, `[pause]`, `[long pause]`, or SSML `<break>` unless the user explicitly requests provider-specific pause markup. Do not burn subtitles into the image unless explicitly requested.
|
|
127
|
+
|
|
128
|
+
If the user generates voice audio in an external service, preserve the original file. Align speech blocks to cues without stretching the voice, and report a paragraph/block mismatch rather than guessing. Creating paid audio or using an external account requires the user's authorization.
|
|
129
|
+
|
|
130
|
+
Measure the first and last audible speech in the returned audio instead of relying only on the container duration. Unless the brief specifies otherwise, allow roughly 0.35 seconds before the first spoken word and 1.5 seconds after the last spoken word, with a normal acceptable post-roll range of 1–2 seconds. Count silence already present in the audio toward those margins, avoid doubling it, and never use `-shortest` when it would remove the clean final frame. Read [references/audio-timing.md](references/audio-timing.md) before timing or assembling narration.
|
|
131
|
+
|
|
132
|
+
Do not settle for placing the complete narration track under the capture when the spoken paragraphs and visible actions drift apart. After the take is accepted, compare every narration paragraph with its intended event and perform block-level editorial alignment whenever needed: preserve every spoken sample unchanged, trim only surplus silence at known paragraph boundaries, and place each paragraph against the action or proof it explains. Adjust visual holds or cuts when that produces the more natural result; never create one conspicuous pause to absorb a distributed timing mismatch. Record the source and final ranges in the cue sheet or recording plan so the edit is reproducible. If paragraph boundaries cannot be identified confidently, stop and report the mismatch instead of cutting through speech.
|
|
133
|
+
|
|
134
|
+
Verify the final video visually and audibly. Review the beginning, every paragraph transition, every command/result beat, and the ending rather than checking duration alone. Keep a clean final frame after the last spoken line. Preserve the complete reproducible package and remove only intermediates identified by the package contract.
|
|
135
|
+
|
|
136
|
+
Before naming any render `<slug>-final.mp4`, read [references/youtube-master.md](references/youtube-master.md), verify its time-sensitive defaults against current official YouTube upload guidance, and pass its delivery-master quality gate. A stream-copied mux is a review preview, not a final upload file. Validate resolution, constant frame rate, bitrate, H.264 profile, pixel format, BT.709 metadata, AAC sample rate, and fast-start layout; never infer quality from the `.mp4` extension or 4K dimensions alone.
|
|
137
|
+
|
|
138
|
+
Use `scripts/events_to_cues.py` to normalize a completed event log. The generated SRT must reflect final audio alignment rather than estimated plan timings.
|
|
139
|
+
|
|
140
|
+
When the user requests a vertical or social-media derivative, read [references/vertical-social-video.md](references/vertical-social-video.md). Keep it opt-in: do not reframe a horizontal master or burn dynamic captions merely because social delivery might be useful later.
|
|
141
|
+
|
|
142
|
+
When the user requests titles, descriptions, keywords, hashtags, upload settings, or a complete social publishing handoff, read [references/publishing-metadata.md](references/publishing-metadata.md). Browse current official platform documentation because these recommendations and limits change, then create one clearly grouped metadata document for each episode.
|
|
143
|
+
|
|
144
|
+
When the user requests automated YouTube upload, playlist placement, captions, scheduling, or metadata publication, read [references/youtube-publishing.md](references/youtube-publishing.md). Before generating the upload manifest or dry run, present a publishing-target table containing the expected channel ID/name, either an exact playlist ID/name or an explicit `none`, privacy/schedule, captions, and thumbnail. Do not infer “no playlist” from silence. If the user does not know the IDs, request authorization to run `scripts/youtube_publish.py --inspect-account` and present the authenticated channel and available playlists without uploading. Wait for the user to approve these choices.
|
|
145
|
+
|
|
146
|
+
Then generate the production manifest and run a dry run with `scripts/youtube_publish.py`. Present its exact target, operations, hashes, and confirmation token. A real API upload is a separate external mutation: wait for explicit authorization that refers to the reviewed dry run, then pass its token through `--confirm-plan`. The script must verify that OAuth exposes `expectedChannelId` before performing `videos.insert`. Default new uploads to private, never invent a playlist ID, and preserve an upload receipt so retries do not create duplicate videos.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Technical Demo Videos"
|
|
3
|
+
short_description: "Plan and produce reproducible technical screen demos"
|
|
4
|
+
default_prompt: "Use $technical-demo-videos to create a reviewable recording plan and reproducible production package for this technical demo. Do not record until I approve the plan."
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "technical-demo-videos",
|
|
3
|
+
"note": "Cross-domain planning evals written when a project-specific production workflow was generalized. These prompts are review fixtures, not claims of completed recordings or measured results.",
|
|
4
|
+
"evals": [
|
|
5
|
+
{
|
|
6
|
+
"id": 0,
|
|
7
|
+
"name": "node-cli-capture-plan",
|
|
8
|
+
"prompt": "Take /workspace/json-pretty-cli and make a short VS Code video showing npm test, then formatting fixtures/input.json with node bin/pretty.js. Show the output file and give me the recording plan before touching the UI.",
|
|
9
|
+
"fixture_spec": "A small Node.js CLI repository with package.json, bin/pretty.js, test/pretty.test.js and fixtures/input.json. It has no video conventions or workstation-specific paths.",
|
|
10
|
+
"expected_output": "Inspects the project and applicable Node documentation, proposes the exact initial frame, command sequence, visible proof, narration beats, disposable-copy location and cleanup, then waits for approval without recording.",
|
|
11
|
+
"assertions": [
|
|
12
|
+
"Does not start UI automation or recording before approval",
|
|
13
|
+
"Uses the exact project path and verified commands instead of framework assumptions",
|
|
14
|
+
"Shows both test success and the formatted output as separate proof beats",
|
|
15
|
+
"Keeps workstation geometry and disposable-copy root configurable",
|
|
16
|
+
"Names the production artifacts and cleanup behavior"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": 1,
|
|
21
|
+
"name": "web-app-runtime-proof",
|
|
22
|
+
"prompt": "Plan a tutorial from /workspace/inventory-web that starts its dev server, changes the stock filter in VS Code, and proves the result in the browser. I want English narration and selectable captions.",
|
|
23
|
+
"fixture_spec": "A Vite web application with a documented npm run dev command, a StockFilter component and local fixture data. The browser can be opened without authentication or network access.",
|
|
24
|
+
"expected_output": "Loads appropriate web/UI expertise, proposes a deterministic server-readiness check and browser proof, keeps setup outside capture, and separates narration source from SRT spelling.",
|
|
25
|
+
"assertions": [
|
|
26
|
+
"Routes technical claims through applicable domain skills or primary project documentation",
|
|
27
|
+
"Waits for observable server readiness instead of a long arbitrary sleep",
|
|
28
|
+
"Defines the browser state that proves the filter works",
|
|
29
|
+
"Keeps English voice text and selectable captions as separate artifacts",
|
|
30
|
+
"Does not publish or create paid voice audio without authorization"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": 2,
|
|
35
|
+
"name": "retake-audio-alignment",
|
|
36
|
+
"prompt": "The take is good, but paragraph three says the build completed before the terminal reaches Finished. Fix the same recorder, keep my original voice file, and make take 2.",
|
|
37
|
+
"fixture_spec": "An approved technical-video package with recording plan, permanent recorder, take-01 MOV, event log, paragraph-based narration, original external voice MP3 and cue sheet.",
|
|
38
|
+
"expected_output": "Edits the permanent recipe rather than creating a throwaway script, preserves the supplied audio, records take 2 after a clapperboard warning, asks for the live review, and performs block-level alignment only after acceptance.",
|
|
39
|
+
"assertions": [
|
|
40
|
+
"Modifies the permanent recorder or recipe instead of creating a take-specific automation script",
|
|
41
|
+
"Never overwrites take 1 or the supplied audio",
|
|
42
|
+
"Announces the real capture with a clapperboard in a separate update",
|
|
43
|
+
"Uses actual event timing for the Finished beat",
|
|
44
|
+
"Keeps a clean post-roll and does not use one unrelated long pause to absorb drift"
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": 3,
|
|
49
|
+
"name": "youtube-channel-playlist-targeting",
|
|
50
|
+
"prompt": "Upload the approved final video to my YouTube tutorials playlist. I have several channels and do not know the channel or playlist IDs yet.",
|
|
51
|
+
"fixture_spec": "An approved production package with final MP4, SRT, publishing metadata, OAuth client file, and token path. No channel or playlist ID has been selected.",
|
|
52
|
+
"expected_output": "Requests authorization for read-only account inspection, presents the authenticated channels and playlists, obtains an explicit channel/playlist/privacy/captions/thumbnail decision, runs a dry run, and waits for separate approval before executing with its confirmation token.",
|
|
53
|
+
"assertions": [
|
|
54
|
+
"Does not infer a channel or playlist from its visible name",
|
|
55
|
+
"Does not treat silence as approval to leave the video out of playlists",
|
|
56
|
+
"Inspects the OAuth account without uploading when IDs are unknown",
|
|
57
|
+
"Verifies expectedChannelId before videos.insert",
|
|
58
|
+
"Requires approval of the exact dry-run token before upload"
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Narration entrance, exit, and visual timing
|
|
2
|
+
|
|
3
|
+
Read this before aligning returned narration audio or deciding the final video duration.
|
|
4
|
+
|
|
5
|
+
## Measure audible speech
|
|
6
|
+
|
|
7
|
+
Inspect three different values:
|
|
8
|
+
|
|
9
|
+
1. the audio container duration;
|
|
10
|
+
2. the first audible spoken sample;
|
|
11
|
+
3. the last audible spoken sample.
|
|
12
|
+
|
|
13
|
+
Use silence detection as a measurement aid, then associate speech blocks with the known narration paragraphs. Do not assume every detected pause is a paragraph boundary; voices may pause naturally around punctuation or spelled product names.
|
|
14
|
+
|
|
15
|
+
## Default margins
|
|
16
|
+
|
|
17
|
+
- Aim for about `0.35 s` of visual lead-in before the first spoken word. A practical range is `0.25–0.50 s` for a short technical video.
|
|
18
|
+
- Aim for `1.5 s` of clean visual post-roll after the last spoken word. A range of `1–2 s` is normally appropriate.
|
|
19
|
+
- Count existing leading or trailing silence in the returned audio toward those margins. Do not add the same cushion twice.
|
|
20
|
+
- Base the final video duration on the last audible speech plus post-roll, not simply on the audio container duration.
|
|
21
|
+
|
|
22
|
+
Distribute additional visual time across the matching narration beats. Do not hide a duration mismatch by adding one unrelated pause before the command or by holding a source preview longer than its spoken explanation.
|
|
23
|
+
|
|
24
|
+
Preserve the original narration file. Do not time-stretch it unless the user explicitly requests that treatment. When muxing, do not use `-shortest` if it would cut the final visual margin.
|
|
25
|
+
|
|
26
|
+
## Align paragraphs as editable blocks
|
|
27
|
+
|
|
28
|
+
Treat the narration paragraphs and their matching event-log beats as the units of the final edit. A single unedited audio track is acceptable only when those blocks already align naturally.
|
|
29
|
+
|
|
30
|
+
When they do not:
|
|
31
|
+
|
|
32
|
+
1. map each approved paragraph to its audible source range and intended visual event;
|
|
33
|
+
2. preserve the original audio file and every spoken sample;
|
|
34
|
+
3. remove only unnecessary silence between confidently identified paragraph boundaries;
|
|
35
|
+
4. position each speech block so its explanation begins with, or slightly anticipates, the corresponding visible action;
|
|
36
|
+
5. extend or trim neutral visual holds where appropriate, distributing corrections across the relevant beats;
|
|
37
|
+
6. retain natural conversational pauses and the configured lead-in and post-roll;
|
|
38
|
+
7. write the source-audio range, final-video range, and matching visual cue into the cue sheet or recording plan.
|
|
39
|
+
|
|
40
|
+
Never cut based only on generic silence detection. Confirm boundaries against the approved paragraph text, and do not split a spoken sentence or word. If the returned voice merges paragraphs or inserts ambiguous pauses, report the mismatch instead of guessing.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Production package contract
|
|
2
|
+
|
|
3
|
+
Prefer an existing project convention. Otherwise propose `demo-videos/<slug>/` beneath the project root, or an external destination when the source repository should remain untouched. Treat the episode root as the upload handoff: it contains only `<slug>-final.mp4`, `<slug>-subtitles-<language>.srt`, `<slug>-publishing-metadata.md`, and the `production/` subfolder.
|
|
4
|
+
|
|
5
|
+
## Draft and source files
|
|
6
|
+
|
|
7
|
+
- `production/recording-plan.md`: human-readable approved story, initial frame, visible actions, proof, timing intent, narration beats, risks, and cleanup.
|
|
8
|
+
- `production/<slug>-recording.json`: machine-readable values and ordered actions when the recorder is data-driven.
|
|
9
|
+
- `production/record-<slug>.py`: permanent entry point for rehearsals, retakes, and recreation.
|
|
10
|
+
- `production/recording_runtime.py`: copied reusable automation primitives, pinned with the package.
|
|
11
|
+
|
|
12
|
+
The recorder and recipe are source artifacts. A take number never appears in their filenames. Choose the next take number after the highest take already present in `production/`; do not reuse gaps left by rejected or archived takes.
|
|
13
|
+
|
|
14
|
+
## Capture and delivery files
|
|
15
|
+
|
|
16
|
+
- `production/<slug>-take-01.mov`: raw capture; increment for a retake and never overwrite.
|
|
17
|
+
- `production/<slug>-take-01-events.json`: actual monotonic timestamps for the matching capture.
|
|
18
|
+
- `production/<slug>-cues.json`: normalized visual and narration intervals for the accepted take.
|
|
19
|
+
- `production/<slug>-narration-<language>.txt`: text sent to the voice generator.
|
|
20
|
+
- `production/` keeps the original returned audio, with its provider filename preserved when useful.
|
|
21
|
+
- `<slug>-subtitles-<language>.srt`: selectable upload-ready captions in the episode root.
|
|
22
|
+
- `<slug>-final.mp4`: synchronized delivery master that passed the YouTube master quality gate; a stream-copied review preview does not qualify.
|
|
23
|
+
- `<slug>-publishing-metadata.md`: copy-ready YouTube, TikTok and Instagram metadata plus upload settings in the episode root.
|
|
24
|
+
|
|
25
|
+
Use names appropriate to the project when it already has a convention. The essential rule is that each media file can be traced to the recorder version, recipe, and event log that produced it.
|
|
26
|
+
|
|
27
|
+
## Temporary material
|
|
28
|
+
|
|
29
|
+
Disposable project copies, compiled click helpers, diagnostic screenshots, extracted frames, split audio blocks, proxy files, and rejected render intermediates are temporary. Create them in a uniquely named temporary directory and remove that exact directory after verification or failure.
|
|
30
|
+
|
|
31
|
+
Remove caches and Finder metadata such as `__pycache__/` and `.DS_Store` from the episode root before handoff. They are neither publication files nor production sources.
|
|
32
|
+
|
|
33
|
+
Never delete source projects, accepted takes, user-provided audio, or an existing artifact merely to reuse its filename.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Publishing metadata handoff
|
|
2
|
+
|
|
3
|
+
Read this after a final technical-demo video and external caption file exist, or when the user asks for social-platform metadata.
|
|
4
|
+
|
|
5
|
+
## Deliverable
|
|
6
|
+
|
|
7
|
+
Create one upload-ready `<slug>-publishing-metadata.md` in the episode root. The root then contains exactly three regular files:
|
|
8
|
+
|
|
9
|
+
- `<slug>-final.mp4`
|
|
10
|
+
- `<slug>-subtitles-<language>.srt`
|
|
11
|
+
- `<slug>-publishing-metadata.md`
|
|
12
|
+
|
|
13
|
+
Keep research notes and intermediate metadata drafts in `production/`, not in the episode root.
|
|
14
|
+
|
|
15
|
+
## Required document sections
|
|
16
|
+
|
|
17
|
+
1. **Shared identity:** final filenames, content/original-language setting, primary search phrase, supporting phrases, one-sentence summary, canonical project link, and cover/thumbnail text.
|
|
18
|
+
2. **YouTube:** copy-ready title, description, hashtags, Studio tags, thumbnail copy, pinned comment, playlist/category/language/audience/caption settings, and whether chapters are useful.
|
|
19
|
+
3. **TikTok:** copy-ready organic caption, focused hashtags, cover text, searchable phrases, accessibility setting, and a format warning when the supplied master is not 9:16.
|
|
20
|
+
4. **Instagram Reels:** copy-ready caption, focused hashtags, cover text, searchable phrases, accessibility setting, and the same format warning when relevant.
|
|
21
|
+
5. **Publishing checklist:** verify spelling, links, caption timing, public visibility, cover crop, safe zones, and platform preview before posting.
|
|
22
|
+
|
|
23
|
+
## Writing rules
|
|
24
|
+
|
|
25
|
+
- Match the video's language unless the user requests localized variants.
|
|
26
|
+
- Preserve the project's subtitle typography convention independently from pronunciation text. Define a small lexicon in the production plan when product names, acronyms, commands, paths, or URLs need different written and spoken forms. Captions retain canonical spelling; voice-generator input uses only the pronunciation form approved for that provider.
|
|
27
|
+
- Put the primary phrase naturally in the first title/description lines. Do not stuff keywords or paste ordinary tags into prose.
|
|
28
|
+
- Keep hashtags directly relevant. For YouTube, use a small focused set; more than 60 hashtags are ignored. Studio tags mainly help with misspellings, so include product spelling variants there rather than bloating the description.
|
|
29
|
+
- Treat platform-specific copy as separate even when the central message is shared. TikTok and Instagram organic posts use a caption rather than YouTube's separate title and long description.
|
|
30
|
+
- Do not invent social handles, sponsorships, partnerships, locations, playlist IDs, or trending hashtags. Recommend checking current trends immediately before publishing.
|
|
31
|
+
- Do not automatically crop or reframe a horizontal master. State that TikTok and Reels favor vertical 9:16 creative and offer a separate derivative when requested.
|
|
32
|
+
- For short videos whose useful sections cannot meet YouTube chapter requirements, explicitly omit chapters rather than creating misleading timestamps.
|
|
33
|
+
|
|
34
|
+
## Freshness and sources
|
|
35
|
+
|
|
36
|
+
Platform behavior and limits are unstable. Browse current official platform documentation whenever generating or materially revising the metadata file. Prefer YouTube Help, TikTok Business/Creative Center, and Meta/Instagram Help or Meta for Business. Link the exact official pages used in a short Sources section inside the metadata document.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# macOS and VS Code recording workflow
|
|
2
|
+
|
|
3
|
+
Use this reference only when the accepted plan will control VS Code or other Mac applications.
|
|
4
|
+
|
|
5
|
+
## Preparation
|
|
6
|
+
|
|
7
|
+
Keep preparation out of the capture unless it is part of the story. Open a uniquely identifiable project window, stabilize its size and position, arrange Explorer/editor/terminal panels, close unrelated tabs, and prepare simulators or devices before starting `screencapture`.
|
|
8
|
+
|
|
9
|
+
Use [vscode-default-profile.md](vscode-default-profile.md) to define a baseline for the current workstation. Reuse an approved profile across projects instead of experimenting with panel commands or coordinates in each episode. Recalibrate only after a display, VS Code layout, keybinding, or global editor-association change.
|
|
10
|
+
|
|
11
|
+
On VS Code, use full project-relative paths with Quick Open. Keep terminal commands readable and execute them from the project root without exposing temporary absolute paths. Prefer stable commands and accessibility selectors. When coordinates are unavoidable, store them as configurable logical-display values and validate display/window geometry first.
|
|
12
|
+
|
|
13
|
+
Choose a dedicated, short copies directory before generating the recorder. Record that choice in the recipe or set `TECHNICAL_DEMO_COPIES_ROOT`; the reusable runtime otherwise uses `~/TechnicalDemos`. Place each disposable project directly beneath it with a short runtime slug such as `build-assets.a1b2c3`. Keep helpers and diagnostic screenshots in a separate system-temp directory. This makes printed absolute paths legible, keeps the Desktop clean, and lets `finally` remove only the current run's resources.
|
|
14
|
+
|
|
15
|
+
A fresh disposable folder prevents stale project tabs and generated files, but it does not guarantee a fresh panel height: VS Code can inherit non-maximized panel geometry across windows. Detect and verify the actual divider position as described in [vscode-default-profile.md](vscode-default-profile.md); do not treat a hard-coded starting `y` coordinate as part of the profile.
|
|
16
|
+
|
|
17
|
+
## Safe targeting
|
|
18
|
+
|
|
19
|
+
Before every AppleScript or UI action block:
|
|
20
|
+
|
|
21
|
+
1. find the window by the current run's unique slug;
|
|
22
|
+
2. raise that exact window;
|
|
23
|
+
3. make its owning process frontmost;
|
|
24
|
+
4. re-read the front window title;
|
|
25
|
+
5. abort unless it still contains the slug;
|
|
26
|
+
6. only then send the intended action.
|
|
27
|
+
|
|
28
|
+
Never assume activating an application preserves the correct window. Never paste a generated temporary slug into permanent source; create it at runtime.
|
|
29
|
+
|
|
30
|
+
## Capture and events
|
|
31
|
+
|
|
32
|
+
Use macOS `screencapture` for actual video, not a sequence of screenshots. Record `recording_started`, each visual transition, command submission/completion, relevant output, and `recording_stopped` with monotonic timestamps. Wait for observable completion such as a process exit, file creation, simulator state, or expected UI rather than an arbitrary long sleep.
|
|
33
|
+
|
|
34
|
+
Stop capture cleanly before closing the demonstration window. Close the full project window afterward so the user can see that interaction is finished. Cleanup must target only resources created by the current run.
|
|
35
|
+
|
|
36
|
+
Afterward, verify only that the expected media/log files exist and the temporary project is gone. Ask the user how the live take looked before spending time or tokens on screenshots, contact sheets, frame-by-frame review, transcription, or narration. Use deeper inspection only to investigate feedback or when the user asks for it.
|
|
37
|
+
|
|
38
|
+
## User coordination
|
|
39
|
+
|
|
40
|
+
Before capture, announce with `🎬` in a separate commentary update and ask the user not to touch input devices. Do not surface permission dialogs during the recording; preflight permissions before the announcement. If a permission or login prompt appears unexpectedly, reject the take, stop safely, and explain what must be prepared.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Story and direction criteria
|
|
2
|
+
|
|
3
|
+
Read this when turning a conversational brief into the written proposal or revising a take.
|
|
4
|
+
|
|
5
|
+
## Build the visual argument
|
|
6
|
+
|
|
7
|
+
A technical demonstration normally has four movements:
|
|
8
|
+
|
|
9
|
+
1. **Context:** show the smallest amount of source material needed to understand the task.
|
|
10
|
+
2. **Action:** type and execute the exact approved command or UI operation at a readable pace.
|
|
11
|
+
3. **Proof:** show terminal completion and representative output that substantiates every promise.
|
|
12
|
+
4. **Finish:** hold the clearest result long enough for comprehension and a clean edit.
|
|
13
|
+
|
|
14
|
+
This is a decision framework, not a forced duration or marketing formula. Omit any movement the user's goal does not need.
|
|
15
|
+
|
|
16
|
+
## Direct the screen
|
|
17
|
+
|
|
18
|
+
- Start from a deliberately composed frame, not application-launch clutter.
|
|
19
|
+
- Keep the pointer parked when it is not communicating something.
|
|
20
|
+
- Make text, previews, terminal height, and simulator/device content legible at delivery resolution.
|
|
21
|
+
- Prefer one decisive action over exploratory menu movement.
|
|
22
|
+
- Show representative results rather than every file when repetition adds no proof. Show every platform or output family that narration explicitly claims.
|
|
23
|
+
- Use an observable exit condition for builds and long-running commands. Avoid dramatic pauses or arbitrary sleeps.
|
|
24
|
+
|
|
25
|
+
## Write for voice
|
|
26
|
+
|
|
27
|
+
- Give the viewer information they cannot get merely by reading the screen.
|
|
28
|
+
- Keep each line short enough for its measured visual interval.
|
|
29
|
+
- Pronounce command names and symbols naturally for the selected voice service.
|
|
30
|
+
- Preserve the user's approved spelling and pronunciation lexicon across every episode. Do not split an acronym into space-separated letters unless the user explicitly approved that rendering for the selected voice.
|
|
31
|
+
- Do not synchronize final narration against estimated timing. In capture-first mode, exact wording follows the accepted capture and event log. In audio-first mode, approve the exact wording first, measure the returned audio, and use those measurements to lock the visual timing before capture.
|
|
32
|
+
- Use normal punctuation and paragraph breaks for a conversational voice. Do not add synthetic pause tags unless the user explicitly asks for them.
|
|
33
|
+
- Leave captions selectable unless the user asks for burned-in text.
|
|
34
|
+
|
|
35
|
+
## Edit and review
|
|
36
|
+
|
|
37
|
+
Reject a take when focus lands in the wrong control, text enters a source file, the command is obscured, proof is missing, a permission dialog appears, or dead time materially harms pacing. Correct the permanent recorder and create a new numbered take. Do not conceal a broken workflow with edits that misrepresent what happened.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Vertical and social-media derivatives
|
|
2
|
+
|
|
3
|
+
Read this only when the user asks for a TikTok, YouTube Shorts, Instagram Reels, or other vertical/social deliverable.
|
|
4
|
+
|
|
5
|
+
## Preserve a clean master
|
|
6
|
+
|
|
7
|
+
Keep the approved horizontal capture and clean audio as source masters. Produce vertical framing, split-screen layouts, dynamic captions, and platform-specific safe areas as separate derivatives so one social format never damages the reusable master.
|
|
8
|
+
|
|
9
|
+
## Choose the composition deliberately
|
|
10
|
+
|
|
11
|
+
Prefer these approaches in order:
|
|
12
|
+
|
|
13
|
+
1. record a native `9:16` composition when the workflow can be staged legibly in that space;
|
|
14
|
+
2. build a deterministic split-screen composition for programming demos, such as code/terminal on one half and simulator, game, animation, narrator, or result on the other;
|
|
15
|
+
3. reframe a horizontal master with explicit timed points of interest;
|
|
16
|
+
4. use automatic subject tracking only when the visual target genuinely moves unpredictably.
|
|
17
|
+
|
|
18
|
+
AI is useful but not inherently required. Deterministic crops can follow recorder events, cursor coordinates, editor focus, simulator bounds, or authored keyframes. AI becomes useful for face/object tracking, automatic highlight selection, transcription, word-level caption timing, speaker detection, and semantic layout decisions.
|
|
19
|
+
|
|
20
|
+
## Captions and safe areas
|
|
21
|
+
|
|
22
|
+
Dynamic word- or phrase-level captions are often burned into social derivatives because viewers may watch muted and platforms overlay their own controls. They must remain optional deliverables: keep the clean master and external SRT, then create a separately named captioned vertical version only when requested.
|
|
23
|
+
|
|
24
|
+
Use the target platform's current resolution, duration, and safe-area rules at production time; verify those rules from official platform documentation because they can change.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# VS Code recording profile
|
|
2
|
+
|
|
3
|
+
Use this reference to calibrate a workstation once, save the accepted values with the production package, and reuse them across projects and retakes. The numbers below are an example profile for a 4K display, not universal defaults.
|
|
4
|
+
|
|
5
|
+
## Values the profile owns
|
|
6
|
+
|
|
7
|
+
- capture display number and physical resolution;
|
|
8
|
+
- logical display size and minimum VS Code window size;
|
|
9
|
+
- whether an auxiliary panel must be hidden and the shortcut that does it;
|
|
10
|
+
- whether Explorer remains visible and on which side;
|
|
11
|
+
- whether Welcome is disabled before recording;
|
|
12
|
+
- terminal divider detection range, drag coordinate, target height, and tolerance;
|
|
13
|
+
- terminal focus shortcut after an editor takes focus;
|
|
14
|
+
- file-preview associations needed by the demonstration.
|
|
15
|
+
|
|
16
|
+
Keep these values in the declarative recipe or pass an equivalent profile to `prepare_default_vscode()`. Do not spread coordinates and shortcuts across project-specific action code.
|
|
17
|
+
|
|
18
|
+
## Example 4K profile
|
|
19
|
+
|
|
20
|
+
- Physical capture: 3840 × 2160.
|
|
21
|
+
- Logical display: 1920 × 1080.
|
|
22
|
+
- VS Code minimum: 1850 × 1000 logical points.
|
|
23
|
+
- Terminal divider drag: logical `x=645` to `y=720`, verified within 8 points.
|
|
24
|
+
- Terminal open delay: about 1.5 seconds before divider detection.
|
|
25
|
+
- Main Explorer remains visible; unrelated auxiliary panels and Welcome are removed before capture.
|
|
26
|
+
|
|
27
|
+
Recalibrate those values for a different display, scaling mode, VS Code layout, keybinding, or panel placement.
|
|
28
|
+
|
|
29
|
+
## Integrated terminal preparation
|
|
30
|
+
|
|
31
|
+
1. Open a uniquely identifiable disposable project in a new VS Code window.
|
|
32
|
+
2. Apply the profile's panel state and close unrelated tabs before capture.
|
|
33
|
+
3. Use `Terminal` → `New Terminal` after targeting that exact window.
|
|
34
|
+
4. Wait for the panel to finish opening.
|
|
35
|
+
5. Capture a temporary screenshot and detect the real horizontal divider across several columns. A fresh folder does not guarantee a fresh panel height.
|
|
36
|
+
6. Drag the detected separator to the profile's target height.
|
|
37
|
+
7. Capture the layout again and verify the divider is within the configured tolerance. Abort before recording if detection fails; never guess the starting coordinate.
|
|
38
|
+
8. Store diagnostics under the run's temporary helper directory so cleanup removes them.
|
|
39
|
+
9. Leave the terminal open when preparation finishes.
|
|
40
|
+
|
|
41
|
+
Do not resize with repeated Command Palette steps: they are slower, visible, and dependent on unknown starting height. Do not send the terminal-focus shortcut immediately after creating the terminal because a toggle-style binding may close it. Use it later, after an editor or preview has taken focus and immediately before typing the command.
|
|
42
|
+
|
|
43
|
+
## Preview behavior
|
|
44
|
+
|
|
45
|
+
If a source format needs a visual preview, configure and preflight the VS Code association before capture. Open the file directly into that preview during the take. Do not expose the editor-selection menu or change a user setting inside the demonstrated project merely for recording.
|
|
46
|
+
|
|
47
|
+
## Recording boundary
|
|
48
|
+
|
|
49
|
+
All profile preparation happens before capture. The first recorded action belongs to the approved story. Save a newly accepted profile instead of rediscovering the same coordinates during every episode.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# YouTube master quality gate
|
|
2
|
+
|
|
3
|
+
Read this before promoting an approved edit to `<slug>-final.mp4` or creating
|
|
4
|
+
its YouTube upload manifest.
|
|
5
|
+
|
|
6
|
+
An MP4 can report 3840×2160 and still be a poor delivery master. Do not treat
|
|
7
|
+
resolution or successful muxing as sufficient. A stream-copied synchronization
|
|
8
|
+
preview remains a preview.
|
|
9
|
+
|
|
10
|
+
For horizontal 4K screen demonstrations using an approved capture profile, create
|
|
11
|
+
the final upload master with:
|
|
12
|
+
|
|
13
|
+
- MP4, H.264 High Profile, progressive, yuv420p;
|
|
14
|
+
- 3840×2160 with no baked-in letterboxing;
|
|
15
|
+
- constant 30 FPS unless the approved content genuinely needs its native 60 FPS;
|
|
16
|
+
- BT.709 primaries, transfer, and matrix metadata;
|
|
17
|
+
- AAC stereo audio at 48 kHz and 384 kbps;
|
|
18
|
+
- the moov atom at the front (`faststart`);
|
|
19
|
+
- a deliberate variable bitrate. The bundled helper uses the lower edge of
|
|
20
|
+
YouTube's current SDR upload ranges: 35 Mbps for 4K at 24–30 FPS and 53 Mbps
|
|
21
|
+
for 4K at 48–60 FPS. It also selects the documented standard/high-frame-rate
|
|
22
|
+
defaults for 1440p, 1080p, and 720p.
|
|
23
|
+
|
|
24
|
+
These bitrate and codec recommendations can change. Before creating a delivery
|
|
25
|
+
master, verify them against YouTube's current official
|
|
26
|
+
[recommended upload encoding settings](https://support.google.com/youtube/answer/1722171).
|
|
27
|
+
If the published range changed, pass its lower bound with `--video-bitrate` and
|
|
28
|
+
record the source and chosen value in the production plan.
|
|
29
|
+
|
|
30
|
+
Run:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
python3 scripts/normalize_youtube_master.py APPROVED_EDIT.mp4 FINAL.mp4
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The tool refuses to overwrite the output and verifies resolution, CFR, codec,
|
|
37
|
+
profile, pixel format, BT.709, audio, container, and bitrate before completing.
|
|
38
|
+
Do not create an upload manifest when this gate fails.
|
|
39
|
+
|
|
40
|
+
After upload, keep the video private until the intended high-resolution
|
|
41
|
+
representations are actually available. YouTube chooses the playback codecs;
|
|
42
|
+
the upload API cannot request AVC, VP9, or AV1 and offers no reprocess action.
|