Engineering review · 10 September 2026 · both repositories

Production readiness requires closing the integration gaps.

The current evidence does not support an overall score above 9.7. This review identifies concrete implementation defects and the qualification work needed for a defensible 9.8 target. It changes review artifacts only; findings remain open.

SDK · reassessed scope8.9/10
SaaS · provisional7.1/10
Joint planning mean8.0/10
Acceptance target · unmet9.8/10

Scores reflect evidence, not the requested target

Provisional engineering judgment. Six equally weighted categories and equally weighted repositories; joint mean is a planning indicator, not a deployability gate. Historical SDK 9.3 had narrower scope. New SDK reassessment includes the selected provider boundary. No point changes imply statistical precision.

12 P1 blockers and 6 P2 findings remain open. P1 includes implementation defects and explicitly identified release-qualification gaps. No P0 was identified; this is not proof none exists. P1 blocks the declared production-ready claim; P2 must be resolved or explicitly bounded before a 9.8 acceptance review.
AspectSDKSaaSJointAssessment
Security and access control9.07.58.25SDK: Core controls retained; real custody and host policy remain open.
SaaS: KMS profile bypass, fail-open abuse limits and capability logging require correction.
Observability and diagnosability9.67.58.55SDK: Prior SDK host telemetry evidence retained; it does not qualify Spring SaaS telemetry.
SaaS: Readiness semantics and sensitive path telemetry are incorrect; end-to-end export remains unqualified.
Reliability and scale8.56.57.50SDK: Vault response defect and unqualified end-to-end recovery lower the broader assessment.
SaaS: Outbox scheduler transaction, lease duration and outage handling remain blockers.
Configuration and data8.57.58.00SDK: Strict loaders and ledger audit are valuable, but Vault parsing and host checkpoint ownership are incomplete.
SaaS: KMS option wiring, profile composition, recovery and deployment configuration need acceptance evidence.
Deployment and release8.56.57.50SDK: Earlier 8.5 retained; no deployed production profile is newly qualified.
SaaS: Recipe mismatches and absence of runtime artifact promotion evidence constrain the score.
Testing and documentation9.07.08.00SDK: Prior hosted evidence retained; the driver contract defect demonstrates an important provider test gap.
SaaS: 298 frontend tests pass, but backend outcome and missing proxy/provider/coverage assurance prevent a high score.

Arithmetic: SDK 53.1 / 6 = 8.85; SaaS 42.5 / 6 = 7.0833; joint 95.6 / 12 = 7.9667. Display uses one-decimal half-up rounding. Earlier SDK 9.3 is preserved as a narrower historical assessment, not silently rewritten.

Acceptance rule: Zero open P0/P1; both repository means >9.7 unrounded; critical category floors >=9.7; immutable pair and actual declared deployment/custody/recovery gates pass. A high average cannot waive a blocker.

Rubric: 9.8–10 requires qualified declared production behavior and independent operational evidence; 9.0–9.7 has strong engineering with remaining qualification limits; 7.0–8.9 has material implementation/assurance gaps; below 7 has core reliability or release blockers. These are review judgments, not statistical measurements.

Full score record

What was actually verified

Failure triage: 442 passed, 111 failed, 3 skipped. Seven failures are stale usage-reporter assertions; 104 are initial context failures or cached cascades from the requestContextFilter bean collision. These are not 111 independent defects. AccountlyDeploymentContractTest (1) and AccountlyLiveContractTest (2) are skipped; real deployment qualification remains open. No fresh backend coverage result is claimed from this failed invocation. Root-cause evidence · Commands and probe reproduction.

