Files
LumaWeb/planning/TASK_MATRIX.md
T
wt a338d3a1dd S00-022: Record newly available external input for independent verification
Changes: Release external waiting state for S00-022 through tasks.py. Input: New primary-source candidate supplied: libomemo.js@3.0.0 https://github.com/conversejs/libomemo.js declares legacy OMEMO and OMEMO2 0.9.1 urn:xmpp:omemo:2, WASM and browser worker-client; Converse 14 source uses this dependency and encryptSCE/decryptSCE. Source links and limitations in state/runs/coordinator-research/omemo2-sources.md. Previous npm E404 queries did not include libomemo.js. Upstream explicitly lacks third-party security audit; GPL-3.0 compatibility, actual target tests, preservation of accepted verified engine/persistence and security review remain mandatory. New candidate is sourcing input only, not permission to replace an accepted engine, waive audit/requirements, or claim acceptance. Fresh task executor must evaluate this candidate under the existing card and escalate any unresolved bounded requirement.
Validation: External input availability checked; tasks.py release-external succeeded. Acceptance and dependent tasks remain unverified pending fresh executor and independent review.

Task: S00-022
Agent: coordinator-input-s00-022
Role: orchestrator
Action: release-external
Status: todo

Task title: Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint
2026-10-15 16:38:43 +07:00

298 lines
41 KiB
Markdown

