Skip to content

Fix audited generation, Wizard, World3D and review integrations - #404

Merged
IAnMove merged 3 commits into
developmentfrom
fix/integration-audit-20260912
Sep 12, 2026
Merged

Fix audited generation, Wizard, World3D and review integrations#404
IAnMove merged 3 commits into
developmentfrom
fix/integration-audit-20260912

Conversation

@IAnMove

@IAnMove IAnMove commented Sep 12, 2026

Copy link
Copy Markdown
Owner

Resumen ejecutivo

Qué cambia

Corrige los ocho fallos de integración de la auditoría: una intención remota no vuelve a ejecutar al proveedor al recuperar estado; Wizard continúa sin tener el navegador abierto; el render World3D funciona desde la aplicación compilada; el inspector y la revisión de producción ejecutan sus acciones reales.

Para qué sirve

Evita duplicar generaciones, perder borradores y presentar acciones como realizadas cuando solo cambiaba la interfaz. Por ejemplo, una imagen terminada continúa a upscale desde el servidor, y cambiar una toma guarda esa selección sin heredar la aprobación anterior.

Impacto para el usuario

Se recuperan los borradores sin guardar aunque se abran más de ocho documentos. Reanudar una tarea fallida crea un intento nuevo. Generar en el inspector devuelve una tarea verificable; Director permite guardar decisiones, regenerar tomas y descargar la selección aprobada. Los MP4 solicitados a 24 fps mantienen esa frecuencia.

Riesgo

  • Medio: modifica ejecución y persistencia en varios recorridos existentes.

Estado

  • Implementación y validación local completadas. CI requerido y ambas automatizaciones Cursor correctos en este HEAD. QA independiente formal neutral; sin merge ni auto-merge.

Summary

Un único PR agrupa F1–F8 por petición expresa del usuario. Conserva los contratos de intención, workspace y provenance; conecta las superficies incompletas con los ejecutores existentes.

Overview

Las intenciones se admiten y despachan con identidad durable. El supervisor reconcilia workflows al arrancar y durante la vida del servidor. Los consumidores reciben tareas y errores reales. World3D monta un stage dedicado desde un entrypoint compilado y utiliza el mismo reloj y bloqueo de exportación del editor.

Detailed changes

Backend

  • F1: reclamo persistente de despacho de imagen remota, sincronización inmediata de estado/resultados y recuperación de la proyección de polling. Si se perdió el resultado del proveedor, queda interrupted y requiere una intención nueva; nunca se relanza automáticamente.
  • F3/F5: supervisor con lifecycle, avance serializado y nueva executionKey al reanudar tareas fallidas/canceladas/interrumpidas. Mantiene la lista de tareas anteriores.
  • F4/F7: import válido de Playwright, worker contra /world3d-render.html, detección de renderer/browser y origen interno basado en el socket o configuración explícita. Plan y mux conservan 24/30/60 fps.
  • F8: PUT /api/v1/director/pipelines/{pid}/review guarda decisiones como un lote atómico con el bloqueo de Director, pertenencia al workspace y comprobación del archivo seleccionado. La selección actualiza el segmento H3 único y los outputs.

UI and Wizard

  • F2: la limpieza de la caché conserva documentos distintos de su checkpoint; no trunca el índice de borradores sin guardar.
  • F6: el inspector conecta generación de imagen/vídeo/habla/música/SFX con sus contratos admitidos. Muestra recibo o error y bloquea el doble envío. Recuperar una intención consulta su recibo exacto; no reconstruye una petición desde metadata transformada o recortada.
  • F8: panel real en Director, guardado confirmado antes de modificar la selección visible, regeneración mediante el endpoint existente y exportación de archivos aprobados mediante video-editor. Cambiar de toma retira su aprobación anterior. Notas al salir del campo y errores visibles.
  • Codec de comandos de vídeo compartido en ui/src/lib; Wizard conserva sus exports y el inspector accede por ui/src/api.

Data, provenance and compatibility

Sin migración de medios ni de identidades. Se preservan prompts literales, intentos históricos, archivos ajenos y workspace explícito. El inventario de rutas incorpora únicamente el nuevo PUT; se verificó que las rutas previas mantienen su orden relativo. Las tres suites Python nuevas forman parte del reparto de CI. No se modifican baselines de calidad.

