Daily review 2026-06-30 - #65
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.
Daily Review — 2026-06-30
1. Bugs & Issues
Overall health
Svelte 5 runes usage is correct throughout — no
export let,$:,on:event, or<slot />violations found. Server/client boundary is enforced for runtime code. The issues below are theme system defects, an i18n gap, and a server-boundary type import.Issue 1 — Undefined CSS tokens
--orange,--blue,--redalways resolve to hardcoded hexSeverity: HIGH
Files: 10 components (see list)
tokens.tsandcss-generator.tsdefine no--orange,--blue, or--redcustom properties. Everyvar(--orange, #f59e0b),var(--blue, #3b82f6), andvar(--red, #ef4444)call silently falls through to the hardcoded hex fallback on every render. These colours are invisible to the theme system and will never reflect a theme change.Affected files and approximate line ranges:
src/lib/components/playground/KpiStrip.svelte:76--orangesrc/lib/playgrounds/amortization/components/ChartPanel.svelte:436–533--orange,--blue,--redsrc/lib/playgrounds/amortization/components/ScheduleTable.svelte:240–265--orange,--blue,--redsrc/lib/playgrounds/amortization/components/InputsPanel.svelte:604–605--redsrc/lib/playgrounds/bank-reconciliation/components/LedgerPanel.svelte:149–209--orangesrc/lib/playgrounds/bank-reconciliation/components/BankStatementPanel.svelte--orangesrc/lib/playgrounds/bank-reconciliation/components/ReconciliationFlow.svelte--orange,--bluesrc/lib/playgrounds/bank-reconciliation/components/ScenarioWalkthrough.svelte--orangesrc/lib/playgrounds/bank-reconciliation/components/TransactionJournal.svelte--orangesrc/lib/playgrounds/bank-reconciliation/components/VarianceScale.svelte--orangeSuggested fix: Add
--orange,--blue, and--redas named aliases incss-generator.ts:--orange→ alias--amber(#f5a623already defined)--blue→ new token or alias of--accent-dim(#6366f1)--red→ alias--error(#f06070already defined)One-file fix in
css-generator.ts; eliminates all hardcoded hex fallback exposure.Issue 2 — Client component imports types from
$lib/serverSeverity: MEDIUM
File:
src/lib/components/feedback/FeedbackForm.svelte:7SvelteKit's vite plugin blocks
$lib/serverimports in client-renderable files, including type-only imports in some configurations. Has not triggered a build failure yet but is a latent risk and violates the boundary rule in CLAUDE.md.Suggested fix: Move
FeedbackTypeandFeedbackSeveritytosrc/lib/types/feedback.ts; import from there in bothFeedbackForm.svelteand$lib/server/db/types.ts.Issue 3 — Privacy page bypasses i18n entirely
Severity: MEDIUM
File:
src/routes/[lang]/privacy/+page.svelteAll user-facing copy is hardcoded English prose. The file imports
tfrom$lib/i18nat line 1 but never calls it (dead import). French-locale visitors at/fr/privacysee English-only content.npm run i18n:checkwill not catch this because no keys exist.Suggested fix: Create
src/lib/i18n/namespaces/privacy.en.tsandprivacy.fr.ts, register inindex.ts, replace all strings with$t('privacy.*')calls.Issue 4 — Hardcoded
#fffhex color on accent-background elementsSeverity: MEDIUM
Files: 4 files
src/lib/playgrounds/journal-entry/components/EntryHistory.sveltesrc/routes/[lang]/chart-of-accounts/+page.sveltesrc/routes/[lang]/chart-of-accounts/+page.sveltesrc/routes/[lang]/learn/+page.svelteSuggested fix: Add
--text-on-accenttoken totokens.ts(value#fffffffor midnight theme) and replace all four instances.Issue 5 —
static/playgrounds/depreciation-playground.htmlis unreachableSeverity: LOW
File:
static/playgrounds/depreciation-playground.htmlNo route,
PlaygroundCard, or registry entry points to it. The other three static playground HTMLs each have corresponding references; depreciation does not.Suggested fix: Register a legacy iframe route, or remove the file and build a native Svelte depreciation module instead.
Issue 6 — Three separate
$effectcalls for related tweens in VarianceScaleSeverity: LOW
File:
src/lib/playgrounds/bank-reconciliation/components/VarianceScale.svelte:54–60Three consecutive single-line
$effectblocks drive three tweened stores. Should be one merged effect to reduce subscriber count.2. New Playground Ideas
Existing playgrounds (native Svelte): Amortization, CVP, Journal Entry, Bank Reconciliation, TVM, Interest.
Static HTML only (no native module): Depreciation.
Idea A — VAT Compliance Simulator / Simulateur de Conformité TVA
Target learner: Licence 2–3, practicing professional
Pedagogical objective: Students confuse TVA collectée vs TVA déductible and miscalculate net VAT payable. OHADA-zone rates vary by country (18% Cameroun/Côte d'Ivoire; 19.25% Sénégal) with country-specific exemption categories. No existing playground covers fiscal compliance.
Core interaction: Learner enters purchase/sale transactions, selects OHADA-country VAT rate, marks exempt lines. Playground computes TVA collectée, TVA déductible, and TVA à décaisser/rembourser in real time, then generates journal entries for accounts 4431, 4452, 4454.
Minimum viable inputs / outputs: Transaction type, HT amount, rate selector, exempt toggle → TVA totals, net balance, journal entry preview.
Complements: Natural prerequisite to Journal Entry Playground — teaches how to calculate VAT amounts before recording them.
Idea B — Inventory Costing Playground / Méthodes de Valorisation des Stocks
Target learner: Licence 2–3
Pedagogical objective: SYSCOHADA mandates CMP (Coût Moyen Pondéré); students also face FIFO on exams. The core misconception is that both methods yield identical COGS — the side-by-side comparison surprises them.
Core interaction: Learner adds stock movement rows (entry with cost, exit with quantity). Playground maintains a running stock card for CMP and FIFO simultaneously, with a live divergence indicator.
Minimum viable inputs / outputs: Movement type, quantity, unit cost (entries) → per-method running balance, COGS, ending inventory value, divergence delta.
Complements: Amortization covers non-current assets; this completes the asset side of the SYSCOHADA balance sheet.
Idea C — Payroll Simulator — OHADA Zone / Simulateur de Paie
Target learner: Licence 3, Master, practicing professional
Pedagogical objective: Payroll in OHADA countries involves country-specific social contribution rates (CNPS Cameroun, CNSS Sénégal, etc.) and IRPP brackets that students routinely miscalculate, leading to wrong journal entries for accounts 661, 431, 432, 447.
Core interaction: Learner inputs gross salary and selects country. Playground steps through IRPP bracket calculation, employee charges, employer charges, and net pay, then shows the full payroll journal entry pre-filled.
Minimum viable inputs / outputs: Gross salary, country selector, dependant count → IRPP breakdown, social charges, net pay, journal entry.
Complements: Journal Entry Playground has a fixed payroll scenario; this makes the numbers interactive and country-aware.
Idea D — Financial Ratio Analyser / Tableau de Bord des Ratios Financiers
Target learner: Licence 3, Master
Pedagogical objective: Students produce balance sheets in the Journal Entry Playground but cannot interpret them. They memorise ratio formulas without understanding which values signal danger or how changing one line cascades across multiple ratios.
Core interaction: Learner inputs B/S and P&L line items (or loads a preset SYSCOHADA scenario). Playground computes 12 ratios across four families, colour-codes each against OHADA-sector benchmarks, and renders a radar chart. Sliders let them shift one variable and watch all ratios update.
Minimum viable inputs / outputs: 12–15 B/S and P&L fields → ratio cards, radar chart, colour-coded benchmark verdict.
Complements: Phase 2 could pipe Journal Entry Playground output directly into this dashboard, creating a transaction → statements → analysis pedagogical arc.
Idea E — Budget Variance Workshop / Atelier d'Analyse des Écarts Budgétaires
Target learner: Master, practicing professional
Pedagogical objective: OHADA management accounting students rarely practice variance analysis beyond static tables. The common confusion is between price variance and volume variance, and between F/U sign conventions across cost and revenue lines.
Core interaction: Learner fills a budget template (revenue lines, fixed/variable costs) and then an actuals column. Playground decomposes each variance into price and volume effects, flags F/U per SYSCOHADA convention, and presents a guided root-cause confirmation exercise.
Minimum viable inputs / outputs: Budget and actual figures for up to 4 revenue + 6 cost lines → variance table (amount, %, F/U), price-volume decomposition, flexible budget reconciliation.
Complements: CVP shows the static break-even; this extends into dynamic budget control — together they cover the full managerial accounting arc for Licence 3 / Master.
Generated by Claude Code