Em dashes (—) and en dashes (–) had spread across comments, docs, tests,
and a few UI strings, reading as AI-generated boilerplate rather than
house style. Replaced each with punctuation matching its context: colon
for explanatory clauses, comma for asides, plain hyphen for numeric/legal
ranges (e.g. "21-23§"), "to"/"till" for date ranges, parentheses for
paired-dash asides. messages/en.json and messages/sv.json were fixed by
hand together to keep sv/en in sync.
Left untouched where the dash is the functional subject rather than
decorative punctuation: date-range-parser.ts's separator regex,
charset-repair.ts's CP1252 byte-mapping table (and its test), the SIE
encoding mojibake docs, generic-csv.ts's minus-sign normalizer, the
agent system-prompt files that already instruct against em dashes, and
a golden iXBRL test fixture compared byte-for-byte.
Also fixes two bugs surfaced along the way: an off-by-one in
ApiKeysPanel's scope-label split (a leftover from an earlier partial
pass), and a charset-repair test that had lost the literal en-dash it
exists to verify.
Regenerated the agent atom seed migration (skills:generate) since 27
SKILL.md files changed. Added a CLAUDE.md rule against em/en dashes,
with an explicit carve-out for the functional-dash cases above.
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* chore(scripts): add prod repair scripts for Arcim and Capelix incidents
Two idempotent, dry-run-by-default repair scripts, committed for the audit
trail (matching the existing scripts/repair-*.ts convention). Neither runs
automatically — applying requires an explicit --execute/--commit flag.
- repair-arcim-supplier-payments.ts: Arcim Technology AB (2026-06-11). Two
supplier invoices left in inconsistent half-states (swallowed
AccountsNotInChartError on 3740; bank-sync auto-link without a booked
payment) plus expense booked on 5010 instead of 5420/6580. Runs through the
real engine (createJournalEntry/correctEntry) so voucher numbering and
balance triggers behave as in-app; every step checks its precondition.
- repair-capelix-invoice-payment.ts: Capelix AB invoice-001 double-booking
(2026-05-29), root-caused to the invoiceAlreadyBooked dead-column read fixed
in PR #713. Storno-only per BFL/BFNAR 2013:2: reverse the wrong cash entry,
post the correct 1930/1510 clearing entry, relink the bank tx + payment row.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(scripts): scope Capelix invoice_payments relink to company_id
Address review (PR Agent + compliance swarm): the Step 3b invoice_payments
update filtered on journal_entry_id only; add .eq('company_id', COMPANY_ID) to
match the sibling transactions update directly above it (tenant isolation /
defense-in-depth). invoice_payments carries company_id (multi-tenant refactor).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>