ENGINEERING REVIEW | 5 SEPTEMBER 2026

Round 2 remediation

Changes for the 27 findings across TrustWeave and TrustWeave SaaS. This report records implemented fixes and their verification scope. It does not assert a perfect score or a completed production release.

26Findings with code changes implemented
1Release / staging validation outstanding
0 + 0Reported npm vulnerabilities after upgrades

Release validation remains open

SA13: publish the SDK remediation commit, update the SaaS pin, and run the exact pair through Linux CI and staging checks. The new source-fingerprint gate prevents the older pinned SDK from silently standing in for the locally tested changes.

The historical review scores remain 79/100 SDK and 75/100 SaaS. They have not been recalculated during remediation. The final backend run and coverage gate passed.

Validation

Finding-by-finding changes

TW01trustweave | P1Implemented

Issuer proof validation

Imports verify Ed25519 did:key issuer signatures, holder binding, supported algorithms and JWT time bounds before saving. Library copy distinguishes signature checks from live trust/status checks.

Validation: 12 wallet tests; forged signature rejection; real issuer/browser/verifier contract.

TW02trustweave | P1Implemented

Issuer disclosures preserved

Encrypted disclosures retain their original bytes. Selected content keys are bound to disclosure digests inside the signed KB-JWT TrustWeave extension. The verifier authenticates the presentation before decrypting.

Validation: Real encryption regression checks exact disclosure bytes, digest membership, selected key release, and no key for withheld claims.

TW03trustweave | P2Implemented

Selective disclosure stays explicit

Multi-credential presentations containing SD-JWT credentials are refused. Missing/duplicate IDs fail, and selective claims start unchecked.

Validation: Concurrent-import and multi-SD-JWT rejection regression; actual verifier checks only selected claims.

TW04trustweave | P2Implemented

Cloud failures propagate

Cloud list/statistics fail on storage/filter errors. Recovery is explicit, includes per-record failures, and propagates cancellation.

Validation: CloudRecoveryTest and existing cloud plugin suites.

TW05trustweave | P2Implemented

Cloud storage handles exposed

CloudWallet implements CredentialRecordStorage and returns storage IDs independently of signed VC IDs.

Validation: Cloud plugin tests; stored-key reconstruction in listRecords/recovery.

TW06trustweave | P2Implemented

Bounded database paging

New cursor capability bounds page sizes to 1-500 and preserves continuations for empty filtered pages. PostgreSQL uses indexed JSON containment for issuer/type/subject predicates. Legacy List behavior remains explicit.

Validation: 1,002-record H2 pagination regression and real PostgreSQL filtering/index-plan test pass. Production-scale performance benchmarking remains outside this local run.

TW07trustweave | P2Implemented

Explicit file recovery

Normal listings, record listings and statistics consistently fail on corrupt credentials or metadata; recoverRecords reports partial data explicitly.

Validation: File corruption/recovery and existing file-wallet tests.

TW08trustweave | P2Implemented

Record mutations serialized

Store/delete coordinate credential and metadata locks in stable order across wallet instances in the same JVM. Atomic replacement remains in use.

Validation: File wallet regression suite; record lock ordering reviewed. Cross-process distributed filesystem transactions are not claimed.

TW09trustweave | P2Implemented

Origin-wide browser locking

Bootstrap, imports, signing, deletion and reset share a Web Lock. Facade mutations are asynchronous; callers await them.

Validation: Real Chromium tabs concurrently import without lost updates; reload preserves both records and signing identity.

TW10trustweave | P2Implemented

Stored data validated

Credential collections and holder metadata receive runtime validation. Malformed data enters recovery without replacement; the Share page now displays recovery correctly.

Validation: Malformed JSON-shape regressions and production-page recovery browser test.

TW11trustweave | P2Implemented

Catalog-backed requirements

Runtime metadata can be generated from the capability catalog. Registry application requirements validate assessed operations; format checks fail closed. Assessed stub providers refuse construction; docs enumerate unassessed modules.

Validation: Common capability/registry tests and generated documentation drift check.

TW12trustweave | P2Implemented

Real browser contracts

Added Chromium coverage for issuer/import/disclosure/verifier contracts, nonce failure, persistent non-extractable keys, cross-tab writes and recovery. CI runs these after building.

Validation: 3 Chromium tests and 12 wallet unit/crypto tests pass. Custody and custom encrypted-profile limits are documented.

