{ "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", "S00-011", "S00-012" ], "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", "S00-017", "S00-018", "S00-019", "S00-020" ], "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", "S00-021", "S00-022" ], "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", "S00-023" ], "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-011", "stage": "S00", "kind": "blocker", "root_task": "S00-002", "blocker_depth": 1, "unblocks": [ "S00-002" ], "role": "ci-cd", "reviewer_role": "security", "title": "Restore verified npm registry access for the stack spike", "outcome": "A documented registry-capable execution path with successful npm metadata and integrity-checked package tarball retrieval, allowing a fresh S00-002 executor to run its own spike.", "depends_on": [ "S00-001" ], "requirements": [ "NFR-007" ], "scope": [ "experiments/0001-stack/registry-access/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "state/blockers/S00-011.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "External owner: provide working DNS and HTTPS egress to registry.npmjs.org/package tarballs in the agent harness without disabling TLS or the project write sandbox; no secrets requested.", "In a fresh resolver process verify public metadata and retrieve one exact-version package tarball in the scoped experiment directory, checking registry integrity metadata.", "Record exact commands, exit codes and nonsecret runner environment instructions in the scoped registry-access report; do not select the stack or implement rendering.", "Submit connectivity evidence for independent security review." ], "acceptance": [ "npm metadata request succeeds with TLS validation enabled in the execution environment used for the next stack task.", "One exact-version package tarball is retrieved and checked against registry integrity metadata.", "No TLS/CORS bypass, secrets, shared module changes or premature stack selection; reproducible safe execution instructions recorded." ], "checks": [ "Repeat the original npm view command and record exit 0 with actual package metadata.", "Retrieve and integrity-check one exact-version tarball over HTTPS; record actual result and environment constraints." ], "context_budget_chars": 48000 }, { "id": "S00-012", "stage": "S00", "kind": "blocker", "root_task": "S00-002", "blocker_depth": 1, "unblocks": [ "S00-002" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Fix runner prompt delivery after partial stdin timeout", "outcome": "Reliable complete prompt delivery under startup delay and pipe backpressure, preserving runner lifecycle guarantees.", "depends_on": [ "S00-001", "S00-011", "S00-013", "S00-014", "S00-015" ], "requirements": [ "NFR-007" ], "scope": [ "scripts/runner.py", "tests/tooling/test_automation.py" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "state/blockers/S00-012.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Read diagnostic evidence and reproduce delayed-reader partial-write timeout without launching a model.", "Fix only runner stdin delivery; retain fresh sessions, prompt budget, terminal-transition monitoring, timeout and process-tree cleanup.", "Add a deterministic delayed-reader large-prompt regression check and run focused runner tests plus make check.", "Record evidence/handoff/commit message and submit for independent review." ], "acceptance": [ "A delayed stdin reader receives the complete large UTF-8 prompt and EOF without hanging.", "Timeout and terminal-transition process cleanup still work; no background source-writing descendants remain.", "Existing runner/tooling checks pass; no task scope, spec snapshots or product implementation is changed." ], "checks": [ "Delayed-reader large UTF-8 prompt regression.", "Existing runner timeout, transition, scope and fresh-session tests.", "make check" ], "context_budget_chars": 48000 }, { "id": "S00-013", "stage": "S00", "kind": "blocker", "root_task": "S00-002", "blocker_depth": 2, "unblocks": [ "S00-012" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Bound oversized S21-006 runner context without truncating requirements", "outcome": "All task prompts fit the existing configured budget with exact relevant requirements retained and no silent truncation.", "depends_on": [ "S00-001", "S00-011" ], "requirements": [ "NFR-007" ], "scope": [ "scripts/runner.py", "tests/tooling/test_automation.py" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "state/blockers/S00-012.md", "state/blockers/S00-013.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Inspect S21-006 prompt inputs and identify unnecessary duplication or overly broad context loading.", "Implement one bounded context-preparation correction while preserving assignment instructions and exact relevant requirements; retain stdin transport changes.", "Add focused regression for the real oversized context and run existing prompt-budget checks and make check.", "Record evidence/handoff/message and submit for independent review." ], "acceptance": [ "S21-006 and all current task prompts fit the existing 80000-character limit.", "Exact required context is retained; no spec snapshot edits, silent truncation or validation suppression.", "stdin delivery, timeout and terminal-transition regression checks remain passing; make check passes." ], "checks": [ "Existing FoundationRunnerTests all-current-prompts budget check.", "Delayed UTF-8 stdin delivery and runner lifecycle tests.", "make check" ], "context_budget_chars": 48000 }, { "id": "S00-014", "stage": "S00", "kind": "blocker", "root_task": "S00-002", "blocker_depth": 2, "unblocks": [ "S00-012" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Fix repeated runner cleanup after a submitted parent is reaped", "outcome": "Reliable repeated lifecycle cleanup after submit with a reaped parent and SIGTERM-ignoring descendant, preserving actual process-tree termination and valid workflow state.", "depends_on": [ "S00-001", "S00-011", "S00-013" ], "requirements": [ "NFR-007" ], "scope": [ "scripts/runner.py", "tests/tooling/test_automation.py" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "state/blockers/S00-012.md", "state/blockers/S00-014.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Read S00-012 evidence and preserved descendant regressions.", "Reproduce repeated cleanup EPERM in the supplied execution harness without launching a model.", "Correct only the repeated-cleanup lifecycle failure; retain fail-closed handling for inaccessible live descendants and terminal/deadline monitoring.", "Run descendant, delayed stdin and existing lifecycle checks plus make check; record evidence and submit." ], "acceptance": [ "Submit-transition descendant regression completes without invalid escalation or delayed source writes.", "Timeout and terminal-transition paths terminate descendants, including SIGTERM-ignoring children.", "Repeated cleanup does not hide a failure to terminate a live process; stdin delivery and prompt budgets remain intact." ], "checks": [ "Both preserved descendant regressions.", "Delayed-reader UTF-8/EOF, timeout, transition, scope and fresh-session runner checks.", "make check" ], "context_budget_chars": 48000 }, { "id": "S00-015", "stage": "S00", "kind": "blocker", "root_task": "S00-002", "blocker_depth": 2, "unblocks": [ "S00-012" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Устранить прерывание: Fix runner prompt delivery after partial stdin timeout", "outcome": "Устранить одну указанную причину прерывания и доказать готовность исходной задачи к новому запуску; не выполнять соседние задачи.", "depends_on": [ "S00-001", "S00-011", "S00-013", "S00-014", "S00-016" ], "requirements": [], "scope": [ "scripts/runner.py", "tests/tooling/test_automation.py" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "state/blockers/S00-012.md", "state/blockers/S00-015.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать blocker report и handoff.", "Воспроизвести конкретную причину.", "Исправить только локальную причину в scope или уточнить внешний input.", "Выполнить focused проверку и submit." ], "acceptance": [ "Причина воспроизводимо устранена.", "Исходная задача не завершена обходом требований." ], "checks": [ "Повторить сценарий прерывания.", "Проверить отсутствие изменений вне scope." ], "context_budget_chars": 48000 }, { "id": "S00-016", "stage": "S00", "kind": "blocker", "root_task": "S00-002", "blocker_depth": 3, "unblocks": [ "S00-015" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Restore reviewer model availability after provider capacity failure", "outcome": "A verified available tool-capable fresh reviewer execution path after explicit external provider/configuration readiness, without bypassing S00-012 independent review.", "depends_on": [ "S00-001", "S00-011", "S00-013", "S00-014" ], "requirements": [], "scope": [ "scripts/runner.py", "tests/tooling/test_automation.py" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/orchestrator.md", "docs/decisions/README.md", "state/blockers/S00-012.md", "state/blockers/S00-015.md", "state/blockers/S00-016.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Obtain coordinator confirmation that the configured reviewer model is available or an available replacement is explicitly authorized and locally configured; do not put credentials in evidence.", "After external release, verify the readiness condition using the coordinator-authorized harness in a fresh process; do not retry indefinitely.", "Record actual readiness evidence and submit remediation for independent review; leave S00-012 acceptance to its subsequent fresh reviewer." ], "acceptance": [ "Provider/configuration readiness is explicitly supplied by the coordinator.", "A fresh tool-capable reviewer execution path succeeds without the recorded startup capacity/503 failure.", "S00-012 is not accepted or bypassed by the remediation." ], "checks": [ "Inspect failed reviewer run evidence for the exact external failure.", "Record actual authorized fresh harness startup result after external readiness; do not claim unavailable checks passed." ], "context_budget_chars": 48000 }, { "id": "S00-017", "stage": "S00", "kind": "blocker", "root_task": "S00-003", "blocker_depth": 1, "unblocks": [ "S00-003" ], "role": "protocol", "reviewer_role": "security", "title": "Establish fail-closed SCRAM server-final validation", "outcome": "One isolated, runnable and independently reviewed SASL integration experiment rejects unverified SCRAM server-final before reporting authentication success, using vetted existing crypto and a supported library extension path.", "depends_on": [ "S00-001", "S00-002" ], "requirements": [ "ACC-004", "NET-003", "NET-004" ], "scope": [ "experiments/0002-xmpp-library/sasl-validation/**", "docs/decisions/0002-xmpp-sasl-validation.md" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "state/blockers/S00-017.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Read S00-003 blocker evidence and reproduce the missing/forged/premature success defect with exact candidate versions.", "Evaluate supported SASL feature replacement or a maintained alternative; reuse vetted library crypto, never implement crypto primitives or modify ignored vendor source as the deliverable.", "Build only a fixture-bound SASL validation experiment with exact dependency pins and document how S00-003 can integrate it through supported extension points; do not build production adapters/shared contracts.", "Test valid RFC SCRAM transcript and missing/forged/premature server-final; record actual commands and limitations for independent security review." ], "acceptance": [ "Missing, forged and premature SCRAM server-final cannot emit auth:success or request authenticated restart in the demonstrated integration.", "A valid primary-spec SCRAM fixture is accepted only after server signature verification, with no handwritten crypto primitives, stub-success or plaintext fallback.", "A supported integration path and pinned dependencies/licenses are documented; original library/WSS/parser/extension task remains separate." ], "checks": [ "Reproduce original missing/forged/premature success rejection through the integrated SASL handler, not only a standalone mechanism.", "Execute valid RFC SCRAM transcript and negative server-final cases with actual vetted implementation; do not log real credentials." ], "context_budget_chars": 48000 }, { "id": "S00-018", "stage": "S00", "kind": "blocker", "root_task": "S00-003", "blocker_depth": 1, "unblocks": [ "S00-003" ], "role": "protocol", "reviewer_role": "security", "title": "Validate bounded standalone XML ingress for the XMPP candidate", "outcome": "One isolated runnable and independently reviewed ingress experiment enforces explicit finite XML resource limits and standalone text XML per WebSocket message before unsafe accumulation/import, through a supported library integration path.", "depends_on": [ "S00-001", "S00-002", "S00-017" ], "requirements": [ "ACC-004", "NET-003", "NET-004" ], "scope": [ "experiments/0002-xmpp-library/parser-validation/**", "docs/decisions/0002-xmpp-parser-validation.md" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "state/blockers/S00-018.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Read original blocker evidence, bounded probe, shipped parser/transport APIs and RFC 7395 framing; reproduce the stock failure with finite synthetic input.", "Choose and document a supported ingress integration using vetted existing XML parsing; keep limits experiment-local, do not implement a handwritten security XML parser or patch ignored vendor sources.", "Enforce byte/depth/element/attribute budgets and complete single-document text-message framing before unbounded tree/import work; reject invalid input terminally and clear attempt state.", "Add valid boundary and adversarial fixtures including incomplete messages, multiple roots, oversized tokens/attributes, deep XML, malformed XML and binary messages; verify rejection causes no stanza delivery or retained cross-message state.", "Record exact dependencies/licenses/browser API constraints if adding packages, runnable commands/results and limitations, then submit for independent security review." ], "acceptance": [ "Explicit finite byte/depth/element/attribute budgets are enforced before uncontrolled accumulation/import; boundary-valid stanza still parses with actual library behavior.", "Each WebSocket message is one complete standalone text XML document; incomplete/multiple-root/binary input is rejected and cannot be revived by a later message.", "Original large/deep/cross-message failure categories are rejected under documented local limits without post-import-only checks, vendor patch or TLS/CORS bypass.", "One supported integration path and cleanup/reset behavior are demonstrated by runnable actual ingress tests; no production shared contract, auth policy or product limit change." ], "checks": [ "Positive boundary-valid framed stanza using the actual candidate registry/parser and ingress integration.", "Original bounded probe categories exceed local budgets or fail framing and produce terminal rejection without stanza emission.", "Malformed/unfinished/multiple-root/binary/oversized-token/attribute/depth/element cases; no cross-message retained state or late revival.", "Fresh attempt/reset accepts valid input; dependency pin/license/API and scope inspection." ], "context_budget_chars": 48000 }, { "id": "S00-019", "stage": "S00", "kind": "blocker", "root_task": "S00-003", "blocker_depth": 1, "unblocks": [ "S00-003" ], "role": "crypto", "reviewer_role": "security", "title": "Validate browser-compatible SCRAM-SHA-512 through a public mechanism API", "outcome": "One isolated runnable independently reviewed browser-compatible SCRAM-SHA-512 integration uses vetted existing crypto through a supported public mechanism API and validates proof/server-final without vendor/private-field patching or custom primitives.", "depends_on": [ "S00-001", "S00-002", "S00-017", "S00-018" ], "requirements": [ "ACC-004", "NET-003", "NET-004" ], "scope": [ "experiments/0002-xmpp-library/sha512-validation/**", "docs/decisions/0002-xmpp-sha512-validation.md" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "state/blockers/S00-019.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Read original blocker, accepted stack/SASL ADR and pinned browser implementation/public APIs.", "Reproduce the HMAC alias defect and evaluate an existing vetted mechanism/backend or candidate with primary docs, exact pins, license and browser/API checks.", "Implement only isolated SCRAM-SHA-512 integration via supported public APIs using existing cryptographic code; retain fail-closed mutual authentication and real absence of channel binding.", "Run fixed known vectors and full exchange positive/negative checks against the browser-resolved backend; preserve evidence, limitations and handoff for independent security review." ], "acceptance": [ "RFC SHA-512 known vectors match using actual browser-compatible crypto backend, including algorithm spelling and varied key lengths.", "Full SCRAM-SHA-512 client proof and verified server-final agree with an independent existing implementation/fixed externally derived vector; missing/forged/premature final fails without authentication/restart.", "Integration uses public mechanism APIs, correct SCRAM-SHA-512 wire name, no private-field/vendor patch, invented binding, custom primitives or plaintext downgrade.", "Runnable pinned fixture experiment and browser bundle/backend evidence permit independent review; no parent WSS/library selection/shared contract work." ], "checks": [ "Reproduce original browser sha-512 HMAC mismatch.", "Fixed SHA-512/HMAC known vectors including long keys using selected browser backend.", "Full SCRAM-SHA-512 verified exchange and forged/missing/out-of-order server-final rejection.", "Exact dependency/license/API/browser checks and repeatable clean install/bundle plus focused suite." ], "context_budget_chars": 48000 }, { "id": "S00-020", "stage": "S00", "kind": "blocker", "root_task": "S00-003", "blocker_depth": 1, "unblocks": [ "S00-003" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Restore access to the pinned Linux XMPP experiment toolchain", "outcome": "One independently reviewed environment-access probe demonstrates authentic pinned Linux Node/npm and integrity-verified installation of the parent locked dependency graph without changing accepted stack or network security policy.", "depends_on": [ "S00-001", "S00-002", "S00-017", "S00-018", "S00-019", "S00-024" ], "requirements": [ "ACC-004", "NET-003", "NET-004" ], "scope": [ "experiments/0002-xmpp-library/environment-access/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "state/blockers/S00-020.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Read S00-003 blocker evidence and accepted stack pins.", "Obtain external approved HTTPS connectivity or authentic locally supplied pinned Linux runtime and locked dependency artifacts.", "Verify vendor checksum for runtime, exact node/npm versions, and lock integrity with a script confined to the remediation directory; install a copy of the parent manifest/lock only inside that directory.", "Document reproducible approved artifact paths or connectivity and actual results; submit for independent review." ], "acceptance": [ "Node 24.21.0 and npm 11.19.0 execute on this Linux host with authenticated vendor checksum verification recorded.", "Copied unchanged parent package-lock installs successfully with package integrity enforced and Stanza 12.22.1 available.", "No stack/lock/spec changes, engine or TLS bypass, proxy policy bypass or secrets in evidence." ], "checks": [ "Exact runtime version and official checksum comparison.", "Isolated npm ci of unchanged parent manifest/lock with lifecycle scripts disabled and TLS verification retained.", "Independent review repeats access/runtime/lock checks." ], "context_budget_chars": 48000 }, { "id": "S00-021", "stage": "S00", "kind": "blocker", "root_task": "S00-004", "blocker_depth": 1, "unblocks": [ "S00-004" ], "role": "crypto", "reviewer_role": "security", "title": "Устранить прерывание: Проверить browser OMEMO backend", "outcome": "Устранить одну указанную причину прерывания и доказать готовность исходной задачи к новому запуску; не выполнять соседние задачи.", "depends_on": [ "S00-001", "S00-002" ], "requirements": [], "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", "state/blockers/S00-021.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать blocker report и handoff.", "Воспроизвести конкретную причину.", "Исправить только локальную причину в scope или уточнить внешний input.", "Выполнить focused проверку и submit." ], "acceptance": [ "Причина воспроизводимо устранена.", "Исходная задача не завершена обходом требований." ], "checks": [ "Повторить сценарий прерывания.", "Проверить отсутствие изменений вне scope." ], "context_budget_chars": 48000 }, { "id": "S00-022", "stage": "S00", "kind": "blocker", "root_task": "S00-004", "blocker_depth": 1, "unblocks": [ "S00-004" ], "role": "crypto", "reviewer_role": "security", "title": "Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint", "outcome": "One independently reviewed, traceable primary-source outcome that establishes a verified browser/worker/WASM-capable OMEMO2 backend (a maintained library with a real web/WASM build and an OMEMO2/S ce-format mapping, or an approved external library/provider decision with license + support + browser constraints), preserving the verified audited session/ratchet engine and persistence from the existing spike, without a homegrown ratchet or ENC-009/ENC-011 bypass.", "depends_on": [ "S00-001", "S00-002", "S00-021", "S00-027", "S00-029" ], "requirements": [ "ENC-003", "ENC-009", "ENC-011" ], "scope": [ "docs/decisions/0003-crypto-library.md" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "state/blockers/S00-022.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Read S00-004 blocker evidence, ADR 0003, and accepted ENC-003/ENC-009/ENC-011 with ADRs 0000-0002.", "Confirm the residual browser/worker/WASM OMEMO2 backend is unavailable from any maintained package on the reachable registry (reproduce wasm-unsupported probe and npm view queries).", "Source or confirm a maintained browser/worker/WASM-capable OMEMO2 encryption layer: verify its web/WASM build, license, primary-source docs, support, and an OMEMO2 wire mapping against ENC-011; or record the concrete external product/administrative decision (library, provider, or license acceptance) required to bring such a backend in.", "Run a focused known-answer OMEMO2 roundtrip in the web-compatible target and record actual results (or record an unsupported format blocker, not success) and update docs/decisions/0003-crypto-library.md; submit evidence and handoff for independent security review." ], "acceptance": [ "A browser/worker/WASM-capable OMEMO2 backend is established with a real, verified web build and an OMEMO2 wire mapping from traceable primary sources, or an explicit external decision (with specific requested input) is recorded that unblocks sourcing it.", "The OMEMO2 wire-format mapping does not bypass ENC-009/ENC-011 client-endpoint encryption.", "No homegrown ratchet, no spec/plan/shared-contract change without plan, no secrets in evidence, and no out-of-scope edits; unsupported format recorded as blocker, not success." ], "checks": [ "Known-answer OMEMO2 roundtrip in the web/WASM target, or a traceable upstream/external decision covering ENC-009/ENC-011.", "Web/WASM asset presence verified (non-zero real footprint), license and support checked.", "Independent security review confirms no bypass and no unsupported format counted as success." ], "context_budget_chars": 48000 }, { "id": "S00-023", "stage": "S00", "kind": "blocker", "root_task": "S00-005", "blocker_depth": 1, "unblocks": [ "S00-005" ], "role": "storage", "reviewer_role": "qa", "title": "Устранить прерывание: Выбрать IndexedDB wrapper и migration policy", "outcome": "Устранить одну указанную причину прерывания и доказать готовность исходной задачи к новому запуску; не выполнять соседние задачи.", "depends_on": [ "S00-002", "S00-025" ], "requirements": [], "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", "state/blockers/S00-023.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать blocker report и handoff.", "Воспроизвести конкретную причину.", "Исправить только локальную причину в scope или уточнить внешний input.", "Выполнить focused проверку и submit." ], "acceptance": [ "Причина воспроизводимо устранена.", "Исходная задача не завершена обходом требований." ], "checks": [ "Повторить сценарий прерывания.", "Проверить отсутствие изменений вне scope." ], "context_budget_chars": 48000 }, { "id": "S00-024", "stage": "S00", "kind": "blocker", "root_task": "S00-003", "blocker_depth": 2, "unblocks": [ "S00-020" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Устранить прерывание: Restore access to the pinned Linux XMPP experiment toolchain", "outcome": "Устранить одну указанную причину прерывания и доказать готовность исходной задачи к новому запуску; не выполнять соседние задачи.", "depends_on": [ "S00-001", "S00-002", "S00-017", "S00-018", "S00-019", "S00-026" ], "requirements": [], "scope": [ "experiments/0002-xmpp-library/environment-access/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "state/blockers/S00-020.md", "state/blockers/S00-024.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать blocker report и handoff.", "Воспроизвести конкретную причину.", "Исправить только локальную причину в scope или уточнить внешний input.", "Выполнить focused проверку и submit." ], "acceptance": [ "Причина воспроизводимо устранена.", "Исходная задача не завершена обходом требований." ], "checks": [ "Повторить сценарий прерывания.", "Проверить отсутствие изменений вне scope." ], "context_budget_chars": 48000 }, { "id": "S00-025", "stage": "S00", "kind": "blocker", "root_task": "S00-005", "blocker_depth": 2, "unblocks": [ "S00-023" ], "role": "storage", "reviewer_role": "qa", "title": "Устранить прерывание: Устранить прерывание: Выбрать IndexedDB wrapper и migration policy", "outcome": "Устранить одну указанную причину прерывания и доказать готовность исходной задачи к новому запуску; не выполнять соседние задачи.", "depends_on": [ "S00-002", "S00-028" ], "requirements": [], "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", "state/blockers/S00-023.md", "state/blockers/S00-025.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Прочитать blocker report и handoff.", "Воспроизвести конкретную причину.", "Исправить только локальную причину в scope или уточнить внешний input.", "Выполнить focused проверку и submit." ], "acceptance": [ "Причина воспроизводимо устранена.", "Исходная задача не завершена обходом требований." ], "checks": [ "Повторить сценарий прерывания.", "Проверить отсутствие изменений вне scope." ], "context_budget_chars": 48000 }, { "id": "S00-026", "stage": "S00", "kind": "blocker", "root_task": "S00-003", "blocker_depth": 3, "unblocks": [ "S00-024" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Provide approved access to the pinned Linux experiment artifacts", "outcome": "One independently verified approved access path supplies authentic pinned Linux Node/npm and integrity-verifiable parent locked dependencies for S00-020.", "depends_on": [ "S00-001", "S00-002", "S00-017", "S00-018", "S00-019" ], "requirements": [], "scope": [ "experiments/0002-xmpp-library/environment-access/**" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/protocol.md", "docs/decisions/README.md", "state/blockers/S00-020.md", "state/blockers/S00-024.md", "state/blockers/S00-026.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Obtain environment-owner confirmation of restored approved HTTPS access or local authentic runtime/checksum/dependency artifact paths, without credentials in reports.", "Verify Linux Node 24.21.0 vendor checksum material and executing Node 24.21.0/npm 11.19.0.", "Install unchanged copies of parent manifest and lock only inside environment-access using npm ci with scripts disabled and TLS/integrity verification retained.", "Record reproducible paths, checks and limits for independent review; leave original tasks unfinished." ], "acceptance": [ "Approved access or authentic local artifacts are available and documented without policy bypass.", "Exact pinned Linux runtime executes and vendor checksum verification succeeds.", "Unchanged copied parent lock installs with integrity enforced and Stanza 12.22.1 available; no stack/spec/lock change." ], "checks": [ "Repeat original official HTTPS retrieval or independently verify approved supplied artifact provenance/checksum.", "Check exact node/npm versions and isolated locked npm ci with scripts disabled.", "Verify source changes stay within environment-access and no TLS/proxy/engine bypass occurs." ], "context_budget_chars": 48000 }, { "id": "S00-027", "stage": "S00", "kind": "blocker", "root_task": "S00-004", "blocker_depth": 2, "unblocks": [ "S00-022" ], "role": "ci-cd", "reviewer_role": "security", "title": "Restore approved npm registry connectivity for the OMEMO2 backend investigation", "outcome": "One independently reviewed connectivity record proving that the fresh project agent can retrieve real libomemo.js and libsignal-client metadata and a pinned candidate artifact through approved HTTPS registry access.", "depends_on": [ "S00-001", "S00-002", "S00-021" ], "requirements": [ "ENC-003", "ENC-009", "ENC-011" ], "scope": [ "docs/decisions/0003-registry-connectivity.md" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "state/blockers/S00-022.md", "state/blockers/S00-027.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Obtain environment-owner confirmation that approved proxy/DNS/registry access is restored for the agent sandbox; never record credentials.", "Reproduce the two npm metadata queries using a temporary cache and normal certificate validation.", "Verify a pinned candidate artifact can be downloaded and integrity checked in a temporary directory without executing package scripts.", "Record exact commands, exit codes, versions and integrity result in the bounded connectivity document; submit for independent review." ], "acceptance": [ "Both known-control and candidate npm metadata queries return actual registry responses without EAI_AGAIN.", "A pinned candidate artifact download and integrity check succeed over normal HTTPS.", "No TLS/proxy-policy bypass, secrets, crypto implementation or backend acceptance; remediation only restores network access." ], "checks": [ "npm view @signalapp/libsignal-client version --json --fetch-retries=0 --fetch-timeout=15000 with a temporary cache", "npm view libomemo.js version license dist.integrity dist.tarball --json --fetch-retries=0 --fetch-timeout=15000 with a temporary cache", "Pinned artifact retrieval and registry integrity verification without install scripts" ], "context_budget_chars": 48000 }, { "id": "S00-028", "stage": "S00", "kind": "blocker", "root_task": "S00-005", "blocker_depth": 3, "unblocks": [ "S00-025" ], "role": "ci-cd", "reviewer_role": "qa", "title": "Repair conflicting Codex harness sandbox arguments", "outcome": "A reviewed compatible runner argv starts a fresh harness with project write sandbox without the mutually exclusive argument error.", "depends_on": [ "S00-002" ], "requirements": [], "scope": [ "runner.local.json", "runner.example.json", "docs/AUTOMATION.md" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/storage.md", "docs/decisions/README.md", "state/blockers/S00-023.md", "state/blockers/S00-025.md", "state/blockers/S00-028.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Inspect the recorded CLI usage error and configured argv without logging secrets", "Obtain coordinator input for the active runner configuration and preserve project-only sandbox", "Correct only conflicting launcher arguments and document the supported invocation", "Validate argument compatibility with a bounded non-product smoke check and submit for independent review" ], "acceptance": [ "The conflicting approval/sandbox combination is removed from the active launcher", "Project write sandbox remains enforced", "No original storage task is marked complete or executed during launcher repair" ], "checks": [ "Inspect codex exec help and the selected argument combination", "Run a bounded launcher smoke check without resuming a conversation or selecting product work" ], "context_budget_chars": 48000 }, { "id": "S00-029", "stage": "S00", "kind": "blocker", "root_task": "S00-004", "blocker_depth": 2, "unblocks": [ "S00-022" ], "role": "orchestrator", "reviewer_role": "security", "title": "Record an approved browser OMEMO backend sourcing strategy", "outcome": "One explicit architecture/security/product-owner sourcing decision naming the retained engine browser port or authorizing bounded evaluation of an alternative, with license/support/security-assessment and persistence compatibility requirements, without waiving ENC-003/009/011.", "depends_on": [ "S00-001", "S00-002", "S00-021", "S00-027" ], "requirements": [ "ENC-003", "ENC-009", "ENC-011" ], "scope": [ "docs/decisions/0003-browser-backend-decision.md" ], "inputs": [ "docs/WEB_PROFILE.md", "docs/ARCHITECTURE.md", "docs/CONTRACTS.md", "docs/TESTING.md", "roles/crypto.md", "docs/decisions/README.md", "state/blockers/S00-022.md", "state/blockers/S00-029.md" ], "spec_sections": [], "ui_sections": [], "steps": [ "Obtain explicit owner input naming a backend strategy; do not infer approval from candidate availability.", "Record traceable primary sources, exact target, license/support constraints and required independent security assessment and SCE path.", "If alternative engine is selected, require separate reviewed plan change for preservation wording before S00-022 resumes implementation.", "Submit only the bounded decision for independent security review; do not implement crypto." ], "acceptance": [ "Explicit owner decision is recorded; the candidate is not declared audited or interoperable without evidence.", "Decision preserves ENC-003/009/011 and identifies remaining browser/SCE/vector/persistence checks.", "Any engine replacement is contingent on reviewed plan change; no silent replacement or implementation occurs." ], "checks": [ "Verify owner input and primary-source traceability for named target/license/support/security and SCE boundaries.", "Independent security review confirms decision addresses engine/persistence preservation and contains no requirement bypass." ], "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 } ] }