Files and ownership

  • app/services/core_generation_commands.py, core_remote_image.py: despacho/recuperación remota.
  • wizard_workflow_executor.py, wizard_workflow_supervisor.py y montajes de runtime: continuación y reintentos.
  • world3d_export.py, world3d_renderer_support.py, ownedRenderer.tsx, HTML/Vite: render compilado.
  • generation-inspector, codec/API de vídeo: ejecución del inspector.
  • production-review, director_review.py, DirectorDashboard: decisiones persistidas y acciones reales.
  • documentHistory.ts: conservación de borradores.
  • Evidencia estable y límites: INTEGRATION_AUDIT_2026-09-12.
  • El checkout compartido, los assets y los cambios locales de otros agentes permanecen intactos.

Validation

Corrección del CI y los dos avisos de revisión

  • Reproducido el agotamiento de heap del test de revisión: 30 ms de demora hacían que la comparación HTMLElement contra null formatease el grafo DOM/React. La aserción compara un booleano; se conserva la demora como regresión. npm test usa ahora dos procesos también en CI.

  • El dashboard recibe el pipeline confirmado por el guardado y actualiza tomas, tags y contadores. No se aplica una respuesta tardía tras desmontar el panel ni a otro workspace/pipeline.

  • La comparación muestra metadata real de cada vídeo, o segundos/frames+fps propios de la toma. No atribuye la duración planificada del plano a todas sus versiones.

  • Regresiones: NODE_OPTIONS=--max-old-space-size=256 ui/node_modules/.bin/tsx --tsconfig ui/tsconfig.app.json --import ./ui/tests/setupI18n.ts --test --test-concurrency=2 ui/tests/productionReviewUi.test.tsx ui/tests/productionReviewRuntime.test.tsx ui/tests/productionReview.test.ts: 20 passed. La reproducción anterior agotaba esos mismos 256 MiB.

  • Añadida al inventario de arquitectura una entrada behavior por la importación pública del store en el nuevo test del dashboard; ninguna entrada anterior alterada. pytest -q tests/test_architecture_contracts.py: 5 passed y python scripts/architecture_contracts.py: correcto.

  • Suite completa por npm test: 1720 passed, 0 cancelled, 0 skipped (94,99 s); lint, build, presupuesto y ratchet correctos. Backend sin cambios en este commit.

  • Date (UTC): 2026-09-12

  • Base SHA: 5f68eb124146c73cef8e5aeac33204aa07f2704e

  • Head SHA: 5b55e550e36209f2a5cc20ceb205f6928bfb50e3

  • Validation scope: suite completa por componentes y smoke real; proveedores simulados. La primera ejecución del wrapper no pasó y no se presenta como --full verde.

  • python scripts/verify_clean_repo.py, python scripts/check_dependency_contract.py, python scripts/check_documentation_links.py, python scripts/check_brand_contract.py.

  • python -m compileall -q app/services app/launch.py scripts.

  • Regresión enfocada: pytest -q tests/test_architecture_contracts.py tests/test_ci_shards.py tests/test_select_local_tests.py tests/test_quick_video_batches.py tests/test_integration_audit_regressions.py tests/test_director_review.py tests/test_core_runtime.py tests/test_world3d_export.py: 102 passed antes de las dos aserciones adicionales, incluidas en la suite final.

  • OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 python -m pytest -q tests --durations=5: 3368 passed, 2 skipped, 139,54 s.

  • cd ui && npm run i18n:check.

  • UI: cd ui && npm test (concurrencia de dos procesos en el propio script): 1720 passed, cero omitidas.

  • cd ui && npm run lint -- --max-warnings=0, npm run build, npm run budget: entry JS 190565 / 327680 bytes gzip.

  • git diff --check y ratchet contra la base de development.

  • HOCUSPOCUS_E2E_PORT=42873 CI=1 npm run test:e2e: 36 passed y cuatro pruebas de habla no arrancaron al faltar Chrome en su ruta predeterminada. Repetidas las cuatro con el mismo spec y una configuración local temporal que apunta al Chrome ya instalado: 4 passed. Configuración temporal eliminada, sin debilitar tests.

  • RUN_WORLD3D_RENDER_SMOKE=1 python -m pytest -q tests/test_world3d_owned_render_smoke.py: 1 passed, Chromium/FFmpeg reales, GLB cargado, movimiento entre frames, MP4 256×144, 12 frames a 24 fps durante 0,5 s, sin imports /src/.

