The Assistenten settings hub used to open on Minne, with the
konteringskarta buried two clicks away (Kunskap tab, below a second
nested tab row). Now /settings/assistant opens on Kunskap and the
LedgerGraph hero is the first thing on screen.
- Kunskap is the default view and first tab; Minne moves to ?view=memory
(old ?view=knowledge links still resolve to the default)
- Drop the nested Kompetens/Minne/Regler & profil tab row inside the
Kunskap view: Kompetens and Minne duplicated the top-level tabs one
row above; Regler & profil now renders inline under the graph with a
section header (KnowledgeTabs.tsx deleted)
- Restore vertical rhythm (space-y-8) between the hero, detail section
and footer, lost when the view moved into the settings tabs
- Update redirects and memory deep links (/settings/agent-memory,
AgentChat memory chips, FactsCard manage link) to ?view=memory
- Match the loading skeleton to the new layout
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Relocates the ledger-knowledge surface off the top nav and into the
assistant settings hub as a third tab (Minne / Kompetens / Kunskap), per
the code's own "minne + kunskap under Assistenten" intent and the #935
flag that this was an easy call to change.
Because both settings surfaces (the full-page rail and the intercepting
settings modal) mount each section as a propless component via
SETTINGS_SECTIONS, the knowledge data must be fetched client-side rather
than passed as a server prop:
- New GET /api/agent/knowledge aggregates buildLedgerContext +
buildDeepEntities + buildAgentCompetence + company name (read-only,
company-scoped via withRouteContext).
- AgentKnowledgeView + AgentCompetenceSections converted from async
server components to client components (getTranslations ->
useTranslations; no other server-only usage).
- New AgentKnowledgePanel client wrapper lazy-fetches the payload when
the Kunskap tab opens (Radix unmounts inactive tabs), with Skeleton and
error states matching the memory/skills panels.
- Removed the Brain/agent-knowledge entry (and its now-unused import)
from the Analys nav group.
- /agent-knowledge kept as a redirect to /settings/assistant?view=knowledge
so old links/bookmarks resolve.
Tests: new route test (auth 401, no-company 400, happy-path aggregation).
i18n: load_error_* keys added to both locales (parity kept).
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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>
* feat(reports,settings): report library + focused report routes, settings modal
Reports
- Replace the monolithic /reports tab-switcher with a calm, grouped report
library landing (ReportLibrary + RecentReportsShelf) driven by a new
lib/reports/catalog.ts.
- Each report opens a focused /reports/[slug] route (FocusedReport) with a
shared fiscal-year selector, optional date-range, and URL-based account
drill-down into the general ledger.
- Extract every report view into components/reports/views, add a reusable
ReportExportMenu, and remove the old ReportsNav.
Settings
- Add an intercepting @settingsModal parallel route so in-app navigation to
/settings opens as a modal over the current page; hard loads still resolve
to the full page.
- Share one SettingsShell (rail + content) between page and modal, extract each
section into components/settings/sections/*Content, add a settings hotkey and
command-palette entry, and remove the old SettingsSidebar.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(reports,settings): remove dead salary-journal entry, fix border token
Addresses PR review feedback (#629):
- Remove the unreachable `salary-journal` report from the catalog. It had
needsEmployees + no route + no FocusedView handler and `hasEmployees` was
never plumbed through, so it never appeared in the library and a direct
/reports/salary-journal URL rendered a blank frame. The report was never on
the old page and has no view component; the API + generator stay in place for
a proper follow-up. Drops its two now-unused i18n keys.
- Replace opacity-suffixed `border-border/8` section dividers with full-opacity
`border-border` across the extracted settings section components, per the
design system (no opacity-suffixed border tokens on surfaces).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci: re-trigger checks (pg-real hit a Docker Hub registry timeout)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>