{ "schema_version": 1, "project": "Luma Web", "stages": [ { "id": "S00", "title": "Профиль и проверка стека", "goal": "Зафиксировать Web scope, browser targets и проверенные кандидаты, не устанавливая непроверенный framework по догадке.", "entry_gate": null, "exit_gate": "S00-010" }, { "id": "S01", "title": "Предметные контракты", "goal": "Утвердить небольшие interfaces и fixtures, которые последующие операторы реализуют независимо.", "entry_gate": "S00-010", "exit_gate": "S01-009" }, { "id": "S02", "title": "Workspace и инженерный каркас", "goal": "Создать runnable пустое приложение, тестовые runners и CI без выдачи scaffolding за готовую функцию.", "entry_gate": "S01-009", "exit_gate": "S02-012" }, { "id": "S03", "title": "Токены и базовые компоненты", "goal": "Создать каталог переиспользуемых primitives и состояния accessibility до feature views.", "entry_gate": "S02-012", "exit_gate": "S03-015" }, { "id": "S04", "title": "Локальное хранилище", "goal": "Реализовать account-isolated durable data и безопасные миграции, без секретов в public preferences.", "entry_gate": "S03-015", "exit_gate": "S04-011" }, { "id": "S05", "title": "WSS и аутентификация", "goal": "Подключить реальный browser XMPP adapter с bounded auth/reconnect и provenance.", "entry_gate": "S04-011", "exit_gate": "S05-011" }, { "id": "S06", "title": "Аккаунты и lifecycle", "goal": "Обеспечить login/switch/logout с изолированными async operations и browser-safe credentials.", "entry_gate": "S05-011", "exit_gate": "S06-011" }, { "id": "S07", "title": "Навигация, контакты и списки", "goal": "Собрать адаптивный shell и реальные roster/presence/avatars.", "entry_gate": "S06-011", "exit_gate": "S07-013" }, { "id": "S08", "title": "Сообщения и read state", "goal": "Реализовать domain reducers и отправку через crypto port; default encryption remains fail-closed until crypto stage.", "entry_gate": "S07-013", "exit_gate": "S08-011" }, { "id": "S09", "title": "Лента и composer", "goal": "Соединить UI с message use cases без обхода crypto readiness.", "entry_gate": "S08-011", "exit_gate": "S09-012" }, { "id": "S10", "title": "Действия над сообщениями", "goal": "Реализовать небольшие command/reducer/UI сценарии replies, edit, retract, local delete и reactions.", "entry_gate": "S09-012", "exit_gate": "S10-015" }, { "id": "S11", "title": "Архив и восстановление", "goal": "Обеспечить page/cursor/source safety и durable commit; не replay всю историю на старте.", "entry_gate": "S10-015", "exit_gate": "S11-013" }, { "id": "S12", "title": "OMEMO и доверие", "goal": "Интегрировать проверенный browser crypto backend по малым adapters/fixtures; неподдержанный формат остаётся blocker.", "entry_gate": "S11-013", "exit_gate": "S12-022" }, { "id": "S13", "title": "MUC", "goal": "Добавить группы и полный encrypted recipient set без ослабления прав/анонимности.", "entry_gate": "S12-022", "exit_gate": "S13-013" }, { "id": "S14", "title": "Файлы и upload", "goal": "Реализовать безопасную загрузку и durable drafts по одному небольшому IO/use-case шагу.", "entry_gate": "S13-013", "exit_gate": "S14-013" }, { "id": "S15", "title": "Просмотр медиа", "goal": "Реализовать preview/cache/player/viewer/export и accessibility.", "entry_gate": "S14-013", "exit_gate": "S15-011" }, { "id": "S16", "title": "Recording и геопозиция", "goal": "Реализовать явные permission/capture flows и ручной выбор точки.", "entry_gate": "S15-011", "exit_gate": "S16-011" }, { "id": "S17", "title": "Личные звонки", "goal": "Реализовать signaling/ICE/media/call history по малым состояниям с отдельными проверками.", "entry_gate": "S16-011", "exit_gate": "S17-014" }, { "id": "S18", "title": "Web Push и gateway", "goal": "Реализовать bounded minimal backend и browser service worker с честными closed-tab ограничениями.", "entry_gate": "S17-014", "exit_gate": "S18-015" }, { "id": "S19", "title": "Lock и security hardening", "goal": "Зафиксировать реальные границы local protection и проверить недоверенные входы/секреты.", "entry_gate": "S18-015", "exit_gate": "S19-011" }, { "id": "S20", "title": "Настройки и диагностика", "goal": "Завершить пользовательские preferences, capabilities и справку без ложных гарантий.", "entry_gate": "S19-011", "exit_gate": "S20-009" }, { "id": "S21", "title": "Полная Web-приёмка и поставка", "goal": "Проверить реальные требования по тематическим suites, hosting и release guide. Ни scaffold, ни mock не дают product done.", "entry_gate": "S20-009", "exit_gate": "S21-013" } ], "tasks": [ { "id": "S00-001", "stage": "S00", "role": "orchestrator", "reviewer_role": "security", "title": "Утвердить Web-профиль", "outcome": "Паспорт scope разделяет Web и native-only требования и перечисляет внешние providers без secrets.", "depends_on": [], "requirements": [ "GEN-005", "GEN-006", "WEB-002" ], "scope": [ "docs/decisions/0000-scope.md", "experiments/0000-scope/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Паспорт scope разделяет Web и native-only требования и перечисляет внешние providers без secrets.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Паспорт scope разделяет Web и native-only требования и перечисляет внешние providers без secrets.", "Каждый excluded ID имеет причину", "Web Push не называется живым closed-tab socket", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Каждый excluded ID имеет причину", "Web Push не называется живым closed-tab socket" ], "context_budget_chars": 48000 }, { "id": "S00-002", "stage": "S00", "role": "orchestrator", "reviewer_role": "security", "title": "Выбрать framework и build runtime", "outcome": "ADR сравнивает два допустимых стека, фиксирует конкретные проверенные versions, lockfile и один минимальный rendering spike.", "depends_on": [ "S00-001" ], "requirements": [ "NFR-007" ], "scope": [ "docs/decisions/0001-stack.md", "experiments/0001-stack/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "ADR сравнивает два допустимых стека, фиксирует конкретные проверенные versions, lockfile и один минимальный rendering spike.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "ADR сравнивает два допустимых стека, фиксирует конкретные проверенные versions, lockfile и один минимальный rendering spike.", "Clean install/build spike", "лицензии и runtime/browser ограничения записаны", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Clean install/build spike", "лицензии и runtime/browser ограничения записаны" ], "context_budget_chars": 48000 }, { "id": "S00-003", "stage": "S00", "role": "protocol", "reviewer_role": "qa", "title": "Проверить XMPP WSS/auth библиотеку", "outcome": "Spike подтверждает WSS stream, SCRAM, parser limits и нужные module extension points выбранной библиотеки.", "depends_on": [ "S00-001", "S00-002" ], "requirements": [ "ACC-004", "NET-003", "NET-004" ], "scope": [ "docs/decisions/0002-xmpp-library.md", "experiments/0002-xmpp-library/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Spike подтверждает WSS stream, SCRAM, parser limits и нужные module extension points выбранной библиотеки.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Spike подтверждает WSS stream, SCRAM, parser limits и нужные module extension points выбранной библиотеки.", "Тестовый WSS handshake", "unavailable channel binding не имитируется", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Тестовый WSS handshake", "unavailable channel binding не имитируется" ], "context_budget_chars": 48000 }, { "id": "S00-004", "stage": "S00", "role": "crypto", "reviewer_role": "security", "title": "Проверить browser OMEMO backend", "outcome": "Spike и ADR устанавливают реальную возможность legacy/OMEMO2, worker/wasm и persistence без самодельного ratchet.", "depends_on": [ "S00-001", "S00-002" ], "requirements": [ "ENC-003", "ENC-009", "ENC-011" ], "scope": [ "docs/decisions/0003-crypto-library.md", "experiments/0003-crypto-library/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Spike и ADR устанавливают реальную возможность legacy/OMEMO2, worker/wasm и persistence без самодельного ratchet.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Spike и ADR устанавливают реальную возможность legacy/OMEMO2, worker/wasm и persistence без самодельного ratchet.", "Известный vector/library smoke", "неподдержанный формат записан blocker, а не success", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Известный vector/library smoke", "неподдержанный формат записан blocker, а не success" ], "context_budget_chars": 48000 }, { "id": "S00-005", "stage": "S00", "role": "storage", "reviewer_role": "qa", "title": "Выбрать IndexedDB wrapper и migration policy", "outcome": "ADR определяет transactions/quota/schema upgrade и key ownership для browser storage.", "depends_on": [ "S00-002" ], "requirements": [ "STORE-001", "STORE-004" ], "scope": [ "docs/decisions/0004-storage-design.md", "experiments/0004-storage-design/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "ADR определяет transactions/quota/schema upgrade и key ownership для browser storage.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "ADR определяет transactions/quota/schema upgrade и key ownership для browser storage.", "Rollback experiment", "quota/blocked upgrade сценарий", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Rollback experiment", "quota/blocked upgrade сценарий" ], "context_budget_chars": 48000 }, { "id": "S00-006", "stage": "S00", "role": "orchestrator", "reviewer_role": "security", "title": "Зафиксировать browser/reference matrix", "outcome": "Паспорт содержит concrete browsers/devices и измеряемые startup/render/cache budgets с методикой проверки.", "depends_on": [ "S00-002" ], "requirements": [ "NFR-003", "NFR-005" ], "scope": [ "docs/decisions/0005-browser-matrix.md", "experiments/0005-browser-matrix/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Паспорт содержит concrete browsers/devices и измеряемые startup/render/cache budgets с методикой проверки.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Паспорт содержит concrete browsers/devices и измеряемые startup/render/cache budgets с методикой проверки.", "Каждый target воспроизводим", "неподдержанный feature имеет fallback", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Каждый target воспроизводим", "неподдержанный feature имеет fallback" ], "context_budget_chars": 48000 }, { "id": "S00-007", "stage": "S00", "role": "security", "reviewer_role": "orchestrator", "title": "Утвердить password и crypto unlock модель", "outcome": "ADR отделяет session password в памяти от persisted crypto key wrapping и app lock verifier.", "depends_on": [ "S00-004", "S00-005" ], "requirements": [ "STORE-003", "LOCK-004", "SEC-001" ], "scope": [ "docs/decisions/0006-secret-model.md", "experiments/0006-secret-model/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "ADR отделяет session password в памяти от persisted crypto key wrapping и app lock verifier.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "ADR отделяет session password в памяти от persisted crypto key wrapping и app lock verifier.", "Reload требует login при отсутствии persistent solution", "plaintext localStorage запрещён", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Reload требует login при отсутствии persistent solution", "plaintext localStorage запрещён" ], "context_budget_chars": 48000 }, { "id": "S00-008", "stage": "S00", "role": "ci-cd", "reviewer_role": "qa", "title": "Описать WSS/upload/TURN/push topology", "outcome": "ADR перечисляет endpoints, origin/CORS, trust boundaries и local-test substitutes без deployments.", "depends_on": [ "S00-003", "S00-004" ], "requirements": [ "FILE-012", "SEC-002" ], "scope": [ "docs/decisions/0007-provider-topology.md", "experiments/0007-provider-topology/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/ci-cd.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "ADR перечисляет endpoints, origin/CORS, trust boundaries и local-test substitutes без deployments.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "ADR перечисляет endpoints, origin/CORS, trust boundaries и local-test substitutes без deployments.", "Web upload feasibility", "gateway не decrypts/proxy secrets", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Web upload feasibility", "gateway не decrypts/proxy secrets" ], "context_budget_chars": 48000 }, { "id": "S00-009", "stage": "S00", "role": "orchestrator", "reviewer_role": "security", "title": "Согласовать результаты spikes", "outcome": "Принятое решение фиксирует совместимые stack/adapters и blockers до следующих этапов.", "depends_on": [ "S00-003", "S00-004", "S00-005", "S00-006", "S00-007", "S00-008" ], "requirements": [ "GEN-007" ], "scope": [ "docs/decisions/0008-readiness.md", "experiments/0008-readiness/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md" ], "spec_sections": [ 3, 27 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Принятое решение фиксирует совместимые stack/adapters и blockers до следующих этапов.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Принятое решение фиксирует совместимые stack/adapters и blockers до следующих этапов.", "Crypto/WSS APIs подтверждены экспериментом", "несовместимость останавливает gate", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Crypto/WSS APIs подтверждены экспериментом", "несовместимость останавливает gate" ], "context_budget_chars": 48000 }, { "id": "S00-010", "stage": "S00", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Профиль и проверка стека", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S00-001", "S00-002", "S00-003", "S00-004", "S00-005", "S00-006", "S00-007", "S00-008", "S00-009" ], "requirements": [ "GEN-001", "GEN-002", "GEN-003", "GEN-004" ], "scope": [ "state/evidence/S00-gate.md", "docs/acceptance/S00-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S00.md", "docs/decisions/README.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S01-001", "stage": "S01", "role": "orchestrator", "reviewer_role": "security", "title": "Описать identity/model contracts", "outcome": "Contract задаёт account/conversation/message/device shapes, normalization и устойчивые keys.", "depends_on": [ "S00-010" ], "requirements": [ "GEN-001" ], "scope": [ "docs/contracts/models.md", "tests/contracts/models.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [ 5 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contract задаёт account/conversation/message/device shapes, normalization и устойчивые keys.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contract задаёт account/conversation/message/device shapes, normalization и устойчивые keys.", "Одинаковый JID разных accounts не совпадает", "occupant resource сохраняется", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Одинаковый JID разных accounts не совпадает", "occupant resource сохраняется" ], "context_budget_chars": 48000 }, { "id": "S01-002", "stage": "S01", "role": "orchestrator", "reviewer_role": "security", "title": "Описать async account context", "outcome": "Contract определяет generation/cancellation и stale-result discard для любой операции.", "depends_on": [ "S00-010", "S01-001" ], "requirements": [ "ACC-008", "ACC-014" ], "scope": [ "docs/contracts/lifecycle.md", "tests/contracts/lifecycle.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [ 5 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contract определяет generation/cancellation и stale-result discard для любой операции.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contract определяет generation/cancellation и stale-result discard для любой операции.", "Late old-account completion rejected", "explicit cancel propagates", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Late old-account completion rejected", "explicit cancel propagates" ], "context_budget_chars": 48000 }, { "id": "S01-003", "stage": "S01", "role": "storage", "reviewer_role": "qa", "title": "Описать transaction contract", "outcome": "Contract объединяет archive mutations/checkpoint и определяет quota/migration errors.", "depends_on": [ "S00-010", "S01-001", "S01-002" ], "requirements": [ "HIST-007", "STORE-007" ], "scope": [ "docs/contracts/persistence.md", "tests/contracts/persistence.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [ 5 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contract объединяет archive mutations/checkpoint и определяет quota/migration errors.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contract объединяет archive mutations/checkpoint и определяет quota/migration errors.", "No partial checkpoint", "missing storage exposes degraded state", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No partial checkpoint", "missing storage exposes degraded state" ], "context_budget_chars": 48000 }, { "id": "S01-004", "stage": "S01", "role": "protocol", "reviewer_role": "qa", "title": "Описать XMPP event/command port", "outcome": "Contract содержит events, namespaces, provenance, IDs и typed errors без DOM/backend leakage.", "depends_on": [ "S00-010", "S01-001", "S01-002" ], "requirements": [ "GEN-002", "SEC-005" ], "scope": [ "docs/contracts/xmpp.md", "tests/contracts/xmpp.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [ 5 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contract содержит events, namespaces, provenance, IDs и typed errors без DOM/backend leakage.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contract содержит events, namespaces, provenance, IDs и typed errors без DOM/backend leakage.", "Valid event fixture", "malformed/source mismatch fixture", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Valid event fixture", "malformed/source mismatch fixture" ], "context_budget_chars": 48000 }, { "id": "S01-005", "stage": "S01", "role": "crypto", "reviewer_role": "security", "title": "Описать crypto port", "outcome": "Contract задаёт ready/trust/encrypt/decrypt/file operations, secret ownership и fail-closed errors.", "depends_on": [ "S00-010", "S01-001", "S01-002" ], "requirements": [ "ENC-002", "ENC-006" ], "scope": [ "docs/contracts/crypto.md", "tests/contracts/crypto.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [ 5 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contract задаёт ready/trust/encrypt/decrypt/file operations, secret ownership и fail-closed errors.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contract задаёт ready/trust/encrypt/decrypt/file operations, secret ownership и fail-closed errors.", "Encryption error has no plaintext result", "no UI access to private session", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Encryption error has no plaintext result", "no UI access to private session" ], "context_budget_chars": 48000 }, { "id": "S01-006", "stage": "S01", "role": "media", "reviewer_role": "qa", "title": "Описать staged asset contract", "outcome": "Contract задаёт draft IDs, MIME/size/duration, object URL lifetime, cancellation и retries.", "depends_on": [ "S00-010", "S01-001", "S01-002", "S01-005" ], "requirements": [ "FILE-003", "FILE-010" ], "scope": [ "docs/contracts/media.md", "tests/contracts/media.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [ 5 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contract задаёт draft IDs, MIME/size/duration, object URL lifetime, cancellation и retries.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contract задаёт draft IDs, MIME/size/duration, object URL lifetime, cancellation и retries.", "Expired source is recoverable", "account/recipient immutable during upload", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Expired source is recoverable", "account/recipient immutable during upload" ], "context_budget_chars": 48000 }, { "id": "S01-007", "stage": "S01", "role": "realtime", "reviewer_role": "qa", "title": "Описать call engine contract", "outcome": "Contract определяет endpoint, phases/tracks/commands, terminal outcome и event IDs.", "depends_on": [ "S00-010", "S01-001", "S01-002", "S01-004" ], "requirements": [ "CALL-001", "CALL-011" ], "scope": [ "docs/contracts/calls.md", "tests/contracts/calls.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [ 5 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contract определяет endpoint, phases/tracks/commands, terminal outcome и event IDs.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contract определяет endpoint, phases/tracks/commands, terminal outcome и event IDs.", "One terminal event", "busy/permissions/remote errors separate", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "One terminal event", "busy/permissions/remote errors separate" ], "context_budget_chars": 48000 }, { "id": "S01-008", "stage": "S01", "role": "backend", "reviewer_role": "security", "title": "Описать push API и binding", "outcome": "Contract задаёт authenticated ownership, subscription lifecycle, minimal event payload и provider errors.", "depends_on": [ "S00-010", "S01-001", "S01-002", "S01-004" ], "requirements": [ "PUSH-003", "PUSH-004", "PUSH-005", "SEC-008" ], "scope": [ "docs/contracts/push.md", "tests/contracts/push.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/backend.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [ 5 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contract задаёт authenticated ownership, subscription lifecycle, minimal event payload и provider errors.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contract задаёт authenticated ownership, subscription lifecycle, minimal event payload и provider errors.", "Forged account binding rejected", "stale token/revoke defined", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Forged account binding rejected", "stale token/revoke defined" ], "context_budget_chars": 48000 }, { "id": "S01-009", "stage": "S01", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Предметные контракты", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S01-001", "S01-002", "S01-003", "S01-004", "S01-005", "S01-006", "S01-007", "S01-008" ], "requirements": [ "GEN-003", "GEN-004", "GEN-005", "GEN-006", "GEN-007" ], "scope": [ "state/evidence/S01-gate.md", "docs/acceptance/S01-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S01.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S02-001", "stage": "S02", "role": "ci-cd", "reviewer_role": "qa", "title": "Создать workspace по accepted ADR", "outcome": "Clean workspace устанавливается locked install, рендерит пустую Luma shell без сетевых side effects.", "depends_on": [ "S01-009" ], "requirements": [ "NFR-007" ], "scope": [ "package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "src/main.*", "index.html" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/ci-cd.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Clean workspace устанавливается locked install, рендерит пустую Luma shell без сетевых side effects.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Clean workspace устанавливается locked install, рендерит пустую Luma shell без сетевых side effects.", "Clean install succeeds", "lockfile drift rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Clean install succeeds", "lockfile drift rejected" ], "context_budget_chars": 48000 }, { "id": "S02-002", "stage": "S02", "role": "ci-cd", "reviewer_role": "qa", "title": "Настроить production build", "outcome": "Build config создаёт статические artifacts с корректным base path и no embedded secrets.", "depends_on": [ "S01-009", "S02-001" ], "requirements": [ "NFR-007" ], "scope": [ "vite*", "webpack*", "tsconfig*", "build*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/ci-cd.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Build config создаёт статические artifacts с корректным base path и no embedded secrets.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Build config создаёт статические artifacts с корректным base path и no embedded secrets.", "Build from clean tree", "invalid base/config fails", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Build from clean tree", "invalid base/config fails" ], "context_budget_chars": 48000 }, { "id": "S02-003", "stage": "S02", "role": "ci-cd", "reviewer_role": "qa", "title": "Настроить единый code quality check", "outcome": "Lint/format/type checks имеют documented commands и проверяют изменяемый client tree.", "depends_on": [ "S01-009", "S02-001" ], "requirements": [ "GEN-007" ], "scope": [ ".editorconfig", "eslint*", "prettier*", "biome*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/ci-cd.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Lint/format/type checks имеют documented commands и проверяют изменяемый client tree.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Lint/format/type checks имеют documented commands и проверяют изменяемый client tree.", "Deliberate type/lint failure detected", "generated state excluded from formatter drift", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Deliberate type/lint failure detected", "generated state excluded from formatter drift" ], "context_budget_chars": 48000 }, { "id": "S02-004", "stage": "S02", "role": "qa", "reviewer_role": "orchestrator", "title": "Настроить unit/contract runner", "outcome": "Runner исполняет focused tests с deterministic fixtures, без live account по умолчанию.", "depends_on": [ "S01-009", "S02-001" ], "requirements": [ "NFR-008" ], "scope": [ "tests/setup.*", "test.config.*", "vitest*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Runner исполняет focused tests с deterministic fixtures, без live account по умолчанию.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Runner исполняет focused tests с deterministic fixtures, без live account по умолчанию.", "Passing/failing fixture exit codes", "no network required", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Passing/failing fixture exit codes", "no network required" ], "context_budget_chars": 48000 }, { "id": "S02-005", "stage": "S02", "role": "qa", "reviewer_role": "orchestrator", "title": "Настроить browser smoke runner", "outcome": "Runner открывает local shell, проверяет semantic heading и сохраняет artifact при failure.", "depends_on": [ "S01-009", "S02-002", "S02-004" ], "requirements": [ "NFR-008" ], "scope": [ "playwright*", "tests/browser/smoke.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Runner открывает local shell, проверяет semantic heading и сохраняет artifact при failure.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Runner открывает local shell, проверяет semantic heading и сохраняет artifact при failure.", "Real browser smoke", "app missing fails rather than skipped", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Real browser smoke", "app missing fails rather than skipped" ], "context_budget_chars": 48000 }, { "id": "S02-006", "stage": "S02", "role": "ci-cd", "reviewer_role": "qa", "title": "Подключить app CI", "outcome": "Workflow выполняет locked install, type/unit/build/browser smoke отдельно от foundation checks.", "depends_on": [ "S01-009", "S02-002", "S02-003", "S02-004", "S02-005" ], "requirements": [ "NFR-008" ], "scope": [ ".github/workflows/app.yml" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/ci-cd.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Workflow выполняет locked install, type/unit/build/browser smoke отдельно от foundation checks.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Workflow выполняет locked install, type/unit/build/browser smoke отдельно от foundation checks.", "Clean CI command locally reproducible", "missing test/build fails pipeline", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Clean CI command locally reproducible", "missing test/build fails pipeline" ], "context_budget_chars": 48000 }, { "id": "S02-007", "stage": "S02", "role": "front", "reviewer_role": "qa", "title": "Создать route skeleton", "outcome": "Router поддерживает login/list/detail/settings и Back без mock live data.", "depends_on": [ "S01-009", "S02-001", "S02-004" ], "requirements": [ "NAV-006" ], "scope": [ "src/ui/routing.*", "tests/browser/routing.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Router поддерживает login/list/detail/settings и Back без mock live data.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Router поддерживает login/list/detail/settings и Back без mock live data.", "Unknown route safe fallback", "Back returns previous context", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Unknown route safe fallback", "Back returns previous context" ], "context_budget_chars": 48000 }, { "id": "S02-008", "stage": "S02", "role": "ci-cd", "reviewer_role": "qa", "title": "Валидировать public runtime config", "outcome": "Module допускает только public endpoint settings и явно отказывает insecure/missing production values.", "depends_on": [ "S01-009", "S02-001", "S02-004" ], "requirements": [ "NET-001", "SEC-003" ], "scope": [ "src/platform/config.*", ".env.example" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/ci-cd.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Module допускает только public endpoint settings и явно отказывает insecure/missing production values.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Module допускает только public endpoint settings и явно отказывает insecure/missing production values.", "WSS/HTTPS allowed", "password/private key config rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "WSS/HTTPS allowed", "password/private key config rejected" ], "context_budget_chars": 48000 }, { "id": "S02-009", "stage": "S02", "role": "protocol", "reviewer_role": "qa", "title": "Создать typed error vocabulary", "outcome": "Domain errors имеют code/retryability/user message без secret raw payload.", "depends_on": [ "S01-009", "S02-004" ], "requirements": [ "GEN-004", "SEC-003" ], "scope": [ "src/domain/errors.*", "tests/unit/errors.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Domain errors имеют code/retryability/user message без secret raw payload.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Domain errors имеют code/retryability/user message без secret raw payload.", "Known error localized", "raw password/stanza body not logged", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Known error localized", "raw password/stanza body not logged" ], "context_budget_chars": 48000 }, { "id": "S02-010", "stage": "S02", "role": "orchestrator", "reviewer_role": "security", "title": "Реализовать operation context primitive", "outcome": "Account generation/cancel primitive отбрасывает late completion независимо от framework.", "depends_on": [ "S01-009", "S02-004", "S02-009" ], "requirements": [ "ACC-008", "ACC-014" ], "scope": [ "src/application/context.*", "tests/unit/context.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Account generation/cancel primitive отбрасывает late completion независимо от framework.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Account generation/cancel primitive отбрасывает late completion независимо от framework.", "Switch invalidates token", "current completion accepted", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Switch invalidates token", "current completion accepted" ], "context_budget_chars": 48000 }, { "id": "S02-011", "stage": "S02", "role": "crypto", "reviewer_role": "security", "title": "Создать worker request bridge", "outcome": "Bridge коррелирует request IDs, cancellation и typed failure без передачи UI secret state.", "depends_on": [ "S01-009", "S02-004", "S02-009", "S02-010" ], "requirements": [ "GEN-003" ], "scope": [ "src/workers/bridge.*", "tests/workers/bridge.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 4, 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Bridge коррелирует request IDs, cancellation и typed failure без передачи UI secret state.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Bridge коррелирует request IDs, cancellation и typed failure без передачи UI secret state.", "Worker error/timeout completes once", "cancelled result ignored", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Worker error/timeout completes once", "cancelled result ignored" ], "context_budget_chars": 48000 }, { "id": "S02-012", "stage": "S02", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Workspace и инженерный каркас", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S02-001", "S02-002", "S02-003", "S02-004", "S02-005", "S02-006", "S02-007", "S02-008", "S02-009", "S02-010", "S02-011" ], "requirements": [ "GEN-001", "GEN-002", "GEN-005", "GEN-006", "NFR-001", "NFR-002", "NFR-003", "NFR-004", "NFR-005", "NFR-006", "NFR-009" ], "scope": [ "state/evidence/S02-gate.md", "docs/acceptance/S02-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S02.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S03-001", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Реализовать semantic palette", "outcome": "Theme tokens содержат light/dark colors и contrast-safe outgoing/action fills по UI Kit.", "depends_on": [ "S02-012" ], "requirements": [ "UI-002", "UI-004", "UI-A11Y-001" ], "scope": [ "src/ui/tokens-colors.*", "tests/front/tokens-colors.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Theme tokens содержат light/dark colors и contrast-safe outgoing/action fills по UI Kit.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Theme tokens содержат light/dark colors и contrast-safe outgoing/action fills по UI Kit.", "Light/dark fixture", "foreground/background contrast checks", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Light/dark fixture", "foreground/background contrast checks" ], "context_budget_chars": 48000 }, { "id": "S03-002", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Реализовать typography/spacing tokens", "outcome": "Типографика масштабируется, spacing/radius доступны через единый API.", "depends_on": [ "S02-012", "S03-001" ], "requirements": [ "UI-001", "UI-003" ], "scope": [ "src/ui/tokens-type.*", "tests/front/tokens-type.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Типографика масштабируется, spacing/radius доступны через единый API.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Типографика масштабируется, spacing/radius доступны через единый API.", "200% text fixture", "no duplicate local brand token", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "200% text fixture", "no duplicate local brand token" ], "context_budget_chars": 48000 }, { "id": "S03-003", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Реализовать theme preferences", "outcome": "System light/dark и reduced transparency переключают токены без потери state.", "depends_on": [ "S02-012", "S03-001", "S03-002" ], "requirements": [ "UI-A11Y-007" ], "scope": [ "src/ui/theme.*", "tests/front/theme.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "System light/dark и reduced transparency переключают токены без потери state.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "System light/dark и reduced transparency переключают токены без потери state.", "Theme changes live", "no-blur opaque fallback", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Theme changes live", "no-blur opaque fallback" ], "context_budget_chars": 48000 }, { "id": "S03-004", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать Button/IconButton", "outcome": "Button имеет disabled/loading/focus/name и нормативный hit region.", "depends_on": [ "S02-012", "S03-002" ], "requirements": [ "UI-005", "UI-006", "UI-A11Y-002", "UI-A11Y-005" ], "scope": [ "src/ui/button.*", "tests/front/button.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Button имеет disabled/loading/focus/name и нормативный hit region.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Button имеет disabled/loading/focus/name и нормативный hit region.", "Keyboard activates", "disabled never fires", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Keyboard activates", "disabled never fires" ], "context_budget_chars": 48000 }, { "id": "S03-005", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать Input/PasswordInput", "outcome": "Поля имеют label/error/show-password и безопасный focus/IME behavior.", "depends_on": [ "S02-012", "S03-002", "S03-004" ], "requirements": [ "UI-007", "UI-A11Y-006" ], "scope": [ "src/ui/input.*", "tests/front/input.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Поля имеют label/error/show-password и безопасный focus/IME behavior.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Поля имеют label/error/show-password и безопасный focus/IME behavior.", "Password toggle preserves value", "associated validation error", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Password toggle preserves value", "associated validation error" ], "context_budget_chars": 48000 }, { "id": "S03-006", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать Dialog/Popover", "outcome": "Modal traps focus, Back/Escape закрывают по context, focus возвращается.", "depends_on": [ "S02-012", "S03-004" ], "requirements": [ "UI-A11Y-003" ], "scope": [ "src/ui/dialog.*", "tests/front/dialog.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Modal traps focus, Back/Escape закрывают по context, focus возвращается.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Modal traps focus, Back/Escape закрывают по context, focus возвращается.", "Focus cycle", "close restores trigger", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Focus cycle", "close restores trigger" ], "context_budget_chars": 48000 }, { "id": "S03-007", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать Toast/InlineError", "outcome": "Success/error announcements доступны и критическая ошибка не исчезает только toast.", "depends_on": [ "S02-012", "S03-004" ], "requirements": [ "UI-005", "UI-A11Y-006" ], "scope": [ "src/ui/feedback.*", "tests/front/feedback.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Success/error announcements доступны и критическая ошибка не исчезает только toast.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Success/error announcements доступны и критическая ошибка не исчезает только toast.", "Screen-reader announcement bounded", "long critical error persists", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Screen-reader announcement bounded", "long critical error persists" ], "context_budget_chars": 48000 }, { "id": "S03-008", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать Empty/LoadingState", "outcome": "Компоненты различают пустые данные, no search result и operation loading.", "depends_on": [ "S02-012", "S03-002" ], "requirements": [ "UI-005" ], "scope": [ "src/ui/empty-loading.*", "tests/front/empty-loading.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Компоненты различают пустые данные, no search result и operation loading.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Компоненты различают пустые данные, no search result и operation loading.", "No-result text distinct", "loading never claims success", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No-result text distinct", "loading never claims success" ], "context_budget_chars": 48000 }, { "id": "S03-009", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать Avatar", "outcome": "Circle/fallback/status варианты используют stable identity color и readable initials.", "depends_on": [ "S02-012", "S03-001", "S03-002" ], "requirements": [ "UI-AVATAR", "CON-006" ], "scope": [ "src/ui/avatar.*", "tests/front/avatar.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Circle/fallback/status варианты используют stable identity color и readable initials.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Circle/fallback/status варианты используют stable identity color и readable initials.", "Broken image fallback", "same identity same color", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Broken image fallback", "same identity same color" ], "context_budget_chars": 48000 }, { "id": "S03-010", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать SearchField", "outcome": "Поле с clear/focus и label размещается над list fixture.", "depends_on": [ "S02-012", "S03-005" ], "requirements": [ "NAV-002" ], "scope": [ "src/ui/search.*", "tests/front/search.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Поле с clear/focus и label размещается над list fixture.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Поле с clear/focus и label размещается над list fixture.", "Keyboard clear", "long query doesn't overflow", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Keyboard clear", "long query doesn't overflow" ], "context_budget_chars": 48000 }, { "id": "S03-011", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать Badge/StatusChip", "outcome": "Unread cap99+ и trust/status variants имеют readable role labels.", "depends_on": [ "S02-012", "S03-001", "S03-002" ], "requirements": [ "UI-A11Y-002" ], "scope": [ "src/ui/badges.*", "tests/front/badges.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Unread cap99+ и trust/status variants имеют readable role labels.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Unread cap99+ и trust/status variants имеют readable role labels.", "99+ accessible full number", "status not color-only", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "99+ accessible full number", "status not color-only" ], "context_budget_chars": 48000 }, { "id": "S03-012", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Создать icon registry", "outcome": "Общий adapter выбранного vector set имеет semantic names и decorative/interactive rules.", "depends_on": [ "S02-012", "S03-004" ], "requirements": [ "UI-003", "UI-A11Y-002" ], "scope": [ "src/ui/icons.*", "tests/front/icons.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Общий adapter выбранного vector set имеет semantic names и decorative/interactive rules.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Общий adapter выбранного vector set имеет semantic names и decorative/interactive rules.", "Missing icon caught", "icon button accessible name", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Missing icon caught", "icon button accessible name" ], "context_budget_chars": 48000 }, { "id": "S03-013", "stage": "S03", "role": "front", "reviewer_role": "qa", "title": "Собрать primitive catalog", "outcome": "Каталог показывает light/dark/default/disabled/error/focus без XMPP.", "depends_on": [ "S02-012", "S03-003", "S03-004", "S03-005", "S03-006", "S03-007", "S03-008", "S03-009", "S03-010", "S03-011", "S03-012" ], "requirements": [ "UI-005" ], "scope": [ "src/ui/catalog.*", "tests/front/catalog.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [ 3, 4, 5, 6, 7 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Каталог показывает light/dark/default/disabled/error/focus без XMPP.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Каталог показывает light/dark/default/disabled/error/focus без XMPP.", "All primitive states rendered", "no production fixture switch", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "All primitive states rendered", "no production fixture switch" ], "context_budget_chars": 48000 }, { "id": "S03-014", "stage": "S03", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить primitives", "outcome": "Focused browser suite проверяет keyboard, hit regions и 200% reflow primitives.", "depends_on": [ "S02-012", "S03-013" ], "requirements": [ "UI-008", "UI-A11Y-003", "UI-A11Y-004" ], "scope": [ "tests/acceptance/primitive-accessibility.*", "tests/qa/primitive-accessibility.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 24 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Focused browser suite проверяет keyboard, hit regions и 200% reflow primitives.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Focused browser suite проверяет keyboard, hit regions и 200% reflow primitives.", "320-wide +200%", "visible focus and modal return", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "320-wide +200%", "visible focus and modal return" ], "context_budget_chars": 48000 }, { "id": "S03-015", "stage": "S03", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Токены и базовые компоненты", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "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" ], "requirements": [ "UI-A11Y-008", "UI-MESSAGE" ], "scope": [ "state/evidence/S03-gate.md", "docs/acceptance/S03-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S03.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S04-001", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Создать версионированную schema", "outcome": "DB stores разделяют accounts/conversations/messages/checkpoints/settings и уникальные identities.", "depends_on": [ "S03-015" ], "requirements": [ "STORE-001" ], "scope": [ "src/adapters/storage/db-schema.*", "tests/storage/db-schema.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "DB stores разделяют accounts/conversations/messages/checkpoints/settings и уникальные identities.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "DB stores разделяют accounts/conversations/messages/checkpoints/settings и уникальные identities.", "Same peer in two accounts", "schema version checked", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Same peer in two accounts", "schema version checked" ], "context_budget_chars": 48000 }, { "id": "S04-002", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Реализовать transaction wrapper", "outcome": "Transaction API commit/rollback возвращает проверяемый outcome и typed errors.", "depends_on": [ "S03-015", "S04-001" ], "requirements": [ "STORE-001", "HIST-007" ], "scope": [ "src/adapters/storage/transactions.*", "tests/storage/transactions.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Transaction API commit/rollback возвращает проверяемый outcome и typed errors.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Transaction API commit/rollback возвращает проверяемый outcome и typed errors.", "Injected write failure rolls back", "success reads committed data", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Injected write failure rolls back", "success reads committed data" ], "context_budget_chars": 48000 }, { "id": "S04-003", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Реализовать message repository", "outcome": "Upsert/query работает по account+conversation+identities и stable ordering.", "depends_on": [ "S03-015", "S04-002" ], "requirements": [ "MSG-004", "MSG-006" ], "scope": [ "src/adapters/storage/messages-repo.*", "tests/storage/messages-repo.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Upsert/query работает по account+conversation+identities и stable ordering.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Upsert/query работает по account+conversation+identities и stable ordering.", "Replay one row", "equal timestamp ID tie-break", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Replay one row", "equal timestamp ID tie-break" ], "context_budget_chars": 48000 }, { "id": "S04-004", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Реализовать conversation repository", "outcome": "CRUD и sorted query сохраняют поля direct/group без implicit online.", "depends_on": [ "S03-015", "S04-002" ], "requirements": [ "NAV-003", "CON-003" ], "scope": [ "src/adapters/storage/conversations-repo.*", "tests/storage/conversations-repo.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "CRUD и sorted query сохраняют поля direct/group без implicit online.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "CRUD и sorted query сохраняют поля direct/group без implicit online.", "Restart reads offline state", "delete account isolated", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Restart reads offline state", "delete account isolated" ], "context_budget_chars": 48000 }, { "id": "S04-005", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Реализовать checkpoint/suppression storage", "outcome": "Metadata связывает account/MUC archive cursors и local deletion aliases.", "depends_on": [ "S03-015", "S04-002" ], "requirements": [ "HIST-003", "DEL-001" ], "scope": [ "src/adapters/storage/metadata-repo.*", "tests/storage/metadata-repo.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Metadata связывает account/MUC archive cursors и local deletion aliases.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Metadata связывает account/MUC archive cursors и local deletion aliases.", "Room cursors independent", "suppression persists reload", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Room cursors independent", "suppression persists reload" ], "context_budget_chars": 48000 }, { "id": "S04-006", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Реализовать draft persistence", "outcome": "Draft хранится только для account+conversation, без password/key fragments в config.", "depends_on": [ "S03-015", "S04-002" ], "requirements": [ "STORE-006" ], "scope": [ "src/adapters/storage/drafts.*", "tests/storage/drafts.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Draft хранится только для account+conversation, без password/key fragments в config.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Draft хранится только для account+conversation, без password/key fragments в config.", "Switch chat restores correct text", "delete account clears drafts", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Switch chat restores correct text", "delete account clears drafts" ], "context_budget_chars": 48000 }, { "id": "S04-007", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Обработать quota/degraded mode", "outcome": "Storage errors показывают несохранённое состояние и не продвигают durable checkpoint.", "depends_on": [ "S03-015", "S04-002", "S04-003" ], "requirements": [ "STORE-004", "STORE-007" ], "scope": [ "src/adapters/storage/quota.*", "tests/storage/quota.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Storage errors показывают несохранённое состояние и не продвигают durable checkpoint.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Storage errors показывают несохранённое состояние и не продвигают durable checkpoint.", "Quota injection", "no false saved toast", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Quota injection", "no false saved toast" ], "context_budget_chars": 48000 }, { "id": "S04-008", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Реализовать первую migration pipeline", "outcome": "Migrations transactional и сохраняют старую копию/возможность rollback до success.", "depends_on": [ "S03-015", "S04-001", "S04-002" ], "requirements": [ "STORE-007", "HIST-012" ], "scope": [ "src/adapters/storage/migration.*", "tests/storage/migration.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Migrations transactional и сохраняют старую копию/возможность rollback до success.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Migrations transactional и сохраняют старую копию/возможность rollback до success.", "Interrupted upgrade", "legacy fixture preserved on error", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Interrupted upgrade", "legacy fixture preserved on error" ], "context_budget_chars": 48000 }, { "id": "S04-009", "stage": "S04", "role": "storage", "reviewer_role": "qa", "title": "Реализовать media cache policy", "outcome": "Cache size/TTL eviction отделяет drafts от disposable previews.", "depends_on": [ "S03-015", "S04-002" ], "requirements": [ "STORE-005", "MEDIA-005" ], "scope": [ "src/adapters/storage/cache-eviction.*", "tests/storage/cache-eviction.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Cache size/TTL eviction отделяет drafts от disposable previews.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Cache size/TTL eviction отделяет drafts от disposable previews.", "Limit evicts cache", "pending draft not silently removed", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Limit evicts cache", "pending draft not silently removed" ], "context_budget_chars": 48000 }, { "id": "S04-010", "stage": "S04", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить reload/recovery suite", "outcome": "Browser integration подтверждает durable rows/transaction/suppression после reload и failed migration.", "depends_on": [ "S03-015", "S04-003", "S04-004", "S04-005", "S04-006", "S04-007", "S04-008", "S04-009" ], "requirements": [ "HIST-001", "STORE-004" ], "scope": [ "tests/acceptance/storage-recovery.*", "tests/qa/storage-recovery.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 5, 18, 21 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Browser integration подтверждает durable rows/transaction/suppression после reload и failed migration.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Browser integration подтверждает durable rows/transaction/suppression после reload и failed migration.", "Reload persistence", "denied/quota clear explanation", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Reload persistence", "denied/quota clear explanation" ], "context_budget_chars": 48000 }, { "id": "S04-011", "stage": "S04", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Локальное хранилище", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S04-001", "S04-002", "S04-003", "S04-004", "S04-005", "S04-006", "S04-007", "S04-008", "S04-009", "S04-010" ], "requirements": [ "STORE-003" ], "scope": [ "state/evidence/S04-gate.md", "docs/acceptance/S04-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S04.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S05-001", "stage": "S05", "role": "protocol", "reviewer_role": "qa", "title": "Валидировать WSS endpoint", "outcome": "Endpoint policy rejects insecure/credential-bearing URLs и требует явного endpoint выбора.", "depends_on": [ "S04-011" ], "requirements": [ "ACC-004", "ACC-005", "NET-001" ], "scope": [ "src/adapters/xmpp/wss-policy.*", "tests/protocol/wss-policy.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Endpoint policy rejects insecure/credential-bearing URLs и требует явного endpoint выбора.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Endpoint policy rejects insecure/credential-bearing URLs и требует явного endpoint выбора.", "wss accepted", "ws/http/userinfo rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "wss accepted", "ws/http/userinfo rejected" ], "context_budget_chars": 48000 }, { "id": "S05-002", "stage": "S05", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать WSS adapter", "outcome": "Adapter соединяется через accepted XMPP library и публикует typed connect/close events.", "depends_on": [ "S04-011", "S05-001" ], "requirements": [ "NET-001", "NET-006" ], "scope": [ "src/adapters/xmpp/transport.*", "tests/protocol/transport.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Adapter соединяется через accepted XMPP library и публикует typed connect/close events.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Adapter соединяется через accepted XMPP library и публикует typed connect/close events.", "Local WSS fixture connects", "TLS/endpoint failure exposed", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Local WSS fixture connects", "TLS/endpoint failure exposed" ], "context_budget_chars": 48000 }, { "id": "S05-003", "stage": "S05", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать auth preference", "outcome": "Selection выбирает advertised compatible SCRAM без fake binding.", "depends_on": [ "S04-011", "S05-002" ], "requirements": [ "NET-003", "NET-004" ], "scope": [ "src/adapters/xmpp/auth-selection.*", "tests/protocol/auth-selection.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Selection выбирает advertised compatible SCRAM без fake binding.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Selection выбирает advertised compatible SCRAM без fake binding.", "Strongest compatible selected", "PLUS skipped without real binding", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Strongest compatible selected", "PLUS skipped without real binding" ], "context_budget_chars": 48000 }, { "id": "S05-004", "stage": "S05", "role": "protocol", "reviewer_role": "qa", "title": "Проверить SCRAM challenge limits", "outcome": "Adapter checks nonce/proof/limits через проверенную library без secret logging.", "depends_on": [ "S04-011", "S05-003" ], "requirements": [ "NET-005", "SEC-005" ], "scope": [ "src/adapters/xmpp/auth-validation.*", "tests/protocol/auth-validation.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Adapter checks nonce/proof/limits через проверенную library без secret logging.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Adapter checks nonce/proof/limits через проверенную library без secret logging.", "Invalid proof rejected", "oversized/expensive challenge bounded", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Invalid proof rejected", "oversized/expensive challenge bounded" ], "context_budget_chars": 48000 }, { "id": "S05-005", "stage": "S05", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать stanza parser boundary", "outcome": "Parser validates namespace/source/size/depth и emits bounded domain events.", "depends_on": [ "S04-011", "S05-002" ], "requirements": [ "SEC-004", "SEC-005" ], "scope": [ "src/adapters/xmpp/stanza-boundary.*", "tests/protocol/stanza-boundary.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Parser validates namespace/source/size/depth и emits bounded domain events.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Parser validates namespace/source/size/depth и emits bounded domain events.", "Malformed/oversize XML rejected", "no executable HTML result", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Malformed/oversize XML rejected", "no executable HTML result" ], "context_budget_chars": 48000 }, { "id": "S05-006", "stage": "S05", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать capability discovery", "outcome": "Server/account/component capabilities различают advertised и actually configured.", "depends_on": [ "S04-011", "S05-002", "S05-005" ], "requirements": [ "GEN-005" ], "scope": [ "src/adapters/xmpp/discovery.*", "tests/protocol/discovery.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Server/account/component capabilities различают advertised и actually configured.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Server/account/component capabilities различают advertised и actually configured.", "Missing upload feature", "push advertised not registered", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Missing upload feature", "push advertised not registered" ], "context_budget_chars": 48000 }, { "id": "S05-007", "stage": "S05", "role": "protocol", "reviewer_role": "qa", "title": "Интегрировать SM/Carbons/CSI/Ping", "outcome": "Модули enable/disable по availability и map ack/carbon events без visible service bubbles.", "depends_on": [ "S04-011", "S05-002", "S05-005", "S05-006" ], "requirements": [ "NET-007", "MSG-007" ], "scope": [ "src/adapters/xmpp/stream-features.*", "tests/protocol/stream-features.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Модули enable/disable по availability и map ack/carbon events без visible service bubbles.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Модули enable/disable по availability и map ack/carbon events без visible service bubbles.", "Supported feature activates", "absent feature degrades independently", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Supported feature activates", "absent feature degrades independently" ], "context_budget_chars": 48000 }, { "id": "S05-008", "stage": "S05", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать bounded reconnect", "outcome": "Backoff+jitter и single client generation прекращаются logout/cancel.", "depends_on": [ "S04-011", "S05-002", "S05-007" ], "requirements": [ "NET-008", "NET-009" ], "scope": [ "src/adapters/xmpp/reconnect.*", "tests/protocol/reconnect.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Backoff+jitter и single client generation прекращаются logout/cancel.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Backoff+jitter и single client generation прекращаются logout/cancel.", "Repeated failures capped", "cancelled generation never reconnects", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Repeated failures capped", "cancelled generation never reconnects" ], "context_budget_chars": 48000 }, { "id": "S05-009", "stage": "S05", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить auth/secret boundary", "outcome": "Security checks confirm TLS errors surfaced, binding not fabricated and secret traces absent.", "depends_on": [ "S04-011", "S05-003", "S05-004", "S05-005", "S05-008" ], "requirements": [ "NET-001", "NET-004", "SEC-003" ], "scope": [ "tests/security/transport-auth-review.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Security checks confirm TLS errors surfaced, binding not fabricated and secret traces absent.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Security checks confirm TLS errors surfaced, binding not fabricated and secret traces absent.", "Rejected certificate", "no password/proof in logs", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Rejected certificate", "no password/proof in logs" ], "context_budget_chars": 48000 }, { "id": "S05-010", "stage": "S05", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить WSS/reconnect интеграцию", "outcome": "Fixture suite checks login/discovery/stream interruption без production user account.", "depends_on": [ "S04-011", "S05-006", "S05-007", "S05-008", "S05-009" ], "requirements": [ "NET-006", "NET-009" ], "scope": [ "tests/acceptance/protocol-smoke.*", "tests/qa/protocol-smoke.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 7 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Fixture suite checks login/discovery/stream interruption без production user account.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Fixture suite checks login/discovery/stream interruption без production user account.", "Reconnect no duplicate stream", "invalid credentials actionable error", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Reconnect no duplicate stream", "invalid credentials actionable error" ], "context_budget_chars": 48000 }, { "id": "S05-011", "stage": "S05", "role": "qa", "reviewer_role": "security", "title": "Gate: WSS и аутентификация", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S05-001", "S05-002", "S05-003", "S05-004", "S05-005", "S05-006", "S05-007", "S05-008", "S05-009", "S05-010" ], "requirements": [], "scope": [ "state/evidence/S05-gate.md", "docs/acceptance/S05-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S05.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S06-001", "stage": "S06", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать JID/resource policy", "outcome": "Library address preparation и unique installation resource имеют deterministic tests.", "depends_on": [ "S05-011" ], "requirements": [ "ACC-002", "ACC-010" ], "scope": [ "src/adapters/xmpp/jid-resource.*", "tests/protocol/jid-resource.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Library address preparation и unique installation resource имеют deterministic tests.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Library address preparation и unique installation resource имеют deterministic tests.", "Whitespace/password rules", "distinct installs resources", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Whitespace/password rules", "distinct installs resources" ], "context_budget_chars": 48000 }, { "id": "S06-002", "stage": "S06", "role": "storage", "reviewer_role": "qa", "title": "Реализовать saved account configs", "outcome": "Accounts persistence содержит public config и active ID без password.", "depends_on": [ "S05-011", "S06-001" ], "requirements": [ "ACC-007", "STORE-003" ], "scope": [ "src/adapters/storage/accounts.*", "tests/storage/accounts.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Accounts persistence содержит public config и active ID без password.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Accounts persistence содержит public config и active ID без password.", "Reload restores config", "no credential in serialized row", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Reload restores config", "no credential in serialized row" ], "context_budget_chars": 48000 }, { "id": "S06-003", "stage": "S06", "role": "front", "reviewer_role": "qa", "title": "Создать Web LoginForm", "outcome": "Форма JID/password/WSS endpoint validates input и показывает progress/error.", "depends_on": [ "S05-011", "S06-001" ], "requirements": [ "ACC-001", "ACC-004", "ACC-006" ], "scope": [ "src/ui/login-form.*", "tests/front/login-form.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [ 17, 21 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Форма JID/password/WSS endpoint validates input и показывает progress/error.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Форма JID/password/WSS endpoint validates input и показывает progress/error.", "Empty fields rejected", "no native TCP port selector", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Empty fields rejected", "no native TCP port selector" ], "context_budget_chars": 48000 }, { "id": "S06-004", "stage": "S06", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать sign-in use case", "outcome": "Config validates before connect, successful active context installed, failure retains correction path.", "depends_on": [ "S05-011", "S06-001", "S06-002" ], "requirements": [ "ACC-006", "NET-006" ], "scope": [ "src/adapters/xmpp/login-usecase.*", "tests/protocol/login-usecase.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Config validates before connect, successful active context installed, failure retains correction path.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Config validates before connect, successful active context installed, failure retains correction path.", "Failed auth doesn't claim connected", "concurrent double submit denied", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Failed auth doesn't claim connected", "concurrent double submit denied" ], "context_budget_chars": 48000 }, { "id": "S06-005", "stage": "S06", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать in-memory credentials", "outcome": "Password buffer lifetime ограничен active auth flow; reload falls back to explicit login.", "depends_on": [ "S05-011", "S06-004" ], "requirements": [ "STORE-003", "ACC-009" ], "scope": [ "src/adapters/xmpp/session-password.*", "tests/protocol/session-password.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Password buffer lifetime ограничен active auth flow; reload falls back to explicit login.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Password buffer lifetime ограничен active auth flow; reload falls back to explicit login.", "No localStorage password", "logout clears references", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No localStorage password", "logout clears references" ], "context_budget_chars": 48000 }, { "id": "S06-006", "stage": "S06", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать switch cancellation", "outcome": "Switch invalidates old operations/connection before loading target account context.", "depends_on": [ "S05-011", "S06-002", "S06-004", "S06-005" ], "requirements": [ "ACC-008", "ACC-014" ], "scope": [ "src/adapters/xmpp/switch-account.*", "tests/protocol/switch-account.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Switch invalidates old operations/connection before loading target account context.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Switch invalidates old operations/connection before loading target account context.", "Old upload/late event ignored", "target history correct", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Old upload/late event ignored", "target history correct" ], "context_budget_chars": 48000 }, { "id": "S06-007", "stage": "S06", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать logout orchestration", "outcome": "Logout stops reconnect/push hooks, clears session credentials and preserves optional history.", "depends_on": [ "S05-011", "S06-005", "S06-006" ], "requirements": [ "ACC-011", "ACC-013" ], "scope": [ "src/adapters/xmpp/logout.*", "tests/protocol/logout.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Logout stops reconnect/push hooks, clears session credentials and preserves optional history.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Logout stops reconnect/push hooks, clears session credentials and preserves optional history.", "No reconnect after logout", "other saved account intact", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No reconnect after logout", "other saved account intact" ], "context_budget_chars": 48000 }, { "id": "S06-008", "stage": "S06", "role": "storage", "reviewer_role": "qa", "title": "Реализовать explicit local erase", "outcome": "Erase removes account history/cache/drafts; crypto identity deletion отдельный explicit option.", "depends_on": [ "S05-011", "S06-002", "S06-007" ], "requirements": [ "ACC-012", "ACC-013" ], "scope": [ "src/adapters/storage/erase-account.*", "tests/storage/erase-account.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Erase removes account history/cache/drafts; crypto identity deletion отдельный explicit option.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Erase removes account history/cache/drafts; crypto identity deletion отдельный explicit option.", "Other account untouched", "ordinary logout keeps identity", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Other account untouched", "ordinary logout keeps identity" ], "context_budget_chars": 48000 }, { "id": "S06-009", "stage": "S06", "role": "front", "reviewer_role": "qa", "title": "Создать account switch/logout UI", "outcome": "Settings controls показывают active identity и область logout/erase confirmation.", "depends_on": [ "S05-011", "S06-003", "S06-006", "S06-007", "S06-008" ], "requirements": [ "ACC-007", "ACC-011", "ACC-012" ], "scope": [ "src/ui/account-selector.*", "tests/front/account-selector.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [ 17, 21 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Settings controls показывают active identity и область logout/erase confirmation.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Settings controls показывают active identity и область logout/erase confirmation.", "Cancel does nothing", "pending switch cannot send wrong account", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Cancel does nothing", "pending switch cannot send wrong account" ], "context_budget_chars": 48000 }, { "id": "S06-010", "stage": "S06", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить lifecycle races", "outcome": "Suite reconnect/switch/reload/erase доказывает отсутствие late writes в чужой context.", "depends_on": [ "S05-011", "S06-004", "S06-005", "S06-006", "S06-007", "S06-008", "S06-009" ], "requirements": [ "ACC-008", "ACC-009", "ACC-014" ], "scope": [ "tests/acceptance/account-races.*", "tests/qa/account-races.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 6 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Suite reconnect/switch/reload/erase доказывает отсутствие late writes в чужой context.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Suite reconnect/switch/reload/erase доказывает отсутствие late writes в чужой context.", "Old promise after switch rejected", "reload missing secret asks login", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Old promise after switch rejected", "reload missing secret asks login" ], "context_budget_chars": 48000 }, { "id": "S06-011", "stage": "S06", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Аккаунты и lifecycle", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S06-001", "S06-002", "S06-003", "S06-004", "S06-005", "S06-006", "S06-007", "S06-008", "S06-009", "S06-010" ], "requirements": [ "ACC-005" ], "scope": [ "state/evidence/S06-gate.md", "docs/acceptance/S06-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S06.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S07-001", "stage": "S07", "role": "front", "reviewer_role": "qa", "title": "Создать adaptive shell", "outcome": "Compact one-panel и wide sidebar/detail переключаются по width и useful detail space.", "depends_on": [ "S06-011" ], "requirements": [ "NAV-001", "NFR-001" ], "scope": [ "src/ui/responsive-shell.*", "tests/front/responsive-shell.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [ 8, 10, 11, 12 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Compact one-panel и wide sidebar/detail переключаются по width и useful detail space.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Compact one-panel и wide sidebar/detail переключаются по width и useful detail space.", "320 compact", "840 split only if detail fits", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "320 compact", "840 split only if detail fits" ], "context_budget_chars": 48000 }, { "id": "S07-002", "stage": "S07", "role": "front", "reviewer_role": "qa", "title": "Реализовать Back/selection routes", "outcome": "Chat selection/list/settings и Back имеют устойчивый account context.", "depends_on": [ "S06-011", "S07-001" ], "requirements": [ "NAV-006" ], "scope": [ "src/ui/navigation-state.*", "tests/front/navigation-state.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [ 8, 10, 11, 12 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Chat selection/list/settings и Back имеют устойчивый account context.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Chat selection/list/settings и Back имеют устойчивый account context.", "Back restores list", "unknown selection safe empty", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Back restores list", "unknown selection safe empty" ], "context_budget_chars": 48000 }, { "id": "S07-003", "stage": "S07", "role": "front", "reviewer_role": "qa", "title": "Создать ConversationRow", "outcome": "Row renders avatar/name/preview/time/unread99+ and account identity per tokens.", "depends_on": [ "S06-011", "S07-001" ], "requirements": [ "NAV-004" ], "scope": [ "src/ui/conversation-row.*", "tests/front/conversation-row.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [ 8, 10, 11, 12 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Row renders avatar/name/preview/time/unread99+ and account identity per tokens.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Row renders avatar/name/preview/time/unread99+ and account identity per tokens.", "Long names truncate/readable", "selected focus distinct", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Long names truncate/readable", "selected focus distinct" ], "context_budget_chars": 48000 }, { "id": "S07-004", "stage": "S07", "role": "front", "reviewer_role": "qa", "title": "Реализовать search/sort policies", "outcome": "List filter by name/JID/account and stable activity sort не ищет body.", "depends_on": [ "S06-011", "S07-003" ], "requirements": [ "NAV-002", "NAV-003" ], "scope": [ "src/ui/list-filter.*", "tests/front/list-filter.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [ 8, 10, 11, 12 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "List filter by name/JID/account and stable activity sort не ищет body.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "List filter by name/JID/account and stable activity sort не ищет body.", "Case-insensitive search", "equal activity tie-break", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Case-insensitive search", "equal activity tie-break" ], "context_budget_chars": 48000 }, { "id": "S07-005", "stage": "S07", "role": "front", "reviewer_role": "qa", "title": "Подключить empty/no-results states", "outcome": "Empty list and no-results show different next action and preserve create controls.", "depends_on": [ "S06-011", "S07-003", "S07-004" ], "requirements": [ "NAV-005" ], "scope": [ "src/ui/list-empty.*", "tests/front/list-empty.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [ 8, 10, 11, 12 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Empty list and no-results show different next action and preserve create controls.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Empty list and no-results show different next action and preserve create controls.", "Clear query restores rows", "no data create visible", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Clear query restores rows", "no data create visible" ], "context_budget_chars": 48000 }, { "id": "S07-006", "stage": "S07", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать roster initial/push", "outcome": "Roster reducer updates people membership without history deletion.", "depends_on": [ "S06-011" ], "requirements": [ "CON-001" ], "scope": [ "src/adapters/xmpp/roster.*", "tests/protocol/roster.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Roster reducer updates people membership without history deletion.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Roster reducer updates people membership without history deletion.", "Removal drops contact only", "initial/push consistent", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Removal drops contact only", "initial/push consistent" ], "context_budget_chars": 48000 }, { "id": "S07-007", "stage": "S07", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать presence reducer", "outcome": "Presence belongs to current account and resets stale online after reconnect.", "depends_on": [ "S06-011", "S07-006" ], "requirements": [ "CON-003" ], "scope": [ "src/adapters/xmpp/presence.*", "tests/protocol/presence.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Presence belongs to current account and resets stale online after reconnect.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Presence belongs to current account and resets stale online after reconnect.", "Offline transition", "cached history not online", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Offline transition", "cached history not online" ], "context_budget_chars": 48000 }, { "id": "S07-008", "stage": "S07", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать avatar fetch/publish adapter", "outcome": "PEP avatar data/metadata and bounded legacy fallback integrate cache events.", "depends_on": [ "S06-011", "S07-006" ], "requirements": [ "CON-005", "CON-007" ], "scope": [ "src/adapters/xmpp/avatar-pep.*", "tests/protocol/avatar-pep.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "PEP avatar data/metadata and bounded legacy fallback integrate cache events.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "PEP avatar data/metadata and bounded legacy fallback integrate cache events.", "Avatar change invalidates cache", "unsupported fallback not fatal", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Avatar change invalidates cache", "unsupported fallback not fatal" ], "context_budget_chars": 48000 }, { "id": "S07-009", "stage": "S07", "role": "media", "reviewer_role": "qa", "title": "Нормализовать avatar asset", "outcome": "Image processor outputs bounded512px image preserving orientation and safe resource use.", "depends_on": [ "S06-011", "S07-008" ], "requirements": [ "CON-005" ], "scope": [ "src/adapters/media/avatar-normalize.*", "tests/media/avatar-normalize.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Image processor outputs bounded512px image preserving orientation and safe resource use.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Image processor outputs bounded512px image preserving orientation and safe resource use.", "Large image bounded", "invalid image error", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Large image bounded", "invalid image error" ], "context_budget_chars": 48000 }, { "id": "S07-010", "stage": "S07", "role": "front", "reviewer_role": "qa", "title": "Собрать ContactsView", "outcome": "People from roster and saved rooms separate, searchable, with correct state/avatars.", "depends_on": [ "S06-011", "S07-003", "S07-004", "S07-005", "S07-006", "S07-007", "S07-008", "S07-009" ], "requirements": [ "CON-001", "CON-004", "CON-006" ], "scope": [ "src/ui/contacts-view.*", "tests/front/contacts-view.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [ 8, 10, 11, 12 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "People from roster and saved rooms separate, searchable, with correct state/avatars.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "People from roster and saved rooms separate, searchable, with correct state/avatars.", "Roster removal keeps chat", "rooms not mixed into people", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Roster removal keeps chat", "rooms not mixed into people" ], "context_budget_chars": 48000 }, { "id": "S07-011", "stage": "S07", "role": "front", "reviewer_role": "qa", "title": "Создать new direct chat flow", "outcome": "JID/name/add-to-roster creates chat independently of roster membership.", "depends_on": [ "S06-011", "S07-002", "S07-006", "S07-010" ], "requirements": [ "CON-002" ], "scope": [ "src/ui/new-direct-chat.*", "tests/front/new-direct-chat.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [ 8, 10, 11, 12 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "JID/name/add-to-roster creates chat independently of roster membership.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "JID/name/add-to-roster creates chat independently of roster membership.", "Valid no-roster chat", "invalid JID field error", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Valid no-roster chat", "invalid JID field error" ], "context_budget_chars": 48000 }, { "id": "S07-012", "stage": "S07", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить shell и roster UI", "outcome": "Browser suite confirms top search, Back, selection and avatar/presence updates.", "depends_on": [ "S06-011", "S07-002", "S07-004", "S07-005", "S07-010", "S07-011" ], "requirements": [ "NAV-002", "NAV-006", "CON-006" ], "scope": [ "tests/acceptance/shell-contact-tests.*", "tests/qa/shell-contact-tests.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 9 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Browser suite confirms top search, Back, selection and avatar/presence updates.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Browser suite confirms top search, Back, selection and avatar/presence updates.", "Compact chat hides global nav", "keyboard reaches every list action", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Compact chat hides global nav", "keyboard reaches every list action" ], "context_budget_chars": 48000 }, { "id": "S07-013", "stage": "S07", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Навигация, контакты и списки", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S07-001", "S07-002", "S07-003", "S07-004", "S07-005", "S07-006", "S07-007", "S07-008", "S07-009", "S07-010", "S07-011", "S07-012" ], "requirements": [], "scope": [ "state/evidence/S07-gate.md", "docs/acceptance/S07-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S07.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S08-001", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать message identity merge", "outcome": "Index combines client/origin/stanza ids only within correct account/conversation.", "depends_on": [ "S07-013" ], "requirements": [ "MSG-004" ], "scope": [ "src/adapters/xmpp/message-identities.*", "tests/protocol/message-identities.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Index combines client/origin/stanza ids only within correct account/conversation.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Index combines client/origin/stanza ids only within correct account/conversation.", "Replay one row", "same id other chat not merged", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Replay one row", "same id other chat not merged" ], "context_budget_chars": 48000 }, { "id": "S08-002", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать delivery merge", "outcome": "Pure policy monotonic promotion и sticky failed handles replays.", "depends_on": [ "S07-013", "S08-001" ], "requirements": [ "MSG-003", "MSG-005" ], "scope": [ "src/adapters/xmpp/delivery-policy.*", "tests/protocol/delivery-policy.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Pure policy monotonic promotion и sticky failed handles replays.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Pure policy monotonic promotion и sticky failed handles replays.", "Read not downgraded", "failed requires explicit retry", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Read not downgraded", "failed requires explicit retry" ], "context_budget_chars": 48000 }, { "id": "S08-003", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать incoming decode reducer", "outcome": "Valid message events persist body/type/security and exclude service-only payload.", "depends_on": [ "S07-013", "S08-001", "S08-002" ], "requirements": [ "MSG-007" ], "scope": [ "src/adapters/xmpp/incoming-reducer.*", "tests/protocol/incoming-reducer.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Valid message events persist body/type/security and exclude service-only payload.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Valid message events persist body/type/security and exclude service-only payload.", "Receipt no bubble", "actual decrypt failure explicit", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Receipt no bubble", "actual decrypt failure explicit" ], "context_budget_chars": 48000 }, { "id": "S08-004", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать optimistic text send", "outcome": "Send creates unique pending record and invokes crypto port according to policy; missing ready fails closed.", "depends_on": [ "S07-013", "S08-001", "S08-002", "S08-003" ], "requirements": [ "MSG-001", "MSG-002", "ENC-002" ], "scope": [ "src/adapters/xmpp/text-send.*", "tests/protocol/text-send.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Send creates unique pending record and invokes crypto port according to policy; missing ready fails closed.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Send creates unique pending record and invokes crypto port according to policy; missing ready fails closed.", "Sending→sent/fail", "default encrypted cannot bypass missing adapter", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Sending→sent/fail", "default encrypted cannot bypass missing adapter" ], "context_budget_chars": 48000 }, { "id": "S08-005", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать text retry", "outcome": "Retry reuses controlled identity/context with original security and explicit action.", "depends_on": [ "S07-013", "S08-004" ], "requirements": [ "MSG-009" ], "scope": [ "src/adapters/xmpp/message-retry.*", "tests/protocol/message-retry.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Retry reuses controlled identity/context with original security and explicit action.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Retry reuses controlled identity/context with original security and explicit action.", "Failed retry success", "switched policy not silently applied", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Failed retry success", "switched policy not silently applied" ], "context_budget_chars": 48000 }, { "id": "S08-006", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Обработать delivery receipts", "outcome": "Receipt maps only allowed peer/message to delivered without invented read.", "depends_on": [ "S07-013", "S08-001", "S08-002", "S08-003" ], "requirements": [ "MSG-003" ], "scope": [ "src/adapters/xmpp/receipts.*", "tests/protocol/receipts.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Receipt maps only allowed peer/message to delivered without invented read.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Receipt maps only allowed peer/message to delivered without invented read.", "Valid receipt upgrades", "unrelated id/sender ignored", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Valid receipt upgrades", "unrelated id/sender ignored" ], "context_budget_chars": 48000 }, { "id": "S08-007", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать displayed/markable", "outcome": "Outgoing direct markable and incoming displayed map to read; MUC outbound forbidden.", "depends_on": [ "S07-013", "S08-004", "S08-006" ], "requirements": [ "READ-002", "READ-003" ], "scope": [ "src/adapters/xmpp/displayed.*", "tests/protocol/displayed.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Outgoing direct markable and incoming displayed map to read; MUC outbound forbidden.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Outgoing direct markable and incoming displayed map to read; MUC outbound forbidden.", "Direct read", "no group displayed broadcast", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Direct read", "no group displayed broadcast" ], "context_budget_chars": 48000 }, { "id": "S08-008", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать own-device read sync", "outcome": "Custom no-body marker validates source and waits pending target.", "depends_on": [ "S07-013", "S08-003", "S08-007" ], "requirements": [ "READ-004", "READ-005", "SEC-008" ], "scope": [ "src/adapters/xmpp/read-sync.*", "tests/protocol/read-sync.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Custom no-body marker validates source and waits pending target.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Custom no-body marker validates source and waits pending target.", "Marker before original", "forged peer marker rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Marker before original", "forged peer marker rejected" ], "context_budget_chars": 48000 }, { "id": "S08-009", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать unread/preview reducer", "outcome": "New incoming changes unread/lastActivity exactly once, active view suppresses unread.", "depends_on": [ "S07-013", "S08-003", "S08-008" ], "requirements": [ "READ-001", "MSG-006" ], "scope": [ "src/adapters/xmpp/unread-preview.*", "tests/protocol/unread-preview.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "New incoming changes unread/lastActivity exactly once, active view suppresses unread.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "New incoming changes unread/lastActivity exactly once, active view suppresses unread.", "Replay no count growth", "active chat no unread", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Replay no count growth", "active chat no unread" ], "context_budget_chars": 48000 }, { "id": "S08-010", "stage": "S08", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать self-chat policy", "outcome": "Own successful send/read sync doesn't generate duplicate self bubbles.", "depends_on": [ "S07-013", "S08-004", "S08-008", "S08-009" ], "requirements": [ "MSG-008" ], "scope": [ "src/adapters/xmpp/self-chat.*", "tests/protocol/self-chat.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Own successful send/read sync doesn't generate duplicate self bubbles.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Own successful send/read sync doesn't generate duplicate self bubbles.", "Self text ready port", "no service marker bubble", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Self text ready port", "no service marker bubble" ], "context_budget_chars": 48000 }, { "id": "S08-011", "stage": "S08", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Сообщения и read state", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S08-001", "S08-002", "S08-003", "S08-004", "S08-005", "S08-006", "S08-007", "S08-008", "S08-009", "S08-010" ], "requirements": [], "scope": [ "state/evidence/S08-gate.md", "docs/acceptance/S08-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S08.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S09-001", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Создать text/file bubble", "outcome": "Incoming/outgoing shape/body/metadata reflect domain states and tokens.", "depends_on": [ "S08-011" ], "requirements": [ "UI-MESSAGE", "MSG-003" ], "scope": [ "src/ui/message-bubble.*", "tests/front/message-bubble.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Incoming/outgoing shape/body/metadata reflect domain states and tokens.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Incoming/outgoing shape/body/metadata reflect domain states and tokens.", "All delivery states", "long URL wraps", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "All delivery states", "long URL wraps" ], "context_budget_chars": 48000 }, { "id": "S09-002", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Реализовать bounded timeline", "outcome": "Virtualized stable-key rows sort timestamp/id and don't render entire archive.", "depends_on": [ "S08-011", "S09-001" ], "requirements": [ "NFR-002", "MSG-006" ], "scope": [ "src/ui/timeline-window.*", "tests/front/timeline-window.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Virtualized stable-key rows sort timestamp/id and don't render entire archive.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Virtualized stable-key rows sort timestamp/id and don't render entire archive.", "Large fixture bounded DOM", "equal dates stable", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Large fixture bounded DOM", "equal dates stable" ], "context_budget_chars": 48000 }, { "id": "S09-003", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Сохранить viewport при history insert", "outcome": "Anchor logic keeps old reading position and near-bottom behavior.", "depends_on": [ "S08-011", "S09-002" ], "requirements": [ "MSG-006" ], "scope": [ "src/ui/scroll-anchor.*", "tests/front/scroll-anchor.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Anchor logic keeps old reading position and near-bottom behavior.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Anchor logic keeps old reading position and near-bottom behavior.", "Prepend no jump", "near-bottom new message follows", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Prepend no jump", "near-bottom new message follows" ], "context_budget_chars": 48000 }, { "id": "S09-004", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Создать multiline composer", "outcome": "Input1…6 lines, attach/emoji/send-record areas preserve draft on rerender.", "depends_on": [ "S08-011", "S09-001" ], "requirements": [ "UI-008", "STORE-006" ], "scope": [ "src/ui/composer-input.*", "tests/front/composer-input.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Input1…6 lines, attach/emoji/send-record areas preserve draft on rerender.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Input1…6 lines, attach/emoji/send-record areas preserve draft on rerender.", "Keyboard viewport reflow", "200% no clipped action", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Keyboard viewport reflow", "200% no clipped action" ], "context_budget_chars": 48000 }, { "id": "S09-005", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Реализовать Enter/IME policy", "outcome": "Enter preference and Shift+Enter do not send during IME composition.", "depends_on": [ "S08-011", "S09-004" ], "requirements": [ "UI-A11Y-003" ], "scope": [ "src/ui/composer-ime.*", "tests/front/composer-ime.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Enter preference and Shift+Enter do not send during IME composition.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Enter preference and Shift+Enter do not send during IME composition.", "Composition Enter ignored", "newline preserved", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Composition Enter ignored", "newline preserved" ], "context_budget_chars": 48000 }, { "id": "S09-006", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Подключить composer к send/retry", "outcome": "UI shows sending/failure and encrypted-not-ready; never substitutes plaintext mock.", "depends_on": [ "S08-011", "S09-004", "S09-005" ], "requirements": [ "MSG-001", "MSG-002", "MSG-009" ], "scope": [ "src/ui/composer-submit.*", "tests/front/composer-submit.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "UI shows sending/failure and encrypted-not-ready; never substitutes plaintext mock.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "UI shows sending/failure and encrypted-not-ready; never substitutes plaintext mock.", "Empty text ignored", "failed retry explicit", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Empty text ignored", "failed retry explicit" ], "context_budget_chars": 48000 }, { "id": "S09-007", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Создать date separators/metadata", "outcome": "Localized dates/edit/security/status labels rendered without duplicate semantic announcements.", "depends_on": [ "S08-011", "S09-001", "S09-002" ], "requirements": [ "UI-007", "UI-A11Y-001" ], "scope": [ "src/ui/date-metadata.*", "tests/front/date-metadata.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Localized dates/edit/security/status labels rendered without duplicate semantic announcements.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Localized dates/edit/security/status labels rendered without duplicate semantic announcements.", "Read not sent label", "caption contrast", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Read not sent label", "caption contrast" ], "context_budget_chars": 48000 }, { "id": "S09-008", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Создать message selection state", "outcome": "Selection IDs/count/action bar belong to current conversation and exit cleanly.", "depends_on": [ "S08-011", "S09-001", "S09-002" ], "requirements": [ "DEL-005" ], "scope": [ "src/ui/selection-bar.*", "tests/front/selection-bar.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Selection IDs/count/action bar belong to current conversation and exit cleanly.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Selection IDs/count/action bar belong to current conversation and exit cleanly.", "Switch clears selection", "keyboard toggle", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Switch clears selection", "keyboard toggle" ], "context_budget_chars": 48000 }, { "id": "S09-009", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Создать jump-to-latest", "outcome": "Button visible when reading older and preserves focus/read position until explicit jump.", "depends_on": [ "S08-011", "S09-003" ], "requirements": [ "NAV-006" ], "scope": [ "src/ui/jump-latest.*", "tests/front/jump-latest.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Button visible when reading older and preserves focus/read position until explicit jump.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Button visible when reading older and preserves focus/read position until explicit jump.", "New incoming doesn't yank old view", "jump reaches last", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "New incoming doesn't yank old view", "jump reaches last" ], "context_budget_chars": 48000 }, { "id": "S09-010", "stage": "S09", "role": "front", "reviewer_role": "qa", "title": "Реализовать bounded message motion", "outcome": "New appends animate per policy, history bursts/recycled rows don't repeat; reduced motion works.", "depends_on": [ "S08-011", "S09-002", "S09-003" ], "requirements": [ "UI-A11Y-007" ], "scope": [ "src/ui/timeline-motion.*", "tests/front/timeline-motion.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [ 13, 16, 23, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "New appends animate per policy, history bursts/recycled rows don't repeat; reduced motion works.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "New appends animate per policy, history bursts/recycled rows don't repeat; reduced motion works.", "Burst>4 no stagger", "reduced motion no scale", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Burst>4 no stagger", "reduced motion no scale" ], "context_budget_chars": 48000 }, { "id": "S09-011", "stage": "S09", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить chat keyboard/scale", "outcome": "Focused suite covers IME/draft/selection/focus and message announcements.", "depends_on": [ "S08-011", "S09-005", "S09-006", "S09-007", "S09-008", "S09-009", "S09-010" ], "requirements": [ "UI-A11Y-003", "UI-A11Y-004", "UI-A11Y-006" ], "scope": [ "tests/acceptance/chat-a11y.*", "tests/qa/chat-a11y.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 8, 10 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Focused suite covers IME/draft/selection/focus and message announcements.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Focused suite covers IME/draft/selection/focus and message announcements.", "320+200%", "no focus theft from incoming", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "320+200%", "no focus theft from incoming" ], "context_budget_chars": 48000 }, { "id": "S09-012", "stage": "S09", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Лента и composer", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S09-001", "S09-002", "S09-003", "S09-004", "S09-005", "S09-006", "S09-007", "S09-008", "S09-009", "S09-010", "S09-011" ], "requirements": [ "NFR-001", "NFR-003", "NFR-004", "NFR-005", "NFR-006", "NFR-007", "NFR-008", "NFR-009" ], "scope": [ "state/evidence/S09-gate.md", "docs/acceptance/S09-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S09.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S10-001", "stage": "S10", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать action predicates", "outcome": "Pure policies distinguish direct/group/sending/system/retracted for every menu action.", "depends_on": [ "S09-012" ], "requirements": [ "DEL-005", "REACT-004" ], "scope": [ "src/adapters/xmpp/action-predicates.*", "tests/protocol/action-predicates.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Pure policies distinguish direct/group/sending/system/retracted for every menu action.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Pure policies distinguish direct/group/sending/system/retracted for every menu action.", "Group edit denied", "tombstone no forward/reaction", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Group edit denied", "tombstone no forward/reaction" ], "context_budget_chars": 48000 }, { "id": "S10-002", "stage": "S10", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать reply/fallback encoder", "outcome": "Reply sends correct target/author and Unicode scalar fallback offsets.", "depends_on": [ "S09-012", "S10-001" ], "requirements": [ "REPLY-001", "REPLY-004", "REPLY-005" ], "scope": [ "src/adapters/xmpp/reply-wire.*", "tests/protocol/reply-wire.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Reply sends correct target/author and Unicode scalar fallback offsets.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Reply sends correct target/author and Unicode scalar fallback offsets.", "Non-ASCII offsets correct", "cross-chat target rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Non-ASCII offsets correct", "cross-chat target rejected" ], "context_budget_chars": 48000 }, { "id": "S10-003", "stage": "S10", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать XML/legacy reply parser", "outcome": "Parser separates fallback quote from body without inventing legacy target.", "depends_on": [ "S09-012", "S10-002" ], "requirements": [ "REPLY-002", "REPLY-004" ], "scope": [ "src/adapters/xmpp/reply-parser.*", "tests/protocol/reply-parser.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Parser separates fallback quote from body without inventing legacy target.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Parser separates fallback quote from body without inventing legacy target.", "XML body no doubled quote", "legacy quote static", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "XML body no doubled quote", "legacy quote static" ], "context_budget_chars": 48000 }, { "id": "S10-004", "stage": "S10", "role": "front", "reviewer_role": "qa", "title": "Создать CompactReply/ThreadFocus", "outcome": "Reply preview and target focus support unavailable source and focus restore.", "depends_on": [ "S09-012", "S10-003" ], "requirements": [ "REPLY-002", "REPLY-003" ], "scope": [ "src/ui/compact-reply.*", "tests/front/compact-reply.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [ 13, 14, 15 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Reply preview and target focus support unavailable source and focus restore.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Reply preview and target focus support unavailable source and focus restore.", "Missing target explanation", "keyboard close restores focus", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Missing target explanation", "keyboard close restores focus" ], "context_budget_chars": 48000 }, { "id": "S10-005", "stage": "S10", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать correction reducer/command", "outcome": "Edit applies own direct text, matching author/security, timestamp and pending target.", "depends_on": [ "S09-012", "S10-001" ], "requirements": [ "EDIT-001", "EDIT-002", "EDIT-003", "EDIT-004" ], "scope": [ "src/adapters/xmpp/correction.*", "tests/protocol/correction.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Edit applies own direct text, matching author/security, timestamp and pending target.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Edit applies own direct text, matching author/security, timestamp and pending target.", "Foreign edit rejected", "older edit cannot overwrite", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Foreign edit rejected", "older edit cannot overwrite" ], "context_budget_chars": 48000 }, { "id": "S10-006", "stage": "S10", "role": "front", "reviewer_role": "qa", "title": "Подключить edit composer mode", "outcome": "Editing preserves original message identity and provides cancel/save with error state.", "depends_on": [ "S09-012", "S10-005" ], "requirements": [ "EDIT-001", "EDIT-004" ], "scope": [ "src/ui/edit-mode.*", "tests/front/edit-mode.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [ 13, 14, 15 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Editing preserves original message identity and provides cancel/save with error state.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Editing preserves original message identity and provides cancel/save with error state.", "Cancel keeps original", "failed save not marked edited", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Cancel keeps original", "failed save not marked edited" ], "context_budget_chars": 48000 }, { "id": "S10-007", "stage": "S10", "role": "storage", "reviewer_role": "qa", "title": "Реализовать local deletion transaction", "outcome": "Delete removes row and saves all known alias suppression atomically, rebuilds preview.", "depends_on": [ "S09-012", "S10-001" ], "requirements": [ "DEL-001" ], "scope": [ "src/adapters/storage/local-delete.*", "tests/storage/local-delete.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Delete removes row and saves all known alias suppression atomically, rebuilds preview.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Delete removes row and saves all known alias suppression atomically, rebuilds preview.", "MAM replay suppressed", "failure rolls back both", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "MAM replay suppressed", "failure rolls back both" ], "context_budget_chars": 48000 }, { "id": "S10-008", "stage": "S10", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать retraction command/reducer", "outcome": "Retract validates author/source, pending target, cleans payload and uses generic fallback.", "depends_on": [ "S09-012", "S10-001" ], "requirements": [ "DEL-002", "DEL-003", "DEL-004" ], "scope": [ "src/adapters/xmpp/retraction.*", "tests/protocol/retraction.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Retract validates author/source, pending target, cleans payload and uses generic fallback.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Retract validates author/source, pending target, cleans payload and uses generic fallback.", "Forged retract ignored", "late retract tombstone once", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Forged retract ignored", "late retract tombstone once" ], "context_budget_chars": 48000 }, { "id": "S10-009", "stage": "S10", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать ordered text/location forwarding", "outcome": "New attribution and identities preserve source order and recipient policy.", "depends_on": [ "S09-012", "S10-001" ], "requirements": [ "FWD-001", "FWD-002", "FWD-004" ], "scope": [ "src/adapters/xmpp/forward-text.*", "tests/protocol/forward-text.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "New attribution and identities preserve source order and recipient policy.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "New attribution and identities preserve source order and recipient policy.", "Partial count accurate", "other chat policy applies", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Partial count accurate", "other chat policy applies" ], "context_budget_chars": 48000 }, { "id": "S10-010", "stage": "S10", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать reaction set reducer", "outcome": "Sanitized full author set, empty removal, timestamp ordering and pending target.", "depends_on": [ "S09-012", "S10-001" ], "requirements": [ "REACT-001", "REACT-002", "REACT-003", "REACT-004", "REACT-005" ], "scope": [ "src/adapters/xmpp/reactions.*", "tests/protocol/reactions.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Sanitized full author set, empty removal, timestamp ordering and pending target.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Sanitized full author set, empty removal, timestamp ordering and pending target.", "Old set ignored", "duplicate/invalid emoji dropped", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Old set ignored", "duplicate/invalid emoji dropped" ], "context_budget_chars": 48000 }, { "id": "S10-011", "stage": "S10", "role": "front", "reviewer_role": "qa", "title": "Подключить ReactionChip/EmojiPicker", "outcome": "Chips own/count and categorized picker invoke domain reaction command.", "depends_on": [ "S09-012", "S10-010" ], "requirements": [ "REACT-003" ], "scope": [ "src/ui/reaction-picker.*", "tests/front/reaction-picker.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [ 13, 14, 15 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Chips own/count and categorized picker invoke domain reaction command.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Chips own/count and categorized picker invoke domain reaction command.", "Keyboard select/remove", "no color-only own state", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Keyboard select/remove", "no color-only own state" ], "context_budget_chars": 48000 }, { "id": "S10-012", "stage": "S10", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать typing policy/events", "outcome": "Per-account setting controls active/composing/paused/expiry and group names.", "depends_on": [ "S09-012" ], "requirements": [ "TYPE-001", "TYPE-002", "TYPE-003" ], "scope": [ "src/adapters/xmpp/typing.*", "tests/protocol/typing.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Per-account setting controls active/composing/paused/expiry and group names.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Per-account setting controls active/composing/paused/expiry and group names.", "5s pause/8s expiry", "disabled clears tasks", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "5s pause/8s expiry", "disabled clears tasks" ], "context_budget_chars": 48000 }, { "id": "S10-013", "stage": "S10", "role": "front", "reviewer_role": "qa", "title": "Подключить context/selection actions", "outcome": "Menus respect predicates, destructive confirms scope, swipe has button alternative.", "depends_on": [ "S09-012", "S10-004", "S10-006", "S10-007", "S10-008", "S10-009", "S10-011" ], "requirements": [ "DEL-004", "DEL-005", "UI-006" ], "scope": [ "src/ui/message-actions.*", "tests/front/message-actions.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [ 13, 14, 15 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Menus respect predicates, destructive confirms scope, swipe has button alternative.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Menus respect predicates, destructive confirms scope, swipe has button alternative.", "Unavailable action absent", "selection disables swipe", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Unavailable action absent", "selection disables swipe" ], "context_budget_chars": 48000 }, { "id": "S10-014", "stage": "S10", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить out-of-order actions", "outcome": "Focused suite checks edit/retract/reaction before original and no service bubble.", "depends_on": [ "S09-012", "S10-005", "S10-007", "S10-008", "S10-010", "S10-012", "S10-013" ], "requirements": [ "EDIT-003", "DEL-003", "REACT-004" ], "scope": [ "tests/acceptance/interaction-races.*", "tests/qa/interaction-races.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 11, 12 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Focused suite checks edit/retract/reaction before original and no service bubble.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Focused suite checks edit/retract/reaction before original and no service bubble.", "Pending then original applies", "forged sender rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Pending then original applies", "forged sender rejected" ], "context_budget_chars": 48000 }, { "id": "S10-015", "stage": "S10", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Действия над сообщениями", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "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" ], "requirements": [ "FWD-003" ], "scope": [ "state/evidence/S10-gate.md", "docs/acceptance/S10-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S10.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S11-001", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать MAM query envelope", "outcome": "Query IDs/account-room source whitelist and bounded inbox isolate concurrent requests.", "depends_on": [ "S10-015" ], "requirements": [ "HIST-003", "HIST-005" ], "scope": [ "src/adapters/xmpp/mam-query.*", "tests/protocol/mam-query.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Query IDs/account-room source whitelist and bounded inbox isolate concurrent requests.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Query IDs/account-room source whitelist and bounded inbox isolate concurrent requests.", "Unexpected source rejected", "96 buffer overflow safe", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Unexpected source rejected", "96 buffer overflow safe" ], "context_budget_chars": 48000 }, { "id": "S11-002", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать cursor policy", "outcome": "Complete/new/empty/repeating cursor decisions stop loops without skipping.", "depends_on": [ "S10-015", "S11-001" ], "requirements": [ "HIST-004", "HIST-006" ], "scope": [ "src/adapters/xmpp/mam-pagination.*", "tests/protocol/mam-pagination.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Complete/new/empty/repeating cursor decisions stop loops without skipping.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Complete/new/empty/repeating cursor decisions stop loops without skipping.", "Incomplete no cursor fails", "repeated cursor rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Incomplete no cursor fails", "repeated cursor rejected" ], "context_budget_chars": 48000 }, { "id": "S11-003", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать recent bootstrap", "outcome": "Fresh account requests latest40 instead of oldest full archive, indicator limited to bootstrap.", "depends_on": [ "S10-015", "S11-001", "S11-002" ], "requirements": [ "HIST-002" ], "scope": [ "src/adapters/xmpp/mam-bootstrap.*", "tests/protocol/mam-bootstrap.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Fresh account requests latest40 instead of oldest full archive, indicator limited to bootstrap.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Fresh account requests latest40 instead of oldest full archive, indicator limited to bootstrap.", "Latest window fixture", "huge archive not blocking login", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Latest window fixture", "huge archive not blocking login" ], "context_budget_chars": 48000 }, { "id": "S11-004", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать bounded decode slices", "outcome": "Inbox drained into typed mutations in8-item slices with yield/cancel.", "depends_on": [ "S10-015", "S11-001" ], "requirements": [ "HIST-005", "HIST-010" ], "scope": [ "src/adapters/xmpp/mam-decode.*", "tests/protocol/mam-decode.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Inbox drained into typed mutations in8-item slices with yield/cancel.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Inbox drained into typed mutations in8-item slices with yield/cancel.", "UI task gets turn", "cancel discards incomplete batch", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "UI task gets turn", "cancel discards incomplete batch" ], "context_budget_chars": 48000 }, { "id": "S11-005", "stage": "S11", "role": "storage", "reviewer_role": "qa", "title": "Реализовать archive commit transaction", "outcome": "Decoded changes and checkpoint persist together only after successful save.", "depends_on": [ "S10-015", "S11-002", "S11-004" ], "requirements": [ "HIST-007" ], "scope": [ "src/adapters/storage/mam-commit.*", "tests/storage/mam-commit.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Decoded changes and checkpoint persist together only after successful save.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Decoded changes and checkpoint persist together only after successful save.", "Injected quota retains old cursor", "complete data advances", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Injected quota retains old cursor", "complete data advances" ], "context_budget_chars": 48000 }, { "id": "S11-006", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать incremental catch-up", "outcome": "After stored UID query and one timestamp-overlap fallback reconcile duplicates.", "depends_on": [ "S10-015", "S11-002", "S11-005" ], "requirements": [ "HIST-004" ], "scope": [ "src/adapters/xmpp/mam-catchup.*", "tests/protocol/mam-catchup.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "After stored UID query and one timestamp-overlap fallback reconcile duplicates.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "After stored UID query and one timestamp-overlap fallback reconcile duplicates.", "Expired cursor falls back once", "no infinite strategy loop", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Expired cursor falls back once", "no infinite strategy loop" ], "context_budget_chars": 48000 }, { "id": "S11-007", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать bounded archive recovery", "outcome": "Query/apply deadlines and retry budget end spinner and allow manual recovery.", "depends_on": [ "S10-015", "S11-001", "S11-004", "S11-006" ], "requirements": [ "HIST-006", "HIST-011" ], "scope": [ "src/adapters/xmpp/mam-retry.*", "tests/protocol/mam-retry.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Query/apply deadlines and retry budget end spinner and allow manual recovery.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Query/apply deadlines and retry budget end spinner and allow manual recovery.", "Timeout20s", "retry exhaustion explicit", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Timeout20s", "retry exhaustion explicit" ], "context_budget_chars": 48000 }, { "id": "S11-008", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать interactive backward paging", "outcome": "Next before uses server first even if no messages inserted; own query buffer retained.", "depends_on": [ "S10-015", "S11-001", "S11-002", "S11-005" ], "requirements": [ "HIST-008" ], "scope": [ "src/adapters/xmpp/mam-backward.*", "tests/protocol/mam-backward.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Next before uses server first even if no messages inserted; own query buffer retained.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Next before uses server first even if no messages inserted; own query buffer retained.", "Reaction-only page advances", "missing first stops more", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Reaction-only page advances", "missing first stops more" ], "context_budget_chars": 48000 }, { "id": "S11-009", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Ограничить pending target queues", "outcome": "Corrections/retractions/reactions/read queues bounded, expire and apply current target.", "depends_on": [ "S10-015", "S11-004" ], "requirements": [ "HIST-009" ], "scope": [ "src/adapters/xmpp/pending-operations.*", "tests/protocol/pending-operations.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Corrections/retractions/reactions/read queues bounded, expire and apply current target.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Corrections/retractions/reactions/read queues bounded, expire and apply current target.", "Overflow no crash", "newest reaction wins", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Overflow no crash", "newest reaction wins" ], "context_budget_chars": 48000 }, { "id": "S11-010", "stage": "S11", "role": "protocol", "reviewer_role": "qa", "title": "Подключить archive pause/resume", "outcome": "Background/media work throttles queries with account-bound resume and safe checkpoint.", "depends_on": [ "S10-015", "S11-006", "S11-007" ], "requirements": [ "HIST-010", "HIST-011" ], "scope": [ "src/adapters/xmpp/archive-lifecycle.*", "tests/protocol/archive-lifecycle.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Background/media work throttles queries with account-bound resume and safe checkpoint.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Background/media work throttles queries with account-bound resume and safe checkpoint.", "Capture pauses", "resume old account refused", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Capture pauses", "resume old account refused" ], "context_budget_chars": 48000 }, { "id": "S11-011", "stage": "S11", "role": "front", "reviewer_role": "qa", "title": "Подключить older history UI", "outcome": "Top loading/error/retry and hasMore keep viewport without full-catchup false status.", "depends_on": [ "S10-015", "S11-003", "S11-008", "S11-010" ], "requirements": [ "HIST-002", "HIST-008" ], "scope": [ "src/ui/history-status.*", "tests/front/history-status.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Top loading/error/retry and hasMore keep viewport without full-catchup false status.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Top loading/error/retry and hasMore keep viewport without full-catchup false status.", "No more page stops loader", "failed query retry visible", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No more page stops loader", "failed query retry visible" ], "context_budget_chars": 48000 }, { "id": "S11-012", "stage": "S11", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить archive restart failures", "outcome": "Integration asserts durable restart, missing cursor, quota and service-only page behavior.", "depends_on": [ "S10-015", "S11-005", "S11-007", "S11-008", "S11-009", "S11-010", "S11-011" ], "requirements": [ "HIST-001", "HIST-007", "HIST-012" ], "scope": [ "tests/acceptance/archive-recovery.*", "tests/qa/archive-recovery.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 18, 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Integration asserts durable restart, missing cursor, quota and service-only page behavior.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Integration asserts durable restart, missing cursor, quota and service-only page behavior.", "Restart correct checkpoint", "failed transaction no skip", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Restart correct checkpoint", "failed transaction no skip" ], "context_budget_chars": 48000 }, { "id": "S11-013", "stage": "S11", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Архив и восстановление", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S11-001", "S11-002", "S11-003", "S11-004", "S11-005", "S11-006", "S11-007", "S11-008", "S11-009", "S11-010", "S11-011", "S11-012" ], "requirements": [], "scope": [ "state/evidence/S11-gate.md", "docs/acceptance/S11-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S11.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S12-001", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Подключить accepted crypto backend", "outcome": "Wrapper exposes vetted backend lifecycle in worker, never mock-success in production.", "depends_on": [ "S11-013" ], "requirements": [ "ENC-009" ], "scope": [ "src/adapters/crypto/backend-wrapper.*", "tests/crypto/backend-wrapper.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Wrapper exposes vetted backend lifecycle in worker, never mock-success in production.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Wrapper exposes vetted backend lifecycle in worker, never mock-success in production.", "Library known vector", "unsupported backend typed failure", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Library known vector", "unsupported backend typed failure" ], "context_budget_chars": 48000 }, { "id": "S12-002", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать identity bootstrap", "outcome": "Per-account installation identity generated once through backend API and restored thereafter.", "depends_on": [ "S11-013", "S12-001" ], "requirements": [ "ENC-006" ], "scope": [ "src/adapters/crypto/identity-generation.*", "tests/crypto/identity-generation.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Per-account installation identity generated once through backend API and restored thereafter.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Per-account installation identity generated once through backend API and restored thereafter.", "Reload same identity", "accounts distinct", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Reload same identity", "accounts distinct" ], "context_budget_chars": 48000 }, { "id": "S12-003", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать protected crypto persistence", "outcome": "Approved key wrapping/access model stores backend opaque state and excludes plaintext password.", "depends_on": [ "S11-013", "S12-002" ], "requirements": [ "ENC-006", "STORE-003" ], "scope": [ "src/adapters/crypto/private-state.*", "tests/crypto/private-state.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Approved key wrapping/access model stores backend opaque state and excludes plaintext password.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Approved key wrapping/access model stores backend opaque state and excludes plaintext password.", "Unlock/reload state", "wrong verifier doesn't expose secret", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Unlock/reload state", "wrong verifier doesn't expose secret" ], "context_budget_chars": 48000 }, { "id": "S12-004", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать device trust model", "outcome": "TOFU/trusted/verified/undecided/compromised transitions are explicit and immutable by stale replay.", "depends_on": [ "S11-013", "S12-002" ], "requirements": [ "ENC-007" ], "scope": [ "src/adapters/crypto/trust-policy.*", "tests/crypto/trust-policy.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "TOFU/trusted/verified/undecided/compromised transitions are explicit and immutable by stale replay.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "TOFU/trusted/verified/undecided/compromised transitions are explicit and immutable by stale replay.", "Changed key undecided", "compromised excluded", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Changed key undecided", "compromised excluded" ], "context_budget_chars": 48000 }, { "id": "S12-005", "stage": "S12", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать legacy device list PEP", "outcome": "PEP fetch/publish parser validates IDs/source and emits bounded device events.", "depends_on": [ "S11-013" ], "requirements": [ "ENC-003" ], "scope": [ "src/adapters/xmpp/legacy-device-list.*", "tests/protocol/legacy-device-list.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "PEP fetch/publish parser validates IDs/source and emits bounded device events.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "PEP fetch/publish parser validates IDs/source and emits bounded device events.", "Own list roundtrip", "forged/malformed list ignored", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Own list roundtrip", "forged/malformed list ignored" ], "context_budget_chars": 48000 }, { "id": "S12-006", "stage": "S12", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать legacy bundle PEP", "outcome": "Bundle adapter roundtrips backend-compatible fields and missing/malformed errors.", "depends_on": [ "S11-013", "S12-005" ], "requirements": [ "ENC-003" ], "scope": [ "src/adapters/xmpp/legacy-bundle.*", "tests/protocol/legacy-bundle.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Bundle adapter roundtrips backend-compatible fields and missing/malformed errors.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Bundle adapter roundtrips backend-compatible fields and missing/malformed errors.", "Valid fixture usable", "bad bundle fail closed", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Valid fixture usable", "bad bundle fail closed" ], "context_budget_chars": 48000 }, { "id": "S12-007", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать legacy session builder", "outcome": "Vetted backend builds recipient sessions from validated bundle and trusted identity.", "depends_on": [ "S11-013", "S12-001", "S12-004", "S12-006" ], "requirements": [ "ENC-002", "ENC-003" ], "scope": [ "src/adapters/crypto/legacy-session.*", "tests/crypto/legacy-session.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Vetted backend builds recipient sessions from validated bundle and trusted identity.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Vetted backend builds recipient sessions from validated bundle and trusted identity.", "Known session vector", "missing device failure", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Known session vector", "missing device failure" ], "context_budget_chars": 48000 }, { "id": "S12-008", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать legacy stanza encryption", "outcome": "Backend encrypts text with recipient keys and standard legacy wire serialization.", "depends_on": [ "S11-013", "S12-007" ], "requirements": [ "ENC-002", "ENC-003" ], "scope": [ "src/adapters/crypto/legacy-encrypt.*", "tests/crypto/legacy-encrypt.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Backend encrypts text with recipient keys and standard legacy wire serialization.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Backend encrypts text with recipient keys and standard legacy wire serialization.", "Known recipient decrypts", "backend failure yields no plaintext", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Known recipient decrypts", "backend failure yields no plaintext" ], "context_budget_chars": 48000 }, { "id": "S12-009", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать legacy stanza decryption", "outcome": "Backend decrypt result maps message/service/error without UI-thread blocking.", "depends_on": [ "S11-013", "S12-007", "S12-008" ], "requirements": [ "ENC-003" ], "scope": [ "src/adapters/crypto/legacy-decrypt.*", "tests/crypto/legacy-decrypt.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Backend decrypt result maps message/service/error without UI-thread blocking.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Backend decrypt result maps message/service/error without UI-thread blocking.", "Fixture decrypt", "corrupted payload explicit failure", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Fixture decrypt", "corrupted payload explicit failure" ], "context_budget_chars": 48000 }, { "id": "S12-010", "stage": "S12", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать OMEMO2 devices PEP", "outcome": "New namespace devices list fetch/publish interoperates with fixture and lifecycle.", "depends_on": [ "S11-013" ], "requirements": [ "ENC-003", "ENC-011" ], "scope": [ "src/adapters/xmpp/omemo2-device-list.*", "tests/protocol/omemo2-device-list.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "New namespace devices list fetch/publish interoperates with fixture and lifecycle.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "New namespace devices list fetch/publish interoperates with fixture and lifecycle.", "Device node roundtrip", "invalid ID bounded", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Device node roundtrip", "invalid ID bounded" ], "context_budget_chars": 48000 }, { "id": "S12-011", "stage": "S12", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать OMEMO2 bundle PEP", "outcome": "New bundle field codec maps vetted backend key material without changing algorithms.", "depends_on": [ "S11-013", "S12-010" ], "requirements": [ "ENC-003", "ENC-011" ], "scope": [ "src/adapters/xmpp/omemo2-bundle.*", "tests/protocol/omemo2-bundle.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "New bundle field codec maps vetted backend key material without changing algorithms.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "New bundle field codec maps vetted backend key material without changing algorithms.", "Known compatible bundle", "malformed signature rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Known compatible bundle", "malformed signature rejected" ], "context_budget_chars": 48000 }, { "id": "S12-012", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать OMEMO2 session adapter", "outcome": "Accepted backend/namespace session policy supports new format and persistent state.", "depends_on": [ "S11-013", "S12-001", "S12-003", "S12-004", "S12-011" ], "requirements": [ "ENC-003", "ENC-011" ], "scope": [ "src/adapters/crypto/omemo2-session.*", "tests/crypto/omemo2-session.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Accepted backend/namespace session policy supports new format and persistent state.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Accepted backend/namespace session policy supports new format and persistent state.", "Backend session vector", "legacy/new lifecycle consistent", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Backend session vector", "legacy/new lifecycle consistent" ], "context_budget_chars": 48000 }, { "id": "S12-013", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Интегрировать OMEMO2 payload/SCE codec", "outcome": "Vetted primitives/module build and validate compatible SCE payload/key/MAC without custom cipher.", "depends_on": [ "S11-013", "S12-012" ], "requirements": [ "ENC-009", "ENC-011" ], "scope": [ "src/adapters/crypto/omemo2-payload.*", "tests/crypto/omemo2-payload.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Vetted primitives/module build and validate compatible SCE payload/key/MAC without custom cipher.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Vetted primitives/module build and validate compatible SCE payload/key/MAC without custom cipher.", "Published vectors roundtrip", "tampered MAC/envelope rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Published vectors roundtrip", "tampered MAC/envelope rejected" ], "context_budget_chars": 48000 }, { "id": "S12-014", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать OMEMO2 stanza adapter", "outcome": "Wire encrypt/decrypt combines sessions/devices/payload with typed errors.", "depends_on": [ "S11-013", "S12-013" ], "requirements": [ "ENC-003", "ENC-011" ], "scope": [ "src/adapters/crypto/omemo2-stanza.*", "tests/crypto/omemo2-stanza.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Wire encrypt/decrypt combines sessions/devices/payload with typed errors.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Wire encrypt/decrypt combines sessions/devices/payload with typed errors.", "Independent fixture decrypt", "partial recipients fail closed", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Independent fixture decrypt", "partial recipients fail closed" ], "context_budget_chars": 48000 }, { "id": "S12-015", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать OMEMO format preference", "outcome": "Direct fetches support on demand; group prefers2 only when all recipients eligible.", "depends_on": [ "S11-013", "S12-008", "S12-009", "S12-014" ], "requirements": [ "ENC-004" ], "scope": [ "src/adapters/crypto/protocol-selection.*", "tests/crypto/protocol-selection.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Direct fetches support on demand; group prefers2 only when all recipients eligible.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Direct fetches support on demand; group prefers2 only when all recipients eligible.", "Legacy-only peer fallback encrypted", "no plaintext fallback", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Legacy-only peer fallback encrypted", "no plaintext fallback" ], "context_budget_chars": 48000 }, { "id": "S12-016", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Подключить own-device recipients", "outcome": "Other own devices decrypt sent copies; active device not bogus mandatory remote session.", "depends_on": [ "S11-013", "S12-015" ], "requirements": [ "ENC-005" ], "scope": [ "src/adapters/crypto/encrypt-self.*", "tests/crypto/encrypt-self.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Other own devices decrypt sent copies; active device not bogus mandatory remote session.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Other own devices decrypt sent copies; active device not bogus mandatory remote session.", "Own second device decrypt", "duplicate own echo not phantom", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Own second device decrypt", "duplicate own echo not phantom" ], "context_budget_chars": 48000 }, { "id": "S12-017", "stage": "S12", "role": "crypto", "reviewer_role": "security", "title": "Реализовать encrypted file port", "outcome": "Vetted file encryption/decryption returns blob/key fragment with secure lifetime.", "depends_on": [ "S11-013", "S12-001", "S12-003" ], "requirements": [ "FILE-004", "ENC-009" ], "scope": [ "src/adapters/crypto/file-aesgcm.*", "tests/crypto/file-aesgcm.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Vetted file encryption/decryption returns blob/key fragment with secure lifetime.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Vetted file encryption/decryption returns blob/key fragment with secure lifetime.", "Known file vector", "tamper/wrong key rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Known file vector", "tamper/wrong key rejected" ], "context_budget_chars": 48000 }, { "id": "S12-018", "stage": "S12", "role": "front", "reviewer_role": "qa", "title": "Создать encryption controls", "outcome": "Global/per-chat policy visible before send with readiness and fail-closed error.", "depends_on": [ "S11-013", "S12-015" ], "requirements": [ "ENC-001", "ENC-002" ], "scope": [ "src/ui/encryption-settings.*", "tests/front/encryption-settings.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Global/per-chat policy visible before send with readiness and fail-closed error.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Global/per-chat policy visible before send with readiness and fail-closed error.", "Override wins", "not-ready cannot send plaintext silently", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Override wins", "not-ready cannot send plaintext silently" ], "context_budget_chars": 48000 }, { "id": "S12-019", "stage": "S12", "role": "front", "reviewer_role": "qa", "title": "Создать devices/fingerprint UI", "outcome": "Device protocol/active/trust/fingerprint and explicit verification update domain state.", "depends_on": [ "S11-013", "S12-004", "S12-015" ], "requirements": [ "ENC-007", "ENC-008" ], "scope": [ "src/ui/device-trust-view.*", "tests/front/device-trust-view.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Device protocol/active/trust/fingerprint and explicit verification update domain state.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Device protocol/active/trust/fingerprint and explicit verification update domain state.", "Copy complete fingerprint", "changed key not auto verified", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Copy complete fingerprint", "changed key not auto verified" ], "context_budget_chars": 48000 }, { "id": "S12-020", "stage": "S12", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить client crypto boundaries", "outcome": "Review checks actual library vectors, state protection, secret logs and fail-closed paths.", "depends_on": [ "S11-013", "S12-003", "S12-008", "S12-009", "S12-014", "S12-015", "S12-016", "S12-017", "S12-018", "S12-019" ], "requirements": [ "ENC-002", "ENC-006", "ENC-009", "ENC-010" ], "scope": [ "tests/security/crypto-review.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Review checks actual library vectors, state protection, secret logs and fail-closed paths.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Review checks actual library vectors, state protection, secret logs and fail-closed paths.", "No custom ratchet", "no decrypting gateway path", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No custom ratchet", "no decrypting gateway path" ], "context_budget_chars": 48000 }, { "id": "S12-021", "stage": "S12", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить OMEMO interoperability", "outcome": "Dedicated accounts exchange legacy/new/encrypt-to-self messages with independent client and record versions.", "depends_on": [ "S11-013", "S12-020" ], "requirements": [ "ENC-003", "ENC-004", "ENC-005" ], "scope": [ "tests/acceptance/crypto-interop.*", "tests/qa/crypto-interop.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Dedicated accounts exchange legacy/new/encrypt-to-self messages with independent client and record versions.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Dedicated accounts exchange legacy/new/encrypt-to-self messages with independent client and record versions.", "Actual decrypt both directions", "missing external result remains blocker", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Actual decrypt both directions", "missing external result remains blocker" ], "context_budget_chars": 48000 }, { "id": "S12-022", "stage": "S12", "role": "qa", "reviewer_role": "security", "title": "Gate: OMEMO и доверие", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "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" ], "requirements": [], "scope": [ "state/evidence/S12-gate.md", "docs/acceptance/S12-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S12.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S13-001", "stage": "S13", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать room join/password", "outcome": "MUC adapter validates room/nick, joins and requests password if required.", "depends_on": [ "S12-022" ], "requirements": [ "MUC-001" ], "scope": [ "src/adapters/xmpp/room-join.*", "tests/protocol/room-join.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "MUC adapter validates room/nick, joins and requests password if required.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "MUC adapter validates room/nick, joins and requests password if required.", "Joined event", "invalid nickname/password explicit", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Joined event", "invalid nickname/password explicit" ], "context_budget_chars": 48000 }, { "id": "S13-002", "stage": "S13", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать encrypted-friendly config", "outcome": "Owner config sets nonanonymous/members-only/persistent and affiliation access if supported.", "depends_on": [ "S12-022", "S13-001" ], "requirements": [ "MUC-003" ], "scope": [ "src/adapters/xmpp/room-config.*", "tests/protocol/room-config.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Owner config sets nonanonymous/members-only/persistent and affiliation access if supported.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Owner config sets nonanonymous/members-only/persistent and affiliation access if supported.", "Supported fields set", "missing rights error not bypass", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Supported fields set", "missing rights error not bypass" ], "context_budget_chars": 48000 }, { "id": "S13-003", "stage": "S13", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать occupants/invitations", "outcome": "Reducer tracks nickname/real JID/count/inviter and pending invite accept.", "depends_on": [ "S12-022", "S13-001" ], "requirements": [ "MUC-002" ], "scope": [ "src/adapters/xmpp/room-occupants.*", "tests/protocol/room-occupants.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Reducer tracks nickname/real JID/count/inviter and pending invite accept.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Reducer tracks nickname/real JID/count/inviter and pending invite accept.", "Leave count update", "invite source valid", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Leave count update", "invite source valid" ], "context_budget_chars": 48000 }, { "id": "S13-004", "stage": "S13", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать affiliation lists", "outcome": "Fetch member/admin/owner lists includes offline recipients and errors on missing full list.", "depends_on": [ "S12-022", "S13-001", "S13-002", "S13-003" ], "requirements": [ "MUC-004" ], "scope": [ "src/adapters/xmpp/room-affiliations.*", "tests/protocol/room-affiliations.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Fetch member/admin/owner lists includes offline recipients and errors on missing full list.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Fetch member/admin/owner lists includes offline recipients and errors on missing full list.", "Offline member included", "denied list fails send", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Offline member included", "denied list fails send" ], "context_budget_chars": 48000 }, { "id": "S13-005", "stage": "S13", "role": "crypto", "reviewer_role": "security", "title": "Реализовать group recipient policy", "outcome": "Recipient set combines occupants/lists, excludes room/active own endpoint and validates devices.", "depends_on": [ "S12-022", "S13-004" ], "requirements": [ "MUC-004", "MUC-005" ], "scope": [ "src/adapters/crypto/group-recipients.*", "tests/crypto/group-recipients.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Recipient set combines occupants/lists, excludes room/active own endpoint and validates devices.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Recipient set combines occupants/lists, excludes room/active own endpoint and validates devices.", "Hidden real JID rejected", "no devices no encrypted send", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Hidden real JID rejected", "no devices no encrypted send" ], "context_budget_chars": 48000 }, { "id": "S13-006", "stage": "S13", "role": "crypto", "reviewer_role": "security", "title": "Подключить encrypted group send", "outcome": "Format selection covers all recipients and emits one compatible groupchat stanza.", "depends_on": [ "S12-022", "S13-005" ], "requirements": [ "MUC-005", "ENC-004" ], "scope": [ "src/adapters/crypto/group-encrypt.*", "tests/crypto/group-encrypt.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Format selection covers all recipients and emits one compatible groupchat stanza.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Format selection covers all recipients and emits one compatible groupchat stanza.", "All support2 uses2", "mixed devices encrypted legacy", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "All support2 uses2", "mixed devices encrypted legacy" ], "context_budget_chars": 48000 }, { "id": "S13-007", "stage": "S13", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать group echo/stanza merge", "outcome": "Own echo learns room stanza ID even when payload duplicate.", "depends_on": [ "S12-022", "S13-003", "S13-006" ], "requirements": [ "MUC-006" ], "scope": [ "src/adapters/xmpp/group-echo.*", "tests/protocol/group-echo.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Own echo learns room stanza ID even when payload duplicate.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Own echo learns room stanza ID even when payload duplicate.", "No duplicate bubble", "reply enabled after stanza ID", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No duplicate bubble", "reply enabled after stanza ID" ], "context_budget_chars": 48000 }, { "id": "S13-008", "stage": "S13", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать saved autojoin", "outcome": "Saved rooms rejoin on current connection only, no stale persisted online.", "depends_on": [ "S12-022", "S13-001", "S13-003" ], "requirements": [ "MUC-002" ], "scope": [ "src/adapters/xmpp/room-autojoin.*", "tests/protocol/room-autojoin.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Saved rooms rejoin on current connection only, no stale persisted online.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Saved rooms rejoin on current connection only, no stale persisted online.", "Reload starts not joined", "logout cancels autojoin", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Reload starts not joined", "logout cancels autojoin" ], "context_budget_chars": 48000 }, { "id": "S13-009", "stage": "S13", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать leave/delete semantics", "outcome": "Leave preserves history; local delete leaves first and suppresses late room session recreation.", "depends_on": [ "S12-022", "S13-001", "S13-007", "S13-008" ], "requirements": [ "MUC-007", "MUC-008" ], "scope": [ "src/adapters/xmpp/room-leave-delete.*", "tests/protocol/room-leave-delete.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Leave preserves history; local delete leaves first and suppresses late room session recreation.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Leave preserves history; local delete leaves first and suppresses late room session recreation.", "Late echo not recreate", "explicit rejoin permitted", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Late echo not recreate", "explicit rejoin permitted" ], "context_budget_chars": 48000 }, { "id": "S13-010", "stage": "S13", "role": "front", "reviewer_role": "qa", "title": "Создать create/join/invite UI", "outcome": "Forms validate invitees/nick/password, state reflects real joined and actionable failures.", "depends_on": [ "S12-022", "S13-002", "S13-003", "S13-008" ], "requirements": [ "MUC-001", "MUC-002" ], "scope": [ "src/ui/group-forms.*", "tests/front/group-forms.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [ 17 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Forms validate invitees/nick/password, state reflects real joined and actionable failures.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Forms validate invitees/nick/password, state reflects real joined and actionable failures.", "Invalid invitee visible", "no false create success", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Invalid invitee visible", "no false create success" ], "context_budget_chars": 48000 }, { "id": "S13-011", "stage": "S13", "role": "front", "reviewer_role": "qa", "title": "Создать GroupInfo", "outcome": "Room state/count/invite/leave/delete show distinct scope confirmations and encryption limits.", "depends_on": [ "S12-022", "S13-005", "S13-009", "S13-010" ], "requirements": [ "MUC-005", "MUC-007" ], "scope": [ "src/ui/group-info.*", "tests/front/group-info.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [ 17 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Room state/count/invite/leave/delete show distinct scope confirmations and encryption limits.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Room state/count/invite/leave/delete show distinct scope confirmations and encryption limits.", "Leave retains history", "delete wording local", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Leave retains history", "delete wording local" ], "context_budget_chars": 48000 }, { "id": "S13-012", "stage": "S13", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить group OMEMO/replies", "outcome": "Real test room verifies offline recipient, room stanza replies and fail-closed hidden lists.", "depends_on": [ "S12-022", "S13-006", "S13-007", "S13-009", "S13-011" ], "requirements": [ "MUC-004", "MUC-005", "MUC-006" ], "scope": [ "tests/acceptance/group-interop.*", "tests/qa/group-interop.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 13 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Real test room verifies offline recipient, room stanza replies and fail-closed hidden lists.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Real test room verifies offline recipient, room stanza replies and fail-closed hidden lists.", "Independent group client reads", "anonymous mode rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Independent group client reads", "anonymous mode rejected" ], "context_budget_chars": 48000 }, { "id": "S13-013", "stage": "S13", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: MUC", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S13-001", "S13-002", "S13-003", "S13-004", "S13-005", "S13-006", "S13-007", "S13-008", "S13-009", "S13-010", "S13-011", "S13-012" ], "requirements": [], "scope": [ "state/evidence/S13-gate.md", "docs/acceptance/S13-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S13.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S14-001", "stage": "S14", "role": "media", "reviewer_role": "qa", "title": "Реализовать file staging", "outcome": "Picker files copied/held as account-bound asset with lifetime/metadata; limit20 explicit.", "depends_on": [ "S13-013" ], "requirements": [ "FILE-002", "FILE-003" ], "scope": [ "src/adapters/media/draft-stage.*", "tests/media/draft-stage.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Picker files copied/held as account-bound asset with lifetime/metadata; limit20 explicit.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Picker files copied/held as account-bound asset with lifetime/metadata; limit20 explicit.", "Expired picker URL no loss", "21 files explained", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Expired picker URL no loss", "21 files explained" ], "context_budget_chars": 48000 }, { "id": "S14-002", "stage": "S14", "role": "media", "reviewer_role": "qa", "title": "Реализовать safe media inference", "outcome": "Kind/MIME/filename sanitization uses bounded metadata, keeps extension and voice prefixes.", "depends_on": [ "S13-013", "S14-001" ], "requirements": [ "FILE-001", "FILE-007" ], "scope": [ "src/adapters/media/file-kind.*", "tests/media/file-kind.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Kind/MIME/filename sanitization uses bounded metadata, keeps extension and voice prefixes.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Kind/MIME/filename sanitization uses bounded metadata, keeps extension and voice prefixes.", "Traversal filename safe", "invalid duration not serialized", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Traversal filename safe", "invalid duration not serialized" ], "context_budget_chars": 48000 }, { "id": "S14-003", "stage": "S14", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать upload discovery/slot", "outcome": "Choose component by encrypted blob size, request slot, validate required headers/URLs.", "depends_on": [ "S13-013", "S14-002" ], "requirements": [ "FILE-005", "FILE-006" ], "scope": [ "src/adapters/xmpp/upload-discovery.*", "tests/protocol/upload-discovery.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Choose component by encrypted blob size, request slot, validate required headers/URLs.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Choose component by encrypted blob size, request slot, validate required headers/URLs.", "Oversize rejected", "HTTPS slot only", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Oversize rejected", "HTTPS slot only" ], "context_budget_chars": 48000 }, { "id": "S14-004", "stage": "S14", "role": "media", "reviewer_role": "qa", "title": "Реализовать PUT with redirect policy", "outcome": "HTTP adapter uploads blob with bounded timeouts/progress and safe origin/header redirects.", "depends_on": [ "S13-013", "S14-003" ], "requirements": [ "FILE-006", "FILE-011", "FILE-012" ], "scope": [ "src/adapters/media/upload-http.*", "tests/media/upload-http.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "HTTP adapter uploads blob with bounded timeouts/progress and safe origin/header redirects.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "HTTP adapter uploads blob with bounded timeouts/progress and safe origin/header redirects.", "2xx succeeds", "insecure/cross-origin header leakage blocked", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "2xx succeeds", "insecure/cross-origin header leakage blocked" ], "context_budget_chars": 48000 }, { "id": "S14-005", "stage": "S14", "role": "crypto", "reviewer_role": "security", "title": "Подключить file encryption до PUT", "outcome": "Encrypted blob/key fragment lifecycle stays client-side; no plaintext/key in upload.", "depends_on": [ "S13-013", "S14-002", "S14-004" ], "requirements": [ "FILE-004" ], "scope": [ "src/adapters/crypto/upload-encrypt.*", "tests/crypto/upload-encrypt.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Encrypted blob/key fragment lifecycle stays client-side; no plaintext/key in upload.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Encrypted blob/key fragment lifecycle stays client-side; no plaintext/key in upload.", "Upload sees ciphertext", "wrong key cannot decrypt", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Upload sees ciphertext", "wrong key cannot decrypt" ], "context_budget_chars": 48000 }, { "id": "S14-006", "stage": "S14", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать media message body", "outcome": "Compatible URL body/OOB and encrypted key transport preserve extension/type metadata.", "depends_on": [ "S13-013", "S14-005" ], "requirements": [ "FILE-007", "FILE-008" ], "scope": [ "src/adapters/xmpp/media-stanza.*", "tests/protocol/media-stanza.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Compatible URL body/OOB and encrypted key transport preserve extension/type metadata.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Compatible URL body/OOB and encrypted key transport preserve extension/type metadata.", "Plain OOB works", "encrypted URL only protected body", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Plain OOB works", "encrypted URL only protected body" ], "context_budget_chars": 48000 }, { "id": "S14-007", "stage": "S14", "role": "media", "reviewer_role": "qa", "title": "Реализовать upload retry/cancel", "outcome": "Two attempts only retryable failures with Retry-After and immutable send context.", "depends_on": [ "S13-013", "S14-004", "S14-006" ], "requirements": [ "FILE-010", "FILE-011" ], "scope": [ "src/adapters/media/upload-retry.*", "tests/media/upload-retry.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Two attempts only retryable failures with Retry-After and immutable send context.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Two attempts only retryable failures with Retry-After and immutable send context.", "429 respects delay", "permanent4xx/cancel not retried", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "429 respects delay", "permanent4xx/cancel not retried" ], "context_budget_chars": 48000 }, { "id": "S14-008", "stage": "S14", "role": "media", "reviewer_role": "qa", "title": "Реализовать HTTPS/aesgcm download", "outcome": "URL/key separated before request and vetted decrypt follows successful HTTP response.", "depends_on": [ "S13-013", "S14-005" ], "requirements": [ "FILE-004", "FILE-006" ], "scope": [ "src/adapters/media/download.*", "tests/media/download.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "URL/key separated before request and vetted decrypt follows successful HTTP response.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "URL/key separated before request and vetted decrypt follows successful HTTP response.", "Fragment not sent", "tamper/insecure redirect rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Fragment not sent", "tamper/insecure redirect rejected" ], "context_budget_chars": 48000 }, { "id": "S14-009", "stage": "S14", "role": "media", "reviewer_role": "qa", "title": "Реализовать sequential batch", "outcome": "Successful drafts removed, failed remain, caption last with separate outcome.", "depends_on": [ "S13-013", "S14-006", "S14-007" ], "requirements": [ "FILE-009" ], "scope": [ "src/adapters/media/batch-send.*", "tests/media/batch-send.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Successful drafts removed, failed remain, caption last with separate outcome.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Successful drafts removed, failed remain, caption last with separate outcome.", "Partial batch preserves failures", "caption error no rollback", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Partial batch preserves failures", "caption error no rollback" ], "context_budget_chars": 48000 }, { "id": "S14-010", "stage": "S14", "role": "media", "reviewer_role": "qa", "title": "Реализовать media forwarding", "outcome": "Resolve/decrypt old asset then reupload with new identity/policy and attribution.", "depends_on": [ "S13-013", "S14-008", "S14-009" ], "requirements": [ "FWD-003" ], "scope": [ "src/adapters/media/forward-media.*", "tests/media/forward-media.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Resolve/decrypt old asset then reupload with new identity/policy and attribution.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Resolve/decrypt old asset then reupload with new identity/policy and attribution.", "New recipient key", "original URI not reused", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "New recipient key", "original URI not reused" ], "context_budget_chars": 48000 }, { "id": "S14-011", "stage": "S14", "role": "front", "reviewer_role": "qa", "title": "Создать batch preview UI", "outcome": "Grid/remove/caption/progress/retry are bound to drafts and partial outcomes.", "depends_on": [ "S13-013", "S14-001", "S14-002", "S14-009" ], "requirements": [ "FILE-002", "FILE-009" ], "scope": [ "src/ui/attachment-preview.*", "tests/front/attachment-preview.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Grid/remove/caption/progress/retry are bound to drafts and partial outcomes.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Grid/remove/caption/progress/retry are bound to drafts and partial outcomes.", "20 items readable", "failed items stay after network error", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "20 items readable", "failed items stay after network error" ], "context_budget_chars": 48000 }, { "id": "S14-012", "stage": "S14", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить upload integration", "outcome": "Browser/server fixtures cover CORS, redirects, slot/PUT/XMPP failures and cancel.", "depends_on": [ "S13-013", "S14-007", "S14-008", "S14-010", "S14-011" ], "requirements": [ "FILE-006", "FILE-010", "FILE-012" ], "scope": [ "tests/acceptance/upload-failures.*", "tests/qa/upload-failures.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 15 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Browser/server fixtures cover CORS, redirects, slot/PUT/XMPP failures and cancel.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Browser/server fixtures cover CORS, redirects, slot/PUT/XMPP failures and cancel.", "PUT success + send failure explicit", "no stuck activity", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "PUT success + send failure explicit", "no stuck activity" ], "context_budget_chars": 48000 }, { "id": "S14-013", "stage": "S14", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Файлы и upload", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S14-001", "S14-002", "S14-003", "S14-004", "S14-005", "S14-006", "S14-007", "S14-008", "S14-009", "S14-010", "S14-011", "S14-012" ], "requirements": [ "FWD-001", "FWD-002", "FWD-004" ], "scope": [ "state/evidence/S14-gate.md", "docs/acceptance/S14-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S14.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S15-001", "stage": "S15", "role": "media", "reviewer_role": "qa", "title": "Создать media thumbnail worker", "outcome": "Photo/video thumbnails preserve orientation, bound dimensions/resources and typed errors.", "depends_on": [ "S14-013" ], "requirements": [ "MEDIA-001", "MEDIA-008" ], "scope": [ "src/adapters/media/preview-worker.*", "tests/media/preview-worker.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Photo/video thumbnails preserve orientation, bound dimensions/resources and typed errors.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Photo/video thumbnails preserve orientation, bound dimensions/resources and typed errors.", "Portrait video upright", "unsupported codec explicit", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Portrait video upright", "unsupported codec explicit" ], "context_budget_chars": 48000 }, { "id": "S15-002", "stage": "S15", "role": "storage", "reviewer_role": "qa", "title": "Подключить deduplicated preview cache", "outcome": "One in-flight download per asset/account, bounded cache and object URL cleanup.", "depends_on": [ "S14-013", "S15-001" ], "requirements": [ "MEDIA-005" ], "scope": [ "src/adapters/storage/preview-cache.*", "tests/storage/preview-cache.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/persistence.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "One in-flight download per asset/account, bounded cache and object URL cleanup.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "One in-flight download per asset/account, bounded cache and object URL cleanup.", "Repeat row no extra download", "logout revokes URLs", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Repeat row no extra download", "logout revokes URLs" ], "context_budget_chars": 48000 }, { "id": "S15-003", "stage": "S15", "role": "front", "reviewer_role": "qa", "title": "Создать photo/video island", "outcome": "Contain preview268 adaptive, overlays/title/loading/error do not crop bitmap.", "depends_on": [ "S14-013", "S15-001", "S15-002" ], "requirements": [ "MEDIA-001" ], "scope": [ "src/ui/media-island.*", "tests/front/media-island.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [ 17, 18 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Contain preview268 adaptive, overlays/title/loading/error do not crop bitmap.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Contain preview268 adaptive, overlays/title/loading/error do not crop bitmap.", "320 viewport fits", "tall/wide ratio preserved", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "320 viewport fits", "tall/wide ratio preserved" ], "context_budget_chars": 48000 }, { "id": "S15-004", "stage": "S15", "role": "media", "reviewer_role": "qa", "title": "Реализовать playback coordinator", "outcome": "Single app playback, seek/rate/end/focus interrupt and track cleanup.", "depends_on": [ "S14-013" ], "requirements": [ "MEDIA-002", "MEDIA-003" ], "scope": [ "src/adapters/media/audio-coordinator.*", "tests/media/audio-coordinator.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Single app playback, seek/rate/end/focus interrupt and track cleanup.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Single app playback, seek/rate/end/focus interrupt and track cleanup.", "Second player pauses first", "audio focus interrupted safely", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Second player pauses first", "audio focus interrupted safely" ], "context_budget_chars": 48000 }, { "id": "S15-005", "stage": "S15", "role": "front", "reviewer_role": "qa", "title": "Создать voice/audio controls", "outcome": "Player252 adaptive, waveform/seek/duration/speed and accessible slider.", "depends_on": [ "S14-013", "S15-004" ], "requirements": [ "MEDIA-002" ], "scope": [ "src/ui/audio-player.*", "tests/front/audio-player.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [ 17, 18 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Player252 adaptive, waveform/seek/duration/speed and accessible slider.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Player252 adaptive, waveform/seek/duration/speed and accessible slider.", "Keyboard seek", "loading/failed not fake playback", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Keyboard seek", "loading/failed not fake playback" ], "context_budget_chars": 48000 }, { "id": "S15-006", "stage": "S15", "role": "front", "reviewer_role": "qa", "title": "Создать round videoNote player", "outcome": "Circle idle144/playing176 adaptive with exclusive playback and safe resizing.", "depends_on": [ "S14-013", "S15-001", "S15-004" ], "requirements": [ "MEDIA-004" ], "scope": [ "src/ui/video-note.*", "tests/front/video-note.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [ 17, 18 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Circle idle144/playing176 adaptive with exclusive playback and safe resizing.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Circle idle144/playing176 adaptive with exclusive playback and safe resizing.", "Playback ends returns idle", "no viewport yank", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Playback ends returns idle", "no viewport yank" ], "context_budget_chars": 48000 }, { "id": "S15-007", "stage": "S15", "role": "front", "reviewer_role": "qa", "title": "Создать full-window viewer", "outcome": "Photo zoom/pan and video controls support Close/Escape/Back/focus restore.", "depends_on": [ "S14-013", "S15-003", "S15-004" ], "requirements": [ "MEDIA-002", "MEDIA-007" ], "scope": [ "src/ui/viewer.*", "tests/front/viewer.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [ 17, 18 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Photo zoom/pan and video controls support Close/Escape/Back/focus restore.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Photo zoom/pan and video controls support Close/Escape/Back/focus restore.", "Zoom pan not dismiss", "close restores trigger", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Zoom pan not dismiss", "close restores trigger" ], "context_budget_chars": 48000 }, { "id": "S15-008", "stage": "S15", "role": "media", "reviewer_role": "qa", "title": "Реализовать explicit export/download", "outcome": "Browser save flow exposes correct filename/type and cancellation outcome.", "depends_on": [ "S14-013", "S15-002" ], "requirements": [ "MEDIA-006", "SEC-006" ], "scope": [ "src/adapters/media/export.*", "tests/media/export.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Browser save flow exposes correct filename/type and cancellation outcome.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Browser save flow exposes correct filename/type and cancellation outcome.", "Cancel no saved toast", "decrypted export explicit", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Cancel no saved toast", "decrypted export explicit" ], "context_budget_chars": 48000 }, { "id": "S15-009", "stage": "S15", "role": "front", "reviewer_role": "qa", "title": "Подключить media menus/errors", "outcome": "Save/open/fallback actions reflect asset availability and unsupported codec.", "depends_on": [ "S14-013", "S15-005", "S15-006", "S15-007", "S15-008" ], "requirements": [ "MEDIA-006", "MEDIA-008" ], "scope": [ "src/ui/save-actions.*", "tests/front/save-actions.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [ 17, 18 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Save/open/fallback actions reflect asset availability and unsupported codec.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Save/open/fallback actions reflect asset availability and unsupported codec.", "Broken codec download fallback", "no auto-export", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Broken codec download fallback", "no auto-export" ], "context_budget_chars": 48000 }, { "id": "S15-010", "stage": "S15", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить browser media states", "outcome": "Focused real browser suite covers playback/exclusive/viewer/export and resources.", "depends_on": [ "S14-013", "S15-003", "S15-005", "S15-006", "S15-007", "S15-008", "S15-009" ], "requirements": [ "MEDIA-001", "MEDIA-003", "MEDIA-007" ], "scope": [ "tests/acceptance/media-browser.*", "tests/qa/media-browser.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 16 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Focused real browser suite covers playback/exclusive/viewer/export and resources.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Focused real browser suite covers playback/exclusive/viewer/export and resources.", "Object URLs cleaned", "repeated opening no stuck player", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Object URLs cleaned", "repeated opening no stuck player" ], "context_budget_chars": 48000 }, { "id": "S15-011", "stage": "S15", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Просмотр медиа", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S15-001", "S15-002", "S15-003", "S15-004", "S15-005", "S15-006", "S15-007", "S15-008", "S15-009", "S15-010" ], "requirements": [], "scope": [ "state/evidence/S15-gate.md", "docs/acceptance/S15-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S15.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S16-001", "stage": "S16", "role": "media", "reviewer_role": "qa", "title": "Реализовать permission adapter", "outcome": "Camera/mic/location requested only by user action with denied/revoked states.", "depends_on": [ "S15-011" ], "requirements": [ "REC-001", "GEO-001" ], "scope": [ "src/adapters/media/permission-policy.*", "tests/media/permission-policy.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Camera/mic/location requested only by user action with denied/revoked states.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Camera/mic/location requested only by user action with denied/revoked states.", "Denied leaves text usable", "revocation ends tracks", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Denied leaves text usable", "revocation ends tracks" ], "context_budget_chars": 48000 }, { "id": "S16-002", "stage": "S16", "role": "media", "reviewer_role": "qa", "title": "Реализовать voice recorder", "outcome": "Start/finish/cancel/duration and minimum0.4s return stable staged asset.", "depends_on": [ "S15-011", "S16-001" ], "requirements": [ "REC-002" ], "scope": [ "src/adapters/media/voice-recorder.*", "tests/media/voice-recorder.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Start/finish/cancel/duration and minimum0.4s return stable staged asset.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Start/finish/cancel/duration and minimum0.4s return stable staged asset.", "Too short rejected", "cancel deletes temporary output", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Too short rejected", "cancel deletes temporary output" ], "context_budget_chars": 48000 }, { "id": "S16-003", "stage": "S16", "role": "media", "reviewer_role": "qa", "title": "Реализовать videoNote recorder", "outcome": "Capture limits60s, orientation/min-duration and camera selection follow approved browser format.", "depends_on": [ "S15-011", "S16-001" ], "requirements": [ "REC-003" ], "scope": [ "src/adapters/media/video-note-recorder.*", "tests/media/video-note-recorder.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Capture limits60s, orientation/min-duration and camera selection follow approved browser format.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Capture limits60s, orientation/min-duration and camera selection follow approved browser format.", "60s finishes", "invalid output not autosent", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "60s finishes", "invalid output not autosent" ], "context_budget_chars": 48000 }, { "id": "S16-004", "stage": "S16", "role": "media", "reviewer_role": "qa", "title": "Реализовать early-stop/finalization", "outcome": "Async start/cancel/interruption/timeout resolves once and stops all tracks.", "depends_on": [ "S15-011", "S16-002", "S16-003" ], "requirements": [ "REC-004", "REC-005" ], "scope": [ "src/adapters/media/capture-lifecycle.*", "tests/media/capture-lifecycle.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Async start/cancel/interruption/timeout resolves once and stops all tracks.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Async start/cancel/interruption/timeout resolves once and stops all tracks.", "Release before start", "partial interruption not autosend", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Release before start", "partial interruption not autosend" ], "context_budget_chars": 48000 }, { "id": "S16-005", "stage": "S16", "role": "front", "reviewer_role": "qa", "title": "Создать accessible capture controls", "outcome": "Touch hold/lock/cancel and explicit pointer/keyboard start/stop/cancel show real state.", "depends_on": [ "S15-011", "S16-004" ], "requirements": [ "REC-006", "UI-A11Y-008" ], "scope": [ "src/ui/record-controls.*", "tests/front/record-controls.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [ 16, 19, 23 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Touch hold/lock/cancel and explicit pointer/keyboard start/stop/cancel show real state.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Touch hold/lock/cancel and explicit pointer/keyboard start/stop/cancel show real state.", "Keyboard records", "early cancel no hidden capture", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Keyboard records", "early cancel no hidden capture" ], "context_budget_chars": 48000 }, { "id": "S16-006", "stage": "S16", "role": "media", "reviewer_role": "qa", "title": "Реализовать geo URI codec", "outcome": "Finite range/uncertainty validation and stable serialization use agreed contract.", "depends_on": [ "S15-011" ], "requirements": [ "GEO-003" ], "scope": [ "src/adapters/media/geo-uri.*", "tests/media/geo-uri.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Finite range/uncertainty validation and stable serialization use agreed contract.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Finite range/uncertainty validation and stable serialization use agreed contract.", "Boundary valid", "NaN/out-of-range rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Boundary valid", "NaN/out-of-range rejected" ], "context_budget_chars": 48000 }, { "id": "S16-007", "stage": "S16", "role": "media", "reviewer_role": "qa", "title": "Реализовать current location adapter", "outcome": "One-shot position with permission/error/cancel, no background watch.", "depends_on": [ "S15-011", "S16-001", "S16-006" ], "requirements": [ "GEO-001", "GEO-002" ], "scope": [ "src/adapters/media/geo-provider.*", "tests/media/geo-provider.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/media.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/media.md (upstream artifact S01)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "One-shot position with permission/error/cancel, no background watch.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "One-shot position with permission/error/cancel, no background watch.", "Denied handled", "cancel late location ignored", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Denied handled", "cancel late location ignored" ], "context_budget_chars": 48000 }, { "id": "S16-008", "stage": "S16", "role": "front", "reviewer_role": "qa", "title": "Создать manual location picker", "outcome": "Map/current point and coordinate input remain usable without GPS/map provider.", "depends_on": [ "S15-011", "S16-006", "S16-007" ], "requirements": [ "GEO-002", "GEO-003" ], "scope": [ "src/ui/location-picker.*", "tests/front/location-picker.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [ 16, 19, 23 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Map/current point and coordinate input remain usable without GPS/map provider.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Map/current point and coordinate input remain usable without GPS/map provider.", "Denied manual point works", "keyboard alternatives", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Denied manual point works", "keyboard alternatives" ], "context_budget_chars": 48000 }, { "id": "S16-009", "stage": "S16", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить maps provider disclosure", "outcome": "Provider/data disclosure matches actual tile/coordinate requests, no OMEMO claim for map calls.", "depends_on": [ "S15-011", "S16-008" ], "requirements": [ "GEO-004", "SEC-002" ], "scope": [ "tests/security/maps-privacy.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Provider/data disclosure matches actual tile/coordinate requests, no OMEMO claim for map calls.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Provider/data disclosure matches actual tile/coordinate requests, no OMEMO claim for map calls.", "Network request documented", "no secret provider config", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Network request documented", "no secret provider config" ], "context_budget_chars": 48000 }, { "id": "S16-010", "stage": "S16", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить capture/geo flows", "outcome": "Permission fixtures and real supported capture produce valid media/geo send with cleanup.", "depends_on": [ "S15-011", "S16-005", "S16-008", "S16-009" ], "requirements": [ "REC-001", "REC-004", "REC-005", "GEO-002" ], "scope": [ "tests/acceptance/capture-geo-tests.*", "tests/qa/capture-geo-tests.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 17 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Permission fixtures and real supported capture produce valid media/geo send with cleanup.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Permission fixtures and real supported capture produce valid media/geo send with cleanup.", "No devices fallback", "interruption requires confirmation", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No devices fallback", "interruption requires confirmation" ], "context_budget_chars": 48000 }, { "id": "S16-011", "stage": "S16", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Recording и геопозиция", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S16-001", "S16-002", "S16-003", "S16-004", "S16-005", "S16-006", "S16-007", "S16-008", "S16-009", "S16-010" ], "requirements": [], "scope": [ "state/evidence/S16-gate.md", "docs/acceptance/S16-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S16.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S17-001", "stage": "S17", "role": "realtime", "reviewer_role": "qa", "title": "Реализовать call state machine", "outcome": "Pure states enforce one active call, transitions and exactly one terminal outcome.", "depends_on": [ "S16-011" ], "requirements": [ "CALL-001", "CALL-011", "CALL-012" ], "scope": [ "src/adapters/calls/call-state.*", "tests/realtime/call-state.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/calls.md (upstream artifact S01)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Pure states enforce one active call, transitions and exactly one terminal outcome.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Pure states enforce one active call, transitions and exactly one terminal outcome.", "Second call busy", "duplicate terminate no double event", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Second call busy", "duplicate terminate no double event" ], "context_budget_chars": 48000 }, { "id": "S17-002", "stage": "S17", "role": "realtime", "reviewer_role": "qa", "title": "Реализовать full JID selection", "outcome": "Presence/caps choose endpoint and subsequent signaling stays bound to it.", "depends_on": [ "S16-011", "S17-001" ], "requirements": [ "CALL-004" ], "scope": [ "src/adapters/calls/endpoint-selection.*", "tests/realtime/endpoint-selection.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/calls.md (upstream artifact S01)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Presence/caps choose endpoint and subsequent signaling stays bound to it.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Presence/caps choose endpoint and subsequent signaling stays bound to it.", "Bare proceed handled", "different resource rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Bare proceed handled", "different resource rejected" ], "context_budget_chars": 48000 }, { "id": "S17-003", "stage": "S17", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать JMI adapter", "outcome": "Propose/proceed/reject/retract handlers validate source/id and direct IQ fallback.", "depends_on": [ "S16-011", "S17-002" ], "requirements": [ "CALL-004" ], "scope": [ "src/adapters/xmpp/jmi.*", "tests/protocol/jmi.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Propose/proceed/reject/retract handlers validate source/id and direct IQ fallback.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Propose/proceed/reject/retract handlers validate source/id and direct IQ fallback.", "Supported JMI route", "unknown stale proposal ignored", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Supported JMI route", "unknown stale proposal ignored" ], "context_budget_chars": 48000 }, { "id": "S17-004", "stage": "S17", "role": "realtime", "reviewer_role": "qa", "title": "Создать WebRTC media adapter", "outcome": "Peer connection lifecycle owns tracks/config and typed permission/device failures.", "depends_on": [ "S16-011", "S17-001" ], "requirements": [ "CALL-002", "CALL-010" ], "scope": [ "src/adapters/calls/peerconnection.*", "tests/realtime/peerconnection.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/calls.md (upstream artifact S01)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Peer connection lifecycle owns tracks/config and typed permission/device failures.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Peer connection lifecycle owns tracks/config and typed permission/device failures.", "Local tracks ready", "create failure cleans microphone", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Local tracks ready", "create failure cleans microphone" ], "context_budget_chars": 48000 }, { "id": "S17-005", "stage": "S17", "role": "realtime", "reviewer_role": "qa", "title": "Реализовать Jingle/SDP codec", "outcome": "Accepted library conversion preserves offer media ordering and valid descriptions.", "depends_on": [ "S16-011", "S17-003", "S17-004" ], "requirements": [ "CALL-005" ], "scope": [ "src/adapters/calls/sdp-codec.*", "tests/realtime/sdp-codec.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/calls.md (upstream artifact S01)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Accepted library conversion preserves offer media ordering and valid descriptions.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Accepted library conversion preserves offer media ordering and valid descriptions.", "Audio/video sections stable", "incompatible answer rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Audio/video sections stable", "incompatible answer rejected" ], "context_budget_chars": 48000 }, { "id": "S17-006", "stage": "S17", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать extdisco ICE validation", "outcome": "Validate schemes/transport/expiry/credential pair and disclosed fallback config.", "depends_on": [ "S16-011" ], "requirements": [ "CALL-006", "CALL-008" ], "scope": [ "src/adapters/xmpp/ice-services.*", "tests/protocol/ice-services.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Validate schemes/transport/expiry/credential pair and disclosed fallback config.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Validate schemes/transport/expiry/credential pair and disclosed fallback config.", "Expired TURN dropped", "public fallback explicitly configured", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Expired TURN dropped", "public fallback explicitly configured" ], "context_budget_chars": 48000 }, { "id": "S17-007", "stage": "S17", "role": "realtime", "reviewer_role": "qa", "title": "Реализовать trickle candidate queues", "outcome": "Queue candidates until remote description ready, then route to selected resource.", "depends_on": [ "S16-011", "S17-002", "S17-005", "S17-006" ], "requirements": [ "CALL-005" ], "scope": [ "src/adapters/calls/ice-candidates.*", "tests/realtime/ice-candidates.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/calls.md (upstream artifact S01)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Queue candidates until remote description ready, then route to selected resource.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Queue candidates until remote description ready, then route to selected resource.", "Late candidates applied", "no queued forever on bare/full mismatch", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Late candidates applied", "no queued forever on bare/full mismatch" ], "context_budget_chars": 48000 }, { "id": "S17-008", "stage": "S17", "role": "realtime", "reviewer_role": "qa", "title": "Реализовать mute/camera/route use cases", "outcome": "Controls update actual tracks/output capability and expose unavailable actions.", "depends_on": [ "S16-011", "S17-004" ], "requirements": [ "CALL-003" ], "scope": [ "src/adapters/calls/call-controls.*", "tests/realtime/call-controls.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/calls.md (upstream artifact S01)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Controls update actual tracks/output capability and expose unavailable actions.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Controls update actual tracks/output capability and expose unavailable actions.", "Mute reflects track", "single camera switch unavailable", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Mute reflects track", "single camera switch unavailable" ], "context_budget_chars": 48000 }, { "id": "S17-009", "stage": "S17", "role": "realtime", "reviewer_role": "qa", "title": "Реализовать ringing/recovery deadlines", "outcome": "Bounded ringing/negotiation/ICE recovery terminates once and releases tracks.", "depends_on": [ "S16-011", "S17-001", "S17-007" ], "requirements": [ "CALL-009", "CALL-010" ], "scope": [ "src/adapters/calls/call-timeouts.*", "tests/realtime/call-timeouts.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/calls.md (upstream artifact S01)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Bounded ringing/negotiation/ICE recovery terminates once and releases tracks.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Bounded ringing/negotiation/ICE recovery terminates once and releases tracks.", "Late ICE within grace recovers", "timeout cleanup", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Late ICE within grace recovers", "timeout cleanup" ], "context_budget_chars": 48000 }, { "id": "S17-010", "stage": "S17", "role": "realtime", "reviewer_role": "qa", "title": "Реализовать history outcome policy", "outcome": "Connected precedence/duration and missed/declined/cancelled/unanswered mapping are pure.", "depends_on": [ "S16-011", "S17-001", "S17-009" ], "requirements": [ "CALL-011", "CALL-012" ], "scope": [ "src/adapters/calls/call-outcomes.*", "tests/realtime/call-outcomes.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/realtime.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/calls.md (upstream artifact S01)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Connected precedence/duration and missed/declined/cancelled/unanswered mapping are pure.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Connected precedence/duration and missed/declined/cancelled/unanswered mapping are pure.", "Connected transport loss completed", "missed incoming unread", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Connected transport loss completed", "missed incoming unread" ], "context_budget_chars": 48000 }, { "id": "S17-011", "stage": "S17", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать own-device call history", "outcome": "Custom payload validates own source and deduplicates history across MAM/Carbons.", "depends_on": [ "S16-011", "S17-010" ], "requirements": [ "CALL-013", "SEC-008" ], "scope": [ "src/adapters/xmpp/call-sync.*", "tests/protocol/call-sync.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Custom payload validates own source and deduplicates history across MAM/Carbons.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Custom payload validates own source and deduplicates history across MAM/Carbons.", "Forged peer ignored", "replay one card", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Forged peer ignored", "replay one card" ], "context_budget_chars": 48000 }, { "id": "S17-012", "stage": "S17", "role": "front", "reviewer_role": "qa", "title": "Создать CallScene/HistoryCard", "outcome": "Incoming/connecting/connected/permissions controls and focus match real tracks/outcome.", "depends_on": [ "S16-011", "S17-008", "S17-009", "S17-010", "S17-011" ], "requirements": [ "CALL-002", "CALL-003", "CALL-010" ], "scope": [ "src/ui/call-scene.*", "tests/front/call-scene.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [ 20 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Incoming/connecting/connected/permissions controls and focus match real tracks/outcome.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Incoming/connecting/connected/permissions controls and focus match real tracks/outcome.", "Keyboard accept/hangup", "no hidden capture after close", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Keyboard accept/hangup", "no hidden capture after close" ], "context_budget_chars": 48000 }, { "id": "S17-013", "stage": "S17", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить NAT/TURN/endpoint scenarios", "outcome": "Dedicated WebRTC/XMPP fixtures and test peers exercise TURN relay and SDP/full-JID flow.", "depends_on": [ "S16-011", "S17-006", "S17-007", "S17-009", "S17-012" ], "requirements": [ "CALL-004", "CALL-005", "CALL-006", "CALL-007" ], "scope": [ "tests/acceptance/call-network-tests.*", "tests/qa/call-network-tests.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 19 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Dedicated WebRTC/XMPP fixtures and test peers exercise TURN relay and SDP/full-JID flow.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Dedicated WebRTC/XMPP fixtures and test peers exercise TURN relay and SDP/full-JID flow.", "Two test endpoints connect", "no TURN limitation explicit", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Two test endpoints connect", "no TURN limitation explicit" ], "context_budget_chars": 48000 }, { "id": "S17-014", "stage": "S17", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Личные звонки", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "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" ], "requirements": [], "scope": [ "state/evidence/S17-gate.md", "docs/acceptance/S17-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S17.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S18-001", "stage": "S18", "role": "backend", "reviewer_role": "security", "title": "Создать gateway service shell", "outcome": "Accepted backend runtime starts validated config/health without real credentials in code.", "depends_on": [ "S17-014" ], "requirements": [ "PUSH-001", "SEC-003" ], "scope": [ "services/push/gateway-skeleton.*", "tests/backend/gateway-skeleton.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/backend.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Accepted backend runtime starts validated config/health without real credentials in code.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Accepted backend runtime starts validated config/health without real credentials in code.", "Health no secrets", "missing provider secret startup rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Health no secrets", "missing provider secret startup rejected" ], "context_budget_chars": 48000 }, { "id": "S18-002", "stage": "S18", "role": "backend", "reviewer_role": "security", "title": "Реализовать subscription storage", "outcome": "Versioned binding stores opaque endpoint/key material/account ownership and retention.", "depends_on": [ "S17-014", "S18-001" ], "requirements": [ "PUSH-005" ], "scope": [ "services/push/subscription-schema.*", "tests/backend/subscription-schema.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/backend.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Versioned binding stores opaque endpoint/key material/account ownership and retention.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Versioned binding stores opaque endpoint/key material/account ownership and retention.", "Account isolation", "invalid endpoint rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Account isolation", "invalid endpoint rejected" ], "context_budget_chars": 48000 }, { "id": "S18-003", "stage": "S18", "role": "backend", "reviewer_role": "security", "title": "Реализовать ownership proof", "outcome": "Registration API validates approved auth proof binding account/session/subscription.", "depends_on": [ "S17-014", "S18-002" ], "requirements": [ "PUSH-005", "SEC-008" ], "scope": [ "services/push/binding-auth.*", "tests/backend/binding-auth.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/backend.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Registration API validates approved auth proof binding account/session/subscription.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Registration API validates approved auth proof binding account/session/subscription.", "Forged account denied", "expired proof rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Forged account denied", "expired proof rejected" ], "context_budget_chars": 48000 }, { "id": "S18-004", "stage": "S18", "role": "backend", "reviewer_role": "security", "title": "Реализовать API limits/origin policy", "outcome": "Origin/CORS/CSRF as contract, bounded payload/rate and no open relay/subscription listing.", "depends_on": [ "S17-014", "S18-003" ], "requirements": [ "SEC-004", "SEC-005" ], "scope": [ "services/push/api-policy.*", "tests/backend/api-policy.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/backend.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Origin/CORS/CSRF as contract, bounded payload/rate and no open relay/subscription listing.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Origin/CORS/CSRF as contract, bounded payload/rate and no open relay/subscription listing.", "Cross-origin unauthorized rejected", "rate limit deterministic", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Cross-origin unauthorized rejected", "rate limit deterministic" ], "context_budget_chars": 48000 }, { "id": "S18-005", "stage": "S18", "role": "backend", "reviewer_role": "security", "title": "Реализовать Web Push provider adapter", "outcome": "Minimal opaque notification events delivered using server-held keys and provider status mapping.", "depends_on": [ "S17-014", "S18-004" ], "requirements": [ "PUSH-004", "PUSH-005" ], "scope": [ "services/push/provider-delivery.*", "tests/backend/provider-delivery.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/backend.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Minimal opaque notification events delivered using server-held keys and provider status mapping.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Minimal opaque notification events delivered using server-held keys and provider status mapping.", "410 expires binding", "plaintext body/key not included", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "410 expires binding", "plaintext body/key not included" ], "context_budget_chars": 48000 }, { "id": "S18-006", "stage": "S18", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать XMPP enable/disable", "outcome": "Client register/rotate/disable lifecycle distinguishes server feature from actual registration.", "depends_on": [ "S17-014", "S18-003", "S18-005" ], "requirements": [ "PUSH-005" ], "scope": [ "src/adapters/xmpp/xmpp-push-registration.*", "tests/protocol/xmpp-push-registration.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Client register/rotate/disable lifecycle distinguishes server feature from actual registration.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Client register/rotate/disable lifecycle distinguishes server feature from actual registration.", "Logout disables", "advertised-only not green registered", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Logout disables", "advertised-only not green registered" ], "context_budget_chars": 48000 }, { "id": "S18-007", "stage": "S18", "role": "front", "reviewer_role": "qa", "title": "Создать notification preferences", "outcome": "Permission requested after action with denied/unsupported/foreground-only status and preview preference.", "depends_on": [ "S17-014", "S18-006" ], "requirements": [ "PUSH-001", "PUSH-004", "WEB-001" ], "scope": [ "src/ui/push-permission.*", "tests/front/push-permission.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Permission requested after action with denied/unsupported/foreground-only status and preview preference.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Permission requested after action with denied/unsupported/foreground-only status and preview preference.", "Denied no prompt loop", "lock default hides preview", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Denied no prompt loop", "lock default hides preview" ], "context_budget_chars": 48000 }, { "id": "S18-008", "stage": "S18", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать event notification policy", "outcome": "New incoming only;active chat suppresses banner;push/live share idempotency key.", "depends_on": [ "S17-014", "S18-006" ], "requirements": [ "PUSH-002", "PUSH-003", "PUSH-006" ], "scope": [ "src/adapters/xmpp/notification-policy.*", "tests/protocol/notification-policy.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "New incoming only;active chat suppresses banner;push/live share idempotency key.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "New incoming only;active chat suppresses banner;push/live share idempotency key.", "MAM/outgoing no alert", "push+live one notification", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "MAM/outgoing no alert", "push+live one notification" ], "context_budget_chars": 48000 }, { "id": "S18-009", "stage": "S18", "role": "front", "reviewer_role": "qa", "title": "Реализовать service worker push", "outcome": "Worker consumes minimal payload and displays supported notification; not persistent XMPP/media.", "depends_on": [ "S17-014", "S18-005", "S18-007", "S18-008" ], "requirements": [ "WEB-001", "WEB-002" ], "scope": [ "src/ui/service-worker.*", "tests/front/service-worker.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Worker consumes minimal payload and displays supported notification; not persistent XMPP/media.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Worker consumes minimal payload and displays supported notification; not persistent XMPP/media.", "Closed-page notification", "no claim live microphone", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Closed-page notification", "no claim live microphone" ], "context_budget_chars": 48000 }, { "id": "S18-010", "stage": "S18", "role": "front", "reviewer_role": "qa", "title": "Реализовать safe notification routing", "outcome": "Click resolves account/chat event and revalidates call expiration before opening.", "depends_on": [ "S17-014", "S18-008", "S18-009" ], "requirements": [ "WEB-003", "PUSH-003", "PUSH-007" ], "scope": [ "src/ui/notification-open.*", "tests/front/notification-open.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Click resolves account/chat event and revalidates call expiration before opening.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Click resolves account/chat event and revalidates call expiration before opening.", "Stale call not accepted", "old account doesn't open wrong chat", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Stale call not accepted", "old account doesn't open wrong chat" ], "context_budget_chars": 48000 }, { "id": "S18-011", "stage": "S18", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать multi-tab leader", "outcome": "Approved browser coordination serializes crypto writes/active session and handles crashed leader.", "depends_on": [ "S17-014" ], "requirements": [ "WEB-004" ], "scope": [ "src/adapters/xmpp/tab-coordination.*", "tests/protocol/tab-coordination.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Approved browser coordination serializes crypto writes/active session and handles crashed leader.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Approved browser coordination serializes crypto writes/active session and handles crashed leader.", "Two tabs no ratchet race", "leader lost recovers", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Two tabs no ratchet race", "leader lost recovers" ], "context_budget_chars": 48000 }, { "id": "S18-012", "stage": "S18", "role": "backend", "reviewer_role": "security", "title": "Реализовать revoke/expiry/rotation", "outcome": "Unregister and token replacement idempotent, old owner no longer deliverable.", "depends_on": [ "S17-014", "S18-003", "S18-005", "S18-006" ], "requirements": [ "PUSH-005", "PUSH-007" ], "scope": [ "services/push/revoke-rotation.*", "tests/backend/revoke-rotation.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/backend.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Unregister and token replacement idempotent, old owner no longer deliverable.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Unregister and token replacement idempotent, old owner no longer deliverable.", "Logout/revoke prevents delivery", "rotation no duplicates", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Logout/revoke prevents delivery", "rotation no duplicates" ], "context_budget_chars": 48000 }, { "id": "S18-013", "stage": "S18", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить gateway secrets/ownership", "outcome": "Security tests cover forged binding/open relay/source checks and metadata minimization.", "depends_on": [ "S17-014", "S18-004", "S18-005", "S18-009", "S18-012" ], "requirements": [ "PUSH-004", "SEC-002", "SEC-003", "SEC-008" ], "scope": [ "tests/security/gateway-review.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Security tests cover forged binding/open relay/source checks and metadata minimization.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Security tests cover forged binding/open relay/source checks and metadata minimization.", "No decrypted payload", "origin/rate/ownership enforced", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No decrypted payload", "origin/rate/ownership enforced" ], "context_budget_chars": 48000 }, { "id": "S18-014", "stage": "S18", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить push/closed-tab matrix", "outcome": "Evidence includes supported browsers, denied, closed tab, rotation, logout and stale call.", "depends_on": [ "S17-014", "S18-007", "S18-008", "S18-009", "S18-010", "S18-011", "S18-012", "S18-013" ], "requirements": [ "WEB-001", "WEB-002", "WEB-003", "WEB-004", "PUSH-006" ], "scope": [ "tests/acceptance/push-lifecycle-tests.*", "tests/qa/push-lifecycle-tests.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 20 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Evidence includes supported browsers, denied, closed tab, rotation, logout and stale call.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Evidence includes supported browsers, denied, closed tab, rotation, logout and stale call.", "Actual provider result", "unsupported mode marked limitation", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Actual provider result", "unsupported mode marked limitation" ], "context_budget_chars": 48000 }, { "id": "S18-015", "stage": "S18", "role": "qa", "reviewer_role": "security", "title": "Gate: Web Push и gateway", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "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" ], "requirements": [], "scope": [ "state/evidence/S18-gate.md", "docs/acceptance/S18-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S18.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S19-001", "stage": "S19", "role": "security", "reviewer_role": "orchestrator", "title": "Реализовать approved lock verifier", "outcome": "Approved library/API stores verifier/secret and attempt throttling per accepted model.", "depends_on": [ "S18-015" ], "requirements": [ "LOCK-002" ], "scope": [ "tests/security/lock-verifier.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Approved library/API stores verifier/secret and attempt throttling per accepted model.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Approved library/API stores verifier/secret and attempt throttling per accepted model.", "Wrong passcode limited", "no plaintext secret prefs", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Wrong passcode limited", "no plaintext secret prefs" ], "context_budget_chars": 48000 }, { "id": "S19-002", "stage": "S19", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать lock lifecycle", "outcome": "Launch/background/focus boundaries distinguish picker/permission from actual leave.", "depends_on": [ "S18-015", "S19-001" ], "requirements": [ "LOCK-001", "LOCK-003" ], "scope": [ "src/adapters/xmpp/lock-lifecycle.*", "tests/protocol/lock-lifecycle.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Launch/background/focus boundaries distinguish picker/permission from actual leave.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Launch/background/focus boundaries distinguish picker/permission from actual leave.", "Picker not interrupted", "background sensitive view locked", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Picker not interrupted", "background sensitive view locked" ], "context_budget_chars": 48000 }, { "id": "S19-003", "stage": "S19", "role": "front", "reviewer_role": "qa", "title": "Создать LockScreen", "outcome": "Opaque lock replaces sensitive media/chat/call details;fallback explicit if biometric unavailable.", "depends_on": [ "S18-015", "S19-001", "S19-002" ], "requirements": [ "LOCK-001", "LOCK-004" ], "scope": [ "src/ui/lock-screen.*", "tests/front/lock-screen.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [ 21, 22, 24 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Opaque lock replaces sensitive media/chat/call details;fallback explicit if biometric unavailable.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Opaque lock replaces sensitive media/chat/call details;fallback explicit if biometric unavailable.", "No underlying readable DOM/content", "unlock error accessible", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No underlying readable DOM/content", "unlock error accessible" ], "context_budget_chars": 48000 }, { "id": "S19-004", "stage": "S19", "role": "protocol", "reviewer_role": "qa", "title": "Подключить lock preview policy", "outcome": "Notifications omit plaintext preview when locked and respect user settings otherwise.", "depends_on": [ "S18-015", "S19-002" ], "requirements": [ "PUSH-004", "LOCK-001" ], "scope": [ "src/adapters/xmpp/locked-notification.*", "tests/protocol/locked-notification.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Notifications omit plaintext preview when locked and respect user settings otherwise.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Notifications omit plaintext preview when locked and respect user settings otherwise.", "Locked push no preview", "unlock doesn't leak stale toast", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Locked push no preview", "unlock doesn't leak stale toast" ], "context_budget_chars": 48000 }, { "id": "S19-005", "stage": "S19", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить XSS/text/URL boundary", "outcome": "Focused tests cover text/XML/filenames/external links through production rendering paths.", "depends_on": [ "S18-015" ], "requirements": [ "SEC-004", "SEC-005" ], "scope": [ "tests/security/untrusted-content.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Focused tests cover text/XML/filenames/external links through production rendering paths.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Focused tests cover text/XML/filenames/external links through production rendering paths.", "Script markup displayed inert", "unsafe URL rejected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Script markup displayed inert", "unsafe URL rejected" ], "context_budget_chars": 48000 }, { "id": "S19-006", "stage": "S19", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить logs/evidence redaction", "outcome": "Known secret canaries never appear in application/gateway error/diagnostic outputs.", "depends_on": [ "S18-015" ], "requirements": [ "SEC-003", "NFR-009" ], "scope": [ "tests/security/logs-redaction.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Known secret canaries never appear in application/gateway error/diagnostic outputs.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Known secret canaries never appear in application/gateway error/diagnostic outputs.", "Forced failures no password/key/body", "public codes retained", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Forced failures no password/key/body", "public codes retained" ], "context_budget_chars": 48000 }, { "id": "S19-007", "stage": "S19", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить forged own-device events", "outcome": "Peer cannot forge read/call sync or push binding through similar XML shape.", "depends_on": [ "S18-015" ], "requirements": [ "SEC-008" ], "scope": [ "tests/security/sync-forgery.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Peer cannot forge read/call sync or push binding through similar XML shape.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Peer cannot forge read/call sync or push binding through similar XML shape.", "Wrong source rejected", "own valid event accepted", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Wrong source rejected", "own valid event accepted" ], "context_budget_chars": 48000 }, { "id": "S19-008", "stage": "S19", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить erase/export boundaries", "outcome": "Local erase covers stated scope;exports/backups not falsely claimed removed.", "depends_on": [ "S18-015", "S19-003", "S19-004" ], "requirements": [ "SEC-006", "SEC-007", "ACC-012", "ACC-013" ], "scope": [ "tests/security/cleanup-boundaries.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Local erase covers stated scope;exports/backups not falsely claimed removed.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Local erase covers stated scope;exports/backups not falsely claimed removed.", "Account erase isolation", "user export persists explained", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Account erase isolation", "user export persists explained" ], "context_budget_chars": 48000 }, { "id": "S19-009", "stage": "S19", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить resource exhaustion limits", "outcome": "Production parsers/challenges/media/gateway inputs enforce bounded count/size/time.", "depends_on": [ "S18-015", "S19-005", "S19-006", "S19-007" ], "requirements": [ "SEC-005" ], "scope": [ "tests/security/input-limits.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Production parsers/challenges/media/gateway inputs enforce bounded count/size/time.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Production parsers/challenges/media/gateway inputs enforce bounded count/size/time.", "Oversize rejects", "no unbounded decode/network loop", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Oversize rejects", "no unbounded decode/network loop" ], "context_budget_chars": 48000 }, { "id": "S19-010", "stage": "S19", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить lock/security integration", "outcome": "Browser suite confirms lock/permissions/notification/focus and explicit privacy wording.", "depends_on": [ "S18-015", "S19-003", "S19-004", "S19-005", "S19-006", "S19-007", "S19-008", "S19-009" ], "requirements": [ "LOCK-001", "LOCK-002", "LOCK-003", "LOCK-004" ], "scope": [ "tests/acceptance/lock-security-suite.*", "tests/qa/lock-security-suite.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 21, 22 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Browser suite confirms lock/permissions/notification/focus and explicit privacy wording.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Browser suite confirms lock/permissions/notification/focus and explicit privacy wording.", "200% lock actionable", "no hidden capture/notification plaintext", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "200% lock actionable", "no hidden capture/notification plaintext" ], "context_budget_chars": 48000 }, { "id": "S19-011", "stage": "S19", "role": "qa", "reviewer_role": "security", "title": "Gate: Lock и security hardening", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S19-001", "S19-002", "S19-003", "S19-004", "S19-005", "S19-006", "S19-007", "S19-008", "S19-009", "S19-010" ], "requirements": [ "SEC-001", "SEC-002" ], "scope": [ "state/evidence/S19-gate.md", "docs/acceptance/S19-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S19.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S20-001", "stage": "S20", "role": "front", "reviewer_role": "qa", "title": "Собрать SettingsView", "outcome": "Sections accounts/profile/connection/encryption/notifications/lock/privacy use existing primitives.", "depends_on": [ "S19-011" ], "requirements": [ "UI-001", "UI-003" ], "scope": [ "src/ui/settings-sections.*", "tests/front/settings-sections.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 9, 12, 14 ], "ui_sections": [ 21, 22 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Sections accounts/profile/connection/encryption/notifications/lock/privacy use existing primitives.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Sections accounts/profile/connection/encryption/notifications/lock/privacy use existing primitives.", "Keyboard navigation", "long JID readable", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Keyboard navigation", "long JID readable" ], "context_budget_chars": 48000 }, { "id": "S20-002", "stage": "S20", "role": "front", "reviewer_role": "qa", "title": "Создать ServerInfo", "outcome": "Capabilities/software/auth/transport distinguish known/unknown/configured states without secrets.", "depends_on": [ "S19-011", "S20-001" ], "requirements": [ "GEN-005", "NET-006" ], "scope": [ "src/ui/server-diagnostics.*", "tests/front/server-diagnostics.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 9, 12, 14 ], "ui_sections": [ 21, 22 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Capabilities/software/auth/transport distinguish known/unknown/configured states without secrets.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Capabilities/software/auth/transport distinguish known/unknown/configured states without secrets.", "Push advertised ≠registered", "unknown cipher not invented", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Push advertised ≠registered", "unknown cipher not invented" ], "context_budget_chars": 48000 }, { "id": "S20-003", "stage": "S20", "role": "protocol", "reviewer_role": "qa", "title": "Реализовать safe diagnostic snapshot", "outcome": "Snapshot contains sanitized version/features/connection counters and optional parameters.", "depends_on": [ "S19-011" ], "requirements": [ "SEC-003", "NFR-009" ], "scope": [ "src/adapters/xmpp/diagnostics-model.*", "tests/protocol/diagnostics-model.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/xmpp.md (upstream artifact S01)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 9, 12, 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Snapshot contains sanitized version/features/connection counters and optional parameters.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Snapshot contains sanitized version/features/connection counters and optional parameters.", "Unavailable field null", "secret bundle never exported", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Unavailable field null", "secret bundle never exported" ], "context_budget_chars": 48000 }, { "id": "S20-004", "stage": "S20", "role": "front", "reviewer_role": "qa", "title": "Подключить typing/privacy toggles", "outcome": "Settings persist per account, clear live composing and explain visible metadata.", "depends_on": [ "S19-011", "S20-001" ], "requirements": [ "TYPE-002", "TYPE-003", "ENC-010" ], "scope": [ "src/ui/typing-settings.*", "tests/front/typing-settings.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 9, 12, 14 ], "ui_sections": [ 21, 22 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Settings persist per account, clear live composing and explain visible metadata.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Settings persist per account, clear live composing and explain visible metadata.", "Toggle off clears status", "other account preference independent", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Toggle off clears status", "other account preference independent" ], "context_budget_chars": 48000 }, { "id": "S20-005", "stage": "S20", "role": "front", "reviewer_role": "qa", "title": "Подключить own avatar update", "outcome": "Profile picker normalization/publication shows pending/error and nonsecret avatar scope.", "depends_on": [ "S19-011", "S20-001" ], "requirements": [ "CON-005", "CON-007" ], "scope": [ "src/ui/avatar-settings.*", "tests/front/avatar-settings.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 9, 12, 14 ], "ui_sections": [ 21, 22 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Profile picker normalization/publication shows pending/error and nonsecret avatar scope.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Profile picker normalization/publication shows pending/error and nonsecret avatar scope.", "Failed publish retains old", "success cache refresh", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Failed publish retains old", "success cache refresh" ], "context_budget_chars": 48000 }, { "id": "S20-006", "stage": "S20", "role": "front", "reviewer_role": "qa", "title": "Показать permission/capability ограничения", "outcome": "Settings/actions explain no upload/codec/maps/notifications with alternative where possible.", "depends_on": [ "S19-011", "S20-001", "S20-002", "S20-003" ], "requirements": [ "GEN-005", "NFR-005" ], "scope": [ "src/ui/capability-fallback.*", "tests/front/capability-fallback.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 9, 12, 14 ], "ui_sections": [ 21, 22 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Settings/actions explain no upload/codec/maps/notifications with alternative where possible.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Settings/actions explain no upload/codec/maps/notifications with alternative where possible.", "Unsupported no fake success", "remaining text still usable", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Unsupported no fake success", "remaining text still usable" ], "context_budget_chars": 48000 }, { "id": "S20-007", "stage": "S20", "role": "front", "reviewer_role": "qa", "title": "Создать Calls list/search", "outcome": "History cards sorted and searchable by peer;open routes to correct account chat.", "depends_on": [ "S19-011", "S20-001" ], "requirements": [ "NAV-001", "NAV-002", "CALL-011" ], "scope": [ "src/ui/calls-list.*", "tests/front/calls-list.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/front.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 9, 12, 14 ], "ui_sections": [ 21, 22 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "History cards sorted and searchable by peer;open routes to correct account chat.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "History cards sorted and searchable by peer;open routes to correct account chat.", "Empty/no-results distinct", "missed result label correct", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Empty/no-results distinct", "missed result label correct" ], "context_budget_chars": 48000 }, { "id": "S20-008", "stage": "S20", "role": "qa", "reviewer_role": "orchestrator", "title": "Проверить settings integration", "outcome": "Suite persistence/switch/privacy/diagnostics verifies controls alter actual behavior.", "depends_on": [ "S19-011", "S20-002", "S20-003", "S20-004", "S20-005", "S20-006", "S20-007" ], "requirements": [ "ACC-007", "ENC-001", "TYPE-002" ], "scope": [ "tests/acceptance/settings-tests.*", "tests/qa/settings-tests.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [ 9, 12, 14 ], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Suite persistence/switch/privacy/diagnostics verifies controls alter actual behavior.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Suite persistence/switch/privacy/diagnostics verifies controls alter actual behavior.", "Reload preferences", "wrong account unaffected", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Reload preferences", "wrong account unaffected" ], "context_budget_chars": 48000 }, { "id": "S20-009", "stage": "S20", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Настройки и диагностика", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S20-001", "S20-002", "S20-003", "S20-004", "S20-005", "S20-006", "S20-007", "S20-008" ], "requirements": [ "CON-001", "CON-002", "CON-003", "CON-004", "CON-006", "TYPE-001" ], "scope": [ "state/evidence/S20-gate.md", "docs/acceptance/S20-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S20.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 }, { "id": "S21-001", "stage": "S21", "role": "qa", "reviewer_role": "orchestrator", "title": "Принять accounts/transport/storage", "outcome": "Acceptance report maps each Web ACC/NET/STORE requirement to actual scenario evidence.", "depends_on": [ "S20-009" ], "requirements": [ "ACC-001", "ACC-002", "ACC-004", "ACC-005", "ACC-006", "ACC-007", "ACC-008", "ACC-009", "ACC-010", "ACC-011", "ACC-012", "ACC-013", "ACC-014", "NET-001", "NET-003", "NET-004", "NET-005", "NET-006", "NET-007", "NET-008", "NET-009", "STORE-001", "STORE-003", "STORE-004", "STORE-005", "STORE-006", "STORE-007" ], "scope": [ "tests/acceptance/accept-accounts.*", "tests/qa/accept-accounts.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Acceptance report maps each Web ACC/NET/STORE requirement to actual scenario evidence.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Acceptance report maps each Web ACC/NET/STORE requirement to actual scenario evidence.", "Switch/upload race", "TLS failure/quota/reload confirmed", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Switch/upload race", "TLS failure/quota/reload confirmed" ], "context_budget_chars": 48000 }, { "id": "S21-002", "stage": "S21", "role": "qa", "reviewer_role": "orchestrator", "title": "Принять messages/actions/history", "outcome": "Acceptance report maps MSG/READ/EDIT/REPLY/FWD/DEL/REACT/TYPE/HIST to production paths and assertions.", "depends_on": [ "S20-009" ], "requirements": [ "DEL-001", "DEL-002", "DEL-003", "DEL-004", "DEL-005", "EDIT-001", "EDIT-002", "EDIT-003", "EDIT-004", "FWD-001", "FWD-002", "FWD-003", "FWD-004", "HIST-001", "HIST-002", "HIST-003", "HIST-004", "HIST-005", "HIST-006", "HIST-007", "HIST-008", "HIST-009", "HIST-010", "HIST-011", "HIST-012", "MSG-001", "MSG-002", "MSG-003", "MSG-004", "MSG-005", "MSG-006", "MSG-007", "MSG-008", "MSG-009", "REACT-001", "REACT-002", "REACT-003", "REACT-004", "REACT-005", "READ-001", "READ-002", "READ-003", "READ-004", "READ-005", "REPLY-001", "REPLY-002", "REPLY-003", "REPLY-004", "REPLY-005", "TYPE-001", "TYPE-002", "TYPE-003" ], "scope": [ "tests/acceptance/accept-messages.*", "tests/qa/accept-messages.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Acceptance report maps MSG/READ/EDIT/REPLY/FWD/DEL/REACT/TYPE/HIST to production paths and assertions.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Acceptance report maps MSG/READ/EDIT/REPLY/FWD/DEL/REACT/TYPE/HIST to production paths and assertions.", "Out-of-order/service-only page", "retry/deletion replay", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Out-of-order/service-only page", "retry/deletion replay" ], "context_budget_chars": 48000 }, { "id": "S21-003", "stage": "S21", "role": "qa", "reviewer_role": "orchestrator", "title": "Принять crypto/MUC interoperability", "outcome": "Report references real independent client/server evidence for encrypted direct/group/device lifecycle.", "depends_on": [ "S20-009" ], "requirements": [ "ENC-001", "ENC-002", "ENC-003", "ENC-004", "ENC-005", "ENC-006", "ENC-007", "ENC-008", "ENC-009", "ENC-010", "ENC-011", "MUC-001", "MUC-002", "MUC-003", "MUC-004", "MUC-005", "MUC-006", "MUC-007", "MUC-008" ], "scope": [ "tests/acceptance/accept-crypto-groups.*", "tests/qa/accept-crypto-groups.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Report references real independent client/server evidence for encrypted direct/group/device lifecycle.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Report references real independent client/server evidence for encrypted direct/group/device lifecycle.", "Legacy/new/offline recipient", "identity change fail closed", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Legacy/new/offline recipient", "identity change fail closed" ], "context_budget_chars": 48000 }, { "id": "S21-004", "stage": "S21", "role": "qa", "reviewer_role": "orchestrator", "title": "Принять media/recording/calls", "outcome": "Report verifies file/capture/geo/call scenarios on supported real browser matrix.", "depends_on": [ "S20-009" ], "requirements": [ "CALL-001", "CALL-002", "CALL-003", "CALL-004", "CALL-005", "CALL-006", "CALL-007", "CALL-008", "CALL-009", "CALL-010", "CALL-011", "CALL-012", "CALL-013", "FILE-001", "FILE-002", "FILE-003", "FILE-004", "FILE-005", "FILE-006", "FILE-007", "FILE-008", "FILE-009", "FILE-010", "FILE-011", "FILE-012", "GEO-001", "GEO-002", "GEO-003", "GEO-004", "MEDIA-001", "MEDIA-002", "MEDIA-003", "MEDIA-004", "MEDIA-005", "MEDIA-006", "MEDIA-007", "MEDIA-008", "REC-001", "REC-002", "REC-003", "REC-004", "REC-005", "REC-006" ], "scope": [ "tests/acceptance/accept-media-calls.*", "tests/qa/accept-media-calls.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Report verifies file/capture/geo/call scenarios on supported real browser matrix.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Report verifies file/capture/geo/call scenarios on supported real browser matrix.", "Permission/cancel/redirect", "TURN/lateICE/outcome", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Permission/cancel/redirect", "TURN/lateICE/outcome" ], "context_budget_chars": 48000 }, { "id": "S21-005", "stage": "S21", "role": "qa", "reviewer_role": "orchestrator", "title": "Принять push/lock/security", "outcome": "Report verifies closed-tab/registration/logout/source/secret scenarios including unsupported modes.", "depends_on": [ "S20-009" ], "requirements": [ "LOCK-001", "LOCK-002", "LOCK-003", "LOCK-004", "PUSH-001", "PUSH-002", "PUSH-003", "PUSH-004", "PUSH-005", "PUSH-006", "PUSH-007", "SEC-001", "SEC-002", "SEC-003", "SEC-004", "SEC-005", "SEC-006", "SEC-007", "SEC-008", "WEB-001", "WEB-002", "WEB-003", "WEB-004" ], "scope": [ "tests/acceptance/accept-push-security.*", "tests/qa/accept-push-security.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Report verifies closed-tab/registration/logout/source/secret scenarios including unsupported modes.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Report verifies closed-tab/registration/logout/source/secret scenarios including unsupported modes.", "Actual push provider result", "lock no preview/secret leaks", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Actual push provider result", "lock no preview/secret leaks" ], "context_budget_chars": 48000 }, { "id": "S21-006", "stage": "S21", "role": "qa", "reviewer_role": "orchestrator", "title": "Принять UI/accessibility matrix", "outcome": "Report covers every UI Kit component/state and NAV with catalog/browser screenshots and focus/contrast checks.", "depends_on": [ "S20-009" ], "requirements": [ "CON-001", "CON-002", "CON-003", "CON-004", "CON-005", "CON-006", "CON-007", "NAV-001", "NAV-002", "NAV-003", "NAV-004", "NAV-005", "NAV-006", "UI-001", "UI-002", "UI-003", "UI-004", "UI-005", "UI-006", "UI-007", "UI-008", "UI-A11Y-001", "UI-A11Y-002", "UI-A11Y-003", "UI-A11Y-004", "UI-A11Y-005", "UI-A11Y-006", "UI-A11Y-007", "UI-A11Y-008", "UI-AVATAR", "UI-MESSAGE" ], "scope": [ "tests/acceptance/accept-ui.*", "tests/qa/accept-ui.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 ], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Report covers every UI Kit component/state and NAV with catalog/browser screenshots and focus/contrast checks.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Report covers every UI Kit component/state and NAV with catalog/browser screenshots and focus/contrast checks.", "320/840/1440+200%", "keyboard/IME/reduced motion", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "320/840/1440+200%", "keyboard/IME/reduced motion" ], "context_budget_chars": 48000 }, { "id": "S21-007", "stage": "S21", "role": "qa", "reviewer_role": "orchestrator", "title": "Измерить принятые performance budgets", "outcome": "Reference devices/browser traces compare startup/render/memory/cache budgets from ADR, not invented universal SLA.", "depends_on": [ "S20-009" ], "requirements": [ "NFR-003", "NFR-004", "GEN-003" ], "scope": [ "tests/acceptance/performance-budget.*", "tests/qa/performance-budget.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/qa.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Reference devices/browser traces compare startup/render/memory/cache budgets from ADR, not invented universal SLA.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Reference devices/browser traces compare startup/render/memory/cache budgets from ADR, not invented universal SLA.", "Large archive scroll/input", "capture+catchup bounded", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Large archive scroll/input", "capture+catchup bounded" ], "context_budget_chars": 48000 }, { "id": "S21-008", "stage": "S21", "role": "ci-cd", "reviewer_role": "qa", "title": "Подготовить воспроизводимую test environment", "outcome": "Local HTTPS/WSS/XMPP/upload/TURN/gateway configs use dedicated test accounts and documented secret injection.", "depends_on": [ "S20-009" ], "requirements": [ "NFR-007", "SEC-002" ], "scope": [ "infra/local-environment.*", "tests/ci-cd/local-environment.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/ci-cd.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Local HTTPS/WSS/XMPP/upload/TURN/gateway configs use dedicated test accounts and documented secret injection.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Local HTTPS/WSS/XMPP/upload/TURN/gateway configs use dedicated test accounts and documented secret injection.", "Clean start smoke", "no committed credentials", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Clean start smoke", "no committed credentials" ], "context_budget_chars": 48000 }, { "id": "S21-009", "stage": "S21", "role": "ci-cd", "reviewer_role": "qa", "title": "Подготовить deploy/rollback pipeline", "outcome": "Build/hosting/CSP/cache/service-worker update smoke and rollback are reproducible without publishing automatically.", "depends_on": [ "S20-009", "S21-008" ], "requirements": [ "NFR-007", "NFR-008" ], "scope": [ "infra/deploy-rollback.*", "tests/ci-cd/deploy-rollback.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/ci-cd.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/push.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Build/hosting/CSP/cache/service-worker update smoke and rollback are reproducible without publishing automatically.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Build/hosting/CSP/cache/service-worker update smoke and rollback are reproducible without publishing automatically.", "Clean staging smoke", "previous version rollback data safe", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Clean staging smoke", "previous version rollback data safe" ], "context_budget_chars": 48000 }, { "id": "S21-010", "stage": "S21", "role": "security", "reviewer_role": "orchestrator", "title": "Проверить release threat/privacy checklist", "outcome": "Security review reconciles actual providers/metadata/crypto/storage with docs and unresolved issues.", "depends_on": [ "S20-009", "S21-001", "S21-002", "S21-003", "S21-004", "S21-005", "S21-006", "S21-007", "S21-009" ], "requirements": [ "SEC-001", "SEC-002", "SEC-003", "SEC-004", "SEC-005", "SEC-006", "SEC-007", "SEC-008", "NFR-009" ], "scope": [ "tests/security/release-security.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/security.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/crypto.md (upstream artifact S01)", "docs/contracts/push.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Security review reconciles actual providers/metadata/crypto/storage with docs and unresolved issues.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Security review reconciles actual providers/metadata/crypto/storage with docs and unresolved issues.", "No secrets in artifacts", "no unreviewed high-risk gaps", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "No secrets in artifacts", "no unreviewed high-risk gaps" ], "context_budget_chars": 48000 }, { "id": "S21-011", "stage": "S21", "role": "docs", "reviewer_role": "orchestrator", "title": "Написать guide и release passport", "outcome": "Guide states supported browsers/providers/login/limits/privacy/version and actual release test results.", "depends_on": [ "S20-009", "S21-010" ], "requirements": [ "GEN-006", "GEN-007", "NFR-005" ], "scope": [ "docs/guides/user-release-guide.*", "tests/docs/user-release-guide.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/docs.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Guide states supported browsers/providers/login/limits/privacy/version and actual release test results.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Guide states supported browsers/providers/login/limits/privacy/version and actual release test results.", "Links/commands reproducible", "unsupported background accurately stated", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Links/commands reproducible", "unsupported background accurately stated" ], "context_budget_chars": 48000 }, { "id": "S21-012", "stage": "S21", "role": "orchestrator", "reviewer_role": "security", "title": "Согласовать полный Web scope", "outcome": "Readiness report maps all allocated requirements to final acceptance evidence; unmet live test blocks release, no auto-deploy.", "depends_on": [ "S20-009", "S21-001", "S21-002", "S21-003", "S21-004", "S21-005", "S21-006", "S21-007", "S21-008", "S21-009", "S21-010", "S21-011" ], "requirements": [ "GEN-001", "GEN-002", "GEN-004", "GEN-005", "GEN-007" ], "scope": [ "docs/decisions/release-readiness.*", "tests/orchestrator/release-readiness.*" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies.", "Описать input/output этого модуля или документа; использовать accepted stack/ports без расширения scope.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Readiness report maps all allocated requirements to final acceptance evidence; unmet live test blocks release, no auto-deploy.", "Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат." ], "acceptance": [ "Readiness report maps all allocated requirements to final acceptance evidence; unmet live test blocks release, no auto-deploy.", "Every Web requirement accounted", "pending blockers not labelled passed", "Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить." ], "checks": [ "Every Web requirement accounted", "pending blockers not labelled passed" ], "context_budget_chars": 48000 }, { "id": "S21-013", "stage": "S21", "role": "qa", "reviewer_role": "orchestrator", "title": "Gate: Полная Web-приёмка и поставка", "outcome": "Проверить завершённые artifacts этапа по checklist и записать единую gate evidence; не реализовывать отсутствующие функции за другие задачи.", "depends_on": [ "S21-001", "S21-002", "S21-003", "S21-004", "S21-005", "S21-006", "S21-007", "S21-008", "S21-009", "S21-010", "S21-011", "S21-012" ], "requirements": [], "scope": [ "state/evidence/S21-gate.md", "docs/acceptance/S21-gate.md" ], "inputs": [ "docs/WORKFLOW.md", "docs/TESTING.md", "planning/stages/S21.md", "docs/decisions/README.md", "docs/decisions/0001-stack.md (upstream artifact; отсутствие после S00 gate — blocker)", "docs/contracts/models.md (upstream artifact S01)", "docs/contracts/lifecycle.md (upstream artifact S01)" ], "spec_sections": [], "ui_sections": [], "steps": [ "Проверить done, evidence и reviews всех задач этапа.", "Прогнать утверждённые focused checks этапа и проверить оставшиеся requirements из packet.", "Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope.", "Отсутствующий/неподтверждённый результат вернуть конкретному owner или оформить blocker; не ставить gate done.", "Записать результаты и handoff следующему этапу." ], "acceptance": [ "Каждая prerequisite задача done после отдельного review.", "Checklist требований этапа имеет фактические результаты, не обещания.", "Нет неучтённых blockers, mock-success или неописанной деградации." ], "checks": [ "Повторить smoke/contract suite этапа по evidence зависимостей.", "Сверить каждый requirement gate с документированным поведением и тестом." ], "context_budget_chars": 48000 } ] }