Changes: Preserve incomplete work and blocker metadata for S00-022. This checkpoint does not mark implementation accepted. Validation: Session ended with status blocked. Blocker: 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. Task: S00-022 Agent: auto-crypto-bcd7f2a71667 Role: crypto Action: claim Status: blocked Task title: Confirm or source a verified browser/WASM-capable OMEMO2 backend for the Web client endpoint
5.6 KiB
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.