Daily review 2026-06-28 - #63
Draft
NghaReformer wants to merge 1 commit into
Draft
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RwbvNVRKyphRz4LziZQ38b
|
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-28
1. Bugs & Issues
CRITICAL
C-1 · Server-type import in client component
File:
src/lib/components/feedback/FeedbackForm.svelte:7Severity: Critical
FeedbackForm.svelteis a client-rendered Svelte component. Importing — even asimport type— from$lib/server/violates the SvelteKit server-only boundary that CLAUDE.md mandates. While TypeScript erasesimport typeat compile time, SvelteKit's Vite plugin performs static-path analysis and can reject this import, producing a build error in strict mode. More importantly, it breaks the architectural rule: client code must never reference$lib/server/paths.Fix: Move
FeedbackTypeandFeedbackSeverityto a shared (non-server) types file — e.g.,src/lib/contracts/feedback.ts— and import from there in both the server module and the component.HIGH
H-1 · Hardcoded French difficulty labels (i18n violation)
File:
src/lib/components/playground/ExercisePanel.svelte:11–13Severity: High
ExercisePanelrenders these labels as visible UI text (line 44). English-locale users see French strings. All user-facing strings must route through$t()per CLAUDE.md.Fix: Add keys such as
shell.difficulty.fondamental,shell.difficulty.intermediaire,shell.difficulty.avanceto both EN/FRshellnamespace files, then replace the hardcoded strings with$t(...)calls (or store the i18n key instead of the label and call$t(key)at render time).MEDIUM
M-1 · Inline style on honeypot field (CLAUDE.md ban)
File:
src/lib/components/WaitlistForm.svelte:55Severity: Medium
CLAUDE.md's first design rule is "No inline styles." The sibling component
FeedbackForm.sveltealready implements the correct pattern using a.hpCSS class (lines 264–270).WaitlistFormshould follow the same convention.Fix: Remove the inline
styleattribute; add a.hprule toWaitlistForm's<style>block mirroringFeedbackForm's implementation.M-2 ·
avancedifficulty glow token mismatchFile:
src/lib/components/playground/ExercisePanel.svelte:13Severity: Medium
The dot color is
var(--error)(red) but the glow isvar(--amber-glow)(yellow). The glow is applied as the badge background; users see a red dot beside a yellow-tinted badge. This is a visual inconsistency likely caused by a copy-paste from theintermediaireentry.Fix: Change
glowtovar(--error-glow)(or the red-family glow token defined intokens.ts).M-3 · Hardcoded user-facing string on landing page
File:
src/routes/[lang]/+page.svelte:28Severity: Medium
This is a visible user-facing label not routed through
$t(). All such strings must be bilingual per CLAUDE.md.Fix: Add
hero.badgekey to bothenandfrlanding namespace files (SYSCOHADA Revised 2017/SYSCOHADA Révisé 2017) and replace with{$t('hero.badge')}.M-4 ·
requestFullscreen()rejection leavesisFullscreenstaleFile:
src/routes/[lang]/playgrounds/[slug]/+page.svelte:44–52Severity: Medium
requestFullscreen()returns aPromisethat can reject (browser permission denied, element not in DOM, etc.). When it does, the browser firesfullscreenerror, notfullscreenchange, so the existingfullscreenchangelistener on line 57 does not resetisFullscreen. The UI then shows "Exit Fullscreen" when no fullscreen is active.Fix:
await target.requestFullscreen()inside anasyncfunction and catch the rejection to resetisFullscreen = false. Alternatively, deriveisFullscreensolely from thefullscreenchangelistener and remove the optimistic assignment.LOW
L-1 · Emoji icons in tab bar (CLAUDE.md ban)
File:
src/lib/components/playground/PlaygroundTabs.svelte:12–14Severity: Low
CLAUDE.md rule: "No emoji icons." These are rendered as
<span class="tab-icon">in the live UI.Fix: Replace with inline SVG icons consistent with the rest of the design system, which already uses SVGs everywhere else.
L-2 · Mobile nav missing
aria-controls/idbindingFile:
src/lib/components/Nav.svelte:23–33, 35Severity: Low
The hamburger
<button>hasaria-expanded={mobileOpen}but noaria-controlsattribute pointing to the collapsible menu div. The.nav-bodydiv has noid. Screen readers cannot programmatically associate the button with the content it controls.Fix: Add
id="nav-menu"to.nav-bodyandaria-controls="nav-menu"to the hamburger button.L-3 · Magic-number nav height in playground page
File:
src/routes/[lang]/playgrounds/[slug]/+page.svelte:142Severity: Low
The
60pxvalue hard-codes the nav height defined inNav.svelte:72. If nav height changes, this breaks silently.Fix: Define
--nav-height: 60pxas a CSS custom property intokens.tsand usecalc(100vh - var(--nav-height))here and inNav.svelte.2. New Playground Ideas
P-1 · Balance Sheet Builder
EN: Balance Sheet Builder | FR: Constructeur de Bilan
Target learner: Licence 1 / Licence 2
Pedagogical objective: Students memorise account classifications without understanding why assets must equal liabilities + equity. This playground forces them to manipulate both sides of the equation in real time, building intuition for SYSCOHADA's Class 1–5 structure.
Core interaction: A split ledger shows a partial set of account balances. The learner drags each account to the correct bilan section (actif immobilisé, actif circulant, dettes financières, capitaux propres). A live running total shows Assets vs. Liabilities + Equity; the submit button unlocks only when the equation balances.
Minimum viable inputs/outputs:
Complements existing playgrounds: Journal Entry teaches recording; this teaches reporting. Together they cover the full cycle from transaction to financial statement.
P-2 · Financial Ratios Interpreter
EN: Ratios Dashboard | FR: Tableau de Bord des Ratios
Target learner: Licence 3 / Master / Practicing professional
Pedagogical objective: Fix the misconception that ratio analysis is just plugging numbers into formulas. Learners must interpret whether a ratio signals health or distress in the OHADA context, where benchmarks differ from IFRS markets.
Core interaction: The learner enters a simplified income statement and balance sheet (or loads a scenario preset). The playground computes 8 ratios across liquidity, solvency, and profitability categories. Each ratio card shows the computed value, a SYSCOHADA-typical benchmark range, and a colour-coded health indicator. Hovering reveals the formula derivation.
Minimum viable inputs/outputs:
Complements existing playgrounds: CVP and TVM deal with planning-phase numbers; Ratios deal with post-period performance analysis.
P-3 · Inventory Valuation Comparator (FIFO vs CMUP)
EN: Inventory Valuation | FR: Valorisation des Stocks
Target learner: Licence 2 / Licence 3
Pedagogical objective: SYSCOHADA mandates CMUP by default, but exam questions frequently require FIFO comparison. Most students cannot explain why the two methods produce different COGS figures.
Core interaction: The learner enters a sequence of purchase lots and sale events. The playground renders a parallel table showing running inventory valuation under both FIFO and CMUP, with each movement's impact highlighted. A summary line shows ending stock value and COGS per method, with the delta called out.
Minimum viable inputs/outputs:
Complements existing playgrounds: Journal Entry shows how to record an inventory purchase; this shows which value to record and why it differs by method.
P-4 · Cash Flow Statement Builder (Indirect Method)
EN: Cash Flow Statement | FR: Tableau des Flux de Trésorerie (TAFIRE)
Target learner: Licence 3 / Master
Pedagogical objective: Students can read a bilan and compte de résultat but cannot construct the TAFIRE from them. The indirect method reconciliation is consistently the hardest SYSCOHADA financial reporting topic.
Core interaction: The learner is given N-1 and N balance sheets plus the income statement. They classify each line-item change into Operating / Investing / Financing activities and mark adjustments as add-back or deduction. A running total shows net change in cash; final validation compares it to the balance sheet's cash delta.
Minimum viable inputs/outputs:
Complements existing playgrounds: Closes the financial statement cycle opened by Journal Entry and Balance Sheet Builder (P-1).
P-5 · OHADA-Zone Payroll Calculator
EN: Payroll Calculator | FR: Calculateur de Paie
Target learner: Licence 3 / Master / Practicing professional
Pedagogical objective: Payroll accounting is required in every SYSCOHADA entity but rarely taught interactively. Learners confuse gross salary, taxable base, CNPS contributions, and net-to-pay — and cannot produce the Class 6 journal entries automatically.
Core interaction: The learner inputs an employee's gross salary and selects an OHADA member state to load that country's CNPS and IRPP/IPTS rate tables. The playground computes employer/employee contributions, taxable income, tax, and net salary. A "Generate Journal Entry" button produces the debit/credit structure for accounts 661x/431x/447x.
Minimum viable inputs/outputs:
Complements existing playgrounds: Journal Entry provides the recording mechanics; this playground provides the payroll-specific figures that feed into them.
End of report — 2026-06-28
Generated by Claude Code