Backend suites with failures, errors or skips
  • com.geoknoesis.trustweave.saas.server.controller.TrustSpaceControllerIntegrationTest$FullLifecycle: 1 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.TrustSpaceControllerIntegrationTest$DeleteNetwork: 4 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.TrustSpaceControllerIntegrationTest$CreateNetwork: 6 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.TrustSpaceControllerIntegrationTest$UpdateNetwork: 5 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.ApplicationContextSmokeTest: 3 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.billing.accountly.AccountlyDeploymentContractTest: 0 failures / 0 errors / 1 skips
  • com.geoknoesis.trustweave.saas.server.billing.accountly.AccountlyLiveContractTest: 0 failures / 0 errors / 2 skips
  • com.geoknoesis.trustweave.saas.server.billing.accountly.UsageReporterTest: 7 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.BillingProxyControllerTest: 2 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.BlockchainTransactionControllerIntegrationTest: 2 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.ExampleProjectControllerIntegrationTest: 2 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.IssuerControllerIntegrationTest: 5 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.OrganizationDetailOwnerTest: 3 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.OrgBillingControllerTest: 5 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.TenantAdministrationIntegrationTest: 8 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.TrustSpaceControllerIntegrationTest$GetNetwork: 4 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.TrustSpaceControllerIntegrationTest$ListNetworks: 4 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.controller.UserControllerIntegrationTest: 4 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.integration.KeyRotationAndSuspensionIntegrationTest: 7 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.oid4vci.AccessTokenStoreTest: 6 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.oid4vp.VerificationRequestServiceTest: 21 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.security.SecurityIntegrationTest: 3 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.webhook.AccountlyWebhookControllerTest: 2 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.webhook.StripeWebhookControllerIntegrationTest: 2 failures / 0 errors / 0 skips
  • com.geoknoesis.trustweave.saas.server.webhook.WebhookRecoveryIntegrationTest: 5 failures / 0 errors / 0 skips

SDK HEAD: e0a4464fc6cafa339b94121fd56f33812c6601e4
SaaS HEAD: f31dfeb8af1ec7572d112f110c83990173f3dc9b
SaaS SDK pin: a41d482a96dcdd3962c2a0a95fd1da469f310fa9. Both workspaces contain pre-existing edits; HEAD alone does not identify reviewed content.

Architecture and trust boundaries

Browser / public protocols
React UI, claims, token exchange and verification. JWT, capability and proof boundaries must stay distinct.
SaaS application
Spring security, tenant authorization, issuance, database transactions, scheduled workers and usage outbox.
External dependencies
PostgreSQL, Keycloak, Accountly and SDK-backed KMS/DID/status-list operations. Each needs its own failure and recovery contract.

The modular SDK and SaaS service separation are useful. The main risks lie where boundaries meet: proxy transactions versus scheduled calls, a local database commit versus a remote billing effect, a driver’s wire representation versus Kotlin types, and a profile name versus actual durable custody.

Controls worth retaining

The reviewed code includes issuer/audience validation, default-deny route rules, tenant ownership checks, atomic token consumption, unique webhook deduplication, failed-webhook recovery storage, bounded local rate-limit state and bulk credential expiry. SDK configuration parsing, ledger audits, hosted test manifests and host telemetry provide substantial prior evidence. None substitutes for the missing integration acceptance tests.

Performance and data priorities

Measure remote calls inside broad transactions, sequential usage batches, scheduler lease expiry, shared-limiter hot rows/key churn and user-sync pagination first. Do not infer production throughput from the earlier one-minute component load test. Recovery must include external billing effects, consumed authorizations and key bindings before admission resumes.

Detailed findings

Confidence labels distinguish local reproduction, source-confirmed behavior, design risks and missing qualification. Open each item for impact, correction and acceptance evidence.

P1 R18 · Custom requestContextFilter bean prevents Spring MVC startupSaaS · Reproduced in full backend suite · Open

Evidence

The custom @Component RequestContextFilter receives the default bean name requestContextFilter. Spring Boot MVC auto-configuration registers its own bean with that name. The full backend run reproduces BeanDefinitionOverrideException in 11 initial context loads, followed by cached failure-threshold errors in dependent cases.

Impact

ApplicationContextSmokeTest and multiple real integration contexts cannot start. This is a code-level bean-name collision, not a missing Docker or identity-provider prerequisite. The 111 failing test cases are not 111 independent defects.

Required change

Give the telemetry filter an explicit distinct bean name (or rename the class), preserve Spring’s request-context filter, and keep bean overriding disabled. Re-run real application smoke and all affected integration suites.

Acceptance evidence

Both framework and telemetry filters exist with intended ordering and no duplicate registration. The application boots, MDC is cleaned after errors/async dispatch, and the complete suite passes without enabling bean-definition overriding.

Source references

P1 R01 · Scheduled usage delivery bypasses its transaction boundarySaaS · Source-confirmed · Open

Evidence

scheduledDrain() invokes drainOnce() on the same bean. Only drainOnce() has @Transactional. The native claim query uses FOR UPDATE SKIP LOCKED. Under Spring’s default proxy transaction mode, this internal call does not open the intended encompassing transaction.

Impact

