S00-017: Approve fail-closed SCRAM validation after independent integration checks

Changes: Accept the bounded S00-017 fixture experiment and ADR; record independent security review and handoff with remaining browser, WSS, mechanism-policy and timing limits.
Validation: Fresh-cache npm ci and npm test passed on Node 24.21.0/npm 11.19.0 with 44 integrated tests. Verify exact installed pins, eight MIT notices, HTTPS/integrity and unchanged vendor files. make check passed 72 tooling tests; inspect executor scope/message and review metadata whitespace. No browser/server interoperability or constant-time assurance claimed.

Task: S00-017
Agent: auto-security-9ab954f6e021
Role: security
Action: review
Status: done

Task title: Establish fail-closed SCRAM server-final validation
This commit is contained in:
wt committed 2026-10-15 02:20:57 +07:00
1 parent 493fbaebe7
commit 1850dbc39f
8 files changed
+104 -21

No files matched your search

+14 -2
View File
@@ -1,10 +1,10 @@
# ADR 0002-SASL: Fail-closed SCRAM server-final experiment
- Status: proposed; requires independent security review of S00-017.
- Status: accepted for the bounded S00-017 fixture experiment; independent review: `state/evidence/S00-017-review.md`.
- Task: S00-017, remediation for S00-003.
- Date: 2026-10-15.
- Owner: auto-protocol-599343cd9e3f (protocol).
- Reviewer: assigned security role, decision pending.
- Reviewer: auto-security-9ab954f6e021 (security), 2026-10-15.
- Requirements: ACC-004, NET-003, NET-004; accepted ADR 0000/0001 preserved.
## Question and bounded result
@@ -110,3 +110,15 @@ a fresh S00-003 executor to evaluate this approach in its own experiment; it doe
not implement that original task or change the accepted stack/shared contracts.
Any required broader policy/interface or vendor replacement is a separately
scoped plan decision. Coordinator owns transition commits and fresh processes.
## Independent acceptance
Security reviewer auto-security-9ab954f6e021 independently repeated fresh-cache
npm ci and all 44 integrated tests on Node 24.21.0/npm 11.19.0. Exact installed
pins, all eight MIT notices, HTTPS/integrity entries, shipped public extension
APIs and unchanged vendor files were verified. RFC proofs/finals match primary
examples; forged/missing/premature final cannot authenticate in the demonstrated
handler. make check passed 72 tooling tests. This bounded experiment is accepted;
Stanza selection, complete mechanism policy, browser crypto/build, WSS/server
interoperability, parser certification, timeout and constant-time assurance remain
unverified. S00-003 must evaluate integration in a new assigned session.
+3 -3
View File
@@ -1,12 +1,12 @@
# Матрица задач
Generated; state revision **40**. Canonical status: state/tasks.json.
Generated; state revision **41**. 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-826aa6bc12ef | S00-001, S00-002, S00-017 | Проверить XMPP WSS/auth библиотеку |
| [S00-003](tasks/S00-003.md) | S00 | protocol | qa | todo | | S00-001, S00-002, S00-017 | Проверить XMPP WSS/auth библиотеку |
| [S00-004](tasks/S00-004.md) | S00 | crypto | security | todo | | S00-001, S00-002 | Проверить 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 |
@@ -19,7 +19,7 @@ Generated; state revision **40**. Canonical status: state/tasks.json.
| [S00-014](tasks/S00-014.md) | S00 | ci-cd | qa | done | auto-ci-cd-14343249da62 | S00-001, S00-011, S00-013 | Fix repeated runner cleanup after a submitted parent is reaped |
| [S00-015](tasks/S00-015.md) | S00 | ci-cd | qa | done | auto-ci-cd-84e209103f24 | S00-001, S00-011, S00-013, S00-014, S00-016 | Устранить прерывание: Fix runner prompt delivery after partial stdin timeout |
| [S00-016](tasks/S00-016.md) | S00 | ci-cd | qa | done | auto-ci-cd-351a0cbbabef | S00-001, S00-011, S00-013, S00-014 | Restore reviewer model availability after provider capacity failure |
| [S00-017](tasks/S00-017.md) | S00 | protocol | security | review | auto-protocol-599343cd9e3f | S00-001, S00-002 | Establish fail-closed SCRAM server-final validation |
| [S00-017](tasks/S00-017.md) | S00 | protocol | security | done | auto-protocol-599343cd9e3f | S00-001, S00-002 | Establish fail-closed SCRAM server-final validation |
| [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 |
+2 -2
View File
@@ -8,7 +8,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-003](../tasks/S00-003.md): Проверить XMPP WSS/auth библиотеку — protocol; todo.
- [S00-004](../tasks/S00-004.md): Проверить browser OMEMO backend — crypto; todo.
- [S00-005](../tasks/S00-005.md): Выбрать IndexedDB wrapper и migration policy — storage; todo.
- [S00-006](../tasks/S00-006.md): Зафиксировать browser/reference matrix — orchestrator; todo.
@@ -21,7 +21,7 @@
- [S00-014](../tasks/S00-014.md): Fix repeated runner cleanup after a submitted parent is reaped — ci-cd; done.
- [S00-015](../tasks/S00-015.md): Устранить прерывание: Fix runner prompt delivery after partial stdin timeout — ci-cd; done.
- [S00-016](../tasks/S00-016.md): Restore reviewer model availability after provider capacity failure — ci-cd; done.
- [S00-017](../tasks/S00-017.md): Establish fail-closed SCRAM server-final validation — protocol; review.
- [S00-017](../tasks/S00-017.md): Establish fail-closed SCRAM server-final validation — protocol; done.
- [S00-010](../tasks/S00-010.md): Gate: Профиль и проверка стека — qa; todo.
## Граница этапа
+2 -2
View File
@@ -1,7 +1,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-826aa6bc12ef,"S00-001, S00-002, S00-017",Проверить XMPP WSS/auth библиотеку
S00-003,S00,protocol,qa,todo,,"S00-001, S00-002, S00-017",Проверить XMPP WSS/auth библиотеку
S00-004,S00,crypto,security,todo,,"S00-001, S00-002",Проверить 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
@@ -14,7 +14,7 @@ S00-013,S00,ci-cd,qa,done,auto-ci-cd-5f68f03dd33b,"S00-001, S00-011",Bound overs
S00-014,S00,ci-cd,qa,done,auto-ci-cd-14343249da62,"S00-001, S00-011, S00-013",Fix repeated runner cleanup after a submitted parent is reaped
S00-015,S00,ci-cd,qa,done,auto-ci-cd-84e209103f24,"S00-001, S00-011, S00-013, S00-014, S00-016",Устранить прерывание: Fix runner prompt delivery after partial stdin timeout
S00-016,S00,ci-cd,qa,done,auto-ci-cd-351a0cbbabef,"S00-001, S00-011, S00-013, S00-014",Restore reviewer model availability after provider capacity failure
S00-017,S00,protocol,security,review,auto-protocol-599343cd9e3f,"S00-001, S00-002",Establish fail-closed SCRAM server-final validation
S00-017,S00,protocol,security,done,auto-protocol-599343cd9e3f,"S00-001, S00-002",Establish fail-closed SCRAM server-final validation
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 todo auto-protocol-826aa6bc12ef S00-001, S00-002, S00-017 Проверить XMPP WSS/auth библиотеку
5 S00-004 S00 crypto security todo S00-001, S00-002 Проверить 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
14 S00-014 S00 ci-cd qa done auto-ci-cd-14343249da62 S00-001, S00-011, S00-013 Fix repeated runner cleanup after a submitted parent is reaped
15 S00-015 S00 ci-cd qa done auto-ci-cd-84e209103f24 S00-001, S00-011, S00-013, S00-014, S00-016 Устранить прерывание: Fix runner prompt delivery after partial stdin timeout
16 S00-016 S00 ci-cd qa done auto-ci-cd-351a0cbbabef S00-001, S00-011, S00-013, S00-014 Restore reviewer model availability after provider capacity failure
17 S00-017 S00 protocol security review done auto-protocol-599343cd9e3f S00-001, S00-002 Establish fail-closed SCRAM server-final validation
18 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: Профиль и проверка стека
19 S01-001 S01 orchestrator security todo S00-010 Описать identity/model contracts
20 S01-002 S01 orchestrator security todo S00-010, S01-001 Описать async account context
@@ -0,0 +1,4 @@
Approve fail-closed SCRAM validation after independent integration checks
Changes: Accept the bounded S00-017 fixture experiment and ADR; record independent security review and handoff with remaining browser, WSS, mechanism-policy and timing limits.
Validation: Fresh-cache npm ci and npm test passed on Node 24.21.0/npm 11.19.0 with 44 integrated tests. Verify exact installed pins, eight MIT notices, HTTPS/integrity and unchanged vendor files. make check passed 72 tooling tests; inspect executor scope/message and review metadata whitespace. No browser/server interoperability or constant-time assurance claimed.
+34
View File
@@ -0,0 +1,34 @@
# S00-017 independent security review
Reviewer: auto-security-9ab954f6e021 (security). Executor: auto-protocol-599343cd9e3f.
Date: 2026-10-15. Decision: approve the isolated fail-closed SCRAM experiment and bounded ADR.
Input: assigned card/packet, master/startup/role/workflow documents, required TESTING, protocol role, ADR registry and S00-017 blocker; exact ACC-004/NET-003/NET-004; accepted scope/stack ADRs and direct dependency evidence/reviews/handoffs; S00-003 blocker evidence and previous handoffs. Output: independent decision, accepted ADR metadata and review handoff. No shared S01 contract is introduced.
## Findings
Implementation commit 493fbaebe71752677da43aef1e15efbf0343adb4 and executor message match the actual isolated plugin, tests, pins/notices and limitations. Commit path list and workflow diff examined; current source files read with clean working tree before review metadata. Source changes are confined to the card's experiment and ADR; the remaining paths are workflow/generated metadata. Parent exploratory sources, specs, shared contracts and planning definitions are unchanged.
The real Client/XML registry/feature dispatcher drives the tests; only transport/send effects are captured. Verifier tracing invokes the original processSuccess/finalize methods, never fabricates crypto results. Installed SCRAM computes proof/serverSignature using existing library composition and Node crypto, then compares the supplied verifier in finalize. Both exact RFC SHA-1/SHA-256 client proofs and finals pass. Stock missing/forged premature success is reproduced as insecure behavior. Replacement rejects those cases plus missing/forged/error/conflicting/duplicate/malformed/oversized finals after proof without success, authenticated flags or restart. Fail removes listeners, clears flags, emits failure and disconnects once; replay cannot revive a closed attempt. Reset cancels credentials/proof-send continuation; duplicate/out-of-order and rejected send/credential paths are covered.
Public shipped Client.use and registerFeature declarations and implementation support replacement before negotiation. Handler lookup is by name; duplicated order entry does not execute another handler after restart/disconnect. Installing late or alongside another replacement remains prohibited by the README. Non-PLUS SHA-256 is preferred to SHA-1; PLUS/plaintext-only offers fail and TLS binding is not invented. No authored crypto primitives, vendor patch, persistence/cache emission, real credentials, network authentication, peer/crypto log output or certificate/CORS bypass found. Public RFC credentials and example.invalid JID remain fixture data.
Strict additional-data syntax and bounds prevent library directive parsing from ignoring conflicting final attributes. They are deliberately restricted experiment policy, not full parser/resource certification. Only success additional-data and extension-free non-PLUS SHA-1/256 are accepted. Complete NET-003 mechanism selection, SHA-512, extensions/separate-final layout and actual WSS remain S00-003. Constant-time verification, browser crypto/RNG/build, advisory/provenance clearance, independent server/client interoperability and timeout policy were not tested or accepted. Node/npm pins and lock integrity establish repeatability, not adversary-resistant metadata authentication or supply-chain clearance. No acceptance defect or review blocker found within this fixture scope.
## Actual independent checks
- python3 scripts/tasks.py resume --agent auto-security-9ab954f6e021; show S00-017; packet S00-017 --agent auto-security-9ab954f6e021: exit 0 each. Review status, distinct executor and done prerequisites confirmed; no claim.
- Read-only git log --all --grep='^S00-017:' --format='%h %s', git show 493fbae --stat and workflow sections, git status --short: exit 0; initially clean tree. Source/test/manifest/lock/notice/API reads completed.
- PATH=/private/tmp/luma-stack-runtime/node-v24.21.0-darwin-arm64/bin:$PATH node --version / npm --version: exit 0, v24.21.0 / 11.19.0. Reused the previously accepted isolated runtime; no new archive verification claimed.
- Same PATH npm ci --prefix experiments/0002-xmpp-library/sasl-validation --ignore-scripts --no-audit --no-fund --cache /private/tmp/luma-sasl-review-9ab954f6e021 --fetch-retries=0 --fetch-timeout=15000: exit 0; new reviewer cache, eight packages, strict HTTPS/engines retained and scripts disabled.
- Same PATH npm test --prefix experiments/0002-xmpp-library/sasl-validation: exit 0; 44 passed, zero failed/skipped/cancelled, duration 988.838125 ms.
- Inline Python manifest/lock/installed-license assertions: exit 0; all eight installed exact versions and MIT licenses agree, HTTPS registry/SHA512 entries retained, installed license texts present in notices and inventory complete. Client.js, plugins/sasl.js, plugins/features.js and lib/sasl/index.js byte-match parent installed original files.
- SHA256 package-lock.json: 6413668910ec921d7871225f22fe2753ceaf32c6c185cda6d0a5fd0e27643514; validated-sasl.mjs: 196b16baa16fea051dc6502bae11f80ebea02f87634d90ea72778ee14557a3b9. Match executor evidence.
- make check: exit 0; 282 tasks, 22 stages, 221 requirements, 211 allocated Web requirements, revision 40; 72 tooling tests in 18.231 s. Foundation integrity, not messenger readiness.
- git diff --check before review metadata: exit 0. Final metadata diff/whitespace checked separately before approval.
Primary sources independently opened through web tools: [RFC 5802 §5](https://www.rfc-editor.org/rfc/rfc5802.html#section-5) and [RFC 7677 §3](https://www.rfc-editor.org/rfc/rfc7677.html#section-3). Web find did not locate fixture strings; canonical .txt sources fetched with curl --fail --silent --show-error and exchange sections displayed through rg, exit 0, confirmed exact transcript values. Shipped version-pinned API/source supplies library facts.
Exploratory guessed paths 0000-web-scope.md, lib/sasl/scram.js and platform/node.js were absent; actual 0000-scope.md, lib/sasl/index.js and platform/node/index.js were located/read. These failed exploratory reads are not passed checks or missing required artifacts.
Reviewer changes only ADR acceptance metadata/paragraph, review evidence, handoff and mandatory commit message plus CLI-generated transition. Coordinator must commit the review before the next session; this reviewer ends after approve and does not continue S00-003.
+9
View File
@@ -29,3 +29,12 @@ rejection and no timeout policy. No constant-time/browser-crypto/advisory audit.
S00-003 retains library selection, full mechanism policy, browser/WSS/parser/
extension and interoperability checks after reviewed acceptance. This executor
must end immediately after submit, cannot mark done or continue the original.
Independent security review: auto-security-9ab954f6e021, 2026-10-15.
Accepted the bounded fixture experiment and ADR after fresh-cache npm ci,
44 integrated tests, eight installed MIT license/notice/pin checks, vendor
byte comparison and make check (72 tests), all exit 0. Report:
state/evidence/S00-017-review.md. No blocker or acceptance defect found.
All stated browser/WSS/server/mechanism-policy/timing/timeout limits remain.
Coordinator owns the review commit; a fresh assigned S00-003 executor may
continue only after that commit. Reviewer exits immediately after approve.
+36 -12
View File
@@ -1,6 +1,6 @@
{
"schema_version": 1,
"revision": 40,
"revision": 41,
"tasks": {
"S00-001": {
"status": "done",
@@ -32,17 +32,17 @@
"completed_at": "2026-10-14T19:06:23+00:00"
},
"S00-003": {
"status": "blocked",
"owner": "auto-protocol-826aa6bc12ef",
"status": "todo",
"owner": null,
"started_at": "2026-10-14T19:06:24+00:00",
"reason": "StanzaJS 12.22.1 SASL feature accepts missing/forged server-final without processSuccess/finalize, including success before challenge/proof. Safe SCRAM cannot be attested by S00-003 until this authentication boundary has a reviewed solution.",
"updated_at": "2026-10-14T19:09:23+00:00",
"blocked_by": [
"S00-017"
],
"reason": null,
"updated_at": "2026-10-14T19:20:57+00:00",
"blocked_by": [],
"resume_status": "in_progress",
"blocker_report": "state/blockers/S00-017.md",
"handoff": "state/handoffs/S00-003.md"
"handoff": "state/handoffs/S00-003.md",
"previous_owner": "auto-protocol-826aa6bc12ef",
"resumed_after_blocker": true
},
"S00-004": {
"status": "todo",
@@ -1221,14 +1221,17 @@
"completed_at": "2026-10-14T18:58:04+00:00"
},
"S00-017": {
"status": "review",
"status": "done",
"owner": "auto-protocol-599343cd9e3f",
"external_wait": false,
"reason": null,
"started_at": "2026-10-14T19:09:24+00:00",
"updated_at": "2026-10-14T19:17:46+00:00",
"updated_at": "2026-10-14T19:20:57+00:00",
"evidence": "state/evidence/S00-017-auto-protocol-599343cd9e3f.md",
"handoff": "state/handoffs/S00-017.md"
"handoff": "state/handoffs/S00-017.md",
"reviewer": "auto-security-9ab954f6e021",
"review_evidence": "state/evidence/S00-017-review.md",
"completed_at": "2026-10-14T19:20:57+00:00"
}
},
"events": [
@@ -1743,6 +1746,27 @@
"to": "review",
"reason": null,
"evidence": "state/evidence/S00-017-auto-protocol-599343cd9e3f.md"
},
{
"revision": 41,
"at": "2026-10-14T19:20:57+00:00",
"action": "auto-unblock",
"task": "S00-003",
"resolved_by": "S00-017",
"to": "todo",
"fresh_agent_required": true
},
{
"revision": 41,
"at": "2026-10-14T19:20:57+00:00",
"action": "approve",
"task": "S00-017",
"agent": "auto-security-9ab954f6e021",
"role": "security",
"from": "review",
"to": "done",
"reason": null,
"evidence": "state/evidence/S00-017-review.md"
}
],
"retired_agents": [