La primera pasada UI detectó la dependencia directa entre features, ya extraída al codec compartido, y una terminación de proceso bajo carga. La primera pasada Python detectó el inventario de rutas/reparto de tests pendiente de actualizar y una espera agotada de Quick Video. La pasada posterior detectó una espera incorrecta en el nuevo test del supervisor: esperaba la llamada al fake antes de que el recibo estuviera guardado. Ahora espera el estado público persistido. Todos estos casos se volvieron a comprobar.

Code quality

  • Score: informe de code-health del CI actual; sin estimaciones manuales.
  • Complexity trend local: +5 funciones con complejidad ≥15; máximo sin aumento.
  • Production LOC trend local: +526; el movimiento del codec no duplica su implementación.
  • Comparación: contra development, destino de este PR; no contra main.
  • Ratchet local: passed, sin cambiar baseline ni policy. Ratchet remoto: SUCCESS en este HEAD.

CI and review

  • CI of this HEAD: SUCCESSCI completo, incluidos UI, Python A/B, E2E y habla Windows.
  • Independent agent review of this HEAD: pending; las pruebas del implementador no son revisión independiente.
  • Human merge click: no solicitado ni realizado.
  • Cursor: SUCCESS en ambas automatizaciones del HEAD (InternalBugBot y Find critical bugs). Los dos hilos corregidos están resueltos. El check formal Independent QA permanece neutral; no se cuenta como aprobación independiente.

Coste de la tarea

  • Tests simulados: 0 tokens externos.
  • Tests reales: Chromium/WebGL y FFmpeg locales, sin proveedor de generación.
  • Llamadas LLM externas desde la aplicación: 0.
  • Tokens de prompt/respuesta/totales de Codex: N/A; sin telemetría fiable.
  • Generaciones por modelos de imagen/audio/vídeo: 0; los MP4 de prueba son renders/ensamblajes locales.
  • Tiempo transcurrido total: N/A; se conservan tiempos y resultados en los logs locales de validación, incluyendo repeticiones.
  • Proveedores/modelos: simulados; ningún modelo descargado.

Notes and limitations

  • World3D en servidor sigue rechazando escenas con voz/audio explícitamente: no se implementa aquí su mezcla. El smoke comprueba recursos y movimiento, no calidad artística, retargeting o lipsync.
  • El contrato de vídeo del inspector sigue limitado a Wan 2.1 t2v/t2v_1.3B; los demás modos conservan sus contratos actuales.
  • La exportación de revisión une las tomas aprobadas con su audio; no reconstruye la banda sonora completa de una producción.
  • No se ha validado inferencia de modelos/proveedores ni hardware físico macOS/Windows.
  • El supervisor es propietario dentro del proceso de la aplicación; no incorpora una arquitectura de workers distribuidos.

Follow-up work

Revisión independiente/CI del HEAD y, fuera de estos ocho hallazgos, mezcla de audio en el renderer del servidor y validación artística con assets reales.

Checklist

  • Resumen ejecutivo comprensible y detalle técnico conservado.
  • Pruebas y resultados reales registrados, incluidos fallos y repeticiones.
  • Sin assets generados, secretos, pesos ni archivos locales ajenos.
  • CI requerido y ambas automatizaciones Cursor correctos en este HEAD. QA formal neutral; sin merge ni auto-merge.

Note

Medium Risk
Touches command dispatch, durable task state, and several user-facing execution paths (remote image, Wizard, World3D render, inspector submit, Director review persistence); regressions could affect billing, workflow continuity, or saved production state.

Overview
This PR bundles integration-audit fixes across generation, Wizard workflows, World3D server export, the generation inspector, and Director production review.

Remote image commands now use a persistent dispatch claim and job restore/sync callbacks so replaying an admitted intent does not silently re-call the provider; unknown outcomes surface as interrupted instead of a duplicate run.

Wizard image→upscale gets an app lifespan supervisor that reconciles all workspaces, serialized advance, and a fresh execution key when resuming a failed step so retries are new attempts, not rebinding the old task.