The scheduler path cannot rely on row locks covering delivery and persistence. Whether the provider rejects the query or releases locks early must be established with the real scheduled entry point; neither outcome is acceptable as the claimed concurrency guarantee.

Required change

Move work behind a separate proxied worker or explicit transaction boundary. Prefer short claim/finalize transactions with durable leases; do not merely put a long transaction around HTTP delivery.

Acceptance evidence

Invoke the Spring-managed scheduled entry with PostgreSQL, assert the claim transaction, pause two workers at claim/send boundaries, and kill/restart one worker. Verify recovery and provider idempotency.

Source references

P1 R02 · Outbox lease and outage handling do not bound delivery safelySaaS · Source-confirmed design risk · Open

Evidence

A five-minute scheduler lease protects up to 100 sequential events with a default 20-second request timeout. One timeout per event alone can exceed 33 minutes. Generic transport and circuit-open failures consume the ten-attempt poison budget; only HTTP 429/503 are exempt.

Impact

A long batch can outlive its scheduler lease. When transactions are corrected, remote calls inside the transaction can exhaust DB capacity. A prolonged transient outage can leave valid billable events terminally FAILED and dependent on manual intervention.

Required change

Use per-row durable claim tokens/expiry, bounded batches and deadlines, short transactions, remote idempotency, and classified exponential retry with jitter. Expose authenticated redrive and oldest-pending alerts.

Acceptance evidence

Test lease expiry, provider commit followed by lost response, 429/503, repeated connection failures and recovery after more than ten drain ticks. No valid event is silently abandoned or billed twice.

Source references

P1 R03 · Usage reporter tests exercise the obsolete repository contractSaaS · Reproduced: seven reporter cases fail · Open

Evidence

UsageReporterTest stubs findByStatusInAndAttemptsLessThanOrderByCreatedAtAsc, while production calls claimForDelivery. It constructs UsageReporter directly and calls drainOnce(), so it also misses scheduler/proxy semantics.

Impact

Existing assertions do not qualify the changed claim path. Merely replacing mock method names would still leave the transaction defect undetected.

Required change

Update unit contracts and add real PostgreSQL/Spring proxy integration tests for the scheduled entry point, concurrent claims and retry state transitions.

Acceptance evidence

All existing reporter cases pass against the current method; a deliberately removed transaction or broken claim lease makes an integration test fail.

Source references

P1 R04 · Shared rate-limit failures allow every requestSaaS · Source-confirmed · Open

Evidence

RateLimiter.check catches every Exception from the shared store, logs a warning, and returns success. This policy applies to public token, claim and redemption paths as well as verification. No dedicated failure-policy metric is emitted by this class.

Impact

Counter-table permission loss or a store outage removes abuse limits on sensitive public operations. This is not a JWT/signature bypass, but authentication alone does not replace abuse controls.

Required change

Define endpoint-specific failure policy. Fail closed with bounded 503 on sensitive mutations; use an explicitly bounded local fallback only for approved read operations. Add low-cardinality metrics and sampled logs.

Acceptance evidence

Break only the counter-table access while the rest of the service remains available. Sensitive operations reject without downstream mutation; approved read fallback remains bounded across concurrent callers.

Source references

P2 R05 · Shared limiter uses caller clocks and lacks a cardinality budgetSaaS · Source-confirmed design risk · Open

Evidence

The upsert and expiry sweep use Instant.now() from each application instance. Shared rows have no configured maximum, unlike the bounded local map; rejected hits still increment an integer counter.

Impact

Clock skew can make nodes disagree about expiry. High-cardinality traffic and a hot key can load the primary DB. No measured failure threshold is claimed by this review.

Required change

Use database time for the shared decision, saturate counts, bound statement latency and retention, and define a key-cardinality/pool budget. Consider a dedicated limiter store only if measured DB costs justify it.

Acceptance evidence

Run skewed-clock multi-node tests plus hot-key and high-cardinality load; record p95/p99 latency, pool occupancy, retained rows, cleanup time and rejection correctness.

Source references

P1 R06 · Production plus local profile accepts an ephemeral KMSSaaS · Reproduced locally · Open

Evidence

validateForProfiles allows the in-memory provider whenever any profile is dev/test/local. A local Java probe rejects prod alone but accepts prod+local and staging+local. TrustWeaveConfig is disabled only for test, so local does not disable facade construction.

Impact

An accidental profile mix can deploy issuer keys that disappear on restart, leaving persisted issuer identities unable to sign.

Required change

