Compass · Independent verification · 6 September 2026

The green suite was real.
The closure needed more work.

All 35 findings now have verified fixes. Additional import, authentication and analytics gaps were reproduced and corrected on the local fix branch.

Four gpt-6-astra specialists · xhigh effort · isolated databases · independent import review

35 / 35findings checked
2,537final examples · 0 failures
56more examples since handoff
2additive migrations

What the second pass fixed

Import atomicity

Replacement imports can no longer delete existing data and then silently skip failed replacement rows. Empty and premature confirmation are also refused.

Retry identity

A dedicated extraction_attempt counter separates retries. Old job results and exhaustion callbacks cannot overwrite a newer attempt; attachment analysis cannot invalidate it.

2FA and privacy

Both deferred 2FA view defects are fixed. Alternate route formats and reset HEAD requests share IP budgets; numeric OTP input follows the invalid-code path.

Legacy lookup recovery

Old blank-currency lookups now open a correction flow for admins or return API 422 across show, CSV and PDF, preserving saved data.

Accurate analytics

Entity rule identities and directional exclusions survive serialization. AND/OR explanations match the actual matcher; incomplete old snapshots say so, including CSV.

Live extraction verified

CLI safe mode disables local customizations. An invented transcript passed actual extraction and clarification using the final application service.

Your main checkout is preserved. Fixes remain on fix/review-20260905 in ~/dev/compass-fix-all. Nothing was pushed or deployed to the application. Both deferred 2FA view bugs are fixed without copying the separate redesign.

Evidence behind the result

CheckExamples / failuresSeed
Claimed full suite reproduced2,481 / 010459
Final integrated full suite2,537 / 010459
Auth focused suite228 / 06921
Import focused suite327 / 017370
Matching and analytics focused suite919 / 040475
UI focused suite32 / 060231
Additional UI browser probes4 / 07133; 60232
Parent phone / retention captures2 / 046481

All 35 findings

35 of 35 shown

IDOriginal findingVerified behavior
01Back navigation erases account requirementsUI and accessibilityVerified

Edited naming, domicile and custom rows survive Back/Next and Turbo Back; changed currencies reconcile rows.

02Admin email edits update an unused account columnAuthenticationVerified

Credentials receive email changes through Devise reconfirmation; invalid account/credential updates roll back together.

03Deselected upload rows are still importedImportsStrengthened

Selection is honored. Empty replacement imports are refused even without the selection marker, before deletion.

04Turning off 2FA calls a missing mailerAuthenticationVerified

Reset mail renders and its token is consumed under a row lock; signed-out removal and rejected tokens are covered.

05Wildcard capability form options cannot be savedMatchingVerified

Blank account currency/IBAN country and entity country normalize to the supported wildcard before validation.

06Document boolean false becomes supported trueImportsStrengthened

Native false remains false; blank supported values retain the accepted true default across document and edited rows.

07Failed imports commit earlier writes and deletionsImportsStrengthened

Nested transaction rollback holds. A later row persistence failure now rolls back replacement deletion and earlier writes.

08Either forwards accepts providers offering neither forward typeMatchingVerified

Either forwards requires deliverable or NDF support in partner and prospect matching; neither does not qualify.

09Lookup details are mouse-onlyUI and accessibilityVerified

Provider disclosure uses a named native button with keyboard activation and synchronized expanded state.

10Rerun hides required forward fieldsUI and accessibilityVerified

Saved and rejected forward requirements immediately show populated controls; disabling forwards clears inactive fields.

11Request logs retain conversation content and authentication codesAuthenticationVerified

Real request-log sentinel checks cover derived transcript fields, OTP/reset secrets and nested recovery code; decisions are enum values.

12The six-digit 2FA challenge allows unlimited guessesAuthenticationStrengthened

Separate atomic OTP budget survives password login. Numeric OTP input consumes budget; format and HEAD variants share IP throttles.

13Country-group searches misclassify partners and ignore restrictionsMatchingStrengthened

Recorded-member jurisdiction semantics and per-member entity precedence hold; snapshots now preserve distinct effective entity rules.

14Account row controls have no namesUI and accessibilityVerified

Generated account controls have unique IDs and accessible names; add/remove and restore paths retain labels and focus.

15Failed document uploads return silently to the capability tabImportsVerified

Failed extraction stays visible with a safe error and recovery action, including queue-enqueue failure.

16Malformed account requirements fail open or crashMatchingVerified

Malformed JSON, null, scalar/object shapes and invalid nested account elements return validation errors without creating a lookup.

