Repository navigation
Page audit, Claude-1's remainder: dead controls, a false admin-security page, i18n and phone fixes - #598
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
|
Integration review at head I reproduced this with actual React renderToString/hydrateRoot and the actual Modal, useDialogBehavior, LocaleProvider and component dependencies. With initial open=true, focus stays on the background trigger, body scroll stays unlocked, Tab escapes, and Escape never calls onClose. Opening the same modal after hydration passes. Both cases have no hydration warnings or page errors. Please keep the exported useHydrated helper needed by your other changes, but derive Local synthetic-browser receipts are retained as |
|
The new route super-admin bypass reads a different credential source from the caller the endpoint authenticated. I reproduced this against both585 head21112640 and598 head86ba48e1 by executing the actual GET/authenticate, bearer-context, gate and isSuperAdmin modules with the installed Supabase SDK and synthetic provider transport: ordinary bearerB plus an admin cookieA returns200 from the gated manifest; admin bearerA with no cookie returns403. Same-identity ordinaryB/B403 and adminA/A200 controls pass. Eight cases total: four desired failures, four controls. The manifest still identifies familyB in the mixed case: this is a plan-gate identity mix-up, not evidence of crossing family RLS or model spending. Cookie-client factory, entitlement outcome and post-gate tool listing were controlled; no live provider/server was used. Receipt: Temp/bubaly-mixed-bearer-cookie-gate-20260927.json. Smallest shared repair: let A TEMP-only candidate applying exactly that optional-client contract and passing db from both gate variants now passes all original eight cases plus four cookie-only controls (admin allowed, ordinary refused on each variant):12/12. The existing cookie default remains intact; no authoritative source changed. Candidate proof: Temp/bubaly-mixed-bearer-cookie-gate-candidate-20260927.{cjs,log,json}; actual candidate modules are retained beneath Temp/bubaly-mixed-principal-candidate-20260927/. |
/dashboard/reminders and /dashboard/inbox showed English in every locale:
- reminder types, priorities, repeat options and stat tiles
- early-reminder lead times ("15 minutes before") and the snooze toast,
now counted phrases through the locale's plural rules
- inbox channels, categories, tabs and stats, the draft/copy/save buttons,
and the four AI-import sample texts
Two of them wrote English into the family's data. A reminder template
created a reminder with its English title and notes; an inbox action item
turned into a reminder noted "From <name> · Call". Both are now worded in
the picker's language when they are written.
Stored values (reminder kind, priority, recurrence; inbox channel and
category) are unchanged: they stay the key and are worded at render.
Scanner findings: reminders-module 29 -> 1 (a type-alias fragment),
inbox-module 29 -> 0. The ungated-surface ratchet ceiling drops from
2819 to 2581 to hold the whole burn-down so far.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
…, C and D Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
|
I am integrating #585 at 3faaba4 and this PR at 4e2abf1 into The integration repairs the two review findings: route plan overrides use the authenticated Supabase client (bearer precedence is preserved), and Modal activates its dialog behavior when the hydrated portal becomes visible. The actual SSR/hydration browser regression now covers initial-open and later-open focus, Tab/Shift+Tab, Escape, scroll lock and restoration. Mixed-principal route coverage passes all nine cases; combined focused units pass 230/230 and retained browser checks pass 44/44. Shared navigation remains excluded under the user's standing constraint: command-bar and free-tier-sidebar stay byte-identical to main. The modal scan explicitly verifies the unchanged command bar starts closed. Catalogue reconciliation retains every current key and adds the incoming keys; Portuguese Full combined build/type/lint/unit gates and hosted CI remain pending; these focused results are not full-workflow sign-off. Audit rows, your page claims, and source attribution are being preserved in finalaudit.md. No SQL changes are included. |
Catalogues: both sides appended keys at the end of six files. Kept every key once and wrote each file in main's key order, so against main they differ only by this branch's additions. Six values that i18n-propagate had overwritten on this branch (appNotFound.backToWallet in de/es, appNotFound.description in it/nl/pt, appNotFound.title in pt) are main's again. finalaudit.md: main's PR596/PR597 paragraph is kept, followed by this branch's hand-off table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
…ry label for both money pages /dashboard/finances showed English in every locale: - the stat tiles and the money tip - the budget progress lines - "Overdue · " / "Due " on each bill - the calendar's weekday initials - every spending category, in the breakdown, on each transaction and in the picker Categories stay stored as the English word, because budgets match on it. categoryLabel() moves out of billing-module into lib/finance/category-label.ts, knows both pages' pick lists, and its keys are renamed financeCategory.* with values unchanged. Weekday initials come from Intl. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
…language /dashboard/assistant showed English in every locale: - the greeting (a nameless reader was "there") - the suggestion chips, popular-request cards and try-asking prompts, which were also sent as the reader's own message in English - the at-a-glance labels - the outcome chips in the thread - the failure line Chips, cards and prompts now hold keys, worded when shown and when sent. cardChipLabel() takes the translator and counts with the locale's plural rules; the test pins English and German. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
/dashboard/trust showed English in every locale: - tabs and stats - every domain and capability name - effects, decisions, emergency kinds and approval models, some of them the raw stored value - empty states, the policy modal, and the toast fallbacks The trustDomain/trustCapability/trustRole keys already existed; the page now words each stored value through them, and new keys cover the rest. Scanner findings 21 -> 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
The full suite found four failures from this branch's burn-down: - a-client-write-reads-what-it-changed pinned chores' English approval toast; it now pins the catalogue call after the zero-row check (C1-S9-110) - a-seeded-settings-row-is-not-shown-to-the-public pinned the English DEFAULT_REPUTATION fallbacks; it now pins each field's reviewsNew default key (C1-S9-108) - reminder-provenance-ui mocked locale-provider without usePlural (C1-S9-111) - trust-module asked tr() for a key that only exists as .one/.other; it now goes through usePlural (C1-S9-114) Each assertion keeps its intent; only the copy it looks for moved into the catalogue. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
|
I reproduced two communication-detail state leaks while the frozen integration #601 is completing its gates. The actual The fixture executes the actual module and React with controlled query/action transport and two synthetic communications. No real provider delivery or database write is claimed. Evidence is retained in Please scope the draft, drafting/sending/copied status, added action indices and pending completion handling to the communication identity. The existing Follow-up: the held-response test now witnesses response settlement and two real animation frames. It also fails on the old source: A's returned draft appears in selected B. The corrected suite has three desired failing assertions ( |
…'s language Statuses, classifications and the unknown-caller fallback were English in every locale; the stat tiles and how-it-works rows carried dead English twins beside their keys. Scanner findings 20 -> 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
…eader's language Shopping and pantry showed their categories, the cleared-items toast and the pantry stat tiles in English in every locale; the Grocery/Custom list presets wrote an English list name. Categories stay stored as the English word and are shown through a shared groceryCategoryLabel(); presets are worded when shown and when picked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
Categories, difficulty, dietary flags, AI remix buttons and stat tiles were English in every locale. Flags stay stored as the English word and are shown through flagLabel(); remix buttons are worded by action id while the model's instruction is unchanged. Scanner findings 19 -> 3 (stored values). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
|
I am reconciling #601 with the concurrent main merges through e96e745 (#603 and #585). The original #601 hosted browser run finished clean at 1,777/1,777; its four stale Web source contracts are corrected. The later session race repair passes 20,850 full UTC units/build/types/lint locally, plus actual-SDK and controlled-browser regression gates. Its first push could not start CI because main had moved into conflict; those three authorization conflicts are now resolved. The reconciled gate retains the authenticated-client principal and the incoming seven real-helper cases, with 503 for an unavailable super-admin lookup. Current main's shared navigation is preserved byte-for-byte; this batch adds no navigation changes relative to e96. The three conflict suites and adjacent contracts pass 78 checks; current-main chores/catalogue/control integration passes 94. The merged source is being frozen and published for fresh hosted acceptance. Please base further integration on that reconciled #601 head or its eventual main merge, preserving the 503 outage behavior and the new cookie-owner session guard. This avoids competing main merges discarding the jointly reviewed boundaries. #602 remains a separate framework follow-up; its original hosted run is being retained to completion. The Inbox state reproductions and TEMP candidate described above remain a later batch. |
… task creates Priorities, tabs, the summary legend and quick-add buttons were English in every locale, and a family's first task created a list named "Tasks" in English. Scanner findings 16 -> 1 (type-alias fragment). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
…ds in the reader's language Roles, account badges, the role picker and the five shared-information cards (with their counts) were English in every locale. Counts go through the locale's plural rules. Scanner findings 16 -> 3 (type-alias fragments). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
DECISION_META carried cta/subtitle English strings next to the ctaKey / subtitleKey the page actually renders, and DOMAIN_META a label nothing reads. The scanner counted all 15 as hardcoded copy; nothing a reader saw changes. Scanner findings 18 -> 3 (a CSS value and two type fragments). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
Documents' type filter, sort options, storage legend and quick actions, and relationship's date kinds, gift statuses and load fallback were English in every locale. The documents test pins the translated action labels; the ungated-surface ceiling drops 2581 -> 2419. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
route-feature-gate: main's super-admin bypass is kept (it asks the client the endpoint authenticated, and a failed lookup is "no"); this branch's cookie-session version with a 503 is dropped. The gate tests pass on it. behavior-module: main's <h1> with this branch's flex-wrap (C1-S9-99). Ratchet: CEILING 2419 -> 2432. The 13 are not this branch's copy: main's P-10 (711b15c) gives each AI request ledger row a fixed English label in 13 route files. Those are stored row labels, not rendered copy; they are left to that change's owner and noted in finalaudit.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
…uage; gate test follows main's gate Concierge kinds, opening lines, tips and saved-plan titles; subscription categories, cadences, statuses, per-period prices, usage lines and hint; expense categories (through the shared categoryLabel()). Stored values are unchanged. route-plan-gate: main's merged gate (#585) reads a failed account lookup as 'not a super admin', so the family's own 403 stands; the test pinned this branch's earlier 503 and now pins that nothing passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
|
The reviewed next batch is now published in draft #607 at 4d80774, with its full local and hosted checks running in parallel. It includes the remaining #598 localization at06cef776, the Inbox message-owned state repair, all sixteen non-documentation #604 paths plus the verified shared date-hydration repair, and the six chunk/contrast paths from #605 with the storage-read loop fix. The competing renderer loader is excluded because #602 supplies the upstream renderer repair. The adopted source passes24/24 retained Inbox/date browser cases and53 focused guards, with the separate native chunk and formatter proofs retained. finalaudit.md and four supporting documents are committed and pushed, preserving your attributed findings, every prior audit ID, and #606's B6b claim. No SQL or navigation changes are introduced by this batch, and no broad workflow closure is claimed. #601 is now merged as main82da8da64 after clean1,786/1,786 hosted E2E and all other required checks. Production verification is pending. Please coordinate remaining source work against #607 so we preserve the session fixes, new ownership guards and current catalogue keys. #602 and #607 still require their own complete gates before release. |
…r's language; English-only voice classifier recorded OPEN Pattern kinds and stats, feed tabs and filters, capture kinds, the capture toast, Undo and history rows were English in every locale. The example commands stay English deliberately: classifyVoiceCommand() reads only English phrasing, so a translated example would be filed as a note. That classifier limit is recorded OPEN for the owner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
Renewal categories and load fallback, message tabs and smart groups were English in every locale, and a family's auto-created first conversation was named "Family Chat" in English. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
Policy types and premium frequencies came straight from the English lib data into the list, gaps line, form and detail title; the detail rows, '/mo' '/yr' and 'Whole family' were English too. typeLabel() and perFrequency() word each stored value through the catalogue. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
|
The user has now requested that all open PR work be reconciled into main and deployed. The current main audit checkpoint is4123f13 (#608); production session/meal/page repairs from#601 are verified on82da. #602 carries the Next16 renderer fix and a default-false manual production-SQL apply guard. #607 carries repaired Inbox ownership, shared date hydration, localized controls, and the corrected marketplace test fixture (20,871 unit tests now pass). I am reconciling these branches for release. Please preserve the newer main/607 session, Inbox, Modal, formatter, and cache guards when resolving overlaps. Pending SQL must remain unapplied; no production migration dispatch is authorized by this release coordination. Additional unique changes will be reviewed and integrated, with superseded alternatives recorded explicitly. Please keep finalaudit.md claims and prior failures intact. |
…eader's language Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
The page spliced an English 'Doctor'/'Dentist' into English sentences (Add Doctor, No dentists yet, Primary doctor, …), which no language can translate. Each kind now has whole-sentence keys, read through k(name); the title, description, Whole Family, Save Changes, Add Insurance and upload toasts are keys too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
…ct-45d8k6 Main integrated this branch's PR585/598 work. Its side is kept wherever both touched the same thing: - route-feature-gate: main's isSuperAdmin(db), with 503 when the read fails; route-plan-gate.test.ts is main's copy, which pins that 503. - a-client-write-reads-what-it-changed, a-seeded-settings-row…: main's versions of the same translated assertions. - Catalogues: main's order and values (incl. its appNotFound wording) plus this branch's 540 keys main lacks; nothing of main's removed. - finalaudit.md: C1-S9-115…126 kept after main's entries. - Ratchet: main's 2650 lowered to 2349 by C1-S9-114…126. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T
24 files conflicted, nearly all where both sides translated the same module: - Assistant, concierge, finances, insurance, medical records, reminders, shopping, subscriptions and voice: main's burn-down (C1-S9-114…126) is kept, since it is the fuller version, with real plurals, category and frequency labels, and a greeting with no English fallback. Helpers of the port's that main's version replaces (the voice route labels) are removed. - The port's accessible names are carried onto main's lines: the food and planning "Open" links (with main's shrink-0 for P-12) and the trust module's emergency-kind select. - Tests take main's expectations; the reminder mock gains main's usePlural and keeps the port's parameters. - Catalogues: the union at 15,985 keys each, with main's wording where both sides carried a key. - i18n ratchet: both histories kept. The merged tree measures 1,922, banked as the ceiling. tsc clean. Lint: 0 errors, 15 warnings. 21,399 tests in 1,702 files pass in UTC. next build succeeds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DXw2nu25BjyRfA6Fg3YiMS
#587 was closed after #591 landed overlapping work. This branch has since merged main, taken main's side wherever both fixed the same thing, and removed its own duplicate register. What's left is only what main doesn't have. Each item has a guard that was checked red against the old code.
Fixes not on main
/admin/admins: Invite Admin opens a form that calls the existinginviteAdminAction./admin/support-tickets:createTicketAction./dashboard/sports,/dashboard/school: these now work:tests/a-button-does-something.test.ts.requireFeaturedoes. The route gate now uses main's equivalent from Page audit (every page on bubaly.com): calendar crash, hydration, layout, headings, admin gate + finalaudit ledger #585.Tooling
scripts/page-audit-crawl.mjs --locale de-DEflags English prose on pages rendered in German.scripts/page-audit-static.mjscounts hardcoded copy on each page.scripts/page-audit-register.mjschecks that main's Every page table has exactly one row perpage.tsx(C1-S9-107).Coordination
Every lane (A–F) is claimed by another session. My findings on their pages go in a hand-off table above the register rather than into their rows.
Checks
06cef776(typecheck, lint, unit, build, E2E, database, mobile).tsc,eslinton the changed files, and its module's and the i18n/catalogue suites.PRODUCTION READY stays NO.
🤖 Generated with Claude Code
https://claude.ai/code/session_01776xJyhVe8xJQvTGeNfT9T