Make deployed profiles dominate development allowances, reject incompatible profile combinations, and validate the effective persistent provider before startup.

Acceptance evidence

Table-test empty, unknown, mixed, case-varied and production profiles; boot prod+local and staging+local and require rejection. A permitted persistent profile must retain the same signing identity across restart.

Source references

P2 R07 · Bound KMS options are silently unusedSaaS · Source-confirmed · Open

Evidence

KmsProviderConfig exposes provider-specific options, but TrustWeaveConfig forwards only provider and algorithm to the keys builder. No kmsConfig.options consumer was found.

Impact

An operator can supply a documented option without changing the effective provider configuration. A provider may separately read environment settings; this finding does not claim all environment-based setups fail.

Required change

Forward typed, validated provider options through the actual factory or reject unsupported configuration explicitly. Publish a secret-safe effective-configuration fingerprint.

Acceptance evidence

A non-default endpoint/namespace is observed by a fake provider; unknown or unused options fail startup and no secret appears in diagnostics.

Source references

P1 R08 · Request logging context includes capability-bearing pathsSaaS · Source-confirmed · Open

Evidence

RequestContextFilter puts raw request.requestURI into MDC HTTP_PATH. Production JSON logging includes httpPath. PublicClaimController serves /api/public/claim/{offerCode}, where offerCode is used to locate the claim offer.

Impact

Logs emitted while handling a claim can retain its capability value. requestURI excludes query strings; this finding concerns path tokens and does not assert that every request emits a log.

Required change

Use route templates or an allowlisted path redactor before logging. Apply the same rule to access logs, trace attributes and error diagnostics.

Acceptance evidence

Send unique canary offer codes through success and failure cases; captured logs/traces contain no canary while request correlation and route-level metrics remain useful.

Source references

P2 R09 · Readiness accepts a missing identity realm as healthySaaS · Source-confirmed · Open

Evidence

The dependency probe treats every status below 500 as UP, including 401, 404 and 429. Keycloak uses a public OIDC discovery URL and participates in readiness.

Impact

A deleted realm or incorrect probe URL can remain green after startup. Reachability is useful information, but is insufficient for a functional readiness decision.

Required change

Separate reachability from readiness. Require successful, valid discovery metadata for the configured issuer, with bounded timeouts and controlled probe caching; keep liveness independent.

Acceptance evidence

Exercise 401/404/429/500, malformed 200, wrong issuer and valid discovery responses. Readiness changes correctly without a liveness restart storm.

Source references

P1 R10 · Committed Fly recipe disagrees with the application port and datasource contractSaaS · Source-confirmed recipe defect · Open

Evidence

fly.toml routes to 8080 while application.yml defaults to 8081 and the Docker image exposes/checks 8081. The Fly environment supplies no SERVER_PORT override, uses a postgres:// example URL where the datasource expects a JDBC URL, and retains a placeholder Keycloak host.

Impact

The committed recipe is not a reproducible production deployment. External secrets or platform overrides may make an existing deployment work; none were inspected here.

Required change

Choose one supported port/configuration contract, remove example production fallbacks, require validated datasource/issuer settings, and qualify the actual image through the documented deployment recipe.

Acceptance evidence

Build and boot the image with the declared profile, reach readiness through the configured proxy port, reject missing secrets, and migrate a real supported PostgreSQL instance.

Source references

P1 R11 · Current repositories do not form the pinned SDK/SaaS candidate pairJoint · Reproduced source gate failure · Open

Evidence

The SaaS pin expects a41d482a96dcdd3962c2a0a95fd1da469f310fa9; the sibling SDK HEAD is e0a4464fc6cafa339b94121fd56f33812c6601e4 with local changes. verify-sdk-source.py rejects this pair. The previously qualified SDK candidate is 5e8dc04c0e45dd51b323b6b3c475d302615715af.

Impact

Current local integration tests cannot certify the pinned release pair. This does not prove that SaaS CI against its intended pinned revision fails.

Required change

Create immutable reviewed candidates in both repositories, update the pin and reviewed source digest manifest deliberately, and run all integration and artifact gates on that exact pair.

Acceptance evidence

Source verifier, clean builds and hosted integration pass on the same recorded pair; all delivered artifacts and reports carry both SHAs and source digests.

Source references

P2 R12 · Release evidence stops before the deployable artifactSaaS · Qualification gap in inspected CI · Open

Evidence

