Daily review 2026-06-27 - #62
Draft
NghaReformer wants to merge 1 commit into
Draft
Conversation
|
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.
OhadaLearn Daily Review — 2026-06-27
Automated review of
mainsnapshot. Codebase: SvelteKit 2.57 / Svelte 5.55 / TypeScript 6.0.1. Bugs & Issues
MEDIUM-1 — Undefined CSS variables used across 10+ files (effective hardcoded colors)
Severity: High
Files:
src/lib/components/playground/KpiStrip.svelte:76,src/lib/playgrounds/amortization/components/ScheduleTable.svelte:240,246,259,src/lib/playgrounds/amortization/components/InputsPanel.svelte:604–605,src/lib/playgrounds/amortization/components/ChartPanel.svelte:436,444,448,493,501,505,515,529,533,src/lib/playgrounds/bank-reconciliation/components/LedgerPanel.svelte:175,src/lib/playgrounds/bank-reconciliation/components/VarianceScale.svelte:230,260–261,331,335,370,416,src/lib/playgrounds/bank-reconciliation/components/TransactionJournal.svelte:382–383,src/lib/playgrounds/bank-reconciliation/components/BankStatementPanel.svelte:175,src/lib/playgrounds/bank-reconciliation/components/ScenarioWalkthrough.svelte:234,274,src/lib/playgrounds/bank-reconciliation/components/ReconciliationFlow.svelte:278Explanation:
--orange,--blue, and--redare used as CSS custom properties throughout these components (e.g.,var(--orange, #f59e0b)) but are never defined insrc/lib/theme/tokens.tsorsrc/lib/theme/css-generator.ts. The fallback hex values therefore activate on every render, making these effectively hardcoded colors that bypass the theme system entirely. A future palette change (e.g., dark mode variant) will silently skip all these surfaces.Fix: Add
orange,blue, andred(or semantically named equivalents —chartOrange,chartBlue,chartRed) to theThemeTokensinterface intokens.ts, assign values indefaultTheme, and emit the corresponding--orange / --blue / --redvars incss-generator.ts. Replace allvar(--red, ...)usages with the appropriate semantic token —--redand--errorcurrently coexist with inconsistent fallbacks (#ef4444vs#f06070), so consolidate error-state references tovar(--error).HIGH-2 — Bare hex strings in TypeScript color maps bypass theme entirely
Severity: High
Files:
src/lib/playgrounds/bank-reconciliation/components/CategoryBreakdownDonut.svelte:31–39,src/lib/playgrounds/bank-reconciliation/components/MatchingPairsOverlay.svelte:31–34Explanation: Both files define TypeScript
Record<..., string>objects mapping category/match types to hex strings (e.g.,'outstanding-check': '#6ea8fe',fuzzy: '#f59e0b'). Unlike thevar()pattern above, these values are used directly in SVG stroke/fill attributes — completely outside the CSS cascade and unable to be overridden by theme tokens. The colours also partially overlap with existing tokens (#6ea8fe≈ accent,#f59e0b≈ amber) but are not the exact same values, creating visual inconsistency.Fix: Replace each hex with the corresponding CSS token value read from a computed style lookup (e.g.,
getComputedStyle(document.documentElement).getPropertyValue('--accent').trim()) or expose the color maps as CSS custom properties and reference them viavar()in the SVG attributes.MEDIUM-3 — Shared ExercisePanel hardcodes French difficulty labels instead of using i18n
Severity: Medium
File:
src/lib/components/playground/ExercisePanel.svelte:11–13Explanation:
Each individual playground already defines bilingual i18n keys for these labels (e.g.,
am.exercise.difficulty.fondamental→'Foundational'/'Fondamental'). The shared component ignores all of them. An English-locale visitor sees raw French.Fix: Either accept a
difficultyLabels: Record<ExerciseDifficulty, string>prop and have each playground pass its own translated values, or standardize on a shared namespace key (e.g.,shell.difficulty.fondamental) and call$t()inside ExercisePanel.MEDIUM-4 — SSR renders
<html lang="en">for all localesSeverity: Medium
File:
src/app.html:2Explanation: The static HTML shell hardcodes
<html lang="en">. The root layout fixes this client-side via$effect, but during SSR French pages (/fr/...) arrive withlang="en". Screen readers and search engine crawlers may apply incorrect linguistic processing to French content.Fix: In
src/hooks.server.ts, add ahandletransformer:MEDIUM-5 — Inline style on SvelteKit body wrapper violates project conventions
Severity: Medium
File:
src/app.html:19Explanation:
<div style="display: contents">%sveltekit.body%</div>uses an inlinestyleattribute, which CLAUDE.md explicitly bans. This is a SvelteKit scaffolding default that was never removed.Fix: Since
.app-shellin+layout.sveltealready owns the flex layout, thedisplay:contentswrapper is redundant. Remove thestyleattribute entirely, or move the rule toapp.csswith a class.LOW-6 — Hardcoded
theme-colormeta duplicates the accent tokenSeverity: Low
File:
src/app.html:9<meta name="theme-color" content="#7c7fff">hard-copiestokens.ts:53(accent: '#7c7fff'). A designer updating the accent token will not know to updateapp.html. Add cross-reference comments in both files; long-term, generate it at build time via a Vite plugin.LOW-7 — Hardcoded "items" string in SVG centre label
Severity: Low
File:
src/lib/playgrounds/bank-reconciliation/components/CategoryBreakdownDonut.svelte:105<text>items</text>is an untranslated English literal inside SVG. Fix: call$t('br.donut.items')after adding the key to both locale files (FR:'éléments').LOW-8 — Accounting standard labels not translated in PlaygroundSettings
Severity: Low
File:
src/lib/components/playground/PlaygroundSettings.svelte:9–12label: 'French PCG'is English-only; French users should see'PCG français'. Fix: addshell.standard.*i18n keys and use$t()for all four options.Passing checks
export let,$:,on:click,<slot>, or$app/storesviolations across 194 source files.role,aria-label,aria-expanded,aria-selected,aria-checkedusage throughout Nav, PlaygroundTabs, LanguageToggle, WaitlistForm, FeedbackLauncher, and SVG charts.src/lib/server/; no leakage detected.TranslationKeyunion; no gaps outside issues 3/7/8 above.try/catchwith appropriate HTTP status codes.2. New Playground Ideas
Existing playgrounds excluded: Loan Amortization, CVP/Breakeven, Bank Reconciliation, Journal Entry, Compound/Simple Interest, TVM. Static HTML legacy: Depreciation, CVP, Amortization, Journal Entry.
IDEA-1 — Depreciation Methods (Native Svelte Module)
Title: Depreciation Methods / Méthodes d'Amortissement Comptable
Target: Licence 2
Pedagogical objective: Students conflate loan amortization with asset depreciation, and misapply prorata temporis in year 1. A static HTML version exists but has no exercises or learn-mode content.
Core interaction: Input asset cost, useful life, residual value, acquisition date; select SYSCOHADA method (linéaire / dégressif / unités de production); see live schedule + year-end journal entries. Toggle between methods to compare.
MVP I/O: Cost, life, date, residual, method → full depreciation schedule, journal entry per year, net book value chart.
Complement: Amortization playground covers loan schedules; this covers asset depreciation — distinct concepts students routinely conflate.
IDEA-2 — Working Capital Analysis (FRNG / BFRE / TN)
Title: Working Capital Dashboard / Analyse du Fonds de Roulement
Target: Licence 3
Pedagogical objective: Students memorize TN = FRNG − BFRE without understanding that positive FRNG does not guarantee solvency. No existing playground covers SYSCOHADA working capital structure.
Core interaction: Populate a simplified SYSCOHADA balance sheet; three KPI cards (FRNG, BFRE, TN) update live with colour-coded status. Scenario mode stress-tests by adjusting supplier credit days or stock turnover.
MVP I/O: 8–10 balance sheet line items → FRNG / BFRE / TN cards, waterfall decomposition chart, localized one-sentence interpretation.
Complement: Bank Reconciliation teaches cash-book accuracy; this teaches structural cash position — a higher-level analytical skill.
IDEA-3 — SYSCOHADA Balance Sheet Builder
Title: Balance Sheet Constructor / Constructeur de Bilan SYSCOHADA
Target: Licence 2–3
Pedagogical objective: Students can post entries but cannot map accounts to the Bilan (classes 1–5) and Compte de Résultat (classes 6–7). This gap surfaces before internship.
Core interaction: Given a randomized trial balance (15–20 accounts from
src/lib/shared/chart-of-accounts/), drag-and-drop into the correct Bilan/CdR cell. On submit, highlights misclassified items and shows reconciled totals.MVP I/O: Seeded trial balance → two-column Bilan + CdR, totals, balance check, animated net-income reconciliation.
Complement: Journal Entry teaches how to record; this teaches where records land in financial statements — closing the accounting cycle loop.
IDEA-4 — Payroll & Social Contributions Calculator (OHADA Zone)
Title: Payroll & Social Charges / Bulletin de Paie et Charges Sociales
Target: Licence 3, practicing professionals
Pedagogical objective: OHADA-zone payroll is jurisdiction-specific (CNPS rates, IRPP brackets, family quotient differ by country). Junior accountants routinely under-provision for the part patronale, causing payroll charge errors.
Core interaction: Select country (Cameroon, Côte d'Ivoire, Sénégal), enter gross salary + dependent count. Output splits into take-home pay, salarié deductions, and patronale charges, with a live SYSCOHADA journal entry (Charges de Personnel / Rémunérations dues / Organismes sociaux).
MVP I/O: Gross salary (FCFA), country, dependents → net pay, deduction waterfall, employer cost total, journal entry.
Complement: No existing playground covers labor cost accounting — a daily task for every OHADA-zone accountant.
IDEA-5 — Financial Ratio Dashboard (Diagnostic Financier)
Title: Financial Ratio Analyzer / Tableau de Bord des Ratios Financiers
Target: Licence 3, Master, practicing professionals
Pedagogical objective: Students conflate liquidity (liquidité générale/immédiate), solvency (autonomie financière, capacité de remboursement), and profitability (ROE, ROA, marge nette) ratios. SYSCOHADA-specific metrics like CAF (capacité d'autofinancement) are rarely taught interactively.
Core interaction: Input simplified balance sheet + P&L (or load "PME saine" / "entreprise en difficulté" scenario). Dashboard shows 10 ratios across four families with colour-coded thresholds and one-sentence interpretation per ratio. Adjust line items and watch ratios recompute live.
MVP I/O: 12–15 aggregated statement lines → ratio table, spider/radar chart, rule-based one-paragraph diagnosis (no LLM).
Complement: CVP covers internal cost-volume decisions; this covers external financial diagnosis — the lens used by banks, auditors, and investors in the OHADA zone.
Report generated by automated daily review. Total source files audited: 194.
Generated by Claude Code