diff --git a/01 Projects/video-accessibility/Next-Session-Prompt.md b/01 Projects/video-accessibility/Next-Session-Prompt.md index 968db3f..b90297c 100644 --- a/01 Projects/video-accessibility/Next-Session-Prompt.md +++ b/01 Projects/video-accessibility/Next-Session-Prompt.md @@ -9,8 +9,6 @@ tags: # Next Session Start Prompt -> Copy the block below and paste as the first message in the new Claude Code session. - --- ``` @@ -20,93 +18,59 @@ tags: Платформа — AI SaaS для генерации accessibility-материалов (CC, AD, SDH) из видео. Рабочая директория: /Users/ai_leed/Documents/Projects/Oliver/video-accessibility -Текущая ветка: feat/pm-productivity (от main) -Последний коммит: 1bf0fb9 +Текущая ветка: feat/pm-productivity → мержим в main, новая ветка: feat/pr7-security-and-briefs +Последний коммит: 08fcb4d -## Полный план +## Документы для чтения (В ЭТОМ ПОРЯДКЕ) -Читай план: /Users/ai_leed/.claude/plans/snoopy-watching-fountain.md -(копия в Obsidian: [[Full-Implementation-Plan]]) +1. Хендовер (история всего сделанного): + /Users/ai_leed/Library/Mobile Documents/iCloud~md~obsidian/Documents/VadymSamoilenko/01 Projects/video-accessibility/Multi-Tenant Audit — Handover.md -Хендовер с историей что сделано и что осталось: -/Users/ai_leed/Library/Mobile Documents/iCloud~md~obsidian/Documents/VadymSamoilenko/01 Projects/video-accessibility/Multi-Tenant Audit — Handover.md +2. План на эту сессию (PR-7): + /Users/ai_leed/Library/Mobile Documents/iCloud~md~obsidian/Documents/VadymSamoilenko/01 Projects/video-accessibility/PR-7-Plan.md ## Что уже сделано (не трогать) ### PR-1 (merged): Multi-tenancy foundations -- org-изоляция во всех эндпоинтах (assert_job_in_user_org) -- WebSocket membership check -- organization_id в моделях -- миграция 2026_05_add_organization_id.py +### PR-2 (commit c7a6f13): PM/Production dashboards, workflow blockers +### PR-3+4+5 (commit 1bf0fb9): PM tools, deadline, clone, glossary, VTT diff, CSRF +### PR-6 (commit 08fcb4d): WS real-time updates, per-cue AD playback, beforeunload guard, + team auto-assignment, broadcast_to_job/broadcast_to_user bugfix -### PR-2 (pushed feat/workflow-blockers, commit c7a6f13): -- PM dashboard + Production dashboard -- role-based login redirect (linguist/reviewer → /qc/queue) -- sidebar badges (live QC count) -- two-stage QC enforcement (_assert_can_approve) -- email notifications enabled -- PM в complete_job, Final Review, Audit Log +## Задачи этой сессии (PR-7) -### PR-3+4+5 (pushed feat/pm-productivity, commit 1bf0fb9): -- W-5: project defaults autofill в NewJob -- PM-9: quick filter presets в JobsList -- PM-10: PM в canManageJobs / New Job button / Final Review action -- PM-12: server pagination (size:50, page state, pagination controls) -- PM-1: deadline field в Job model + JobsList column + overdue red + NewJob date picker -- PM-2: POST /jobs/{id}/clone + useCloneJob hook + Clone button -- R-4: reject categories (pill-select) в QCDetail reject modal -- R-2: reviewed_cues/total_cues + progress bar + 80% approve gate + /mark-cue-reviewed -- L-9: Cmd+S saves full VTT, Escape closes modals -- T-1: JOB_STATUS_LABELS / getJobStatusLabel unified in jobStatusMessages.ts -- T-14: settings.upload_max_video_bytes + settings.upload_signed_url_ttl_hours +КРИТИЧНО — делать первыми: -## Что осталось (приоритет сверху вниз) +1. MT-11: Cross-org assignment (language_qc.py:182 assign_linguist + :307 assign_reviewer) + → добавить проверку job_org == linguist_org перед сохранением -### PR-3 (продолжение) -- PM-7: Bulk assign linguist - - Бэкенд: нет endpoint. Нужен POST /jobs/{id}/languages/bulk-assign с {linguist_id, reviewer_id, language_codes[]} - - Фронт: кнопка "Assign defaults to all languages" в QCDetail (берёт PM defaults из проекта) + select-all checkbox - - Файлы: backend/app/services/language_qc.py, routes_language_qc.py, frontend/src/routes/admin/QCDetail.tsx +2. MT-12: Legacy PM bypass (routes_clients.py:487-488 _assert_client_access) + → удалить строку `if user.role in (CLIENT, PROJECT_MANAGER): return` -- PM-15: Read-only share link для CLIENT - - Новый файл backend/app/api/v1/routes_share.py - - POST /share/projects/{id} → создаёт ShareToken (TTL 7d, read-only) в MongoDB - - GET /share/{token} → публичная страница (без auth) с video player + download links - - Новый фронт компонент frontend/src/routes/share/ShareView.tsx - - Зарегистрировать роут в App.tsx (публичный, не обёрнут в PrivateRoute) +3. MT-13: Glossary без org-чека (routes_glossaries.py:47-56) + → вынести _assert_client_access в core/dependencies.py, добавить в glossary handlers -### PR-4 (остаток) -- L-1/L-6: Glossary inline в VttEditor + CPS warning - - Файл: frontend/src/components/VttEditor.tsx - - Глоссарий: подтянуть через apiClient.getGlossaries(clientId), подсветить preferred terms в cue text - - CPS: warn если characters_per_second > 20 рядом с cue +4. MT-15 (partial): Заменить get_accessible_project_ids на get_membership_context + только в routes_jobs.py list_jobs + get_job, и routes_clients.py -- L-3: Optimistic locking (concurrent edits → 409) - - Backend: routes_jobs.py PATCH /jobs/{id}/vtt добавить If-Match check по updated_at - - Frontend: передавать заголовок If-Match: {updated_at}, показывать toast при 409 +ПОТОМ: -- L-7: Diff AI baseline vs current - - Backend: при первом сохранении VTT после AI проставить тег "ai_baseline" на VTT version - - Frontend: кнопка "Compare to AI" в QCDetail, side-by-side diff view +5. W-13: Поле Job.failure + structured failure UI в JobDetail.tsx -### PR-5 (остаток) -- T-6: Native для captions в VideoWithCaptions.tsx - - Убрать кастомный div overlay (строки ~215-221) - - Заменить на с Blob URL из VTT контента +6. W-14: GET /admin/production/failures + bulk-retry endpoint + /dashboard/production/failures -- T-7: AD audio sync с video в VideoWithCaptions.tsx - -