Three changes from the first real E2E run (Arcim, 2026-08-26):
1. gnubok_sie_preflight: read-only scan of a SIE file shared in chat
BEFORE anything is staged: parse, validate (per-verifikat balance, IB,
closed-year P&L residual), CP1252-mojibake tripwire, duplicate
file/period check, org-number match against the company (the
wrong-company import is the worst silent failure this flow can have),
and suggested account mappings shaped for direct passthrough to
gnubok_import_sie. Both tools now also accept file_content_base64,
decoded with the same encoding detection as the HTTP upload route so
CP437 exports keep their åäö.
2. Onboarding skill v2: opens with TWO questions (orgnr + 'vilket system
hade du innan?'), imports history before the bank (PSD2 rarely reaches
far enough back), and a momentum rule: the create preview is the ONLY
stop; connect tools are called without asking, and categorization
starts as soon as the bank is active. connect_bank instructions now
describe the account-selection dialog that actually gates the first
sync, and the bank history cap.
3. deriveFirstYearDefaults: no closed fiscal period in the registry now
extends the first-year window from 12 to 18 months (BFL 3 kap 3 §):
a 13-month-old company with no annual report is still in its first,
extended räkenskapsår (the Arcim case the 12-month rule missed).
Applied in the web journey and the lookup tool.
tools/list ceiling 61.5K to 62K, documented in the bench.
Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
First of four PRs replacing the onboarding wizard with the journey flow
(dev_docs/onboarding_migration_plan.md, local). No UI change.
- Move deriveFirstYearDefaults + parseStartMonthDay out of
WelcomeOnboarding into lib/company/first-year-defaults.ts and unit-test
them (11-vs-13-months boundary, UTC month seeding, malformed input).
- Add the missing computeFiscalPeriod unit tests (calendar year, brutet
ar, first year short/extended, EF calendar-year rule, period names,
BFL 3 kap. 6-18 month window errors).
- New shared fetchCompanyLookup() client: the single client path to the
Lens-backed /lookup, typed outcomes (found / not_found / disabled /
error / aborted), never throws. Fixes the 403/404 conflation: the
dispatcher's 404 ("Extension not found") and feature-flag 503
(EXTENSION_DISABLED) now degrade silently instead of rendering as
"company not found"; only the TIC handler's own 404 does.
- Step2CompanyDetails consumes the helper; identical UX otherwise.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>