Files
wt 51a414d386 S00-003: Evaluate Stanza with verified SCRAM and bounded WSS ingress
Changes: Propose the pinned XMPP library decision and add an isolated browser-built selection spike combining reviewed public SASL, SHA-512 and parser seams. Exercise TLS/xmpp handshake, strongest compatible non-PLUS authentication, rejected unsafe paths and extension mappings; document duplicate-body export projection and remaining limits. Preserve dependency notices, evidence and QA handoff.
Validation: Clean-cache pinned npm ci succeeded; npm test passed 112 checks; check-dependencies.py verified 51 locked entries, 26 installed packages and 340 unchanged vendor files; make check passed 72 tooling tests. No actual browser runtime, independent full XMPP server/client or production encryption/release readiness claim.

Task: S00-003
Agent: auto-protocol-f474114f0168
Role: protocol
Action: claim
Status: review

Task title: Проверить XMPP WSS/auth библиотеку
2026-10-15 18:20:05 +07:00

3.0 KiB

S00-003 combined XMPP selection spike

One isolated experiment; no application adapter or production provider. See docs/decisions/0002-xmpp-library.md for selection rationale and limits.

Use the authentic pinned Node 24.21.0 / npm 11.19.0 from S00-020. On this host its reviewed temporary bin path was /tmp/luma-S00-026-j1pmys7w/node-v24.21.0-linux-x64/bin; paths may expire. Recreate via the reviewed environment-access probe if needed. Keep its verified runtime directory first in PATH. OpenSSL must be available. No system install, trust-store change or secret is needed.

From project root, with the pinned runtime in PATH:

node --version
npm --version
npm ci --prefix experiments/0002-xmpp-library/selection-spike --ignore-scripts --no-audit --no-fund --engine-strict=true --strict-ssl=true --fetch-retries=0 --fetch-timeout=15000 --cache /tmp/luma-selection-independent-clean
npm test --prefix experiments/0002-xmpp-library/selection-spike
python3 experiments/0002-xmpp-library/selection-spike/check-dependencies.py
make check

Use a new empty cache for independent clean-install evidence. The checker compares vendor bytes against the reviewed environment-access/node_modules/stanza graph; that graph must exist (its verify.py recreates it without altering parent inputs). No application code or accepted prerequisite source is changed by these commands. dist and node_modules are ignored build artifacts. npm test explicitly invokes Vite even though install lifecycle scripts are disabled. Lock updates need review.

Tests run the Vite browser artifact in Node. Reused S00-019 regression tests cover known HMAC vectors, public alias, real feature dispatcher, forged/out-of-order finals, reset, pending sends, synthetic binding rejection and no derived cache. WSS tests use a fresh ephemeral localhost certificate/key under /tmp, explicitly trusted only by the test socket; rejectUnauthorized stays true. A native socket without that trust must reject it. No certificate/key is committed. The peer checks fixed public RFC or accepted independent Scramp transcripts; it is a scripted fixture, not an independent full XMPP implementation. Synthetic fixture credentials are public/invented data only, never read from the environment.

Bounded ingress and SHA-512 composition are byte-identical reviewed copies. Only the copied ordering guard extends allowed non-PLUS mechanisms to 512/256/1 and emits safe policy diagnostics. No fallback is enabled. Browser TLS data is unavailable and never synthesized. Registry tests cover basic MAM/MUC/Jingle/ upload/legacy opaque OMEMO plus an invented extension namespace, not encrypted interoperability or OMEMO2 wire compliance. They explicitly select the language collection on export because echoing both library body projections duplicates text; a separate stock-behavior regression preserves that finding.

No real browser/server/client interoperability, load bound, constant-time audit, full XEP coverage or product readiness result is implied. All inherited limits remain in the ADR. Changes are subject to independent QA review.