The inspected CI tests backend sources and builds frontend assets, but has no bootJar/container release build, SBOM/provenance attestation, image promotion/rollback qualification or deployed digest verification. Actions use version tags and the Docker base is a floating tag.

Impact

Green source tests do not establish the identity or readiness of the image that is deployed. No specific vulnerable dependency is alleged; no fresh vulnerability scan was run.

Required change

Build the runtime image once from the qualified pair, pin build inputs, produce SBOM/provenance, enforce a vulnerability policy, verify signatures/digests at promotion, and exercise rollback.

Acceptance evidence

Tampered provenance or mismatched SDK/image digest blocks promotion; an immutable image passes startup, smoke, migration and rollback tests with archived evidence.

Source references

P2 R13 · Coverage and browser harness policy leave important paths unqualifiedJoint · Source-confirmed assurance gap · Open

Evidence

SaaS backend coverage verification has a 0.40 floor. Frontend coverage has reporters but no thresholds and CI runs ordinary tests. MSW is configured to warn on unexpected requests; the current passing suite emits network warnings. Previous SDK global coverage was 57.41% line / 40.04% branch.

Impact

Passing counts and category scores are not coverage percentages. Proxy, provider response and deployment defects can survive mock-heavy tests. Network warnings need classification rather than blanket suppression.

Required change

Define critical-path branch and mutation targets, exercise real transaction/provider contracts, and make unexpected browser requests fail deterministically after fixture cleanup. Retain an explicit skip/discovery manifest.

Acceptance evidence

Critical negative cases fail when their guards are removed; risk-based coverage thresholds are enforced in CI and no unapproved test skips or unexpected requests remain.

Source references

P2 R14 · User synchronization holds a broad transaction across remote workSaaS · Source-confirmed design risk · Open

Evidence

syncAllUsers is transactional, fetches the user list, then calls a method that fetches each user remotely and saves it. Per-user exceptions are caught inside the outer transaction. The list call has no explicit pagination at this layer.

Impact

Large or slow identity-provider responses can lengthen transactions; a database failure may poison the outer transaction despite per-user error counting. Pagination completeness needs an explicit contract; no undocumented provider page-size assumption is made.

Required change

Fetch bounded pages outside DB transactions, persist each bounded unit through a real transaction boundary, checkpoint progress and make retries idempotent.

Acceptance evidence

Sync more than one provider page, inject a mid-page DB failure and slow identity responses, restart and resume, and demonstrate bounded DB occupancy and correct completion counts.

Source references

P1 R15 · Vault public-key extraction casts String to MapSDK · Driver-shape reproduced; source-confirmed adapter defect · Open

Evidence

VaultKeyManagementService generateKey/getPublicKey reads keyInfo.data["keys"] and casts it to Map. The pinned driver LogicalResponse.getData() returns Map<String,String>. javap and a local nested-JSON fixture show keys is a java.lang.String; the cast cannot succeed. The compiler reports this at both paths. getDataObject() preserves structured JSON.

Impact

A valid nested Vault key response cannot yield a public key through these extraction paths. Key generation can create a provider-side key and then return failure. This is especially material to SaaS staging, which selects Vault.

Required change

Parse the driver’s structured response with explicit schema/version/type validation. Cover missing/invalid fields and avoid orphaning/recreating keys on retry. Then qualify the declared Vault algorithm and lifecycle end to end.

Acceptance evidence

A driver-faithful fixture passes generate/get-public-key behavior; malformed versions fail safely. Against an isolated Vault instance, create/sign/independently verify/restart/retrieve/rotate succeeds with stable identity and no private-key leakage.

Source references

P1 R16 · No declared production custody profile is fully qualifiedJoint · Explicit qualification gap · Open

Evidence

The SDK custody runbook explicitly says not qualified. Its assessed capability catalog has no supported entries; deployment gating is opt-in outside selected factories and compatibility defaults remain LEGACY. The reference wallet adapters remain experimental.

Impact

A strong core SDK score cannot certify all providers, physical authenticators or the SaaS-managed signing path. Broad production-ready claims exceed available evidence.

Required change

Declare the exact initial production provider/algorithm/wallet surface, enforce its policy at host construction, and complete real signing, denied access, outage, restart, rotation and authorized recovery evidence. Keep excluded adapters explicitly experimental.

Acceptance evidence

The chosen profile has immutable provider/key identity, independent signature verification, negative authorization and replay tests, recovery approval/audit evidence, and no fallback to ephemeral custody.

Source references

