Daily review 2026-06-22 - #57
Draft
NghaReformer wants to merge 1 commit into
Draft
Conversation
Co-Authored-By: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Daily Review — 2026-06-22
Reviewer: automated
Branch:
daily-review/2026-06-221. 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,69All 7 playground entries use emoji strings as
iconvalues (📐 📊 📒 🏦 📉 🏧 📈). CLAUDE.md explicitly bans emoji icons. These render viaPlaygroundCard.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--accentthat 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–39src/lib/playgrounds/bank-reconciliation/components/MatchingPairsOverlay.svelte:31–34Both components define JS color maps (e.g.
'nsf-check': '#ef4444',fuzzy: '#f59e0b') that are passed directly to SVGstroke/fillattributes. These hex values cannot reference CSS custom properties, meaning a theme change intokens.tswon't reach these charts. Nine distinct hard-coded colors inCategoryBreakdownDonut, four inMatchingPairsOverlay.Suggested fix: Define a CATEGORY_COLORS export in
tokens.ts(or a separatesrc/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: #fffused instead ofvar(--text-primary)Severity: medium
Files:
src/lib/playgrounds/journal-entry/components/EntryHistory.svelte:400src/routes/[lang]/chart-of-accounts/+page.svelte:423,458src/routes/[lang]/learn/+page.svelte:202Four CSS declarations use
color: #fffas a literal white override. In a future theme,--text-primarymay be off-white; the hardcoded#fffwill 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-accenttoken totokens.ts.BUG-04 — Raw
rgba()color values in amortization table not from tokensSeverity: medium
File:
src/lib/playgrounds/amortization/components/ScheduleTable.svelte:215,219,241–242,247–248,260–261,266–267Row-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-weaktokens, then replace all rawrgba()literals withvar()references.BUG-05 — Dead
$derivedalias in WorkingsPanelSeverity: low
File:
src/lib/playgrounds/tvm/components/WorkingsPanel.svelte:16let 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'dSeverity: medium
Files:
src/routes/[lang]/+page.svelte:21src/routes/[lang]/privacy/+page.svelte:6Every 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.titleandprivacy.meta.titlekeys to both EN/FR namespaces.BUG-07 — Dynamic i18n key defeats
TranslationKeytype guardSeverity: low
File:
src/routes/[lang]/+page.svelte:47–48$t(`features.${feat.key}.title`)resolves asstringat the TypeScript level, bypassing the generatedTranslationKeyunion. 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 grepZero
og:title,og:description,og:image, ortwitter:cardtags exist. WhatsApp and LinkedIn sharing in the OHADA zone will show blank previews.Suggested fix: Add OG tags in
src/routes/[lang]/+layout.sveltewith 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