Skip to content

fix(cat): the dashboard spoke German to anyone paid in francs - #849

Merged
catomean merged 1 commit into
mainfrom
fix-nudge-language
Aug 29, 2026
Merged

fix(cat): the dashboard spoke German to anyone paid in francs#849
catomean merged 1 commit into
mainfrom
fix-nudge-language

Conversation

@catomean

Copy link
Copy Markdown
Collaborator

fix(cat): the dashboard spoke German to anyone paid in francs

Nudge language was inferred from currency: no profile.language plus a CHF
preference meant German. CHF is this platform's DEFAULT fiat, so that describes
every account that never chose anything — including the founder's, whose row is
language: null, currency: "CHF". He opened an English interface to a column of
German nudge cards: "Lass „bitcoin" für dich arbeiten", "Biete „Handgemachte
Keramiktasse" als Produkt an".

A default is not a preference. And even a deliberate CHF would not imply
German — Switzerland has four national languages.

This is the same category error @/utils/locale was written to end one layer
down, in #837. There it was "the language of the interface is not the language
of your operating system". Here it is "…is not the currency you get paid in".

profile.language is now the only input. Worth stating plainly, because it
changes what this code means: no surface in this app writes
profile.language
— the sole write is a mapper default of 'en' — and the
interface ships <html lang="en"> with no translations. So 'de' was reachable
ONLY through the currency guess, which means the entire German nudge path
existed because of a heuristic nobody opted into. NUDGE_COPY.de stays, waiting
for real i18n rather than being selected by inference; German cards inside an
English interface are the mixed-language dashboard this file's own header calls
a trust bug, just at a larger grain.

The header docblock advertised the heuristic it no longer has, so it is updated
too — a removed rule that leaves its description behind is how the next reader
gets misled.

Tests pin all three directions (currency ignored, default English, explicit
choice honoured) and are proven by mutation: reinstate the CHF branch and "does
not read a language out of the currency" goes red.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01Sh5aTRjzkcZkTyiu9D5RCM

Nudge language was inferred from currency: no `profile.language` plus a CHF
preference meant German. CHF is this platform's DEFAULT fiat, so that describes
every account that never chose anything — including the founder's, whose row is
`language: null, currency: "CHF"`. He opened an English interface to a column of
German nudge cards: "Lass „bitcoin" für dich arbeiten", "Biete „Handgemachte
Keramiktasse" als Produkt an".

A default is not a preference. And even a deliberate CHF would not imply
German — Switzerland has four national languages.

This is the same category error `@/utils/locale` was written to end one layer
down, in #837. There it was "the language of the interface is not the language
of your operating system". Here it is "…is not the currency you get paid in".

`profile.language` is now the only input. Worth stating plainly, because it
changes what this code means: **no surface in this app writes
`profile.language`** — the sole write is a mapper default of 'en' — and the
interface ships `<html lang="en">` with no translations. So 'de' was reachable
ONLY through the currency guess, which means the entire German nudge path
existed because of a heuristic nobody opted into. NUDGE_COPY.de stays, waiting
for real i18n rather than being selected by inference; German cards inside an
English interface are the mixed-language dashboard this file's own header calls
a trust bug, just at a larger grain.

The header docblock advertised the heuristic it no longer has, so it is updated
too — a removed rule that leaves its description behind is how the next reader
gets misled.

Tests pin all three directions (currency ignored, default English, explicit
choice honoured) and are proven by mutation: reinstate the CHF branch and "does
not read a language out of the currency" goes red.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Sh5aTRjzkcZkTyiu9D5RCM
@catomean
catomean merged commit a16f95f into main Aug 29, 2026
6 checks passed
@catomean
catomean deleted the fix-nudge-language branch August 29, 2026 11:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant