Skip to content

Daily review 2026-06-22 - #57

Draft
NghaReformer wants to merge 1 commit into
mainfrom
daily-review/2026-06-22
Draft

Daily review 2026-06-22#57
NghaReformer wants to merge 1 commit into
mainfrom
daily-review/2026-06-22

Conversation

@NghaReformer

Copy link
Copy Markdown
Owner

Daily Review — 2026-06-22

Reviewer: automated
Branch: daily-review/2026-06-22


1. Bugs & Issues

BUG-01 — Emoji icons violate CLAUDE.md "No emoji icons" rule

Severity: high
File: src/lib/data/playgrounds.ts:18,27,36,44,53,61,69

All 7 playground entries use emoji strings as icon values (📐 📊 📒 🏦 📉 🏧 📈). CLAUDE.md explicitly bans emoji icons. These render via PlaygroundCard.svelte:13 ({pg.icon}) and will be sent over the wire as emoji codepoints, which vary visually across platforms and can't be styled via CSS.

Suggested fix: Replace each emoji with a compact SVG symbol (inline or via sprite), using aria-hidden="true" and sizing via CSS. Tokens already define --radius-* and --accent that chart icons can use.


BUG-02 — Hardcoded hex palette in chart components bypasses theme

Severity: high
Files:

  • src/lib/playgrounds/bank-reconciliation/components/CategoryBreakdownDonut.svelte:31–39
  • src/lib/playgrounds/bank-reconciliation/components/MatchingPairsOverlay.svelte:31–34

Both components define JS color maps (e.g. 'nsf-check': '#ef4444', fuzzy: '#f59e0b') that are passed directly to SVG stroke/fill attributes. These hex values cannot reference CSS custom properties, meaning a theme change in tokens.ts won't reach these charts. Nine distinct hard-coded colors in CategoryBreakdownDonut, four in MatchingPairsOverlay.

Suggested fix: Define a CATEGORY_COLORS export in tokens.ts (or a separate src/lib/theme/chart-palette.ts) and import from there. Where SVG attributes must be hex, compute the palette from tokens once at the module level so a single file controls all chart colors.


BUG-03 — color: #fff used instead of var(--text-primary)

Severity: medium
Files:

  • src/lib/playgrounds/journal-entry/components/EntryHistory.svelte:400
  • src/routes/[lang]/chart-of-accounts/+page.svelte:423,458
  • src/routes/[lang]/learn/+page.svelte:202

Four CSS declarations use color: #fff as a literal white override. In a future theme, --text-primary may be off-white; the hardcoded #fff will diverge.

Suggested fix: Use color: var(--text-primary) where contrast allows it. If pure white is required against a saturated background, add a --text-on-accent token to tokens.ts.


BUG-04 — Raw rgba() color values in amortization table not from tokens

Severity: medium
File: src/lib/playgrounds/amortization/components/ScheduleTable.svelte:215,219,241–242,247–248,260–261,266–267

Row-state backgrounds and badge borders use literal rgba(245, 158, 11, 0.04), rgba(34, 197, 94, 0.08), rgba(59, 130, 246, 0.2), etc. The base colors exist in tokens (--amber, --green) but the alpha variants are not tokenized, creating silent coupling.

Suggested fix: Add --amber-glow-weak, --green-glow-weak tokens, then replace all raw rgba() literals with var() references.


BUG-05 — Dead $derived alias in WorkingsPanel

Severity: low
File: src/lib/playgrounds/tvm/components/WorkingsPanel.svelte:16

let translate = $derived($t) is declared but never called — the template uses $t(...) directly throughout. Creates a reactive dependency tracking store updates with no useful work.

Suggested fix: Delete line 16.


BUG-06 — Landing page <title> and privacy <title> not i18n'd

Severity: medium
Files:

  • src/routes/[lang]/+page.svelte:21
  • src/routes/[lang]/privacy/+page.svelte:6

Every other route uses $t() for <title> but home and privacy use hardcoded English strings. French visitors see English text in browser tabs and search snippets.

Suggested fix: Add hero.meta.title and privacy.meta.title keys to both EN/FR namespaces.


BUG-07 — Dynamic i18n key defeats TranslationKey type guard

Severity: low
File: src/routes/[lang]/+page.svelte:47–48

$t(`features.${feat.key}.title`) resolves as string at the TypeScript level, bypassing the generated TranslationKey union. Runtime-safe now, but a future namespace rename won't produce a compile error here.

