Skip to content

NO UNIR · Revisión completa de la 1.0.2 (main frente a v1.0.1) - #461

Draft
Dathinel wants to merge 88 commits into
revision/base-v1.0.1from
main
Draft

Dathinel wants to merge 88 commits into
revision/base-v1.0.1from
main

Conversation

@Dathinel

Copy link
Copy Markdown
Owner

PR solo para revisar: muestra todo lo que entra en la 1.0.2 (36 commits, 344 archivos desde la etiqueta v1.0.1) para pasarle /code-review ultra. No se une: la base revision/base-v1.0.1 es una copia de v1.0.1 y se borra junto con este PR al terminar la revisión.

🤖 Generated with Claude Code

Dathinel and others added 30 commits October 17, 2026 13:46
* Documentación al día con la release v1.0.1

README: la insignia dice 1.0.1 y enlaza a la última release. CLAUDE.md: la
versión publicada es la v1.0.1 (commit 11c44eb). Los ejemplos de versión de la
guía de distribución, la arquitectura y CrashReporter pasan a 1.0.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* README y guía de instalación con la 1.0.1

El README suma una sección Descargar con la última versión y lo nuevo de la
1.0.1, y nombra el menú Herramientas para la IA. La guía de instalación usa la
1.0.1 en los ejemplos y explica cómo actualizar desde una versión anterior.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Acota los análisis simultáneos con SemaphoreSlim (Clamp(núcleos, 2, 8)) y permite
cancelar los pendientes. Reserva cada ruta con TryAdd antes de arrancar su análisis
anticipado. Siete pruebas nuevas: ruta repetida, 200 archivos y cancelación.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Codex GPT-6-Astra <noreply@openai.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
README anunciaba erróneamente la pestaña «Clip» en el inspector cuando su nombre real en la interfaz es «Propiedades» (InspectorView.xaml:40). Se corrige la mención en el README y en docs/guia/edicion.md para mantener la coherencia con el diseño de la aplicación.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Gemini 3.8 Flash <noreply@google.com>
…MB (#427)

El lanzador marca app\ como oculta al ejecutarse, lo que provocaba que Inno Setup la omitiera al compilar y generara un instalador incompleto de ~2 MB.

Se retira el atributo de oculto de forma recursiva en dist\Rodaje\app antes de invocar a ISCC y se anade una comprobacion que hace fallar el script si el instalador resultante pesa menos de 50 MB.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Gemini 3.8 Flash <noreply@google.com>
…biblioteca (#429)

- ExportView: habilita ScrollViewer vertical con VerticalScrollMode para la seccion avanzada.
- PluginsView: asigna fila de cuadricula propia al aviso informativo para evitar solapes con el primer complemento.
- LibraryView: define MinWidth y TextTrimming con ToolTip en columnas de detalle/lista, anade margen a elementos y separa el pie del panel de IA con margen propio.
- PlayerView.Scopes: corrige caracteres mojibake en comentarios UTF-8.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Gemini 3.8 Flash <noreply@google.com>
* Ventana estrecha: pliega paneles y evita solapes en la barra y el reproductor

- Pliega el inspector por debajo de 788 y la biblioteca por debajo de 544, y restaura los anchos al ensanchar.
- Pestañas del inspector con desplazamiento horizontal visible.
- Barra de título compacta por debajo de 1100; el crédito upstream sigue en Ayuda > Acerca de.
- Título y controles del reproductor en filas distintas.
- 8 pruebas nuevas en NarrowWindowTests.

Co-Authored-By: Codex GPT-6-Astra <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Ventana estrecha: pliega el inspector midiendo el contenedor real y sin franja residual

- FitSidePanels ahora mide el ancho disponible del contenedor (Root/AppWindow) en lugar de MainArea.ActualWidth, cuyo tamano quedaba fijado por sus columnas y no bajaba de 788.

- Escucha SizeChanged de Root e inicializa el ajuste en RestoreLayout con el ancho restaurado.

- Asegura MinWidth=0 en las columnas de biblioteca e inspector para permitir su colapso total a 0.

- Pruebas adicionales en NarrowWindowTests para colapso a 0 en XAML y anchos guardados personalizados.

Co-Authored-By: Gemini 3.8 Flash <noreply@google.com>

---------

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Codex GPT-6-Astra <noreply@openai.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Gemini 3.8 Flash <noreply@google.com>
…el retorno (#389)

WriteAutomation ponía siempre lineal el keyframe de retorno; si la curva de
antes mantenía su valor (Hold) hasta el siguiente keyframe, tras el tramo
tocado pasaba a ser una rampa. Ahora el retorno conserva Mantener.

Pruebas de contrato de la sección «Mezclador» de docs/guia/audio.md.


Claude-Session: https://claude.ai/code/session_01518ctM17z6mtfKiV9e5Fva

Co-authored-by: Claude <noreply@anthropic.com>
- Las fotos se importan como medios sin duración propia; el clip empieza en 5 s y se recorta libremente.
- El decodificador retiene el cuadro 0 y lo sube en BGRA una sola vez; el alfa se conserva sin halos.
- Efectos, máscaras, fotogramas clave y exportación usan el pipeline común (una foto de 2 s exporta 60 cuadros).
- Formato de proyecto 14 con migración 13→14 y esquema nuevo; decisión D-050.
- Pruebas de probe, edición, alfa, exportación y guardado/carga.



Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Codex GPT-6.1-Sol <noreply@openai.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
- Orientación EXIF del cuadro 0 (fotos verticales del móvil).
- Reemplazar por una foto sin límite de duración; foto→video vuelve el origen a 0.
- Ajustar al hueco con una foto cambia solo la duración, sin velocidad.
- Tope proporcional de 8192 px al subir la imagen (límite de D3D11 y memoria).
- Un medio de un solo cuadro que no es imagen se sigue rechazando.
- Seguimiento y análisis rechazan las fotos antes, con mensaje en español.
- La biblioteca muestra «Imagen» en vez de 00:00.
- Formato 13 si el proyecto no tiene fotos (abre en la 1.0.1), 14 si las tiene (ampliación provisional de D-050).
- 24 casos nuevos.



Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Codex GPT-6.1-Sol <noreply@openai.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…arra de título (#432)

- TimelineRenderer: acorta con puntos suspensivos el nombre de marcadores que se solaparían hasta el siguiente marcador; si no cabe el primer carácter, muestra solo el marcador y el nombre en tooltip.
- MarkerLabelLayout: función pura de recorte y cálculo de ancho disponible con pruebas unitarias.
- TitleBar: abrevia de forma legible el nombre de la GPU con GpuNameFormatter conservando la descripción completa en el tooltip y recortando con puntos suspensivos si excede el ancho.
- Pruebas unitarias de MarkerLabelLayout y GpuNameFormatter en Rodaje.App.Tests.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Gemini 3.8 Flash <noreply@google.com>
…a y exportación iguales en WARP) (#433)

El pool redondea los intermedios a 64 px y los efectos dibujan solo en lo pedido. En el borde, el filtro
bilineal lee el texel siguiente con peso 0, y 0 × NaN es NaN: con WARP y memoria sin limpiar, un margen
con medias precisiones NaN dejaba en negro las últimas filas de la exportación (CI del PR #427, byte
521304 = fila 254). Ahora cada textura nueva se limpia a cero al crearse. Prueba nueva del contrato.

La prueba del mezclador no falló por muestras distintas sino por el plazo de 10 s de su espera (PR #428).
No se reproduce en local; la espera dice ahora cuántos cuadros había, los errores y las faltas, y corta
en cuanto la mezcla tiene un error.


Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…grama (#434)

- Preferencias: duración por defecto configurable (1-60 s) y carpeta de captura.
- Biblioteca: icono de imagen y miniatura con transparencia sobre fondo de cuadros.
- Ken Burns: menú contextual con 4 ajustes preestablecidos y deshacer en un paso.
- Ocultar/desactivar opciones no aplicables a imágenes fijas con aviso claro.
- Captura de fotograma: botón de cámara en visor, atajo Ctrl+Mayús+C, guardado directo con aviso, apertura de carpeta e importación a biblioteca.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: agy-flash <noreply@google.com>
… estilo del texto (#435)

- El diálogo de silencios arranca con «Cerrar los huecos» marcada; antes dependía del ripple automático.
- ClipAttributeKinds gana Text (estilo del texto de títulos y subtítulos) y Shadow (sombras); las palabras no se copian.
- Entradas nuevas en el menú «Pegar atributos» y pruebas del núcleo.


Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
- Núcleo: DeleteTrack, ReorderTrack y StepTrack dejan fija la pista
  principal (no se elimina, no se mueve, nadie pasa debajo); DeleteTrack
  suelta los sidechain que escuchaban la pista.
- FreeAudioTrack y LinkedAudioTrack: el sonido enlazado va a la primera
  pista de audio libre en el tramo o a una nueva al final del audio.
  Move(relocateLinkedAudio) e InsertMediaWithLinkedAudio lo usan al poner
  un video encima de otro, sin separar el audio.
- Cabeceras: «Subir pista», «Bajar pista» y «Eliminar pista» en el menú,
  selección con Supr (confirma si hay clips) y arrastre con línea de
  destino entre las pistas del mismo tipo.
- Pruebas de las tres operaciones con deshacer y rehacer, del destino del
  audio y de la posición de arrastre.


Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#436)

* Selección múltiple: arrastrar mueve a todos y el inspector edita a varios

- Mover juntos: arrastrar uno de los clips seleccionados mueve toda la
  selección (con enlazados y grupos) con el mismo desplazamiento, el ajuste
  del agarrado y un paso del historial. Cambia de pista si caben todos; si
  no, solo en el tiempo. Con la pista principal magnética, los seleccionados
  de ella se reordenan como un bloque y el resto los sigue.
- Núcleo: TimelineEdits.MoveClips con desplazamiento de pista y
  MoveClipsOnMainTrack, con sus comandos.
- Inspector (transformación, opacidad, desenfoque de movimiento y audio):
  con varios clips, cada cambio va a todos en un paso
  (Edits.SetParameterOnClips); un valor distinto entre ellos se ve como «—»;
  con video y audio mezclados solo queda lo común; la cabecera dice
  «N clips seleccionados».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

* Inspector: índice directo en lugar de FirstOrDefault (CA1826)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

---------

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…en el README (#438)

Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…y rueda como en Resolve (#439)

- El alto de la línea de tiempo es el 42 % de la ventana (mínimo: tres pistas) y se guarda como proporción;
  los ajustes 4 pasan el alto viejo a su proporción. Separador de 8 px con pestaña, doble clic entre 30 % y 55 %
  y Ver › Distribución.
- El zoom se ajusta a toda la secuencia al abrir un proyecto y con el primer clip, y sigue ajustado al cambiar
  el ancho mientras no se toque. Mayús+Z pasa a llamarse «Ajustar a la secuencia».
- Estilo Rodaje: la rueda baja por las pistas (en el tiempo si se ven todas), Mayús+rueda desplaza en el tiempo
  y Alt+rueda cambia el alto de la pista. Clásico sigue igual.
- Las herramientas rápidas pasan a un desplegable «Herramientas» en la barra de la línea de tiempo, por grupos.
- Al arrastrar un clip cerca de cualquier borde, la vista se corre con velocidad según la cercanía.
- Sin selección, Propiedades muestra el formato y el contenido de la secuencia, con «Formato del proyecto…».
- D-051 en decisiones; guía de atajos y edición al día.


Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…s, guarda en transición por defecto y retoques de menú, texto y documentación (#440)

Claude-Session: https://claude.ai/code/session_01McEKRPdjUMhhDhVWKayc9r

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…24-oct y D-051 (#441)

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…ador por workflow_dispatch; la autoprueba tolera la caché de sombreadores vacía (#442)

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
La transferencia y los primarios viajan con VideoColor desde el flujo o el
cuadro hasta la textura. RenderShaders.SampleRgb, compartido por vista
previa y exportación, convierte una vez: PQ/HLG a luz lineal, BT.2020 a
BT.709, Hable normalizado al blanco de referencia y curva BT.709. SDR
conserva sus bytes. Nuevo parámetro animable «Brillo de referencia HDR»
(0 = 100 nits PQ / 1000 nits HLG) en la transformación del clip. El aviso
de importación pasa a informativo. Pruebas con cuadros sintéticos NV12/P010
y regresión SDR byte a byte frente al shader anterior.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…#443)

Panel «Gráfica» con desplegable de parámetros animables (efectos, audio y
máscaras), eje de tiempo compartido con la línea de tiempo, selección por
clic, Ctrl+clic y recuadro, arrastre de grupo en un paso de deshacer, asas
Bézier, Supr y copiar/pegar con el núcleo de #345. Geometría pura en
KeyframeGraphGeometry con pruebas. Entrada en Ver > Paneles; por defecto
elige el primer parámetro con fotogramas clave; rombos y asas más grandes.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…dor (#445)

IndexEntryKind.App se lee de "kind": "app" en indice.json. Rodaje no las
instala: AvailableVersionsAsync las omite como a los modelos. Con prueba
en SignedIndexTests.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…azamiento y asas en toda la selección (336) (#446)

La rampa del clip (SpeedCurve) entra en la pestaña Gráfica como parámetro
sintético: sus puntos son keyframes lineales en tiempo de línea y factor ×,
y toda edición (arrastre, Supr, pegar) vuelve por TimelineEdits.SetCurve,
el mismo camino que el inspector de velocidad, sin duplicar el motor.
El panel se desplaza en ventanas bajas y las asas Bézier se dibujan y
responden en todas las claves seleccionadas.

Pruebas: SpeedGraphTests (ida y vuelta, extremos, ventana de clip dividido,
catálogo y equivalencia con SpeedEditor.DragPoint); 441/441 en App.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…lan por fases (#447)

Pruebas nuevas: rampa P010 de 1024 códigos por compositor y conversor
(BitDepthChainTests), exportación entera con cada códec disponible vuelta
a leer con ffmpeg (ExportBitDepthTests, larga), rampa CinemaDNG de 12 bits
por el módulo RAW y por la importación a ProRes. docs/hdr.md con las cifras
y las fases A a D; D-053 como propuesta pendiente de Daniel.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…scaras, estilo de texto y sombra de arrastre del grupo (#448)

* feat(inspector): soporte de seleccion multiple en propiedades, velocidad, filtros, mascaras, texto y sombra de arrastre

- Propiedades: restablecer filas/secciones, volteo H/V, modo de mezcla, preajustes de audio y movimiento en un unico paso de deshacer.
- Velocidad: velocidad fija aplicada a clips seleccionados en un unico paso; '—' en RateBox cuando los valores difieren; curvas y congelacion desactivadas con seleccion multiple.
- Filtros: anadir filtro en bloque, remover filtro comun a los seleccionados y editar parametros comunes con soporte de valores mixtos '—'.
- Mascaras: edicion de parametros comunes en la mascara seleccionada por indice a traves de multiples clips en un unico paso.
- Texto: edicion de estilos de texto (fuente, tamano, color, trazo, sombra) en un unico paso conservando el texto individual de cada clip y mostrando '—' para valores mixtos.
- Timeline: proyeccion de la sombra de arrastre (drag shadow) para todos los clips del grupo seleccionado durante el arrastre.
- Cobertura de pruebas unitarias completada para todos los escenarios agregados.

Co-Authored-By: Gemini 3.8 Flash <noreply@google.com>

* Revisión de la selección múltiple 2: nota de títulos en Filtros, rampas fuera de la velocidad en grupo y CA1859

- FiltersPanel: la nota de los títulos salía al revés (visible en clips normales, oculta en títulos).
- SpeedPanel: con varios clips, el deslizador se desactiva si alguno tiene rampa o está congelado (el encargo excluye las rampas); con un título o una imagen fija solos vuelve el mensaje que explica por qué.
- ClipPropertyEditor: ResetAsync por lista de clips delega en la variante por efecto (quita ~40 líneas duplicadas).
- CA1859 en Targets/EditingTargets de Filtros y Máscaras: la compilación Release con -warnaserror fallaba con 4 errores.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Gemini 3.8 Flash <noreply@google.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…alelo y los hilos se cuentan por mediana (#449)

- StressHarnessTests corre en una colección sin paralelismo: su instantánea del proceso (ClrMD) lo pausa y en la CI dejaba sin correr a MixerTests y TimelineStressTests (vigilante 13,6 s sin mirar; instantánea > 60 s).
- EventLeakMeasureTests exige la mediana del crecimiento por tramo de los identificadores Thread, no el total: un hilo ocioso que termina en un tramo ya no vale por «no se contaron».
- MixerTests Preview_and_export: al vencer, el mensaje trae miradas, hueco máximo, tiempos y pilas.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: agy (gemini-4-argon) <noreply@google.com>
…ake al cargar, barra de la línea de tiempo plegable y despertar del reproductor tras cerrar (#450)

* Cuatro arreglos pequeños: cierre sin ObjectDisposedException, nombres con mojibake, barra de la línea de tiempo a 1366 px y término «fotograma»

- PlayerEngine: un solo Wake() que no señala el AutoResetEvent tras Dispose (la carrera con PackageService.RefreshAsync al cerrar); MainWindow ignora cambios de paquetes con la ventana cerrada.
- ProjectSerializer repara al abrir los nombres UTF-8 leídos como Latin-1 («Subtítulos»), con prueba de ida y vuelta.
- La barra de la línea de tiempo pliega marcadores, regiones y los interruptores secundarios en un botón «…» y compacta los selectores por debajo de 1440/1370 px; Deshacer y Rehacer van antes y no desaparecen. Los elementos del desplegable toman texto y acción del registro de atajos.
- «cuadro» → «fotograma» en todos los textos visibles de la interfaz, Core y la documentación que los cita; queda «cuadros por segundo».

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: agy (gemini-3.8-flash) <noreply@google.com>

* SpeedPanel: último «cuadro» de la interfaz pasa a «fotograma»

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: agy (gemini-3.8-flash) <noreply@google.com>
- La pérdida de 65 niveles (812 de 877) estaba en la rampa de ExportBitDepthTests, no en Rodaje: ffmpeg tomaba el crudo sin etiquetar por BT.601 limitado y lo estiraba a completo. Con rango y matriz en la entrada, la fuente tiene 1024 y FFV1, ProRes HQ y DNxHR HQX dan 877 de 877.
- Fuentes de más de 10 bits (yuv444p12, yuv422p12...) suben con la palabra entera de 16 bits (FramePixelFormat.P016; textura P016 o, si la GPU no la muestrea, P010) en vez de bajar a P010: 3072 de 4096 niveles en el intermedio.
- Imágenes fijas de más de 8 bits suben como R16G16B16A16_UNORM premultiplicado (FramePixelFormat.Rgba16); las de 8 bits siguen en BGRA8.
- Visor en R10G10B10A2 con monitor de 10 bits por color, con preferencia «Visor de 10 bits» (automático, siempre, nunca) en Rendimiento.
- docs/hdr.md con las cifras nuevas; pruebas en BitDepthChainTests, StillImageTests, CompositorTests (WARP) y ViewerBitDepthTests.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
… el foco en texto (#452)

Un «50» colado en «100,0» daba 50100 % de escala (501×, valor que el
modelo admite a propósito): el visor se veía negro y el cuadro, de 58 px,
solo dejaba ver la cola «0» del número. El cuadro ahora escribe lo que
quedó de verdad tras el commit y su columna crece con el número. Con el
foco en el cuadro, Ctrl+A y Fin llegaban a la línea de tiempo: el tipo de
foco se decide por el origen de la tecla, no solo por el FocusManager.

Pruebas: ToModel(50) = 0,5, ToModel(7051) = 70,51 y ToModel(50100) = 100;
el flujo con keyframes (rombo en 0 s, 50 % en 3,056 s) mantiene 50 % hasta
el final en el editor y en el motor.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Dathinel and others added 30 commits October 31, 2026 21:31
…alizaciones… y ajuste en Preferencias (#482)

* Aviso de versión nueva: consulta diaria a GitHub, Ayuda › Buscar actualizaciones… y ajuste en Preferencias

Al arrancar, como mucho una vez cada 24 h, la app pide releases/latest de Dathinel/rodaje (sin credenciales, 5 s de plazo, fuera del hilo de la interfaz) y, si la etiqueta vMAYOR.MENOR.PARCHE es mayor que la versión del ensamblado, avisa en la barra con «Ver novedades» (abre la página de la release) y «Más tarde» (no vuelve a avisar de esa versión). Sin red, con error o con etiqueta rara, silencio. Ayuda › Buscar actualizaciones… consulta en el momento y responde también «Tienes la última versión» y «No se pudo comprobar». Preferencias › General › «Avisar cuando haya una versión nueva», activado de fábrica.

La lógica va en Services/Updates sin WinUI, detrás de IReleaseSource, con pruebas con JSON falso en tests/Rodaje.App.Tests/Updates. Documentado en el CHANGELOG, la guía de instalación y docs/pruebas-a-mano.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5xdGASKQ2ETofxTXJ9

* Prueba del aviso de versión: la consulta a mano sí anota la hora

ConElAvisoApagadoNoSeConsultaAlArrancarPeroSiAMano comprobaba LastUpdateCheck vacío después de la consulta manual, que la anota como cualquier otra. La aserción va antes, tras el arranque saltado.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5xdGASKQ2ETofxTXJ9

---------

Co-authored-by: Claude <noreply@anthropic.com>
… curvas por PQ, miniatura y osciloscopios, HDR del monitor (D-057; para la 1.1) (#478)

* HDR, fase C, parte 3: MaxCLL/MaxFALL medidos, «Expandir a HDR», LUT y curvas por PQ, miniatura y osciloscopios en SDR, HDR del monitor de la ventana (D-057)

- Exportación HDR10: «Medir MaxCLL/MaxFALL antes de codificar» (`MeasureLightLevels`) añade la pasada previa `MeasuringLight`; `ContentLightMeter` reduce en la GPU la composición lineal entera y lo medido llena `ExportColor` antes de arrancar ffmpeg, sale en el trabajo y en la notificación. Sin la pasada siguen los valores declarados.
- «Expandir a HDR» por clip (`rodaje.transform` / `hdrExpand`, apagado; pico en `hdrReferenceNits`, 203–1000): curva inversa de BT.2446-1 método A normalizada al pico y anclada en el gris del 18 % (`SdrExpansion` como referencia en la CPU) en la rama SDR de `ToLinear2020`. En una secuencia SDR no actúa.
- En una secuencia HDR la LUT y las curvas trabajan en PQ (lineal → PQ → tabla → lineal); una LUT se interpreta como LUT de HDR10.
- La miniatura de exportación (variante `TONEMAP`) y los osciloscopios (`space.x`) recortan a SDR como `PresentHdr`.
- `DisplayHdr` pregunta por DisplayConfig si el monitor de la ventana está en HDR: «Visor HDR: Siempre» ya no quema la imagen en un monitor SDR y «Automático» solo usa scRGB con HDR conocido.
- Pruebas: `SdrExpansionTests`, `HdrExpandTests`, `HdrPart3Tests`, `ViewerBitDepthTests` y, larga, `ExportBitDepthTests.Measured_light_levels_reach_the_file`. Documentado en `docs/hdr.md`, D-057, `formato-proyecto.md` y CHANGELOG (sección para la 1.1).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5wTaUT7jvYvFgN7wi4

* ContentLightMeter: el tamaño del búfer no se llama como el puntero del bytecode (CS0136)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5wTaUT7jvYvFgN7wi4

* Pruebas de la app: enlazar DisplayHdr.cs y quitar una comprobación siempre cierta (CS8794)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5wTaUT7jvYvFgN7wi4

* SdrExpansion: la primera rodilla de BT.2446 A donde los tramos se cruzan (0,8209), para que la curva no baje

Con la rodilla publicada (0,7399) los coeficientes redondeados del método dejan un salto de 0,0005 en Y'p y la curva
bajaba en 0,31 lineal (SdrExpansionTests). Mismo valor en el shader.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5wTaUT7jvYvFgN7wi4

* Shader de expansión: bases de pow acotadas (X3571 con avisos como errores)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5wTaUT7jvYvFgN7wi4

* Autoprueba: decir si los shaders de efectos no compilaron (sin ellos no se dibuja ningún título) y volcar el informe de fallo en la CI

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5zrg7QoKYpfsAXt9Sz

* Curvas por PQ: una sola salida en Curves, que fxc daba X4000 y PsGraded no compilaba (el visor se quedaba sin títulos)

Con el return dentro del [branch] d3dcompiler avisaba «use of potentially uninitialized variable (Curves)» y, con los avisos
como errores, ninguna variante avanzada de PsGraded compilaba en el hilo de fondo: el motor seguía sin títulos ni efectos y
la autoprueba veía el título profesional igual que el simple (0 píxeles). Prueba nueva en HdrPart3Tests: en una secuencia
SDR una LUT y una curva de identidad dejan la imagen igual (y compilan la variante que dibuja los títulos).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5zrg7QoKYpfsAXt9Sz

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
…abecera y asas de fundido de audio (#485)

* Exportar: rango «Entre la entrada y la salida» con las marcas I y O de la secuencia

El panel de exportación ofrece el tramo marcado con I y O (o con la
herramienta de rango) y se abre en él; con una sola marca, la otra es el
principio o el final de la secuencia. Pruebas de ExportRanges y del
modelo, guía de Exportar y de Edición, historial y docs/pruebas-a-mano.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yww6teJT1xQ1CxrFm

* Línea de tiempo: solo de pista desde la cabecera, con solo exclusivo y velo en las pistas que callan

La cabecera de cada pista de audio trae la S del mezclador (Ctrl+clic:
solo exclusivo), también en su menú; los clips de las pistas calladas por
un solo se velan como silenciados, con la misma regla de buses que el
motor. Acciones de teclado para la pista elegida (silenciar u ocultar,
solo, bloquear), sin tecla de fábrica. Pruebas, guía, historial y pruebas
a mano.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yww6teJT1xQ1CxrFm

* Audio: asas de fundido en los clips, curva del fundido y fundidos hasta el cursor

Cada clip de audio lleva dos asas en las esquinas de arriba que se
arrastran para fijar fadeIn y fadeOut (globo de segundos, zona apagada
dibujada con la curva, un paso del historial por arrastre). Opción
fadeShape del efecto de audio (potencia constante por defecto, lineal o
exponencial) en el registro, el motor y Propiedades › Audio › Curva, sin
subir el formato. Menú del clip y acciones sin tecla «Fundido de entrada
hasta el cursor» y «Fundido de salida desde el cursor». Pruebas de
núcleo, motor, lógica de las asas y sesión; guía, formato, historial y
pruebas a mano.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yww6teJT1xQ1CxrFm

* Compilación: nombres completos para LoudnessNormalizer y FadeHandles desde las vistas (CS1061)

En TimelineView, «Services» es la propiedad EditorServices, no el espacio de
nombres: se escribe el nombre completo. Lo mismo, por prudencia, en el panel
de Propiedades.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yww6teJT1xQ1CxrFm

* Prueba de fundidos hasta el cursor: abrir el video ya deja historial; se comprueba que no se añadan pasos

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yww6teJT1xQ1CxrFm

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
…cronía por el sonido, montaje al ritmo, lote de proyectos y rueda de desplazamiento (#484)

* Exportar: muestreo de color en Avanzado y «Copiar la línea de ffmpeg»

El submuestreo 4:2:0/4:2:2/4:4:4 se elige en Avanzado según lo que admite
el codificador y se ve en la línea «Formato». Un enlace copia al
portapapeles los argumentos exactos con los que Rodaje lanza ffmpeg.exe
(ExportCommandLine en Rodaje.Export, con el entrecomillado de la consola
de Windows); FfmpegPipeSink.CommandArguments arma la lista sin tocar el
disco. Guía, CHANGELOG y docs/pruebas-a-mano.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Sincronizar por el sonido: alinear clips de la línea de tiempo por su audio

Con dos o más clips con sonido elegidos (la cámara y la grabadora), la
acción analysis.syncAudio compara sus formas de onda con el mismo análisis
de la multicámara y mueve los demás, con sus enlazados, para que suenen a
la vez que el que empieza antes (AnalysisEdits.AlignByAudio, un paso del
historial, con pruebas). En Herramientas › Audio, el menú del clip y la
barra de herramientas rápidas; guía, CHANGELOG y pruebas a mano.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Montaje al ritmo: los clips seleccionados terminan en el pulso que les toca

En Detectar ritmo, con la música y los clips del montaje seleccionados,
una casilla nueva ajusta cada clip (de izquierda a derecha, pista por
pista) para que termine en el pulso que toca cada N pulsos y corre lo que
sigue con ripple de pista (AnalysisEdits.FitToBeats, con pruebas): sin
pasar del material, con los enlazados y en el mismo paso del historial
que los marcadores. Guía, CHANGELOG y pruebas a mano.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Exportar: «Otros proyectos…» manda varios .rodaje a la cola con los ajustes de ahora

ProjectBatch (sin WinUI, con pruebas) abre cada archivo elegido, toma su
primera secuencia entera y arma la salida junto al .rodaje con su nombre
(numerada si ya existe o espera en la cola), saltando con su motivo los
que no se pueden abrir, los vacíos y el proyecto abierto; sin el recorte
de la secuencia actual. El botón del pie de Exportar confirma la lista y
encola. Guía, CHANGELOG y pruebas a mano.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Ruedas de color: rueda de desplazamiento (offset) antes de sombras, medios y luces

Cuatro parámetros nuevos del efecto rodaje.wheels (offsetRed/Green/Blue y
offset, de −0,5 a 0,5, con 0 por defecto: los proyectos viejos no
cambian) que viajan en los .w libres de lift, gammaExp y gain y se suman
al color antes de las otras ruedas en PsGraded. La referencia de la CPU y
una prueba de GPU nueva lo comprueban; el control de ruedas toma su
cuenta y sus nombres de WheelMath. Formato del proyecto, guía, CHANGELOG
y pruebas a mano.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Documentación: índice con la página de pruebas a mano

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Sincronía por el sonido: el aviso dice el desfase real; lote con la ruta abierta protegida

La edición mueve los mismos objetos Clip, así que el inicio de antes se
guarda aparte para el aviso. ProjectBatch normaliza la ruta del proyecto
abierto con la misma guarda que las elegidas. El fixture del sitio
ocupado ya no parte con un solape.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Documentación XML completa en FitToBeats y en los argumentos del sink (CS1573)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Compilación: using de EditorServices en la sincronía y literal del caso de entrecomillado

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Pruebas del montaje al ritmo: id de clip que no choca con la pista y reversa con su mapa ajustado

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Prueba del montaje al ritmo: en reversa, acortar por la derecha corre SourceIn

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

* Pruebas: PNG sin pérdidas en la línea de ffmpeg, ruta sin espacios sin comillas y proyectos válidos en el lote

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5yDwydk6Ru6cYknLUQ

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…cas y el asa de fundido se agarra a 10 px (#489)

Visto con el ratón el 1-nov: tras Alt+X la regla seguía sombreando el tramo viejo (el overlay conservaba el rango) y el asa de fundido se escapaba con 7 px y se arrastraba el clip.

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
… lanzadas)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e respaldo (D-059; para la 1.1) (#488)

* HDR, fase D, primera parte: CinemaDNG revelado en la GPU con LibRaw de respaldo (D-059; para la 1.1)

modulo-raw 1.1.0 suma «mosaico»: LibRaw desempaqueta el DNG, resta el
negro y entrega el mosaico de Bayer de 16 bits sin interpolar con el
patrón, el blanco, el balance pedido y la matriz rgb_cam; «info» dice en
«bayer» si el cuadro vale para ese camino. GpuRawDeveloper
(Rodaje.Render/Raw) lo revela en un compute shader de Direct3D 11:
balance con recorte a 1, interpolado de Malvar-He-Cutler, matriz,
exposición y curva, en el orden de dcraw_process. MosaicDeveloper
(Rodaje.Core/Raw, con BayerPattern y RawDevelopParameters) es la misma
receta en la CPU y la referencia de las pruebas: el shader contra ella
en WARP a ±1/2048, la referencia contra LibRaw sobre el mosaico del
módulo a menos de 0,006 en los parches, y la importación por los dos
caminos con el mismo ProRes.

Importar CinemaDNG usa la GPU por hardware si el módulo anuncia
«mosaico» y el cuadro es Bayer; sin GPU (WARP no cuenta), con el módulo
1.0.0 o con X-Trans, Foveon, DNG lineal o cuadros girados sigue por
«revelar» como en la 1.0.2. El diálogo dice en cuál se revela y la
notificación trae los milisegundos por fotograma. docs/hdr.md con las
cifras medidas (referencia en la CPU) y las que faltan del RTX 3050,
D-059, CHANGELOG, arquitectura y pruebas a mano.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5xGZDKbe47UzdJpT9f

* CinemaDngImport: VideoLayout sin ambigüedad con Rodaje.Render y el token de cancelación al final (CA1068)

La CI de Windows no compilaba la app: con «using Rodaje.Render» hay dos
VideoLayout (alias al del protocolo) y el analizador exige el
CancellationToken como último parámetro de RunAsync.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5xGZDKbe47UzdJpT9f

* Fase D: «mosaico» en el catálogo que viaja con la app y tolerancia de media precisión en las pruebas GPU contra CPU

PackageServiceTests exige que las funciones de cada módulo coincidan con
catalogo.json. Y por encima de 1,0 (exposición +1,5 EV) una unidad de
rgba16f es 1/1024, no 1/2048: la tolerancia pasa a una unidad de media
precisión del valor de la CPU (la CI de Windows dio 0,00098 en WARP).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5xGZDKbe47UzdJpT9f

---------

Co-authored-by: Claude <noreply@anthropic.com>
…o a la ventana, Ctrl+C/V reservados en listas, menú Reproducción, autoguardado desde el cambio de intervalo y «Guardar como» de las hojas (#486)

- Services/Shortcuts: cada tipo de primer nivel en su archivo (46 archivos; el
  contenido no cambia salvo los comentarios de TimelineShortcuts y
  ShortcutCatalog).
- SaveAge pasa de Rodaje.Core/Serialization a Rodaje.App/Shell, junto a
  MainWindow, su único uso; sus pruebas van a Rodaje.App.Tests/Shell y las de
  SetInterval y ClampMinutes a AutosaveScheduleTests.
- ShortcutRouter: con el foco en una lista, Ctrl+C y Ctrl+V son de la lista
  (como Supr, Retroceso y Ctrl+A) y no tocan el portapapeles de clips;
  Ctrl+Mayús+V sigue pegando en el cursor. Prueba nueva.
- Menú Reproducción en la barra de título (Reproducir o pausar, fotogramas,
  inicio, final, Ir a tiempo…, Capturar fotograma); «Ir a tiempo» sale de
  Editar. Prueba en TitleBarMenuTests.
- AutosaveSchedule.SetInterval recibe la hora y cuenta el intervalo nuevo desde
  ese momento, no desde el primer cambio sin copia. Pruebas nuevas.
- La guía de atajos explica debajo de Edición las dos teclas de «Pegar en el
  cursor» y qué pasa con el foco en una lista; docs/guia/atajos.md regenerada a
  mano con el mismo texto y una prueba que lo comprueba.
- «Guardar como…» para las hojas: la hoja rápida (HTML y PNG) y Ayuda › Hoja de
  atajos (imprimible)… abren el diálogo de guardar de FileDialogs, con la
  carpeta recordada (SaveDialogKind.Shortcuts); nombres y filtros en SheetFiles
  (con pruebas).


Claude-Session: https://claude.ai/code/session_01CfAg5xEE4w8nMRdLxTPerR

Co-authored-by: Claude <noreply@anthropic.com>
…medios de otro proyecto (#487)

- «Pegar insertando» (Ctrl+Alt+V en los tres estilos, Editar y menú del clip): abre un espacio del largo de lo copiado en las pistas donde cae, con los enlazados de lo que se corre, en vez de tapar.
- Copiar y duplicar llevan las transiciones entre los clips copiados; al pegar se ponen entre las copias y se concilian con sus cortes.
- Al pegar en otro proyecto, el medio que falte se importa por la ruta de su archivo (si ya está con otro identificador se usa ese); si el archivo no existe, aviso y no se pega nada.
- Guía de atajos regenerada; guía de edición, CHANGELOG y pruebas a mano al día.
- Pruebas en Core (pegar insertando, transiciones, resolución de medios) y en la sesión (importar por ruta, aviso, deshacer).


Claude-Session: https://claude.ai/code/session_01CfAg61PR4J9CWT44MWUt4w

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…preguntas para Daniel

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… capturado, el CFA se valida en sus ocho filas, pegar en el mismo proyecto resuelve por identificador tras reenlazar, SetInterval con el mismo intervalo no reinicia el autoguardado y el diálogo CinemaDNG decide GPU/CPU con el criterio de la importación (#490)

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…D-059, arquitectura y CHANGELOG enlazan en vez de repetir (#491)

Co-authored-by: Dathinel <221246794+Dathinel@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…s contra la lista de paquete.json e «instalar desde archivo» pide confirmación para un módulo fuera del índice firmado

Co-Authored-By: Codex (OpenAI, gpt-6.1-sol) <noreply@openai.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…erminal)

«Crema» se inspira en CreamUI de @sammwyy (Apache-2.0) con colores propios y una nota
de agradecimiento discreta en el selector de tema.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…s con tope, redirects solo HTTPS y extracción sin enlaces

- ModuleProcess comprueba que el cliente del pipe es el proceso que se lanzó (GetNamedPipeClientProcessId); un proceso extraño ya no puede ocupar el nombre.
- integridad.json (SHA-256 por archivo) se escribe al instalar cada paquete y se verifica al cargar módulos instalados y el codificador GPL; si falta (instalación antigua), la primera carga toma la base actual.
- SafePaths.IsInside además rechaza componentes del árbol que sean puntos de reanálisis (un enlace dentro del paquete es un escape; que la carpeta de instalación cuelgue de una unión sigue siendo válido).
- Catálogo, versiones y descargas siguen redirecciones solo a HTTPS, con tope de saltos y sin reenviar Authorization/Cookie/Host.
- El manifiesto del módulo tiene tope de 256 KB; FileDownloader rechaza entradas que superen el tamaño máximo del índice antes de pedir un byte.
- SignedIndex detecta entradas duplicadas con un conjunto en vez de una búsqueda cuadrática.
- ILCompiler fijado a 10.0.14 (Directory.Build.targets) y pruebas nuevas para cada comportamiento.

Co-Authored-By: Codex (OpenAI, gpt-6.1-sol) <noreply@openai.com>

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…portar)

Seis recorridos completos por función: recorte (duración y primer cuadro), velocidad
al 200 % (mitad de duración y marcas de audio en su sitio hasta el final), fundido
cruzado (suma y mezcla en el medio, contra la propia composición del editor), título
(dentro y fuera de su intervalo), efecto de color en un clip y no en su vecino,
keyframes de exposición interpolados y dos pistas con PiP semitransparente recortada
(orden y mezcla). Cada uno importa el medio sintético, aplica la edición con las
órdenes del editor, guarda el .rodaje, lo reabre del disco, exporta y verifica el
archivo de salida cuadro a cuadro.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…ir y exportar)

Un clip de referencia a 0 dB y otro a −10 dB con fundido de 1 s: en el mp4
exportado el nivel sube durante el segundo del fundido y después queda en la
relación esperada (≈0,32 de la referencia), medido sobre el audio decodificado.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…y exportar)

Tres ediciones (corte, desaturación, recorte del final), dos deshechas y una
rehecha: el archivo exportado muestra exactamente lo que quedó en la línea de
tiempo — la primera mitad en color, la segunda en blanco y negro y los 4 s
completos sin el recorte.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…reabrir)

El mismo proyecto con recorte, transición, efecto, título y audio exporta una
vez en memoria y otra tras guardar el .rodaje y reabrirlo del disco: los dos
archivos se comparan cuadro a cuadro en luma y muestra a muestra en audio.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…json y las uniones de prueba se quitan con rmdir

El instalador escribe integridad.json en todo paquete instalado: las pruebas de
contrato que esperan la lista exacta lo incluyen. Directory.Delete no puede
borrar una union colgada; el Dispose las quita con rmdir antes que las carpetas.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Documenta por que el script esta en cuarentena: ejecuta dotnet test sobre
salida del modelo sin sandbox, la lista negra se salta y en tareas caza la
entrada sale del repo publico.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant