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 по догадке.
Задач: 21; entry: нет; exit: S00-010.
Задач: 22; entry: нет; exit: S00-010.
## [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 | Зависимости | Задача |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [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-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-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 модель |
@@ -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-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-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: Профиль и проверка стека |
| [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 |
+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 |
| 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, 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-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, 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-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-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 |
+2 -1
View File
@@ -9,7 +9,7 @@
- [S00-001](../tasks/S00-001.md): Утвердить Web-профиль — 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-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-006](../tasks/S00-006.md): Зафиксировать browser/reference matrix — orchestrator; 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-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-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.
## Граница этапа
+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-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-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-006,S00,orchestrator,security,todo,,S00-002,Зафиксировать browser/reference matrix
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-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-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: Профиль и проверка стека
S01-001,S01,orchestrator,security,todo,,S00-010,Описать identity/model contracts
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": [
"S00-001",
"S00-002",
"S00-021"
"S00-021",
"S00-022"
],
"requirements": [
"ENC-003",
@@ -1223,6 +1224,61 @@
],
"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",
"stage": "S00",
+1 -1
View File
@@ -5,7 +5,7 @@
- Этап: S00
- Оператор: crypto
- Reviewer: security
- Зависимости: S00-001, S00-002, S00-021
- Зависимости: S00-001, S00-002, S00-021, S00-022
- Требования: 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
Agent: `auto-crypto-8bf3dcf711b9`
Agent: `auto-crypto-fe1c81c17ded`
Role: crypto
Status on handoff: escalated (blocker)
## Result
A focused spike established that an audited Signal session library can provide
the session/ratchet engine and session-record persistence **without a homegrown
ratchet** (known-answer sealed-sender roundtrip, 631-byte record, reload
byte-for-byte). However the same spike established that a browser/worker/WASM
deployment and the OMEMO2 wire-format layer are **not 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.
## Result this run
Re-ran both committed probes unchanged from the S00-021 remediation and confirmed
the reproduced state. A verified audited session/ratchet engine and session-record
persistence are established (`@signalapp/libsignal-client@0.105.0`, known-answer
sealed-sender roundtrip, 631-byte session record reloaded byte-for-byte). The
browser/worker/WASM deployment and the legacy/OMEMO2 wire layer remain **not
available** from any maintained package on the reachable registry.
Per focused-check rule ("unsupported format recorded blocker, not success") and
the mandatory escalate protocol, the original task is blocked rather than
claimed done.
Per focused-check rule ("unsupported format recorded blocker, not success") and the
mandatory escalate protocol, S00-004 is escalated as blocked rather than claimed
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/**)
- `experiments/0003-crypto-library/package.json` (exact
`@signalapp/libsignal-client@0.105.0`, `--ignore-scripts`).
- `experiments/0003-crypto-library/session-probe/smoke.mjs` (known-answer probe,
mirrors Signal canonical stores).
- `experiments/0003-crypto-library/session-probe/wasm-unsupported.mjs` (unsupported-format probe).
- `state/evidence/S00-004-auto-crypto-8bf3dcf711b9.md` (this run's evidence).
- ADR `docs/decisions/0003-crypto-library.md` was **not** written because the
decision would record an unverified/blocked majority of the acceptance (browser
WASM + legacy/OMEMO2) rather than a confirmed capability; the outcome must be
that a remediation establishes the browser-capable backend first.
## Reproduction this run (all from project root)
1. `node experiments/0003-crypto-library/session-probe/smoke.mjs` -> exit 0,
`SMOKE_PASS`, `KAS_OK bob stored session bytes: 631`.
2. `node experiments/0003-crypto-library/session-probe/wasm-unsupported.mjs`
-> exit 2, `UNSUPPORTED_BLOCKER`, `pkgPresent: true`, `wasmFiles: 0`, prebuilds
native `*.node` only.
3. Live public registry (`npm view <pkg> version`):
- `@signalapp/libsignal-client` = 0.105.0 (Node native addon, AGPL-3.0-only).
- `@signalapp/libsignal`, `@converse/omemo`, `@xmpp/omemo`, `omemo2`,
`omemo-js`, `omemo-client`, `omemo-top`, `omemo-wasm` -> all E404.
## Evidence
- Known-answer probe: PASS (exit 0), stored 631 bytes, byte-for-byte reload.
- Unsupported-format probe: exit 2 (no `.wasm`, native addon only).
## Outputs produced (all inside accepted scope)
- `state/issues/S00-004-auto-crypto-fe1c81c17ded.json` (one atomac remediation).
- `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
Reproduce intent inside `experiments/0003-crypto-library/**`:
1. `node session-probe/smoke.mjs` (expect SMOKE_PASS).
2. `node session-probe/wasm-unsupported.mjs` (expect exit 2 / blocker line).
3. Establish a verified browser/worker/WASM-capable OMEMO2 backend (library with
a real `.wasm`/web build and an OMEMO2 wire mapping), or record with traceable
upstream primary sources why the browser endpoint must use a maintained
encryption layer consistent with ENC-009/ENC-011 client-endpoint encryption.
# Blocked handoff
Original: S00-004; reporter: auto-crypto-8bf3dcf711b9; resolution: S00-021.
Agent timed out; process terminated before escalation
Next: complete and review the remediation; only a fresh session may continue.
1. Confirm `node experiments/0003-crypto-library/session-probe/smoke.mjs` (0) and
`.../wasm-unsupported.mjs` (2) from project root.
2. Source or confirm a maintained browser/worker/WASM-capable OMEMO2 backend (real
web/WASM build + OMEMO2/S ce-format mapping from traceable primary sources,
license/support/browser constraints checked), or record the specific external
product/administrative decision (library/provider/license) needed to bring such
a backend in. Requires user/external input.
3. Run a focused known-answer OMEMO2 roundtrip in the web target and record actual
results; unsupported format remains a blocker, not success.
4. Only then may acceptance-1 (legacy/OMEMO2 AND worker/wasm AND persistence) be
re-evaluated; do not declare S00-004 done on the persistence+Ratchet part alone.
@@ -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,
"revision": 60,
"revision": 62,
"tasks": {
"S00-001": {
"status": "done",
@@ -47,14 +47,16 @@
"resumed_after_blocker": true
},
"S00-004": {
"status": "todo",
"owner": null,
"started_at": "2026-10-15T08:02:39+00:00",
"reason": null,
"updated_at": "2026-10-15T08:40:27+00:00",
"blocked_by": [],
"status": "blocked",
"owner": "auto-crypto-fe1c81c17ded",
"started_at": "2026-10-15T08:40:32+00:00",
"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:42:33+00:00",
"blocked_by": [
"S00-022"
],
"resume_status": "in_progress",
"blocker_report": "state/blockers/S00-021.md",
"blocker_report": "state/blockers/S00-022.md",
"handoff": "state/handoffs/S00-004.md",
"previous_owner": "auto-crypto-8bf3dcf711b9",
"resumed_after_blocker": true
@@ -1290,6 +1292,12 @@
"reviewer": "auto-security-5d2ae592b569",
"review_evidence": "state/evidence/S00-021-review.md",
"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": [
@@ -2068,6 +2076,29 @@
"to": "done",
"reason": null,
"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": [
@@ -2081,6 +2112,7 @@
"auto-protocol-902594b44429",
"auto-protocol-dcdf92cd067e",
"auto-protocol-59f4d359b339",
"auto-crypto-8bf3dcf711b9"
"auto-crypto-8bf3dcf711b9",
"auto-crypto-fe1c81c17ded"
]
}