Import atomicity
Replacement imports can no longer delete existing data and then silently skip failed replacement rows. Empty and premature confirmation are also refused.
All 35 findings now have verified fixes. Additional import, authentication and analytics gaps were reproduced and corrected on the local fix branch.
Replacement imports can no longer delete existing data and then silently skip failed replacement rows. Empty and premature confirmation are also refused.
A dedicated extraction_attempt counter separates retries. Old job results and exhaustion callbacks cannot overwrite a newer attempt; attachment analysis cannot invalidate it.
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.
Old blank-currency lookups now open a correction flow for admins or return API 422 across show, CSV and PDF, preserving saved data.
Entity rule identities and directional exclusions survive serialization. AND/OR explanations match the actual matcher; incomplete old snapshots say so, including CSV.
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.
| Check | Examples / failures | Seed |
|---|---|---|
| Claimed full suite reproduced | 2,481 / 0 | 10459 |
| Final integrated full suite | 2,537 / 0 | 10459 |
| Auth focused suite | 228 / 0 | 6921 |
| Import focused suite | 327 / 0 | 17370 |
| Matching and analytics focused suite | 919 / 0 | 40475 |
| UI focused suite | 32 / 0 | 60231 |
| Additional UI browser probes | 4 / 0 | 7133; 60232 |
| Parent phone / retention captures | 2 / 0 | 46481 |
35 of 35 shown
| ID | Original finding | Verified behavior |
|---|---|---|
| 01 | Back navigation erases account requirementsUI and accessibility | Verified Edited naming, domicile and custom rows survive Back/Next and Turbo Back; changed currencies reconcile rows. |
| 02 | Admin email edits update an unused account columnAuthentication | Verified Credentials receive email changes through Devise reconfirmation; invalid account/credential updates roll back together. |
| 03 | Deselected upload rows are still importedImports | Strengthened Selection is honored. Empty replacement imports are refused even without the selection marker, before deletion. |
| 04 | Turning off 2FA calls a missing mailerAuthentication | Verified Reset mail renders and its token is consumed under a row lock; signed-out removal and rejected tokens are covered. |
| 05 | Wildcard capability form options cannot be savedMatching | Verified Blank account currency/IBAN country and entity country normalize to the supported wildcard before validation. |
| 06 | Document boolean false becomes supported trueImports | Strengthened Native false remains false; blank supported values retain the accepted true default across document and edited rows. |
| 07 | Failed imports commit earlier writes and deletionsImports | Strengthened Nested transaction rollback holds. A later row persistence failure now rolls back replacement deletion and earlier writes. |
| 08 | Either forwards accepts providers offering neither forward typeMatching | Verified Either forwards requires deliverable or NDF support in partner and prospect matching; neither does not qualify. |
| 09 | Lookup details are mouse-onlyUI and accessibility | Verified Provider disclosure uses a named native button with keyboard activation and synchronized expanded state. |
| 10 | Rerun hides required forward fieldsUI and accessibility | Verified Saved and rejected forward requirements immediately show populated controls; disabling forwards clears inactive fields. |
| 11 | Request logs retain conversation content and authentication codesAuthentication | Verified Real request-log sentinel checks cover derived transcript fields, OTP/reset secrets and nested recovery code; decisions are enum values. |
| 12 | The six-digit 2FA challenge allows unlimited guessesAuthentication | Strengthened Separate atomic OTP budget survives password login. Numeric OTP input consumes budget; format and HEAD variants share IP throttles. |
| 13 | Country-group searches misclassify partners and ignore restrictionsMatching | Strengthened Recorded-member jurisdiction semantics and per-member entity precedence hold; snapshots now preserve distinct effective entity rules. |
| 14 | Account row controls have no namesUI and accessibility | Verified Generated account controls have unique IDs and accessible names; add/remove and restore paths retain labels and focus. |
| 15 | Failed document uploads return silently to the capability tabImports | Verified Failed extraction stays visible with a safe error and recovery action, including queue-enqueue failure. |
| 16 | Malformed account requirements fail open or crashMatching | Verified Malformed JSON, null, scalar/object shapes and invalid nested account elements return validation errors without creating a lookup. |
| 17 | Validate currency elements before producing lookup matchesMatching | Strengthened Empty/unknown currencies are rejected. Legacy blank-currency show/CSV/PDF now lead to correction or API 422 without changing saved data. |
| 18 | Missing client country raises a database errorMatching | Verified Missing client country returns field validation and API 422 before insert; configured countries/groups remain accepted. |
| 19 | Restricted currency pairs incorrectly receive direct prospect rankingMatching | Verified Direct prospect evidence must contain an allowed requested sell/buy pair; contradictory allowed-sell restrictions cannot rank direct. |
| 20 | Selecting no industry produces a false data-gap indicatorMatching | Verified Empty industry input normalizes to not requested, matching omitted input in persistence and matching. |
| 21 | Gap unlocks confuse one dimension with one requirementAnalytics | Strengthened Independent account/entity/exclusion rules remain conjunctive; currency pairs are alternatives. Historical missing rule detail is explicit; CSV preserves meaning. |
| 22 | Jurisdiction gaps name the sending country instead of clientAnalytics | Strengthened Jurisdiction labels use client country or stored blocked members. All accepted groups, including EU and SEPA, have display labels. |
| 23 | Analytics filters and lookup account rows overflow phone screensUI and accessibility | Verified Wizard table scrolls within its container; analytics controls fit a 390px viewport, including the enlarged-text check. |
| 24 | Analytics lookup links fail for colleagues and API searchesAnalytics | Verified Any authenticated admin can read stored colleague/API snapshots; live evaluation and mutation controls remain absent and owner routes remain scoped. |
| 25 | Autocomplete omits combobox semanticsUI and accessibility | Verified Autocomplete exposes combobox/listbox/option state; arrows, Enter, Escape, Tab and no-match dismissal keep ARIA state consistent. |
| 26 | Upload selection count becomes falseImports | Verified Upload selection totals update from checked rows after select-all, select-none and individual toggles. |
| 27 | Document failures never reach the configured retry policyImports | Strengthened Transient failures reach Sidekiq retries. Attempt counters isolate manual retry from stale delivery/exhaustion, including legacy jobs and attachment touches. |
| 28 | Duplicate requirements fail without explanationUI and accessibility | Verified Duplicate requirements show a specific error, identify/focus the offending row and preserve values after server rejection. |
| 29 | Polling can navigate after leaving pageUI and accessibility | Verified Disconnect aborts polling; late responses cannot navigate after removal/reconnect. Requests stay serial and retry after transient HTTP failure. |
| 30 | Accepted legacy XLS files are parsed as XLSXImports | Verified Legacy .xls is rejected before persistence with instructions to use .xlsx or CSV. |
| 31 | CLI extraction retains an extra transcript copyAuthentication | Strengthened CLI disables session persistence and customizations. Live synthetic probes verified auth, no MCP/session files, and actual extraction/refinement. |
| 32 | URL extraction downloads unlimited response bodiesImports | Verified URL reads enforce body size, permitted content types and deadline; transient HTTP statuses are now retryable. |
| 33 | Every rolodex page recomputes all recent gap matchingAnalytics | Verified Evidence is loaded once per coverage calculation with recency work skipped; uncached query count stayed 16 as synthetic volume increased. |
| 34 | Breadcrumb landmark name is misspelledUI and accessibility | Verified Breadcrumbs render the correctly spelled aria-label on their navigation landmark. |
| 35 | Sign-in document has no languageUI and accessibility | Verified The sign-in document declares lang=en. |
No findings match this search.
accounts.email column.Old snapshots now disclose missing entity-rule detail; they are preserved without invented history.