KeyFoldAccount identity atlas
Field notes

A pinned model, with a real reproduction.

The browser map is a local projection model. Published Better Auth packages were used separately to verify the behavior that the model explains.

Checked October 15, 2026 · Better Auth 1.7.2 → 1.7.3

The two source contracts.

The before view follows the account lookup key in Better Auth 1.7.2: issuer plus accountId. The target view follows 1.7.3: providerId plus accountId. We pin these contracts so an upstream change cannot silently change the meaning of a saved review. Newer versions, plugins and adapters need their own current documentation check.

What actually ran.

Using published npm packages 1.7.2 and 1.7.3 with Node's in-memory SQLite database, we reproduced old signup, schema rejection before cleanup, old-account continuity after cleanup, a new signup and direct upgrade from a pre-1.7 core schema. Native adapter calls separately reproduced different-user collisions, same-user duplicates and distinct provider keys. No real email or external identity provider was involved.

The exact-string projection was also compared with SQLite binary matching across 200 generated datasets. The website's target-group model and alias grouping were compared against the research implementation across another 300 datasets. Randomized checks cover synthetic relationships; they do not estimate production failure rates.

How groups are constructed.

Keys are encoded as JSON tuples, not concatenated with an ambiguous separator. Every accepted row belongs to one target key. A target group containing more than one row is a duplicate, regardless of how many distinct user labels it contains. The pinned native 1.7.3 lookup rejects that ambiguity. The old view shows repeated old keys as an observation; the old native findOne behavior is not described as the same rejection.

Absent or null issuer values create distinct unknown placeholders in the old view. They are not pooled into a fabricated issuer. Source positions are preserved when the view filters to duplicate groups. The graphic is deliberately capped for readability; totals and JSON exports still cover all accepted rows.

Where the model stops.

Exact JavaScript string comparison is not a universal database collation. Case-insensitive comparisons, custom Unicode equivalence and adapter transport can behave differently. We reject NUL and unpaired surrogates after observing a NUL transport issue in SQLite testing; this is an import-profile restriction, not an upstream schema rule.

The map does not validate JWT signatures, issuer claims, provider configuration, SSO mappings, sessions, password hashes or ownership. Removing a stored issuer field does not imply that token issuer validation should be disabled. A duplicate group identifies records to investigate; it never recommends merging users.

Scope survives the export.

A review includes the completeness declaration, exact-string assumption and schema declarations. It never returns global migration clearance. Default aliases preserve per-field key and owner groups, not every relationship between fields. JSON includes all accepted rows; the Markdown summary explicitly caps its duplicate-group detail at 100.

Current context: maintainer explanation, official upgrade guide. Checked October 15, 2026.

Prepare a projection within these limits ↗