P1 R17 · Component recovery is not an end-to-end admission and journal recovery proofJoint · Explicit qualification gap · Open

Evidence

Previous SDK tests qualify component WAL recovery and a read-only ledger integrity helper. The helper depends on a separately trusted checkpoint; it does not itself store that checkpoint, authenticate an external payment journal or fence new admission during reconciliation. SaaS recovery of billing, claims and custody together is not evidenced by those tests.

Impact

A consistent but stale restore can still be unsafe to resume if external effects and authorization consumption are not reconciled. RPO/RTO and replica fencing remain deployment-specific.

Required change

Own checkpoint custody and journal authentication at the host, keep admission fenced until verification/reconciliation completes, and exercise application-wide restore with custody and external effects.

Acceptance evidence

Restore an isolated production-shaped dataset, reject stale/tampered checkpoints and missing WAL, reconcile acknowledged external effects, prove no reused authorization or duplicate billing, and measure agreed RPO/RTO before opening admission.

Source references

Ordered path to a defensible 9.8

All 46 tasks are open. S = usually less than one engineer-day; M = roughly 1–3 days; L = multi-day/integration work. These are planning estimates, not delivery commitments. Resource access and soak duration can dominate elapsed time. A task closes only when its acceptance evidence passes on the candidate pair.

Wave 0 · Scope and candidate identity

T01 · Declare the initial production support envelope

Joint · Tech lead · effort S · depends on none · findings R16, R17

Done when: Record supported provider, algorithms, wallet flows, deployment platform, PostgreSQL version, tenant scale and excluded experimental operations.

T02 · Select and bind an immutable candidate pair

Joint · Release engineering · effort M · depends on T01 · findings R11

Done when: Both clean candidate SHAs, reviewed source manifest and source verifier agree; preserve existing local work.

Wave 1 · Fix release-blocking behavior

T03 · Correct Vault structured response parsing

SDK · KMS maintainers · effort M · depends on T01 · findings R15

Done when: Faithful nested driver fixtures cover create/get, missing keys, version selection and malformed types.

T04 · Qualify the selected Vault lifecycle

SDK · KMS maintainers · effort L · depends on T03 · findings R15, R16

Done when: Isolated provider create/sign/independent verification/restart/rotation passes; no orphaned retry keys.

T05 · Reject incompatible production KMS profiles

SaaS · Platform backend · effort S · depends on none · findings R06

Done when: Truth table and actual Spring startup reject prod+local, staging+local and unintended ephemeral configurations.

T06 · Make KMS options effective and validated

SaaS · Platform backend · effort M · depends on T05 · findings R07

Done when: Non-default endpoint/namespace is used; unknown/unconsumed options fail startup; diagnostics redact secrets.

T07 · Establish real outbox transaction boundaries

SaaS · Billing backend · effort M · depends on none · findings R01, R03

Done when: Spring-managed scheduler/proxy tests demonstrate short atomic claim/finalize transactions.

T08 · Implement durable bounded delivery leases

SaaS · Billing backend · effort L · depends on T07 · findings R02

Done when: Two-worker, expired-lease and worker-crash tests preserve claim ownership with fencing tokens and bounded batch runtime.

T09 · Separate transient retries from poison events

SaaS · Billing backend · effort M · depends on T08 · findings R02

Done when: Connection outage beyond ten ticks recovers; permanent rejection enters an audited terminal queue; retry delay and Retry-After are bounded.

T10 · Prove remote idempotency and authenticated redrive

SaaS · Billing backend · effort M · depends on T09 · findings R02

Done when: Provider commit/response-loss and operator redrive produce exactly one remote charge/effect per event key.

T11 · Enforce endpoint-specific limiter failure policy

SaaS · Security backend · effort M · depends on none · findings R04

Done when: Counter-only outage causes sensitive mutation rejection and bounded approved read fallback; no blanket allow path.

T12 · Use authoritative time and bounded shared counters

SaaS · Security backend · effort M · depends on T11 · findings R05

Done when: Skewed caller clocks cannot reset budgets; counters saturate and TTL/pool limits survive hot-key and churn load.

T13 · Remove capability values from telemetry

SaaS · Observability · effort M · depends on none · findings R08

Done when: Canary path tokens are absent from logs, spans, access logs and error cases while correlation remains intact.

T14 · Make readiness verify dependency function

SaaS · Platform backend · effort S · depends on none · findings R09

Done when: 401/404/429/500, malformed discovery and issuer mismatch are not UP; liveness remains independent.

