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,181 +1,186 @@
|
|
|
1
|
-
# `video-editing` CLI reference
|
|
1
|
+
# `video-editing` CLI reference (v3 — pure API client)
|
|
2
2
|
|
|
3
|
-
All execution goes through this CLI
|
|
3
|
+
All execution goes through this CLI, and the CLI runs NOTHING locally: every
|
|
4
|
+
verb is HTTP against the ClipReady cloud plus small artifact pulls. Quote
|
|
5
|
+
paths (they contain spaces).
|
|
6
|
+
|
|
7
|
+
**Every verb requires ClipReady credentials.** Resolution:
|
|
8
|
+
|
|
9
|
+
- **base**: `--api-base` → env `CLIPREADY_API_BASE` → the hosted cloud (default)
|
|
10
|
+
- **key** (sent as `Authorization: Bearer <key>`): `--api-key` → env `CLIPREADY_API_KEY` → the config file written by `video-editing auth api-key`
|
|
11
|
+
- **video id**: `--video-id` → `<job>/job.json` (written by `init`) → env `VIDEO_ID`
|
|
12
|
+
|
|
13
|
+
A missing base or key is a clear error → non-zero exit, nothing runs. There is
|
|
14
|
+
**no ffmpeg/ffprobe/hyperframes requirement and no ElevenLabs
|
|
15
|
+
configuration** — media work is server-side in the ClipReady cloud.
|
|
16
|
+
|
|
17
|
+
Most verbs support `--json` for a machine-readable result. Exit codes: `0` ok,
|
|
18
|
+
`1` error (incl. missing credentials), `2` validation failed, `3` ambiguous
|
|
19
|
+
anchor (timeline group).
|
|
20
|
+
|
|
21
|
+
**Large uploads are chunked automatically** (no flag needed): the init source
|
|
22
|
+
streams up in 8MB parts with per-part retry — a 2GB file is never buffered in
|
|
23
|
+
memory — and on networks where direct storage PUTs keep dying, parts fall back
|
|
24
|
+
to an authenticated relay through the API. Servers without chunked-upload
|
|
25
|
+
support transparently fall back to a single retried upload.
|
|
4
26
|
|
|
5
27
|
## Pipeline commands
|
|
6
28
|
|
|
7
|
-
- **`init
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
keep-range **excises internal silences ≥ `--min-silence`** (leaving `lead-pad + trail-pad` of air)
|
|
28
|
-
and **trims silent leading/trailing edges**. Catches silence the transcript can't see (dead air
|
|
29
|
-
baked inside a stretched word token, room tone, breaths). **Transcript-aware** — never splits inside
|
|
30
|
-
a single word token (spelled acronyms, held vowels, numbers). Backs the original EDL up to
|
|
31
|
-
`edl.raw.json`, rewrites `edl.json`, marks it `desilenced`. Idempotent. Higher `--noise-db`
|
|
32
|
-
(e.g. −34) + lower `--min-silence` = more aggressive.
|
|
33
|
-
**Runs automatically at the start of every `render`** (skip with `render … --no-desilence`); the
|
|
34
|
-
standalone command is for tuning + inspecting the result before rendering.
|
|
35
|
-
|
|
36
|
-
- **`render --job-dir <dir> --mode preview|draft|final [--build-subtitles] [--no-subtitles] [--no-loudnorm] [--no-desilence]`**
|
|
37
|
-
Render the EDL: **desilence (unless `--no-desilence`)** → per-segment extract → lossless concat →
|
|
38
|
-
(optional subs) → loudnorm (−14 LUFS / −1 dBTP / LRA 11). preview=CRF22/1080p, draft=CRF28/720p,
|
|
39
|
-
final=CRF20/1080p. Writes `preview.mp4`/`draft.mp4`/`final.mp4` + `cut_boundaries.json`.
|
|
40
|
-
|
|
41
|
-
## QC / verification commands
|
|
42
|
-
|
|
43
|
-
- **`verify --job-dir <dir> [--full] [--window 6] [--gap 0.6] [--json] [--api-key <key>]`** ← Gate 4 (content)
|
|
44
|
-
Re-transcribes the rendered preview with healing OFF and reports, per join,
|
|
45
|
-
**duplicated phrases** and **over-long gaps** (dead air not tightened → warning/error).
|
|
46
|
-
A duplicate of **≥3 words** = a retake left in → **error**. A bare **2-word** repeat = **warning**
|
|
47
|
-
(spelled acronym / number / emphasis like "WW" → "דבל יו דבל יו" — adjudicate with `inspect`, usually safe).
|
|
48
|
-
Default: per-join ~6s windows from `cut_boundaries.json`; `--full` re-transcribes the whole preview and
|
|
49
|
-
also checks head/tail dead air. Writes `verify.json`; exit code 2 if `needs-fixes`.
|
|
50
|
-
|
|
51
|
-
- **`inspect --job-dir <dir> (--join <i> | --start <s> --end <s>) [--video preview|vertical_src] [--transcript <path>] [-o <png>] [--n-frames 10]`**
|
|
52
|
-
Filmstrip + waveform + word-label PNG for a window or a cut-boundary index.
|
|
53
|
-
`timeline` is an alias. Use it to adjudicate a verify finding or pick a cut edge.
|
|
54
|
-
|
|
55
|
-
## TimelineV2 commands (`timeline.json` v2 — preferred when present)
|
|
56
|
-
|
|
57
|
-
Exit codes for this group: `0` ok, `1` error, `2` validation failed, `3` ambiguous anchor.
|
|
29
|
+
- **`init --source <path> [--job-dir <dir>] [--title <t>] [--poll-interval 5]`**
|
|
30
|
+
ONE command covers what init+transcribe used to do. Streams the source up,
|
|
31
|
+
creates the cloud job, runs server-side **ingest** (probe + audio
|
|
32
|
+
extraction + transcription + editorial screening), polls with progress
|
|
33
|
+
lines, then pulls into the job dir: `transcripts/*.json`, `word_dump.txt`,
|
|
34
|
+
`takes_packed.md`, `flags.txt`, `coverage.json`, `probe.json`, and the
|
|
35
|
+
editorial brief `prompts/author-edl.prompt.md` (plus any other
|
|
36
|
+
`prompts/*.md`). Writes `job.json` (`video_id`, api base, stem,
|
|
37
|
+
`duration_s` from the server probe, `source_path`) and prints the video's
|
|
38
|
+
web page link (`web_url` in `--json`). The internal stem is sanitized to a
|
|
39
|
+
filename-safe charset, so apostrophe/space/unicode filenames work end to
|
|
40
|
+
end with no rename.
|
|
41
|
+
|
|
42
|
+
- **`transcribe --job-dir <dir> [--poll-interval 5]`**
|
|
43
|
+
Re-run/pull only (init already transcribed): when the transcript artifacts
|
|
44
|
+
exist server-side it just pulls them; otherwise it starts a fresh
|
|
45
|
+
server-side ingest, polls, and pulls. No media flags — there is no local
|
|
46
|
+
extraction.
|
|
47
|
+
|
|
48
|
+
## Timeline commands (`timeline.json` v2)
|
|
58
49
|
|
|
59
50
|
- **`timeline validate --job-dir <dir> [--json]`**
|
|
60
|
-
|
|
61
|
-
the
|
|
51
|
+
Local schema + semantic + capability validation of `<job>/timeline.json`
|
|
52
|
+
(the one purely local verb — it touches no media). Exit `2` if invalid.
|
|
62
53
|
|
|
63
|
-
- **`timeline
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
`3`
|
|
54
|
+
- **`timeline resolve --job-dir <dir> --phrase <text> [--occurrence <n>] [--source <name>] [--json]`**
|
|
55
|
+
Resolve a transcript phrase to **exact source seconds** (word-accurate,
|
|
56
|
+
server-side). The ONLY way to turn a phrase into an anchor time. Multiple
|
|
57
|
+
hits → exit `3` with per-occurrence context; pick one with `--occurrence`
|
|
58
|
+
(1-based). Not found → fuzzy suggestions, exit `1`.
|
|
67
59
|
|
|
68
|
-
- **`timeline
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
60
|
+
- **`timeline compile --job-dir <dir> [--json]`**
|
|
61
|
+
**Cloud compile**: uploads `timeline.json`, the server validates, resolves
|
|
62
|
+
anchors, sources silences from the job's cloud files, derives caption
|
|
63
|
+
cues, and returns `resolved/plan.json` + `resolved/diagnostics.json`
|
|
64
|
+
(written into the job dir). On success prints the `View & comment` watch
|
|
65
|
+
link — the compiled cut is already watchable in the web app. Iterate until
|
|
66
|
+
exit `0`. Exit `2` = validation failed (fix the reported `path`s), `3` =
|
|
67
|
+
ambiguous anchor (disambiguate with `timeline resolve`). Never hand-edit
|
|
68
|
+
anything under `resolved/`.
|
|
73
69
|
|
|
74
70
|
- **`timeline captions generate --job-dir <dir> [--preset grouped|opus-karaoke] [--json]`**
|
|
75
|
-
Enable captions in `timeline.json` (preset only
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
generated GSAP timeline when the plan uses animated vocabulary). Without `--render`,
|
|
89
|
-
prints the composition dir + the exact `hyperframes render` command. With `--render`, runs
|
|
90
|
-
`hyperframes render --quality <q> --fps <n> --output <out>` (default `<job>/composed.mp4`)
|
|
91
|
-
in the composition dir — requires the `hyperframes` CLI on PATH (`npm install -g hyperframes`).
|
|
92
|
-
`--json` prints `{compositionDir, entry, out?, segments, cues, zooms, overlays}`. This is the
|
|
93
|
-
LOCAL delivery path for compiled captions/zooms — the ffmpeg `render` is cut-only; never use
|
|
94
|
-
`--build-subtitles` for timeline-v2 jobs.
|
|
95
|
-
|
|
96
|
-
## Cloud thin-client commands (clipready render/QA/artifact API)
|
|
97
|
-
|
|
98
|
-
Every cloud verb resolves credentials the same way and supports `--json` (machine shape;
|
|
99
|
-
exit `0` ok, `1` error). Resolution precedence:
|
|
100
|
-
|
|
101
|
-
- **base**: `--api-base` → env `CLIPREADY_API_BASE` → env `API_BASE`
|
|
102
|
-
- **credential** (sent as `Authorization: Bearer <credential>`): `--api-key` → env `CLIPREADY_API_KEY` → env `RUN_TOKEN`
|
|
103
|
-
- **video id**: `--video-id` → env `VIDEO_ID`
|
|
104
|
-
|
|
105
|
-
A missing base / credential / (required) video id is a clear error → exit `1`.
|
|
106
|
-
|
|
107
|
-
- **`cloud render --job-dir <dir> --mode preview|final [--wait] [--poll-interval 10] [--out <path>] [--json]`**
|
|
108
|
-
Submit a render. Without `--wait`: prints `render_id` and exits `0`. With `--wait`: polls status
|
|
109
|
-
(max 30 min) until terminal; on `completed`, downloads the signed `video_url` to `--out`
|
|
110
|
-
(default `<job>/preview.mp4` or `<job>/final.mp4`). `failed` → exit `1` with the error. Needs a video id.
|
|
71
|
+
Enable captions in `timeline.json` (preset only), then server-compile to
|
|
72
|
+
derive/report cues.
|
|
73
|
+
|
|
74
|
+
## Render commands
|
|
75
|
+
|
|
76
|
+
- **`render [--mode preview|final] --job-dir <dir> [--no-wait] [--poll-interval 10] [--out <path>] [--json]`**
|
|
77
|
+
THE render verb: submits a cloud render of the compiled plan (works right
|
|
78
|
+
after `timeline compile`), **waits by default**, and downloads the result
|
|
79
|
+
to `<job>/preview.mp4` / `<job>/final.mp4`. Mode defaults to `preview`.
|
|
80
|
+
`--no-wait` submits and prints `render_id` only.
|
|
81
|
+
|
|
82
|
+
- **`cloud render --mode preview|final --job-dir <dir> [--wait] [--poll-interval 10] [--out <path>] [--json]`**
|
|
83
|
+
Same implementation, legacy spelling (`--wait` is opt-in here).
|
|
111
84
|
|
|
112
85
|
- **`cloud status <render_id> [--json]`**
|
|
113
|
-
One status GET: `pending|running|completed|failed` (+ `video_url` when
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
86
|
+
One status GET: `pending|running|completed|failed` (+ `video_url` when
|
|
87
|
+
completed). `failed` → exit `1`.
|
|
88
|
+
|
|
89
|
+
## Verification / QA commands
|
|
90
|
+
|
|
91
|
+
- **`verify --job-dir <dir> [--full] [--window <s>] [--json]`**
|
|
92
|
+
**Fully server-side verification** of the rendered preview: the server
|
|
93
|
+
re-checks every join for duplicated phrases (a retake left in → error) and
|
|
94
|
+
over-long gaps (dead air → warning/error) against its own copy of the
|
|
95
|
+
preview — nothing is uploaded. Writes `verify.json`; exit `2` on
|
|
96
|
+
needs-fixes. Caveat: the duplicated-phrase check over-triggers on
|
|
97
|
+
thematically narrow monologues — if every join is flagged (including plain
|
|
98
|
+
pause-tightening joins), adjudicate against `flags.txt` instead of blindly
|
|
99
|
+
recutting.
|
|
100
|
+
|
|
101
|
+
- **`qa frames (--start <s> --end <s> | --join <i> [--span 2] | --out-start <s> --out-end <s>) [--cols <n>] [--interval <s>] --job-dir <dir> [--json]`**
|
|
102
|
+
**Server-rendered** filmstrip PNG(s) → `<job>/qa/frames_<start>_<end>.png`.
|
|
103
|
+
Three addressing modes (exactly one): `--start/--end` in SOURCE seconds;
|
|
104
|
+
`--join <i>` renders the two sides of compiled-plan join `i` (1-based —
|
|
105
|
+
the last/first `--span` seconds of the segments meeting there) as
|
|
106
|
+
`…-a.png` (tail) + `…-b.png` (head); `--out-start/--out-end` in OUTPUT
|
|
107
|
+
seconds, mapped through `resolved/plan.json` (windows crossing a join
|
|
108
|
+
split into `-a`/`-b`/… PNGs). Read the PNGs to inspect frames.
|
|
109
|
+
|
|
110
|
+
- **`qa waveform --start <s> --end <s> --job-dir <dir> [--json]`**
|
|
111
|
+
**Server-rendered** waveform PNG + word-timing sidecar →
|
|
112
|
+
`<job>/qa/waveform_<start>_<end>.png` and
|
|
113
|
+
`<job>/qa/waveform_<start>_<end>.words.json` (word list with timings for
|
|
114
|
+
the window, SOURCE seconds). Use for cut-edge adjudication.
|
|
115
|
+
|
|
116
|
+
- **`qa inspect (--start <s> --end <s> | --join <i> [--span 2] | --out-start <s> --out-end <s>) [--n-frames <n>] --job-dir <dir> [--json]`**
|
|
117
|
+
**THE close-look tool** — a **server-rendered** combined composite PNG →
|
|
118
|
+
`<job>/qa/inspect_<start>_<end>.png`: filmstrip + waveform + word labels
|
|
119
|
+
in one image, with the compiled plan's cut regions shaded translucent
|
|
120
|
+
red (labeled "cut") over the waveform. Same three addressing modes as
|
|
121
|
+
`qa frames` (exactly one): `--start/--end` in SOURCE seconds; `--join <i>`
|
|
122
|
+
renders the two sides of compiled-plan join `i` as `…-a.png` (tail) +
|
|
123
|
+
`…-b.png` (head) — the sides are discontiguous in source time, hence two
|
|
124
|
+
PNGs; `--out-start/--out-end` in OUTPUT seconds mapped through
|
|
125
|
+
`resolved/plan.json`. `--n-frames` sets the filmstrip frame count
|
|
126
|
+
(default 10). Prefer this over separate frames + waveform calls when
|
|
127
|
+
adjudicating a cut.
|
|
128
|
+
|
|
129
|
+
## File sync commands
|
|
130
|
+
|
|
131
|
+
- **`files pull --job-dir <dir> [--only <name,name>] [--json]`**
|
|
132
|
+
List the cloud job's files and fetch each (or the `--only` subset) into
|
|
133
|
+
the job dir, **preserving relative paths** (`resolved/plan.json` →
|
|
134
|
+
`<job>/resolved/plan.json`, `prompts/author-edl.prompt.md` →
|
|
135
|
+
`<job>/prompts/author-edl.prompt.md`). Byte-exact, sha256-skipped. Use to
|
|
136
|
+
recover job state on a fresh machine.
|
|
137
|
+
|
|
138
|
+
- **`files push --job-dir <dir> <paths…> [--json]`**
|
|
139
|
+
Upload local job files (e.g. `timeline.json`, referenced assets) to the
|
|
140
|
+
cloud job. Content-hash-cached — unchanged files are not re-uploaded.
|
|
141
|
+
|
|
142
|
+
## Review round commands (ClipReady review sessions)
|
|
143
|
+
|
|
144
|
+
- **`review pull --job-dir <dir> [--source] [--json]`**
|
|
145
|
+
Fetch the review session: writes `<job>/review/round.json` (round/run ids,
|
|
146
|
+
mode, status, requested changes) and `<job>/review/instruction.md`. Writes
|
|
147
|
+
`<job>/timeline.json` from the session ONLY when no local one exists (never
|
|
148
|
+
overwrites yours). `--source` also downloads the source video when absent.
|
|
149
|
+
|
|
150
|
+
- **`review push (--stage <type> [--message <text>] | --timeline | --complete --duration <s> [--outcomes <file>]) --job-dir <dir> [--run-id <id>] [--json]`**
|
|
151
|
+
Push review-round events (one mode per call; run id defaults to
|
|
152
|
+
`review/round.json`). `--stage` posts a progress event
|
|
153
|
+
(`provisioning|transcribing|edl|render_preview|qc|render_final|uploading|log`).
|
|
154
|
+
`--timeline` compiles `<job>/timeline.json` in the cloud (exit `2` if not
|
|
155
|
+
clean) and pushes a `timeline_update` — the review page updates live.
|
|
156
|
+
`--complete` compiles fresh (must be clean) and pushes the terminal
|
|
157
|
+
`completed` event (`{edl, timeline, plan, duration_s, outcomes?}`;
|
|
158
|
+
`--outcomes` is a JSON file of `[{change_id, ok, note?}]`). Both
|
|
159
|
+
`--timeline` and `--complete` upload the timeline's referenced assets
|
|
160
|
+
automatically (sha256-cached in `<job>/review/assets.json`).
|
|
161
|
+
|
|
162
|
+
- **`review prompt --job-dir <dir> [--json]`** — print the pulled round
|
|
163
|
+
instruction.
|
|
158
164
|
|
|
159
165
|
## Utility
|
|
160
166
|
|
|
161
167
|
- **`--version`** — print the CLI version.
|
|
162
|
-
- **`status --job-dir <dir> [--json]`** — job state + artifact existence.
|
|
163
|
-
- **`
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
- **`config set-key <key>` / `config path`** — manage the ElevenLabs key
|
|
168
|
-
(`~/.config/video-editing/.env`; on the sandbox the CLI reads env `ELEVENLABS_API_KEY`,
|
|
169
|
-
no need to run `config set-key`).
|
|
168
|
+
- **`status --job-dir <dir> [--json]`** — cloud job state + local artifact existence.
|
|
169
|
+
- **`skill install [--target <dir>] [--json]`** — copy the bundled
|
|
170
|
+
`video-editing` agent skill into `<target|~/.claude/skills>/video-editing`.
|
|
171
|
+
- **`config set-key <key> | set-base <url> | path`** — store credentials in
|
|
172
|
+
`~/.config/video-editing/.env` (the only verb that runs without one).
|
|
170
173
|
|
|
171
174
|
## Typical session
|
|
172
175
|
|
|
173
176
|
```
|
|
174
|
-
video-editing
|
|
175
|
-
video-editing
|
|
176
|
-
#
|
|
177
|
-
video-editing
|
|
178
|
-
video-editing
|
|
179
|
-
|
|
180
|
-
video-editing
|
|
177
|
+
video-editing auth api-key # once per machine (skip if already logged in)
|
|
178
|
+
video-editing init --source "clip.mp4" --job-dir jobs/clip # upload + ingest + pull (transcribe included)
|
|
179
|
+
# READ jobs/clip/prompts/author-edl.prompt.md — it is the editorial brief. Author timeline.json.
|
|
180
|
+
video-editing timeline validate --job-dir jobs/clip --json
|
|
181
|
+
video-editing timeline compile --job-dir jobs/clip --json # fix until exit 0; prints the watch link
|
|
182
|
+
video-editing render --job-dir jobs/clip # cloud preview render (waits + downloads)
|
|
183
|
+
video-editing verify --job-dir jobs/clip --json # fix → recompile → re-render → re-verify
|
|
184
|
+
video-editing qa inspect --join 1 --job-dir jobs/clip # close-look at the first join's two sides (filmstrip+waveform+cuts)
|
|
185
|
+
video-editing render --mode final --job-dir jobs/clip
|
|
181
186
|
```
|
|
@@ -1,44 +1,4 @@
|
|
|
1
|
-
# Editing brief
|
|
1
|
+
# Editing brief (moved server-side)
|
|
2
2
|
|
|
3
|
-
The
|
|
4
|
-
|
|
5
|
-
`video-editing` CLI; you only write the EDL.
|
|
6
|
-
|
|
7
|
-
## Standing brief (apply exactly)
|
|
8
|
-
|
|
9
|
-
- **Output VERTICAL 9:16.** The CLI bakes `vertical_src.mp4`; point the EDL at it.
|
|
10
|
-
- **CUT:** bad retakes, false starts, cut-off / stuttered words — keep the **LAST
|
|
11
|
-
complete take**, EXCEPT keep the **CLEANEST** take when an earlier take is clean
|
|
12
|
-
and a later one stutters into completion.
|
|
13
|
-
- **TIGHTEN EVERY PAUSE:** trim 0.3–1s inter-phrase gaps down to ~0.12–0.14s of air.
|
|
14
|
-
- **COLD-OPEN** on the strongest hook (trim weak/dead intro).
|
|
15
|
-
- **TRIM outro dead air** (footsteps / ambient / silence / trailing breaths / device noise).
|
|
16
|
-
- **CLEAN CUTS ONLY:** `grade:"none"`, no subtitles, no overlays.
|
|
17
|
-
- **KEEP intentional rhetorical repeats.**
|
|
18
|
-
|
|
19
|
-
### Retake-vs-intentional discriminator (for a flagged repeated phrase)
|
|
20
|
-
|
|
21
|
-
- **RETAKE** (cut it, keep the last/cleanest complete pass) if the earlier
|
|
22
|
-
instance cuts off mid-word (a fragment / trailing "-") OR is immediately restarted.
|
|
23
|
-
- **INTENTIONAL** (keep BOTH) if both instances are complete and serve rhetoric /
|
|
24
|
-
parallel structure and are separated by other content.
|
|
25
|
-
- Decide every flagged repeat — never blind-cut.
|
|
26
|
-
|
|
27
|
-
## Steps
|
|
28
|
-
|
|
29
|
-
1. **Init + transcribe + screen** (CLI does these): `init-job` → `transcribe`.
|
|
30
|
-
Then read `<job>/flags.txt` (Gate 1) and confirm `<job>/coverage.json`.
|
|
31
|
-
2. **Read the word-level transcript** at `<job>/word_dump.txt` (every word/audio_event
|
|
32
|
-
as `[start-end] type: text` with `---- gap Xs ----` at gaps ≥0.30s). THINK HARD and
|
|
33
|
-
list, with exact timestamps: every retake/false-start/stutter (and which take to KEEP),
|
|
34
|
-
every silence (head/inter-phrase/outro), the cold-open point, the intentional repeats.
|
|
35
|
-
When text and audio seem to disagree, `video-editing inspect --video vertical_src --start <a> --end <b>` and read the PNG.
|
|
36
|
-
3. **Write `<job>/edl.json`** — KEEP segments in source seconds; gaps between them are
|
|
37
|
-
the cuts. Snap every in/out to a transcript word boundary (lead ~0.05s, trail ~0.08s;
|
|
38
|
-
~0.03–0.05s at retake joins, clamped to stay inside the silence and never include a
|
|
39
|
-
false-start word). Ranges chronological, non-overlapping. `total_duration_s` = Σ(end−start).
|
|
40
|
-
**A retake range must END at the LAST CLEAN WORD before the abandoned attempt.**
|
|
41
|
-
4. **Render** `--mode preview`, then **verify** (Gate 2), fix, repeat. Finalize `--mode final`.
|
|
42
|
-
|
|
43
|
-
See `cli-reference.md` for exact commands, `hard-rules.md` for correctness, and
|
|
44
|
-
`scribe-collapse.md` / `adversarial-review.md` for the two gates.
|
|
3
|
+
The full editorial brief now arrives from the ClipReady cloud as `<job>/prompts/author-edl.prompt.md`
|
|
4
|
+
(pulled by `video-editing transcribe` / `files pull`). Read and follow the pulled prompts — this file is a stub.
|
|
@@ -1,38 +1,4 @@
|
|
|
1
|
-
# Hard rules (
|
|
1
|
+
# Hard rules (moved server-side)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
## The CLI guarantees (do not try to replicate by hand)
|
|
7
|
-
|
|
8
|
-
- **Per-segment extract → lossless `-c copy` concat** (no double-encode).
|
|
9
|
-
- **30ms audio fades at every segment boundary** (`afade` in/out) — which is why
|
|
10
|
-
tight pads (down to ~30ms) at retake joins are safe.
|
|
11
|
-
- **Loudnorm** to −14 LUFS / −1 dBTP / LRA 11 (two-pass for final, one-pass for preview).
|
|
12
|
-
- Subtitles, if ever enabled, are applied LAST in the filter chain.
|
|
13
|
-
- Word-level verbatim ASR with auto-heal; transcripts cached per source.
|
|
14
|
-
|
|
15
|
-
## EDL-authoring rules (yours to uphold)
|
|
16
|
-
|
|
17
|
-
- **Never cut inside a word.** Snap every edge to a transcript word boundary.
|
|
18
|
-
- **Pad every cut edge** (30–200ms). Scribe timestamps drift 50–100ms; padding absorbs it.
|
|
19
|
-
Tightest (~0.03–0.05s) at retake joins, staying inside the silence.
|
|
20
|
-
- A **retake range ends at the last clean word BEFORE the abandoned attempt.**
|
|
21
|
-
- Clipped tokens ending in `-` (`s-`, `re-`, `li-`) are danger zones — leave an 80–150ms
|
|
22
|
-
guard band before them when there's room.
|
|
23
|
-
- Keep the first token of the chosen take even if it's a connector ("and/so/but").
|
|
24
|
-
- `grade:"none"`, `overlays:[]`, no subtitles (clean-cut pass).
|
|
25
|
-
- Keep `total_duration_s` = Σ(end−start); ranges chronological + non-overlapping.
|
|
26
|
-
|
|
27
|
-
## The two mandatory gates
|
|
28
|
-
|
|
29
|
-
1. **SCREEN before cutting** — read `flags.txt`; resolve every [A], judge every [B]. See `scribe-collapse.md`.
|
|
30
|
-
2. **CONTENT-VERIFY after preview** — `video-editing verify`; a visual/waveform check alone
|
|
31
|
-
misses a retake left in. See `adversarial-review.md`.
|
|
32
|
-
|
|
33
|
-
## Anti-patterns (consistently fail)
|
|
34
|
-
|
|
35
|
-
- Trusting the transcript without screening it (Scribe collapses/drops hide retakes).
|
|
36
|
-
- Running ffmpeg or ad-hoc helper scripts by hand — forbidden; use only the `video-editing` CLI.
|
|
37
|
-
- A visual-only check at a retake join (the duplicated content reads as continuous clean audio).
|
|
38
|
-
- Re-transcribing an unchanged source (paid + pointless; it's cached).
|
|
3
|
+
The production-correctness rules now arrive from the ClipReady cloud inside `<job>/prompts/*.md`
|
|
4
|
+
(pulled by `video-editing transcribe` / `files pull`). Read and follow the pulled prompts — this file is a stub.
|
|
@@ -1,37 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Screening gate (moved server-side)
|
|
2
2
|
|
|
3
|
-
The
|
|
4
|
-
|
|
5
|
-
content in the cut.
|
|
6
|
-
|
|
7
|
-
## What happens
|
|
8
|
-
|
|
9
|
-
When Scribe hits a hard-to-segment chunk (fast speech, a stutter, a false start
|
|
10
|
-
immediately followed by the retake), it sometimes:
|
|
11
|
-
|
|
12
|
-
- **Collapses** the chunk into ONE over-long token (a "word" lasting >~1.2s), or
|
|
13
|
-
- **Drops** a stretch of audio silently — no tokens for that span.
|
|
14
|
-
|
|
15
|
-
Either way the retake is invisible in the text, a waveform looks fine, and the
|
|
16
|
-
cut "reads" clean — but the abandoned take is still in the render.
|
|
17
|
-
|
|
18
|
-
## How the CLI + you catch it
|
|
19
|
-
|
|
20
|
-
1. **`video-editing transcribe` auto-heals** most collapses/drops (re-transcribes the
|
|
21
|
-
suspect window in isolation and splices the recovered words back). Watch its log.
|
|
22
|
-
2. **`video-editing transcribe` writes `flags.txt`** — read it (Gate 1):
|
|
23
|
-
- **[A]** over-long / collapsed tokens (>~1.2s) — content is hidden inside one of these.
|
|
24
|
-
- **[B]** repeated phrases — the retake fingerprint (false starts, reworded restarts).
|
|
25
|
-
- **[C]** audio events + big gaps.
|
|
26
|
-
Resolve every [A]; judge every [B] (retake vs intentional).
|
|
27
|
-
3. **Verify coverage** via `coverage.json`: the last word must end within ~2s of the
|
|
28
|
-
media duration. If it ends well before EOF, a tail was dropped.
|
|
29
|
-
|
|
30
|
-
## When a span is still suspect
|
|
31
|
-
|
|
32
|
-
Inspect it: `video-editing inspect --job-dir <job> --video vertical_src --start <a> --end <b>`
|
|
33
|
-
and read the filmstrip+waveform PNG to see what was actually said before choosing the cut.
|
|
34
|
-
|
|
35
|
-
> Screening + inspecting suspicious windows is what isolates retakes Scribe collapsed
|
|
36
|
-
> into one token. Skipping it is the #1 cause of a "clean-looking" cut that still has a
|
|
37
|
-
> retake in it.
|
|
3
|
+
The transcript-screening procedure (Gate 1) now arrives from the ClipReady cloud inside `<job>/prompts/*.md`
|
|
4
|
+
(pulled by `video-editing transcribe` / `files pull`). Read and follow the pulled prompts — this file is a stub.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Every feature of the authored `<job>/timeline.json` (version 2), with one minimal JSON
|
|
4
4
|
example each. Validate with `video-editing timeline validate`; compile with
|
|
5
|
-
`timeline compile` (it resolves phrase anchors, derives caption cues
|
|
6
|
-
`resolved/plan.json`
|
|
5
|
+
`timeline compile` (cloud compile — it resolves phrase anchors, derives caption cues
|
|
6
|
+
and emits `resolved/plan.json`). Items all carry a unique `id`; word anchors
|
|
7
7
|
(`{type:"words", source, phrase}`) resolve via the transcript — use `timeline resolve`
|
|
8
8
|
to disambiguate. Capability status per feature: run `timeline validate` — `staged`
|
|
9
9
|
features compile but warn (render path not yet proven); `ready` features render via
|
|
Binary file
|