diff --git a/planning/ROADMAP.md b/planning/ROADMAP.md index 1ce54a2..32d9988 100644 --- a/planning/ROADMAP.md +++ b/planning/ROADMAP.md @@ -6,7 +6,7 @@ Зафиксировать Web scope, browser targets и проверенные кандидаты, не устанавливая непроверенный framework по догадке. -Задач: 28; entry: нет; exit: S00-010. +Задач: 29; entry: нет; exit: S00-010. ## [S01: Предметные контракты](stages/S01.md) diff --git a/planning/TASK_MATRIX.md b/planning/TASK_MATRIX.md index 1cec536..ee17243 100644 --- a/planning/TASK_MATRIX.md +++ b/planning/TASK_MATRIX.md @@ -1,6 +1,6 @@ # Матрица задач -Generated; state revision **89**. Canonical status: state/tasks.json. +Generated; state revision **91**. Canonical status: state/tasks.json. | ID | Этап | Оператор | Reviewer | Статус | Owner | Зависимости | Задача | | --- | --- | --- | --- | --- | --- | --- | --- | @@ -24,13 +24,14 @@ Generated; state revision **89**. Canonical status: state/tasks.json. | [S00-019](tasks/S00-019.md) | S00 | crypto | security | done | auto-crypto-c68801170fa4 | S00-001, S00-002, S00-017, S00-018 | Validate browser-compatible SCRAM-SHA-512 through a public mechanism API | | [S00-020](tasks/S00-020.md) | S00 | ci-cd | qa | done | auto-ci-cd-2a0186c54ce9 | S00-001, S00-002, S00-017, S00-018, S00-019, S00-024 | Restore access to the pinned Linux XMPP experiment toolchain | | [S00-021](tasks/S00-021.md) | S00 | crypto | security | done | auto-crypto-fcef9b6781bf | S00-001, S00-002 | Устранить прерывание: Проверить browser OMEMO backend | -| [S00-022](tasks/S00-022.md) | S00 | crypto | security | todo | | S00-001, S00-002, S00-021, S00-027 | Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint | +| [S00-022](tasks/S00-022.md) | S00 | crypto | security | blocked | auto-crypto-bcd7f2a71667 | S00-001, S00-002, S00-021, S00-027, S00-029 | Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint | | [S00-023](tasks/S00-023.md) | S00 | storage | qa | blocked | auto-storage-87486895c792 | S00-002, S00-025 | Устранить прерывание: Выбрать IndexedDB wrapper и migration policy | | [S00-024](tasks/S00-024.md) | S00 | ci-cd | qa | done | auto-ci-cd-49907d48a6d1 | S00-001, S00-002, S00-017, S00-018, S00-019, S00-026 | Устранить прерывание: Restore access to the pinned Linux XMPP experiment toolchain | | [S00-025](tasks/S00-025.md) | S00 | storage | qa | blocked | auto-storage-ae5930b6fbdf | S00-002, S00-028 | Устранить прерывание: Устранить прерывание: Выбрать IndexedDB wrapper и migration policy | | [S00-026](tasks/S00-026.md) | S00 | ci-cd | qa | done | auto-ci-cd-4255c34da227 | S00-001, S00-002, S00-017, S00-018, S00-019 | Provide approved access to the pinned Linux experiment artifacts | | [S00-027](tasks/S00-027.md) | S00 | ci-cd | security | done | auto-ci-cd-40ae46e8efe7 | S00-001, S00-002, S00-021 | Restore approved npm registry connectivity for the OMEMO2 backend investigation | | [S00-028](tasks/S00-028.md) | S00 | ci-cd | qa | todo | | S00-002 | Repair conflicting Codex harness sandbox arguments | +| [S00-029](tasks/S00-029.md) | S00 | orchestrator | security | blocked | | S00-001, S00-002, S00-021, S00-027 | Record an approved browser OMEMO backend sourcing strategy | | [S00-010](tasks/S00-010.md) | S00 | qa | orchestrator | todo | | S00-001, S00-002, S00-003, S00-004, S00-005, S00-006, S00-007, S00-008, S00-009 | Gate: Профиль и проверка стека | | [S01-001](tasks/S01-001.md) | S01 | orchestrator | security | todo | | S00-010 | Описать identity/model contracts | | [S01-002](tasks/S01-002.md) | S01 | orchestrator | security | todo | | S00-010, S01-001 | Описать async account context | diff --git a/planning/TRACEABILITY.md b/planning/TRACEABILITY.md index ce5cafc..f0bbd97 100644 --- a/planning/TRACEABILITY.md +++ b/planning/TRACEABILITY.md @@ -97,15 +97,15 @@ Allocated означает наличие плана/приёмки, а не р | MUC-008 | web | Web requirement; cross-platform clauses apply only in Web context. | S13-009, S21-003 | | ENC-001 | web | Web requirement; cross-platform clauses apply only in Web context. | S12-018, S20-008, S21-003 | | ENC-002 | web | Web requirement; cross-platform clauses apply only in Web context. | S01-005, S08-004, S12-007, S12-008, S12-018, S12-020, S21-003 | -| ENC-003 | web | Web requirement; cross-platform clauses apply only in Web context. | S00-004, S00-022, S00-027, S12-005, S12-006, S12-007, S12-008, S12-009, S12-010, S12-011, S12-012, S12-014, S12-021, S21-003 | +| ENC-003 | web | Web requirement; cross-platform clauses apply only in Web context. | S00-004, S00-022, S00-027, S00-029, S12-005, S12-006, S12-007, S12-008, S12-009, S12-010, S12-011, S12-012, S12-014, S12-021, S21-003 | | ENC-004 | web | Web requirement; cross-platform clauses apply only in Web context. | S12-015, S12-021, S13-006, S21-003 | | ENC-005 | web | Web requirement; cross-platform clauses apply only in Web context. | S12-016, S12-021, S21-003 | | ENC-006 | web | Web requirement; cross-platform clauses apply only in Web context. | S01-005, S12-002, S12-003, S12-020, S21-003 | | ENC-007 | web | Web requirement; cross-platform clauses apply only in Web context. | S12-004, S12-019, S21-003 | | ENC-008 | web | Web requirement; cross-platform clauses apply only in Web context. | S12-019, S21-003 | -| ENC-009 | web | Web requirement; cross-platform clauses apply only in Web context. | S00-004, S00-022, S00-027, S12-001, S12-013, S12-017, S12-020, S21-003 | +| ENC-009 | web | Web requirement; cross-platform clauses apply only in Web context. | S00-004, S00-022, S00-027, S00-029, S12-001, S12-013, S12-017, S12-020, S21-003 | | ENC-010 | web | Web requirement; cross-platform clauses apply only in Web context. | S12-020, S20-004, S21-003 | -| ENC-011 | web | Web requirement; cross-platform clauses apply only in Web context. | S00-004, S00-022, S00-027, S12-010, S12-011, S12-012, S12-013, S12-014, S21-003 | +| ENC-011 | web | Web requirement; cross-platform clauses apply only in Web context. | S00-004, S00-022, S00-027, S00-029, S12-010, S12-011, S12-012, S12-013, S12-014, S21-003 | | FILE-001 | web | Web requirement; cross-platform clauses apply only in Web context. | S14-002, S21-004 | | FILE-002 | web | Web requirement; cross-platform clauses apply only in Web context. | S14-001, S14-011, S21-004 | | FILE-003 | web | Web requirement; cross-platform clauses apply only in Web context. | S01-006, S14-001, S21-004 | diff --git a/planning/stages/S00.md b/planning/stages/S00.md index d92241a..6a9413d 100644 --- a/planning/stages/S00.md +++ b/planning/stages/S00.md @@ -26,13 +26,14 @@ - [S00-019](../tasks/S00-019.md): Validate browser-compatible SCRAM-SHA-512 through a public mechanism API — crypto; done. - [S00-020](../tasks/S00-020.md): Restore access to the pinned Linux XMPP experiment toolchain — ci-cd; done. - [S00-021](../tasks/S00-021.md): Устранить прерывание: Проверить browser OMEMO backend — crypto; done. -- [S00-022](../tasks/S00-022.md): Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint — crypto; todo. +- [S00-022](../tasks/S00-022.md): Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint — crypto; blocked. - [S00-023](../tasks/S00-023.md): Устранить прерывание: Выбрать IndexedDB wrapper и migration policy — storage; blocked. - [S00-024](../tasks/S00-024.md): Устранить прерывание: Restore access to the pinned Linux XMPP experiment toolchain — ci-cd; done. - [S00-025](../tasks/S00-025.md): Устранить прерывание: Устранить прерывание: Выбрать IndexedDB wrapper и migration policy — storage; blocked. - [S00-026](../tasks/S00-026.md): Provide approved access to the pinned Linux experiment artifacts — ci-cd; done. - [S00-027](../tasks/S00-027.md): Restore approved npm registry connectivity for the OMEMO2 backend investigation — ci-cd; done. - [S00-028](../tasks/S00-028.md): Repair conflicting Codex harness sandbox arguments — ci-cd; todo. +- [S00-029](../tasks/S00-029.md): Record an approved browser OMEMO backend sourcing strategy — orchestrator; blocked. - [S00-010](../tasks/S00-010.md): Gate: Профиль и проверка стека — qa; todo. ## Граница этапа diff --git a/planning/task_matrix.csv b/planning/task_matrix.csv index 4bd5b5b..41a9724 100644 --- a/planning/task_matrix.csv +++ b/planning/task_matrix.csv @@ -19,13 +19,14 @@ S00-018,S00,protocol,security,done,auto-protocol-89fe6563092c,"S00-001, S00-002, S00-019,S00,crypto,security,done,auto-crypto-c68801170fa4,"S00-001, S00-002, S00-017, S00-018",Validate browser-compatible SCRAM-SHA-512 through a public mechanism API S00-020,S00,ci-cd,qa,done,auto-ci-cd-2a0186c54ce9,"S00-001, S00-002, S00-017, S00-018, S00-019, S00-024",Restore access to the pinned Linux XMPP experiment toolchain S00-021,S00,crypto,security,done,auto-crypto-fcef9b6781bf,"S00-001, S00-002",Устранить прерывание: Проверить browser OMEMO backend -S00-022,S00,crypto,security,todo,,"S00-001, S00-002, S00-021, S00-027",Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint +S00-022,S00,crypto,security,blocked,auto-crypto-bcd7f2a71667,"S00-001, S00-002, S00-021, S00-027, S00-029",Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint S00-023,S00,storage,qa,blocked,auto-storage-87486895c792,"S00-002, S00-025",Устранить прерывание: Выбрать IndexedDB wrapper и migration policy S00-024,S00,ci-cd,qa,done,auto-ci-cd-49907d48a6d1,"S00-001, S00-002, S00-017, S00-018, S00-019, S00-026",Устранить прерывание: Restore access to the pinned Linux XMPP experiment toolchain S00-025,S00,storage,qa,blocked,auto-storage-ae5930b6fbdf,"S00-002, S00-028",Устранить прерывание: Устранить прерывание: Выбрать IndexedDB wrapper и migration policy S00-026,S00,ci-cd,qa,done,auto-ci-cd-4255c34da227,"S00-001, S00-002, S00-017, S00-018, S00-019",Provide approved access to the pinned Linux experiment artifacts S00-027,S00,ci-cd,security,done,auto-ci-cd-40ae46e8efe7,"S00-001, S00-002, S00-021",Restore approved npm registry connectivity for the OMEMO2 backend investigation S00-028,S00,ci-cd,qa,todo,,S00-002,Repair conflicting Codex harness sandbox arguments +S00-029,S00,orchestrator,security,blocked,,"S00-001, S00-002, S00-021, S00-027",Record an approved browser OMEMO backend sourcing strategy S00-010,S00,qa,orchestrator,todo,,"S00-001, S00-002, S00-003, S00-004, S00-005, S00-006, S00-007, S00-008, S00-009",Gate: Профиль и проверка стека S01-001,S01,orchestrator,security,todo,,S00-010,Описать identity/model contracts S01-002,S01,orchestrator,security,todo,,"S00-010, S01-001",Описать async account context diff --git a/planning/tasks.json b/planning/tasks.json index f28e5c6..f8a2b92 100644 --- a/planning/tasks.json +++ b/planning/tasks.json @@ -1243,7 +1243,8 @@ "S00-001", "S00-002", "S00-021", - "S00-027" + "S00-027", + "S00-029" ], "requirements": [ "ENC-003", @@ -1597,6 +1598,62 @@ ], "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", diff --git a/planning/tasks/.S00-007.mdf8c1r9rh b/planning/tasks/.S00-007.mdf8c1r9rh new file mode 100644 index 0000000..1413d60 --- /dev/null +++ b/planning/tasks/.S00-007.mdf8c1r9rh @@ -0,0 +1,57 @@ +# S00-007: Утвердить password и crypto unlock модель + +> Generated from planning/tasks.json; status is in state/tasks.json. + +- Этап: S00 +- Оператор: security +- Reviewer: orchestrator +- Зависимости: S00-004, S00-005 +- Требования: STORE-003, LOCK-004, SEC-001 + +## Один результат + +ADR отделяет session password в памяти от persisted crypto key wrapping и app lock verifier. + +## Разрешённые пути + +- `docs/decisions/0006-secret-model.md` +- `experiments/0006-secret-model/**` + +Не изменять другие modules, shared contracts или spec snapshots без изменения плана. Stem без расширения разрешает принятые stack-specific extensions и focused test рядом. + +## Прочитать + +- docs/WEB_PROFILE.md +- docs/ARCHITECTURE.md +- docs/CONTRACTS.md +- docs/TESTING.md +- roles/security.md +- docs/decisions/README.md + +## Шаги + +1. Прочитать приведённые requirements, контракт через реестр и evidence прямых dependencies. +2. До выбора стека: читать реальные первичные документы кандидатов, выполнить только разрешённый focused experiment, записать решение/ограничения. Не считать framework/backend уже принятым. +3. Работать только над одним указанным outcome. Если для него нужен новый shared contract — создать отдельную remediation через escalate, заблокировать original и завершить запуск; не расширять текущий scope. +4. ADR отделяет session password в памяти от persisted crypto key wrapping и app lock verifier. +5. Добавить focused fixtures/checks из списка ниже, выполнить их и записать фактический результат. + +## Приёмка + +1. ADR отделяет session password в памяти от persisted crypto key wrapping и app lock verifier. +2. Reload требует login при отсутствии persistent solution +3. plaintext localStorage запрещён +4. Нет изменений вне scope; реальный результат/evidence и handoff позволяют другому агенту продолжить. + +## Focused checks + +1. Reload требует login при отсутствии persistent solution +2. plaintext localStorage запрещён + +## Блокер и завершение запуска + +Для всех ролей scope — только эта задача. При блокере создать issue JSON по state/ISSUE_TEMPLATE.json, вызвать escalate с текущим ID/role/agent, проверить status=blocked и resolution_task, затем немедленно завершить запуск. Не решать blocker и не выбирать следующую задачу самому. Новый агент назначается runner. Правки metadata через CLI — единственное исключение scope. + +## Передача + +Сохранить evidence/handoff; submit → review и завершить запуск. Reviewer также выполняет только эту задачу, включая обязательное escalate при блокере. diff --git a/planning/tasks/S00-022.md b/planning/tasks/S00-022.md index a854555..eb40ff0 100644 --- a/planning/tasks/S00-022.md +++ b/planning/tasks/S00-022.md @@ -7,7 +7,7 @@ - Этап: S00 - Оператор: crypto - Reviewer: security -- Зависимости: S00-001, S00-002, S00-021, S00-027 +- Зависимости: S00-001, S00-002, S00-021, S00-027, S00-029 - Требования: ENC-003, ENC-009, ENC-011 ## Один результат diff --git a/planning/tasks/S00-029.md b/planning/tasks/S00-029.md new file mode 100644 index 0000000..0005a3f --- /dev/null +++ b/planning/tasks/S00-029.md @@ -0,0 +1,58 @@ +# S00-029: Record an approved browser OMEMO backend sourcing strategy + +- Remediation для: S00-022; root: S00-004; depth: 2 + +> Generated from planning/tasks.json; status is in state/tasks.json. + +- Этап: S00 +- Оператор: orchestrator +- Reviewer: security +- Зависимости: S00-001, S00-002, S00-021, S00-027 +- Требования: ENC-003, ENC-009, ENC-011 + +## Один результат + +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. + +## Разрешённые пути + +- `docs/decisions/0003-browser-backend-decision.md` + +Не изменять другие modules, shared contracts или spec snapshots без изменения плана. Stem без расширения разрешает принятые stack-specific extensions и focused test рядом. + +## Прочитать + +- 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 + +## Шаги + +1. Obtain explicit owner input naming a backend strategy; do not infer approval from candidate availability. +2. Record traceable primary sources, exact target, license/support constraints and required independent security assessment and SCE path. +3. If alternative engine is selected, require separate reviewed plan change for preservation wording before S00-022 resumes implementation. +4. Submit only the bounded decision for independent security review; do not implement crypto. + +## Приёмка + +1. Explicit owner decision is recorded; the candidate is not declared audited or interoperable without evidence. +2. Decision preserves ENC-003/009/011 and identifies remaining browser/SCE/vector/persistence checks. +3. Any engine replacement is contingent on reviewed plan change; no silent replacement or implementation occurs. + +## Focused checks + +1. Verify owner input and primary-source traceability for named target/license/support/security and SCE boundaries. +2. Independent security review confirms decision addresses engine/persistence preservation and contains no requirement bypass. + +## Блокер и завершение запуска + +Для всех ролей scope — только эта задача. При блокере создать issue JSON по state/ISSUE_TEMPLATE.json, вызвать escalate с текущим ID/role/agent, проверить status=blocked и resolution_task, затем немедленно завершить запуск. Не решать blocker и не выбирать следующую задачу самому. Новый агент назначается runner. Правки metadata через CLI — единственное исключение scope. + +## Передача + +Сохранить evidence/handoff; submit → review и завершить запуск. Reviewer также выполняет только эту задачу, включая обязательное escalate при блокере. diff --git a/state/blockers/S00-029.md b/state/blockers/S00-029.md new file mode 100644 index 0000000..c33b0f7 --- /dev/null +++ b/state/blockers/S00-029.md @@ -0,0 +1,22 @@ +# Blocker S00-029 + +- Original task: S00-022 +- Root task: S00-004 +- Reporter: auto-crypto-bcd7f2a71667 +- Role: crypto +- Original owner: auto-crypto-bcd7f2a71667 +- Waits for user/external condition: True + +## Cause + +Pinned libomemo.js@3.0.0 supplies real embedded WASM but is a different unaudited ratchet and excludes consumer SCE; no approved decision reconciles it with S00-022 retained audited engine/persistence requirement. + +## One remediation 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. + +## Evidence / reproduction + +npm view libomemo.js@3.0.0 succeeds; pinned tarball README and bundle inspection establish candidate scope, embedded WASM and unaudited/SCE boundaries. Existing wasm-unsupported probe exits 2. See state/evidence/S00-022-auto-crypto-bcd7f2a71667.md. + +The reporting agent must stop now. A new agent implements only S00-029. diff --git a/state/evidence/S00-022-auto-crypto-bcd7f2a71667.md b/state/evidence/S00-022-auto-crypto-bcd7f2a71667.md new file mode 100644 index 0000000..454a3c9 --- /dev/null +++ b/state/evidence/S00-022-auto-crypto-bcd7f2a71667.md @@ -0,0 +1,89 @@ +# S00-022 bounded candidate investigation — blocker + +Agent: auto-crypto-bcd7f2a71667; role: crypto; date: 2026-10-15. +No backend accepted. No source, ADR, experiment, spec or shared contract changed. + +## Inputs and commands + +Read master_prompt/startup/role/workflow/Git documents, required TESTING, ADR index, +state/blockers/S00-022.md, current card, CLI packet, previous handoff, exact +ENC-003/009/011, accepted ADR 0000/0001 and existing 0002 decisions, direct dependency +executor/review evidence and handoffs. CLI resume/show/packet each exit 0, confirming +assigned in_progress owner; no repeated claim. Some large combined read outputs +were truncated. A final exploratory cat of state/blockers/S00-004.md exited 1: +that filename is absent; original S00-004 blocker is state/blockers/S00-022.md, +which was read successfully. No missing required task input is inferred from this. + +`node experiments/0003-crypto-library/session-probe/wasm-unsupported.mjs` +exit 2: pkgPresent true, wasmFiles 0, six native prebuild platform directories, +UNSUPPORTED_BLOCKER. Existing libsignal-client package still supplies no web build. +The session smoke was not rerun; previous reviewed session/persistence evidence +is retained as historical evidence, not this run's successful check. + +`npm view libomemo.js@3.0.0 version license repository dist.integrity dist.tarball time --json --fetch-retries=0 --fetch-timeout=15000 --cache=/tmp/luma-s00-022-bcd7-cache --strict-ssl=true` +exit 0: 3.0.0, GPL-3.0, conversejs/libomemo.js repository, published +2026-08-06T06:59:43.303Z. Metadata proves availability and release activity, not +maintenance SLA, audit, license approval or security suitability. Other package +E404 queries were not repeated: finding this concrete candidate already refutes +prior universal registry absence; enumerating guessed names cannot prove absence. + +Inline Python urllib/ssl/hashlib/base64/tarfile/io inspection exit 0: +retrieved https://registry.npmjs.org/libomemo.js/-/libomemo.js-3.0.0.tgz with +ssl.create_default_context(), timeout 20, asserted HTTP 200 and unchanged final +HTTPS URL, verified SHA512 SRI against metadata. Read archive members in memory +with tarfile.extractfile; no filesystem extraction, install, scripts or package +execution. SRI agrees with registry; independent provenance is not established. + +Archive: 1,061,939 bytes. +SHA256: be30116eca7014a35b3372dc1270d462cf5392ae6affc92c4f4778d003e7bbf8. +SRI: sha512-B4he9DOS+1LQrut+b2xjOjuSkKMAkZGes7ckB5JgVk/EHVNyxLIHx6NvQ3eJVaT1XeNJaWZBonXw3Nl5YKEbig==. + +Pinned package.json declares ESM/UMD and worker-client exports, protobufjs ^8.0.0, +and GPL-3.0. Bundled LICENSE is 32,472 bytes (presence only; no distribution +license clearance claimed). dist/libomemo.esm.js is 519,611 bytes; +dist/libomemo-worker.js is 164,906; worker-client ESM 364,069. +Decoded data:application/octet-stream;base64 payloads in ESM, UMD and worker +variants: 85,585 bytes each, magic 0061736d, SHA256 +3a32503ade92ed2bf522d49d51106a227dadb39c2a7b08a1023c216c7eec1286. +Thus searching only standalone .wasm files would miss this actual embedded asset. +Magic/size/hash inspection is not WebAssembly validation or browser execution. + +Pinned README inspected from same archive: no formal third-party audit; implements +X3DH and Double Ratchet; consumer owns stanzas, PEP/device bundles and XEP-0420 +SCE payload encryption. Claims legacy 0.3.0 and OMEMO2 0.9.1. Requires modern +ArrayBuffer/TypedArray/Promise/WebCrypto AES-CBC and HMAC-SHA256. Worker offloads +curve operations; this does not demonstrate whole crypto lifecycle in a worker. +Browser/worker failure policy and CSP need future independent evaluation. + +Primary web pages opened: https://github.com/conversejs/libomemo.js and +https://xmpp.org/extensions/xep-0384.html. Current upstream README corroborates +these boundaries; pinned archive is authoritative for release inspection. +No XEP revision has been approved by this run; no SCE/key/MAC mapping or full +OMEMO2 known-answer browser roundtrip was executed. Self-roundtrip of ratchet +bytes alone would not prove ENC-011. No test is labeled passed for that outcome. + +## Exact blocker and next input + +Candidate is a different ratchet implementation, with explicit unaudited status +and consumer SCE gap. Existing native Signal session serialization/persistence +cannot be declared compatible with it. Card requires preserving the verified +audited engine/persistence, and no approved external backend strategy currently +bridges that condition. Authorizing a replacement/security assessment/migration +is an external architecture/security decision, not this executor's choice. + +Request one recorded decision from architecture/security/product owner: supply +a maintained browser/WASM port of the retained engine with license/support and +SCE source path, OR authorize evaluation of a named alternative (libomemo.js +3.0.0 is a concrete candidate), with explicit independent security assessment, +license approval route and isolated persistence migration requirements. This +must not waive ENC-003/009/011 or declare the candidate audited/compatible. +A separately reviewed plan decision must adjust preservation wording if an +alternative is chosen before implementation proceeds. No homegrown primitives, +plaintext fallback or server decryption is an acceptable resolution. + +No make check or application test was run: this run stopped at sourcing decision +blocker. ADR 0003 remains unchanged/proposed; its universal package-absence and +unsupported assertion that Signal has a WASM distribution are not established +by the cited E404. Fresh continuation should correct them from pinned evidence. +Git status initial read exit 0 showed only coordinator state/tasks.json claim. +Coordinator performs checkpoint commit; reporter ends after escalation. diff --git a/state/handoffs/S00-022.md b/state/handoffs/S00-022.md index 5eae7cc..66ff60a 100644 --- a/state/handoffs/S00-022.md +++ b/state/handoffs/S00-022.md @@ -1,17 +1,26 @@ # Handoff S00-022 -Agent: auto-crypto-316a193d6c3e; role: crypto. Disposition: blocker escalation; no backend accepted. +Agent: auto-crypto-bcd7f2a71667; role: crypto. Disposition: blocker; no backend accepted. -## Reached result +Registry connectivity works. Pinned libomemo.js@3.0.0 metadata query and validated +HTTPS tarball inspection exit 0; SRI matches, archive 1,061,939 bytes. Browser ESM, +UMD and worker bundles embed real 85,585-byte WASM (magic/hash checked only). +Pinned README excludes consumer SCE and reports no formal third-party audit. +Candidate is a different ratchet, not a verified browser port preserving existing +native libsignal engine/session records. Existing unsupported probe again exits 2. +Full commands/digests/limitations: state/evidence/S00-022-auto-crypto-bcd7f2a71667.md. -Installed libsignal-client unsupported probe reproduced exit 2 with pkgPresent true and zero .wasm files. Web search found conversejs/libomemo.js as a concrete browser/WASM OMEMO2 ratchet candidate previously omitted from registry queries. Its README explicitly excludes consumer SCE encryption and reports no formal third-party audit. Do not substitute this discovery for an audited, tested full backend or silently replace existing session/persistence semantics. +Exact obstacle: no approved backend strategy reconciles this concrete alternative +with card's audited engine/persistence preservation and ENC-009/011. No browser +known-answer full OMEMO2/SCE test, audit, migration or wire compatibility passed. +No source/ADR edits made after identifying blocker; ADR 0003 remains proposed. -## Exact obstacle and reproduction - -`npm view libomemo.js version license dist-tags --json --fetch-retries=0 --fetch-timeout=15000 --cache=/tmp/luma-s00-022-npm-cache` exits 1 with EAI_AGAIN resolving configured proxy. All nine other metadata queries fail the same way, including the known libsignal-client control. This is network failure, not E404. Evidence: state/evidence/S00-022-auto-crypto-316a193d6c3e.md. - -## One required next input - -Environment/network owner must restore normal authenticated-if-required HTTPS npm registry access through the approved proxy for the fresh agent, without disclosing credentials, disabling TLS, or bypassing policy. Resolver verifies only connectivity, then independent review. It must not implement OMEMO or accept a library. - -After reviewed resolver completion, a new S00-022 executor should query a pinned libomemo.js release and primary sources, check real embedded WASM/worker artifacts, license/support/audit constraints, approved SCE mapping, and existing engine/persistence compatibility. A full web-target known-answer roundtrip remains unperformed. ADR 0003 remains proposed and unchanged; its universal registry-absence and Signal-WASM claims need bounded correction once research can proceed. Do not call S00-022 or S00-004 done from this handoff. +Required external input: architecture/security/product owner records one backend +strategy: retained audited engine's maintained browser port with primary-source +license/support/SCE path, or authorization to evaluate a named alternative with +independent security assessment and explicit license/persistence migration route. +Any changed preservation condition must be reviewed through plan workflow, not +silently waived. No relaxation of ENC-003/009/011. Resolver records only this +bounded decision; it does not implement crypto or mark S00-004/S00-022 complete. +Fresh continuation may correct universal registry-absence/Signal-WASM assertions +in ADR and evaluate approved pinned target. Reporter exits after escalation. diff --git a/state/issues/S00-022-auto-crypto-bcd7f2a71667.json b/state/issues/S00-022-auto-crypto-bcd7f2a71667.json new file mode 100644 index 0000000..989dcde --- /dev/null +++ b/state/issues/S00-022-auto-crypto-bcd7f2a71667.json @@ -0,0 +1,28 @@ +{ + "title": "Record an approved browser OMEMO backend sourcing strategy", + "reason": "Pinned libomemo.js@3.0.0 supplies real embedded WASM but is a different unaudited ratchet and excludes consumer SCE; no approved decision reconciles it with S00-022 retained audited engine/persistence requirement.", + "reproduction": "npm view libomemo.js@3.0.0 succeeds; pinned tarball README and bundle inspection establish candidate scope, embedded WASM and unaudited/SCE boundaries. Existing wasm-unsupported probe exits 2. See state/evidence/S00-022-auto-crypto-bcd7f2a71667.md.", + "role": "orchestrator", + "reviewer_role": "security", + "scope": [ + "docs/decisions/0003-browser-backend-decision.md" + ], + "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.", + "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." + ], + "depends_on": [], + "requires_user_input": true +} diff --git a/state/tasks.json b/state/tasks.json index d8ab42b..4778746 100644 --- a/state/tasks.json +++ b/state/tasks.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "revision": 89, + "revision": 91, "tasks": { "S00-001": { "status": "done", @@ -1311,15 +1311,17 @@ "completed_at": "2026-10-15T08:40:27+00:00" }, "S00-022": { - "status": "todo", - "owner": null, + "status": "blocked", + "owner": "auto-crypto-bcd7f2a71667", "external_wait": false, - "reason": null, - "started_at": "2026-10-15T09:39:15+00:00", - "updated_at": "2026-10-15T10:14:41+00:00", - "blocked_by": [], + "reason": "Pinned libomemo.js@3.0.0 supplies real embedded WASM but is a different unaudited ratchet and excludes consumer SCE; no approved decision reconciles it with S00-022 retained audited engine/persistence requirement.", + "started_at": "2026-10-15T10:14:47+00:00", + "updated_at": "2026-10-15T10:17:13+00:00", + "blocked_by": [ + "S00-029" + ], "resume_status": "in_progress", - "blocker_report": "state/blockers/S00-027.md", + "blocker_report": "state/blockers/S00-029.md", "handoff": "state/handoffs/S00-022.md", "previous_owner": "auto-crypto-316a193d6c3e", "resumed_after_blocker": true @@ -1401,6 +1403,12 @@ "owner": null, "external_wait": false, "reason": "Coordinator supplies the active compatible argv from runner.local.json: codex -c sandbox_workspace_write.network_access=true exec --approve-for-me --ephemeral -. Explicit --sandbox was removed before the S00-024/S00-022/S00-025 fresh agent launches. --approve-for-me retains workspace-write per installed CLI help; no danger-full-access or bypass option. Actual subsequent run state/runs/auto-storage-ae5930b6fbdf/run.json shows the fresh harness executed tools and reached its own escalate, unlike the original immediate CLI exit 2. Installed CLI bounded help check codex exec --approve-for-me --ephemeral --help exited 0. Outbound network config retains existing proxy and TLS, independently probed via codex -c sandbox_mode='\"workspace-write\"' -c sandbox_workspace_write.network_access=true sandbox -- python3 /tmp/luma-probe-registry.py, exit 0; state/runs/coordinator-network/output.log. Fresh S00-028 executor/QA must verify supported argv and filesystem scope; no storage task completion or launcher repair acceptance claimed." + }, + "S00-029": { + "status": "blocked", + "owner": null, + "external_wait": true, + "reason": "Pinned libomemo.js@3.0.0 supplies real embedded WASM but is a different unaudited ratchet and excludes consumer SCE; no approved decision reconciles it with S00-022 retained audited engine/persistence requirement." } }, "events": [ @@ -2537,6 +2545,29 @@ "to": "done", "reason": null, "evidence": "state/evidence/S00-027-review.md" + }, + { + "revision": 90, + "at": "2026-10-15T10:14:47+00:00", + "action": "claim", + "task": "S00-022", + "agent": "auto-crypto-bcd7f2a71667", + "role": "crypto", + "from": "todo", + "to": "in_progress", + "reason": null + }, + { + "revision": 91, + "at": "2026-10-15T10:17:13+00:00", + "action": "escalate", + "task": "S00-022", + "resolution_task": "S00-029", + "agent": "auto-crypto-bcd7f2a71667", + "role": "crypto", + "from": "in_progress", + "to": "blocked", + "reason": "Pinned libomemo.js@3.0.0 supplies real embedded WASM but is a different unaudited ratchet and excludes consumer SCE; no approved decision reconciles it with S00-022 retained audited engine/persistence requirement." } ], "retired_agents": [ @@ -2557,6 +2588,7 @@ "auto-storage-87486895c792", "auto-ci-cd-988167c541cf", "auto-crypto-316a193d6c3e", - "auto-storage-ae5930b6fbdf" + "auto-storage-ae5930b6fbdf", + "auto-crypto-bcd7f2a71667" ] }