2.6.0: auditoría, 100 % local y 26 funciones verificadas

Sale a la red solo lo que se pide: la tipografía viene con el programa
(static/manrope.woff2) y el comprobador de versiones tiene interruptor en
Ajustes. Nueva prueba funcional (prueba_funcional.py) que levanta una copia
sobre un cliente de ensayo y ejercita las 26 funciones por su API, con una
conversión real: 26 de 26.

Fallos que sacó y quedan arreglados:
- Un renombrado solo de mayúsculas («10- octubre» → «10- Octubre») se
  descartaba en Plan.agregar y en mover; deshacer decía «sitio ocupado».
- Las carpetas que crea el plan no entraban en el inventario hasta el
  siguiente escaneo (_recontar_carpetas las da de alta y recuenta).
- Una fusión de carpetas cortaba en el primer archivo que tropezaba.
- «Viejo» era distinto en convertidor, stock y respaldo: ahora es_viejo.
- /api/actualizacion informaba versión vacía hasta la primera consulta.
- Filas de sueltos por carpeta de origen; mes del stock el más repetido;
  fuera tres rutas sin uso.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Este commit está contenido en:
Labstream
2026-09-24 20:57:41 -05:00
padre 9d4d1e9cc2
commit 1151320bf2
Se han modificado 7 ficheros con 645 adiciones y 32 borrados

Ver fichero

@@ -9,6 +9,7 @@ organizador.py ← servidor + inventario + plan + cola de conversión
reglas.py ← cómo reconoce cámaras, carpetas, basura y las plantillas de estructura
resolve_bridge.py ← convierte BRAW a H.265 10 bits usando DaVinci Resolve Studio
static/index.html ← la interfaz (Carpeta · Revisar y ordenar · Mapa · Convertidor · Respaldar · Historial · Ajustes)
static/manrope.woff2 ← la tipografía, para no pedirle nada a nadie fuera de este equipo
datos/ ← inventario.sqlite, config.json, diccionario.json (lo aprendido), bitacora.jsonl
```
@@ -521,6 +522,52 @@ Probado sobre un árbol de ensayo con un marzo de tres rodajes y un mayo de uno
en `03- Martes`, `11- Miércoles` y `19- Jueves`, mayo se queda sin carpeta de día, y aplicar y deshacer
dejan el árbol exacto.
2.6.0, auditoría: 100 % local y las 26 funciones verificadas una a una.
**Qué sale a la red.** Se buscó toda llamada externa en el código: había dos. La tipografía Manrope se
pedía a Google en cada arranque (y sin red la página esperaba a que fallara); ahora viene con el
programa (`static/manrope.woff2`, 25 KB, servida como `font/woff2`). Lo otro es el comprobador de
versiones, que consulta Labstream OS al arrancar: sigue igual pero con un interruptor en Ajustes
(«al arrancar, consultar si hay versión nueva»); apagado, el programa no habla con nada fuera de este
equipo. El botón «Buscar actualizaciones» funciona a mano en cualquier caso. Todo lo demás —inventario,
plan, conversión, respaldo, colores, mapa— es local.
**Verificación función por función.** `smoke.py` (en la carpeta de trabajo de la sesión) levanta una
copia del programa sobre un cliente de ensayo con de todo (cámara de dos días, exportados, proyectos,
música, stock de Envato viejo, basura, proxies, dos repetidos, un hueco, un mes en minúsculas y un clip
de video de verdad) y ejercita las 26 funciones por su API en el orden en que las usaría una persona,
incluida una conversión real con ffmpeg (H.265 10 bits por GPU), verificación, reemplazo y una copia de
respaldo con su índice. Resultado: 26 de 26. Por el camino salieron cinco fallos de verdad:
- **Un mes en minúsculas nunca se normalizaba.** «10- octubre» → «10- Octubre» es un renombrado que
solo cambia mayúsculas; en Windows los dos nombres son el mismo, y tanto `Plan.agregar` como `mover`
lo tomaban por «ya está en su sitio» y lo descartaban sin decir nada. El plan prometía «meses con
nombre completo» que nunca ocurrían. Ahora se propone, se aplica (`os.rename` sí sabe) y `deshacer` lo
devuelve (antes decía «su sitio original ya está ocupado», porque `exists()` también miente ahí).
- **Las carpetas que crea el plan no entraban en el inventario** hasta el siguiente escaneo
(`00_Grabacion`, `_Para borrar\basura`…): «existen», las carpetas vacías y los colores no las veían.
`_recontar_carpetas` las da de alta tras cada movimiento y recuenta las tocadas, con totales de
subárbol como los del escaneo; las que se quedaron sin nada y desaparecieron se dan de baja.
- **Una fusión de carpetas se quedaba a medias.** Si al fusionar «Grabacion mañana» sobre
`00_Grabacion/SONY` un archivo tropezaba (ya existía, estaba abierto), el bucle cortaba ahí, los
demás no se intentaban y el aviso hablaba de uno solo. Ahora cada hijo va por su cuenta y el aviso
cuenta cuántos se quedaron.
- **«Viejo» significaba tres cosas.** El convertidor miraba la fecha de modificación con meses de 30,4
días; el stock y el respaldo, el mes de la pieza (o la fecha del archivo) por meses de calendario.
Un clip de un rodaje de 2024 re-exportado ayer no era «viejo» para convertir. Ahora la regla es una
(`es_viejo` + `limite_meses`); con 0 meses no se filtra por edad.
- **`/api/actualizacion` decía versión vacía** hasta la primera consulta: `ESTADO` del actualizador trae
`version: ""` y pisaba la real al mezclar los diccionarios.
Y tres menores: cada fila de archivos sueltos era de una sola carpeta de origen (antes juntaba varias y
ponía la del primero), el mes de un grupo de stock es el más repetido (no el del primer archivo), y se
quitan tres rutas que nadie llamaba (`/api/diagnostico`, `/api/asistente/estado`, `/api/tour-visto`).
Lo que se miró y está bien: los 52 endpoints que usa la interfaz existen, todos los botones tienen su
manejador, la barra de tareas refleja escaneo, lectura de clips, cola, asistente, respaldo y descarga
de versión con su tiempo estimado, y la estimación de ProRes (por tasa nominal) y la copia de audio
(`-c:a copy` solo con AAC de una pista) resisten los casos del ensayo.
Probado el 9 sep 2026 sobre una copia de ensayo: plan → aplicar → deshacer → volver a aplicar deja el árbol
exacto; conversión ffmpeg verificada y reemplazo con original a `_Para borrar`. El puente de Resolve conectó
con Resolve Studio 21.1 pero no pudo abrir proyecto porque Resolve estaba en el Gestor de proyectos: