Skip to content

feat(characters): add manual 2D speech preparation workshop - #200

Merged
IAnMove merged 5 commits into
developmentfrom
feat/character-speech-workshop
Sep 6, 2026
Merged

feat(characters): add manual 2D speech preparation workshop#200
IAnMove merged 5 commits into
developmentfrom
feat/character-speech-workshop

Conversation

@IAnMove

@IAnMove IAnMove commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Summary

Manual 2D speech preparation workshop in Character Creator. Saves reviewed drafts without starting inference.

  • Workshop entry, draft recovery without rebasing another editor’s revision, and library save with workspace revision.
  • Face Rig child stays; this path does not POST generate/analyze/cleanup.
  • The panel test avoids HTMLElement-vs-null formatting that exhausted RAM (OOM 6 Sep). 13 directed tests, ~260 MiB peak RSS.

Does not merge the 3D scene PR or reopen Labs L0–L12.

Test plan

  • ui/tests/characterSpeechPreparationPanel.test.tsx (RAM-safe assertions)
  • draft recovery tests
  • required CI

Independent QA / Bugbot are not required.


Note

Medium Risk
Touches character-kit persistence and optimistic concurrency in the UI; mistakes could lose drafts or mishandle revision conflicts, though behavior is heavily tested and scene Face Rig defaults are unchanged.

Overview
Adds a Prepare 2D speech flow under Character Creator so users can pick or import a character base, review poses and mouth pieces via the existing Face Rig UI, and save explicitly to the workspace character-kit library—without running 3D orbit or inference.

The workshop is a lazy-loaded drawer (CharacterSpeechWorkshopEntryCharacterSpeechPreparation) backed by useCharacterSpeechLibrary for load/save/upload, optimistic baseRevision on PATCH, and session draft recovery (characterSpeechDraft: validated, 2 MiB cap, per-workspace). Recovered drafts keep their original revision after a remote bump; save failures retain the draft with no auto-retry. CharacterKitFaceRigPanel gains allowModelActions={false} here so generate/cleanup/voice paths are disabled while manual placement, presets, and review stay available.

A mouth readiness checklist (speechPreparationReadiness) surfaces missing/pending/rejected/incompatible/approved per viseme. EN/ES copy and creator/library subtitles point users to the new entry. Docs add CHARACTER_SPEECH_WORKSHOP.md and refresh raster-plan CI/merge notes.

Coverage includes unit/panel tests (workspace races, draft recovery, save conflicts), a Playwright E2E that asserts no inference POSTs, and a panel-test fix that avoids DOM-heavy assertions that previously triggered OOM.

Reviewed by Cursor Bugbot for commit 7fa0c6b. Configure here.

@cursor

cursor Bot commented Sep 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_d904fdb6-1c84-41ac-957d-2db15e2e954b)

@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown

PR Review — Loreframe Studio

Risk: medium
Scope: 16 file(s); +1613/-16; React UI, docs

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

Findings

  • medium — Large pull request
    1613 additions / 16 deletions. Reviewers will have an easier time with smaller, focused PRs.
  • medium — Very large file change (ui/tests/characterSpeechPreparationPanel.test.tsx)
    ui/tests/characterSpeechPreparationPanel.test.tsx adds 430 lines. Consider splitting the PR.
  • 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: docs/development/CHARACTER_SPEECH_WORKSHOP.md, ui/e2e/specs/character-speech-workshop.spec.ts, ui/src/features/characters/CharacterSpeechPreparation.tsx, ui/src/features/characters/CharacterSpeechWorkshopEntry.tsx, ui/src/features/characters/useCharacterSpeechLibrary.ts, ui/src/lib/characterSpeechDraft.ts, ui/src/lib/characterSpeechPreparation.ts, ui/tests/characterSpeechDraft.test.mjs, ui/tests/characterSpeechPreparation.test.mjs, ui/tests/characterSpeechPreparationPanel.test.tsx
  • modified: docs/development/CHARACTER_SPEECH_RASTER_PLAN.md, ui/src/features/characters/CharacterCreatorPanel.tsx, ui/src/features/characters/CharacterKitFaceRigPanel.tsx, ui/src/i18n/locales/en/characters.json, ui/src/i18n/locales/es/characters.json, ui/tests/characterCreator.test.tsx

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.

IAnMove added a commit that referenced this pull request Sep 6, 2026
@IAnMove

IAnMove commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

Qué cambia

  • «Prepare 2D speech / Preparar habla 2D» dentro de Character Creator, lazy y
    plegable sin perder el borrador al cerrar el desplegable.
  • Biblioteca existente por workspace; base importada con identidad nueva y
    revisión pendiente, selección de pose, Face Rig y parches raster reutilizados.
  • Estado estructural de cada boca: falta/pendiente/rechazada/incompatible/aprobada.
    No certificar calidad artística ni fonética por tener piezas aprobadas.
  • Guardado explícito con revisión optimista; errores conservan borrador y no
    provocan reintentos/sobrescrituras. Respuestas tardías no cruzan workspaces.
  • Recuperación de borrador al navegar/cambiar workspace/remontar el panel,
    conservando baseRevision original. Caché de sesión versionada/validada, 2 MiB,
    con fallback en memoria; guardar o descartar limpia la recuperación.
  • En este taller, generación de imagen/voz y cleanup neural deshabilitados
    tanto en botones como handlers. El editor de escenas conserva su modo previo.

