Skip to content

Daily review 2026-07-02 - #67

Draft
NghaReformer wants to merge 3 commits into
mainfrom
daily-review/2026-07-02
Draft

Daily review 2026-07-02#67
NghaReformer wants to merge 3 commits into
mainfrom
daily-review/2026-07-02

Conversation

@NghaReformer

@NghaReformer NghaReformer commented Jul 2, 2026

Copy link
Copy Markdown
Owner

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 loader

File: src/routes/[lang]/playgrounds/[slug]/+page.svelte:103–116

If 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 like playgrounds.load_error.


HIGH — --orange CSS variable never defined in theme (20 instances, 8 files)

src/lib/theme/css-generator.ts emits --amber (line 25) but never --orange. Every var(--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:175

Fix: Add --orange: ${c.amber}; alias in css-generator.ts, or rename --orange--amber across all 8 files.


MEDIUM — Client component imports from $lib/server/ (server boundary violation)

File: src/lib/components/feedback/FeedbackForm.svelte:7

import type { FeedbackType, FeedbackSeverity } from '$lib/server/db/types';

import type is erased today, but if $lib/server/db/types gains 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.ts imports $lib/server/ but has no .server.ts suffix

File: src/routes/api/feedback/validation.ts:1–5

Nothing structurally prevents a future client import; SvelteKit's boundary enforcement is inactive without the suffix.

Fix: Rename to validation.server.ts or move into src/lib/server/.


MEDIUM — Iframe has no onerror handler

File: src/routes/[lang]/playgrounds/[slug]/+page.svelte:126–133

If pg.staticFile is undefined or returns a 404, onIframeLoad never fires and the spinner never clears.

Fix: Add onerror={() => { iframeLoaded = true; /* show error state */ }}.


MEDIUM — Stale hex fallbacks diverge from design tokens (11 files)

CSS call Fallback Actual token
var(--green, #22c55e) Tailwind green-500 #34d399
var(--accent, #6ea8fe) Bootstrap blue #7c7fff
var(--error, #ef4444) Tailwind red-500 #f06070

If CSS var injection fails before first paint, status colours render the wrong palette.

Fix: Update fallback hex values to match tokens.ts.


MEDIUM — Hardcoded #fff on 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:400

Fix: color: var(--bg) or add a --text-on-accent token.


MEDIUM — Hardcoded category colour maps outside token system (2 files)

bank-reconciliation/CategoryBreakdownDonut.svelte:30–40, bank-reconciliation/MatchingPairsOverlay.svelte:31–34

Raw 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 — use aria-labelledby).

Fix: Add aria-label={$t('...')} or aria-labelledby pointing to a heading.


MEDIUM — Hardcoded English aria-label strings 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-hidden CSS class.


LOW — Google Fonts CDN call in cvp-playground.html (privacy)

static/playgrounds/cvp-playground.html:7–9 makes live CDN requests logging user IPs. The other 3 HTML playgrounds use system fonts and are clean. Fix: Bundle fonts inline or reference static/fonts/.


LOW — Emoji icons in playground data

src/lib/data/playgrounds.ts:18,27,36,44,53,61,69 — banned per CLAUDE.md. Fix: PlaygroundIconSlug type → SVG components.


LOW — Dead staticFile/lineCount on migrated slugs

src/lib/data/playgrounds.ts:26–28, 35–37cvp and journal-entry are natively registered; their staticFile and lineCount fields are never read. Fix: Remove them.


LOW — tsx missing from devDependencies

npm run i18n:check fails with sh: 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.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016EaewH5MNynSQcqrPd9nQv
@vercel

vercel Bot commented Jul 2, 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 Jul 2, 2026 11:21pm

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016EaewH5MNynSQcqrPd9nQv
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