Skip to content

Releases

InteriorAI 4.2.0

Choose a tag to compare

@SergioVelmay SergioVelmay released this 08 Nov 16:11
3741810

La geometría de tu esquema 3D, medida y a la vista: superponerlo sobre cualquier imagen, saber
cuánto se parece y poder componer directamente desde él. Bitácora:
docs/pasos/README.md (Pasos 46 a 56).

Actualización desde la 4.1.0: sin cambios en el .env ni migración de datos. Las indicaciones
guardadas con cada imagen (indications) son un campo nuevo que la 4.1.0 ignora.

Añadido

  • Superponer el esquema 3D y medir la geometría (Pasos 47, 49 y 51, B-116, B-119): si la
    imagen base es un esquema 3D (el de SketchUp con la perspectiva marcada), bajo la imagen en
    grande de Bocetos, Composición y Render final hay dos casillas excluyentes con una opacidad
    común: «Superponer esquema 3D original» pinta sus aristas en rojo sobre la imagen tal cual, y
    «Superponer esquema 3D corregido» las mueve para que encajen lo mejor posible, útil cuando el
    modelo ha corrido la escena entera. No se retoca nada: la superposición es una vista. La medida
    aparece en «Fidelidad al esquema 3D», bajo el título (aristas que coinciden a ±3 y ±8 px, y
    en la corregida también cuánto se ha movido el encuadre), y el pie de cada miniatura lleva la de
    ±8 px, para elegir la más fiel de una tanda.
  • Componer desde el esquema 3D (Paso 50, B-116): los dos botones de Composición tienen ahora
    casillas para elegir qué recibe el modelo. Puedes partir de la imagen de siempre, solo del
    esquema 3D
    —entonces es él el que se edita y la geometría se respeta más— o de las dos.
  • Tus indicaciones, con cada imagen (Paso 46, B-115): lo que escribes al generar bocetos,
    composiciones y renders finales queda guardado con cada imagen (indications) y se ve en su
    trazabilidad; las observaciones de la auditoría, en su informe.
  • La portada del proyecto activo, en grande (Paso 51, B-118): con muchos proyectos, al elegir
    uno del final de la galería su ficha quedaba lejos de su tarjeta y se perdía de vista cuál
    estabas mirando. Ahora su portada se repite a todo el ancho, encima de la ficha.

Cambiado

  • Los prompts de imagen ya no abren el plano (Paso 50, B-116): se retiran de las
    instrucciones el «gran angular moderado» y las «verticales rectas» del render final —pedían
    justo el defecto que perseguíamos— y los tres prompts llevan un bloque de cámara que manda
    conservar el encuadre del esquema.
  • Consejo nuevo sobre la vista de SketchUp (Paso 54, B-117) en el manual: exporta la vista
    como una fotografía de interiores al uso, con dos puntos de fuga y focal normal. Medido sobre la
    misma escena, a 60 mm la fidelidad fue del 48–53 % y con un gran angular equivalente bajó al
    42–43 %.

Corregido

  • Cuadros de texto que no se vaciaban (Paso 46, B-115): las indicaciones, el cambio del
    retoque y las observaciones de la auditoría seguían escritos tras enviarse, al cambiar de
    imagen y al cambiar de proyecto, y se podían enviar por error con otra. Ahora se vacían al
    enviarse con éxito (con error o cancelando se conservan) y al cambiar de proyecto, que también
    desmarca «Usar la auditoría» y «Usar el retoque»; las observaciones, también al cambiar de
    boceto. Tras un retoque, «Usar el retoque» se desmarca.

InteriorAI 4.1.0

Choose a tag to compare

@SergioVelmay SergioVelmay released this 02 Nov 14:29
ed973f2

Descartar y recuperar candidatas, vista previa al subir una referencia y una interfaz que no se
puede pulsar dos veces: mientras algo se procesa, sus botones y controles se apagan y no se
cambia de proyecto. Plan y bitácora: docs/pasos/plan-version-4-1.md
(Pasos 41 a 45).

Actualización desde la 4.0.0: sin cambios en el .env ni migración de datos. Las imágenes
descartadas usan un estado nuevo (descartado) que la 4.0.0 no lee.

