ENGINEERING REVIEW ? REMEDIATION

Changes across both repositories

Implementation response to all 22 review findings. These are local workspace changes, not a deployment or a new production-readiness certification.

Open original scored review

Validation

AreaResult
SaaS backend507 tests, 0 failures/errors, 2 skipped. Full JaCoCo gate passed.
SaaS frontend292 tests across 62 files; lint and production build passed. Initial JS budget passed.
Reference wallet6 tests; TypeScript and Next production build passed.
SDK804 tests in 7 modules, 0 failures/errors, 3 skipped. All affected-module test and ktlint tasks passed. Starknet compiled successfully (no test sources).
Capability documentationGenerated catalog drift check passed.

Gradle may reuse unchanged test results. This is an affected-module check, not the entire SDK test matrix. No live production, Linux-runner or browser interoperability certification is implied.

Release boundaries

The original scores (TrustWeave 69/100; SaaS 58/100) remain historical. No replacement score is assigned without a fresh review.

Finding-by-finding changes

trustweave-saas ? S01

Complete presentation binding

Review finding: Holder proof does not bind the presenter to the credentials

The holder JWS signs the full presentation in its vp claim. Verified key identity, presentation holder and every credential subject must agree. Mutated presentations and another holder?s credentials are rejected.

Evidence / boundary: Real holder-signature adversarial tests in CredentialVerifierServiceTest.

Original evidence
trustweave-saas ? S02

Requested data enforced

Review finding: Requested credential types and claims are never enforced

Verified credentials must satisfy every requested type and claim. Supplied descriptor mappings are validated for definition, descriptor IDs, paths, formats and actual mapped data.

Evidence / boundary: Wrong-type and missing-claim regression tests; full server suite.

Original evidence
trustweave-saas ? S03

Atomic completion

Review finding: Verification completion is a read–check–write race

A conditional database update permits exactly one transition out of PENDING. Competing or repeated submissions return conflict without replacing the result. Network verification occurs outside the completion transaction.

Evidence / boundary: Concurrent response and replay tests.

Original evidence
trustweave-saas ? S04

Expiry is observable

Review finding: Unanswered verification requests never become expired on reads

Reads persist overdue PENDING sessions as EXPIRED; completion also checks the deadline. The UI displays remaining time and supports restarting.

Evidence / boundary: Expired-session read regression test.

Original evidence
trustweave-saas ? S05

Terminal polling stops

Review finding: Completed verification checks keep polling every two seconds

Polling decisions use current query data and stop for terminal results. Connection failures expose retry controls.

Evidence / boundary: Regression test observes that request count stays unchanged after completion.

Original evidence
trustweave-saas ? S06

Trusted client identity

Review finding: Public rate-limit identity trusts arbitrary forwarded headers

Seven public controllers use servlet remoteAddr rather than trusting arbitrary X-Forwarded-For values. Deployment instructions describe the trusted ingress boundary.

Evidence / boundary: Spoofed-header test. Production ingress configuration is deployment-specific.

Original evidence
trustweave-saas ? S07

Bounded rate-limit state

Review finding: Rate-limiter keys accumulate without eviction

Synchronized fixed windows expire idle entries and cap live identities at 10,000. Capacity pressure refuses new identities instead of resetting existing budgets. Public presentations have an independent global budget.

Evidence / boundary: Clock-driven expiry and capacity tests. Limits remain per process.

Original evidence
trustweave-saas ? S08

Portable Docker discovery

Review finding: Backend tests default to a Windows Docker pipe on Linux CI

The Windows named-pipe fallback applies only on Windows. Linux leaves Docker discovery to Testcontainers unless DOCKER_HOST is explicitly configured.

Evidence / boundary: Source validation and full backend test/coverage run on Windows; Linux runner execution remains a release check.

Original evidence
trustweave-saas ? S09

Modal keyboard ownership

Review finding: Nested modal Escape handlers can dismiss both dialogs

Only the top modal responds to keyboard dismissal; lower dialogs are inert, focus is restored, callback changes do not reset focus, and ReactNode headings label dialogs. Cancel is disabled during confirmation work.

Evidence / boundary: Nested Escape, focus restoration and input-state regression tests.

Original evidence
trustweave-saas ? S10

Route loading and size budget

Review finding: Eager page imports produce a large initial JavaScript bundle

Route components load lazily under a loading boundary. Initial JS fell from 1,286.06 kB to 441.57 kB. Builds enforce a 500,000-byte initial-JS budget.

Evidence / boundary: Production build, lint, 292 frontend tests, and budget check (441,620 bytes including initial preload).

Original evidence
trustweave-saas ? S11

Immutable integration input

Review finding: CI tests against mutable library main rather than a recorded revision

CI reads .trustweave-revision and accepts only full commit-SHA overrides. Both source revisions are recorded in the job summary.

