venice-video-harness 2.13.0 → 2.14.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.
Files changed (60) hide show
  1. package/{.claude → .agents}/agents/cut-qa.md +2 -2
  2. package/{.claude → .agents}/agents/ffmpeg-overlay.md +3 -3
  3. package/{.claude → .agents}/agents/overlay-designer.md +2 -2
  4. package/{.claude → .agents}/agents/prompt-engineer.md +1 -1
  5. package/{.claude → .agents}/agents/remotion-overlay.md +3 -4
  6. package/{.claude → .agents}/commands/edit-footage.md +5 -5
  7. package/{.claude → .agents}/commands/generate-trailer.md +1 -1
  8. package/{.claude → .agents}/skills/burn-in-subtitles/SKILL.md +4 -4
  9. package/{.claude → .agents}/skills/burn-in-subtitles/scripts/derive-captions.ts +2 -2
  10. package/{.claude → .agents}/skills/shot-composition/SKILL.md +1 -1
  11. package/{.claude → .agents}/skills/venice-agent-guide/SKILL.md +2 -2
  12. package/{.claude → .agents}/skills/venice-video-model-routing/README.md +3 -3
  13. package/{.claude → .agents}/skills/video-editing/SKILL.md +5 -5
  14. package/AGENTS.md +17 -17
  15. package/CHANGELOG.md +37 -0
  16. package/README.md +26 -21
  17. package/dist/agent/guide.js +3 -3
  18. package/dist/editing/self-eval.d.ts +1 -1
  19. package/dist/editing/self-eval.js +1 -1
  20. package/dist/editing/silence.d.ts +1 -1
  21. package/dist/editing/silence.js +1 -1
  22. package/dist/mini-drama/prompt-builder.d.ts +1 -1
  23. package/dist/mini-drama/prompt-builder.js +1 -1
  24. package/dist/storyboard/prompt-builder.d.ts +1 -1
  25. package/dist/storyboard/prompt-builder.js +1 -1
  26. package/package.json +4 -4
  27. /package/{.claude → .agents}/agents/art-director.md +0 -0
  28. /package/{.claude → .agents}/agents/screenplay-reader.md +0 -0
  29. /package/{.claude → .agents}/agents/storyboard-assembler.md +0 -0
  30. /package/{.claude → .agents}/agents/storyboard-qa.md +0 -0
  31. /package/{.claude → .agents}/agents/trailer-curator.md +0 -0
  32. /package/{.claude → .agents}/commands/add-character.md +0 -0
  33. /package/{.claude → .agents}/commands/assemble-episode.md +0 -0
  34. /package/{.claude → .agents}/commands/audition-voices.md +0 -0
  35. /package/{.claude → .agents}/commands/explore-aesthetic.md +0 -0
  36. /package/{.claude → .agents}/commands/fix-panel.md +0 -0
  37. /package/{.claude → .agents}/commands/generate-episode-videos.md +0 -0
  38. /package/{.claude → .agents}/commands/generate-videos.md +0 -0
  39. /package/{.claude → .agents}/commands/ingest-screenplay.md +0 -0
  40. /package/{.claude → .agents}/commands/lock-character.md +0 -0
  41. /package/{.claude → .agents}/commands/lock-characters.md +0 -0
  42. /package/{.claude → .agents}/commands/new-series.md +0 -0
  43. /package/{.claude → .agents}/commands/produce-episode.md +0 -0
  44. /package/{.claude → .agents}/commands/qa-storyboard.md +0 -0
  45. /package/{.claude → .agents}/commands/set-aesthetic.md +0 -0
  46. /package/{.claude → .agents}/commands/storyboard-all.md +0 -0
  47. /package/{.claude → .agents}/commands/storyboard-episode.md +0 -0
  48. /package/{.claude → .agents}/commands/storyboard-scene.md +0 -0
  49. /package/{.claude → .agents}/commands/workshop-episode.md +0 -0
  50. /package/{.claude → .agents}/skills/character-consistency/SKILL.md +0 -0
  51. /package/{.claude → .agents}/skills/screenplay-parsing/SKILL.md +0 -0
  52. /package/{.claude → .agents}/skills/venice-api/SKILL.md +0 -0
  53. /package/{.claude → .agents}/skills/venice-ui-production/SKILL.md +0 -0
  54. /package/{.claude → .agents}/skills/venice-video-model-routing/SKILL.md +0 -0
  55. /package/{.claude → .agents}/skills/venice-video-model-routing/references/decision-trees.md +0 -0
  56. /package/{.claude → .agents}/skills/venice-video-model-routing/scripts/venice-edit.py +0 -0
  57. /package/{.claude → .agents}/skills/venice-video-model-routing/scripts/venice-image.py +0 -0
  58. /package/{.claude → .agents}/skills/venice-video-model-routing/scripts/venice-upscale.py +0 -0
  59. /package/{.claude → .agents}/skills/venice-video-model-routing/scripts/venice-video.py +0 -0
  60. /package/{.claude → .agents}/skills/venice-video-model-routing/scripts/venice_common.py +0 -0
@@ -126,8 +126,8 @@ Next: applying 3 fixes -> re-render -> iteration 2.
126
126
 
127
127
  ## See Also
128
128
 
129
- - `.claude/skills/video-editing/SKILL.md` — the pipeline this agent plugs into
130
- - `.claude/skills/burn-in-subtitles/SKILL.md` — caption derivation the agent may trigger re-runs of
129
+ - `.agents/skills/video-editing/SKILL.md` — the pipeline this agent plugs into
130
+ - `.agents/skills/burn-in-subtitles/SKILL.md` — caption derivation the agent may trigger re-runs of
131
131
  - `scripts/timeline-view.ts` — the composite tool this agent uses
132
132
  - `src/editing/types.ts` → `CutQaFinding`, `CutQaReport`
133
133
  - `AGENTS.md` anti-patterns #5, #7, #10, rule 26
@@ -103,6 +103,6 @@ On unsuitable overlay (e.g. `logo-bug` spec), return:
103
103
  ## See Also
104
104
 
105
105
  - [`scripts/render-overlay.ts`](../../scripts/render-overlay.ts) — the consumer of these specs
106
- - `.claude/agents/overlay-designer.md` — parent agent
107
- - `.claude/agents/remotion-overlay.md` — sibling for animated overlays
108
- - `.claude/skills/burn-in-subtitles/SKILL.md` — drawtext escaping gotchas learned in production
106
+ - `.agents/agents/overlay-designer.md` — parent agent
107
+ - `.agents/agents/remotion-overlay.md` — sibling for animated overlays
108
+ - `.agents/skills/burn-in-subtitles/SKILL.md` — drawtext escaping gotchas learned in production
@@ -111,8 +111,8 @@ Return to the calling agent:
111
111
 
112
112
  ## See Also
113
113
 
114
- - [`.claude/agents/remotion-overlay.md`](remotion-overlay.md) — animated overlay worker
115
- - [`.claude/agents/ffmpeg-overlay.md`](ffmpeg-overlay.md) — static overlay worker
114
+ - [`.agents/agents/remotion-overlay.md`](remotion-overlay.md) — animated overlay worker
115
+ - [`.agents/agents/ffmpeg-overlay.md`](ffmpeg-overlay.md) — static overlay worker
116
116
  - [`scripts/render-overlay.ts`](../../scripts/render-overlay.ts) — the compositing tool
117
117
  - [`src/editing/overlays.ts`](../../src/editing/overlays.ts) — manifest type definitions
118
118
  - AGENTS.md rules 17, anti-pattern #9, anti-pattern #11
@@ -7,7 +7,7 @@ Before filling any template below, decide what the shot is *doing* — the turn,
7
7
  - Decorated (avoid): `epic cinematic close-up of a woman reading a letter, emotional, beautiful lighting`
8
8
  - Directed (do this): `Medium close-up, eye-level; she lowers the letter and her hands go still as a slow push-in arrives; soft window light keeps her face plain; near-silence with one chair scrape — the realization lands in the stilled hands, not a word.`
9
9
 
