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 библиотеку
This commit is contained in:
wt committed 2026-10-15 18:20:05 +07:00
1 parent e08c0ab590
commit 51a414d386
28 files changed
+6709 -32

No files matched your search

@@ -0,0 +1,4 @@
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.
@@ -0,0 +1,129 @@
# S00-003 executor evidence
Agent: auto-protocol-f474114f0168 (protocol), 2026-10-15.
Result: proposed Stanza selection with combined runnable spike; independent QA pending.
Input: master/AGENTS/README/common/protocol; profile, architecture, contracts,
workflow, automation, Git, required TESTING and decisions registry; assigned
resume/show/card/context packet, previous blocked handoff; exact immutable
ACC-004/NET-003/NET-004; accepted scope/stack/SASL/parser/SHA512 ADRs, direct
prerequisite evidence and handoffs, remediation independent reviews including
S00-020; shipped vendor API/source. No missing input or unresolved blocker.
No repeat claim, agent launch, other task execution or Git mutation.
One output: proposed docs/decisions/0002-xmpp-library.md and isolated
experiments/0002-xmpp-library/selection-spike. Source scope unchanged elsewhere;
workflow evidence/handoff/message are metadata. Original parent manifest/lock,
accepted experiments/ADRs, shared contracts and spec snapshots unchanged.
Initial git status showed only coordinator state/tasks.json claim modification.
## Actual commands and results
All npm/node commands used PATH=/tmp/luma-S00-026-j1pmys7w/node-v24.21.0-linux-x64/bin:$PATH
from project root (authentic Linux runtime independently accepted by S00-020).
- python3 scripts/tasks.py resume --agent auto-protocol-f474114f0168 and
python3 scripts/tasks.py show S00-003: exit 0 each; assigned in_progress.
python3 scripts/tasks.py packet S00-003 --agent auto-protocol-f474114f0168:
exit 0, exact packet retrieved again before handoff.
- node --version / npm --version: exit 0 each, v24.21.0 / 11.19.0.
- npm install --prefix experiments/0002-xmpp-library/selection-spike
--ignore-scripts --no-audit --no-fund --strict-ssl=true --engine-strict=true
--fetch-retries=0 --fetch-timeout=15000 --cache /tmp/luma-selection-cache:
exit 0, 26 packages, independent lock generated. No upgrade notice acted on.
- Initial npm test: exit 1, 3/17 passed. Fixture incorrectly supplied endpoint
as {url:...}; shipped Client.connect requires string. Corrected only test
config; rerun exit 0, 17/17. This was a harness error, not missing WSS support.
- Extension test development npm test: exit 1, 21/23 passed. Guessed upload field
was wrong (actual public shape httpUpload.download); raw imported MAM export
exposed duplicated body projection. Inspected shipped mapping and diagnostic
import/export, corrected field assertion and made explicit fixture export
projection. Rerun exit 0, 23/23. Added permanent raw duplicate regression;
finding and future adapter obligation retained in ADR, not hidden as a pass.
- Copied unchanged reviewed SHA512 backend/feature-dispatcher regressions into
this independent package; npm test exit 0, 110 passed. No crypto reimplementation.
- 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-S00-003-clean-f474114f0168:
exit 0, new empty cache, 26 installed packages. Lock retained; scripts disabled.
- Final npm test --prefix experiments/0002-xmpp-library/selection-spike
> /tmp/luma-S00-003-final-tests.log 2>&1: exit 0 after clean install;
build 171 modules, browser.mjs 695.84 kB / gzip 141.63 kB;
112 passed, zero failures/skips/cancellations, duration 3121.874019 ms.
Final two checks add plaintext-endpoint rejection and explicit raw-export
regression. No plugin/transport/crypto source changes after clean install.
- python3 experiments/0002-xmpp-library/selection-spike/check-dependencies.py:
exit 0 before and after clean install; 51 lock entries, 26 installed exact
pins/notices, HTTPS registry/SHA512 integrity, all 340 Stanza files match
independently installed environment-access vendor graph; reviewed parser,
SHA512 alias and saxes license byte-identical. Browser module graph verified.
- make check > /tmp/luma-S00-003-check.log 2>&1: exit 0; 296 tasks / 22 stages,
221 requirements, 211 allocated Web requirements; 72 tooling tests in 18.819s.
Foundation checks only, not application readiness.
- git diff --check: exit 0. Final source scope and authored whitespace checked
separately including untracked files; final result recorded below.
## Demonstrated result and evidence boundaries
Real loopback HTTPS + ws fixture peer, ephemeral OpenSSL localhost certificate,
explicit per-fixture CA trust and rejectUnauthorized:true. Actual TLS hostname
validation remains; native WebSocket without fixture CA rejects that certificate.
No system trust/network/proxy change, disabled TLS, CORS bypass or real provider.
Plain ws endpoint rejects before socket construction. Private keys exist only
in temporary test directory and are deleted by test cleanup; no committed key.
Tests import actual browser-built Client, Registry, SCRAM and bounded transport.
Client.connect/queue/feature dispatcher run unchanged. Peer observes TLS and xmpp
subprotocol, framing open, exact fixed proof and restart only after verified
final. Mixed offers choose SHA512, then SHA256, then SHA1 as available. Public
RFC SHA1/256 and independently accepted Scramp SHA512 transcript fixtures are
compared exactly. Forged/premature final never succeeds or restarts. PLUS-only,
PLAIN-only and empty offers fail; diagnostics report binding unavailable and
fallback disabled. Existing regression rejects synthetic tlsUnique, verifies
n,,/c=biws, reset/order/send races and lack of persisted derived cache.
WSS oversized/incomplete messages close before any stanza delivery; pre-import
checks also reject depth, multiple roots, DTD and binary types. Full resource
and stale-callback evidence remains in byte-identical accepted parser source and
S00-018 tests; those standalone suites were not separately rerun here.
Registry import/export fixtures preserve MAM IDs, MUC join, Jingle session ID,
upload URL, legacy opaque bytes and invented plugin namespace isolation.
Raw dual-body export duplication is deliberately reproduced, with explicit
single-representation export for the MAM fixture. This is an API mapping limit
for future adapters, not an unreviewed shared-interface change.
## Digests and limitations
SHA256:
- package-lock.json: 02bb48038b194b72efc688752927815e3de94bf589bfe1d2e5bcee68283c4abc
- validated-sasl.mjs: 42a7e751565c27b45eee371852973d3613d26981586b48271d78586141466d61
- dist/browser.mjs: b95b0ba5c2fbf5d52b5b1e62c40f6b4d5669d22499cbfef0fe3d88b6bf708cee
Primary sources opened through web tools on 2026-10-15: RFC7395, RFC5802,
Stanza and xmpp.js upstream, XEP0313/0045/0166/0363. Exact shipped pinned source
supplies authoritative API/version behavior. Candidate comparison is documentary
for xmpp.js, not installed/tested equivalence. Dated source links are in ADR.
License inventory includes optional hosts; installed notices include Stanza
ancestry, preserved saxes upstream license and unmodified MPL build dependencies.
No advisory/provenance clearance claimed.
No actual browser runtime, independent full XMPP server/client, OMEMO encryption,
OMEMO2 wire validation, product support matrix, load/timing/security audit or
release readiness. Browser artifact executes in Node with native host APIs and
an injected trusted fixture socket; no browser channel binding is available.
Strict SCRAM profile, no timeout, synchronous derivation/string verifier equality,
local ingress limits, incomplete stream lifecycle and unbounded aggregate queues
remain disclosed in ADR. Public extension seam is verified, future API stability
is not promised. No real accounts/conversations/secrets or fake crypto used.
QA should inspect source/diff/message, repeat README with fresh cache and pinned
runtime, verify dependency graph/notices/unchanged vendor and limitations, then
record an independent review decision. Executor submits and stops; coordinator
commits before review. Proposed ADR is not independently accepted yet.
Final verification: first inline whitespace assertion failed on verbatim
THIRD_PARTY_NOTICES.md upstream trailing spaces; it was not an implementation
failure and notices were preserved unchanged. Corrected inspection exempts
verbatim notices/license texts: exit 0, all changed paths within task scope or
allowed metadata, authored final-newline/trailing-whitespace checks passed.
git diff --check exited 0. No failed check is described as passed.
+33 -22
View File
@@ -1,27 +1,38 @@
# S00-003 blocked handoff
# S00-003 handoff for independent QA review
Executor: auto-protocol-59f4d359b339, protocol, 2026-10-15.
Outcome remains library selection with WSS/auth/parser/extension spike.
Executor: auto-protocol-f474114f0168 (protocol), 2026-10-15.
No blocker. Proposed Stanza 12.22.1 selection and combined isolated spike at
experiments/0002-xmpp-library/selection-spike; ADR docs/decisions/0002-xmpp-library.md.
Accepted prerequisites S00-001/002/017/018/019 were read. The SHA-512 public
mechanism composition is now independently accepted; the earlier crypto blocker
is resolved. Their suites were not rerun in this environment. Parent candidate
remains unselected and selection ADR absent.
Actual result: clean-cache locked install on accepted Linux Node24.21.0/npm11.19.0,
browser bundle and 112 tests pass. Real synthetic loopback WSS TLS/xmpp handshake,
fixed SCRAM512/256/1 proofs/finals/restart, strongest compatible non-PLUS policy,
PLUS/plaintext rejection, untrusted certificate/plain endpoint rejection,
bounded XML over WSS and registry extension checks. 51 locked/26 installed
package checks and notices, 340 unmodified vendor files, reviewed parser/SHA512
source reuse verified. make check: 72 tooling tests passed, exit 0.
Evidence: state/evidence/S00-003-auto-protocol-f474114f0168.md.
Current blocker: accepted Node 24.21.0/npm 11.19.0 and installed Stanza are not
available in this Linux session (host tools 24.1.0/11.3.0; parent node_modules
absent). Official checksum retrieval over configured HTTPS fails with curl exit
5, unresolved proxy. See state/evidence/S00-003-auto-protocol-59f4d359b339.md for exact reproduction.
QA next: inspect actual diff/executor message, proposed ADR and README. Repeat
clean npm ci with a new cache, npm test, check-dependencies.py and relevant
foundation check using reviewed runtime currently at
/tmp/luma-S00-026-j1pmys7w/node-v24.21.0-linux-x64/bin.
Temporary tools may expire; environment-access probe can recreate authentic
runtime/vendor comparison graph. Do not change accepted pins or security policy.
Verify browser graph, public seams, fail-closed effects, notices and limitations.
Next input: external environment owner must restore approved HTTPS access to
nodejs.org and registry.npmjs.org or provide authentic, checksum/integrity-
verifiable pinned Linux toolchain and locked package artifacts through an
approved local path. Do not change stack pins, bypass proxy policy/TLS, fabricate
engine metadata or reuse a macOS binary. Fresh remediation executor must verify
exact runtime and lock installation, with independent review before parent
returns to a new executor. Supply no credentials in committed evidence.
Raw imported messages carry selected body plus language bodies; passing both to
export duplicates text in this version. Permanent regression records it. MAM
fixture explicitly exports the language collection only; future adapters must
construct outbound shapes. Upload's actual field is httpUpload.download.
Initial harness failures and corrections are recorded, not counted as passed.
No source changes or installs/build/tests/browser/WSS execution occurred. Browser
binaries are present but not exercised. No make check, complete SASL policy,
extension roundtrip, independent interoperability or selection claimed.
Reporter exits after escalation; no resolver work, unblock or new agent launch.
Limits: browser-built backend runs in Node, no actual browser or independent
full XMPP server/client; scripted peer uses accepted fixed transcripts. No OMEMO
crypto/OMEMO2 wire validation, full XEP semantics or release readiness. Fixture
certificate trusted only through injected socket with validation enabled; no
system trust changes/keys committed. No real binding/fallback. Inherited strict
SCRAM layout/timeout/timing, minimal transport/lifecycle and aggregate queue
limits remain. Source changes are only current task paths plus workflow metadata.
ADR stays proposed until separate QA acceptance. Coordinator alone commits and
launches new process; executor exits immediately after submit.
+30 -6
View File
@@ -1,6 +1,6 @@
{
"schema_version": 1,
"revision": 112,
"revision": 114,
"tasks": {
"S00-001": {
"status": "done",
@@ -32,17 +32,18 @@
"completed_at": "2026-10-14T19:06:23+00:00"
},
"S00-003": {
"status": "todo",
"owner": null,
"started_at": "2026-10-15T04:12:38+00:00",
"status": "review",
"owner": "auto-protocol-f474114f0168",
"started_at": "2026-10-15T11:10:08+00:00",
"reason": null,
"updated_at": "2026-10-15T10:09:24+00:00",
"updated_at": "2026-10-15T11:19:59+00:00",
"blocked_by": [],
"resume_status": "in_progress",
"blocker_report": "state/blockers/S00-020.md",
"handoff": "state/handoffs/S00-003.md",
"previous_owner": "auto-protocol-59f4d359b339",
"resumed_after_blocker": true
"resumed_after_blocker": true,
"evidence": "state/evidence/S00-003-auto-protocol-f474114f0168.md"
},
"S00-004": {
"status": "blocked",
@@ -2901,6 +2902,29 @@
"to": "done",
"reason": null,
"evidence": "state/evidence/S00-023-review.md"
},
{
"revision": 113,
"at": "2026-10-15T11:10:08+00:00",
"action": "claim",
"task": "S00-003",
"agent": "auto-protocol-f474114f0168",
"role": "protocol",
"from": "todo",
"to": "in_progress",
"reason": null
},
{
"revision": 114,
"at": "2026-10-15T11:19:59+00:00",
"action": "submit",
"task": "S00-003",
"agent": "auto-protocol-f474114f0168",
"role": null,
"from": "in_progress",
"to": "review",
"reason": null,
"evidence": "state/evidence/S00-003-auto-protocol-f474114f0168.md"
}
],
"retired_agents": [