World3D export drives a compiled world3d-render.html entry (__world3dExport) instead of dev /src/ imports, validates renderer/browser readiness, binds app URL from the listening socket when unset, and keeps 24/30/60 fps through plan and mux.

Director adds PUT …/pipelines/{pid}/review for atomic batch save of take selection, approval tags, and notes (with H3 segment/output updates and approval cleared on take change). The dashboard embeds a production review panel wired to persist, regenerate via existing rerun APIs, and export approved clips through video-editor.

UI: the generation inspector submits real commands (including shared video codec in lib + api), with busy/error states and receipt-based retry; Scene3D draft pruning keeps unsaved drafts past the cache cap.

Reviewed by Cursor Bugbot for commit 5b55e55. Configure here.

@github-actions

github-actions Bot commented Sep 12, 2026

Copy link
Copy Markdown

PR Review — Loreframe Studio

Risk: medium
Scope: 47 file(s); +1702/-454; React UI, backend services, docs, repo scripts / CI

Automated review from scripts/analyze_pr.py. This is a heuristic pass (no LLM) so humans still own the merge decision.

Findings

  • medium — Dangerous dynamic execution (ui/src/lib/videoGenerationCommand.ts)
    ui/src/lib/videoGenerationCommand.ts adds exec(). Confirm the input is trusted and sandboxed.
  • medium — Large pull request
    1702 additions / 454 deletions. Reviewers will have an easier time with smaller, focused PRs.
  • low — UI changed — rebuild before merge
    Run cd ui && npm run build (CI already does this). Pinokio Update rebuilds for end users; keep ui/dist untracked.

Changed files

  • added: app/routers/director_review.py, app/services/director_review.py, app/services/wizard_workflow_supervisor.py, app/services/world3d_renderer_support.py, docs/development/INTEGRATION_AUDIT_2026-09-12.md, tests/test_director_review.py, tests/test_integration_audit_regressions.py, tests/test_world3d_owned_render_smoke.py, ui/src/api/videoGenerationCommands.ts, ui/src/features/generation-inspector/submit.ts, ui/src/features/production-review/ProductionReviewHost.tsx, ui/src/features/production-review/runtime.ts, ui/src/features/scene3d/ownedRenderer.tsx, ui/src/lib/videoGenerationCommand.ts, ui/tests/integrationAuditRegressions.test.tsx, ui/tests/productionReviewRuntime.test.tsx, ui/world3d-render.html
  • modified: app/_launch_runtime.py, app/core_runtime.py, app/routers/wizard_workflow_executor.py, app/routers/world3d_export.py, app/services/core_generation_commands.py, app/services/core_remote_image.py, app/services/wizard_workflow_executor.py, app/services/world3d_export.py, docs/development/CURRENT_WORK.md, scripts/ci_test_groups.json, tests/fixtures/architecture_wire_inventory.json, tests/fixtures/route_table.json, tests/test_core_runtime.py, tests/test_world3d_export.py, ui/package.json, ui/src/components/DirectorDashboard/DirectorDashboard.tsx, ui/src/features/agent/videoGenerationCapability.ts, ui/src/features/generation-inspector/GenerationInspectorDialog.tsx, ui/src/features/generation-inspector/GenerationInspectorHost.tsx, ui/src/features/production-review/ProductionReviewDesk.tsx
    … and 10 more

CONTRIBUTING checklist

  • python scripts/verify_clean_repo.py
  • python -m compileall -q app/services app/launch.py scripts
  • cd ui && npm run build if the UI changed
  • No weights, CivitAI sidecars, or generated guides
  • Stays local-first (no required accounts / telemetry)

Posted by the repo PR review workflow. Re-runs on each push to the PR.

@github-actions

github-actions Bot commented Sep 12, 2026

Copy link
Copy Markdown

Code health

Quality score: 63.8/100

Higher is better. The score is a trend dashboard; the independent ratchet below remains the CI gate.

Component Weight Current Change
Cyclomatic health 45% 59.2 +0.0
File concentration 25% 73.7 +0.1
Oversized-file debt 20% 49.4 +0.1
Modularity 10% 88.3 +0.4

Change vs PR base: +0.1 points.