TW13trustweave | P1Implemented

Wallet dependencies updated

Next.js, Vite, Vitest and browser-test tooling updated; dynamic route parameters migrated. Node 24 is the supported CI/runtime baseline.

Validation: Wallet audit reports 0 vulnerabilities; production build and typecheck pass.

SA01trustweave-saas | P1Implemented

Legacy lookup removed

Public credential IDs no longer expose expected holder IDs or raw credentials. Staged invitations and proof-bound OID4VCI remain the retrieval routes.

Validation: PublicCredentialOfferSecurityTest covers attacker and known-holder guesses without touching the credential repository.

SA02trustweave-saas | P1Implemented

Offer redemption locked

A pessimistic database lock serializes redemption of one offer across calls while status and issuance are processed.

Validation: Backend compilation/integration validation; locked repository query used by the transactional redemption service.

SA03trustweave-saas | P1Implemented

Resource audience required

Validation requires aud; azp cannot substitute. Blank audience configuration fails startup. Keycloak integration fixtures now add the API audience mapper.

Validation: AudienceValidatorTest and authenticated Keycloak controller integrations.

SA04trustweave-saas | P2Implemented

Policy switches explicit

The verification DSL explicitly calls skipRevocation/skipExpiration when disabled, including allowlist verification.

Validation: Credential verifier and policy tests; complete backend suite.

SA05trustweave-saas | P1Implemented

Unchecked is not passed

Verification checks carry an evaluated flag. Disabled expiry/revocation/trust checks are shown as not evaluated, including neutral frontend indicators.

Validation: Frontend build/tests and backend verifier policy tests.

SA06trustweave-saas | P1Implemented

Strict trust fails closed

Strict verification refuses to produce a valid result when no trusted issuer can be evaluated.

Validation: Regression now expects a failed Strict result with a trusted-issuer configuration error.

SA07trustweave-saas | P2Implemented

Disclosure limitations honest

The full-JSON profile requests preferred disclosure and communicates complete-credential disclosure in metadata and UI.

Validation: Verification request tests and frontend build.

SA08trustweave-saas | P2Implemented

History paging and retention

Tenant history returns a bounded Page with no per-row writes. A history index supports ordering. Configurable 90-day retention deletes at most 500 expired records hourly.

Validation: History paging, retention cutoff and database purge tests; V22 migration.

SA09trustweave-saas | P2Implemented

Server-side cancellation

Tenant-authorized cancellation becomes a terminal database state. The UI posts cancellation and uses the server result rather than only clearing local state.

Validation: Cancellation regression rejects later submission and checks tenant isolation; frontend tests/build.

SA10trustweave-saas | P2Implemented

Verification work bounded

Byte, depth, descriptor and credential-count bounds precede cryptography. Per-instance/per-tenant worker limits, a 15-second deadline and a 30-second database lease bound and deduplicate work.

Validation: Work gate duplicate/deadline tests and session regressions; deployment shared ingress quotas still require staging validation.

SA11trustweave-saas | P2Implemented

Webhook failures recoverable

Unsupported signed subscription events return retryable failures, retain the verified payload in a recovery table, and do not keep a successful dedup marker. Successful retry removes recovery data.

Validation: Updated Stripe controller tests pass; V23 migration and privileged-operator recovery runbook.

SA12trustweave-saas | P1Implemented

Frontend dependencies and workbook isolation

Upgraded dependencies, replaced vulnerable npm SheetJS with the patched distribution, and moved workbook parsing to a worker with file/row/column/time bounds.

Validation: 0 audit vulnerabilities; 292 frontend tests, lint and production build pass; initial JavaScript remains below 500 KB.

SA13trustweave-saas | P2Release validation pending

Release parity gate prepared

CI now compares the checked-out SDK against the reviewed runtime-source fingerprint. Publishing the SDK commit, updating the immutable pin and running Linux/staging validation remain outstanding.

Validation: Local fingerprint check passes. No commit publication, Linux pipeline or staging ingress/shared-limit result is claimed.

SA14trustweave-saas | P2Implemented

Token grants respect offer state

Token issuance locks the offer, validates tenant/status/expiry and lifetime, and invalidates earlier unconsumed grants before issuing a replacement.

Validation: AccessTokenStore integration tests verify one-time consumption, grant rotation and invalid lifetimes.