tighten-pacelisted
Install: claude install-skill jperrello/C0BALT_CUT
# tighten-pace
Podcast clips die on dead air. This skill walks a word-timed transcript,
finds any silence longer than `gap_max`, and collapses that silence to a
short floor — either `collapse_to` (mid-sentence) or `sentence_beat` (after
a `.`, `?`, or `!` so a beat is preserved between thoughts). Output is a
new clip plus a transcript whose timestamps reflect the tightened timeline,
so chunk-captions, burn-subtitles, and title-transition all align correctly.
## Invoke
```
.claude/skills/tighten-pace/tighten-pace.sh <input_clip> <input_transcript> <out_clip> <out_transcript> [gap_max=0.18] [sentence_beat=0.15] [collapse_to=0.08]
```
- `input_clip` — clip-local mp4 (post cut-clip + rebase)
- `input_transcript` — clip-local word-timed transcript JSON
- `out_clip` — written mp4 with silences collapsed
- `out_transcript` — written transcript JSON with shifted t0/t1
- `gap_max` — silence threshold in seconds; only gaps strictly greater are collapsed
- `sentence_beat` — target gap (sec) at sentence boundaries
- `collapse_to` — target gap (sec) elsewhere
Env overrides: `TIGHTEN_GAP`, `TIGHTEN_SENTENCE_BEAT`, `TIGHTEN_COLLAPSE_TO`.
## How
`plan.py` walks word pairs. When `nxt.t0 - prev.t1 > gap_max`, the kept
ranges are split: the previous range ends at `prev.t1 + target/2` and the
next starts at `nxt.t0 - target/2`, so the residual silence after ffmpeg
`select`+`aselect` is exactly `target` seconds. `target` is `sentence_beat`
when `prev.w` ends with `.`, `?`, or `!`; otherwis