Metric Value
Production LOC 313,650
Production files 1,052
Test LOC 127,810
Functions measured 21,367
Functions complexity ≥ 15 906
Maximum complexity 674
Policy code-health-policy-v1
HEAD ed5290d3eef123e27bcf1ebcc2c6ea6c2ad9af00
Base 5f68eb124146c73cef8e5aeac33204aa07f2704e
UI measurement complete

Markdown, JSON catalogs and tests are out of this table. Only app/ runtime + ui/src TS/JS count.

Most complex functions

Complexity Where
674 app/wgp.py:7230 generate_video
382 ui/src/stores/useStore.ts:4129 Async method 'startGeneration'
355 app/_launch_runtime.py:23674 _run_generation
308 app/wgp.py:12372 generate_video_tab
269 ui/src/components/Sidebar/SceneAnimatorPanel.tsx:508 Function 'SceneAnimatorPanel'
264 ui/src/stores/useStore.ts:8684 Async method 'loadSettingsFromOutput'
258 app/services/director/planners/short_film.py:3433 ShortFilmPlanner._plan_story_driven
248 app/services/director_pipeline.py:13612 _run_video_generation
245 app/services/director_pipeline.py:7712 _run_pipeline
233 ui/src/features/agent/agentActions.ts:1152 Function 'parseAction'
226 app/services/director_pipeline.py:6541 update_comic_preview
225 ui/src/features/agent/agentActions.ts:2998 Async function 'executeAgentActions'

Trend vs baseline

Metric Δ
Production LOC +526
Test LOC +586
Functions ≥ 15 +5
Maximum complexity +0

Warnings

  • production LOC increased by +526
  • functions at complexity >= 15 increased by +5
  • hotspot app/_launch_runtime.py increased by +4 lines
  • hotspot ui/src/components/DirectorDashboard/DirectorDashboard.tsx increased by +13 lines

Ratchet passed.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Review panel leaves dashboard stale
    • After a successful review persist, the host now forwards the saved pipeline and DirectorDashboard updates dashboardSelectedPipeline so the clip grid, tags, and counts stay in sync.

Create PR

Or push these changes by commenting:

@cursor push 17c8b80036
Preview (17c8b80036)
diff --git a/ui/src/components/DirectorDashboard/DirectorDashboard.tsx b/ui/src/components/DirectorDashboard/DirectorDashboard.tsx
--- a/ui/src/components/DirectorDashboard/DirectorDashboard.tsx
+++ b/ui/src/components/DirectorDashboard/DirectorDashboard.tsx
@@ -1157,7 +1157,11 @@
 
             <details className="rounded-lg border border-border p-3">
               <summary className="cursor-pointer text-sm">{reviewCopy().title}</summary>
-              <ProductionReviewHost key={`${activeWorkspace}:${selectedPipeline.pipeline_id}`} pipeline={selectedPipeline} workspace={activeWorkspace} />
+              <ProductionReviewHost key={`${activeWorkspace}:${selectedPipeline.pipeline_id}`} pipeline={selectedPipeline} workspace={activeWorkspace} onChange={next => {
+                useStore.setState(s => s.dashboardSelectedPipeline?.pipeline_id === next.pipeline_id
+                  ? { dashboardSelectedPipeline: next }
+                  : {})
+              }} />
             </details>
             {/* LLM Log */}
             <div className="bg-bg-secondary rounded-lg border border-border p-3">

diff --git a/ui/src/features/production-review/ProductionReviewHost.tsx b/ui/src/features/production-review/ProductionReviewHost.tsx
--- a/ui/src/features/production-review/ProductionReviewHost.tsx
+++ b/ui/src/features/production-review/ProductionReviewHost.tsx
@@ -6,7 +6,13 @@
 import { exportReview, persistReview, regenerateReview, reviewFileUrl } from './runtime'
 import { reviewCopy } from './copy'
 
-export function ProductionReviewHost({ pipeline, workspace }: { pipeline: SavedPipelineState; workspace: string }) {
+export function ProductionReviewHost({
+  pipeline, workspace, onChange,
+}: {
+  pipeline: SavedPipelineState
+  workspace: string
+  onChange?: (pipeline: SavedPipelineState) => void
+}) {
   const desk = useMemo(() => projectReviewDesk({ pipeline: { ...pipeline, workspace } }), [pipeline, workspace])
   const [job, setJob] = useState<VideoEditorExportJob | null>(null)
   const [error, setError] = useState('')
@@ -23,7 +29,10 @@
   }, [job])
   return <div>
     <ProductionReviewDesk desk={desk} onChange={() => undefined}