Añadido

  • Descartar y recuperar candidatas (Paso 43, B-109) en Bocetos, Composición y Render final:
    un aspa en cada miniatura (salvo la seleccionada) y «Descartar» junto a «Seleccionar» la
    apartan al desplegable «Descartados (n)», al final de la pestaña (cerrado, solo si hay alguna),
    con un ✓ para recuperarla. No se borra nada; una descartada no se selecciona, retoca, audita ni
    repite hasta recuperarla, ni la IA la tiene en cuenta. API: POST …/renders/{id}/discard y
    …/restore; estado nuevo descartado (los datos con descartes no los lee la 4.0.0).
  • Vista previa al subir una referencia (Paso 41, B-108): la imagen elegida se ve en grande
    encima de sus notas; «Cancelar» vacía el formulario. La copia temporal de la subida se borra al
    cancelar, al cambiar de imagen o al subirla, y Gradio borra cada hora las de más de un día.

Cambiado

  • Botones bloqueados y apagados (Paso 42, B-110): mientras se ve «procesando» en la pestaña a
    la vista (la IA genera, se analiza una referencia, se carga una imagen o se guarda algo), sus
    botones y miniaturas se apagan y no responden; con una confirmación de coste abierta, solo
    «Confirmar (con coste)» y «Cancelar». Las pestañas y los desplegables siguen libres. Todo botón
    desactivado se ve gris oscuro, con el texto atenuado (antes se veía casi igual que activo).
    También se bloquean y atenúan los controles de la pestaña: casillas, opciones, deslizadores,
    desplegables, campos de texto y el lienzo del retoque (Paso 44, B-113).

Corregido

  • Con la papelera de un proyecto por confirmar, su «Cancelar» quedaba bloqueado (el bloqueo de
    B-110 lo tomaba por una confirmación de coste); y pruebas de extremo a extremo intermitentes
    (Paso 45, B-114).
  • El botón rojo («Confirmar (con coste)», «Confirmar: mover a la papelera») se aviva al pasar
    el ratón, como el resto de botones activos (Paso 43, B-112).
  • Cambiar de proyecto mientras se procesaba algo (Paso 43, B-111): con una referencia
    subiéndose se podía cambiar de proyecto, y al terminar Referencias mostraba la del proyecto
    anterior y su ficha no se guardaba («Asset no encontrado»). Ahora elegir, crear o mover a la
    papelera un proyecto se bloquea mientras haya algo en marcha en cualquier pestaña, y
    Referencias no guarda nada en el proyecto activo si lo que muestra es de otro: avisa y recarga.
  • Un proyecto podía no crearse al escribirlo mientras se creaba el anterior: al terminar, el
    formulario se vaciaba y se perdía lo escrito. Ahora el formulario se bloquea en el mismo clic
    mientras se crea, y el de subir una referencia, mientras sube y analiza (Paso 41, B-107).

InteriorAI 4.0.0

Choose a tag to compare

@SergioVelmay SergioVelmay released this 29 Oct 08:44
ebe4630

Prompts más precisos, sin la compatibilidad con la v1 (esquema de datos v3), documentación
pública con un manual de usuario hecho sobre un caso real, estándares de comunidad y costes
contrastados con la factura de Azure. Plan y bitácora:
docs/pasos/plan-version-4.md (Pasos 32 a 40). Documentación:
https://sergiovelmay.github.io/InteriorAI/.

Actualización desde la 3.x: los datos se migran solos al esquema v3 al arrancar (cada proyecto
conserva una copia en metadatos.v2.json); PROMPT_ARCHITECT_TIMEOUT_S es nueva y opcional
(300 s por defecto). Desde la 1.0.0, actualiza antes con la 3.0.0: la 4.0.0 ya no lee esos datos.

Añadido

  • Documentación pública en https://sergiovelmay.github.io/InteriorAI/ (Paso 34, B-099):
    MkDocs Material en GitHub Pages, publicada sola al integrar en main. Inicio, primeros pasos
    (instalación y configuración), versiones, seguridad y licencia.
  • Referencia técnica y desarrollo en la web (Paso 35, B-100): arquitectura, API REST con el
    Swagger (solo de consulta), datos y almacenamiento, IA y costes, interfaz; entorno, pruebas, CI
    y herramientas. El esquema OpenAPI se exporta a docs/referencia/openapi.json
    (python -m app.openapi) y un test vigila que esté al día. La API describe sus grupos de
    endpoints, su licencia y su contacto.
  • Manual de usuario en la web (Paso 36, B-101): un caso real hecho desde cero con la IA de
    Azure, «Cocina Abierta para Manual de Usuario», recorre cada pestaña y cada opción con sus
    capturas (de las referencias al render final de día, atardecer y noche, y los costes), más una
    página de consejos. La portada de la web muestra el render de noche del caso.
  • Comunidad (Paso 37, B-102): guía de contribución (CONTRIBUTING.md), código de conducta
    (Contributor Covenant 2.1), plantillas de issues (fallo y mejora) y de Pull Request, y la página
    «Contribuir» en la web. El repositorio enlaza la web y tiene temas; la Wiki, sin uso, se
    desactiva.