T15 · Repair and test the chosen deployment recipe

SaaS · Deployment engineering · effort M · depends on T01, T46 · findings R10

Done when: One port/JDBC/issuer contract builds and boots through its actual proxy; missing secrets fail safely.

T16 · Replace stale outbox mocks with contract coverage

SaaS · Test engineering · effort M · depends on T07, T08 · findings R03

Done when: Current unit cases pass and a regression removing scheduler transaction/lease correctness is detected.

T46 · Remove the Spring request-context bean collision

SaaS · Platform backend · effort S · depends on none · findings R18

Done when: Explicitly named telemetry filter coexists with Spring MVC, overriding stays disabled, smoke startup and affected integration cases pass.

Wave 2 · Data, custody and isolation

T17 · Page and checkpoint user synchronization

SaaS · Identity backend · effort M · depends on none · findings R14

Done when: Multi-page provider fixtures plus a failed page and restart demonstrate complete, idempotent recovery.

T18 · Bound synchronization transactions

SaaS · Identity backend · effort M · depends on T17 · findings R14

Done when: Slow identity HTTP does not hold a DB transaction; one failed persistence unit does not roll back unrelated successful units.

T19 · Enforce provider policy at host startup

Joint · Security architecture · effort M · depends on T01, T04, T06 · findings R16

Done when: The declared profile rejects unknown/stub/disallowed experimental providers before opening resources; no LEGACY bypass in production entry points.

T20 · Exercise signing denial and outage boundaries

Joint · Custody operations · effort L · depends on T19 · findings R16

Done when: Wrong tenant/key/algorithm, expired and replayed proofs fail before provider signing; outage does not select a fallback key.

T21 · Exercise authorized recovery and replacement

Joint · Custody operations · effort L · depends on T20 · findings R16

Done when: Restart/access recovery preserve identity; replacement has independent authorization, revoked old binding and durable audit. Physical-device tests apply only if included in T01.

T22 · Persist independently trusted recovery checkpoints

Joint · Data engineering · effort M · depends on T01 · findings R17

Done when: Checkpoint authenticity and freshness survive DB compromise/restore; application DB alone cannot rewrite the trust anchor.

T23 · Fence admission during restore and reconciliation

Joint · Data engineering · effort L · depends on T22 · findings R17

Done when: No new authorization is admitted until ledger/checkpoint/external journal verification completes; failure remains fenced.

T24 · Reconcile external effects after restore

Joint · Billing and data · effort L · depends on T10, T23 · findings R17

Done when: Authenticated journal and local outbox reconcile commit/ack-loss and stale restore without duplicate effects or reused authorization.

T25 · Qualify production-shaped backup and recovery

Joint · SRE · effort L · depends on T21, T24 · findings R17

Done when: Record agreed RPO/RTO, dataset size and timings; missing WAL/corrupt backup/stale checkpoint fail closed; recovered service resumes safely.

T26 · Qualify schema upgrades and rollback compatibility

SaaS · Data engineering · effort M · depends on T15 · findings R10, R12

Done when: Upgrade from two declared supported schema versions under writes; old/new application compatibility and interrupted migration recovery are explicit.

T27 · Complete cross-tenant negative authorization matrix

Joint · Security test engineering · effort L · depends on T01 · findings R16

Done when: Every declared public/admin/tenant mutation has wrong-tenant, wrong-role, expired, replay and identifier-substitution outcomes tied to source and tests.

T28 · Qualify outbound network restrictions

Joint · Security engineering · effort M · depends on T01 · findings qualification

Done when: Declared DID, webhook and provider clients reject disallowed destinations/redirects and bound size/time; tests use actual host integration.

Wave 3 · Operational and release qualification

T29 · Verify distributed traces through billing and SDK calls

SaaS · Observability · effort M · depends on T07, T13, T46 · findings qualification

Done when: A real incoming request produces correlated outgoing provider spans with trace propagation and authenticated export; prove manual RestClient construction receives instrumentation.

T30 · Add queue, limiter and recovery signals

SaaS · Observability · effort M · depends on T09, T11, T23 · findings R02, R04, R17

Done when: Oldest outbox age, leased/failed rows, limiter degradation, recovery fence and reconciliation failures have bounded labels and verified alerts.

T31 · Define measurable service objectives and alert ownership

Joint · SRE · effort M · depends on T01, T30 · findings qualification

Done when: Availability, latency, signing and delivery objectives have error budgets, accountable owners and tested notification acknowledgement.

