video-editing 1.3.1 → 3.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 +53 -57
- package/dist/chunk-W4IIL2T2.js +2488 -0
- package/dist/cli.js +590 -1435
- package/dist/index.d.ts +1099 -922
- package/dist/index.js +319 -268
- package/package.json +2 -19
- package/skills/video-editing/SKILL.md +170 -235
- package/skills/video-editing/references/adversarial-review.md +3 -43
- package/skills/video-editing/references/cli-reference.md +165 -160
- 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,189 @@
|
|
|
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 agent workflow for editing a talking-head video into a tight, clean
|
|
5
|
+
cut with the `video-editing` CLI + the ClipReady cloud. The CLI is a PURE
|
|
6
|
+
API client — requirements are Node ≥ 20 and a ClipReady API key
|
|
7
|
+
(`CLIPREADY_API_KEY`) only; no ffmpeg, no ffprobe, no local rendering
|
|
8
|
+
tools. The source uploads once at init; transcription, editorial
|
|
9
|
+
screening, timeline compilation, rendering, verification, and QA visuals
|
|
10
|
+
all run server-side; the editorial brief arrives from the server as pulled
|
|
11
|
+
`prompts/*.md`. Use whenever the user drops a talking-head clip / reel /
|
|
12
|
+
vlog / interview and wants it edited or tightened — "edit this reel",
|
|
13
|
+
"cut the bad retakes", "clean up this recording", "tighten this",
|
|
14
|
+
"add captions", or just a video path with an editing ask — or when
|
|
15
|
+
working a ClipReady review round. Handles Hebrew/RTL.
|
|
20
16
|
---
|
|
21
17
|
|
|
22
|
-
# Video Editing (
|
|
18
|
+
# Video Editing (ClipReady cloud — pure API client)
|
|
23
19
|
|
|
24
|
-
Turn a raw talking-head recording into a tight, clean
|
|
25
|
-
**`video-editing`** CLI is
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
Turn a raw talking-head recording into a tight, clean cut. The
|
|
21
|
+
**`video-editing`** CLI (v3) is a pure API client for the ClipReady cloud: the
|
|
22
|
+
cloud owns EVERYTHING executable — probing, transcription, screening,
|
|
23
|
+
editorial prompts, timeline compilation, rendering, verification, and QA
|
|
24
|
+
visuals. Your machine only streams the source up once and pulls small
|
|
25
|
+
artifacts back. **You** read the pulled transcript + brief and author
|
|
26
|
+
`timeline.json`; the CLI does the rest over HTTP.
|
|
28
27
|
|
|
29
|
-
## Install
|
|
30
|
-
|
|
31
|
-
Requirements: **Node ≥ 20**, **ffmpeg**/**ffprobe** on PATH, and an **ElevenLabs API key**
|
|
32
|
-
(`ELEVENLABS_API_KEY`) for transcription.
|
|
28
|
+
## Install & auth
|
|
33
29
|
|
|
34
30
|
```bash
|
|
35
|
-
npm install -g video-editing # the CLI
|
|
31
|
+
npm install -g video-editing # the CLI (v3)
|
|
36
32
|
npx skills add ItayElgazar/clipready --skill video-editing # this skill
|
|
37
33
|
```
|
|
38
34
|
|
|
35
|
+
Requirements — this is the FULL list:
|
|
36
|
+
|
|
37
|
+
- **Node ≥ 20**
|
|
38
|
+
- **A ClipReady API key** — one-time login: `video-editing auth api-key` (paste
|
|
39
|
+
the key from the ClipReady settings page; the base URL defaults to the hosted
|
|
40
|
+
cloud). Env vars `CLIPREADY_API_KEY`/`CLIPREADY_API_BASE` override when set.
|
|
41
|
+
|
|
42
|
+
**No ffmpeg. No ffprobe. No hyperframes. No ElevenLabs key.** Nothing runs on
|
|
43
|
+
the local machine except the CLI itself — do not install media tools, and do
|
|
44
|
+
not set or ask for `ELEVENLABS_API_KEY`.
|
|
45
|
+
|
|
46
|
+
**Every command fails without the API key.** If a verb errors with a
|
|
47
|
+
missing-key message, stop and ask the user for their ClipReady API key;
|
|
48
|
+
never work around it.
|
|
49
|
+
|
|
39
50
|
## HARD RULE — execution boundary (read first)
|
|
40
51
|
|
|
41
52
|
- Use **only** the `video-editing` CLI (`video-editing <subcommand>`). Run
|
|
42
53
|
`video-editing --help` to see commands.
|
|
43
|
-
- **NEVER** run ffmpeg/ffprobe/transcription by hand —
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
the
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
`
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
`
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
`video-editing
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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).
|
|
235
|
-
Add `--source` if the source video isn't local yet.
|
|
236
|
-
2. `video-editing review push --stage edl --job-dir "<job>"` when you start working the round.
|
|
237
|
-
3. Edit `timeline.json` per the instruction, then
|
|
238
|
-
`video-editing review push --timeline --job-dir "<job>"` after each meaningful change — it
|
|
239
|
-
compiles locally (diagnostics + exit 2 if not clean) and the review page updates live.
|
|
240
|
-
4. Preview/verify locally exactly as in the workflow above (render preview, CONTENT-VERIFY, QC).
|
|
241
|
-
5. `video-editing review push --complete --duration <s> --outcomes outcomes.json --job-dir "<job>"`
|
|
242
|
-
— compiles fresh (must be clean) and delivers the terminal payload (edl + timeline + plan).
|
|
243
|
-
`outcomes.json` is `[{"change_id": "chg_…", "ok": true, "note": "…"}]`, one entry per
|
|
244
|
-
`[chg_…]` marker in the instruction; omit `--outcomes` when there are no markers.
|
|
54
|
+
- **NEVER** run ffmpeg/ffprobe/transcription by hand — there is simply no
|
|
55
|
+
local media in this workflow at all; every frame lives in the cloud. If you
|
|
56
|
+
have a memory of local renders, `compose`, `--master`, or "extract the WAV
|
|
57
|
+
first", that memory is from a retired pipeline — discard it.
|
|
58
|
+
- If a capability seems missing, STOP and report it as a CLI gap. Do not
|
|
59
|
+
reach around the CLI.
|
|
60
|
+
- Your only hand-authored artifact is `<job>/timeline.json`.
|
|
61
|
+
- **Captions are timeline-authored and rendered by the cloud renderer —
|
|
62
|
+
NEVER ffmpeg subtitle filters, libass, `.srt` sidecars, or `drawtext`.**
|
|
63
|
+
|
|
64
|
+
## The workflow
|
|
65
|
+
|
|
66
|
+
1. **Init** — `video-editing init --source "<path>"` (add `--job-dir "<dir>"`
|
|
67
|
+
to choose the working dir). ONE command does everything through
|
|
68
|
+
transcription: it streams the source up (chunked, retried, 2GB-safe),
|
|
69
|
+
creates the cloud job, runs server-side ingest (probe + transcription +
|
|
70
|
+
editorial screening), and pulls the results into the job dir:
|
|
71
|
+
`transcripts/`, `word_dump.txt`, `takes_packed.md`, `flags.txt`,
|
|
72
|
+
`coverage.json`, `probe.json` — **and `prompts/author-edl.prompt.md`**,
|
|
73
|
+
your editorial brief. Writes `<job>/job.json` (the `video_id` every later
|
|
74
|
+
verb uses) and prints the video's web link. There is no separate
|
|
75
|
+
transcribe step — `transcribe` exists only to re-pull/re-run later.
|
|
76
|
+
Filenames with apostrophes, spaces, or unicode are safe — the internal
|
|
77
|
+
stem is sanitized automatically; never rename the user's file.
|
|
78
|
+
2. **READ the pulled `prompts/*.md` and follow them** — they are your
|
|
79
|
+
editorial brief (what to cut, what to keep, the screening gate, the pad
|
|
80
|
+
and boundary rules). They are authoritative and may change between runs;
|
|
81
|
+
never edit them, never substitute a remembered brief.
|
|
82
|
+
3. **Author `<job>/timeline.json`** per the pulled brief plus
|
|
83
|
+
`references/timeline-v2-vocabulary.md` (cut ranges, captions, zooms,
|
|
84
|
+
overlays, audio). The **sources KEY must equal the transcript stem** (the
|
|
85
|
+
filename of `transcripts/<stem>.json`) — captions and resolve bind
|
|
86
|
+
through it. Resolve phrase → seconds ONLY with
|
|
87
|
+
`video-editing timeline resolve --phrase "…" [--occurrence <n>]`
|
|
88
|
+
— never eyeball `word_dump.txt`. Sanity-check locally anytime with
|
|
89
|
+
`video-editing timeline validate --job-dir "<job>" --json`.
|
|
90
|
+
4. **Compile** — `video-editing timeline compile --job-dir "<job>" --json`.
|
|
91
|
+
Compiles in the cloud; writes `resolved/plan.json` +
|
|
92
|
+
`resolved/diagnostics.json` and prints the `View & comment` watch link —
|
|
93
|
+
the user can already watch/comment on the compiled cut. Read the
|
|
94
|
+
diagnostics and fix until it exits `0` (`2` = validation failed — fix the
|
|
95
|
+
reported paths; `3` = ambiguous anchor — disambiguate with
|
|
96
|
+
`timeline resolve`). Never hand-edit `resolved/`.
|
|
97
|
+
5. **Render the preview** — `video-editing render --job-dir "<job>"`
|
|
98
|
+
(cloud render, preview mode, waits and downloads `<job>/preview.mp4` by
|
|
99
|
+
default; it works right after `timeline compile`). Share the printed
|
|
100
|
+
watch link with the user.
|
|
101
|
+
6. **Verify** — `video-editing verify --job-dir "<job>" --json`. Fully
|
|
102
|
+
server-side verification of the rendered preview (catches retakes left in
|
|
103
|
+
across a join and dead air a visual check misses); nothing is uploaded.
|
|
104
|
+
Can run while the user reviews. Fix `timeline.json`, re-compile,
|
|
105
|
+
re-render, re-verify until clean; cap at ~3 fix passes and surface
|
|
106
|
+
remaining findings rather than looping.
|
|
107
|
+
7. **QA looks** — spot-check any window with server-rendered visuals.
|
|
108
|
+
THE close-look tool is
|
|
109
|
+
`video-editing qa inspect --start <a> --end <b> --job-dir "<job>"`:
|
|
110
|
+
one composite PNG with the filmstrip, the waveform, word labels, AND
|
|
111
|
+
the compiled plan's cut regions shaded red ("cut") — everything needed
|
|
112
|
+
to adjudicate a moment in a single image. Same addressing as frames:
|
|
113
|
+
`qa inspect --join <i>` (the two sides of plan join i → `-a`/`-b`
|
|
114
|
+
PNGs) and `qa inspect --out-start <a> --out-end <b>` (OUTPUT seconds
|
|
115
|
+
mapped through the compiled plan). The narrower views still exist:
|
|
116
|
+
`video-editing qa frames …` (filmstrip only, same addressing modes)
|
|
117
|
+
and `video-editing qa waveform --start <a> --end <b>` (waveform PNG +
|
|
118
|
+
word-timing sidecar JSON). Read the PNGs to adjudicate.
|
|
119
|
+
8. **Final** — `video-editing render --mode final --job-dir "<job>"`.
|
|
120
|
+
|
|
121
|
+
## Your editorial brief arrives from the cloud
|
|
122
|
+
|
|
123
|
+
The deep editorial brief — retake/keep rules, pause tightening, cold-open,
|
|
124
|
+
screening and verification procedure — is **not in this skill**. It is pulled
|
|
125
|
+
from the server into `<job>/prompts/*.md` by `init` (and refreshed by
|
|
126
|
+
`files pull`). Old references in this skill (`editing-brief.md`,
|
|
127
|
+
`hard-rules.md`, `adversarial-review.md`, `scribe-collapse.md`) are stubs
|
|
128
|
+
pointing there. If `prompts/author-edl.prompt.md` is missing, run
|
|
129
|
+
`video-editing files pull --job-dir "<job>"` — do not improvise a brief.
|
|
130
|
+
|
|
131
|
+
## Known caveats
|
|
132
|
+
|
|
133
|
+
- **`verify` over-triggers on thematically narrow monologues.** The
|
|
134
|
+
duplicated-phrase join check flags legitimately repeated wording as
|
|
135
|
+
"retake left in". If EVERY join comes back flagged — including plain
|
|
136
|
+
pause-tightening joins that obviously aren't retakes — adjudicate each
|
|
137
|
+
finding against `flags.txt` (the screening output) instead of blindly
|
|
138
|
+
recutting; only recut joins that flags.txt corroborates as real retakes.
|
|
139
|
+
- **Caption mistranscriptions** are fixed with a captions override in
|
|
140
|
+
`timeline.json` (anchored on the MIS-transcribed text — see
|
|
141
|
+
`references/timeline-v2-vocabulary.md`), then recompile + re-render.
|
|
142
|
+
Never with subtitle files or filters.
|
|
143
|
+
|
|
144
|
+
## File sync
|
|
145
|
+
|
|
146
|
+
`video-editing files pull --job-dir "<job>" [--only <name,name>]` fetches the
|
|
147
|
+
cloud job's artifacts into the job dir preserving relative paths (transcripts,
|
|
148
|
+
`prompts/*.md`, `resolved/plan.json`, `timeline.json`, …);
|
|
149
|
+
`video-editing files push --job-dir "<job>" <paths…>` uploads local artifacts
|
|
150
|
+
(e.g. a hand-authored `timeline.json`, referenced assets) back to the job. Use
|
|
151
|
+
`pull` to recover state on a fresh machine — the cloud job is the source of
|
|
152
|
+
truth.
|
|
153
|
+
|
|
154
|
+
## Working a ClipReady review round
|
|
155
|
+
|
|
156
|
+
When the job is a clipready review round (the video has an active round):
|
|
157
|
+
|
|
158
|
+
1. `video-editing review pull --job-dir "<job>"` — writes
|
|
159
|
+
`<job>/review/round.json` (round/run ids, requested changes) and
|
|
160
|
+
`<job>/review/instruction.md`; hydrates `<job>/timeline.json` from the
|
|
161
|
+
server only when you don't already have one (never overwrites yours).
|
|
162
|
+
2. Edit `timeline.json` per the instruction, then
|
|
163
|
+
`video-editing review push --timeline --job-dir "<job>"` after each
|
|
164
|
+
meaningful change — it compiles in the cloud (diagnostics; exit `2` if
|
|
165
|
+
not clean) and the review page updates live. Referenced assets (stickers,
|
|
166
|
+
audio beds) upload automatically, sha256-cached.
|
|
167
|
+
3. Render + verify exactly as in the workflow above.
|
|
168
|
+
4. `video-editing review push --complete --duration <s> --outcomes outcomes.json --job-dir "<job>"`
|
|
169
|
+
— compiles fresh (must be clean) and delivers the terminal payload.
|
|
170
|
+
`outcomes.json` is `[{"change_id": "chg_…", "ok": true, "note": "…"}]`,
|
|
171
|
+
one entry per `[chg_…]` marker in the instruction; omit `--outcomes` when
|
|
172
|
+
there are no markers.
|
|
173
|
+
|
|
174
|
+
## Hebrew / RTL
|
|
175
|
+
|
|
176
|
+
Hebrew/RTL sources are fully supported. Read the transcript word-by-word with
|
|
177
|
+
explicit timestamps to avoid visual-reorder confusion; anchor phrases via
|
|
178
|
+
`timeline resolve` exactly as with LTR text. Sentence-ending punctuation for
|
|
179
|
+
caption grouping is the same characters in Hebrew.
|
|
245
180
|
|
|
246
181
|
## References
|
|
247
182
|
|
|
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
|
-
|
|
183
|
+
- `references/cli-reference.md` — every v3 subcommand + flag.
|
|
184
|
+
- `references/timeline-v2-vocabulary.md` — the full `timeline.json` v2
|
|
185
|
+
vocabulary, one JSON example per feature (captions + word styling, karaoke,
|
|
186
|
+
zoom ramps, stickers, enter/exit, audio beds, grade).
|
|
187
|
+
- `references/editing-brief.md`, `references/hard-rules.md`,
|
|
188
|
+
`references/scribe-collapse.md`, `references/adversarial-review.md` —
|
|
189
|
+
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.
|