-      onPersist={commands => persistReview(desk, commands)}
+      onPersist={async commands => {
+        const saved = await persistReview(desk, commands)
+        onChange?.(saved)
+      }}
       onRegenerate={plan => regenerateReview(desk, plan)}
       onExport={async selection => { setError(''); setJob(await exportReview(desk, selection)) }}
       fileUrl={filename => reviewFileUrl(filename, workspace)} />

diff --git a/ui/src/features/production-review/runtime.ts b/ui/src/features/production-review/runtime.ts
--- a/ui/src/features/production-review/runtime.ts
+++ b/ui/src/features/production-review/runtime.ts
@@ -1,13 +1,14 @@
 import { BASE } from '../../api/http'
 import { fetchSavedPipeline, rerunClipVideo } from '../../api/director'
 import { probeVideoEditorClip, startVideoEditorExport } from '../../api/video-editor'
+import type { SavedPipelineState } from '../../types'
 import { projectReviewDesk } from './project'
 import type { ExportSelection, PersistCommand, RegenOutcome, RegenPlan, ReviewDesk } from './types'
 
 export const reviewFileUrl = (name: string, workspace: string) =>
   `/api/v1/file/${encodeURIComponent(name)}?workspace=${encodeURIComponent(workspace)}`
 
-export async function persistReview(desk: ReviewDesk, commands: PersistCommand[]): Promise<void> {
+export async function persistReview(desk: ReviewDesk, commands: PersistCommand[]): Promise<SavedPipelineState> {
   const decisions = commands.filter(command => command.type !== 'rerun_clip')
   const response = await fetch(`${BASE}/api/v1/director/pipelines/${encodeURIComponent(desk.pipelineId)}/review`, {
     method: 'PUT', headers: { 'Content-Type': 'application/json' },
@@ -17,6 +18,7 @@
     const body = await response.json().catch(() => ({}))
     throw new Error(body.detail || 'Could not save review')
   }
+  return response.json()
 }
 
 export async function regenerateReview(desk: ReviewDesk, plan: RegenPlan): Promise<RegenOutcome[]> {

diff --git a/ui/tests/productionReviewRuntime.test.tsx b/ui/tests/productionReviewRuntime.test.tsx
--- a/ui/tests/productionReviewRuntime.test.tsx
+++ b/ui/tests/productionReviewRuntime.test.tsx
@@ -44,13 +44,16 @@
     }
     throw new Error(`Unexpected request: ${url}`)
   })
-  const view = (key: string) => <ProductionReviewHost key={key} workspace="original" pipeline={saved as SavedPipelineState} />
+  let notified: SavedPipelineState | null = null
+  const view = (key: string) => <ProductionReviewHost key={key} workspace="original" pipeline={saved as SavedPipelineState} onChange={next => { notified = next }} />
   try {
     const root = render(view('first'))
     await act(async () => fireEvent.click(screen.getByRole('button', { name: 'old-id' })))
     await act(async () => fireEvent.click(screen.getByRole('button', { name: 'Approve' })))
     assert.equal(saved.clips[0].selected_video_filename, 'old.mp4')
     assert.equal(saved.clips[0].tag, 'good')
+    assert.equal(notified?.clips[0].selected_video_filename, 'old.mp4')
+    assert.equal(notified?.clips[0].tag, 'good')
     root.rerender(view('reload'))
     assert.equal(screen.getByRole('button', { name: 'old-id' }).getAttribute('aria-pressed'), 'true')
     await act(async () => fireEvent.click(screen.getByRole('button', { name: 'Export approved selection' })))

You can send follow-ups to the cloud agent here.

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 93c9982. Configure here.

Comment thread ui/src/features/production-review/ProductionReviewHost.tsx Outdated
Comment thread ui/src/features/production-review/takes.ts
@IAnMove
IAnMove merged commit 60e867a into development Sep 12, 2026
14 checks passed
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