From d5ed7eaaed54d39ae928698df7085b2d6b86c69a Mon Sep 17 00:00:00 2001 From: TolaMironcenko Date: Thu, 15 Oct 2026 01:01:57 +0700 Subject: [PATCH] S00-001: Define the Web scope passport and native exclusion boundaries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: Add proposed scope ADR with reasons for all ten excluded IDs, retained Web obligations, lifecycle limits, external provider roles and deferred decisions. Add a document coverage/lifecycle checker with four negative mutations and executor evidence/handoff for security review. Validation: python3 experiments/0000-scope/check.py passed for ten excluded IDs and seven lifecycle scenarios; all four negative mutations were rejected. make check passed validation and 66 tooling tests. Whitespace and allowed source paths checked. No live browser or provider integration was tested; ADR awaits independent review. Task: S00-001 Agent: auto-orchestrator-48aab142ecde Role: orchestrator Action: claim Status: review Task title: Утвердить Web-профиль --- docs/decisions/0000-scope.md | 94 +++++++++++++++++++ experiments/0000-scope/check.py | 69 ++++++++++++++ planning/TASK_MATRIX.md | 4 +- planning/stages/S00.md | 2 +- planning/task_matrix.csv | 2 +- .../auto-orchestrator-48aab142ecde.txt | 4 + .../S00-001-auto-orchestrator-48aab142ecde.md | 33 +++++++ state/handoffs/S00-001.md | 10 ++ state/tasks.json | 37 +++++++- 9 files changed, 247 insertions(+), 8 deletions(-) create mode 100644 docs/decisions/0000-scope.md create mode 100644 experiments/0000-scope/check.py create mode 100644 state/commit_messages/auto-orchestrator-48aab142ecde.txt create mode 100644 state/evidence/S00-001-auto-orchestrator-48aab142ecde.md create mode 100644 state/handoffs/S00-001.md diff --git a/docs/decisions/0000-scope.md b/docs/decisions/0000-scope.md new file mode 100644 index 0000000..a420216 --- /dev/null +++ b/docs/decisions/0000-scope.md @@ -0,0 +1,94 @@ +# ADR 0000: Паспорт scope Luma Web + +- Status: proposed — подлежит независимому security review S00-001; принятие не заявлено. +- Task: S00-001 +- Date: 2026-10-15 +- Decision owner: auto-orchestrator-48aab142ecde, orchestrator +- Reviewer: security, отдельный процесс coordinator + +## Вход, результат и критерии + +Вход: неизменяемые `specs/tz_clear.md` (§3, §20, §21, §27; GEN-005, GEN-006, WEB-002), `specs/uikit_clear.md`, applicability из `planning/requirements.json` и Web-профиль основы. Результат: один паспорт Web-scope с причинами исключений и перечнем внешних сервисов. Проверка: исключённые ID полностью совпадают с реестром, у каждого есть содержательная причина, lifecycle не обещает closed-tab XMPP или постоянное медиа через push. Прямых зависимостей и ранее принятых ADR нет; schemas из S01 пока не приняты. + +## Решение и объём + +Реализуется браузерное приложение для телефона и компьютера: compact navigation и wide sidebar/detail, keyboard/IME, accessibility, safe areas и адаптивный UI Kit. Desktop native package, Android native package, tray, foreground services, APNs/Android SDK и companion/Watch не входят в эту основу. Браузер на Android относится к Web и сохраняет Web-ограничения. + +Из 221 ID реестр относит 211 к Web и 10 к out_of_scope. Все 211 остаются обязательствами плана, а не отчётом о готовности. Общие cross-platform требования применяются в Web-контексте; native-примеры UI Kit не исключают общую семантику, accessibility, tokens или touch-сценарии. + +Базовый Web-объём сохраняет несколько конфигураций аккаунтов и один активный XMPP-контекст; login/logout/switch, контакты/presence, личные чаты/self-chat, MUC, текст/replies/reactions/correction/retraction/local deletion, selection/forwarding, OMEMO legacy и OMEMO 2 с доверием устройствам, файлы/фото/видео/музыку/voice/video notes/геоточки, локальную историю/MAM/Carbons/receipts/read state, личные аудио-/видеозвонки и их историю, аватары, уведомления/app lock, доступную защищённую биометрию и диагностику сервера. + +За базовым объёмом остаются регистрация XMPP-аккаунтов, восстановление серверного пароля, групповые звонки, MIX/каналы, боты, платежи, истории, live location, полнотекстовый поиск всей истории и обязательная одновременная online-сессия всех аккаунтов (§3.2). Развёртывание XMPP-провайдера не является функцией клиента; необходимый push/relay — отдельный поставляемый либо явно подключённый компонент решения. + +### Исключённые ID и сохранённые Web-обязательства + +| Excluded ID | Причина исключения из этой основы | Web-замена / сохранённая часть | +| --- | --- | --- | +| ACC-003 | Настройка native TCP host/port, STARTTLS/direct TLS и native discovery не является браузерным транспортом. | ACC-004/005: WSS endpoint с видимым доменом и явным выбором неизвестного сервера. | +| NET-002 | Native DNS discovery и ручные параметры транспорта исключены. ID реестра исключён целиком, но его Web-оговорка остаётся обязательной. | WSS endpoint утверждается для выбранного сервера; ACC-004 и NET-001 сохраняются. | +| DESK-001 | Tray, native автозапуск и различие native hide/window quit относятся к устанавливаемому Desktop. | WEB-001/002: различать активную, скрытую и закрытую страницу. | +| DESK-002 | Живой native фоновый процесс и его incoming calls не поставляются браузерной основой. | WEB-002/003: уведомление и открытие страницы с проверкой актуальности вызова. | +| DESK-003 | Native sleep/wake и tray call icon не являются Web-интеграцией. | Web reconnect и push logout/revoke остаются по NET, PUSH и WEB; tray отсутствует. | +| AND-001 | Native Android push/call delivery и выбор системного provider требуют Android-приложения. | Browser Web Push с permission, gateway и проверенной регистрацией. | +| AND-002 | Native lifecycle/permissions и системный фоновый режим Android находятся вне Web-target. | WEB-001/002: скрытая страница может быть приостановлена; фонового socket SLA нет. | +| AND-003 | Android foreground/call service и управление ongoing call из native notification не поставляются. | Звонок в живой Web-сессии при доступных media permissions, без гарантии closed-tab call. | +| AND-004 | Force stop и native battery lifecycle проверяются у Android-приложения, не у этой основы. | Denied permissions, offline, browser termination и sleep требуют честной Web-деградации. | +| STORE-002 | Native secure vault и device key wrapping не предоставляются браузерным storage. | STORE-003/004: password в памяти, повторный вход, отдельное решение crypto unlock и честные quota/eviction. | + +## Lifecycle и честные capability states + +Закрытая страница не считается постоянно подключённой XMPP-сессией. Service worker notification не гарантирует непрерывный microphone, медиазвонок или автоматический показ полноэкранного incoming UI (WEB-002). Установленная PWA сохраняет эти ограничения. Скрытая страница может быть заморожена или выгружена; состояние connection/call после возвращения сверяется с реальностью (WEB-001). Push может вызвать обработку события/уведомление, но не заменяет постоянно живой socket. После перехода из уведомления выполняются unlock/login при необходимости, синхронизация и проверка срока/состояния вызова (WEB-003). + +Таблица ниже — нормативные пределы обещаний, не результаты browser/runtime тестов. `conditional` означает только возможность после проверки prerequisites; `not-guaranteed` запрещает гарантию непрерывности; `none` означает отсутствие соответствующего пути. + +| State | XMPP session | Push notification | Continuous media | Automatic fullscreen incoming | +| --- | --- | --- | --- | --- | +| foreground | conditional | conditional | conditional | not-guaranteed | +| hidden | not-guaranteed | conditional | not-guaranteed | not-guaranteed | +| closed-tab | none | conditional | none | none | +| browser-terminated | none | not-guaranteed | none | none | +| permission-denied | conditional | none | none | none | +| offline | none | not-guaranteed | none | none | +| logged-out | none | none | none | none | + +Строка permission-denied предполагает отказ и notification, и media permissions; XMPP не требует этих разрешений. Logged-out требует disable/revoke регистрации, поздние события не восстанавливают аккаунт. Offline push может быть отложен/истечь, browser termination зависит от ОС/provider; доставки не обещаем. Реальные проверки foreground/hidden/closed-tab/denied/sleep/rotation/logout/stale notification относятся к будущей приёмке интеграции (§20.4). + +GEN-005: различать advertised capability, configured integration и verified usable state. Если сервис/permission/registration недоступен, отключать только зависимую функцию с причиной, сохраняя остальные сценарии. Например, отсутствие TURN ограничивает достижимость звонка, upload — вложения, push — фоновые уведомления; наличие server feature само по себе не доказывает работу интеграции. + +GEN-006: не обещать гарантированные delivery/read, отзыв чужих копий, работу закрытого процесса или скрытие metadata. TLS, OMEMO payload, file encryption, DTLS-SRTP, local protection и UI lock имеют разные границы. Gateway не получает decrypted messages или file keys; plaintext fallback, decrypting proxy и обход TLS/CORS недопустимы. + +## Внешние providers и границы данных + +Ни vendor, ни рабочий URL, ни SLA здесь не выбраны. Это обязательный inventory для topology S00-008 и последующей интеграции; наличие строки не означает подключённый сервис. + +| Сервис / provider | Требуемая роль и публичная конфигурация | Данные / секреты и деградация | +| --- | --- | --- | +| HTTPS hosting / origin | Поставка Web assets и service worker через доверенный origin. | Видит сетевые metadata; не получает пароль/ключи через analytics. Hosting и release channels ещё не утверждены. | +| XMPP provider + WSS endpoint | Auth, stanza routing, capability discovery, MUC/MAM/Carbons и поддержанные XEP. Домен endpoint виден пользователю. | Пароль используется только выбранным transport auth; OMEMO plaintext серверу недоступен. Сервер видит routing metadata. При отсутствии WSS соединение недоступно. | +| HTTPS upload provider | Upload slot, разрешённые origin/CORS, size/expiry policy. | Encrypted attachment bytes; file key передаётся в защищённом сообщении. Ошибка/quota отключает upload с объяснением. | +| STUN/TURN provider | NAT traversal/relay для WebRTC; публичные server URLs в runtime config. | IP/время/объём relay видимы provider; TURN secrets отдельно, без committed примеров. Недоступность не выдаётся за успешный звонок. | +| XMPP push service / gateway | Связать XMPP enable/disable с браузерной subscription, update/expiry/logout/revoke. | Минимальные registration metadata; без body/file key/password. Gateway private credentials и VAPID private key вне repo/logs. | +| Browser-selected Web Push service | Доставка к user agent, permission и subscription endpoint; это отдельная роль от gateway. | Timing/size metadata видимы provider; subscription — чувствительные данные, не public config. Без permission/registration нет «Push работает». | +| Maps / tiles / geocoding provider | Явно подключённые карты для геоточек, утверждённые endpoints и политика доступа. | Coordinates/IP могут раскрыться provider, требуется минимизация/объяснение; live location исключён. При отсутствии сервиса не выдавать карту за загруженную. | + +Публичные URLs и несекретные capabilities идут в runtime config. Password только в памяти; постоянный login/crypto unlock остаётся отдельным ADR S00-007. Browser quota/очистка не эквивалентны hardware-backed vault. Secrets, реальные JID, subscriptions и переписки не входят в fixtures/evidence/environment examples. + +## Рассмотренные варианты и первичные источники + +Проверено 2026-10-15; sources подтверждают границы механизма, не совместимость конкретных браузеров. + +- Выбранный WSS путь: [RFC 7395, §3 и §6](https://www.rfc-editor.org/rfc/rfc7395.html) определяет XMPP WebSocket binding и защиту endpoint через TLS. Native TCP не переносится в Web controls. Браузер проверяет TLS; обход сертификатов не разрешён. +- Альтернатива HTTPS BOSH: [XEP-0206](https://xmpp.org/extensions/xep-0206.html) описывает XMPP поверх BOSH. В этом профиле не требуется и не включается; возможное включение требует отдельного решения по ACC-004. +- Event-driven push: [W3C Push API, introduction и §4](https://www.w3.org/TR/2026/WD-push-api-20261005/) описывает push service, delivery к worker и видимые provider metadata. Working Draft не является обещанием поддержки всех browser features. +- Предел worker lifetime: [W3C Service Workers, §2.1.1](https://www.w3.org/TR/2026/CRD-service-workers-20260917/#service-worker-lifetime) связывает lifetime с обработкой событий и допускает прекращение worker. Вывод для профиля: worker нельзя считать непрерывной XMPP/media-сессией. +- Раздельные push роли: [XEP-0357, §2 и §5](https://xmpp.org/extensions/xep-0357.html) описывает XMPP push service и внешнюю delivery service с отдельным enable. Одного advertised XMPP feature недостаточно. + +Отклонены обещание native transport в браузере, «вечная» PWA socket/media-сессия и автоматически подключённые providers. Повод пересмотра — новая утверждённая версия требований или проверяемая platform integration через отдельный ADR/plan change; исходные snapshots сохраняются. + +## Проверка, ограничения и следующие решения + +Focused experiment: `python3 experiments/0000-scope/check.py` проверяет полное покрытие excluded IDs по canonical registry/specs, содержательные причины и нормативные lifecycle limits; отрицательные мутации подтверждают обнаружение пропуска/ложной closed-tab гарантии. Это проверка паспорта, без сетевой интеграции, browser spike или runtime implementation. + +Новых dependencies и library licenses нет. Выбор framework/runtime и проверка лицензий — S00-002; XMPP и crypto libraries/interoperability — S00-003/004; IndexedDB — S00-005; browser/reference matrix и PWA mode — S00-006; unlock — S00-007; конкретная topology/providers — S00-008; совместный gate — S00-009/010. До их принятия отсутствуют browser versions, file/cache/pending limits, performance reference devices, server/client wire-format evidence и release hosting/update policy. Их отсутствие явно ограничивает текущий паспорт и запрещает обещать готовность релиза; для bounded S00-001 эти решения не выбираются. + +Shared contracts из реестра остаются задачами S01. Этот паспорт не задаёт новые поля интерфейсов и не меняет план/applicability. Security reviewer проверяет причины, lifecycle, provider data boundaries, scope и evidence перед принятиями coordinator workflow. diff --git a/experiments/0000-scope/check.py b/experiments/0000-scope/check.py new file mode 100644 index 0000000..becf544 --- /dev/null +++ b/experiments/0000-scope/check.py @@ -0,0 +1,69 @@ +"""Check the scope passport against canonical applicability and WEB-002 limits. + +Document-only experiment; no product runtime or provider connection is simulated. +""" +import json +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +ID = re.compile(r"\| ((?:[A-Z]+-)+\d{3}) \| (.+?) \| (.+?) \|") +STATES = {"foreground", "hidden", "closed-tab", "browser-terminated", + "permission-denied", "offline", "logged-out"} + + +def check(document, requirements): + excluded = {r["id"] for r in requirements if r["applicability"] == "out_of_scope"} + rows = ID.findall(document) + assert len(rows) == len({r[0] for r in rows}), "Duplicate excluded ID" + assert {r[0] for r in rows} == excluded, "Excluded coverage differs from canonical registry" + for rid, reason, retained in rows: + assert len(reason.strip()) >= 40, f"Missing substantive reason: {rid}" + assert len(retained.strip()) >= 30, f"Missing Web boundary: {rid}" + entry = next(r for r in requirements if r["id"] == rid) + assert f"**{rid}.**" in (ROOT / entry["source"]).read_text(), rid + lifecycle = {} + for line in document.splitlines(): + cells = [c.strip() for c in line.split("|")[1:-1]] + if cells and cells[0] in STATES: + assert len(cells) == 5 and cells[0] not in lifecycle, "Malformed lifecycle row" + lifecycle[cells[0]] = cells[1:] + assert set(lifecycle) == STATES, "Incomplete lifecycle scenarios" + assert all(v in {"conditional", "none", "not-guaranteed"} + for row in lifecycle.values() for v in row), "Unsupported guarantee" + for state in {"closed-tab", "browser-terminated", "offline", "logged-out"}: + row = lifecycle[state] + assert row[0] == "none" and row[2:] == ["none", "none"], f"False session/media promise: {state}" + assert lifecycle["hidden"][0] == "not-guaranteed", "Hidden socket continuity promise" + assert lifecycle["closed-tab"][1] == "conditional", "Push confused with session or guaranteed delivery" + assert lifecycle["permission-denied"][1:] == ["none"] * 3, "Denied permissions bypassed" + assert lifecycle["logged-out"] == ["none"] * 4, "Logout reactivation promise" + return len(excluded), len(lifecycle) + + +def main(): + document = (ROOT / "docs/decisions/0000-scope.md").read_text() + requirements = json.loads((ROOT / "planning/requirements.json").read_text()) + counts = check(document, requirements) + mutations = [ + re.sub(r"^\| ACC-003 \|.*\n", "", document, flags=re.M), + re.sub(r"^\| ACC-003 \|.*$", "| ACC-003 | | |", document, flags=re.M), + document.replace("| closed-tab | none | conditional | none | none |", + "| closed-tab | conditional | conditional | none | none |"), + document.replace("| closed-tab | none | conditional | none | none |", + "| closed-tab | none | conditional | conditional | none |"), + ] + for index, mutant in enumerate(mutations, 1): + assert mutant != document, "Negative fixture did not mutate document" + try: + check(mutant, requirements) + except AssertionError: + continue + raise AssertionError(f"False passport accepted: mutation {index}") + print(f"PASS: {counts[0]} excluded IDs match registry/specs with reasons; " + f"{counts[1]} lifecycle scenarios; {len(mutations)} negative mutations rejected.") + print("LIMIT: document validation only; browser/provider behavior is untested.") + + +if __name__ == "__main__": + main() diff --git a/planning/TASK_MATRIX.md b/planning/TASK_MATRIX.md index 8745818..49b946b 100644 --- a/planning/TASK_MATRIX.md +++ b/planning/TASK_MATRIX.md @@ -1,10 +1,10 @@ # Матрица задач -Generated; state revision **0**. Canonical status: state/tasks.json. +Generated; state revision **2**. Canonical status: state/tasks.json. | ID | Этап | Оператор | Reviewer | Статус | Owner | Зависимости | Задача | | --- | --- | --- | --- | --- | --- | --- | --- | -| [S00-001](tasks/S00-001.md) | S00 | orchestrator | security | todo | | | Утвердить Web-профиль | +| [S00-001](tasks/S00-001.md) | S00 | orchestrator | security | review | auto-orchestrator-48aab142ecde | | Утвердить Web-профиль | | [S00-002](tasks/S00-002.md) | S00 | orchestrator | security | todo | | S00-001 | Выбрать framework и build runtime | | [S00-003](tasks/S00-003.md) | S00 | protocol | qa | todo | | S00-001, S00-002 | Проверить XMPP WSS/auth библиотеку | | [S00-004](tasks/S00-004.md) | S00 | crypto | security | todo | | S00-001, S00-002 | Проверить browser OMEMO backend | diff --git a/planning/stages/S00.md b/planning/stages/S00.md index 04ac84e..4ec2906 100644 --- a/planning/stages/S00.md +++ b/planning/stages/S00.md @@ -6,7 +6,7 @@ ## Задачи -- [S00-001](../tasks/S00-001.md): Утвердить Web-профиль — orchestrator; todo. +- [S00-001](../tasks/S00-001.md): Утвердить Web-профиль — orchestrator; review. - [S00-002](../tasks/S00-002.md): Выбрать framework и build runtime — orchestrator; todo. - [S00-003](../tasks/S00-003.md): Проверить XMPP WSS/auth библиотеку — protocol; todo. - [S00-004](../tasks/S00-004.md): Проверить browser OMEMO backend — crypto; todo. diff --git a/planning/task_matrix.csv b/planning/task_matrix.csv index 0c7e436..40f7c02 100644 --- a/planning/task_matrix.csv +++ b/planning/task_matrix.csv @@ -1,5 +1,5 @@ id,stage,operator,reviewer,status,owner,depends_on,title -S00-001,S00,orchestrator,security,todo,,,Утвердить Web-профиль +S00-001,S00,orchestrator,security,review,auto-orchestrator-48aab142ecde,,Утвердить Web-профиль S00-002,S00,orchestrator,security,todo,,S00-001,Выбрать framework и build runtime S00-003,S00,protocol,qa,todo,,"S00-001, S00-002",Проверить XMPP WSS/auth библиотеку S00-004,S00,crypto,security,todo,,"S00-001, S00-002",Проверить browser OMEMO backend diff --git a/state/commit_messages/auto-orchestrator-48aab142ecde.txt b/state/commit_messages/auto-orchestrator-48aab142ecde.txt new file mode 100644 index 0000000..030c212 --- /dev/null +++ b/state/commit_messages/auto-orchestrator-48aab142ecde.txt @@ -0,0 +1,4 @@ +Define the Web scope passport and native exclusion boundaries + +Changes: Add proposed scope ADR with reasons for all ten excluded IDs, retained Web obligations, lifecycle limits, external provider roles and deferred decisions. Add a document coverage/lifecycle checker with four negative mutations and executor evidence/handoff for security review. +Validation: python3 experiments/0000-scope/check.py passed for ten excluded IDs and seven lifecycle scenarios; all four negative mutations were rejected. make check passed validation and 66 tooling tests. Whitespace and allowed source paths checked. No live browser or provider integration was tested; ADR awaits independent review. diff --git a/state/evidence/S00-001-auto-orchestrator-48aab142ecde.md b/state/evidence/S00-001-auto-orchestrator-48aab142ecde.md new file mode 100644 index 0000000..4ef0a14 --- /dev/null +++ b/state/evidence/S00-001-auto-orchestrator-48aab142ecde.md @@ -0,0 +1,33 @@ +# S00-001 — executor evidence + +Agent: auto-orchestrator-48aab142ecde (orchestrator) +Date: 2026-10-15 +Result: proposed scope passport, awaiting independent security review. + +## Actual changes + +- `docs/decisions/0000-scope.md`: Web/native boundaries, complete ten-ID exclusion table, retained NET-002 WSS clause, base scope, seven lifecycle states, capability degradation, external provider roles/data boundaries and explicitly deferred passport decisions. +- `experiments/0000-scope/check.py`: dependency-free document experiment comparing excluded IDs with canonical applicability/spec text and checking lifecycle limits. Four in-memory negative mutations remove an ID/reason or add a false closed-tab socket/media promise. No product runtime is simulated. +- Workflow evidence, handoff and mandatory executor commit message only; specifications, planning definitions and shared contracts unchanged. Initial `git status --short` showed only coordinator's `state/tasks.json` claim change. + +## Commands and actual results + +| Command | Exit | Result | +| --- | --- | --- | +| `python3 scripts/tasks.py resume --agent auto-orchestrator-48aab142ecde` | 0 | Assigned S00-001 in_progress; no repeat claim. | +| `python3 scripts/tasks.py show S00-001` | 0 | Scope and acceptance read. | +| `python3 scripts/tasks.py packet S00-001 --agent auto-orchestrator-48aab142ecde` | 0 | Requirements/context printed; no dependencies or prior handoff. | +| `python3 experiments/0000-scope/check.py` | 0 | 10 excluded IDs match registry/specs with reasons; 7 lifecycle scenarios; 4 negative mutations rejected. | +| `make check` | 0 | validate: 275 tasks, 22 stages, 221 requirements, 211 allocated Web requirements, revision 1; 66 tooling tests passed in 10.090s. Includes spec integrity checks; does not prove app readiness. | +| `git diff --check` | 0 | No tracked diff whitespace errors. | +| `git status --short` | 0 | Before evidence: only state/tasks.json, scope ADR and experiments tree changed. | + +The focused checker uses Python assertions; run the exact command without `-O`. Human review remains necessary for the meaning of prose and provider/privacy boundaries. `git diff --check` does not inspect untracked contents; authored files were read separately and whitespace-checked before submit. + +## Primary-source inspection + +Read through web tool on 2026-10-15: RFC 7395 §6 (TLS/WSS); XEP-0206 (BOSH alternative); W3C Push API introduction/§4 (event delivery, permission and metadata); W3C Service Workers §2.1.1 (event lifetime/termination); XEP-0357 §2/§5 (two-tier push and separate enable). Exact dated W3C source links are in the ADR. No library/vendor was selected and no new dependency was installed. + +## Limits and review input + +No actual browser, XMPP server, push registration, TURN relay, upload or maps integration was exercised. The task result is a scope decision/document experiment. Browser matrix, stack, unlock, topology, limits and interoperability remain explicit future decisions S00-002…010. ADR remains proposed until independent review. Review must assess GEN-005, GEN-006 and WEB-002, all exclusion reasons, the retained NET-002 clause, provider data minimization and absence of secrets/out-of-scope implementation. diff --git a/state/handoffs/S00-001.md b/state/handoffs/S00-001.md new file mode 100644 index 0000000..76973a4 --- /dev/null +++ b/state/handoffs/S00-001.md @@ -0,0 +1,10 @@ +# S00-001 handoff + +Executor: auto-orchestrator-48aab142ecde, orchestrator +Outcome: proposed Web-scope passport in `docs/decisions/0000-scope.md`; complete ten-ID native exclusion table and provider inventory. No blocker. No dependencies or previous handoff. + +Ready for independent security reviewer. Read the ADR, canonical applicability, GEN-005/006 and WEB-002, then run `python3 experiments/0000-scope/check.py`. Check the NET-002 retained Web clause, conditional push registration, closed-tab/media restrictions, logout/revoke and provider secret/metadata boundaries. Verify executor message against actual diff and evidence. Coordinator owns commit and next fresh process; executor does not set done. + +Checks passed: focused document experiment (10 excluded IDs, 7 scenarios, 4 rejected negative mutations), `make check` (validate + 66 tooling tests), whitespace/scope inspection. Evidence: `state/evidence/S00-001-auto-orchestrator-48aab142ecde.md`. + +Limits: no browser/provider runtime test; no chosen framework/library/browser versions, persistent unlock model or deployed topology. These remain S00-002…010 decisions, not missing implementation in S00-001. ADR status is proposed; reviewer should explicitly record acceptance or rejection through assigned workflow. Shared contracts/specs/plan definitions were not changed. diff --git a/state/tasks.json b/state/tasks.json index 81e9abb..74a3711 100644 --- a/state/tasks.json +++ b/state/tasks.json @@ -1,10 +1,15 @@ { "schema_version": 1, - "revision": 0, + "revision": 2, "tasks": { "S00-001": { - "status": "todo", - "owner": null + "status": "review", + "owner": "auto-orchestrator-48aab142ecde", + "started_at": "2026-10-14T17:57:54+00:00", + "reason": null, + "updated_at": "2026-10-14T18:01:57+00:00", + "evidence": "state/evidence/S00-001-auto-orchestrator-48aab142ecde.md", + "handoff": "state/handoffs/S00-001.md" }, "S00-002": { "status": "todo", @@ -1103,5 +1108,29 @@ "owner": null } }, - "events": [] + "events": [ + { + "revision": 1, + "at": "2026-10-14T17:57:54+00:00", + "action": "claim", + "task": "S00-001", + "agent": "auto-orchestrator-48aab142ecde", + "role": "orchestrator", + "from": "todo", + "to": "in_progress", + "reason": null + }, + { + "revision": 2, + "at": "2026-10-14T18:01:57+00:00", + "action": "submit", + "task": "S00-001", + "agent": "auto-orchestrator-48aab142ecde", + "role": null, + "from": "in_progress", + "to": "review", + "reason": null, + "evidence": "state/evidence/S00-001-auto-orchestrator-48aab142ecde.md" + } + ] }