Evidence / boundary: The current pin records the reviewed SDK commit. Update it to the committed remediation revision before release; uncommitted code cannot have a usable published commit pin.

Original evidence
trustweave-saas ? S12

Unsupported entries rejected

Review finding: Verifier drops unsupported embedded credential entries

The verifier rejects unsupported embedded representations instead of dropping them. Request metadata and the format matrix state the subject-bound JSON presentation profile.

Evidence / boundary: Verifier/session tests and explicit source validation. No generic JWT/SD-JWT presentation interoperability is claimed.

Original evidence
trustweave ? T01

Status reference is not revocation

Review finding: A status-list reference is treated as proof of revocation

Storage distinguishes metadata presence from resolved revocation. File/database wallets accept a status resolver; unresolved status is UNKNOWN. Offline providers refuse revocation filters when status cannot be resolved. Statistics expose unknown counts.

Evidence / boundary: Updated core/testkit semantics tests and file status-resolver regression tests.

Original evidence
trustweave ? T02

Complete database results

Review finding: Database wallet truncates before applying filters

Removed silent 1,000-record truncation. List/query paths use stable ID ordering and apply filters to the complete result.

Evidence / boundary: A 1,002-record regression proves a match beyond the former cutoff is returned. The List API still materializes results; cursor pagination is a future scalability improvement.

Original evidence
trustweave ? T03

Atomic file persistence

Review finding: File wallet overwrites are not atomic

Sibling temporary files are flushed and atomically moved into place. Read/replace locks coordinate wallet instances. Bounded access-denied retries handle transient Windows file handles; unsupported atomic moves fail without truncating existing data. Metadata is written before the credential.

Evidence / boundary: Concurrent read/write regression and file-wallet suite. Sidecar and credential files are not a cross-file transaction.

Original evidence
trustweave ? T04

Stable storage handles

Review finding: Generated storage IDs are not embedded in anonymous credentials

CredentialRecordStorage exposes storageId separately from the signed VC. Anonymous file credentials use a content-derived stable handle; record enumeration preserves legacy sidecar handles.

Evidence / boundary: Anonymous credential reopen/deduplication regression. Signed credential contents are unchanged.

Original evidence
trustweave ? T05

Exchange lifecycle bounded

Review finding: OID4VCI session maps retain offers and bearer tokens indefinitely

OID4VCI exchange stores have fixed TTL, capacity, periodic cleanup and explicit cancel/purge/close. Successful issuance removes retained state and bearer secrets.

Evidence / boundary: Expiry boundary, capacity, read-lifetime and close tests plus the OID4VCI suite.

Original evidence
trustweave ? T06

Explicit format negotiation

Review finding: Holder-side OID4VCI only accepts JSON-LD credentials

Holder receive capabilities declare ldp_vc. Incompatible advertised configurations are refused before token exchange; unsupported compact responses fail closed.

Evidence / boundary: OID4VCI suite and generated format matrix. This fixes capability ambiguity; compact receive support is not newly implemented.

Original evidence
trustweave ? T07

Non-extractable browser keys

Review finding: Reference wallet keeps exportable holder keys in localStorage

Signing and agreement keys are non-extractable CryptoKeys in IndexedDB. Existing raw seeds migrate without identity rotation and are removed from localStorage. The UI states custody and device-loss limitations.

Evidence / boundary: Key export rejection, real Ed25519 signatures and identity-preserving migration tests. Hardware custody, user verification and cross-device recovery remain outside this reference demo.

Original evidence
trustweave ? T08

Non-destructive recovery

Review finding: Reference wallet schema mismatch silently erases identity and credentials

Supported legacy schemas migrate in place, writing version last. Unknown schemas preserve data and show export, retry and explicitly confirmed reset. Missing/corrupt keys do not cause automatic identity replacement.

Evidence / boundary: Migration and unknown-schema preservation tests; TypeScript and production build.

Original evidence
trustweave ? T09

Reference-wallet CI gate

Review finding: Reference web wallet has no automated CI test gate

Added clean-install, typecheck, tests and production build to CI, with a tracked lockfile. Tests cover key custody, schema migration and a real issuer credential to signed holder-presentation round trip.

Evidence / boundary: 6 focused tests pass. They use Node WebCrypto and fake IndexedDB; a live-browser SaaS cross-profile interoperability test is not claimed.

Original evidence
trustweave ? T10

Machine-readable capabilities

Review finding: Plugin breadth needs a machine-readable capability contract

An assessed capability catalog records maturity, operations and formats; required plugin capabilities are checked before registration, and the Starknet stub is rejected on integration creation. Documentation is generated with a drift gate.

Evidence / boundary: Capability tests and generation --check. Catalog coverage is explicitly an assessed subset, not a claim that every plugin has been validated.

Original evidence

Remediation work log ? Format compatibility