# Матрица задач
Generated; state revision **71**. Canonical status: state/tasks.json.
| ID | Этап | Оператор | Reviewer | Статус | Owner | Зависимости | Задача |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [S00-001](tasks/S00-001.md) | S00 | orchestrator | security | done | auto-orchestrator-48aab142ecde | | Утвердить Web-профиль |
| [S00-002](tasks/S00-002.md) | S00 | orchestrator | security | done | auto-orchestrator-68a05c587e33 | S00-001, S00-011, S00-012 | Выбрать framework и build runtime |
| [S00-003](tasks/S00-003.md) | S00 | protocol | qa | blocked | auto-protocol-59f4d359b339 | S00-001, S00-002, S00-017, S00-018, S00-019, S00-020 | Проверить XMPP WSS/auth библиотеку |
| [S00-004](tasks/S00-004.md) | S00 | crypto | security | blocked | auto-crypto-fe1c81c17ded | S00-001, S00-002, S00-021, S00-022 | Проверить browser OMEMO backend |
| [S00-005](tasks/S00-005.md) | S00 | storage | qa | blocked | auto-storage-88c3286c6641 | S00-002, S00-023 | Выбрать IndexedDB wrapper и migration policy |
| [S00-006](tasks/S00-006.md) | S00 | orchestrator | security | todo | | S00-002 | Зафиксировать browser/reference matrix |
| [S00-007](tasks/S00-007.md) | S00 | security | orchestrator | todo | | S00-004, S00-005 | Утвердить password и crypto unlock модель |
| [S00-008](tasks/S00-008.md) | S00 | ci-cd | qa | todo | | S00-003, S00-004 | Описать WSS/upload/TURN/push topology |
| [S00-009](tasks/S00-009.md) | S00 | orchestrator | security | todo | | S00-003, S00-004, S00-005, S00-006, S00-007, S00-008 | Согласовать результаты spikes |
| [S00-011](tasks/S00-011.md) | S00 | ci-cd | security | done | auto-ci-cd-d105e8027730 | S00-001 | Restore verified npm registry access for the stack spike |
| [S00-012](tasks/S00-012.md) | S00 | ci-cd | qa | done | auto-ci-cd-f101e40d9902 | S00-001, S00-011, S00-013, S00-014, S00-015 | Fix runner prompt delivery after partial stdin timeout |
| [S00-013](tasks/S00-013.md) | S00 | ci-cd | qa | done | auto-ci-cd-5f68f03dd33b | S00-001, S00-011 | Bound oversized S21-006 runner context without truncating requirements |
| [S00-014](tasks/S00-014.md) | S00 | ci-cd | qa | done | auto-ci-cd-14343249da62 | S00-001, S00-011, S00-013 | Fix repeated runner cleanup after a submitted parent is reaped |
| [S00-015](tasks/S00-015.md) | S00 | ci-cd | qa | done | auto-ci-cd-84e209103f24 | S00-001, S00-011, S00-013, S00-014, S00-016 | Устранить прерывание: Fix runner prompt delivery after partial stdin timeout |
| [S00-016](tasks/S00-016.md) | S00 | ci-cd | qa | done | auto-ci-cd-351a0cbbabef | S00-001, S00-011, S00-013, S00-014 | Restore reviewer model availability after provider capacity failure |
| [S00-017](tasks/S00-017.md) | S00 | protocol | security | done | auto-protocol-599343cd9e3f | S00-001, S00-002 | Establish fail-closed SCRAM server-final validation |
| [S00-018](tasks/S00-018.md) | S00 | protocol | security | done | auto-protocol-89fe6563092c | S00-001, S00-002, S00-017 | Validate bounded standalone XML ingress for the XMPP candidate |
| [S00-019](tasks/S00-019.md) | S00 | crypto | security | done | auto-crypto-c68801170fa4 | S00-001, S00-002, S00-017, S00-018 | Validate browser-compatible SCRAM-SHA-512 through a public mechanism API |
| [S00-020](tasks/S00-020.md) | S00 | ci-cd | qa | blocked | auto-ci-cd-5a18c8aa1b42 | S00-001, S00-002, S00-017, S00-018, S00-019, S00-024 | Restore access to the pinned Linux XMPP experiment toolchain |
| [S00-021](tasks/S00-021.md) | S00 | crypto | security | done | auto-crypto-fcef9b6781bf | S00-001, S00-002 | Устранить прерывание: Проверить browser OMEMO backend |
| [S00-022](tasks/S00-022.md) | S00 | crypto | security | todo | | S00-001, S00-002, S00-021 | Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint |
| [S00-023](tasks/S00-023.md) | S00 | storage | qa | blocked | auto-storage-87486895c792 | S00-002, S00-025 | Устранить прерывание: Выбрать IndexedDB wrapper и migration policy |
| [S00-024](tasks/S00-024.md) | S00 | ci-cd | qa | blocked | auto-ci-cd-988167c541cf | S00-001, S00-002, S00-017, S00-018, S00-019, S00-026 | Устранить прерывание: Restore access to the pinned Linux XMPP experiment toolchain |
| [S00-025](tasks/S00-025.md) | S00 | storage | qa | todo | | S00-002 | Устранить прерывание: Устранить прерывание: Выбрать IndexedDB wrapper и migration policy |
| [S00-026](tasks/S00-026.md) | S00 | ci-cd | qa | todo | | S00-001, S00-002, S00-017, S00-018, S00-019 | Provide approved access to the pinned Linux experiment artifacts |
| [S00-010](tasks/S00-010.md) | S00 | qa | orchestrator | todo | | S00-001, S00-002, S00-003, S00-004, S00-005, S00-006, S00-007, S00-008, S00-009 | Gate: Профиль и проверка стека |
| [S01-001](tasks/S01-001.md) | S01 | orchestrator | security | todo | | S00-010 | Описать identity/model contracts |
| [S01-002](tasks/S01-002.md) | S01 | orchestrator | security | todo | | S00-010, S01-001 | Описать async account context |
| [S01-003](tasks/S01-003.md) | S01 | storage | qa | todo | | S00-010, S01-001, S01-002 | Описать transaction contract |
| [S01-004](tasks/S01-004.md) | S01 | protocol | qa | todo | | S00-010, S01-001, S01-002 | Описать XMPP event/command port |
| [S01-005](tasks/S01-005.md) | S01 | crypto | security | todo | | S00-010, S01-001, S01-002 | Описать crypto port |
| [S01-006](tasks/S01-006.md) | S01 | media | qa | todo | | S00-010, S01-001, S01-002, S01-005 | Описать staged asset contract |
| [S01-007](tasks/S01-007.md) | S01 | realtime | qa | todo | | S00-010, S01-001, S01-002, S01-004 | Описать call engine contract |
| [S01-008](tasks/S01-008.md) | S01 | backend | security | todo | | S00-010, S01-001, S01-002, S01-004 | Описать push API и binding |
| [S01-009](tasks/S01-009.md) | S01 | qa | orchestrator | todo | | S01-001, S01-002, S01-003, S01-004, S01-005, S01-006, S01-007, S01-008 | Gate: Предметные контракты |
| [S02-001](tasks/S02-001.md) | S02 | ci-cd | qa | todo | | S01-009 | Создать workspace по accepted ADR |
| [S02-002](tasks/S02-002.md) | S02 | ci-cd | qa | todo | | S01-009, S02-001 | Настроить production build |
| [S02-003](tasks/S02-003.md) | S02 | ci-cd | qa | todo | | S01-009, S02-001 | Настроить единый code quality check |
| [S02-004](tasks/S02-004.md) | S02 | qa | orchestrator | todo | | S01-009, S02-001 | Настроить unit/contract runner |
| [S02-005](tasks/S02-005.md) | S02 | qa | orchestrator | todo | | S01-009, S02-002, S02-004 | Настроить browser smoke runner |
| [S02-006](tasks/S02-006.md) | S02 | ci-cd | qa | todo | | S01-009, S02-002, S02-003, S02-004, S02-005 | Подключить app CI |
| [S02-007](tasks/S02-007.md) | S02 | front | qa | todo | | S01-009, S02-001, S02-004 | Создать route skeleton |
| [S02-008](tasks/S02-008.md) | S02 | ci-cd | qa | todo | | S01-009, S02-001, S02-004 | Валидировать public runtime config |
| [S02-009](tasks/S02-009.md) | S02 | protocol | qa | todo | | S01-009, S02-004 | Создать typed error vocabulary |
| [S02-010](tasks/S02-010.md) | S02 | orchestrator | security | todo | | S01-009, S02-004, S02-009 | Реализовать operation context primitive |
| [S02-011](tasks/S02-011.md) | S02 | crypto | security | todo | | S01-009, S02-004, S02-009, S02-010 | Создать worker request bridge |
| [S02-012](tasks/S02-012.md) | S02 | qa | orchestrator | todo | | S02-001, S02-002, S02-003, S02-004, S02-005, S02-006, S02-007, S02-008, S02-009, S02-010, S02-011 | Gate: Workspace и инженерный каркас |
| [S03-001](tasks/S03-001.md) | S03 | front | qa | todo | | S02-012 | Реализовать semantic palette |
| [S03-002](tasks/S03-002.md) | S03 | front | qa | todo | | S02-012, S03-001 | Реализовать typography/spacing tokens |
| [S03-003](tasks/S03-003.md) | S03 | front | qa | todo | | S02-012, S03-001, S03-002 | Реализовать theme preferences |
| [S03-004](tasks/S03-004.md) | S03 | front | qa | todo | | S02-012, S03-002 | Создать Button/IconButton |
| [S03-005](tasks/S03-005.md) | S03 | front | qa | todo | | S02-012, S03-002, S03-004 | Создать Input/PasswordInput |
| [S03-006](tasks/S03-006.md) | S03 | front | qa | todo | | S02-012, S03-004 | Создать Dialog/Popover |
| [S03-007](tasks/S03-007.md) | S03 | front | qa | todo | | S02-012, S03-004 | Создать Toast/InlineError |
| [S03-008](tasks/S03-008.md) | S03 | front | qa | todo | | S02-012, S03-002 | Создать Empty/LoadingState |
| [S03-009](tasks/S03-009.md) | S03 | front | qa | todo | | S02-012, S03-001, S03-002 | Создать Avatar |
| [S03-010](tasks/S03-010.md) | S03 | front | qa | todo | | S02-012, S03-005 | Создать SearchField |
| [S03-011](tasks/S03-011.md) | S03 | front | qa | todo | | S02-012, S03-001, S03-002 | Создать Badge/StatusChip |
| [S03-012](tasks/S03-012.md) | S03 | front | qa | todo | | S02-012, S03-004 | Создать icon registry |
| [S03-013](tasks/S03-013.md) | S03 | front | qa | todo | | S02-012, S03-003, S03-004, S03-005, S03-006, S03-007, S03-008, S03-009, S03-010, S03-011, S03-012 | Собрать primitive catalog |
| [S03-014](tasks/S03-014.md) | S03 | qa | orchestrator | todo | | S02-012, S03-013 | Проверить primitives |
| [S03-015](tasks/S03-015.md) | S03 | qa | orchestrator | todo | | S03-001, S03-002, S03-003, S03-004, S03-005, S03-006, S03-007, S03-008, S03-009, S03-010, S03-011, S03-012, S03-013, S03-014 | Gate: Токены и базовые компоненты |
| [S04-001](tasks/S04-001.md) | S04 | storage | qa | todo | | S03-015 | Создать версионированную schema |
| [S04-002](tasks/S04-002.md) | S04 | storage | qa | todo | | S03-015, S04-001 | Реализовать transaction wrapper |
| [S04-003](tasks/S04-003.md) | S04 | storage | qa | todo | | S03-015, S04-002 | Реализовать message repository |
| [S04-004](tasks/S04-004.md) | S04 | storage | qa | todo | | S03-015, S04-002 | Реализовать conversation repository |
| [S04-005](tasks/S04-005.md) | S04 | storage | qa | todo | | S03-015, S04-002 | Реализовать checkpoint/suppression storage |
| [S04-006](tasks/S04-006.md) | S04 | storage | qa | todo | | S03-015, S04-002 | Реализовать draft persistence |
| [S04-007](tasks/S04-007.md) | S04 | storage | qa | todo | | S03-015, S04-002, S04-003 | Обработать quota/degraded mode |
| [S04-008](tasks/S04-008.md) | S04 | storage | qa | todo | | S03-015, S04-001, S04-002 | Реализовать первую migration pipeline |
| [S04-009](tasks/S04-009.md) | S04 | storage | qa | todo | | S03-015, S04-002 | Реализовать media cache policy |
| [S04-010](tasks/S04-010.md) | S04 | qa | orchestrator | todo | | S03-015, S04-003, S04-004, S04-005, S04-006, S04-007, S04-008, S04-009 | Проверить reload/recovery suite |
| [S04-011](tasks/S04-011.md) | S04 | qa | orchestrator | todo | | S04-001, S04-002, S04-003, S04-004, S04-005, S04-006, S04-007, S04-008, S04-009, S04-010 | Gate: Локальное хранилище |
| [S05-001](tasks/S05-001.md) | S05 | protocol | qa | todo | | S04-011 | Валидировать WSS endpoint |
| [S05-002](tasks/S05-002.md) | S05 | protocol | qa | todo | | S04-011, S05-001 | Реализовать WSS adapter |
| [S05-003](tasks/S05-003.md) | S05 | protocol | qa | todo | | S04-011, S05-002 | Реализовать auth preference |
| [S05-004](tasks/S05-004.md) | S05 | protocol | qa | todo | | S04-011, S05-003 | Проверить SCRAM challenge limits |
| [S05-005](tasks/S05-005.md) | S05 | protocol | qa | todo | | S04-011, S05-002 | Реализовать stanza parser boundary |
| [S05-006](tasks/S05-006.md) | S05 | protocol | qa | todo | | S04-011, S05-002, S05-005 | Реализовать capability discovery |
| [S05-007](tasks/S05-007.md) | S05 | protocol | qa | todo | | S04-011, S05-002, S05-005, S05-006 | Интегрировать SM/Carbons/CSI/Ping |
| [S05-008](tasks/S05-008.md) | S05 | protocol | qa | todo | | S04-011, S05-002, S05-007 | Реализовать bounded reconnect |
| [S05-009](tasks/S05-009.md) | S05 | security | orchestrator | todo | | S04-011, S05-003, S05-004, S05-005, S05-008 | Проверить auth/secret boundary |
| [S05-010](tasks/S05-010.md) | S05 | qa | orchestrator | todo | | S04-011, S05-006, S05-007, S05-008, S05-009 | Проверить WSS/reconnect интеграцию |
| [S05-011](tasks/S05-011.md) | S05 | qa | security | todo | | S05-001, S05-002, S05-003, S05-004, S05-005, S05-006, S05-007, S05-008, S05-009, S05-010 | Gate: WSS и аутентификация |
| [S06-001](tasks/S06-001.md) | S06 | protocol | qa | todo | | S05-011 | Реализовать JID/resource policy |
| [S06-002](tasks/S06-002.md) | S06 | storage | qa | todo | | S05-011, S06-001 | Реализовать saved account configs |
| [S06-003](tasks/S06-003.md) | S06 | front | qa | todo | | S05-011, S06-001 | Создать Web LoginForm |
| [S06-004](tasks/S06-004.md) | S06 | protocol | qa | todo | | S05-011, S06-001, S06-002 | Реализовать sign-in use case |
| [S06-005](tasks/S06-005.md) | S06 | protocol | qa | todo | | S05-011, S06-004 | Реализовать in-memory credentials |
| [S06-006](tasks/S06-006.md) | S06 | protocol | qa | todo | | S05-011, S06-002, S06-004, S06-005 | Реализовать switch cancellation |
| [S06-007](tasks/S06-007.md) | S06 | protocol | qa | todo | | S05-011, S06-005, S06-006 | Реализовать logout orchestration |
| [S06-008](tasks/S06-008.md) | S06 | storage | qa | todo | | S05-011, S06-002, S06-007 | Реализовать explicit local erase |
| [S06-009](tasks/S06-009.md) | S06 | front | qa | todo | | S05-011, S06-003, S06-006, S06-007, S06-008 | Создать account switch/logout UI |
| [S06-010](tasks/S06-010.md) | S06 | qa | orchestrator | todo | | S05-011, S06-004, S06-005, S06-006, S06-007, S06-008, S06-009 | Проверить lifecycle races |
| [S06-011](tasks/S06-011.md) | S06 | qa | orchestrator | todo | | S06-001, S06-002, S06-003, S06-004, S06-005, S06-006, S06-007, S06-008, S06-009, S06-010 | Gate: Аккаунты и lifecycle |
| [S07-001](tasks/S07-001.md) | S07 | front | qa | todo | | S06-011 | Создать adaptive shell |
| [S07-002](tasks/S07-002.md) | S07 | front | qa | todo | | S06-011, S07-001 | Реализовать Back/selection routes |
| [S07-003](tasks/S07-003.md) | S07 | front | qa | todo | | S06-011, S07-001 | Создать ConversationRow |
| [S07-004](tasks/S07-004.md) | S07 | front | qa | todo | | S06-011, S07-003 | Реализовать search/sort policies |
| [S07-005](tasks/S07-005.md) | S07 | front | qa | todo | | S06-011, S07-003, S07-004 | Подключить empty/no-results states |
| [S07-006](tasks/S07-006.md) | S07 | protocol | qa | todo | | S06-011 | Реализовать roster initial/push |
| [S07-007](tasks/S07-007.md) | S07 | protocol | qa | todo | | S06-011, S07-006 | Реализовать presence reducer |
| [S07-008](tasks/S07-008.md) | S07 | protocol | qa | todo | | S06-011, S07-006 | Реализовать avatar fetch/publish adapter |
| [S07-009](tasks/S07-009.md) | S07 | media | qa | todo | | S06-011, S07-008 | Нормализовать avatar asset |
| [S07-010](tasks/S07-010.md) | S07 | front | qa | todo | | S06-011, S07-003, S07-004, S07-005, S07-006, S07-007, S07-008, S07-009 | Собрать ContactsView |
| [S07-011](tasks/S07-011.md) | S07 | front | qa | todo | | S06-011, S07-002, S07-006, S07-010 | Создать new direct chat flow |
| [S07-012](tasks/S07-012.md) | S07 | qa | orchestrator | todo | | S06-011, S07-002, S07-004, S07-005, S07-010, S07-011 | Проверить shell и roster UI |
| [S07-013](tasks/S07-013.md) | S07 | qa | orchestrator | todo | | S07-001, S07-002, S07-003, S07-004, S07-005, S07-006, S07-007, S07-008, S07-009, S07-010, S07-011, S07-012 | Gate: Навигация, контакты и списки |
| [S08-001](tasks/S08-001.md) | S08 | protocol | qa | todo | | S07-013 | Реализовать message identity merge |
| [S08-002](tasks/S08-002.md) | S08 | protocol | qa | todo | | S07-013, S08-001 | Реализовать delivery merge |
| [S08-003](tasks/S08-003.md) | S08 | protocol | qa | todo | | S07-013, S08-001, S08-002 | Реализовать incoming decode reducer |
| [S08-004](tasks/S08-004.md) | S08 | protocol | qa | todo | | S07-013, S08-001, S08-002, S08-003 | Реализовать optimistic text send |
| [S08-005](tasks/S08-005.md) | S08 | protocol | qa | todo | | S07-013, S08-004 | Реализовать text retry |
| [S08-006](tasks/S08-006.md) | S08 | protocol | qa | todo | | S07-013, S08-001, S08-002, S08-003 | Обработать delivery receipts |
| [S08-007](tasks/S08-007.md) | S08 | protocol | qa | todo | | S07-013, S08-004, S08-006 | Реализовать displayed/markable |
| [S08-008](tasks/S08-008.md) | S08 | protocol | qa | todo | | S07-013, S08-003, S08-007 | Реализовать own-device read sync |
| [S08-009](tasks/S08-009.md) | S08 | protocol | qa | todo | | S07-013, S08-003, S08-008 | Реализовать unread/preview reducer |
| [S08-010](tasks/S08-010.md) | S08 | protocol | qa | todo | | S07-013, S08-004, S08-008, S08-009 | Реализовать self-chat policy |
| [S08-011](tasks/S08-011.md) | S08 | qa | orchestrator | todo | | S08-001, S08-002, S08-003, S08-004, S08-005, S08-006, S08-007, S08-008, S08-009, S08-010 | Gate: Сообщения и read state |
| [S09-001](tasks/S09-001.md) | S09 | front | qa | todo | | S08-011 | Создать text/file bubble |
| [S09-002](tasks/S09-002.md) | S09 | front | qa | todo | | S08-011, S09-001 | Реализовать bounded timeline |
| [S09-003](tasks/S09-003.md) | S09 | front | qa | todo | | S08-011, S09-002 | Сохранить viewport при history insert |
| [S09-004](tasks/S09-004.md) | S09 | front | qa | todo | | S08-011, S09-001 | Создать multiline composer |
| [S09-005](tasks/S09-005.md) | S09 | front | qa | todo | | S08-011, S09-004 | Реализовать Enter/IME policy |
| [S09-006](tasks/S09-006.md) | S09 | front | qa | todo | | S08-011, S09-004, S09-005 | Подключить composer к send/retry |
| [S09-007](tasks/S09-007.md) | S09 | front | qa | todo | | S08-011, S09-001, S09-002 | Создать date separators/metadata |
| [S09-008](tasks/S09-008.md) | S09 | front | qa | todo | | S08-011, S09-001, S09-002 | Создать message selection state |
| [S09-009](tasks/S09-009.md) | S09 | front | qa | todo | | S08-011, S09-003 | Создать jump-to-latest |
| [S09-010](tasks/S09-010.md) | S09 | front | qa | todo | | S08-011, S09-002, S09-003 | Реализовать bounded message motion |
| [S09-011](tasks/S09-011.md) | S09 | qa | orchestrator | todo | | S08-011, S09-005, S09-006, S09-007, S09-008, S09-009, S09-010 | Проверить chat keyboard/scale |
| [S09-012](tasks/S09-012.md) | S09 | qa | orchestrator | todo | | S09-001, S09-002, S09-003, S09-004, S09-005, S09-006, S09-007, S09-008, S09-009, S09-010, S09-011 | Gate: Лента и composer |
| [S10-001](tasks/S10-001.md) | S10 | protocol | qa | todo | | S09-012 | Реализовать action predicates |
| [S10-002](tasks/S10-002.md) | S10 | protocol | qa | todo | | S09-012, S10-001 | Реализовать reply/fallback encoder |
| [S10-003](tasks/S10-003.md) | S10 | protocol | qa | todo | | S09-012, S10-002 | Реализовать XML/legacy reply parser |
| [S10-004](tasks/S10-004.md) | S10 | front | qa | todo | | S09-012, S10-003 | Создать CompactReply/ThreadFocus |
| [S10-005](tasks/S10-005.md) | S10 | protocol | qa | todo | | S09-012, S10-001 | Реализовать correction reducer/command |
| [S10-006](tasks/S10-006.md) | S10 | front | qa | todo | | S09-012, S10-005 | Подключить edit composer mode |
| [S10-007](tasks/S10-007.md) | S10 | storage | qa | todo | | S09-012, S10-001 | Реализовать local deletion transaction |
| [S10-008](tasks/S10-008.md) | S10 | protocol | qa | todo | | S09-012, S10-001 | Реализовать retraction command/reducer |
| [S10-009](tasks/S10-009.md) | S10 | protocol | qa | todo | | S09-012, S10-001 | Реализовать ordered text/location forwarding |
| [S10-010](tasks/S10-010.md) | S10 | protocol | qa | todo | | S09-012, S10-001 | Реализовать reaction set reducer |
| [S10-011](tasks/S10-011.md) | S10 | front | qa | todo | | S09-012, S10-010 | Подключить ReactionChip/EmojiPicker |
| [S10-012](tasks/S10-012.md) | S10 | protocol | qa | todo | | S09-012 | Реализовать typing policy/events |
| [S10-013](tasks/S10-013.md) | S10 | front | qa | todo | | S09-012, S10-004, S10-006, S10-007, S10-008, S10-009, S10-011 | Подключить context/selection actions |
| [S10-014](tasks/S10-014.md) | S10 | qa | orchestrator | todo | | S09-012, S10-005, S10-007, S10-008, S10-010, S10-012, S10-013 | Проверить out-of-order actions |
| [S10-015](tasks/S10-015.md) | S10 | qa | orchestrator | todo | | S10-001, S10-002, S10-003, S10-004, S10-005, S10-006, S10-007, S10-008, S10-009, S10-010, S10-011, S10-012, S10-013, S10-014 | Gate: Действия над сообщениями |
| [S11-001](tasks/S11-001.md) | S11 | protocol | qa | todo | | S10-015 | Реализовать MAM query envelope |
| [S11-002](tasks/S11-002.md) | S11 | protocol | qa | todo | | S10-015, S11-001 | Реализовать cursor policy |
| [S11-003](tasks/S11-003.md) | S11 | protocol | qa | todo | | S10-015, S11-001, S11-002 | Реализовать recent bootstrap |
| [S11-004](tasks/S11-004.md) | S11 | protocol | qa | todo | | S10-015, S11-001 | Реализовать bounded decode slices |
| [S11-005](tasks/S11-005.md) | S11 | storage | qa | todo | | S10-015, S11-002, S11-004 | Реализовать archive commit transaction |
| [S11-006](tasks/S11-006.md) | S11 | protocol | qa | todo | | S10-015, S11-002, S11-005 | Реализовать incremental catch-up |
| [S11-007](tasks/S11-007.md) | S11 | protocol | qa | todo | | S10-015, S11-001, S11-004, S11-006 | Реализовать bounded archive recovery |
| [S11-008](tasks/S11-008.md) | S11 | protocol | qa | todo | | S10-015, S11-001, S11-002, S11-005 | Реализовать interactive backward paging |
| [S11-009](tasks/S11-009.md) | S11 | protocol | qa | todo | | S10-015, S11-004 | Ограничить pending target queues |
| [S11-010](tasks/S11-010.md) | S11 | protocol | qa | todo | | S10-015, S11-006, S11-007 | Подключить archive pause/resume |
| [S11-011](tasks/S11-011.md) | S11 | front | qa | todo | | S10-015, S11-003, S11-008, S11-010 | Подключить older history UI |
| [S11-012](tasks/S11-012.md) | S11 | qa | orchestrator | todo | | S10-015, S11-005, S11-007, S11-008, S11-009, S11-010, S11-011 | Проверить archive restart failures |
| [S11-013](tasks/S11-013.md) | S11 | qa | orchestrator | todo | | S11-001, S11-002, S11-003, S11-004, S11-005, S11-006, S11-007, S11-008, S11-009, S11-010, S11-011, S11-012 | Gate: Архив и восстановление |
| [S12-001](tasks/S12-001.md) | S12 | crypto | security | todo | | S11-013 | Подключить accepted crypto backend |
| [S12-002](tasks/S12-002.md) | S12 | crypto | security | todo | | S11-013, S12-001 | Реализовать identity bootstrap |
| [S12-003](tasks/S12-003.md) | S12 | crypto | security | todo | | S11-013, S12-002 | Реализовать protected crypto persistence |
| [S12-004](tasks/S12-004.md) | S12 | crypto | security | todo | | S11-013, S12-002 | Реализовать device trust model |
| [S12-005](tasks/S12-005.md) | S12 | protocol | qa | todo | | S11-013 | Реализовать legacy device list PEP |
| [S12-006](tasks/S12-006.md) | S12 | protocol | qa | todo | | S11-013, S12-005 | Реализовать legacy bundle PEP |
| [S12-007](tasks/S12-007.md) | S12 | crypto | security | todo | | S11-013, S12-001, S12-004, S12-006 | Реализовать legacy session builder |
| [S12-008](tasks/S12-008.md) | S12 | crypto | security | todo | | S11-013, S12-007 | Реализовать legacy stanza encryption |
| [S12-009](tasks/S12-009.md) | S12 | crypto | security | todo | | S11-013, S12-007, S12-008 | Реализовать legacy stanza decryption |
| [S12-010](tasks/S12-010.md) | S12 | protocol | qa | todo | | S11-013 | Реализовать OMEMO2 devices PEP |
| [S12-011](tasks/S12-011.md) | S12 | protocol | qa | todo | | S11-013, S12-010 | Реализовать OMEMO2 bundle PEP |
| [S12-012](tasks/S12-012.md) | S12 | crypto | security | todo | | S11-013, S12-001, S12-003, S12-004, S12-011 | Реализовать OMEMO2 session adapter |
| [S12-013](tasks/S12-013.md) | S12 | crypto | security | todo | | S11-013, S12-012 | Интегрировать OMEMO2 payload/SCE codec |
| [S12-014](tasks/S12-014.md) | S12 | crypto | security | todo | | S11-013, S12-013 | Реализовать OMEMO2 stanza adapter |
| [S12-015](tasks/S12-015.md) | S12 | crypto | security | todo | | S11-013, S12-008, S12-009, S12-014 | Реализовать OMEMO format preference |
| [S12-016](tasks/S12-016.md) | S12 | crypto | security | todo | | S11-013, S12-015 | Подключить own-device recipients |
| [S12-017](tasks/S12-017.md) | S12 | crypto | security | todo | | S11-013, S12-001, S12-003 | Реализовать encrypted file port |
| [S12-018](tasks/S12-018.md) | S12 | front | qa | todo | | S11-013, S12-015 | Создать encryption controls |
| [S12-019](tasks/S12-019.md) | S12 | front | qa | todo | | S11-013, S12-004, S12-015 | Создать devices/fingerprint UI |
| [S12-020](tasks/S12-020.md) | S12 | security | orchestrator | todo | | S11-013, S12-003, S12-008, S12-009, S12-014, S12-015, S12-016, S12-017, S12-018, S12-019 | Проверить client crypto boundaries |
| [S12-021](tasks/S12-021.md) | S12 | qa | orchestrator | todo | | S11-013, S12-020 | Проверить OMEMO interoperability |
| [S12-022](tasks/S12-022.md) | S12 | qa | security | todo | | S12-001, S12-002, S12-003, S12-004, S12-005, S12-006, S12-007, S12-008, S12-009, S12-010, S12-011, S12-012, S12-013, S12-014, S12-015, S12-016, S12-017, S12-018, S12-019, S12-020, S12-021 | Gate: OMEMO и доверие |
| [S13-001](tasks/S13-001.md) | S13 | protocol | qa | todo | | S12-022 | Реализовать room join/password |
| [S13-002](tasks/S13-002.md) | S13 | protocol | qa | todo | | S12-022, S13-001 | Реализовать encrypted-friendly config |
| [S13-003](tasks/S13-003.md) | S13 | protocol | qa | todo | | S12-022, S13-001 | Реализовать occupants/invitations |
| [S13-004](tasks/S13-004.md) | S13 | protocol | qa | todo | | S12-022, S13-001, S13-002, S13-003 | Реализовать affiliation lists |
| [S13-005](tasks/S13-005.md) | S13 | crypto | security | todo | | S12-022, S13-004 | Реализовать group recipient policy |
| [S13-006](tasks/S13-006.md) | S13 | crypto | security | todo | | S12-022, S13-005 | Подключить encrypted group send |
| [S13-007](tasks/S13-007.md) | S13 | protocol | qa | todo | | S12-022, S13-003, S13-006 | Реализовать group echo/stanza merge |
| [S13-008](tasks/S13-008.md) | S13 | protocol | qa | todo | | S12-022, S13-001, S13-003 | Реализовать saved autojoin |
| [S13-009](tasks/S13-009.md) | S13 | protocol | qa | todo | | S12-022, S13-001, S13-007, S13-008 | Реализовать leave/delete semantics |
| [S13-010](tasks/S13-010.md) | S13 | front | qa | todo | | S12-022, S13-002, S13-003, S13-008 | Создать create/join/invite UI |
| [S13-011](tasks/S13-011.md) | S13 | front | qa | todo | | S12-022, S13-005, S13-009, S13-010 | Создать GroupInfo |
| [S13-012](tasks/S13-012.md) | S13 | qa | orchestrator | todo | | S12-022, S13-006, S13-007, S13-009, S13-011 | Проверить group OMEMO/replies |
| [S13-013](tasks/S13-013.md) | S13 | qa | orchestrator | todo | | S13-001, S13-002, S13-003, S13-004, S13-005, S13-006, S13-007, S13-008, S13-009, S13-010, S13-011, S13-012 | Gate: MUC |
| [S14-001](tasks/S14-001.md) | S14 | media | qa | todo | | S13-013 | Реализовать file staging |
| [S14-002](tasks/S14-002.md) | S14 | media | qa | todo | | S13-013, S14-001 | Реализовать safe media inference |
| [S14-003](tasks/S14-003.md) | S14 | protocol | qa | todo | | S13-013, S14-002 | Реализовать upload discovery/slot |
| [S14-004](tasks/S14-004.md) | S14 | media | qa | todo | | S13-013, S14-003 | Реализовать PUT with redirect policy |
| [S14-005](tasks/S14-005.md) | S14 | crypto | security | todo | | S13-013, S14-002, S14-004 | Подключить file encryption до PUT |
| [S14-006](tasks/S14-006.md) | S14 | protocol | qa | todo | | S13-013, S14-005 | Реализовать media message body |
| [S14-007](tasks/S14-007.md) | S14 | media | qa | todo | | S13-013, S14-004, S14-006 | Реализовать upload retry/cancel |
| [S14-008](tasks/S14-008.md) | S14 | media | qa | todo | | S13-013, S14-005 | Реализовать HTTPS/aesgcm download |
| [S14-009](tasks/S14-009.md) | S14 | media | qa | todo | | S13-013, S14-006, S14-007 | Реализовать sequential batch |
| [S14-010](tasks/S14-010.md) | S14 | media | qa | todo | | S13-013, S14-008, S14-009 | Реализовать media forwarding |
| [S14-011](tasks/S14-011.md) | S14 | front | qa | todo | | S13-013, S14-001, S14-002, S14-009 | Создать batch preview UI |
| [S14-012](tasks/S14-012.md) | S14 | qa | orchestrator | todo | | S13-013, S14-007, S14-008, S14-010, S14-011 | Проверить upload integration |
| [S14-013](tasks/S14-013.md) | S14 | qa | orchestrator | todo | | S14-001, S14-002, S14-003, S14-004, S14-005, S14-006, S14-007, S14-008, S14-009, S14-010, S14-011, S14-012 | Gate: Файлы и upload |
| [S15-001](tasks/S15-001.md) | S15 | media | qa | todo | | S14-013 | Создать media thumbnail worker |
| [S15-002](tasks/S15-002.md) | S15 | storage | qa | todo | | S14-013, S15-001 | Подключить deduplicated preview cache |
| [S15-003](tasks/S15-003.md) | S15 | front | qa | todo | | S14-013, S15-001, S15-002 | Создать photo/video island |
| [S15-004](tasks/S15-004.md) | S15 | media | qa | todo | | S14-013 | Реализовать playback coordinator |
| [S15-005](tasks/S15-005.md) | S15 | front | qa | todo | | S14-013, S15-004 | Создать voice/audio controls |
| [S15-006](tasks/S15-006.md) | S15 | front | qa | todo | | S14-013, S15-001, S15-004 | Создать round videoNote player |
| [S15-007](tasks/S15-007.md) | S15 | front | qa | todo | | S14-013, S15-003, S15-004 | Создать full-window viewer |
| [S15-008](tasks/S15-008.md) | S15 | media | qa | todo | | S14-013, S15-002 | Реализовать explicit export/download |
| [S15-009](tasks/S15-009.md) | S15 | front | qa | todo | | S14-013, S15-005, S15-006, S15-007, S15-008 | Подключить media menus/errors |
| [S15-010](tasks/S15-010.md) | S15 | qa | orchestrator | todo | | S14-013, S15-003, S15-005, S15-006, S15-007, S15-008, S15-009 | Проверить browser media states |
| [S15-011](tasks/S15-011.md) | S15 | qa | orchestrator | todo | | S15-001, S15-002, S15-003, S15-004, S15-005, S15-006, S15-007, S15-008, S15-009, S15-010 | Gate: Просмотр медиа |
| [S16-001](tasks/S16-001.md) | S16 | media | qa | todo | | S15-011 | Реализовать permission adapter |
| [S16-002](tasks/S16-002.md) | S16 | media | qa | todo | | S15-011, S16-001 | Реализовать voice recorder |
| [S16-003](tasks/S16-003.md) | S16 | media | qa | todo | | S15-011, S16-001 | Реализовать videoNote recorder |
| [S16-004](tasks/S16-004.md) | S16 | media | qa | todo | | S15-011, S16-002, S16-003 | Реализовать early-stop/finalization |
| [S16-005](tasks/S16-005.md) | S16 | front | qa | todo | | S15-011, S16-004 | Создать accessible capture controls |
| [S16-006](tasks/S16-006.md) | S16 | media | qa | todo | | S15-011 | Реализовать geo URI codec |
| [S16-007](tasks/S16-007.md) | S16 | media | qa | todo | | S15-011, S16-001, S16-006 | Реализовать current location adapter |
| [S16-008](tasks/S16-008.md) | S16 | front | qa | todo | | S15-011, S16-006, S16-007 | Создать manual location picker |
| [S16-009](tasks/S16-009.md) | S16 | security | orchestrator | todo | | S15-011, S16-008 | Проверить maps provider disclosure |
| [S16-010](tasks/S16-010.md) | S16 | qa | orchestrator | todo | | S15-011, S16-005, S16-008, S16-009 | Проверить capture/geo flows |
| [S16-011](tasks/S16-011.md) | S16 | qa | orchestrator | todo | | S16-001, S16-002, S16-003, S16-004, S16-005, S16-006, S16-007, S16-008, S16-009, S16-010 | Gate: Recording и геопозиция |
| [S17-001](tasks/S17-001.md) | S17 | realtime | qa | todo | | S16-011 | Реализовать call state machine |
| [S17-002](tasks/S17-002.md) | S17 | realtime | qa | todo | | S16-011, S17-001 | Реализовать full JID selection |
| [S17-003](tasks/S17-003.md) | S17 | protocol | qa | todo | | S16-011, S17-002 | Реализовать JMI adapter |
| [S17-004](tasks/S17-004.md) | S17 | realtime | qa | todo | | S16-011, S17-001 | Создать WebRTC media adapter |
| [S17-005](tasks/S17-005.md) | S17 | realtime | qa | todo | | S16-011, S17-003, S17-004 | Реализовать Jingle/SDP codec |
| [S17-006](tasks/S17-006.md) | S17 | protocol | qa | todo | | S16-011 | Реализовать extdisco ICE validation |
| [S17-007](tasks/S17-007.md) | S17 | realtime | qa | todo | | S16-011, S17-002, S17-005, S17-006 | Реализовать trickle candidate queues |
| [S17-008](tasks/S17-008.md) | S17 | realtime | qa | todo | | S16-011, S17-004 | Реализовать mute/camera/route use cases |
| [S17-009](tasks/S17-009.md) | S17 | realtime | qa | todo | | S16-011, S17-001, S17-007 | Реализовать ringing/recovery deadlines |
| [S17-010](tasks/S17-010.md) | S17 | realtime | qa | todo | | S16-011, S17-001, S17-009 | Реализовать history outcome policy |
| [S17-011](tasks/S17-011.md) | S17 | protocol | qa | todo | | S16-011, S17-010 | Реализовать own-device call history |
| [S17-012](tasks/S17-012.md) | S17 | front | qa | todo | | S16-011, S17-008, S17-009, S17-010, S17-011 | Создать CallScene/HistoryCard |
| [S17-013](tasks/S17-013.md) | S17 | qa | orchestrator | todo | | S16-011, S17-006, S17-007, S17-009, S17-012 | Проверить NAT/TURN/endpoint scenarios |
| [S17-014](tasks/S17-014.md) | S17 | qa | orchestrator | todo | | S17-001, S17-002, S17-003, S17-004, S17-005, S17-006, S17-007, S17-008, S17-009, S17-010, S17-011, S17-012, S17-013 | Gate: Личные звонки |
| [S18-001](tasks/S18-001.md) | S18 | backend | security | todo | | S17-014 | Создать gateway service shell |
| [S18-002](tasks/S18-002.md) | S18 | backend | security | todo | | S17-014, S18-001 | Реализовать subscription storage |
| [S18-003](tasks/S18-003.md) | S18 | backend | security | todo | | S17-014, S18-002 | Реализовать ownership proof |
| [S18-004](tasks/S18-004.md) | S18 | backend | security | todo | | S17-014, S18-003 | Реализовать API limits/origin policy |
| [S18-005](tasks/S18-005.md) | S18 | backend | security | todo | | S17-014, S18-004 | Реализовать Web Push provider adapter |
| [S18-006](tasks/S18-006.md) | S18 | protocol | qa | todo | | S17-014, S18-003, S18-005 | Реализовать XMPP enable/disable |
| [S18-007](tasks/S18-007.md) | S18 | front | qa | todo | | S17-014, S18-006 | Создать notification preferences |
| [S18-008](tasks/S18-008.md) | S18 | protocol | qa | todo | | S17-014, S18-006 | Реализовать event notification policy |
| [S18-009](tasks/S18-009.md) | S18 | front | qa | todo | | S17-014, S18-005, S18-007, S18-008 | Реализовать service worker push |
| [S18-010](tasks/S18-010.md) | S18 | front | qa | todo | | S17-014, S18-008, S18-009 | Реализовать safe notification routing |
| [S18-011](tasks/S18-011.md) | S18 | protocol | qa | todo | | S17-014 | Реализовать multi-tab leader |
| [S18-012](tasks/S18-012.md) | S18 | backend | security | todo | | S17-014, S18-003, S18-005, S18-006 | Реализовать revoke/expiry/rotation |
| [S18-013](tasks/S18-013.md) | S18 | security | orchestrator | todo | | S17-014, S18-004, S18-005, S18-009, S18-012 | Проверить gateway secrets/ownership |
| [S18-014](tasks/S18-014.md) | S18 | qa | orchestrator | todo | | S17-014, S18-007, S18-008, S18-009, S18-010, S18-011, S18-012, S18-013 | Проверить push/closed-tab matrix |
| [S18-015](tasks/S18-015.md) | S18 | qa | security | todo | | S18-001, S18-002, S18-003, S18-004, S18-005, S18-006, S18-007, S18-008, S18-009, S18-010, S18-011, S18-012, S18-013, S18-014 | Gate: Web Push и gateway |
| [S19-001](tasks/S19-001.md) | S19 | security | orchestrator | todo | | S18-015 | Реализовать approved lock verifier |
| [S19-002](tasks/S19-002.md) | S19 | protocol | qa | todo | | S18-015, S19-001 | Реализовать lock lifecycle |
| [S19-003](tasks/S19-003.md) | S19 | front | qa | todo | | S18-015, S19-001, S19-002 | Создать LockScreen |
| [S19-004](tasks/S19-004.md) | S19 | protocol | qa | todo | | S18-015, S19-002 | Подключить lock preview policy |
| [S19-005](tasks/S19-005.md) | S19 | security | orchestrator | todo | | S18-015 | Проверить XSS/text/URL boundary |
| [S19-006](tasks/S19-006.md) | S19 | security | orchestrator | todo | | S18-015 | Проверить logs/evidence redaction |
| [S19-007](tasks/S19-007.md) | S19 | security | orchestrator | todo | | S18-015 | Проверить forged own-device events |
| [S19-008](tasks/S19-008.md) | S19 | security | orchestrator | todo | | S18-015, S19-003, S19-004 | Проверить erase/export boundaries |
| [S19-009](tasks/S19-009.md) | S19 | security | orchestrator | todo | | S18-015, S19-005, S19-006, S19-007 | Проверить resource exhaustion limits |
| [S19-010](tasks/S19-010.md) | S19 | qa | orchestrator | todo | | S18-015, S19-003, S19-004, S19-005, S19-006, S19-007, S19-008, S19-009 | Проверить lock/security integration |
| [S19-011](tasks/S19-011.md) | S19 | qa | security | todo | | S19-001, S19-002, S19-003, S19-004, S19-005, S19-006, S19-007, S19-008, S19-009, S19-010 | Gate: Lock и security hardening |
| [S20-001](tasks/S20-001.md) | S20 | front | qa | todo | | S19-011 | Собрать SettingsView |
| [S20-002](tasks/S20-002.md) | S20 | front | qa | todo | | S19-011, S20-001 | Создать ServerInfo |
| [S20-003](tasks/S20-003.md) | S20 | protocol | qa | todo | | S19-011 | Реализовать safe diagnostic snapshot |
| [S20-004](tasks/S20-004.md) | S20 | front | qa | todo | | S19-011, S20-001 | Подключить typing/privacy toggles |
| [S20-005](tasks/S20-005.md) | S20 | front | qa | todo | | S19-011, S20-001 | Подключить own avatar update |
| [S20-006](tasks/S20-006.md) | S20 | front | qa | todo | | S19-011, S20-001, S20-002, S20-003 | Показать permission/capability ограничения |
| [S20-007](tasks/S20-007.md) | S20 | front | qa | todo | | S19-011, S20-001 | Создать Calls list/search |
| [S20-008](tasks/S20-008.md) | S20 | qa | orchestrator | todo | | S19-011, S20-002, S20-003, S20-004, S20-005, S20-006, S20-007 | Проверить settings integration |
| [S20-009](tasks/S20-009.md) | S20 | qa | orchestrator | todo | | S20-001, S20-002, S20-003, S20-004, S20-005, S20-006, S20-007, S20-008 | Gate: Настройки и диагностика |
| [S21-001](tasks/S21-001.md) | S21 | qa | orchestrator | todo | | S20-009 | Принять accounts/transport/storage |
| [S21-002](tasks/S21-002.md) | S21 | qa | orchestrator | todo | | S20-009 | Принять messages/actions/history |
| [S21-003](tasks/S21-003.md) | S21 | qa | orchestrator | todo | | S20-009 | Принять crypto/MUC interoperability |
| [S21-004](tasks/S21-004.md) | S21 | qa | orchestrator | todo | | S20-009 | Принять media/recording/calls |
| [S21-005](tasks/S21-005.md) | S21 | qa | orchestrator | todo | | S20-009 | Принять push/lock/security |
| [S21-006](tasks/S21-006.md) | S21 | qa | orchestrator | todo | | S20-009 | Принять UI/accessibility matrix |
| [S21-007](tasks/S21-007.md) | S21 | qa | orchestrator | todo | | S20-009 | Измерить принятые performance budgets |
| [S21-008](tasks/S21-008.md) | S21 | ci-cd | qa | todo | | S20-009 | Подготовить воспроизводимую test environment |
| [S21-009](tasks/S21-009.md) | S21 | ci-cd | qa | todo | | S20-009, S21-008 | Подготовить deploy/rollback pipeline |
| [S21-010](tasks/S21-010.md) | S21 | security | orchestrator | todo | | S20-009, S21-001, S21-002, S21-003, S21-004, S21-005, S21-006, S21-007, S21-009 | Проверить release threat/privacy checklist |
| [S21-011](tasks/S21-011.md) | S21 | docs | orchestrator | todo | | S20-009, S21-010 | Написать guide и release passport |
| [S21-012](tasks/S21-012.md) | S21 | orchestrator | security | todo | | S20-009, S21-001, S21-002, S21-003, S21-004, S21-005, S21-006, S21-007, S21-008, S21-009, S21-010, S21-011 | Согласовать полный Web scope |
| [S21-013](tasks/S21-013.md) | S21 | qa | orchestrator | todo | | S21-001, S21-002, S21-003, S21-004, S21-005, S21-006, S21-007, S21-008, S21-009, S21-010, S21-011, S21-012 | Gate: Полная Web-приёмка и поставка |