Cambiado (incompatible: API y esquema de datos)

  • Sin la compatibilidad con la v1 (Paso 33, B-056). Fuera los briefs (/briefs, su
    pipeline y sus prompts), las cadenas de la v1 en composición y render final, la auditoría
    frente a la captura y brief_id en las peticiones de render.
  • Esquema v3 de metadatos.json, con migración automática al arrancar (copia en
    metadatos.v2.json). Las imágenes de la v1 se conservan como imágenes sueltas, con su prompt
    y su coste, sin la cadena de la v1 (brief, rechazos, salidas en bruto ni sus retoques). Los
    datos de la 1.0.0 ya no se leen: actualiza antes con la 3.0.0.
  • Coste de la cadena: sin briefs. Ahora suma las recetas de las referencias enviadas como
    imagen, como ya decía la interfaz.

Cambiado

  • Prompts más precisos (Paso 32, B-054, B-094 a B-097). El PROMPT_ARCHITECT recibe más
    contexto: el resumen del análisis de cada referencia, el historial de la imagen de partida
    (también sus retoques) y las generaciones anteriores de la etapa. Ve las imágenes con más
    detalle y sigue unos criterios comunes:
    • medidas estándar de mercado cuando faltan o no cuadran, siempre como aproximadas;
    • dudas resueltas como un interiorista;
    • distribución de izquierda a derecha;
    • prompts más largos en frases completas;
    • un repaso final antes de responder.
  • PROMPT_ARCHITECT_TIMEOUT_S (nuevo, 300 s por defecto) y tope de salida de 32 000 tokens:
    con razonamiento high, el prompt de bocetos superaba el tope anterior y rozaba el timeout
    general.
  • Costes IA: un clic fuera del registro de llamadas oculta el detalle de la llamada
    seleccionada (Paso 38, B-106).
  • Costes contrastados con la factura de Azure del 24 al 27/10 (Paso 39, B-098): se estima con
    los precios de lista tal cual, sin el factor de ajuste (0,98463), para que la factura quede
    siempre por debajo. Las estimaciones y los resúmenes de la interfaz se muestran al céntimo
    hacia arriba
    (el umbral de confirmación de 0,20 € se compara con ese importe); el registro de
    llamadas, su detalle, el CSV y la API conservan el importe exacto. Costes orientativos del
    README y de la web al día.

Corregido

  • La estimación junto a cada botón ahora sigue las opciones elegidas: variantes y calidad en
    Bocetos, calidad en Composición y resolución en Render final. Antes mostraba siempre la de los
    valores por defecto; la confirmación ya calculaba bien (Paso 38, B-104).
  • Llamadas con error: figuran a 0 €, salvo los tokens que el modelo llegara a consumir (una
    respuesta incompleta sí se cobra). Un tiempo agotado del render final se estimaba con sus
    imágenes de referencia y Azure no lo cobra; el aviso de Costes IA lo explica (Pasos 38 y 39,
    B-105).
  • Render final: cada imagen de referencia se estima por los megapíxeles de su tamaño real
    (como factura Azure), no como 1 MP; la estimación junto a los botones tiene en cuenta la imagen
    de partida (unos 0,09 € desde una composición y 0,11 € desde otro render, a 4 MP). La
    auditoría se estima en 0,30 € (la mayor medida, 0,27 €) (Paso 39).

InteriorAI 3.0.0

Choose a tag to compare

@SergioVelmay SergioVelmay released this 27 Oct 06:53
a41e396

Pulido completo de la interfaz tras un caso real guiado («Personalización Cocina Los Molinos»)
y roles con nombres nuevos. Plan y bitácora:
docs/pasos/plan-version-3.md (Pasos 26 a 31). El README muestra
ahora capturas de cada pestaña.

Actualización desde la 2.0.0: renombra en el .env las variables de los roles (tabla de abajo);
los datos se leen tal cual, sin migración.