Suggested fix: Use explicit key literals: { titleKey: 'features.interactive.title' as TranslationKey, ... }.


BUG-08 — No Open Graph / social meta tags on any route

Severity: low
Files: All <svelte:head> blocks — confirmed absent via grep

Zero og:title, og:description, og:image, or twitter:card tags exist. WhatsApp and LinkedIn sharing in the OHADA zone will show blank previews.

Suggested fix: Add OG tags in src/routes/[lang]/+layout.svelte with locale-aware $t() strings, overriding per-page where needed.


2. New Playground Ideas

Existing playgrounds checked: TVM, CVP, Journal Entry, Amortization, Depreciation, Bank Reconciliation, Interest. No duplicates below.


PG-01 — Inventory Valuation Methods

EN: Inventory Valuation Methods | FR: Méthodes d'évaluation des stocks
Target learner: Licence 2, Licence 3
Pedagogical objective: Fix conflation of FIFO, LIFO, and CMUP; reinforce SYSCOHADA's preference for CMUP.
Core interaction: Input opening stock + chronological purchase/sale lines. Three side-by-side ledger columns (FIFO, CMUP perpetual, CMUP periodic) update live with COGS and closing stock KPIs.
Inputs: opening stock, up to 10 lines (date, qty, unit price) | Outputs: movement schedule per method, COGS, gross margin delta
Complements: Depreciation handles fixed asset cost; this covers current asset cost flow.


PG-02 — Receivables Aging & Doubtful Debt Provision

EN: Receivables Aging & Provision | FR: Analyse des créances et provision pour dépréciation
Target learner: Licence 3, practicing professional
Pedagogical objective: Distinguish write-off from provision; reinforce that SYSCOHADA provisions hit Résultat, not equity.
Core interaction: Input receivables ledger → auto-bucketed aging grid (current / 30–60d / 60–90d / 90–180d / >180d) → assign provision rates → compute adjustment vs prior-year → generate adjusting journal entry.
Inputs: up to 20 receivable lines, provision rate per bracket | Outputs: aging schedule, provision, NRV, journal entry
Complements: Bank Reconciliation covers cash timing; this covers credit-risk asset valuation.


PG-03 — Payroll & Employer Social Charges

EN: Payroll & Social Charges | FR: Paie et charges sociales patronales
Target learner: Licence 3, Master, practicing professional
Pedagogical objective: Show full gross-to-net chain including CNSS and IRPP, which differ by OHADA country.
Core interaction: Select country → input salary + allowances + family situation → playground derives CNSS (employee + employer), IRPP brackets, net pay, total employer cost → formatted payslip + Account 66 journal entries.
Inputs: country, gross salary, transport allowance, dependants | Outputs: CNSS base, IRPP, net pay, employer cost, journal entries
Complements: Journal Entry handles generic entries; this auto-generates the payroll entry set.


PG-04 — Financial Ratio Dashboard

EN: Financial Ratio Dashboard | FR: Tableau de bord des ratios financiers
Target learner: Licence 3, Master
Pedagogical objective: Break the misconception that high net profit equals solvency or liquidity.
Core interaction: Input simplified SYSCOHADA balance sheet + income statement → live ratio suite (autonomie financière, liquidité générale/réduite/immédiate, ROA/ROE, BFR, trésorerie nette) with color-coded gauges vs sector benchmarks.
Inputs: ~12 balance sheet items, 5 income statement items | Outputs: 12+ ratios with gauges, i18n-text diagnosis
Complements: CVP measures internal profitability levers; this synthesizes external financial health.


PG-05 — VAT / TVA Reconciliation

EN: VAT Reconciliation | FR: Réconciliation TVA (déclaration de TVA)
Target learner: Licence 3, Master, practicing professional
Pedagogical objective: Build the TVA collectée − TVA déductible = TVA à payer/crédit mental model; fix the most common SME compliance error in the OHADA zone.
Core interaction: Select country (auto-sets rate: 19.25% Cameroon, 18% Côte d'Ivoire/Sénégal…) → input monthly transactions → live TVA account (4431/4432) → net position → declaration summary → settlement journal entry.
Inputs: country, up to 15 transaction lines (type, HT amount) | Outputs: TVA collected/deductible, net position, credit c/f, journal entry
Complements: Journal Entry handles mechanics; this adds the fiscal/declaratory layer.


Generated by Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ohadalearn Ready Ready Preview, Comment Jun 22, 2026 11:10pm

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.

2 participants