Daily review 2026-07-02 - #67
Draft
NghaReformer wants to merge 3 commits into
Draft
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016EaewH5MNynSQcqrPd9nQv
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016EaewH5MNynSQcqrPd9nQv
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016EaewH5MNynSQcqrPd9nQv
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-07-02
Scope: Full codebase scan — Svelte 5 rune compliance, theme token hygiene, i18n parity, accessibility, dead-code, playground inventory.
i18n parity check: PASSED (1331 keys, EN ≡ FR).
Svelte 4 patterns: NONE found (
export let,on:event,<slot/>,$app/stores— all clear).Vercel preview: Deployed ✓
1. Bugs & Issues
HIGH —
{#await}missing{:catch}on native playground loaderFile:
src/routes/[lang]/playgrounds/[slug]/+page.svelte:103–116If
loadPlaygroundComponent()rejects (network error, missing chunk, bad default export) the spinner stays visible indefinitely — no error message, no retry. Silent failure on the critical render path for all six native playgrounds.Fix: Add
{:catch err}rendering an error banner with a retry button and a key likeplaygrounds.load_error.HIGH —
--orangeCSS variable never defined in theme (20 instances, 8 files)src/lib/theme/css-generator.tsemits--amber(line 25) but never--orange. Everyvar(--orange, #f59e0b)falls back permanently to a hardcoded Tailwind amber-500 (#f59e0b), which differs from the design token (#f5a623) and bypasses the theme system entirely.Representative files:
KpiStrip.svelte:76,amortization/ChartPanel.svelte:436,493,515,529,amortization/ScheduleTable.svelte:240,bank-reconciliation/ReconciliationFlow.svelte:278,bank-reconciliation/ScenarioWalkthrough.svelte:234,274,bank-reconciliation/BankStatementPanel.svelte:175,bank-reconciliation/TransactionJournal.svelte:382,383,bank-reconciliation/VarianceScale.svelte:230,260,261,331,335,370,416,bank-reconciliation/LedgerPanel.svelte:175Fix: Add
--orange: ${c.amber};alias incss-generator.ts, or rename--orange→--amberacross all 8 files.MEDIUM — Client component imports from
$lib/server/(server boundary violation)File:
src/lib/components/feedback/FeedbackForm.svelte:7import typeis erased today, but if$lib/server/db/typesgains any runtime export the build will silently bundle server code into the client.Fix: Extract shared types to
src/lib/shared/feedback-types.ts.MEDIUM —
validation.tsimports$lib/server/but has no.server.tssuffixFile:
src/routes/api/feedback/validation.ts:1–5Nothing structurally prevents a future client import; SvelteKit's boundary enforcement is inactive without the suffix.
Fix: Rename to
validation.server.tsor move intosrc/lib/server/.MEDIUM — Iframe has no
onerrorhandlerFile:
src/routes/[lang]/playgrounds/[slug]/+page.svelte:126–133If
pg.staticFileis undefined or returns a 404,onIframeLoadnever fires and the spinner never clears.Fix: Add
onerror={() => { iframeLoaded = true; /* show error state */ }}.MEDIUM — Stale hex fallbacks diverge from design tokens (11 files)
var(--green, #22c55e)#34d399var(--accent, #6ea8fe)#7c7fffvar(--error, #ef4444)#f06070If CSS var injection fails before first paint, status colours render the wrong palette.
Fix: Update fallback hex values to match
tokens.ts.MEDIUM — Hardcoded
#fffon active button states (4 instances)src/routes/[lang]/chart-of-accounts/+page.svelte:423,458,src/routes/[lang]/learn/+page.svelte:202,src/lib/playgrounds/journal-entry/components/EntryHistory.svelte:400Fix:
color: var(--bg)or add a--text-on-accenttoken.MEDIUM — Hardcoded category colour maps outside token system (2 files)
bank-reconciliation/CategoryBreakdownDonut.svelte:30–40,bank-reconciliation/MatchingPairsOverlay.svelte:31–34Raw hex colour maps invisible to the theme system. Fix: Map to CSS custom properties or theme tokens.
MEDIUM —
role="tablist"without accessible name (6 instances, WCAG 2.1 SC 1.3.1)cvp/Playground.svelte:193,250,amortization/ChartPanel.svelte:203,amortization/LifecyclePanel.svelte:74,91,amortization/SolverPanel.svelte:97(also:<label for>on a tablist role is invalid — usearia-labelledby).Fix: Add
aria-label={$t('...')}oraria-labelledbypointing to a heading.MEDIUM — Hardcoded English
aria-labelstrings bypass i18n (6 instances)PlaygroundTabs.svelte:18("Playground sections"),Nav.svelte:28("Toggle menu"),cvp/InputPanel.svelte:47("CVP mode"),cvp/ChartToolbar.svelte:34("Chart views"),interest/ModeTabs.svelte:22("Interest mode"),bank-reconciliation/ReconciliationStatement.svelte:29("layout" — also semantically meaningless).Fix: Route all through
{$t('...')}with new common keys.MEDIUM — Inline style on honeypot field
src/lib/components/WaitlistForm.svelte:55— banned per CLAUDE.md. Fix: Extract to a scoped.visually-hiddenCSS class.LOW — Google Fonts CDN call in
cvp-playground.html(privacy)static/playgrounds/cvp-playground.html:7–9makes live CDN requests logging user IPs. The other 3 HTML playgrounds use system fonts and are clean. Fix: Bundle fonts inline or referencestatic/fonts/.LOW — Emoji icons in playground data
src/lib/data/playgrounds.ts:18,27,36,44,53,61,69— banned per CLAUDE.md. Fix:PlaygroundIconSlugtype → SVG components.LOW — Dead
staticFile/lineCounton migrated slugssrc/lib/data/playgrounds.ts:26–28, 35–37—cvpandjournal-entryare natively registered; theirstaticFileandlineCountfields are never read. Fix: Remove them.LOW —
tsxmissing from devDependenciesnpm run i18n:checkfails withsh: tsx: not found. Fix:npm install -D tsx.2. New Playground Ideas
Existing: TVM, CVP/Break-Even, Journal Entry, Amortization (loan), Depreciation, Bank Reconciliation, Interest (simple/compound).
Idea 1 — Trial Balance & Period Closing
EN: Trial Balance & Closing Entries | FR: Balance de vérification et clôture d'exercice | Target: Licence 1–2
Fixes the gap where students treat journal entries as isolated events and miss the full accounting cycle. Interaction: post 6–10 entries for a SYSCOHADA micro-enterprise, watch a live trial balance build, then run period closing to zero classes 6 & 7. Reuses
src/lib/shared/chart-of-accounts. Natural sequel to the Journal Entry playground.Idea 2 — Cash Flow Statement Builder
EN: Cash Flow Statement | FR: Tableau des flux de trésorerie (TFT) | Target: Licence 3, Master, professional
Fixes operating/investing/financing misclassification and inability to reconcile the TFT to the balance sheet. Drag-and-drop 12 pre-set items into the correct TFT section; errors flagged with explanation; SYSCOHADA vs. IFRS toggle. Sits downstream of Journal Entry and Bank Reconciliation.
Idea 3 — Payroll & Social Charges
EN: Payroll & Social Charges | FR: Paie et charges sociales SYSCOHADA | Target: Licence 2–3, professional
Fills the domain gap for OHADA-zone payroll (CNPS, IRPP, AGA). Country selector (Cameroon/CI/Senegal), stepped deduction panel, payslip output + class 641/645 journal entry. Key differentiator for the professional segment.
Idea 4 — VAT Return Simulator
EN: VAT Return | FR: Déclaration de TVA | Target: Licence 2, professional
Input/output VAT netting, carry-forward across months, OHADA-zone rates (18–19.25 %). Chains multiple Journal Entry transactions into a compliance output.
Idea 5 — Financial Ratios Analyser
EN: Financial Ratios | FR: Analyse financière par ratios | Target: Licence 2–3, Master
8 ratios in 4 groups computed live from a simplified balance sheet + income statement, with sector benchmark bands and plain-language interpretation per ratio. Natural capstone that consumes the outputs every other playground produces.
Report generated by automated daily review routine. No code changes made.