Cambiado (incompatible: variables del .env)

  • Roles renombrados (Paso 26, B-057). Solo valen los nombres nuevos, también en las
    variables DEPLOYMENT_ROLE_*, *_REASONING_EFFORT y GEOMETRY_AUDITOR_TIMEOUT_S del .env:
    renómbralas al actualizar. Si encuentra alguna con el nombre anterior, la aplicación avisa al
    arrancar (registro y python -m shared) y no la usa. Los datos guardados (telemetría e
    imágenes) se leen con los nombres nuevos, sin reescribirse.
Antes (hasta la 2.0.0) Desde la 3.0.0
PROMPT_ENGINEER PROMPT_ARCHITECT
FAST_DRAFT FAST_DRAFT_MAKER
STRUCTURAL_COMPOSER COMPOSITION_BUILDER
PHOTOREALISTIC_RENDERER REALISTIC_RENDERER
GEOMETRIC_AUDITOR GEOMETRY_AUDITOR
REFERENCE_ANALYST (sin cambios)
  • Costes IA por el rol actual de cada despliegue (B-057): una serie por rol; las llamadas
    antiguas de un modelo suman en el rol que lo usa hoy. El registro y el CSV muestran el rol
    actual; el CSV añade «Rol en la llamada» con el original. La API de costes sustituye
    by_role_deployment por role_deployments, by_day_role y by_project_role, y cada
    registro lleva call_role.
  • Estilo común (Paso 27): pestaña activa en blanco y negrita; escala única de imágenes
    (galerías de 2 o 4 por fila y miniaturas pequeñas de 3 o 6, sin miniaturas diminutas); letra
    pequeña en la ficha y en los pies; textos de Gradio en español sea cual sea el idioma del
    navegador («procesando» incluido); previsión de tiempo de cada acción desde la primera vez
    (B-058, B-063, B-064, B-066, B-079).
  • Proyectos y Referencias (Paso 27): 50/50; resumen sin «Brief», con las referencias
    activas y una línea por etapa; la pestaña Proyectos se recarga al entrar; vista previa de la
    referencia en su proporción y pie de sus miniaturas en dos líneas (B-059 a B-062, B-065).
  • Bocetos (Paso 28): a ancho completo, como Composición y Render Final; realistas y
    minimalistas, con solo lo marcado en las fichas (el prompt dice qué no tomar de cada imagen)
    y sin reproducir rótulos ni cotas de las referencias, también en la composición y el render
    final (B-067 a B-070).
  • Composición y Render Final (Paso 29): Auditoría y Retoque plegables (la auditoría,
    abierta si el boceto ya tiene una); editor de máscara con la herramienta activa resaltada, iconos
    más claros y la rueda del ratón para desplazar la página; aviso de que, con el retoque, las
    indicaciones solo actúan en la zona pintada; tabla de la auditoría sin palabras partidas;
    prompt con ajuste de línea; tamaño con su proporción («2448×1632 (3:2)») y sin «calidad» en
    el render final (B-071 a B-078).
  • Detalles finales (Paso 30): Proyectos sin «Actualizar», con «Referencias activas: 4 de
    4» y «Render final elegido: SÍ»; Composición sin numeración, con los apoyos primero y las
    imágenes de partida a 1/4 (también en Render Final); editor de máscara con la mano visible
    como herramienta y el tamaño siempre con su icono; «Imágenes enviadas al modelo de imagen» y,
    al final, el coste de la cadena; Costes IA siempre al ancho de las demás pestañas (B-082 a
    B-089).
  • Costes IA, nueva maquetación (B-080, B-081): colores vivos y muy distintos por rol, una
    leyenda común junto al coste por rol, y el coste por día y por proyecto apilados por rol a
    ancho completo. Los roles van agrupados, primero los de texto y después los de imagen
    (B-093).
  • README con capturas de las seis pestañas (Paso 31, B-023).

Corregido

  • «Procesando» junto a los botones con coste: salía recortado y, al confirmar, sobre los
    botones de la confirmación. Ahora ocupa la línea del coste y la confirmación se oculta al
    pulsarla, de modo que no se puede confirmar dos veces (B-090).
  • Correcciones propuestas de la auditoría con ajuste de línea, sin desplazamiento horizontal
    (B-091).
  • Tooltip de los gráficos de Costes IA desplazado respecto a la barra, incómodo en las
    estrechas (B-092).

InteriorAI 2.0.0

Choose a tag to compare

@SergioVelmay SergioVelmay released this 25 Oct 13:44
f30eab9

Rediseño del flujo: sin brief, con referencias analizadas (receta y ficha) y tres pestañas de
estudio (Bocetos, Composición y Render Final) con prompt automático en cada generación. Plan y
bitácora: docs/pasos/plan-version-2.md (Pasos 17 a 25).