Alcance y límites

Primera entrega manual. Rhubarb, MuseTalk, FLUX/Qwen con máscara y packs por vista
están descritos como pendientes, no instalados ni integrados. Los sprites propios
se asignan mediante las capas de escena existentes; el taller importa variantes
alineadas para parches. No se garantiza alineación automática ni boca expresiva.
Sin cambios de runtime/launchers, modelos, pesos, outputs o medios privados.
No reiniciar instancias compartidas ni publicar main.

Validación

  • 979 tests UI aprobados, incluidos 22 específicos del taller y recuperación.
  • Python: 2160 aprobados, 1 omitido; CPU/BLAS limitados, sin GPU/proveedores.
  • Lint, tipos, i18n y guards clean/deps/documentación/marca aprobados.
  • Ratchet contra development c2794f6c, build/budget y 19 E2E aprobados.
    Navegación real → revisión → salir/remontar → recuperar → guardar → recargar,
    con API simulada y sin inferencia. Entrada gzip 316154/327680 bytes.
  • Integración local de esa base: 7 tests del contrato Labs entrante aprobados.
    No hay cambios Python de este PR; suite Python completa anterior conservada.
  • Score 53.0/100: indicador, no certificado; ratchet pasa con avisos de
    complejidad (tres casos >=15 y Face Rig 84→85). Sin modificar baseline.
  • Primera tanda E2E: 18/19; el nuevo test cambiaba de sección antes de concluir
    la navegación lazy. Se comprueba ahora desmontaje real, sin sleeps/retries.
    Repetición completa: 19/19. Revisión independiente del ajuste completada.
  • Luna revisó la integración y detectó pérdida de borrador al navegar; corregida
    y re-revisada sin nuevos bloqueos en 6713ce7c. El helper delegado fue revisado
    por el principal (incluido reemplazo de caché al agotarse cuota), no se cuenta
    como revisión independiente por su propio autor.
  • Incidente local documentado: un assert comparaba HTMLElement con null y su
    formateador de errores provocó OOM. Corregido esperando la recarga y comparando
    primitivas. Repetición específica aprobada bajo cgroup 1,5 GiB/swap 0; suites
    posteriores limitadas a 3 GiB, una tanda a la vez, no GPU ni proveedores.

Validación de código local en b663912d; el commit posterior solo registra
evidencia documental. CI remoto, Cursor y merge se comprobarán por separado.

CI verde no es validación artística con generación real. La aprobación del
usuario de la identidad MiniMax se conserva; el pack hablando queda pendiente.

@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown

Code health

Quality score: 53.0/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% 53.7 +0.0
File concentration 25% 59.5 +0.1
Oversized-file debt 20% 34.9 +0.2
Modularity 10% 69.6 +0.5

Change vs PR base: +0.1 points.

Metric Value
Production LOC 257,712
Production files 628
Test LOC 88,730
Functions measured 16,410
Functions complexity ≥ 15 818
Maximum complexity 670
Policy code-health-policy-v1
HEAD 4067954dc78e78ffe594232ccd11d0653450f15c
Base c2794f6ce80d4148936fb474e4566eec5e82e8d1
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
670 app/wgp.py:7164 generate_video
376 ui/src/stores/useStore.ts:4029 Async method 'startGeneration'
355 app/_launch_runtime.py:23505 _run_generation
308 app/wgp.py:12298 generate_video_tab
275 ui/src/components/Sidebar/SceneAnimatorPanel.tsx:475 Function 'SceneAnimatorPanel'
271 ui/src/stores/useStore.ts:8572 Async method 'loadSettingsFromOutput'
258 app/services/director/planners/short_film.py:3433 ShortFilmPlanner._plan_story_driven
248 app/services/director_pipeline.py:13607 _run_video_generation
245 app/services/director_pipeline.py:7712 _run_pipeline
244 ui/src/features/agent/agentActions.ts:1145 Function 'parseAction'
226 app/services/director_pipeline.py:6541 update_comic_preview
225 ui/src/features/agent/agentActions.ts:2892 Async function 'executeAgentActions'

Trend vs baseline

Metric Δ
Production LOC +509
Test LOC +832
Functions ≥ 15 +3
Maximum complexity +0

Warnings

  • production LOC increased by +509
  • functions at complexity >= 15 increased by +3
  • complexity hotspot ui/src/features/characters/CharacterKitFaceRigPanel.tsx rose 84 -> 85

Ratchet passed.

@IAnMove
IAnMove merged commit a0bf91c into development Sep 6, 2026
10 checks passed
@IAnMove

IAnMove commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

Cierre verificado: MERGED en development, a0bf91c; padres c2794f6 + 7fa0c6b y árbol idéntico al HEAD validado. CI required y jobs de producto PASS. Cursor no ejecutado por cuota (dispensa previa del usuario); Independent QA neutral, no confundir con publisher PASS. Revisión local cruzada de agentes documentada arriba. Taller manual integrado; sincronización con audio real y prueba artística pendientes. No se han reiniciado instancias compartidas ni publicado main; tampoco se han subido modelos o medios.

IAnMove added a commit that referenced this pull request Sep 6, 2026
CURRENT_WORK now treats the manual 2D speech workshop as merged on
a0bf91c. The remaining limit is artistic validation, not the RAM-safe
panel tests already in that PR.
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