S00-001: 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. Task: S00-001 Agent: auto-orchestrator-48aab142ecde Role: orchestrator Action: claim Status: review Task title: Утвердить Web-профиль
This commit is contained in:
1 parent
522311022f
commit
d5ed7eaaed
9 files changed
+247
-8
No files matched your search
@@ -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.
|
||||
@@ -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()
|
||||
@@ -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 |
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
+33
-4
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user