Migración desde la 1.0.0: automática al arrancar; cada proyecto conserva metadatos.v1.json. El
cliente de la API (/api/v1) es el frontend: los cambios incompatibles están más abajo.

Cambiado (incompatible: esquema v2 de los datos y de la API)

  • /renders/final sin reference_ids ni seed: el renderizador recibe solo la imagen de
    partida y el prompt; nuevos source y variant_of (Paso 24).

  • Sin brief: cada generación escribe su propio prompt (PROMPT_ENGINEER) con sus entradas reales
    y guarda lo que ha entendido (RenderRecord.prompt_info); /renders/drafts ya no necesita un
    brief aprobado (Paso 22).

  • Proyecto con nombre y descripción: sin tipo de espacio, notas de diseño, dimensiones, estilo
    ni presupuesto (su contenido pasa a la descripción); sin /space-types ni crear --tipo
    (Paso 17, B-026).

  • Un solo tipo de imagen subida, referencia (sin capturas de SketchUp ni planos); la pestaña
    Assets queda con una sola lista (B-028).

  • Renders sin estados «rechazado» ni «descartado» y sin /reject ni /discard; una sola imagen
    seleccionada por etapa (B-048, B-043).

  • Retoques solo en composiciones, con la imagen completa del modelo: sin recomposición, sin
    retoque del render final, sin salida en bruto ni /raw (B-038).

  • Migración automática de metadatos.json al esquema 2 al arrancar (y al restaurar de la
    papelera), con copia del original en metadatos.v1.json.

  • El rol CONTEXT_MANAGER pasa a llamarse REFERENCE_ANALYST (DEPLOYMENT_ROLE_REFERENCE_ANALYST
    en .env); la telemetría anterior se lee con el nombre nuevo. Las fichas pasan a sol y los
    prompts a luna (Paso 18, B-052).

  • Solo STRUCTURAL_COMPOSER admite máscara (B-037).

Añadido

  • Render Final completo (Paso 24: B-037, B-040, B-051, B-055): fotografía realista de la
    composición seleccionada o del render final actual, con indicaciones globales en texto libre
    (noche, iluminación, ambiente, personas), proporción (3:2 por defecto) y tres resoluciones
    hasta 4 MP; «Otra versión» repite tal cual el prompt, la imagen de partida y la resolución.

  • Composición completa (Paso 23: B-038, B-039, B-045, B-046, B-055): auditoría opcional del
    boceto seleccionado frente a todas las referencias de perspectiva y geometría, con tus
    observaciones; retoque con máscara de la composición seleccionada (imagen completa del modelo,
    prompt escrito por la IA); y dos formas de generar, cada una con la miniatura de su imagen de
    partida: con el boceto seleccionado o con la composición actual, usando si quieres la
    auditoría y el retoque. Hasta 12 imágenes de apoyo, primero las del espacio; las que no caben
    se señalan en rojo.

  • Estudio en tres pestañas (Bocetos, Composición y Render Final) que se desbloquean en orden.
    Bocetos parte de las referencias activas, con 1-8 variantes, calidad y formato. Cada imagen se
    ve en grande con «Ver más»: lo que entendió la IA, sus dudas, el prompt y lo enviado al modelo.
    La confirmación de coste aparece junto al botón, con un umbral de 0,15 € (Paso 22: B-035,
    B-036, B-042, B-043, B-047, B-049).

  • Pestaña «Referencias» (antes Assets): cada imagen se sube de una en una con sus notas y se
    analiza al momento; su receta agrupa los ingredientes útiles (12 grupos, con «Otros») y la
    ficha de casillas guarda lo que el usuario quiere usar. Solo las referencias activas cuentan;
    descartar = desmarcar todo. API: /assets/{id}/analyze y /assets/{id}/sheet (sustituye a
    /assets/{id}/analysis). Paso 21: B-028 a B-030.

  • Pestaña «Costes IA»: solo gasto real (también en el resumen del proyecto); gráficos con
    Altair y leyenda «rol (despliegue)» completa; registro con despliegue y MPx, detalle de la
    llamada al seleccionar una fila y CSV con todas las columnas; precios con las tarifas en
    columnas y sus unidades (Paso 20: B-031 a B-034).

  • Proyectos: al abrir la app se activa el proyecto recordado o, si no hay, el último actualizado;
    el resumen desglosa el coste por rol y lista las llamadas de IA en un desplegable; la portada
    muestra la imagen más avanzada del proyecto; cabecera en el orden proyecto, backend y modo
    (Paso 19: B-025, B-027, B-044, B-050).

  • Esfuerzo de razonamiento por rol de texto en .env (PROMPT_ENGINEER_REASONING_EFFORT,
    REFERENCE_ANALYST_REASONING_EFFORT; medium por defecto), junto al del auditor (B-053).

  • Avisos de gasto real de IA: 3 € por proyecto y 10 € en total por defecto
    (COST_ALERT_PROJECT_EUR, COST_ALERT_TOTAL_EUR), en la cabecera, en Costes y al lanzar
    acciones con coste. Solo avisan (Paso 16, B-021).

  • El coste acumulado de una imagen incluye la indexación de las fichas de referencias que usó
    el brief (B-022).

