getStructuredError resolves an error with no `code` to UNKNOWN_ERROR, whose
registry text is the constant "Något gick fel. Försök igen." So an agent
branching on `code` saw "unknown" for a failure whose own message already
named the accounts and the two tools that fix it.
On production that was 40 of the create_voucher failures in 60 days.
Everything needed already existed: the ACCOUNTS_NOT_IN_CHART code, its
registry entry, its remediation pointing at the chart-of-accounts resource,
and a typed error class that storno-service already throws. This path just
never attached the code.
Attached with Object.assign rather than by throwing AccountsNotInChartError,
because that class builds its own generic English message from the account
list and would discard the richer Swedish one, which is the more useful half.
Pinned by a test asserting the same message WITHOUT the code still resolves to
UNKNOWN_ERROR, so this cannot silently regress.
Not fixed here: the MCP server has ~155 bare Swedish-prose throws against 3
uses of codedError(), so most domain failures remain undispatchable. This
fixes the one instance telemetry actually proved rather than converting 155
sites blind.
Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>