S00-004: Record blocked task and remediation handoff

Changes: Preserve incomplete work and blocker metadata for S00-004. This checkpoint does not mark implementation accepted.
Validation: Session ended with status blocked.
Blocker: S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope.

Task: S00-004
Agent: auto-crypto-fe1c81c17ded
Role: crypto
Action: claim
Status: blocked

Task title: Проверить browser OMEMO backend
This commit is contained in:
wt committed 2026-10-15 15:42:43 +07:00
1 parent a02412d7c7
commit 55d9c69a21
13 files changed
+356 -63

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@
Зафиксировать Web scope, browser targets и проверенные кандидаты, не устанавливая непроверенный framework по догадке. Зафиксировать Web scope, browser targets и проверенные кандидаты, не устанавливая непроверенный framework по догадке.
Задач: 21; entry: нет; exit: S00-010. Задач: 22; entry: нет; exit: S00-010.
## [S01: Предметные контракты](stages/S01.md) ## [S01: Предметные контракты](stages/S01.md)
+3 -2
View File
@@ -1,13 +1,13 @@
# Матрица задач # Матрица задач
Generated; state revision **60**. Canonical status: state/tasks.json. Generated; state revision **62**. Canonical status: state/tasks.json.
| ID | Этап | Оператор | Reviewer | Статус | Owner | Зависимости | Задача | | ID | Этап | Оператор | Reviewer | Статус | Owner | Зависимости | Задача |
| --- | --- | --- | --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- | --- | --- | --- |
| [S00-001](tasks/S00-001.md) | S00 | orchestrator | security | done | auto-orchestrator-48aab142ecde | | Утвердить Web-профиль | | [S00-001](tasks/S00-001.md) | S00 | orchestrator | security | done | auto-orchestrator-48aab142ecde | | Утвердить Web-профиль |
| [S00-002](tasks/S00-002.md) | S00 | orchestrator | security | done | auto-orchestrator-68a05c587e33 | S00-001, S00-011, S00-012 | Выбрать framework и build runtime | | [S00-002](tasks/S00-002.md) | S00 | orchestrator | security | done | auto-orchestrator-68a05c587e33 | S00-001, S00-011, S00-012 | Выбрать framework и build runtime |
| [S00-003](tasks/S00-003.md) | S00 | protocol | qa | blocked | auto-protocol-59f4d359b339 | S00-001, S00-002, S00-017, S00-018, S00-019, S00-020 | Проверить XMPP WSS/auth библиотеку | | [S00-003](tasks/S00-003.md) | S00 | protocol | qa | blocked | auto-protocol-59f4d359b339 | S00-001, S00-002, S00-017, S00-018, S00-019, S00-020 | Проверить XMPP WSS/auth библиотеку |
| [S00-004](tasks/S00-004.md) | S00 | crypto | security | todo | | S00-001, S00-002, S00-021 | Проверить browser OMEMO backend | | [S00-004](tasks/S00-004.md) | S00 | crypto | security | blocked | auto-crypto-fe1c81c17ded | S00-001, S00-002, S00-021, S00-022 | Проверить browser OMEMO backend |
| [S00-005](tasks/S00-005.md) | S00 | storage | qa | todo | | S00-002 | Выбрать IndexedDB wrapper и migration policy | | [S00-005](tasks/S00-005.md) | S00 | storage | qa | todo | | S00-002 | Выбрать IndexedDB wrapper и migration policy |
| [S00-006](tasks/S00-006.md) | S00 | orchestrator | security | todo | | S00-002 | Зафиксировать browser/reference matrix | | [S00-006](tasks/S00-006.md) | S00 | orchestrator | security | todo | | S00-002 | Зафиксировать browser/reference matrix |
| [S00-007](tasks/S00-007.md) | S00 | security | orchestrator | todo | | S00-004, S00-005 | Утвердить password и crypto unlock модель | | [S00-007](tasks/S00-007.md) | S00 | security | orchestrator | todo | | S00-004, S00-005 | Утвердить password и crypto unlock модель |
@@ -24,6 +24,7 @@ Generated; state revision **60**. 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-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 | in_progress | auto-ci-cd-5a18c8aa1b42 | S00-001, S00-002, S00-017, S00-018, S00-019 | Restore access to the pinned Linux XMPP experiment toolchain | | [S00-020](tasks/S00-020.md) | S00 | ci-cd | qa | in_progress | auto-ci-cd-5a18c8aa1b42 | S00-001, S00-002, S00-017, S00-018, S00-019 | 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-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 | blocked | | S00-001, S00-002, S00-021 | Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint |
| [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: Профиль и проверка стека | | [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-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 | | [S01-002](tasks/S01-002.md) | S01 | orchestrator | security | todo | | S00-010, S01-001 | Описать async account context |
+3 -3
View File
@@ -97,15 +97,15 @@ Allocated означает наличие плана/приёмки, а не р
| MUC-008 | web | Web requirement; cross-platform clauses apply only in Web context. | S13-009, S21-003 | | 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-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-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, 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, 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-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-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-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-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-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, 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, 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-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, 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, 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-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-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 | | FILE-003 | web | Web requirement; cross-platform clauses apply only in Web context. | S01-006, S14-001, S21-004 |
+2 -1
View File
@@ -9,7 +9,7 @@
- [S00-001](../tasks/S00-001.md): Утвердить Web-профиль — orchestrator; done. - [S00-001](../tasks/S00-001.md): Утвердить Web-профиль — orchestrator; done.
- [S00-002](../tasks/S00-002.md): Выбрать framework и build runtime — orchestrator; done. - [S00-002](../tasks/S00-002.md): Выбрать framework и build runtime — orchestrator; done.
- [S00-003](../tasks/S00-003.md): Проверить XMPP WSS/auth библиотеку — protocol; blocked. - [S00-003](../tasks/S00-003.md): Проверить XMPP WSS/auth библиотеку — protocol; blocked.
- [S00-004](../tasks/S00-004.md): Проверить browser OMEMO backend — crypto; todo. - [S00-004](../tasks/S00-004.md): Проверить browser OMEMO backend — crypto; blocked.
- [S00-005](../tasks/S00-005.md): Выбрать IndexedDB wrapper и migration policy — storage; todo. - [S00-005](../tasks/S00-005.md): Выбрать IndexedDB wrapper и migration policy — storage; todo.
- [S00-006](../tasks/S00-006.md): Зафиксировать browser/reference matrix — orchestrator; todo. - [S00-006](../tasks/S00-006.md): Зафиксировать browser/reference matrix — orchestrator; todo.
- [S00-007](../tasks/S00-007.md): Утвердить password и crypto unlock модель — security; todo. - [S00-007](../tasks/S00-007.md): Утвердить password и crypto unlock модель — security; todo.
@@ -26,6 +26,7 @@
- [S00-019](../tasks/S00-019.md): Validate browser-compatible SCRAM-SHA-512 through a public mechanism API — crypto; done. - [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; in_progress. - [S00-020](../tasks/S00-020.md): Restore access to the pinned Linux XMPP experiment toolchain — ci-cd; in_progress.
- [S00-021](../tasks/S00-021.md): Устранить прерывание: Проверить browser OMEMO backend — crypto; 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; blocked.
- [S00-010](../tasks/S00-010.md): Gate: Профиль и проверка стека — qa; todo. - [S00-010](../tasks/S00-010.md): Gate: Профиль и проверка стека — qa; todo.
## Граница этапа ## Граница этапа
+2 -1
View File
@@ -2,7 +2,7 @@ id,stage,operator,reviewer,status,owner,depends_on,title
S00-001,S00,orchestrator,security,done,auto-orchestrator-48aab142ecde,,Утвердить Web-профиль S00-001,S00,orchestrator,security,done,auto-orchestrator-48aab142ecde,,Утвердить Web-профиль
S00-002,S00,orchestrator,security,done,auto-orchestrator-68a05c587e33,"S00-001, S00-011, S00-012",Выбрать framework и build runtime S00-002,S00,orchestrator,security,done,auto-orchestrator-68a05c587e33,"S00-001, S00-011, S00-012",Выбрать framework и build runtime
S00-003,S00,protocol,qa,blocked,auto-protocol-59f4d359b339,"S00-001, S00-002, S00-017, S00-018, S00-019, S00-020",Проверить XMPP WSS/auth библиотеку S00-003,S00,protocol,qa,blocked,auto-protocol-59f4d359b339,"S00-001, S00-002, S00-017, S00-018, S00-019, S00-020",Проверить XMPP WSS/auth библиотеку
S00-004,S00,crypto,security,todo,,"S00-001, S00-002, S00-021",Проверить browser OMEMO backend S00-004,S00,crypto,security,blocked,auto-crypto-fe1c81c17ded,"S00-001, S00-002, S00-021, S00-022",Проверить browser OMEMO backend
S00-005,S00,storage,qa,todo,,S00-002,Выбрать IndexedDB wrapper и migration policy S00-005,S00,storage,qa,todo,,S00-002,Выбрать IndexedDB wrapper и migration policy
S00-006,S00,orchestrator,security,todo,,S00-002,Зафиксировать browser/reference matrix S00-006,S00,orchestrator,security,todo,,S00-002,Зафиксировать browser/reference matrix
S00-007,S00,security,orchestrator,todo,,"S00-004, S00-005",Утвердить password и crypto unlock модель S00-007,S00,security,orchestrator,todo,,"S00-004, S00-005",Утвердить password и crypto unlock модель
@@ -19,6 +19,7 @@ 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-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,in_progress,auto-ci-cd-5a18c8aa1b42,"S00-001, S00-002, S00-017, S00-018, S00-019",Restore access to the pinned Linux XMPP experiment toolchain S00-020,S00,ci-cd,qa,in_progress,auto-ci-cd-5a18c8aa1b42,"S00-001, S00-002, S00-017, S00-018, S00-019",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-021,S00,crypto,security,done,auto-crypto-fcef9b6781bf,"S00-001, S00-002",Устранить прерывание: Проверить browser OMEMO backend
S00-022,S00,crypto,security,blocked,,"S00-001, S00-002, S00-021",Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint
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: Профиль и проверка стека 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-001,S01,orchestrator,security,todo,,S00-010,Описать identity/model contracts
S01-002,S01,orchestrator,security,todo,,"S00-010, S01-001",Описать async account context S01-002,S01,orchestrator,security,todo,,"S00-010, S01-001",Описать async account context
1 id stage operator reviewer status owner depends_on title
2 S00-001 S00 orchestrator security done auto-orchestrator-48aab142ecde Утвердить Web-профиль
3 S00-002 S00 orchestrator security done auto-orchestrator-68a05c587e33 S00-001, S00-011, S00-012 Выбрать framework и build runtime
4 S00-003 S00 protocol qa blocked auto-protocol-59f4d359b339 S00-001, S00-002, S00-017, S00-018, S00-019, S00-020 Проверить XMPP WSS/auth библиотеку
5 S00-004 S00 crypto security todo blocked auto-crypto-fe1c81c17ded S00-001, S00-002, S00-021 S00-001, S00-002, S00-021, S00-022 Проверить browser OMEMO backend
6 S00-005 S00 storage qa todo S00-002 Выбрать IndexedDB wrapper и migration policy
7 S00-006 S00 orchestrator security todo S00-002 Зафиксировать browser/reference matrix
8 S00-007 S00 security orchestrator todo S00-004, S00-005 Утвердить password и crypto unlock модель
19 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
20 S00-020 S00 ci-cd qa in_progress auto-ci-cd-5a18c8aa1b42 S00-001, S00-002, S00-017, S00-018, S00-019 Restore access to the pinned Linux XMPP experiment toolchain
21 S00-021 S00 crypto security done auto-crypto-fcef9b6781bf S00-001, S00-002 Устранить прерывание: Проверить browser OMEMO backend
22 S00-022 S00 crypto security blocked S00-001, S00-002, S00-021 Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint
23 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: Профиль и проверка стека
24 S01-001 S01 orchestrator security todo S00-010 Описать identity/model contracts
25 S01-002 S01 orchestrator security todo S00-010, S01-001 Описать async account context
+57 -1
View File
@@ -324,7 +324,8 @@
"depends_on": [ "depends_on": [
"S00-001", "S00-001",
"S00-002", "S00-002",
"S00-021" "S00-021",
"S00-022"
], ],
"requirements": [ "requirements": [
"ENC-003", "ENC-003",
@@ -1223,6 +1224,61 @@
], ],
"context_budget_chars": 48000 "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"
],
"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-010", "id": "S00-010",
"stage": "S00", "stage": "S00",
+1 -1
View File
@@ -5,7 +5,7 @@
- Этап: S00 - Этап: S00
- Оператор: crypto - Оператор: crypto
- Reviewer: security - Reviewer: security
- Зависимости: S00-001, S00-002, S00-021 - Зависимости: S00-001, S00-002, S00-021, S00-022
- Требования: ENC-003, ENC-009, ENC-011 - Требования: ENC-003, ENC-009, ENC-011
## Один результат ## Один результат
+58
View File
@@ -0,0 +1,58 @@
# S00-022: Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint
- Remediation для: S00-004; root: S00-004; depth: 1
> Generated from planning/tasks.json; status is in state/tasks.json.
- Этап: S00
- Оператор: crypto
- Reviewer: security
- Зависимости: S00-001, S00-002, S00-021
- Требования: ENC-003, ENC-009, ENC-011
## Один результат
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.
## Разрешённые пути
- `docs/decisions/0003-crypto-library.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
## Шаги
1. Read S00-004 blocker evidence, ADR 0003, and accepted ENC-003/ENC-009/ENC-011 with ADRs 0000-0002.
2. 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).
3. 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.
4. 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.
## Приёмка
1. 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.
2. The OMEMO2 wire-format mapping does not bypass ENC-009/ENC-011 client-endpoint encryption.
3. 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.
## Focused checks
1. Known-answer OMEMO2 roundtrip in the web/WASM target, or a traceable upstream/external decision covering ENC-009/ENC-011.
2. Web/WASM asset presence verified (non-zero real footprint), license and support checked.
3. Independent security review confirms no bypass and no unsupported format counted as success.
## Блокер и завершение запуска
Для всех ролей 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 при блокере.
+22
View File
@@ -0,0 +1,22 @@
# Blocker S00-022
- Original task: S00-004
- Root task: S00-004
- Reporter: auto-crypto-fe1c81c17ded
- Role: crypto
- Original owner: auto-crypto-fe1c81c17ded
- Waits for user/external condition: True
## Cause
S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope.
## One remediation 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.
## Evidence / reproduction
cd experiments/0003-crypto-library && node session-probe/smoke.mjs (exit 0, SMOKE_PASS, 631-byte byte-for-byte session record) shows session/ratchet+persistence verified; node session-probe/wasm-unsupported.mjs (exit 2, wasmFiles:0, prebuilds native *.node only) shows browser/worker/WASM NOT established. npm view on live public registry: @signalapp/libsignal-client=0.105.0; @signalapp/libsignal=@converse/omemo=@xmpp/omemo=omemo2=omemo-js=omemo-client=omemo-top=omemo-wasm=E404. Details: see this run handoff and ADR 0003.
The reporting agent must stop now. A new agent implements only S00-022.
@@ -0,0 +1,98 @@
# S00-004 - Browser OMEMO backend spike - Evidence (this run)
- Agent: `auto-crypto-fe1c81c17ded`
- Role: crypto
- Task: S00-004 "Проверить browser OMEMO backend"
- Resumed after: S00-021 remediation (done) - S00-004 back in_progress
- Date-of-run: 2026-10-15
## 1. Reproduction of the two committed probes (from project root)
### 1a. Known-answer session/ratchet + persistence probe
Command:
```
node experiments/0003-crypto-library/session-probe/smoke.mjs
```
Actual result (exit code 0):
```
[log:3] Initializing libsignal version:0.105.0
...
KAS_OK known plaintext: known vector: OMEMO session smoke
KAS_OK established via sealed-sender PreKey session
KAS_OK bob stored session bytes: 631
SMOKE_PASS
smoke exit: 0
```
Verified: an audited session/ratchet engine (`@signalapp/libsignal-client` APIs)
establishes a sealed-sender PreKey session, round-trips the known plaintext, stores
a 631-byte session record and reloads it byte-for-byte. No homegrown ratchet.
### 1b. Unsupported browser/WASM backend probe
Command:
```
node experiments/0003-crypto-library/session-probe/wasm-unsupported.mjs
```
Actual result (exit code 2):
```
pkgPresent: true
wasmFiles: 0
prebuilds: darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-arm64, win32-x64
UNSUPPORTED_BLOCKER: no .wasm asset ships in @signalapp/libsignal-client; the
distribution is a Node native addon (prebuilds/*/*.node). A browser worker/WASM
deployment is NOT established by this npm package and must be treated as a blocker
until a verified browser/WASM distribution is found.
wasm exit: 2
```
Verified: the shipped distribution is native-only (zero `.wasm` files; prebuilds
are `*.node`) and cannot run in a browser worker/WASM endpoint.
## 2. Live public-registry availability check (this run, npmjs.org)
Queried directly (`npm view <pkg> version`); actual responses:
| package | actual response |
| --- | --- |
| `@signalapp/libsignal-client` | 0.105.0 (exists; Node native addon; AGPL-3.0-only) |
| `@signalapp/libsignal` | E404 - Not Found |
| `@converse/omemo` | E404 - Not Found |
| `@xmpp/omemo` | E404 - Not Found |
| `omemo2` | E404 - Not Found |
| `omemo-js` | E404 - Not Found |
| `omemo-client` | E404 - Not Found |
| `omemo-top` | E404 - Not Found |
| `omemo-wasm` | E404 - Not Found |
Confirmed again: no maintained browser/worker/WASM-capable OMEMO/OMEMO2 package is
available on the reachable registry. `@signalapp/libsignal` (Signal's WASM web
distribution) is not published there. The registry is live (it returns the real
version 0.105.0 for `@signalapp/libsignal-client`), so the E404 responses are
genuine.
## 3. Scope
- Wrote `state/issues/S00-004-auto-crypto-fe1c81c17ded.json` (one atomac
remediation) and this evidence; updated `state/handoffs/S00-004.md`.
- No source edits outside scope. `docs/decisions/0003-crypto-library.md` and
`experiments/0003-crypto-library/**` unchanged (the ADR remains as recorded by
S00-021 and correctly lists the browser/WASM + OMEMO2 layer as a blocker).
## 4. Focused checks
1. Known-answer/library smoke -> smoke.mjs exit 0 (`SMOKE_PASS`, 631-byte
byte-for-byte session record). PASS.
2. Unsupported format recorded as blocker, not success -> wasm-unsupported.mjs
exit 2 (`UNSUPPORTED_BLOCKER`, `wasmFiles: 0`). PASS.
3. No out-of-scope edits -> only workflow metadata + this issue in working tree;
`experiments/**` unchanged.
## 5. Honest conclusion
The audited session/ratchet engine and persistence are established (verified via a
known-answer probe). The browser/worker/WASM endpoint and the OMEMO/OMEMO2 wire
layer are NOT available from any maintained package on the reachable registry,
confirmed independently on the live public registry this run, and are recorded as a
blocker (not success), consistent with ENC-009/ENC-011 and the crypto role rule
"unsupported backend - blocker". S00-004 is therefore escalated: the residual
blocker (absent verified browser/WASM-capable OMEMO2 backend) requires sourcing or
an external decision (requires_user_input). S00-004 is not declared done by
bypassing requirements.
+39 -44
View File
@@ -1,54 +1,49 @@
# Handoff S00-004 - Browser OMEMO backend spike # Handoff S00-004 - Browser OMEMO backend spike
Agent: `auto-crypto-8bf3dcf711b9` Agent: `auto-crypto-fe1c81c17ded`
Role: crypto Role: crypto
Status on handoff: escalated (blocker) Status on handoff: escalated (blocker)
## Result ## Result this run
A focused spike established that an audited Signal session library can provide Re-ran both committed probes unchanged from the S00-021 remediation and confirmed
the session/ratchet engine and session-record persistence **without a homegrown the reproduced state. A verified audited session/ratchet engine and session-record
ratchet** (known-answer sealed-sender roundtrip, 631-byte record, reload persistence are established (`@signalapp/libsignal-client@0.105.0`, known-answer
byte-for-byte). However the same spike established that a browser/worker/WASM sealed-sender roundtrip, 631-byte session record reloaded byte-for-byte). The
deployment and the OMEMO2 wire-format layer are **not available** from any browser/worker/WASM deployment and the legacy/OMEMO2 wire layer remain **not
maintained package on the reachable registry: available** from any maintained package on the reachable registry.
- `@signalapp/libsignal-client@0.105.0` is a Node native addon with zero `.wasm`
assets; it cannot run in the Web client endpoint.
- No maintained `omemo2-js`/`omemo-wasm`/`@signalapp/libsignal`/OMEMO2 package
exists on the registry.
Per focused-check rule ("unsupported format recorded blocker, not success") and Per focused-check rule ("unsupported format recorded blocker, not success") and the
the mandatory escalate protocol, the original task is blocked rather than mandatory escalate protocol, S00-004 is escalated as blocked rather than claimed
claimed done. done: the acceptance (legacy/OMEMO2 AND worker/wasm AND persistence) still lacks a
verified browser/WASM-capable OMEMO2 backend.
## Outputs produced (all inside accepted scope experiments/0003-crypto-library/**) ## Reproduction this run (all from project root)
- `experiments/0003-crypto-library/package.json` (exact 1. `node experiments/0003-crypto-library/session-probe/smoke.mjs` -> exit 0,
`@signalapp/libsignal-client@0.105.0`, `--ignore-scripts`). `SMOKE_PASS`, `KAS_OK bob stored session bytes: 631`.
- `experiments/0003-crypto-library/session-probe/smoke.mjs` (known-answer probe, 2. `node experiments/0003-crypto-library/session-probe/wasm-unsupported.mjs`
mirrors Signal canonical stores). -> exit 2, `UNSUPPORTED_BLOCKER`, `pkgPresent: true`, `wasmFiles: 0`, prebuilds
- `experiments/0003-crypto-library/session-probe/wasm-unsupported.mjs` (unsupported-format probe). native `*.node` only.
- `state/evidence/S00-004-auto-crypto-8bf3dcf711b9.md` (this run's evidence). 3. Live public registry (`npm view <pkg> version`):
- ADR `docs/decisions/0003-crypto-library.md` was **not** written because the - `@signalapp/libsignal-client` = 0.105.0 (Node native addon, AGPL-3.0-only).
decision would record an unverified/blocked majority of the acceptance (browser - `@signalapp/libsignal`, `@converse/omemo`, `@xmpp/omemo`, `omemo2`,
WASM + legacy/OMEMO2) rather than a confirmed capability; the outcome must be `omemo-js`, `omemo-client`, `omemo-top`, `omemo-wasm` -> all E404.
that a remediation establishes the browser-capable backend first.
## Evidence ## Outputs produced (all inside accepted scope)
- Known-answer probe: PASS (exit 0), stored 631 bytes, byte-for-byte reload. - `state/issues/S00-004-auto-crypto-fe1c81c17ded.json` (one atomac remediation).
- Unsupported-format probe: exit 2 (no `.wasm`, native addon only). - `state/evidence/S00-004-auto-crypto-fe1c81c17ded.md` (this run's evidence).
- No source changes elsewhere; `docs/decisions/0003-crypto-library.md` and
`experiments/0003-crypto-library/**` unchanged (edits outside this escalation are
prohibited for this run).
## Next input for the remediation ## Next input for the remediation
Reproduce intent inside `experiments/0003-crypto-library/**`: 1. Confirm `node experiments/0003-crypto-library/session-probe/smoke.mjs` (0) and
1. `node session-probe/smoke.mjs` (expect SMOKE_PASS). `.../wasm-unsupported.mjs` (2) from project root.
2. `node session-probe/wasm-unsupported.mjs` (expect exit 2 / blocker line). 2. Source or confirm a maintained browser/worker/WASM-capable OMEMO2 backend (real
3. Establish a verified browser/worker/WASM-capable OMEMO2 backend (library with web/WASM build + OMEMO2/S ce-format mapping from traceable primary sources,
a real `.wasm`/web build and an OMEMO2 wire mapping), or record with traceable license/support/browser constraints checked), or record the specific external
upstream primary sources why the browser endpoint must use a maintained product/administrative decision (library/provider/license) needed to bring such
encryption layer consistent with ENC-009/ENC-011 client-endpoint encryption. a backend in. Requires user/external input.
3. Run a focused known-answer OMEMO2 roundtrip in the web target and record actual
# Blocked handoff results; unsupported format remains a blocker, not success.
4. Only then may acceptance-1 (legacy/OMEMO2 AND worker/wasm AND persistence) be
Original: S00-004; reporter: auto-crypto-8bf3dcf711b9; resolution: S00-021. re-evaluated; do not declare S00-004 done on the persistence+Ratchet part alone.
Agent timed out; process terminated before escalation
Next: complete and review the remediation; only a fresh session may continue.
@@ -0,0 +1,29 @@
{
"title": "Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint",
"reason": "S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope.",
"reproduction": "cd experiments/0003-crypto-library && node session-probe/smoke.mjs (exit 0, SMOKE_PASS, 631-byte byte-for-byte session record) shows session/ratchet+persistence verified; node session-probe/wasm-unsupported.mjs (exit 2, wasmFiles:0, prebuilds native *.node only) shows browser/worker/WASM NOT established. npm view on live public registry: @signalapp/libsignal-client=0.105.0; @signalapp/libsignal=@converse/omemo=@xmpp/omemo=omemo2=omemo-js=omemo-client=omemo-top=omemo-wasm=E404. Details: see this run handoff and ADR 0003.",
"role": "crypto",
"reviewer_role": "security",
"scope": [
"docs/decisions/0003-crypto-library.md"
],
"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.",
"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."
],
"depends_on": [],
"requires_user_input": true
}
+41 -9
View File
@@ -1,6 +1,6 @@
{ {
"schema_version": 1, "schema_version": 1,
"revision": 60, "revision": 62,
"tasks": { "tasks": {
"S00-001": { "S00-001": {
"status": "done", "status": "done",
@@ -47,14 +47,16 @@
"resumed_after_blocker": true "resumed_after_blocker": true
}, },
"S00-004": { "S00-004": {
"status": "todo", "status": "blocked",
"owner": null, "owner": "auto-crypto-fe1c81c17ded",
"started_at": "2026-10-15T08:02:39+00:00", "started_at": "2026-10-15T08:40:32+00:00",
"reason": null, "reason": "S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope.",
"updated_at": "2026-10-15T08:40:27+00:00", "updated_at": "2026-10-15T08:42:33+00:00",
"blocked_by": [], "blocked_by": [
"S00-022"
],
"resume_status": "in_progress", "resume_status": "in_progress",
"blocker_report": "state/blockers/S00-021.md", "blocker_report": "state/blockers/S00-022.md",
"handoff": "state/handoffs/S00-004.md", "handoff": "state/handoffs/S00-004.md",
"previous_owner": "auto-crypto-8bf3dcf711b9", "previous_owner": "auto-crypto-8bf3dcf711b9",
"resumed_after_blocker": true "resumed_after_blocker": true
@@ -1290,6 +1292,12 @@
"reviewer": "auto-security-5d2ae592b569", "reviewer": "auto-security-5d2ae592b569",
"review_evidence": "state/evidence/S00-021-review.md", "review_evidence": "state/evidence/S00-021-review.md",
"completed_at": "2026-10-15T08:40:27+00:00" "completed_at": "2026-10-15T08:40:27+00:00"
},
"S00-022": {
"status": "blocked",
"owner": null,
"external_wait": true,
"reason": "S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope."
} }
}, },
"events": [ "events": [
@@ -2068,6 +2076,29 @@
"to": "done", "to": "done",
"reason": null, "reason": null,
"evidence": "state/evidence/S00-021-review.md" "evidence": "state/evidence/S00-021-review.md"
},
{
"revision": 61,
"at": "2026-10-15T08:40:32+00:00",
"action": "claim",
"task": "S00-004",
"agent": "auto-crypto-fe1c81c17ded",
"role": "crypto",
"from": "todo",
"to": "in_progress",
"reason": null
},
{
"revision": 62,
"at": "2026-10-15T08:42:33+00:00",
"action": "escalate",
"task": "S00-004",
"resolution_task": "S00-022",
"agent": "auto-crypto-fe1c81c17ded",
"role": "crypto",
"from": "in_progress",
"to": "blocked",
"reason": "S00-004 acceptance requires establishing legacy/OMEMO2 AND worker/wasm AND persistence without a homegrown ratchet. Reproduced (this run) probes and live public-registry queries confirm only the audited session/ratchet engine + persistence are verified (@signalapp/libsignal-client@0.105.0, Node native addon, zero .wasm). The browser/worker/WASM deployment and the OMEMO/OMEMO2 wire layer are not available from any maintained package on the reachable registry (@signalapp/libsignal, @converse/omemo, @xmpp/omemo, omemo2, omemo-js, omemo-client, omemo-top, omemo-wasm all E404). ENC-009 forbids a homegrown algorithm/ratchet and ENC-011 forbids substituting media AES-GCM for the OMEMO2 wire format, so the spike cannot synthesize a browser backend inside S00-004 scope."
} }
], ],
"retired_agents": [ "retired_agents": [
@@ -2081,6 +2112,7 @@
"auto-protocol-902594b44429", "auto-protocol-902594b44429",
"auto-protocol-dcdf92cd067e", "auto-protocol-dcdf92cd067e",
"auto-protocol-59f4d359b339", "auto-protocol-59f4d359b339",
"auto-crypto-8bf3dcf711b9" "auto-crypto-8bf3dcf711b9",
"auto-crypto-fe1c81c17ded"
] ]
} }