Cambiado

  • Bocetos, Composición y Render Final son pestañas de primer nivel (sin «Estudio»); la imagen
    seleccionada se ve en su proporción original; la ficha de una referencia muestra solo los
    nombres (el detalle, al pasar el ratón); umbral de confirmación de 0,20 € (Paso 23).

  • Telemetría en costes_telemetria.jsonl (una línea por llamada, sin reescribir el archivo);
    el costes_telemetria.json anterior se migra solo y se conserva como .json.migrado (B-012).

  • uv 0.13 en las imágenes Docker (Dependabot, #18) y 0.13.5 en la CI, alineadas (antes 0.12).

Seguridad

  • Pillow 13.0.0 (~40 alertas, varias críticas), certifi 2026.10.23 y brotli 1.2.1 (una crítica
    cada uno). Gradio 6.30 exige pillow<13: se fuerza con override-dependencies de uv hasta
    que lo admita (B-024). uv.lock pasa al formato de uv 0.13 (hace falta uv ≥ 0.13).

Corregido

  • Estimación de costes ajustada a la factura real de octubre de 2026: factor sobre los precios
    de lista (× 0,98463), megapíxel binario y 1 MP por imagen de referencia en FLUX. El modelo del
    brief mantiene su precio de lista aunque Azure lo cobró a 0 €.

InteriorAI 1.0.0

Choose a tag to compare

@SergioVelmay SergioVelmay released this 18 Oct 18:39
e8f59b9

Primera versión completa: estudio de interiorismo asistido por IA con supervisión humana en
cada etapa.

Añadido

  • Configuración y seguridad (Pasos 0-3): repositorio público con secretos solo en .env
    (SecretStr), gitleaks y bloqueos en pre-commit; Docker Compose con puertos solo en
    127.0.0.1, usuario sin privilegios y frontend sin credenciales.
  • Almacenamiento y API (Pasos 4-5): proyectos en data/ con escritura atómica y bloqueo
    por proyecto, borrado suave a la papelera; API REST v1 (proyectos, assets con validación por
    contenido) y colección de Postman.
  • Azure AI Foundry por roles (Paso 6): seis roles funcionales, cliente único con modo mock,
    reintentos solo en 429/503 (nunca en un timeout).
  • Telemetría de costes (Paso 7): coste estimado por llamada con config/pricing.yaml.
  • Pipelines (Pasos 8-10): fichas de referencias, brief de diseño, bocetos, composición y
    render final; auditoría geométrica a demanda; selección, descarte y rechazo con comentarios.
  • Interfaz Gradio (Pasos 11-14): Proyectos, Assets, Estudio (ciclo HITL completo con
    confirmación de las acciones con coste en Azure) y Costes (por rol, día y proyecto; coste
    acumulado de cada imagen).
  • Retoques de zona (Paso 13b): pincel sobre composición o render final con recomposición
    local exacta; salida en bruto del modelo disponible como imagen; render final con la
    proporción exacta de la captura (16:9 → 1920×1080).
  • CI y seguridad del repositorio (Paso 15a): GitHub Actions (lint, tests, gitleaks sobre
    todo el historial, imágenes Docker, Postman y Playwright), Dependabot, escaneo de secretos con
    bloqueo en el push, protección de main y SECURITY.md.
  • Operación (Paso 15b): contenedores endurecidos (solo lectura, sin capacidades, sin
    escalada de privilegios, límites de recursos), usuario configurable (APP_UID/APP_GID) y
    comando de papelera (listar, restaurar, vaciar con confirmación).

Puesta en marcha y requisitos: README. Historia del proyecto, paso a paso: docs/pasos.