10
- If the **Seedance 2.0 Skill OS** is installed (see this repo's README "Directing layer"; typical path `.claude/skills/seedance-20/`), load its `directing-engine` for the full derivation method and worked genre examples, `seedance-antislop` + `vocab/*` to strip empty boosters, and `retake-protocol` when a take is close but not right. The templates below are the *container*; the directing engine decides what goes in them.
10
+ If the **Seedance 2.0 Skill OS** is installed (see this repo's README "Directing layer"; typical path `.agents/skills/seedance-20/`), load its `directing-engine` for the full derivation method and worked genre examples, `seedance-antislop` + `vocab/*` to strip empty boosters, and `retake-protocol` when a take is close but not right. The templates below are the *container*; the directing engine decides what goes in them.
11
11
 
12
12
  **Division of labor with the harness:** identity is locked by R2V references + the Seedance → Wan keyframe pass, and durations/model routing are decided at generation time. So direct **intention/camera/light/blocking/performance/sound**; let the pipeline own identity, duration, and routing.
13
13
 
@@ -97,8 +97,7 @@ On failure, return `{ "id": "...", "error": "<message>" }` — the parent decide
97
97
 
98
98
  ## See Also
99
99
 
100
- - `~/.claude/skills/remotion/SKILL.md` — Remotion best practices
101
- - `~/.claude/skills/remotion-best-practices/SKILL.md` — deeper patterns
102
- - `.claude/agents/overlay-designer.md` — parent agent
103
- - `.claude/agents/ffmpeg-overlay.md` — sibling worker for static overlays
100
+ - `remotion` / `remotion-best-practices` skills, if installed in your runner's global skills dir (e.g. `~/.claude/skills/`, `~/.hermes/skills/`) — Remotion best practices and deeper patterns
101
+ - `.agents/agents/overlay-designer.md` — parent agent
102
+ - `.agents/agents/ffmpeg-overlay.md` — sibling worker for static overlays
104
103
  - AGENTS.md rules 17, anti-patterns #9, #11
@@ -139,7 +139,7 @@ session.iterations.push(report);
139
139
  saveSession(session, 'output/<project>/edit/session.json');
140
140
  ```
141
141
 
142
- Then invoke `.claude/agents/cut-qa.md` with the report. The agent proposes fixes, you apply them to the EDL, and re-render.
142
+ Then invoke `.agents/agents/cut-qa.md` with the report. The agent proposes fixes, you apply them to the EDL, and re-render.
143
143
 
144
144
  **Max 3 iterations.** If the 3rd iteration still has `fail`-severity findings, stop and surface to the user with:
145
145
 
@@ -152,7 +152,7 @@ Then invoke `.claude/agents/cut-qa.md` with the report. The agent proposes fixes
152
152
  Always ask "Burn in subtitles? (yes / no)" before running the captioning step, per the [burn-in-subtitles skill](../skills/burn-in-subtitles/SKILL.md). If yes:
153
153
 
154
154
  ```bash
155
- npx tsx .claude/skills/burn-in-subtitles/scripts/derive-captions.ts \
155
+ npx tsx .agents/skills/burn-in-subtitles/scripts/derive-captions.ts \
156
156
  --vo output/<project>/edit/final-edit.mp4 \
157
157
  --vo-text-file scripts/<project>/config.ts \
158
158
  --vo-delay 0
@@ -189,8 +189,8 @@ Report back to the user with:
189
189
 
190
190
  ## See Also
191
191
 
192
- - [`.claude/skills/video-editing/SKILL.md`](../skills/video-editing/SKILL.md) — the full philosophy and rules
193
- - [`.claude/skills/burn-in-subtitles/SKILL.md`](../skills/burn-in-subtitles/SKILL.md) — caption derivation
194
- - [`.claude/agents/cut-qa.md`](../agents/cut-qa.md) — the QA agent invoked in step 5
192
+ - [`.agents/skills/video-editing/SKILL.md`](../skills/video-editing/SKILL.md) — the full philosophy and rules
193
+ - [`.agents/skills/burn-in-subtitles/SKILL.md`](../skills/burn-in-subtitles/SKILL.md) — caption derivation
194
+ - [`.agents/agents/cut-qa.md`](../agents/cut-qa.md) — the QA agent invoked in step 5
195
195
  - [`src/editing/types.ts`](../../src/editing/types.ts) — EDL, Take, Session type definitions
196
196
  - `AGENTS.md` rule 26 — VO truncation cause and cure
@@ -18,7 +18,7 @@ Analyze the screenplay and generate a curated trailer -- selecting the most comp
18
18
  1. Load `project.json` and read all scene data
19
19
  2. Analyze the dramatic arc: world, inciting incident, protagonist journey, central tension
20
20
  3. Identify the most visually striking and emotionally resonant moments
21
- 4. Follow the trailer-curator agent's methodology (see `.claude/agents/trailer-curator.md`)
21
+ 4. Follow the trailer-curator agent's methodology (see `.agents/agents/trailer-curator.md`)
22
22
 
23
23
  ### Phase 2: Shot List Curation
24
24
  1. Select 10-15 shots (1m) or 25-40 shots (3m) from across the screenplay
@@ -105,7 +105,7 @@ Threshold guidance:
105
105
  This skill ships a TypeScript helper that does the silence detection AND prints a drop-in `CAPTIONS` array:
106
106
 
107
107
  ```bash
108
- npx tsx .claude/skills/burn-in-subtitles/scripts/derive-captions.ts \
108
+ npx tsx .agents/skills/burn-in-subtitles/scripts/derive-captions.ts \
109
109
  --vo output/<project>/audio/vo.mp3 \
110
110
  --vo-text-file scripts/<project>/config.ts \
111
111
  --vo-delay 1.5 \
@@ -272,13 +272,13 @@ Even with silence-detect-derived timings, verify by extracting a frame at each p
272
272
  | Render VO | `npx tsx scripts/<project>/04-audio.ts --only=vo --force` |
273
273
  | Measure VO | `ffprobe -v error -show_entries format=duration ...` |
274
274
  | Detect phrase boundaries | `ffmpeg -af "silencedetect=noise=-30dB:d=0.18"` |
275
- | Generate CAPTIONS array | `npx tsx .claude/skills/burn-in-subtitles/scripts/derive-captions.ts ...` |
275
+ | Generate CAPTIONS array | `npx tsx .agents/skills/burn-in-subtitles/scripts/derive-captions.ts ...` |
276
276
  | Paste into config.ts | manual |
277
277
  | Re-assemble trailer | `npx tsx scripts/<project>/05-assemble.ts --force` |
278
278
  | Verify spot frames | `ffmpeg -ss <caption.start> -i trailer-final.mp4 -frames:v 1` |
279
279
 
280
280
  ## See Also
281
281
 
282
- - `.claude/skills/venice-api/SKILL.md` — Venice TTS endpoints and voice catalog
283
- - `.claude/skills/venice-video-model-routing/SKILL.md` — model selection for the underlying video
282
+ - `.agents/skills/venice-api/SKILL.md` — Venice TTS endpoints and voice catalog
283
+ - `.agents/skills/venice-video-model-routing/SKILL.md` — model selection for the underlying video
284
284
  - `AGENTS.md` § "Learned Anti-Patterns" — broader harness lessons
@@ -9,7 +9,7 @@
9
9
  * time.
10
10
  *
11
11
  * Usage:
12
- * npx tsx .claude/skills/burn-in-subtitles/scripts/derive-captions.ts \
12
+ * npx tsx .agents/skills/burn-in-subtitles/scripts/derive-captions.ts \
13
13
  * --vo output/<project>/audio/vo.mp3 \
14
14
  * --vo-text-file scripts/<project>/config.ts \
15
15
  * --vo-delay 1.5 \
@@ -339,7 +339,7 @@ function formatCaptionsArray(captions: Caption[]): string {
339
339
  });
340
340
  return [
341
341
  "/**",
342
- " * Caption rows (auto-derived by .claude/skills/burn-in-subtitles/scripts/derive-captions.ts).",
342
+ " * Caption rows (auto-derived by .agents/skills/burn-in-subtitles/scripts/derive-captions.ts).",
343
343
  " * Re-derive whenever the VO file changes — never hand-edit timings.",
344
344
  " */",
345
345
  "export const CAPTIONS: Array<{ text: string; start: number; end: number }> = [",
@@ -7,7 +7,7 @@ Plan cinematic shot lists for screenplay scenes, determining shot types, camera
7
7
 
8
8
  Shot type, angle, movement, and lens are *consequences*, not starting points. Before you pick from the tables below, name what the beat is **doing** (a reveal, a goodbye, a power flip, a lie) and its **one intention**. A reveal is not framed, lit, blocked, or moved like a goodbye — derive the coverage from the intention instead of defaulting to "coverage that looks cinematic." Hold one directorial voice across the scene.
9
9
 
10
- When the **Seedance 2.0 Skill OS** is installed (`.claude/skills/seedance-20/`), load `directing-engine` for the derivation method, and use `retake-protocol` (triage the verdict, change one variable, keep an attempt budget) and `continuation-handoff` (direct the next beat from accepted footage, not the original plan) when iterating. See this repo's README "Directing layer."
10
+ When the **Seedance 2.0 Skill OS** is installed (`.agents/skills/seedance-20/`), load `directing-engine` for the derivation method, and use `retake-protocol` (triage the verdict, change one variable, keep an attempt budget) and `continuation-handoff` (direct the next beat from accepted footage, not the original plan) when iterating. See this repo's README "Directing layer."
11
11
 
12
12
  ## Shot Types
13
13
  | Type | Use Case | Lens |
@@ -40,6 +40,6 @@ in the other.
40
40
 
41
41
  ## Where the full knowledge lives
42
42
  - `AGENTS.md` — 49 rules and 28 production anti-patterns, shipped in the package.
43
- - `.claude/skills/` — `venice-api`, `venice-video-model-routing`, `character-consistency`, `shot-composition`, `burn-in-subtitles`, `video-editing`, and more.
44
- - `.claude/commands/` — 20 step-by-step playbooks; `.claude/agents/` — 10 sub-agent roles.
43
+ - `.agents/skills/` — `venice-api`, `venice-video-model-routing`, `character-consistency`, `shot-composition`, `burn-in-subtitles`, `video-editing`, and more.
44
+ - `.agents/commands/` — 20 step-by-step playbooks; `.agents/agents/` — 10 sub-agent roles.
45
45
  - Read the relevant playbook before running a workflow. Validate model capabilities against `src/venice/models.ts` before an API call.
@@ -1,6 +1,6 @@
1
1
  # Venice Video Model Routing for Character Consistency
2
2
 
3
- A Claude Code agent skill that combines Venice AI media generation tools with intelligent model routing for character consistency. Includes executable Python scripts for image generation, video generation, image editing, and upscaling, plus decision trees for choosing the right model, reference images, frame sources, and prompt format for every shot.
3
+ An agent skill (usable by any coding agent — Claude Code, Cursor, Hermes, OpenClaw, and others) that combines Venice AI media generation tools with intelligent model routing for character consistency. Includes executable Python scripts for image generation, video generation, image editing, and upscaling, plus decision trees for choosing the right model, reference images, frame sources, and prompt format for every shot.
4
4
 
5
5
  Based on the [venice-ai-media](https://github.com/openclaw/skills/tree/main/skills/nhannah/venice-ai-media) skill by [@nhannah](https://github.com/nhannah) for generation execution, extended with production-tested model routing logic for multi-shot character consistency.
6
6
 
@@ -87,13 +87,13 @@ Previous last frame (continuity priority):
87
87
  Clone into your project's skills directory:
88
88
 
89
89
  ```bash
90
- git clone https://github.com/jordanurbs/venice-video-model-routing.git your-project/.claude/skills/venice-video-model-routing/
90
+ git clone https://github.com/jordanurbs/venice-video-model-routing.git your-project/.agents/skills/venice-video-model-routing/
91
91
  ```
92
92
 
93
93
  Or copy manually:
94
94
 
95
95
  ```bash
96
- cp -r venice-video-model-routing/ your-project/.claude/skills/venice-video-model-routing/
96
+ cp -r venice-video-model-routing/ your-project/.agents/skills/venice-video-model-routing/
97
97
  ```
98
98
 
99
99
  ## Skill Structure
@@ -133,7 +133,7 @@ Archive-first per workspace rule `.cursor/rules/shot-asset-safety.mdc`: if `fina
133
133
 
134
134
  ### Step 5 — Self-Eval via cut-qa
135
135
 
136
- After the render, spawn the `cut-qa` agent (see `.claude/agents/cut-qa.md`). It checks:
136
+ After the render, spawn the `cut-qa` agent (see `.agents/agents/cut-qa.md`). It checks:
137
137
 
138
138
  | Check | Trigger |
139
139
  |-------|---------|
@@ -222,9 +222,9 @@ Fix: ALWAYS propose-then-confirm. The render is cheap; regenerating a 20-minute
222
222
 
223
223
  ## See Also
224
224
 
225
- - `.claude/skills/burn-in-subtitles/SKILL.md` — downstream captioning
226
- - `.claude/skills/venice-video-model-routing/SKILL.md` — generation side for insert shots
227
- - `.claude/agents/cut-qa.md` — post-render QA agent
228
- - `.claude/commands/edit-footage.md` — end-to-end playbook
225
+ - `.agents/skills/burn-in-subtitles/SKILL.md` — downstream captioning
226
+ - `.agents/skills/venice-video-model-routing/SKILL.md` — generation side for insert shots
227
+ - `.agents/agents/cut-qa.md` — post-render QA agent
228
+ - `.agents/commands/edit-footage.md` — end-to-end playbook
229
229
  - `src/editing/types.ts` — EDL, Take, EditSession type definitions
230
230
  - `.cursor/rules/shot-asset-safety.mdc` — archive-first rule
package/AGENTS.md CHANGED
@@ -10,7 +10,7 @@ The shared `VENICE_API_KEY` lives in `.env` and is sourced by many scripts: do n
10
10
 
11
11
  1. Helps an agent plan and execute consistency-first Venice video workflows
12
12
  2. Supports recurring characters, locked visual systems, and reference-driven generation
13
- 3. Provides reusable orchestration through `AGENTS.md` plus the playbooks, sub-agent definitions, and skills in `.claude/` (a directory name kept for compatibility — the contents are agent-neutral markdown)
13
+ 3. Provides reusable orchestration through `AGENTS.md` plus the playbooks, sub-agent definitions, and skills in `.agents/` (provider-neutral markdown — usable by any coding agent, renamed from `.claude/` in 2.14.0)
14
14
  4. Includes a comprehensive model registry covering 50+ Venice video, image, audio, and music models
15
15
  5. Includes a working narrative reference implementation in `src/mini-drama/`
16
16
  6. Preserves generated media by archiving instead of destructively replacing
@@ -34,8 +34,8 @@ This harness is not limited to any single video format. It supports:
34
34
  The intended interface is:
35
35
  - Natural-language requests to the agent
36
36
  - Orchestration rules in `AGENTS.md`
37
- - Workflow playbooks in `.claude/commands/`
38
- - Reusable Venice knowledge in `.claude/skills/`
37
+ - Workflow playbooks in `.agents/commands/`
38
+ - Reusable Venice knowledge in `.agents/skills/`
39
39
  - Underlying TypeScript and script execution in `src/` and `scripts/`
40
40
 
41
41
  The CLI and scripts are the execution layer underneath the harness, not the primary user interface.
@@ -288,10 +288,10 @@ Inspired by [browser-use/video-use](https://github.com/browser-use/video-use), t
288
288
 
289
289
  ### Key Files
290
290
 
291
- - `.claude/skills/video-editing/SKILL.md` — full philosophy, EDL format, anti-patterns
292
- - `.claude/commands/edit-footage.md` — end-to-end playbook
293
- - `.claude/agents/cut-qa.md` — post-render quality gate
294
- - `.claude/agents/overlay-designer.md` — branded motion-graphics planner
291
+ - `.agents/skills/video-editing/SKILL.md` — full philosophy, EDL format, anti-patterns
292
+ - `.agents/commands/edit-footage.md` — end-to-end playbook
293
+ - `.agents/agents/cut-qa.md` — post-render quality gate
294
+ - `.agents/agents/overlay-designer.md` — branded motion-graphics planner
295
295
  - `src/editing/` — type definitions, packer, aligner, EDL renderer, self-eval
296
296
  - `scripts/transcribe-sources.ts` — transcription CLI
297
297
  - `scripts/timeline-view.ts` — filmstrip + waveform + word-labels composite
@@ -390,9 +390,9 @@ Use `POST /video/quote` (via `quoteVideo()`) to estimate costs before committing
390
390
  22. **Seedance excels at physics-aware prompting.** Describe forces, not just actions — "tires smoke as car drifts 90 degrees" rather than "car turns." Friction, weight, material interactions, and contact physics produce better results with Seedance's physics-aware training.
391
391
  23. **3+ character shots auto-fallback to Kling O3 R2V.** When the default R2V model is Seedance (flat refs, max 4 images), shots with 3+ characters automatically fall back to Kling O3 R2V which supports structured `elements` for better per-character identity separation.
392
392
  24. **Seedance accepts face-bearing input images from ANY image family (2026-07).** Venice removed the old restriction that Seedance 2.0 only accepted face-bearing images produced by `seedream-v5-lite` / `seedream-v5-lite-edit`. There is no longer any seedream requirement: generate character portraits, character panels, and references with the global default `nano-banana-2` (or any family you prefer) and feed them straight to Seedance. The provenance-driven pre-flight gate is now a no-op (`ensureSeedanceCompatibility` always proceeds) and `seedanceCompatibility` is no longer auto-set. Provenance sidecars are still written as metadata but nothing gates on them. (Historical context: anti-pattern 13.) The Seedance face **consent** attestation (409 `needs_consent`) is unrelated and still handled at queue time.
393
- 25. **Always ask before burning in subtitles.** Before assembling the final video on any project that includes a VO track, ask the user "Burn in subtitles? (yes / no)" — burn-in is a permanent baked-into-pixels decision and is not always wanted. If yes, follow `.claude/skills/burn-in-subtitles/SKILL.md`: never hand-estimate caption timings, always derive them from `ffmpeg silencedetect` on the rendered VO via `.claude/skills/burn-in-subtitles/scripts/derive-captions.ts`, and use single `...` ellipses only in TTS VO_TEXT (doubled `......` cause Kokoro/ElevenLabs to silently truncate the audio).
393
+ 25. **Always ask before burning in subtitles.** Before assembling the final video on any project that includes a VO track, ask the user "Burn in subtitles? (yes / no)" — burn-in is a permanent baked-into-pixels decision and is not always wanted. If yes, follow `.agents/skills/burn-in-subtitles/SKILL.md`: never hand-estimate caption timings, always derive them from `ffmpeg silencedetect` on the rendered VO via `.agents/skills/burn-in-subtitles/scripts/derive-captions.ts`, and use single `...` ellipses only in TTS VO_TEXT (doubled `......` cause Kokoro/ElevenLabs to silently truncate the audio).
394
394
  26. **Never use doubled ellipses in TTS VO scripts.** Kokoro and ElevenLabs handle single `...` reliably as breath gaps. Doubled `......` cause silent truncation — the audio file ends mid-script with no error, and you only catch it when downstream captions reference dropped text. Use commas + single `...` for combined rhythm, or break across multiple TTS calls and concat with ffmpeg `apad`.
395
- 27. **Editing pipeline is text-first.** When the task is to cut / trim / re-order existing media (not synthesize new shots), always transcribe sources first via `scripts/transcribe-sources.ts` and reason over `takes_packed.md`. Call `scripts/timeline-view.ts` ONLY at explicit decision points — never frame-dump to browse the footage. See `.claude/skills/video-editing/SKILL.md`.
395
+ 27. **Editing pipeline is text-first.** When the task is to cut / trim / re-order existing media (not synthesize new shots), always transcribe sources first via `scripts/transcribe-sources.ts` and reason over `takes_packed.md`. Call `scripts/timeline-view.ts` ONLY at explicit decision points — never frame-dump to browse the footage. See `.agents/skills/video-editing/SKILL.md`.
396
396
  28. **Never render an EDL without user confirmation of the cut strategy.** Post a summary (sources, duration, trim rules, transitions) and wait for "yes" before calling `renderEdl()`. The render is cheap; a throwaway 15-minute render because intent was guessed is not. Mirrors video-use design principle 3.
397
397
  29. **Always run cut-qa after every assembly / edit render.** The `cut-qa` agent runs programmatic checks (aspect, visual jump, VO truncation, **dialogue/VO overlap** — assert no two spoken clips play simultaneously, see rule 35, lighting, audio pop, subtitle overlap) at cut boundaries. Max 3 fix iterations before surfacing to the user. Applies to BOTH the generation-pipeline assembler and the editing-pipeline render.
398
398
  30. **Overlays are a post-process, never baked into the EDL render.** Lower-thirds, title cards, chapter markers, and logo-bugs live in an `OverlayManifest` rendered via `scripts/render-overlay.ts` on top of `final-edit.mp4`. Changing overlay wording must not require re-rendering the cut.
@@ -403,7 +403,7 @@ Use `POST /video/quote` (via `quoteVideo()`) to estimate costs before committing
403
403
  35. **Schedule dialogue/VO with a global no-overlap scheduler driven by MEASURED clip durations — never by the script's planned shot lengths.** At assembly time, two audio clips may never play at once unless they are intentionally layered (e.g. a music bed vs a line). Build the schedule against the actual `ffprobe` duration of each rendered/normalized segment, not the `duration` field in the script (the rendered clip is almost always shorter or longer than its planned slot). Algorithm: walk shots in timeline order keeping a single `nextFreeSec` cursor; place each line at `max(shotStart + lead, nextFreeSec + gap)`; set `nextFreeSec = placedStart + audioDur`; use one cursor for ALL spoken lines regardless of speaker (narrator AND character) — a per-speaker cursor is the classic bug (see anti-pattern 19). Keep a small `gap` (≈0.2-0.3s) between consecutive lines. SFX and the music bed are exempt because they are meant to underlay. After mixing, verify with the cut-qa overlap check.
404
404
  36. **Author VO so each line fits its shot, and when it can't, extend the picture — never let audio bleed into the next shot.** A line of TTS runs ≈2.3-2.7 words/sec plus ~0.4s lead-in; budget `shotSeconds × 2.4` words and write to it. If a finished line is longer than its shot's video, the assembler must (a) extend that shot by freezing/holding its last frame to cover the audio (`ffmpeg tpad=stop_mode=clone:stop_duration=...`), or (b) the line must be shortened/split — it must NOT spill onto the next shot. Long narrator lines over short establishing shots are the usual offender; either tighten the narration or hold the frame. This is the authoring complement to the scheduler in rule 35.
405
405
  37. **Re-anchor every separately-rendered shot to the SAME locked references and restate the character's invariant traits in every prompt.** Identity, scale, palette, and wardrobe drift across independently generated shots even when the story is continuous. For each shot pass the identical canonical `reference_image_urls` (not a frame grabbed from a different shot), and repeat the character's fixed traits inline every time (markings, hair color, costume, and **relative size** — e.g. "as tall as the boy"). Size is a trait the model forgets most: if a character's scale changed in-story (grew/shrank), encode a `sizeState` per shot and state it explicitly. Prefer Seedance native multi-shot (rule 21) for consecutive beats precisely because identity/scale/lighting hold within one generation; across separate renders, the per-prompt trait restatement is what holds them together. Verify drift on a contact sheet of first-frames before assembling (see anti-pattern 20).
406
- 38. **Direct the scene, don't decorate it.** Before writing any shot's `description` or `delivery` — in `workshop-episode`, `insert-shot`, or a manual `script.json` edit — decide what the beat is DOING (the turn, POV, power, subtext) and name ONE intention, then derive camera/light/blocking/performance/sound from it. Do not stack "cinematic / epic / beautiful / masterpiece / 4k" adjectives; they give the model nothing to serve. Hold one directorial voice across the episode. This is baked into the `workshop-episode` system prompt (`src/mini-drama/cli.ts`) so both the CLI and the venice-video-mcp `episode.workshop` inherit it. Direct **intention/camera/light/blocking/performance/sound only** — identity is locked downstream (rules 9, 19, 32), so never hand-write full physical character descriptions or reference-image tags into `description`. When a take is close-but-wrong, fix ONE variable at a time; when continuing, direct from the accepted footage's real ending, not the original plan. The optional **Seedance 2.0 Skill OS** (install into `.claude/skills/seedance-20/`; see README "Directing layer") supplies the full `directing-engine`, `retake-protocol`, `continuation-handoff`, `seedance-copyright`, and `seedance-antislop` behind this rule; ignore its non-Venice surface/API references.
406
+ 38. **Direct the scene, don't decorate it.** Before writing any shot's `description` or `delivery` — in `workshop-episode`, `insert-shot`, or a manual `script.json` edit — decide what the beat is DOING (the turn, POV, power, subtext) and name ONE intention, then derive camera/light/blocking/performance/sound from it. Do not stack "cinematic / epic / beautiful / masterpiece / 4k" adjectives; they give the model nothing to serve. Hold one directorial voice across the episode. This is baked into the `workshop-episode` system prompt (`src/mini-drama/cli.ts`) so both the CLI and the venice-video-mcp `episode.workshop` inherit it. Direct **intention/camera/light/blocking/performance/sound only** — identity is locked downstream (rules 9, 19, 32), so never hand-write full physical character descriptions or reference-image tags into `description`. When a take is close-but-wrong, fix ONE variable at a time; when continuing, direct from the accepted footage's real ending, not the original plan. The optional **Seedance 2.0 Skill OS** (install into `.agents/skills/seedance-20/`; see README "Directing layer") supplies the full `directing-engine`, `retake-protocol`, `continuation-handoff`, `seedance-copyright`, and `seedance-antislop` behind this rule; ignore its non-Venice surface/API references.
407
407
  39. **Every AI pass writes a recipe sidecar; finishing passes must append to it.** Each generated/edited asset gets `shot-NNN.recipe.json` (via `appendRecipePass()` in `src/venice/recipe.ts`) — an append-only log where every entry is a replayable Venice call: kind (`generate` / `multi-edit` / `video-generate` / `mechanical`), role (`content` / `identity` / `look` / `mechanical`), model, prompt, negative, seed, cfg, and reference-image paths (stable on-disk paths, never data: URIs). The harness writes it automatically for character refs, storyboard passes 1–3, the seedance launder pass, keyframe extraction, and video renders. **Finishing convention:** shots are finished with AI model calls, not local pixel edits — any post-harness polish/fix pass (agent, MCP, one-off script) must go through `appendRecipePass()` too, which also updates the provenance sidecar in the same write so the Seedance gate stays honest. Roles make finishing safe: `look` passes can be redone freely; `identity` passes (character refine, R2V anchors, seeds, `@Image` mappings) must not be disturbed by a look polish; redoing a `content` pass invalidates everything after it. To regenerate a shot that matches the episode, replay its recipe (same STYLE string, seed, cfg, refs, style anchor — the `.style-anchor.png` in each scene dir is intentionally kept on disk) instead of hand-prompting. The pass-1 `--debug` prompt dump is superseded by this; the recipe is always written.
408
408
  40. **Dialogue shots on reference-audio-capable models carry a per-character voice-donor clip (`reference_audio_urls`, bound in-prompt as @AudioN).** When a shot routes to a reference-audio model (Seedance 2.0 R2V family, HappyHorse 1.1 R2V) and the speaker is a visible non-narrator character, the harness attaches that character's voice reference so the native model dialogue keeps the same timbre/accent/pacing across shots. The clip lives at `characters/<slug>/voice-reference.mp3` — generated on demand via `seed-audio-1-0` from the character's `voiceDescription` (or supplied by the operator). The generator auto-creates a missing clip inline before rendering (mirroring the inline dialogue-TTS pattern) and persists `voiceReferencePath` to `character.json`. Wire-in rules: Venice REQUIRES ≥1 reference image alongside reference audio (audio-only is rejected), each clip is 2-15s with an aggregate ≤15s across ≤3 clips (out-of-budget clips dropped + warned), and the @AudioN index in the prompt MUST match the push order into `reference_audio_urls`. The prompt binds it as "Use @Audio1 only for voice identity — timbre, accent, pacing; regenerate clean studio dialogue" so the model doesn't copy any junk-tail noise. Opt-outs: `generate-videos --no-voice-reference`, or series-wide `videoDefaults.voiceReferenceForDialogue: false`. Explicit clips: `generate-voice-reference` / `lock-character --voice-reference <file>` (CLI), `character { action: "generate_voice_reference" }` / `character { action: "lock", voiceReference }` (MCP). Wan 2.7 lip-sync shots do NOT take reference audio — they get `audio_url` instead (rule 32).
409
409
  41. **Locations are first-class entities with generated reference images, folded into panels and video like character refs.** A `Location` (name, slug, description, lightingNotes, seed) carries 3 faceless reference angles (`wide` / `medium` / `detail`, generated with `nano-banana-pro`, provenance `hasFace:false`) under `locations/<slug>/`. Tag any shot with `location: <slug>`. Effects: (a) **storyboard Pass 1** injects the location's locked `description` + `lightingNotes` into the panel prompt (serves anti-pattern 7) and adds the wide/medium ref as an environment anchor (closer shot types prefer `medium.png`); (b) **Pass 2 refine** prefers the location ref as the environment/style anchor (characters first, location takes the last free slot); (c) **video**: Kling O3 R2V shots auto-populate `scene_image_urls` from the location (hand-set `sceneImagePaths` override wins); Seedance / HappyHorse (no `scene_image_urls`) get location angles via the reference slot planner (`reference-slots.ts`) — up to ALL THREE angles (wide → medium → detail, closer shot types lead with medium) land in `reference_image_urls` with per-angle `@ImageN` role clauses ("a second angle of the same location"), within the 9-image budget. Create locations with `add-location` / `generate-location-references` (CLI) or the `location` MCP tool (`add` / `generate_references` / `list`). `workshop-episode` also emits a `locations[]` array, tags every shot with a slug, and auto-generates any missing refs right after saving the draft (cost logged). Reuse existing slugs across episodes instead of redefining a place.
@@ -420,7 +420,7 @@ Use `POST /video/quote` (via `quoteVideo()`) to estimate costs before committing
420
420
 
421
421
  47. **Ask a model for JSON through `client.chatJson()`, never by parsing `post()` yourself.** Reasoning models are now the default, and three things break naive parsing: fences appear inconsistently; some models emit *almost* valid JSON (GLM 5.2 drops a closing brace roughly one attempt in three); and a model with no vision answers an image prompt with an empty string or an opaque 400 rather than a useful error. `chatJson` strips fences, retries once quoting the parse error back to the model, and names the no-vision case explicitly. Related: `describeApiError()` reads all three Venice error shapes — `{error:"..."}`, `{error:{message}}`, and `{issues:[{message}]}` — because reading only `error.message` discarded both the "Did you mean: …" model-not-found hint and the "Image content is not supported by this model" validation message, leaving operators with a bare HTTP status. Reasoning also costs tokens from `max_tokens`, so a budget sized for a plain model can return empty content.
422
422
 
423
- 48. **The CLI is self-describing — discover state and order from it, do not guess.** `venice-video agent-guide [--json]` prints the core operating rules (this section in miniature) and ships inside the binary, so it is available even on a bare global install with no `AGENTS.md`. `venice-video pipeline [--json]` prints the ordered stages, their gates, and the command that advances each; it mirrors `classifyEpisode` in `src/session/status.ts` (rule 45 — change both together). `venice-video status -p <project> [--json]` reports where a project stands and the next command. `--json` is supported on `status`, `pipeline`, `agent-guide`, `doctor`, and `queue` (and globally as `venice-video --json <command>`); it prints exactly one JSON object on stdout, and the human text rendering is unchanged. Exit codes are honest — `status` with no project exits non-zero — and ordinary errors are a clean `error:` line, not a stack trace (`VENICE_VIDEO_DEBUG=1` for the stack). The condensed guide is kept in `src/agent/guide.ts` and duplicated as an installable skill at `.claude/skills/venice-agent-guide/`; when a non-negotiable here changes, change those two as well.
423
+ 48. **The CLI is self-describing — discover state and order from it, do not guess.** `venice-video agent-guide [--json]` prints the core operating rules (this section in miniature) and ships inside the binary, so it is available even on a bare global install with no `AGENTS.md`. `venice-video pipeline [--json]` prints the ordered stages, their gates, and the command that advances each; it mirrors `classifyEpisode` in `src/session/status.ts` (rule 45 — change both together). `venice-video status -p <project> [--json]` reports where a project stands and the next command. `--json` is supported on `status`, `pipeline`, `agent-guide`, `doctor`, and `queue` (and globally as `venice-video --json <command>`); it prints exactly one JSON object on stdout, and the human text rendering is unchanged. Exit codes are honest — `status` with no project exits non-zero — and ordinary errors are a clean `error:` line, not a stack trace (`VENICE_VIDEO_DEBUG=1` for the stack). The condensed guide is kept in `src/agent/guide.ts` and duplicated as an installable skill at `.agents/skills/venice-agent-guide/`; when a non-negotiable here changes, change those two as well.
424
424
 
425
425
  49. **Spatial consistency is authored, not inferred — every prompt states placement relative to locked anchors (2026-08-05).** Visual consistency (identity, wardrobe, palette) is handled by the reference stack, but *spatial* consistency — who stands where, which side of frame, facing which way, relative to which landmark — drifts unless it is stated the same way in every generation. The harness now carries geometry as first-class data: (a) **`Location.spatialAnchors`** is the locked geography of a place — 3-5 named landmarks and their fixed relative positions ("bar counter along the back wall; entrance door opposite it; neon window left of the door as seen from the counter"). It is baked into the location reference angles at generation time, injected as "Fixed layout (never rearrange): …" into every panel and video prompt for shots tagged with the location, and is sticky on merge — an existing anchor set is never overwritten by a later script part. (b) **`ShotScript.blocking`** is the shot's authored geometry — 1-2 sentences placing each character/object relative to the named anchors, the frame (screen left/right, foreground/background), and their facing/eyeline. The workshop and script LLM prompts require it for every character shot, with continuity rules: characters keep their screen side and relative positions across consecutive shots unless a movement is written into the action; screen direction and eyelines are preserved (180-degree rule); close-ups still name what is behind/beside the subject. It is injected verbatim (with @ImageN/@ElementN name substitution) into the panel prompt (`BLOCKING: …`), the video prompt (`Blocking: …`), the multi-shot per-beat blocks (both the Seedance native lane and the legacy Kling format), and it seeds the beat's storyboard blocking-plate description. (c) The video prompt's plate clause now forbids mirroring/swapping ("each character stays on the same side of the scene… do not mirror, swap, or rearrange who stands where"), and plateless location shots get a geography-hold clause anchored to the location's first `@ImageN` slot. (d) **QA reads geometry**: `qa-storyboard` evaluates a fourth SPATIAL CONTINUITY dimension against the shot's stated blocking and the location's landmarks, and attaches the nearest prior panel from the same location so side-swaps, mirrored geography, and moved landmarks are caught against real coverage — a spatial flip that breaks the scene is FLAG-CRITICAL. (e) `workshop-episode` warns when character shots are missing `blocking` or locations are missing `spatialAnchors`; `insert-shot` inherits the anchor shot's location and blocking (same-scene splices keep the established geography) and takes `--location` / `--blocking` overrides; `add-location` takes `--spatial-anchors`. The failure mode this kills: characters teleporting across the room, swapping frame sides between coverage, and set geography silently mirroring between shots that read as the same scene (see anti-patterns 20 and 26).
426
426
 
@@ -519,29 +519,29 @@ Issues discovered during production and their fixes. The agent should internaliz
519
519
  **Symptom:** Agent asked to "edit this footage" started frame-dumping random PNGs from the timeline to decide where to cut, burning tokens without producing a coherent strategy.
520
520
  **Root cause:** Frame-dump-first is the wrong substrate for cut decisions. 30 minutes of footage at 24fps = 43,200 frames × ~1,500 tokens = 64M tokens of noise. The LLM cannot hold that context and fabricates its way through the edit.
521
521
  **Fix:** Always transcribe first via `scripts/transcribe-sources.ts`, read the resulting `takes_packed.md` (~12KB), and only call `scripts/timeline-view.ts` at explicit decision points (comparing retakes, resolving an ambiguous pause, verifying a mouth-close before a cut). Inspired by browser-use/video-use.
522
- **Rule:** The text transcript is the primary editing surface. Pixels are consulted on demand only. See `.claude/skills/video-editing/SKILL.md`.
522
+ **Rule:** The text transcript is the primary editing surface. Pixels are consulted on demand only. See `.agents/skills/video-editing/SKILL.md`.
523
523
  **Files:** `src/editing/packer.ts`, `scripts/transcribe-sources.ts`, `scripts/timeline-view.ts`
524
524
 
525
525
  ### 15. Skipping "Propose Strategy, Wait For Confirmation" Causes Throwaway Renders
526
526
  **Symptom:** Agent started rendering an EDL before the user had approved the cut strategy. User then asked for a completely different structure, wasting a 15-minute render.
527
527
  **Root cause:** The render is cheap to launch and expensive to throw away. Without an explicit pre-render confirmation step, intent is inferred and frequently wrong.
528
- **Fix:** `.claude/commands/edit-footage.md` step 3 and `.claude/skills/video-editing/SKILL.md` design principle 3 both mandate: post a summary (sources, duration estimate, trim rules, transitions) and wait for "yes / revise / cancel" BEFORE running `renderEdl()`.
528
+ **Fix:** `.agents/commands/edit-footage.md` step 3 and `.agents/skills/video-editing/SKILL.md` design principle 3 both mandate: post a summary (sources, duration estimate, trim rules, transitions) and wait for "yes / revise / cancel" BEFORE running `renderEdl()`.
529
529
  **Rule:** Never render without confirmation. The render is cheap; the redo is not. Video-use design principle 3 is non-negotiable.
530
- **Files:** `.claude/commands/edit-footage.md`, `.claude/skills/video-editing/SKILL.md`
530
+ **Files:** `.agents/commands/edit-footage.md`, `.agents/skills/video-editing/SKILL.md`
531
531
 
532
532
  ### 16. Auto-Trimming "..." Dead Air From Kokoro VOs Breaks Intended Pacing
533
533
  **Symptom:** Filler-word detector was configured to trim all silence gaps ≥ 0.45s. This removed the intentional breath beats rendered by Kokoro for `...` in `VO_TEXT`, producing a rushed, rhythm-less VO.
534
534
  **Root cause:** `...` in a Kokoro TTS script renders as an intentional ~0.6s breath gap. It's a creative beat, not dead air.
535
535
  **Fix:** `DEFAULT_FILLER_UNIGRAMS` in `src/editing/silence.ts` explicitly excludes `...` and the filler-word detector never touches gaps that were triggered by `...` in aligned mode. Always require user confirmation before a filler trim lands — `you know` and `i mean` can also be content-bearing for certain speakers.
536
- **Rule:** Never auto-trim silence gaps that originated from a script's `...`. Never land filler-word trims without user confirmation. See `.claude/skills/video-editing/SKILL.md` anti-pattern E2.
537
- **Files:** `src/editing/silence.ts`, `.claude/skills/burn-in-subtitles/SKILL.md` rules 1-2
536
+ **Rule:** Never auto-trim silence gaps that originated from a script's `...`. Never land filler-word trims without user confirmation. See `.agents/skills/video-editing/SKILL.md` anti-pattern E2.
537
+ **Files:** `src/editing/silence.ts`, `.agents/skills/burn-in-subtitles/SKILL.md` rules 1-2
538
538
 
539
539
  ### 17. Rendering Overlays As Part Of The EDL Pass
540
540
  **Symptom:** Agent baked lower-thirds and title cards into the EDL render, then had to throw away the render when the user wanted to change the overlay wording.
541
541
  **Root cause:** Overlays are a post-process, not an edit decision. They belong in a separate compositing pass on top of the delivered cut.
542
542
  **Fix:** Overlay designs live in `OverlayManifest` (`src/editing/overlays.ts`), are rendered via `scripts/render-overlay.ts` on top of `final-edit.mp4`, and produce `delivered.mp4`. The EDL render never touches overlays.
543
543
  **Rule:** EDL handles cut decisions. Overlays are applied separately. `overlay-designer` agent only runs AFTER the EDL cut is approved.
544
- **Files:** `src/editing/overlays.ts`, `scripts/render-overlay.ts`, `.claude/agents/overlay-designer.md`
544
+ **Files:** `src/editing/overlays.ts`, `scripts/render-overlay.ts`, `.agents/agents/overlay-designer.md`
545
545
 
546
546
  ### 18. Not Archiving Prior Renders Before A New Edit
547
547
  **Symptom:** A "quick fix" re-render overwrote a 15-minute `final-edit.mp4` before the user had a chance to compare against the prior version.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.14.0 — 2026-08-05
4
+
5
+ ### Changed
6
+
7
+ - **Provider-neutral workspace: `.claude/` → `.agents/`, `CLAUDE.md` symlink
8
+ removed.** The knowledge pack (20 command playbooks, 10 sub-agent roles,
9
+ 9 skills, hooks-config) now lives at `.agents/` — a neutral name any coding
10
+ agent (Cursor, Claude Code, Hermes, OpenClaw, Codex, opencode) can read
11
+ without implying a provider. Every reference was rewritten: `package.json`
12
+ `files[]`, `src/agent/guide.ts` (the `agent-guide` text shipped inside the
13
+ binary), source-comment cross-references, `AGENTS.md`, `README.md`, and all
14
+ intra-pack links (`hooks-config.json`, skills, commands, agents). The
15
+ `CLAUDE.md → AGENTS.md` symlink is gone — `AGENTS.md` is the single
16
+ orchestration hub. Claude Code's own `settings.local.json` was untracked
17
+ (provider-local state, now git-ignored along with any `.claude/` a specific
18
+ runner drops in a checkout).
19
+ - **What deliberately still says `.claude`:** external tools' own read paths.
20
+ Claude Code and Cursor consume skills from `~/.claude/skills/` /
21
+ `<workspace>/.claude/skills/` — that is their convention, not this repo's
22
+ layout — so the `venice-video-mcp-install-skills` docs still name those
23
+ targets, and the optional Seedance Skill OS install still lands wherever
24
+ the runner reads. Historical CHANGELOG entries are unchanged (they describe
25
+ the tree as it was). No code behavior changes; docs, packaging, and the
26
+ embedded agent-guide text only.
27
+
28
+ ## 2.13.1 — 2026-08-05
29
+
30
+ ### Changed
31
+
32
+ - **README: Video Model Routing catches up with the 2.13.0 multi-shot default.**
33
+ The routing table gained a "Multi-shot units" row naming
34
+ `seedance-2-0-enhanced-reference-to-video` as the default lane (`Lens switch.`
35
+ separators, pure reference mode from the full slot plan) with
36
+ `kling-o3-pro-image-to-video` demoted to an explicit
37
+ `videoDefaults.multiShotModel` override, and the "carry these" rule 3 now
38
+ notes the planner applies Seedance native multi-shot by default. Docs only.
39
+
3
40
  ## 2.13.0 — 2026-08-05
4
41
 
5
42
  ### Changed
package/README.md CHANGED
@@ -25,7 +25,7 @@ Most Venice integrations are thin wrappers around API calls. This package is the
25
25
  - **Direct Venice API client** with retries, rate limiting, deprecation warnings, and async media polling
26
26
  - **Persistent project state** for characters, locations, episodes, references, recipes, and provenance
27
27
  - **Comprehensive model registry** covering Venice video, image, audio, and music models
28
- - **Optional agent orchestration** in `AGENTS.md` and `.claude/` for users who want natural-language operation
28
+ - **Optional agent orchestration** in `AGENTS.md` and `.agents/` for users who want natural-language operation
29
29
 
30
30
  ## Driving this from an agent
31
31
 
@@ -40,9 +40,9 @@ knowledge reaches you, which is the single largest predictor of output quality.
40
40
 
41
41
  | Surface | How it runs | What you get | Use when |
42
42
  |---|---|---|---|
43
- | **Repo-resident agent** | Agent's cwd is a clone of this repo | Everything: `AGENTS.md` (49 rules, 28 anti-patterns), `.claude/commands/`, `.claude/agents/`, `.claude/skills/`, `.cursor/rules/` | Authoring and iteration — the best results by a wide margin |
43
+ | **Repo-resident agent** | Agent's cwd is a clone of this repo | Everything: `AGENTS.md` (49 rules, 28 anti-patterns), `.agents/commands/`, `.agents/agents/`, `.agents/skills/`, `.cursor/rules/` | Authoring and iteration — the best results by a wide margin |
44
44
  | **MCP** | `venice-video-mcp` (on npm) shells out to this CLI | 7 action-discriminated tools, structured JSON responses, progress notifications, plus 4 companion skills carrying the pipeline order | Any agent that supports MCP — Hermes, OpenClaw, Cursor, Claude — with no clone required |
45
- | **Bare global CLI** | `npm install -g`, shell tool, `--help` | The compiled CLI, this README, `AGENTS.md`, `.claude/skills/`, and the self-describing commands below (`agent-guide`, `pipeline`) | When your runner has a shell but no MCP — start with `venice-video agent-guide` |
45
+ | **Bare global CLI** | `npm install -g`, shell tool, `--help` | The compiled CLI, this README, `AGENTS.md`, `.agents/skills/`, and the self-describing commands below (`agent-guide`, `pipeline`) | When your runner has a shell but no MCP — start with `venice-video agent-guide` |
46
46
 
47
47
  ### Quick start for Hermes and OpenClaw (no clone, no absolute paths)
48
48
 
@@ -58,7 +58,7 @@ requires cloning a repo or hand-writing a path.
58
58
  > points the agent at the operating rules — run it once and re-set-up cleanly.
59
59
 
60
60
  ```bash
61
- # 1. Install both globally. The harness ships AGENTS.md + .claude/skills/;
61
+ # 1. Install both globally. The harness ships AGENTS.md + .agents/skills/;
62
62
  # the MCP ships its 7 tools and 4 companion skills.
63
63
  npm install -g venice-video-harness venice-video-mcp --foreground-scripts
64
64
 
@@ -93,15 +93,16 @@ verified here; the shapes above are what to adapt. `venice-video-mcp-install-ski
93
93
 
94
94
  **The bare-CLI trap, and how to check whether you are in it.** Through version
95
95
  **2.9.0** the npm package published only `dist`, `README.md`, `CHANGELOG.md`,
96
- `LICENSE`, and `scripts/postinstall.mjs`. `AGENTS.md` and `.claude/` were left
96
+ `LICENSE`, and `scripts/postinstall.mjs`. `AGENTS.md` and `.agents/` were left
97
97
  out, so an agent working from a global install of those versions had no access to
98
98
  the anti-patterns, the model-routing rules, or the pipeline playbooks. It saw a
99
99
  flat list of 40-plus commands with no ordering information and no indication of
100
100
  which stages were gated. That is the most common reason agent-driven runs produce
101
101
  poor output, and it is a knowledge problem rather than a capability problem.
102
102
 
103
- From **2.10.0** onward the package ships `AGENTS.md`, `.claude/commands/`,
104
- `.claude/agents/`, and `.claude/skills/`. Check what your install actually has:
103
+ From **2.10.0** onward the package ships `AGENTS.md` plus the knowledge pack
104
+ (`commands/`, `agents/`, `skills/` — under `.claude/` through 2.13.x, under the
105
+ provider-neutral `.agents/` from 2.14.0). Check what your install actually has:
105
106
 
106
107
  ```bash
107
108
  ls "$(npm root -g)/venice-video-harness/AGENTS.md"
@@ -114,7 +115,7 @@ package and must do one of the following first:
114
115
  1. **Upgrade**, then read the shipped `AGENTS.md`.
115
116
  2. **Register the MCP server** (see below). It carries the pipeline order in its
116
117
  companion skills and returns JSON instead of prose.
117
- 3. **Clone this repo** and work inside it, so `AGENTS.md` and `.claude/` load
118
+ 3. **Clone this repo** and work inside it, so `AGENTS.md` and `.agents/` load
118
119
  from the working tree.
119
120
  4. **Read `AGENTS.md` from GitHub** and hold its rules in context for the session.
120
121
 
@@ -137,7 +138,7 @@ venice-video status -p <dir> --json # where a project stands and the exact com
137
138
  anything, then reach for the full rules and playbooks when you need depth. The
138
139
  same core rules are installable as a skill for runners that pull skills from
139
140
  GitHub: `hermes skills install jordanurbs/venice-video-harness/venice-agent-guide`
140
- (and any of the other `.claude/skills/` by name).
141
+ (and any of the other `.agents/skills/` by name).
141
142
 
142
143
  ### Running the harness in a separate runtime (containers, remote backends)
143
144
 
@@ -270,9 +271,10 @@ gate flowchart), `venice-mcp-cookbook` (one worked example per action),
270
271
  `venice-mcp-directing` (shot-prompt quality), and `venice-mcp-troubleshooting`
271
272
  (every known failure mode). Without them the MCP tools are thin per-command
272
273
  wrappers and you will reconstruct the pipeline by trial and error. Claude Code and
273
- Cursor read `.claude/skills/`; Hermes reads `~/.hermes/skills/`, so `--target
274
- hermes` installs a `venice` category there. OpenClaw's skills path is not verified
275
- yet — pass `--dir` once you know it.
274
+ Cursor read `.claude/skills/` (their convention — the installer symlinks there);
275
+ Hermes reads `~/.hermes/skills/`, so `--target hermes` installs a `venice`
276
+ category there. Any other runner: pass `--dir` with its skills path. This repo's
277
+ own knowledge pack lives provider-neutrally in `.agents/`.
276
278
 
277
279
  ### Preflight: run these three checks first
278
280
 
@@ -433,6 +435,8 @@ Anti-Patterns" (28 entries). If you can only carry a few, carry these:
433
435
  3. **Prefer Seedance native multi-shot for any 2–3 beat scene.** One generation
434
436
  with `Lens switch.` separators holds identity, environment, and lighting
435
437
  across the beats and costs roughly 3× less than three separate renders.
438
+ (Since 2026-08-05 the planner does this by default: multi-shot units render
439
+ on Seedance R2V Enhanced with the full reference slot plan.)
436
440
  4. **Front-load style.** Aesthetic descriptions go at the start of a prompt, not
437
441
  the end, or style drifts across angles.
438
442
  5. **Keep Seedance prompts under 60 words**, using Subject, Action, Camera,
@@ -457,7 +461,7 @@ Anti-Patterns" (28 entries). If you can only carry a few, carry these:
457
461
  12. **Validate model capabilities before sending** `elements`,
458
462
  `reference_image_urls`, `scene_image_urls`, `end_image_url`, or `audio_url`.
459
463
  The registry is `src/venice/models.ts` in a clone; from a global install use
460
- `.claude/skills/venice-video-model-routing/SKILL.md` or the model tables
464
+ `.agents/skills/venice-video-model-routing/SKILL.md` or the model tables
461
465
  below.
462
466
  13. **Ask before burning in subtitles**, and derive caption timings from
463
467
  `ffmpeg silencedetect` on the rendered voiceover rather than estimating them.
@@ -577,7 +581,7 @@ retries automatically, so the choice costs latency rather than a failed command.
577
581
 
578
582
  ```
579
583
  AGENTS.md Agent orchestration hub
580
- .claude/
584
+ .agents/
581
585
  commands/ 19 workflow playbooks (see below)
582
586
  agents/ 6 specialized agent roles (see below)
583
587
  skills/ 6 Venice and workflow knowledge packs (see below)
@@ -897,7 +901,7 @@ npm run test:legacy
897
901
  npm run dev -- <command>
898
902
  ```
899
903
 
900
- The repository still includes agent orchestration in `AGENTS.md` and `.claude/`.
904
+ The repository still includes agent orchestration in `AGENTS.md` and `.agents/`.
901
905
  Those layers can operate the same execution engine, but the installed
902
906
  `venice-video` command does not depend on them.
903
907
 
@@ -944,6 +948,7 @@ Every shot renders in **pure reference mode** — no start image — from an ord
944
948
  | **Character shots (up to ~6 characters)** | `seedance-2-0-enhanced-reference-to-video` | Default R2V — up to 9 `reference_image_urls` with `@Image` tags (chars + blocking plate + location angles), 1080p, up to 15s, native stereo audio |
945
949
  | **Character shots (budget overflow)** | `kling-o3-standard-reference-to-video` | Auto-fallback — structured `elements` for multi-character identity |
946
950
  | **Establishing / mood / action** | `seedance-2-0-enhanced-reference-to-video` | Anchors to location reference angles via `@Image` tags |
951
+ | **Multi-shot units (2+ grouped beats)** | `seedance-2-0-enhanced-reference-to-video` | Default since 2026-08-05 — ONE native multi-shot generation with `Lens switch.` separators, pure reference mode from the full slot plan. The old default `kling-o3-pro-image-to-video` (no reference support at all) is an explicit `videoDefaults.multiShotModel` override only |
947
952
 
948
953
  These defaults are overridable per-project via `series.json` → `videoDefaults`. To target a non-Seedance family (e.g. for accounts that lack Seedance access, or projects that need a different look), set `videoDefaults` to `kling-o3-standard-reference-to-video` (character consistency) and `veo3.1-fast-image-to-video` (atmosphere). Image models default to `nano-banana-2` / `nano-banana-2-edit` for all panels regardless of video family.
949
954
 
@@ -1127,7 +1132,7 @@ npx tsx scripts/render-overlay.ts \
1127
1132
  --manifest output/<project>/overlays/manifest.json
1128
1133
  ```
1129
1134
 
1130
- See [`.claude/skills/video-editing/SKILL.md`](.claude/skills/video-editing/SKILL.md) for the full philosophy, EDL format, and editing-specific anti-patterns.
1135
+ See [`.agents/skills/video-editing/SKILL.md`](.agents/skills/video-editing/SKILL.md) for the full philosophy, EDL format, and editing-specific anti-patterns.
1131
1136
 
1132
1137
  ## Timeline Export (NLE round-trip)
1133
1138
 
@@ -1172,7 +1177,7 @@ Bug reports are how we'll catch the gaps — the test fixture confirms structure
1172
1177
 
1173
1178
  ## Commands, Agents, and Skills
1174
1179
 
1175
- ### Workflow Commands (`.claude/commands/`)
1180
+ ### Workflow Commands (`.agents/commands/`)
1176
1181
 
1177
1182
  | Command | Purpose |
1178
1183
  |---------|---------|
@@ -1200,7 +1205,7 @@ Bug reports are how we'll catch the gaps — the test fixture confirms structure
1200
1205
  | `ingest-screenplay` | Ingest Fountain/PDF screenplay |
1201
1206
  | `edit-footage` | Text-first editing pipeline for existing media (cuts, trims, re-orders) |
1202
1207
 
1203
- ### Specialized Agents (`.claude/agents/`)
1208
+ ### Specialized Agents (`.agents/agents/`)
1204
1209
 
1205
1210
  | Agent | Role |
1206
1211
  |-------|------|
@@ -1215,7 +1220,7 @@ Bug reports are how we'll catch the gaps — the test fixture confirms structure
1215
1220
  | `remotion-overlay` | Renders one animated overlay as transparent ProRes / WebM |
1216
1221
  | `ffmpeg-overlay` | Emits drawtext specs for static overlays |
1217
1222
 
1218
- ### Production Skills (`.claude/skills/`)
1223
+ ### Production Skills (`.agents/skills/`)
1219
1224
 
1220
1225
  | Skill | Purpose |
1221
1226
  |-------|---------|
@@ -1234,14 +1239,14 @@ The harness is the *production crew* — it locks identity, routes models, QA's
1234
1239
  This principle is already baked into the harness where it matters:
1235
1240
 
1236
1241
  - The **workshop system prompt** (`src/mini-drama/cli.ts`) carries a "DIRECT THE SCENE, DON'T DECORATE IT" block, so both the CLI and the `venice-video-mcp` `episode.workshop` produce directed scripts.
1237
- - `.claude/agents/prompt-engineer.md`, `.claude/skills/shot-composition/SKILL.md`, and `.claude/commands/workshop-episode.md` open with the same directing preface for Claude-Code-in-repo sessions.
1242
+ - `.agents/agents/prompt-engineer.md`, `.agents/skills/shot-composition/SKILL.md`, and `.agents/commands/workshop-episode.md` open with the same directing preface for agent-in-repo sessions.
1238
1243
  - The `buildVideoPrompt` builders document the principle so future prompt logic stays directed.
1239
1244
 
1240
1245
  Install Seedance OS to unlock its full `directing-engine`, genre library, `retake-protocol`, `continuation-handoff`, `seedance-copyright`, `seedance-antislop`, and multilingual `vocab/*`:
1241
1246
 
1242
1247
  ```bash
1243
1248
  # Clone the repo (its root is shaped as the seedance-20 skill) into the skills dir:
1244
- git clone https://github.com/emily2040/seedance-2.0 .claude/skills/seedance-20
1249
+ git clone https://github.com/emily2040/seedance-2.0 .agents/skills/seedance-20
1245
1250
  ```
1246
1251
 
1247
1252
  **Division of labor to respect:** the harness owns identity (R2V refs + Seedance → Wan keyframe pass), durations (the pre-flight gate + 15s default), and model routing. So use Seedance OS for **intention/camera/light/blocking/performance/sound** only — do not hand-write identity locks, `[Image1]` reference tags, or surface-specific durations into prompts. Skip Seedance OS's `api-status.md` / `surface-prompt-profiles.md` / `api-workflow.md` / `model-name-map.md` (those describe non-Venice surfaces). The `venice-video-mcp` repo's `venice-mcp-directing` skill is the matching bridge for MCP-driven work.
@@ -63,8 +63,8 @@ export const AGENT_GUIDE = [
63
63
  title: 'Where the full knowledge lives',
64
64
  points: [
65
65
  'AGENTS.md — 49 rules and 28 production anti-patterns, shipped in the package.',
66
- '.claude/skills/ — venice-api, venice-video-model-routing, character-consistency, shot-composition, burn-in-subtitles, video-editing, and more.',
67
- '.claude/commands/ — 20 step-by-step playbooks; .claude/agents/ — 10 sub-agent roles.',
66
+ '.agents/skills/ — venice-api, venice-video-model-routing, character-consistency, shot-composition, burn-in-subtitles, video-editing, and more.',
67
+ '.agents/commands/ — 20 step-by-step playbooks; .agents/agents/ — 10 sub-agent roles.',
68
68
  'Read the relevant playbook before running a workflow. Validate model capabilities against src/venice/models.ts before an API call.',
69
69
  ],
70
70
  },
@@ -75,7 +75,7 @@ export function guideAsJson() {
75
75
  export function formatGuide() {
76
76
  const lines = [];
77
77
  lines.push('Venice Video Harness — core rules for driving this CLI from an agent');
78
- lines.push('Full rules: AGENTS.md · Playbooks: .claude/commands/ · Knowledge: .claude/skills/');
78
+ lines.push('Full rules: AGENTS.md · Playbooks: .agents/commands/ · Knowledge: .agents/skills/');
79
79
  lines.push('');
80
80
  for (const section of AGENT_GUIDE) {
81
81
  lines.push(`## ${section.title}`);
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Self-evaluation driver for the editing pipeline.
3
3
  *
4
- * The cut-qa agent (`.claude/agents/cut-qa.md`) is the intelligent layer;
4
+ * The cut-qa agent (`.agents/agents/cut-qa.md`) is the intelligent layer;
5
5
  * this module is the mechanical layer that:
6
6
  * 1. Enumerates cut boundaries from an EDL
7
7
  * 2. Runs each boundary through the six programmatic checks
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Self-evaluation driver for the editing pipeline.
3
3
  *
4
- * The cut-qa agent (`.claude/agents/cut-qa.md`) is the intelligent layer;
4
+ * The cut-qa agent (`.agents/agents/cut-qa.md`) is the intelligent layer;
5
5
  * this module is the mechanical layer that:
6
6
  * 1. Enumerates cut boundaries from an EDL
7
7
  * 2. Runs each boundary through the six programmatic checks
@@ -2,7 +2,7 @@
2
2
  * Silence-gap and filler-word detection.
3
3
  *
4
4
  * Built on the same `ffmpeg silencedetect` pattern used by
5
- * `.claude/skills/burn-in-subtitles/scripts/derive-captions.ts`. Reused here
5
+ * `.agents/skills/burn-in-subtitles/scripts/derive-captions.ts`. Reused here
6
6
  * rather than duplicated.
7
7
  *
8
8
  * Filler words are identified from word-level transcripts (not audio), so
@@ -2,7 +2,7 @@
2
2
  * Silence-gap and filler-word detection.
3
3
  *
4
4
  * Built on the same `ffmpeg silencedetect` pattern used by
5
- * `.claude/skills/burn-in-subtitles/scripts/derive-captions.ts`. Reused here
5
+ * `.agents/skills/burn-in-subtitles/scripts/derive-captions.ts`. Reused here
6
6
  * rather than duplicated.
7
7
  *
8
8
  * Filler words are identified from word-level transcripts (not audio), so
@@ -99,7 +99,7 @@ export declare function buildImagePrompt(shot: ShotScript, series: SeriesState):
99
99
  /**
100
100
  * Build a video-generation prompt for a shot.
101
101
  *
102
- * Directing principle (see .claude/agents/prompt-engineer.md and the README
102
+ * Directing principle (see .agents/agents/prompt-engineer.md and the README
103
103
  * "Directing layer"): this assembles the prose that DIRECTS the shot -- one
104
104
  * intention expressed through camera, light, blocking, performance, and sound
105
105
  * -- not a pile of "cinematic" adjectives. It intentionally leans on the
@@ -268,7 +268,7 @@ function summarizeCharacterForMultiShot(char, wardrobeOverride, elementSlot) {
268
268
  /**
269
269
  * Build a video-generation prompt for a shot.
270
270
  *
271
- * Directing principle (see .claude/agents/prompt-engineer.md and the README
271
+ * Directing principle (see .agents/agents/prompt-engineer.md and the README
272
272
  * "Directing layer"): this assembles the prose that DIRECTS the shot -- one
273
273
  * intention expressed through camera, light, blocking, performance, and sound
274
274
  * -- not a pile of "cinematic" adjectives. It intentionally leans on the
@@ -99,7 +99,7 @@ export declare function buildPrompt(shot: Shot, scene: Scene, aesthetic: Aesthet
99
99
  * movement, subject + action, setting, style, and audio cues. Only the
100
100
  * aesthetic register relevant to the current scene is included.
101
101
  *
102
- * Directing principle (see .claude/agents/prompt-engineer.md and the README
102
+ * Directing principle (see .agents/agents/prompt-engineer.md and the README
103
103
  * "Directing layer"): the prose should DIRECT the shot -- one intention
104
104
  * expressed through camera/light/blocking/performance/sound -- rather than
105
105
  * stack "cinematic" adjectives. Camera, angle, and movement come from the
@@ -497,7 +497,7 @@ function extractRegister(fullText, sceneNumber) {
497
497
  * movement, subject + action, setting, style, and audio cues. Only the
498
498
  * aesthetic register relevant to the current scene is included.
499
499
  *
500
- * Directing principle (see .claude/agents/prompt-engineer.md and the README
500
+ * Directing principle (see .agents/agents/prompt-engineer.md and the README
501
501
  * "Directing layer"): the prose should DIRECT the shot -- one intention
502
502
  * expressed through camera/light/blocking/performance/sound -- rather than
503
503
  * stack "cinematic" adjectives. Camera, angle, and movement come from the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "venice-video-harness",
3
- "version": "2.13.0",
3
+ "version": "2.14.0",
4
4
  "description": "Standalone consistency-first video production CLI powered by the Venice API",
5
5
  "homepage": "https://github.com/jordanurbs/venice-video-harness",
6
6
  "repository": {
@@ -72,9 +72,9 @@
72
72
  "LICENSE",
73
73
  "AGENTS.md",
74
74
  "HERMES-AGENT-SETUP.md",
75
- ".claude/commands",
76
- ".claude/agents",
77
- ".claude/skills",
75
+ ".agents/commands",
76
+ ".agents/agents",
77
+ ".agents/skills",
78
78
  "scripts/postinstall.mjs"
79
79
  ],
80
80
  "engines": {
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes