You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Last updated: 2026-05-01 by GitHub Copilot (autonomous quality drain — 7 PRs since #1054)
Purpose: Volatile project status for AI agent context recovery. Read this FIRST at session start.
Sequential merge of seven small-but-load-bearing PRs that closed lint debt, hardened tests, and split the React Compiler cleanup into a safe Phase 1 (errors fixed, 4 of 5 rules promoted to default error) with Phase 2 (set-state-in-effect, 19 violations across 14 files) explicitly deferred. Each violation is a sync-prop-to-state anti-pattern requiring per-component architectural review (key-based reset, lift state up, derive during render, or uncontrolled refs) and was deemed unsafe to bulk-fix.
chore(framework): rename middleware.ts to proxy.ts (Next.js 16 deprecation, #1062)
#1065
docs: reconcile QA suite/check counts to RUN_QA.ps1 ground truth (#1061)
#1064
fix(test): make FreshnessIndicator tests DST-safe (#1058)
#1057
refactor(hooks): use useSyncExternalStore in useReducedMotion
#1056
chore(lint): replace 3 non-null assertions with safe local-variable pattern
#1055
chore(lint): silence 2 spurious a11y warnings with justification comments
Recently Shipped (Next.js 16 Dependency Cleanup)
Removed @eslint/eslintrc and @eslint/js from frontend/package.json devDependencies + overrides block. Both were holdovers from the FlatCompat bridge that was removed in PR #904 (Next.js 16 upgrade) when eslint-config-next started exporting native flat config. Verified eslint.config.mjs imports eslint-config-next/core-web-vitals and eslint-config-next/typescript directly with no FlatCompat usage. Local lint clean (0 errors / 29 pre-existing warnings unchanged).
First push hit the documented Windows-npm cross-platform lockfile fragility (per PR #1030 note): npm uninstall on Windows pruned the Linux-only @emnapi/core@1.9.2 and @emnapi/runtime@1.9.2 nested entries under node_modules/@rolldown/binding-wasm32-wasi/node_modules/, breaking Linux CI npm ci. Restored manually via registry-verified integrity hashes (29-line lockfile addition) — same fix pattern as PR #1030.
PR
Change
#1053
chore(deps): remove unused @eslint/eslintrc and @eslint/js devDependencies (+ lockfile fix)
Recently Shipped (Dependabot Major-Bump Drain)
After #1039 split groups into minor+patch only, Dependabot re-opened the held majors as individual PRs. All 9 were triaged sequentially: 6 merged (Tier 1 safe + Tier 2 verified-green), 3 closed for incompatible peers or unsupported ecosystem moves. quality_gate failures (workflow config bug — non-blocking) and Vercel "Canceled from dashboard" treated as acceptable per branch protection (4 required: Unit Tests, Playwright Smoke, Typecheck & Lint, Build).
PR
Change
#1050
chore(deps): bump lucide-react from 0.577.0 to 1.14.0 (20+ icon usages — all 4 required gates pass)
Closed — @zxing/library 0.22→0.23 incompatible with @zxing/browser@^0.2.0 peer (^0.22.0)
#1038
Closed earlier (superseded by #1039 grouping fix)
Recently Shipped (Dependabot Grouping Hardening)
PR #1038 grouped 13 npm updates including 6 incompatible majors (@eslint/js 9→10, @vercel/speed-insights 1→2, lucide-react 0.577→1.11, sonner 1→2, tesseract.js 5→7, @types/node 22→25) — all 10 gates failed and breakages could not be isolated atomically. Closed in favour of #1039: added update-types: [minor, patch] to all groups in .github/dependabot.yml (npm framework/sentry/supabase/testing/build-tooling/npm-rest + actions github-official/third-party). Major bumps now arrive as individual PRs for proper triage.
PR
Change
#1039
update-types: [minor, patch] constraint added to all 8 Dependabot groups
#1038
Closed (superseded) — 13-package grouped bundle with 6 breaking majors
Recently Shipped (Supabase CLI v2 Upgrade)
PR
Change
#1035
ci(deps): bump supabase/setup-cli from 1.6.0 to 2.0.0 (Dependabot)
Recently Shipped (Dependabot Alert #3 Closure)
Forced tmp package to patched version (>=0.2.4, resolved to 0.2.5) via npm overrides block in frontend/package.json, closing CVE-2025-54798 / GHSA-52f5-9888-hmc6 (low-severity symlink temp write). Transitively reached only via @lhci/cli@0.15.1 (devDep, already latest). npm audit now clean (was 4 low). Also repaired cross-platform lockfile: Windows-local npm install pruned Linux-only @emnapi/* optional deps required by @rolldown/binding-wasm32-wasi, breaking Linux CI npm ci — restored via manual nested entries with registry-verified integrity hashes.
PR
Change
#1030
overrides.tmp = ">=0.2.4" + nested @emnapi entries in package-lock.json
Recently Shipped (Hygiene-Script CI Wiring Workstream)
Wired all four scripts in scripts/ that validate repo hygiene into the Repo Hygiene Verify workflow. Forward-only enforcement for legacy-noisy checks (migration conventions) via PR-diff scope; appropriate-event scoping for age-based checks (doc freshness).
12/12 issues implemented, merged, and closed. Epic #920 closed.
PR
Issue
Summary
#933
#921
scan_country column on scan_history
#934
#922
scan_country + suggested_country on product_submissions
#935
#923
Pass user region through api_record_scan / api_submit_product
#936
#924
Frontend scan/submit country propagation
#937
#925
Admin submission review UI country context
#938
#926
Region-preferred product matching in api_record_scan
#939
#927
Cross-country product badge in scan result card
#940
#928
GS1 prefix → country hint utility function
#942
#929
Country mismatch detection badges in admin review
#943
#930
Country-scoped pending submission uniqueness
#944
#931
Country-aware submission quality scoring
#945
#932
Cross-country analytics views (3 views)
10 new migrations (20260320000100–20260321000700), 3 new views, 1 new function (gs1_country_hint), 4 modified RPC functions, 3 new QA checks (view consistency 13→16).
Deploy migrations 20260319000400 + 20260319000500 to production (deployed 2026-03-16T08:24:26Z)
Verify scanner event constraint fix in production (PR #913 — all 3 layers confirmed)
Verify nutri_score_source backfill in production (#893 — 2,197 off_computed + 238 unknown + 3 manual)
Fix PR #904 — Next.js 16 MAJOR upgrade (6 compat fixes, merged as beb31a4b)
Review #889 observation data after 2026-03-30 checkpoint (see issue comment)
Non-Urgent Follow-Ups (from Next.js 16 upgrade)
These are documented follow-ups, not active work items. Address opportunistically or when opening next sprint.
React Compiler lint warnings cleanup — Phase 1 done in PR #1067 (closes #1063 — resolved 6 violations: 1× static-components, 1× purity, 1× preserve-manual-memoization, 3× refs; promoted 4 of 5 rules from warn to default error). Phase 2: 19 remaining set-state-in-effect violations across 14 files still at warn — each requires per-component architectural review (key-based reset, lift state up, derive during render, or uncontrolled refs); recommend per-file PRs rather than bulk fix.
Remove @eslint/eslintrc and @eslint/js from devDependencies — ✅ Done in PR #1053 (2026-04-30). Restored Linux-only @emnapi/* nested lockfile entries to fix cross-platform CI break.
middleware.ts → proxy.ts migration — ✅ Done in #1062. File renamed via git mv; exported function renamed middleware → proxy; deprecation warning eliminated.
CLI note: When running supabase db push against staging, set $env:SUPABASE_DB_PASSWORD to the staging password first — the --password flag does NOT override the env var.
Key Metrics Snapshot
Products (local DB): 2,602 active (1,380 PL + 1,222 DE across 21 active + 1 deactivated category)
Deprecated products: 58
QA checks: 776 total (49 suites) — view_consistency +3 checks for cross-country analytics views
Negative tests: 20/20 caught
EAN coverage: 2,261/2,264 with EAN (99.9%) — local DB
Ingredient refs: 3,100 (local, after orphan cleanup from 6,279)
Product-ingredient links: 14,166 (restored from 0)
Allergen contains: 1,395 (restored from 0)
Allergen traces: 1,465 (restored from 0)
Local ingredient coverage: PL 58.4%, DE 16.3% (OFF API data gaps)
Local allergen coverage: PL 44.5%, DE 13.3% (OFF API data gaps)
* Pudliszki Ketchup: score shifted from 18→33 after enrichment (new ingredients/allergens added from OFF API). Needs anchor update in copilot-instructions.md §8.19.
Known QA Failures (Pre-existing, Non-blocking)
Suite
Failures
Cause
Suite 7 (DataQuality)
6
Ingredient coverage PL 58.4%/DE 16.3%, allergen coverage PL 44.5%/DE 13.3%, completeness PL 94%/DE 88.7% (all below threshold — OFF API data gaps)
Suite 10 (Naming)
2
Trailing punctuation (24 products), HTML entities (4 products)
nutri_score_source (fixed by PR #912), types (2), brands (886)
Root cause: Suite 7 failures are OFF API data coverage gaps (enrichment data only available for ~58% PL, ~16% DE products).
Suites 10, 11, 12 are pre-existing source data quality issues unrelated to enrichment.