¿Qué hace derush?
Montaje « jump cut » automático de una toma hablada. Solo HACE el corte y la exportación: no hay subtítulos. Esta skill incorpora la rúbrica de retractación a continuación; los scripts (fillers, prune, cut) están en el repositorio.
Los vídeos viven en $DERUSH_OUT_ROOT/<STEM>/ (por defecto ~/Movies/Derush, ver derush config show).
Un solo audio (m4a, mp3, wav, aiff, caf) pasa por la misma cadena: el montaje sale en <STEM>.derush.m4a, la exportación en <STEM>.export.m4a (-14 LUFS); fcpxml, logos y look no existen para él.
Los tres comandos
derush prep "<video>" # coloca la fuente en $DERUSH_OUT_ROOT/<STEM>/, audio, silencios, transcripción (qwen),
# alineación, euh, huecos, control de huecos. ~1.5x la duración
derush words <STEM> # transcripción palabra por palabra con marcas de tiempo: el paso 6 se lee sobre esto
derush studio # TODO en el navegador: arrastrar un vídeo bruto, derush, montaje mediante
# el texto, montaje apretado propuesto, renderizado. Palabra en un hueco = mantenida, se puede tachar
derush edit <STEM> # montaje mediante el texto: página local, tachar palabras (Supr), corregir un
# euh/silencio (Enter), Validar → retraction_cuts.json + restore.json
# « Proponer un montaje apretado »: Claude propone cortes (repeticiones,
# digresiones, retomas), en naranja, nada se corta sin su OK
derush render <STEM> # fusión + guardado + corte + retranscripción de la salida + cuts.md
derush logos <STEM> # opcional: logos.json → <STEM>.logos.mp4, export lo toma si existe
derush fcpxml <STEM> # <STEM>.fcpxml, escrito también por render: timeline Resolve, clips sobre la
# fuente completa, un borde tirado revela lo que se ha cortado
derush export <STEM> # <STEM>.reel.mp4: 1080x1920, 30 fps, -14 LUFS, listo para publicar
Logos (derush logos): $DERUSH_OUT_ROOT/<STEM>/logos.json = {"cues":[{"logo":"canva","t":14.27}]}, t leído
en derush words (instante SOURCE, convertido por keep.json). Archivos en $DERUSH_OUT_ROOT/_logos/src/<logo>.svg|png
(con fondo transparente; sin archivo, tarjeta de texto). Tarjeta blanca redondeada 30% de ancho, en la parte superior
IZQUIERDA por defecto (facecam: la cara ocupa el tercio superior centrado), 2 s, fundido 0.2 s; una lista dicha
rápidamente coloca las tarjetas lado a lado. Control: extraer una imagen por cue y MIRARLA. IMG_4596 (2026-10-11):
Canva ×2, Microsoft 365, Gamma, Higgsfield (« Xfield » en el transcript: pedirle los nombres, whisper
no conoce ni la mitad).
derush = bin/derush del repositorio. Opciones de prep: --lang en,
--noise -40 (voz débil), --min 0.3 --pad 0.08 (más apretado), --min 0.8 --pad 0.2 (más pausado).
Dos vídeos: lanzar los prep seguidos en segundo plano, leer los words mientras tanto.
Lo que se corta, y quién decide
| Capa | Señal | Quién decide |
|---|---|---|
| Silencios | waveform, silencedetect (no los huecos whisper, demasiado gruesos) | script |
| (prerrequisito) verdaderas marcas de palabras | alineación forzada CTC sobre el audio (align_words.py) | script |
| euh / hum / hein escritos por whisper, tartamudeos « je je », « et et » | marcas de tiempo de palabra (detect_fillers.py) | script |
| euh / mmh NO escritos (la mayoría) | hueco no silencioso entre 2 palabras (gap_fillers.py) | script |
| falsos comienzos, frase retomada, « no espera », palabra abandonada, instrucciones dichas a la cámara | lectura del transcript | TÚ, paso 6 |
Directriz principal de la skill: un corte falso de contenido real es el peor
error. Ante la duda, se mantiene, y se dice en cuts.md (« mantenido a propósito »).
Paso 6, el único manual: los falsos comienzos
Lee derush words <STEM> (palabra@inicio-fin, ? = marca interpolada, no alineada) y escribe
$DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json = {"retraction_cuts":[{start,end,cue_text,rationale}]}.
Rúbrica: « THE RETRACTION-DETECTION RUBRIC » más abajo en este archivo, con estos casos del habla espontánea:
- Falso comienzo « voy a... vamos a ver »: cortar « voy a » hasta el inicio de la retoma.
- Palabra reformulada « es una cosa, una herramienta que »: cortar la primera solo si la segunda la REEMPLAZA (no si la precisa).
- Frase retomada desde cero, incluso después de un paréntesis: cortar todo el primer intento.
- Instrucciones de regiduría dichas a la cámara (« quitamos eso », « no en mi micrófono, no », « mantenemos »): son instrucciones, no contenido. Aplicarlas, luego cortarlas. IMG_4566: los últimos 40 segundos eran 3 falsos comienzos y 2 instrucciones.
- No cortar: repetición enfática (« siempre, siempre »), lista, « en realidad » que añade, pausa expresiva, autocorrección cómica (« XXIe y XXIIe siglos. No, del XXI »).
- Límites, leídos en
words:start= punto medio entre el final de la última palabra mantenida y el inicio de la primera palabra abandonada;end= inicio de la primera palabra mantenida − 0.04 s. Para cortar hasta el final:end= duración del vídeo.
Para un transcript largo (> 1000 palabras), delegar la lectura a un subagente que genere el JSON,
luego releer sus límites contra words.
Verificar antes de renderizar (re-derivar, no reconocer)
render hace los controles mecánicos y escribe cuts.md. Lo que TÚ relees:
- La sección diff de
cuts.md(transcript fuente → salida). Cadadeletedebe ser un corte deseado. Unreplace/insertextraño (« es es es ») suele ser un bucle de whisper: retranscribir la región sola antes de acusar al corte. - Un hueco marcado PALABRA EN EL HUECO por
gap_check(final deprep): escuchar la ventana. Si es un falso comienzo, el corte es bueno. Si es contenido, retirar ese hueco de_work/gap_cuts.jsonantes derender. - Un euh, un mmh CITADO es contenido. « los silencios, los mmh », « sobre todo los euh »: la palabra es el objeto de la frase, se queda. Después de « los », « de los », « un », « sobre los » delante de un euh/mmh/hum, escuchar y retirar el hueco que lo cubre. Nunca tratar « sobre los » como un falso comienzo: la frase termina en el euh. (2026-10-27, A001_10272011_C008.)
- Transcripción: Qwen3-ASR por defecto desde el 2026-11-04 (
transcribe_qwen.py,DERUSH_ASR=whisperpara volver; qwen ausente o caído → whisper, se dice en el log). Qwen escribe los tartamudeos y falsos comienzos que whisper funde (C010: « de de cosas », « no tendré mis, no tendré mis, todos mis »), por lo tanto aparecen enderush wordsy enderush edit. No escribe los euh:gap_fillers.pypermanece. Más débil en nombres propios (« claudito » → « claudio »). - Falso comienzo fundido por whisper: whisper puede escribir solo una vez una frase dicha dos veces. IMG_4543: « te pongo… voy a poner » transcrito « voy a poner ». Una frase que suena extraña en un empalme de la salida = retranscribir la fuente palabra por palabra en ese lugar.
- Siglas, nombres de dominio, cifras: CTC alinea mal las letras deletreadas. IMG_4549: el hueco
antes de « SI » (SpaceX SI) llevaba la « ese ». Todo hueco que toque una sigla o un
.com: retranscribir la ventana, y no cortarla ante la menor duda. Los tokens con cifra (« 5h », « J3 ») son interpolados, nunca alineados. - Sincronía:
cuts.mdda el desfase A/V. Más allá de 40 ms, mirar. - Rellenar la línea
Asuntodecuts.md.
THE RETRACTION-DETECTION RUBRIC
You (the invoking agent) read derush words <STEM> and write this JSON to
$DERUSH_OUT_ROOT/<STEM>/retraction_cuts.json, the file derush render reads:
Detector output contract
{
"retraction_cuts": [
{
"start": 6.4,
"end": 9.8,
"cue_text": "Scratch that",
"rationale": "Reparandum 'runs every time the user opens a file' + cue 'Scratch that'; repair 'it actually runs on session start' is kept."
}
]
}
start= where the abandoned thought (reparandum) begins. SEMANTIC judgment; it may fall mid-sentence. Read the exact time off the word timestamps ofderush words(see "Boundary anchoring" below). Times are in seconds of the SOURCE video.end= end of the retraction cue (interregnum). The reparandum + cue are BOTH removed; the repair that FOLLOWS is KEPT. In practiceendlands at the boundary where the corrected utterance begins.- Empty list
{"retraction_cuts": []}when no genuine retraction. Decoys and topic-shifts produce NO cut.
The self-repair model (Levelt / Clark & Wasow)
[REPARANDUM] [INTERREGNUM/CUE] [REPAIR]
abandoned the cue replacement
CUT CUT KEEP
The cut = reparandum + cue. The repair is preserved.
Positive test (cut) : ALL must hold
- The speaker is invalidating prior content (negating, deleting, or judging it wrong/incoherent), AND
- They replace it or drop it : a corrected version follows, or the thought is abandoned, AND
- There is an actual reparandum present in the transcript to remove (a cue with no preceding speech to retract → NO cut; see edge case below).
Negative tests (do NOT cut) : any one rejects the candidate
These superficially resemble cues but are not retractions:
- Time-qualified topic-shift : "forget the budget for a second/for now", "oublie le budget deux secondes". The "for a second/for now" qualifier (often plus a later deferral like "we'll cover it next week") means the prior content is still VALID, just deferred. NO cut.
- Additive escalation : "en fait c'est encore mieux", "non mais attends, c'est encore plus puissant que ça". "en fait"/"non mais" here UPGRADE the prior claim; it still stands. NO cut.
- Affirmation : "non mais c'est exactement ça", "actually, that's a good point". The "non"/"actually" intensifies agreement, not correction. NO cut.
- Procedural pause : "attends, je te montre" / "wait, let me show you". Speech pauses for a demo; nothing is retracted. NO cut.
- Nuance/scope refinement : "c'est plus subtil que ça", "enfin, c'est un peu plus compliqué". The prior claim is qualified/extended, not discarded. NO cut.
- Topic-closer : "bref, c'est compliqué", "de toute façon". Closes a chain
without invalidating it. NO cut. (
brefis ambiguous : only a cut when it is followed by an actual abandonment like "bref, peu importe les critères".)
How far back does the reparandum start?
The start boundary is a semantic judgment:
- Ask what the speaker is replacing. The reparandum begins where the abandoned idea first diverged from the correct replacement.
- Restart markers ("je reprends", "let me start over", "non attends je recommence") → wider reparandum: back to the start of the redone stretch.
- Correction pivots ("non en fait", "actually no", "wait no") → narrow reparandum: just the immediately preceding predicate/clause.
- Natural topic boundary rule : never cut past a different subject. A valid shared topic-introduction that both the wrong and correct versions build on is KEPT (e.g. a "for the sound installation project…" intro stays; only the wrong technical claim after it is cut).
- SETUP vs ELABORATION test (keep the last still-true claim). When a
setup/intro CLAIM remains true and only a following ELABORATION, ENUMERATION,
LIST, or DETAIL is abandoned, the reparandum starts at the elaboration, not
the setup. The decisive question is: "is the speaker negating THIS clause, or
only what came after it?" If the clause is still true after the repair, KEEP
it; begin the cut at the first clause the repair invalidates.
- "It uses four criteria: A, B, C, D. Anyway, never mind the criteria : what matters is X." → the setup "it uses four criteria" is still TRUE (it does use criteria); only the enumeration "A, B, C, D" is dropped. Cut starts at the enumeration, NOT at "it uses four criteria". Keeping the setup is mandatory : cutting it is a false cut of real content.
- Contrast: if the speaker negates the setup itself ("it uses four criteria… actually no, it uses none, it's a flat rule"), then the setup IS the reparandum and the cut starts there. Read what the repair replaces.
- Minimum-cut / conservatism : when unsure how far back, prefer the NARROWER cut. Leaving a slightly imprecise prior clause is far better than cutting a correct sentence.
- Multi-sentence reparanda: when the abandoned thought spans several sentences or
lines of
derush words, the cut covers all of them. - Boundary anchoring: use the word timestamps, never arithmetic.
derush words <STEM>prints every word asword@start-end(?after a word = the bound is interpolated, not aligned on the sound; treat it as less exact). Anchor on those:start= the middle of the gap between the END of the last word you keep and the START of the first abandoned word.end= the START of the first word you keep (the repair head) minus 0.04 s. The reparandum and the cue are cut, the repair head is never touched. To cut up to the end of the video,end= the duration of the video.- Cue and repair head in the same sentence (split by "mais", "c'est", "it's", a comma, a dash): end the cut at the last word of the cue, not later. Use the FIRST punctuation that follows the cue, never a later comma inside the repair clause. When the cue carries a trailing comma ("non attends,", "scratch that,"), the words after it are repair and are KEPT.
- Reparandum at the tail of one line and the cue at the head of the next: end the cut at the end of the reparandum rather than reaching forward to also grab the cue. A brief leftover cue ("non attends") is harmless; eating the repair head is the cardinal sin.
- Interpolated bounds (
?): round INWARD (see below).