17Validate currency elements before producing lookup matchesMatchingStrengthened

Empty/unknown currencies are rejected. Legacy blank-currency show/CSV/PDF now lead to correction or API 422 without changing saved data.

18Missing client country raises a database errorMatchingVerified

Missing client country returns field validation and API 422 before insert; configured countries/groups remain accepted.

19Restricted currency pairs incorrectly receive direct prospect rankingMatchingVerified

Direct prospect evidence must contain an allowed requested sell/buy pair; contradictory allowed-sell restrictions cannot rank direct.

20Selecting no industry produces a false data-gap indicatorMatchingVerified

Empty industry input normalizes to not requested, matching omitted input in persistence and matching.

21Gap unlocks confuse one dimension with one requirementAnalyticsStrengthened

Independent account/entity/exclusion rules remain conjunctive; currency pairs are alternatives. Historical missing rule detail is explicit; CSV preserves meaning.

22Jurisdiction gaps name the sending country instead of clientAnalyticsStrengthened

Jurisdiction labels use client country or stored blocked members. All accepted groups, including EU and SEPA, have display labels.

23Analytics filters and lookup account rows overflow phone screensUI and accessibilityVerified

Wizard table scrolls within its container; analytics controls fit a 390px viewport, including the enlarged-text check.

24Analytics lookup links fail for colleagues and API searchesAnalyticsVerified

Any authenticated admin can read stored colleague/API snapshots; live evaluation and mutation controls remain absent and owner routes remain scoped.

25Autocomplete omits combobox semanticsUI and accessibilityVerified

Autocomplete exposes combobox/listbox/option state; arrows, Enter, Escape, Tab and no-match dismissal keep ARIA state consistent.

26Upload selection count becomes falseImportsVerified

Upload selection totals update from checked rows after select-all, select-none and individual toggles.

27Document failures never reach the configured retry policyImportsStrengthened

Transient failures reach Sidekiq retries. Attempt counters isolate manual retry from stale delivery/exhaustion, including legacy jobs and attachment touches.

28Duplicate requirements fail without explanationUI and accessibilityVerified

Duplicate requirements show a specific error, identify/focus the offending row and preserve values after server rejection.

29Polling can navigate after leaving pageUI and accessibilityVerified

Disconnect aborts polling; late responses cannot navigate after removal/reconnect. Requests stay serial and retry after transient HTTP failure.

30Accepted legacy XLS files are parsed as XLSXImportsVerified

Legacy .xls is rejected before persistence with instructions to use .xlsx or CSV.

31CLI extraction retains an extra transcript copyAuthenticationStrengthened

CLI disables session persistence and customizations. Live synthetic probes verified auth, no MCP/session files, and actual extraction/refinement.

32URL extraction downloads unlimited response bodiesImportsVerified

URL reads enforce body size, permitted content types and deadline; transient HTTP statuses are now retryable.

33Every rolodex page recomputes all recent gap matchingAnalyticsVerified

Evidence is loaded once per coverage calculation with recency work skipped; uncached query count stayed 16 as synthetic volume increased.

34Breadcrumb landmark name is misspelledUI and accessibilityVerified

Breadcrumbs render the correctly spelled aria-label on their navigation landmark.

35Sign-in document has no languageUI and accessibilityVerified

The sign-in document declares lang=en.

Phone checks, captured from the app

Trade details at 390 pixels with the account table contained in a horizontal scroll area
Edited requirements survive Back/Next. The table scrolls within its container; the page stays inside the phone viewport.
Analytics date controls stacked vertically with filter and CSV actions inside the phone viewport
Date controls, Filter and Export CSV fit at 390px. Enlarged-text and filtering behavior also passed.

Handoff corrections

  • The original write-up was untracked in the main checkout. It is now retained on the fix branch.
  • The original report never recommended Devise lockable. A separate OTP budget remains the correct implementation.
  • Decision fields are enum values. That earlier free-text claim was too broad.
  • Currency alternatives follow the existing amber-eligible matching rule. Independent requirements still require every fix.
  • Both migrations must run during the normal deployment process.

What remains separate

  • Historical CLI session cleanup; no prior history was deleted.
  • Removing the unused accounts.email column.
  • The twelve O1–O12 product and architecture opportunities.
  • Production deployment, production-load validation, external delivery/logging checks and real-document accuracy.

Old snapshots now disclose missing entity-rule detail; they are preserved without invented history.

Read the specialist evidence