video-editing 1.3.1 → 2.0.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 +49 -58
- package/dist/chunk-SSXAUKGV.js +2549 -0
- package/dist/cli.js +498 -1443
- package/dist/index.d.ts +1062 -921
- package/dist/index.js +297 -260
- package/package.json +2 -19
- package/skills/video-editing/SKILL.md +139 -232
- package/skills/video-editing/references/adversarial-review.md +3 -43
- package/skills/video-editing/references/cli-reference.md +124 -159
- package/skills/video-editing/references/editing-brief.md +3 -43
- package/skills/video-editing/references/hard-rules.md +3 -37
- package/skills/video-editing/references/scribe-collapse.md +3 -36
- package/skills/video-editing/references/timeline-v2-vocabulary.md +2 -2
- package/dist/assets/DejaVuSansMono.ttf +0 -0
- package/dist/chunk-63HIQBDT.js +0 -4321
- package/dist/chunk-CU3NBKB4.js +0 -307
- package/dist/job-OFCSLPBV.js +0 -25
- package/dist/templates/author-edl.prompt.md +0 -33
- package/dist/templates/fix.prompt.md +0 -23
- package/dist/templates/review.prompt.md +0 -30
|
@@ -1,254 +1,161 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: video-editing
|
|
3
3
|
description: >-
|
|
4
|
-
|
|
5
|
-
`video-editing` CLI
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
flubbed some lines, fix it", "get rid of the dead air", "make a clean cut of
|
|
17
|
-
this", or just a video path with "make this cleaner". Handles Hebrew/RTL.
|
|
18
|
-
This is the single source of truth for reel edits; it supersedes and replaces
|
|
19
|
-
the clean-cut and video-use skills.
|
|
4
|
+
Cloud-first agent workflow for editing a talking-head video into a tight,
|
|
5
|
+
clean cut with the `video-editing` CLI + the ClipReady cloud. Requires a
|
|
6
|
+
ClipReady API key (`CLIPREADY_API_KEY`) — every command talks to the cloud.
|
|
7
|
+
Transcription and editorial screening run server-side (no ElevenLabs key
|
|
8
|
+
needed); the editorial brief arrives from the server as pulled
|
|
9
|
+
`prompts/*.md`; the timeline compiles in the cloud; rendering and QA
|
|
10
|
+
visuals run locally on your machine (ffmpeg + hyperframes). Use whenever
|
|
11
|
+
the user drops a talking-head clip / reel / vlog / interview and wants it
|
|
12
|
+
edited or tightened — "edit this reel", "cut the bad retakes", "clean up
|
|
13
|
+
this recording", "tighten this", "add captions", or just a video path with
|
|
14
|
+
an editing ask — or when working a ClipReady review round. Handles
|
|
15
|
+
Hebrew/RTL.
|
|
20
16
|
---
|
|
21
17
|
|
|
22
|
-
# Video Editing (
|
|
18
|
+
# Video Editing (ClipReady cloud + local render)
|
|
23
19
|
|
|
24
|
-
Turn a raw talking-head recording into a tight, clean
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
Turn a raw talking-head recording into a tight, clean cut. The **`video-editing`**
|
|
21
|
+
CLI is a thin client for the ClipReady cloud: the cloud owns transcription,
|
|
22
|
+
screening, editorial prompts, timeline compilation, and verification; your
|
|
23
|
+
machine owns rendering and QA visuals. **You** read the pulled transcript +
|
|
24
|
+
brief and author `timeline.json`; the CLI does everything executable.
|
|
28
25
|
|
|
29
|
-
## Install
|
|
30
|
-
|
|
31
|
-
Requirements: **Node ≥ 20**, **ffmpeg**/**ffprobe** on PATH, and an **ElevenLabs API key**
|
|
32
|
-
(`ELEVENLABS_API_KEY`) for transcription.
|
|
26
|
+
## Install & auth
|
|
33
27
|
|
|
34
28
|
```bash
|
|
35
|
-
npm install -g video-editing # the CLI
|
|
29
|
+
npm install -g video-editing # the CLI (v2)
|
|
36
30
|
npx skills add ItayElgazar/clipready --skill video-editing # this skill
|
|
37
31
|
```
|
|
38
32
|
|
|
33
|
+
Requirements:
|
|
34
|
+
|
|
35
|
+
- **Node ≥ 20**
|
|
36
|
+
- **ffmpeg**/**ffprobe** on PATH (local render + QA visuals)
|
|
37
|
+
- **`CLIPREADY_API_KEY`** — from the ClipReady settings page
|
|
38
|
+
- **`CLIPREADY_API_BASE`** — the ClipReady API base URL
|
|
39
|
+
|
|
40
|
+
**No ElevenLabs key.** Transcription runs in the ClipReady cloud with
|
|
41
|
+
ClipReady's own transcription — do not set or ask for `ELEVENLABS_API_KEY`.
|
|
42
|
+
|
|
43
|
+
**Every command fails without the API key.** If a verb errors with a
|
|
44
|
+
missing-key message, stop and ask the user for their ClipReady API key;
|
|
45
|
+
never work around it.
|
|
46
|
+
|
|
39
47
|
## HARD RULE — execution boundary (read first)
|
|
40
48
|
|
|
41
49
|
- Use **only** the `video-editing` CLI (`video-editing <subcommand>`). Run
|
|
42
50
|
`video-editing --help` to see commands.
|
|
43
51
|
- **NEVER** run ffmpeg/ffprobe/transcription by hand — the CLI owns all execution.
|
|
44
52
|
- If a capability seems missing, STOP and report it as a CLI gap. Do not reach around the CLI.
|
|
45
|
-
- Your only hand-authored artifact is `<job>/
|
|
46
|
-
|
|
47
|
-
##
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
with `
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
`render
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
8. **
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
"ranges": [
|
|
126
|
-
{"source": "SRC", "start": 11.35, "end": 14.12, "beat": "HOOK", "quote": "…", "reason": "cleanest take; stops before the slip at 38.46"}
|
|
127
|
-
],
|
|
128
|
-
"overlays": [],
|
|
129
|
-
"total_duration_s": 51.33
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
Ranges are KEEP segments in source seconds; the gaps between them are the cuts. A retake range
|
|
134
|
-
must END at the **last clean word before the abandoned attempt**. `total_duration_s` = Σ(end−start).
|
|
135
|
-
|
|
136
|
-
## Timeline v2 (preferred when present)
|
|
137
|
-
|
|
138
|
-
When the CLI exposes a `timeline compile` verb (run `video-editing timeline --help`),
|
|
139
|
-
**author `<job>/timeline.json` instead of hand-writing `edl.json`.** timeline.json is the
|
|
140
|
-
single authored artifact: cuts (keep-ranges) plus optional **captions, zooms, overlays, and
|
|
141
|
-
audio blocks**. The compiler is compiler-grade — it validates, resolves phrase anchors to exact
|
|
142
|
-
source seconds, and emits `resolved/plan.json`, `resolved/diagnostics.json`, and a legacy
|
|
143
|
-
`edl.json`.
|
|
144
|
-
|
|
145
|
-
**Prerequisite — bake the vertical master first.** `timeline compile` probes
|
|
146
|
-
`<job>/vertical_src.mp4`, and `transcribe` alone does NOT create it: after transcribing, run
|
|
147
|
-
`video-editing cut-bad-retakes --job-dir "<job>" --render none` once (it bakes the vertical
|
|
148
|
-
master AND writes the screening artifacts the SCREEN gate needs anyway). Skipping this makes
|
|
149
|
-
`timeline compile` fail with a raw ffprobe "No such file or directory" — that error means run
|
|
150
|
-
the bake, not that your timeline is wrong.
|
|
151
|
-
|
|
152
|
-
Loop until clean:
|
|
153
|
-
|
|
154
|
-
1. Author/patch `<job>/timeline.json`.
|
|
155
|
-
2. `video-editing timeline compile --job-dir "<job>" --json` — read the diagnostics and iterate
|
|
156
|
-
until it exits **0**:
|
|
157
|
-
- **exit 2 = validation failed** (schema / semantic / capability) — fix the reported `path`s.
|
|
158
|
-
- **exit 3 = ambiguous anchor** — disambiguate with
|
|
159
|
-
`video-editing timeline resolve --phrase "…" --near <t>` (or `--occurrence <n>`), then bake the
|
|
160
|
-
resolved seconds / occurrence into the anchor and re-compile.
|
|
161
|
-
3. **Never hand-edit anything under `resolved/`** — it is generated; re-compile instead.
|
|
162
|
-
4. compile emits the legacy `edl.json`, so the **render → desilence → verify → final** steps are
|
|
163
|
-
**unchanged** — run them exactly as in the workflow above.
|
|
164
|
-
|
|
165
|
-
**Phrase → seconds ONLY via `timeline resolve`.** Never eyeball `word_dump.txt` for anchor
|
|
166
|
-
times — `resolve` returns word-accurate `start`/`end` and flags ambiguity so you disambiguate
|
|
167
|
-
deliberately (`--near <srcSeconds>` or `--occurrence <n>`).
|
|
168
|
-
|
|
169
|
-
Captions: enable with `video-editing timeline captions generate --job-dir "<job>" [--preset grouped]`
|
|
170
|
-
— cues are **derived at compile**, you don't hand-write cue timings. The default preset `grouped`
|
|
171
|
-
puts up to 4 words in each cue, starting a new cue on long word gaps (>0.6s), cut joins (a cue
|
|
172
|
-
never spans a join), and sentence-ending `.` `?` `!` (same characters in Hebrew); `opus-karaoke`
|
|
173
|
-
is the word-by-word opt-in. Timing/grouping knobs live in `captions.style` in timeline.json:
|
|
174
|
-
`maxWords` (default 4), `leadS` (default 0.08 — each cue appears that many seconds early, clamped
|
|
175
|
-
to the previous cue / segment start), `holdS` (default 0.9 — each cue holds on screen up to that
|
|
176
|
-
long past its last word to bridge the gap to the next cue, killing blink). **Word styling**: an
|
|
177
|
-
`op:"style"` caption override colors and/or emphasizes the anchored words — e.g. "make word X red"
|
|
178
|
-
is `{"op":"style","anchor":{"type":"words","source":"SRC","phrase":"X"},"color":"#ff5c5c"}`;
|
|
179
|
-
`emphasis:"pop"|"highlight"` animates the word at its onset. `captions.style.karaoke: true`
|
|
180
|
-
adds a per-word highlight sweep inside grouped cues (staged). Validate anytime with
|
|
181
|
-
`video-editing timeline validate --job-dir "<job>" --json`.
|
|
182
|
-
|
|
183
|
-
### Authoring zooms
|
|
184
|
-
|
|
185
|
-
A zoom is a punch-in on `rect` (unit-canvas crop, `x+w<=1`, `y+h<=1`) at `scale`
|
|
186
|
-
(`1 < scale <= 3`), anchored to a phrase or source span. Static by default (hard in/out).
|
|
187
|
-
For a **ramp**, add `to: {scale?, rect?}` — the zoom animates from the base rect/scale to
|
|
188
|
-
`to` over the zoom window, shaped by `ease: {in, out}` (both > 0 → smooth in-out). Zooms
|
|
189
|
-
resolve onCut like everything else (`clip` default). Full examples:
|
|
190
|
-
`references/timeline-v2-vocabulary.md`.
|
|
191
|
-
|
|
192
|
-
### Authoring overlays & assets
|
|
193
|
-
|
|
194
|
-
- Text: `kind:"text"` (positioned) / `kind:"title-card"` (full-frame card) + `text`.
|
|
195
|
-
- **Image/sticker**: `kind:"sticker"` (or `"image"`) + `asset: {ref: "assets/logo.png"}` —
|
|
196
|
-
`ref` is a **job-dir-relative path**; keep files under `<job>/assets/`. Position with
|
|
197
|
-
`layout.x/y` (center), size with `size.w/h` (canvas fractions; sticker default ~0.25 of
|
|
198
|
-
width), stack with `z` (0–50). Animate with `enter`/`exit`
|
|
199
|
-
(`{preset: fade|pop|slide-up|slide-down|scale-in, durationS ≤ 2}`).
|
|
200
|
-
- A referenced file that does not exist fails `timeline compile` with `asset-missing` —
|
|
201
|
-
put the file in place first.
|
|
202
|
-
- On `review push --timeline` / `--complete`, referenced assets are **uploaded to
|
|
203
|
-
clipready automatically** (sha256-cached in `<job>/review/assets.json`, so unchanged
|
|
204
|
-
files are never re-uploaded); the push payload carries the `{ref: asset_id}` manifest.
|
|
205
|
-
- `compose` copies referenced assets into `<job>/composition/media/` and renders them.
|
|
206
|
-
|
|
207
|
-
### Delivering captions/zooms
|
|
208
|
-
|
|
209
|
-
The ffmpeg `render --mode final` path is **CUT-ONLY** — it never draws the compiled
|
|
210
|
-
captions/zooms/overlays from `resolved/plan.json`. Deliver those visual layers with either:
|
|
211
|
-
|
|
212
|
-
- **`video-editing compose --job-dir "<job>" --render`** — local and free. Builds a declarative
|
|
213
|
-
HyperFrames composition in `<job>/composition/` (compressed proxy of `vertical_src.mp4`,
|
|
214
|
-
the CONTINUOUS cut audio extracted from `preview.mp4`, and `index.html`) and renders it with
|
|
215
|
-
the `hyperframes` CLI (needs it on PATH: `npm install -g hyperframes`). Prerequisites:
|
|
216
|
-
`resolved/plan.json` (run `timeline compile`) and `preview.mp4` (run `render --mode preview`).
|
|
217
|
-
Without `--render` it only builds the composition and prints the exact `hyperframes render`
|
|
218
|
-
command to run. Output defaults to `<job>/composed.mp4`.
|
|
219
|
-
- **The ClipReady cloud render** (`cloud render`), which renders the same plan server-side
|
|
220
|
-
(requires a ClipReady account + API key — see the review-round section below).
|
|
221
|
-
|
|
222
|
-
Do **NOT** fall back to the legacy `render --build-subtitles` ASS burn for timeline-v2 jobs —
|
|
223
|
-
it requires a libass ffmpeg and renders the old 2-word subtitle style, not the compiled cues.
|
|
224
|
-
|
|
225
|
-
### Working a ClipReady review round
|
|
226
|
-
|
|
227
|
-
> Cloud features require a ClipReady account + API key (`CLIPREADY_API_BASE`, `CLIPREADY_API_KEY`).
|
|
228
|
-
|
|
229
|
-
When the job is a clipready review round (you have an API base + credential + video id), the
|
|
230
|
-
CLI syncs the round for you — no hand-rolled curl:
|
|
231
|
-
|
|
232
|
-
1. `video-editing review pull --job-dir "<job>"` — writes `<job>/review/round.json` (run id,
|
|
233
|
-
requested changes) and `<job>/review/instruction.md`, and hydrates `<job>/timeline.json`
|
|
234
|
-
from the server when you don't already have one (it never overwrites a local timeline).
|
|
53
|
+
- Your only hand-authored artifact is `<job>/timeline.json`.
|
|
54
|
+
|
|
55
|
+
## The workflow
|
|
56
|
+
|
|
57
|
+
1. **Init** — `video-editing init --video "<path>"` (add `--job-dir "<dir>"` to
|
|
58
|
+
choose the working dir). Uploads the source and creates the cloud job;
|
|
59
|
+
writes `<job>/job.json` with the `video_id` every later verb uses.
|
|
60
|
+
2. **Transcribe** — `video-editing transcribe --job-dir "<job>"`. Uploads the
|
|
61
|
+
audio; the cloud transcribes **and screens** it, then the CLI pulls the
|
|
62
|
+
results into the job dir: `transcripts/`, `word_dump.txt`,
|
|
63
|
+
`takes_packed.md`, `flags.txt`, `coverage.json` — **and
|
|
64
|
+
`prompts/author-edl.prompt.md`**, your editorial brief.
|
|
65
|
+
3. **READ the pulled `prompts/*.md` and follow them** — they are your
|
|
66
|
+
editorial brief (what to cut, what to keep, the screening gate, the pad
|
|
67
|
+
and boundary rules). They are authoritative and may change between runs;
|
|
68
|
+
never edit them, never substitute a remembered brief.
|
|
69
|
+
4. **Author `<job>/timeline.json`** per the pulled brief plus
|
|
70
|
+
`references/timeline-v2-vocabulary.md` (cut ranges, captions, zooms,
|
|
71
|
+
overlays, audio). Resolve phrase → seconds ONLY with
|
|
72
|
+
`video-editing timeline resolve --phrase "…" [--near <t> | --occurrence <n>]`
|
|
73
|
+
— never eyeball `word_dump.txt`. Sanity-check locally anytime with
|
|
74
|
+
`video-editing timeline validate --job-dir "<job>" --json`.
|
|
75
|
+
5. **Compile** — `video-editing timeline compile --job-dir "<job>" --json`.
|
|
76
|
+
Compiles in the cloud; writes `resolved/plan.json` +
|
|
77
|
+
`resolved/diagnostics.json`. Read the diagnostics and fix until it exits
|
|
78
|
+
`0` (`2` = validation failed — fix the reported paths; `3` = ambiguous
|
|
79
|
+
anchor — disambiguate with `timeline resolve`). Never hand-edit `resolved/`.
|
|
80
|
+
6. **Render the preview** — `video-editing compose --job-dir "<job>"` builds
|
|
81
|
+
the local HyperFrames composition in `<job>/composition/` (with
|
|
82
|
+
`index.html`), then render it locally with the `hyperframes` CLI
|
|
83
|
+
(`npm install -g hyperframes`; `compose` prints the exact command, or pass
|
|
84
|
+
`--render`). No hyperframes / no local horsepower? Use
|
|
85
|
+
`video-editing cloud render --job-dir "<job>" --mode preview --wait` instead.
|
|
86
|
+
7. **Verify** — `video-editing verify --job-dir "<job>" --json`. Cloud
|
|
87
|
+
verification of the rendered preview (catches retakes left in across a
|
|
88
|
+
join and dead air a visual check misses). Fix `timeline.json`, re-compile,
|
|
89
|
+
re-render, re-verify until clean; cap at ~3 fix passes and surface
|
|
90
|
+
remaining findings rather than looping.
|
|
91
|
+
8. **QA looks** — spot-check any window locally:
|
|
92
|
+
`video-editing qa frames --range <a>-<b> --job-dir "<job>"` (filmstrip PNG)
|
|
93
|
+
and `video-editing qa waveform --range <a>-<b> --job-dir "<job>"`
|
|
94
|
+
(waveform PNG + word-timing sidecar JSON). Local ffmpeg — free and fast;
|
|
95
|
+
Read the PNGs to adjudicate.
|
|
96
|
+
9. **Final** — `video-editing cloud render --job-dir "<job>" --mode final --wait`
|
|
97
|
+
(or render the composition locally at final quality).
|
|
98
|
+
|
|
99
|
+
## Your editorial brief arrives from the cloud
|
|
100
|
+
|
|
101
|
+
The deep editorial brief — retake/keep rules, pause tightening, cold-open,
|
|
102
|
+
screening and verification procedure — is **not in this skill**. It is pulled
|
|
103
|
+
from the server into `<job>/prompts/*.md` by `transcribe` (and refreshed by
|
|
104
|
+
`files pull`). Old references in this skill (`editing-brief.md`,
|
|
105
|
+
`hard-rules.md`, `adversarial-review.md`, `scribe-collapse.md`) are stubs
|
|
106
|
+
pointing there. If `prompts/author-edl.prompt.md` is missing, run
|
|
107
|
+
`video-editing files pull --job-dir "<job>"` — do not improvise a brief.
|
|
108
|
+
|
|
109
|
+
## Vertical master
|
|
110
|
+
|
|
111
|
+
`init --video` uploads the source as-is. When the deliverable is a vertical
|
|
112
|
+
9:16 reel from a non-vertical source, pass `--master` to `init` so the
|
|
113
|
+
vertical master is baked before upload (needs local ffmpeg). Check
|
|
114
|
+
`video-editing init --help` for the current flag surface.
|
|
115
|
+
|
|
116
|
+
## File sync
|
|
117
|
+
|
|
118
|
+
`video-editing files pull --job-dir "<job>" [--only <name,name>]` fetches the
|
|
119
|
+
cloud job's artifacts into the job dir preserving relative paths (transcripts,
|
|
120
|
+
`prompts/*.md`, `resolved/plan.json`, `timeline.json`, …);
|
|
121
|
+
`video-editing files push --job-dir "<job>"` uploads local artifacts (e.g. a
|
|
122
|
+
hand-authored `timeline.json`, referenced assets) back to the job. Use `pull`
|
|
123
|
+
to recover state on a fresh machine — the cloud job is the source of truth.
|
|
124
|
+
|
|
125
|
+
## Working a ClipReady review round
|
|
126
|
+
|
|
127
|
+
When the job is a clipready review round (the video has an active round):
|
|
128
|
+
|
|
129
|
+
1. `video-editing review pull --job-dir "<job>"` — writes
|
|
130
|
+
`<job>/review/round.json` (round/run ids, requested changes) and
|
|
131
|
+
`<job>/review/instruction.md`; hydrates `<job>/timeline.json` from the
|
|
132
|
+
server only when you don't already have one (never overwrites yours).
|
|
235
133
|
Add `--source` if the source video isn't local yet.
|
|
236
|
-
2.
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
`
|
|
134
|
+
2. Edit `timeline.json` per the instruction, then
|
|
135
|
+
`video-editing review push --timeline --job-dir "<job>"` after each
|
|
136
|
+
meaningful change — it compiles (diagnostics; exit `2` if not clean) and
|
|
137
|
+
the review page updates live. Referenced assets (stickers, audio beds)
|
|
138
|
+
upload automatically, sha256-cached.
|
|
139
|
+
3. Preview + verify exactly as in the workflow above.
|
|
140
|
+
4. `video-editing review push --complete --duration <s> --outcomes outcomes.json --job-dir "<job>"`
|
|
141
|
+
— compiles fresh (must be clean) and delivers the terminal payload.
|
|
142
|
+
`outcomes.json` is `[{"change_id": "chg_…", "ok": true, "note": "…"}]`,
|
|
143
|
+
one entry per `[chg_…]` marker in the instruction; omit `--outcomes` when
|
|
144
|
+
there are no markers.
|
|
145
|
+
|
|
146
|
+
## Hebrew / RTL
|
|
147
|
+
|
|
148
|
+
Hebrew/RTL sources are fully supported. Read the transcript word-by-word with
|
|
149
|
+
explicit timestamps to avoid visual-reorder confusion; anchor phrases via
|
|
150
|
+
`timeline resolve` exactly as with LTR text. Sentence-ending punctuation for
|
|
151
|
+
caption grouping is the same characters in Hebrew.
|
|
245
152
|
|
|
246
153
|
## References
|
|
247
154
|
|
|
248
|
-
- `references/cli-reference.md` — every subcommand + flag
|
|
249
|
-
- `references/timeline-v2-vocabulary.md` — the full timeline.json v2
|
|
250
|
-
example per feature (word styling, karaoke,
|
|
251
|
-
|
|
252
|
-
- `references/
|
|
253
|
-
|
|
254
|
-
|
|
155
|
+
- `references/cli-reference.md` — every v2 subcommand + flag.
|
|
156
|
+
- `references/timeline-v2-vocabulary.md` — the full `timeline.json` v2
|
|
157
|
+
vocabulary, one JSON example per feature (captions + word styling, karaoke,
|
|
158
|
+
zoom ramps, stickers, enter/exit, audio beds, grade).
|
|
159
|
+
- `references/editing-brief.md`, `references/hard-rules.md`,
|
|
160
|
+
`references/scribe-collapse.md`, `references/adversarial-review.md` —
|
|
161
|
+
stubs; the live content is server-pulled into `<job>/prompts/*.md`.
|
|
@@ -1,44 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Content-verify gate (moved server-side)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
waveform / visual self-eval looks perfect while the *content* is duplicated across
|
|
6
|
-
the join. The fix is to **re-transcribe the rendered preview at each join** — which
|
|
7
|
-
is exactly what `video-editing verify` does. Run it for every real cut.
|
|
8
|
-
|
|
9
|
-
## Run it
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
video-editing verify --job-dir "<job>" --json
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
- Default (per-join): re-transcribes a ~6s window centered on each cut boundary
|
|
16
|
-
(from `cut_boundaries.json`), **healing OFF**.
|
|
17
|
-
- `--full`: re-transcribes the whole preview and also checks head/tail dead air.
|
|
18
|
-
|
|
19
|
-
It reports, per join:
|
|
20
|
-
- **duplicated phrase across the join** → a retake left in (severity `error`). It only
|
|
21
|
-
flags **near-adjacent** duplication (the retake fingerprint), not legitimate topical
|
|
22
|
-
repeats spaced apart.
|
|
23
|
-
- **over-long gap straddling the join** → dead air not tightened (warning, or error if large).
|
|
24
|
-
|
|
25
|
-
Writes `verify.json` (same shape family as `review.json`); exit code 2 on `needs-fixes`.
|
|
26
|
-
|
|
27
|
-
## Adjudicate + fix
|
|
28
|
-
|
|
29
|
-
For any finding, eyeball it: `video-editing inspect --job-dir "<job>" --join <i>` and read
|
|
30
|
-
the PNG (clipped word, leftover false-start syllable, audio pop, broken frame?).
|
|
31
|
-
|
|
32
|
-
Then FIX the EDL and re-render + re-verify:
|
|
33
|
-
- **Retake still present** → set that range's END at the **last clean word BEFORE the
|
|
34
|
-
abandoned attempt**.
|
|
35
|
-
- **Intentional repeat wrongly cut** → restore it.
|
|
36
|
-
- **Clipped boundary** → re-snap to the transcript word boundary.
|
|
37
|
-
- **Leading / trailing dead air** → trim it.
|
|
38
|
-
|
|
39
|
-
Re-snap every edge to a word boundary; keep pads tight (30–200ms); keep `grade:"none"`,
|
|
40
|
-
`overlays:[]`; update `total_duration_s`. Re-render `--mode preview`, re-run `verify`.
|
|
41
|
-
Cap at ~3 fix passes; if findings persist, surface them rather than looping forever.
|
|
42
|
-
|
|
43
|
-
A real retake left in / an intentional repeat wrongly cut / a clipped word at a join /
|
|
44
|
-
leading-or-trailing dead air ⇒ not clean. Minor taste calls are not defects.
|
|
3
|
+
The verification procedure (Gate 2) now arrives from the ClipReady cloud inside `<job>/prompts/*.md`
|
|
4
|
+
(pulled by `video-editing transcribe` / `files pull`); run it via `video-editing verify`. This file is a stub.
|