obsidian/01 Projects/video-accessibility/Next-Session-Prompt.md
2026-04-30 21:28:37 +01:00

8 KiB
Raw Blame History

title date tags
Video Accessibility — Next Session Prompt 2026-04-30
video-accessibility
prompt
handover

Next Session Start Prompt

[!important] Обов'язково прочитати перед початком Цей файл — єдине джерело правди для наступної сесії. Читати повністю.


Контекст проекту

AI SaaS платформа для генерації accessibility-матеріалів (CC, AD, SDH) з відео.

  • Директорія: /Users/ai_leed/Documents/Projects/Oliver/video-accessibility
  • Гілка: main
  • Сервер: optical-dev (Docker Compose)
  • Останній коміт: 3bed598 — fix(glossary+jobs): debug logging + AllJobs filter fix

Що зроблено СЬОГОДНІ (2026-04-30)

Виправлені баги (всі в main)

# Файл Проблема Рішення
1 tasks/translate_and_synthesize.py UnboundLocalError: job_doc на рядку ~976 Перемістив find_one(job_id) перед gcs_path()
2 migrations/scripts/migration_2026-04-30-000002_fix_status_enum.py MongoDB $jsonSchema відхиляв статус cancelled Новая міграція з firstBatch патерном + повний список статусів
3 migrations/run.py Файл не існував Створив runner з connect_to_mongo()
4 services/gemini.py Стара модель gemini-2.5-pro Оновлено до gemini-3.1-pro-preview
5 core/config.py + tasks/tts_synthesis.py TTS flash модель застаріла Flash → gemini-3.1-flash-tts-preview, Pro залишився gemini-2.5-pro-preview-tts
6 routes/Dashboard.tsx Processing counter показував 0 Додані translating, tts_generating, rendering_video, rendering_qc до підрахунку
7 routes/jobs/JobsList.tsx All Jobs показував "no jobs" при дефолтних фільтрах useEffect тепер завжди синхронізує statusFilter з URL-параметром (очищає, якщо param відсутній)
8 services/glossary_service.py Glossary не застосовувалась, помилка ховалась Детальний дебаг-логінг + guard для source_term_lower=None + guard для target_locale=None

На сервері виконано вручну

# optical-dev
docker compose up -d --build tts-worker   # TTS deadlock: 0/15 → фіксовано
python -m app.migrations.run              # Applied migration_2026-04-30-000002

Статус тестового джобу Test5 (69f3b6d2cde5f3709e55301e)

  • TTS: EN ✓ (15/15), DE-DE ✓ (13/13), FR-CA ✓ (15/15)
  • Рендер відео: в процесі на момент завершення сесії
  • Стан: tts_generating → очікується перехід у rendering_qc або pending_final_review

Що НЕ вирішено — TODO на наступну сесію

1. Glossary — причина не знайдена (ПРІОРИТЕТ)

Симптом: Glossary не застосовується навіть коли джоб створений в правильному проекті з активним словником.

Що зробили: Додали детальний логінг в get_glossary_block_for_job. Тепер у воркер-логах буде видно ТОЧНО де повертається "".

Наступний крок:

  1. Задеплоїти нові зміни (git pull + docker compose up -d --build worker api)
  2. Запустити новий тест-джоб в проекті зі словником
  3. Перевірити логи воркера: docker compose logs -f worker | grep -i glossary
  4. Буде один з варіантів:
    • Glossary skip job=X: no project_id → джоб не прив'язаний до проекту
    • Glossary skip job=X: project ABC not foundproject_id не матчить жодного проекту (тип?)
    • Glossary skip job=X: no active glossary for client Y → словник для цього клієнта не активний
    • Glossary skip job=X: no source text → відсутній _glossary_source_text (VTT порожній?)
    • Glossary lookup failed ... traceback → виняток з повним стеком

2. Деплой фронтенду (ПРІОРИТЕТ)

Зміни в Dashboard.tsx (Processing counter) і JobsList.tsx (AllJobs filter) ще не задеплоєні на сервер.

# На optical-dev:
cd /opt/projects/video-accessibility
git pull
docker compose up -d --build api
# або якщо є окремий фронтенд-білд:
./scripts/build-frontend.sh

3. Перевірити фінальний стан Test5

Перевірити чи джоб успішно завершив рендер відео і перейшов у pending_final_review або completed.


Архітектурні нотатки (важливо пам'ятати)

3 окремих Celery-воркери на optical-dev

worker:      черги default, ingest, notify, render  (concurrency=8)
tts-worker:  черга tts ONLY                          (concurrency=10, Cloud Run mode)
ffmpeg-worker: черга ffmpeg                          (concurrency=20, Cloud Run mode)

[!warning] Ключове правило Якщо tts-worker не перебудований — synthesize_cue_task зависне в черзі назавжди (0/N cues). Завжди перебудовувати tts-worker після змін у tts_synthesis.py.

USE_CELERY_FALLBACK=true на optical-dev

Коли це встановлено, завдання йдуть у локальний Celery замість Cloud Run. Це потрібно для дебагу.

MongoDB $jsonSchema validator

Валідатор з validationAction: "error" блокує будь-який невідомий статус. Повний список статусів:

ALL_STATUSES = [
    "created", "ingesting", "ai_processing",
    "pending_qc", "approved_english", "approved_source",
    "rejected", "qc_feedback",
    "translating", "tts_generating", "tts_failed",
    "rendering_video", "render_failed", "rendering_qc",
    "pending_final_review", "completed",
    "processing_failed", "cancelled",
]

Glossary lookup chain

job_doc.project_id (string)
  → db.projects.find_one({"_id": project_id})    # projects._id = str(ObjectId)
  → project.client_id (string)
  → db.glossaries.find_one({"client_id": ..., "status": "active"})
  → glossary.current_version_id (string)
  → db.glossary_terms.find({"version_id": version_id})
  → ahocorasick exact match + vector search

Команди для швидкого старту

cd /Users/ai_leed/Documents/Projects/Oliver/video-accessibility

# Перевірити статус
git log --oneline -5
git status

# Backend lint
cd backend && ruff check . && cd ..

# Frontend type-check
cd frontend && npm run type-check && cd ..

# Запустити локально
./scripts/run-local.sh

Файли змінені в цій сесії

backend/app/tasks/translate_and_synthesize.py   (job_doc fix)
backend/app/services/gemini.py                  (model update)
backend/app/services/glossary_service.py        (debug logging + guards)
backend/app/core/config.py                      (TTS model names)
backend/app/tasks/tts_synthesis.py              (TTS flash model)
backend/app/migrations/scripts/migration_2026-04-30-000002_fix_status_enum.py
backend/app/migrations/run.py                   (new file)
frontend/src/routes/Dashboard.tsx               (Processing counter fix)
frontend/src/routes/jobs/JobsList.tsx           (AllJobs filter fix)