T32 · Qualify telemetry privacy and retention

Joint · SRE and security · effort M · depends on T13, T29 · findings R08

Done when: Access controls and retention are enforced in the selected backend; sensitive canaries never reach storage; cardinality/load limits are measured.

T33 · Run representative multi-node soak and overload tests

Joint · Performance engineering · effort L · depends on T08, T12, T18, T31 · findings R02, R05, R14

Done when: Agree workload first; run proposed 72-hour steady/peak soak and burst/fault phases, tracking p99, saturation, queue age, DB growth and recovery. This is a target, not a completed measurement.

T34 · Record scale ceilings and backpressure policy

Joint · Performance engineering · effort M · depends on T33 · findings qualification

Done when: Document tested tenant/data/request limits, capacity headroom and bounded degradation, including KMS/IdP/billing outages.

T35 · Define risk-based coverage and mutation gates

Joint · Test engineering · effort M · depends on T16, T20, T24, T27 · findings R13

Done when: Critical auth/custody/claim/recovery branches have explicit agreed floors (proposed 90% line, 85% branch) and meaningful mutation checks; exceptions are reviewed, not hidden.

T36 · Make browser tests deterministic and enforce coverage

SaaS · Frontend engineering · effort M · depends on none · findings R13

Done when: Classify current network warnings, add missing fixtures and fail unexpected requests without the prior worker serialization problem; CI runs coverage with agreed floors.

T37 · Bind test discovery and skips to release evidence

Joint · Test engineering · effort M · depends on T02, T35, T36 · findings R11, R13

Done when: Test IDs/counts, failures, documented optional skips and required provider profiles are archived and checked against the immutable candidate pair.

T38 · Build the runtime image in CI

SaaS · Release engineering · effort M · depends on T02, T15 · findings R12

Done when: bootJar, frontend assets and OCI image are built from the candidate pair; production-profile startup and smoke tests run against that image.

T39 · Pin inputs and generate SBOM/provenance

SaaS · Supply-chain security · effort M · depends on T38 · findings R12

Done when: Actions/base image are immutable; dependency/image scans enforce a defined policy; SBOM and provenance identify both repository commits.

T40 · Verify artifact identity during promotion

Joint · Release engineering · effort M · depends on T39 · findings R11, R12

Done when: A modified image, wrong source pair or untrusted attestation is rejected; the tested digest is the promoted digest.

T41 · Exercise canary rollout and rollback

SaaS · Release engineering · effort L · depends on T26, T31, T40 · findings R12

Done when: Promote a qualified digest with explicit health/error-budget gates and demonstrate rollback with the supported schema compatibility window.

Wave 4 · Independent acceptance and rescore

T42 · Publish one production support and operations contract

Joint · Documentation owners · effort M · depends on T25, T34, T41 · findings R16, R17

Done when: Setup, configuration precedence, limits, provider scope, backup, rotation, incident and rollback instructions match tested commands and evidence.

T43 · Run an operator drill from the documentation

Joint · SRE · effort M · depends on T42 · findings qualification

Done when: An operator other than the author executes restore, custody outage, stuck-delivery redrive and rollback using only published runbooks; gaps are fixed.

T44 · Re-review closure evidence and remaining risks

Joint · Independent reviewer · effort M · depends on T37, T43 · findings qualification

Done when: All P1 findings are closed by behavior tests, scope exclusions are explicit, and evidence is tied to the exact released candidate pair.

T45 · Recalculate scores only after acceptance

Joint · Review owner · effort S · depends on T44 · findings qualification

Done when: Each repository is above 9.7 unrounded, every critical category is at least 9.7, and production acceptance gates pass. Target 9.8; no points are awarded simply for adding documentation/tests.

Review limits and reference semantics

This was a targeted source and verification review of both repositories, not an exhaustive penetration test. No actual production deployment, live managed custody, physical authenticator, fresh vulnerability scan, production-scale soak or complete recovery drill was executed. The sibling policy engine is outside this request. Existing local code changes were preserved; this review adds reports and local diagnostic evidence.

Spring’s default transaction proxies intercept calls that enter through the proxy; same-bean invocation does not activate the annotated method’s transaction. Spring transaction documentation.

ShedLock’s maximum lock duration is a lease limit; a task exceeding it can execute concurrently. ShedLock documentation.

The score should be reassessed after behavior changes and production-profile evidence, not increased because this report is more detailed.