Repository navigation
Merge main into redesign and preserve current behavior (#691) - #1107
Conversation
* fix(mobile): support edge-to-edge large screens * test(mobile): assert Today content column exists
* fix(mobile): isolate habit menu press target * fix(mobile): preserve habit row press padding * test(mobile): cover habit row press behavior * test(mobile): assert habit row pressed state * fix(mobile): preserve select row press area
* fix: scope completed habits to selected day * fix: preserve completed general habits on today * test: cover completed general habit visibility * fix(mobile): restrict bulk selection to rendered habits * test(mobile): keep selection harness typed
* feat: suggest habit emoji without changing form * fix: isolate emoji suggestion pending state * fix: bind habit suggestions to form sessions * fix: invalidate habit suggestions on unmount * test: cover habit suggestion lifecycle * fix: use Astra marker for habit suggestions
* fix(web): refresh sessions silently * test(web): align refresh failure expectation * fix(web): preserve retryable refreshed sessions * fix(web): expose dedicated refresh failures * fix(web): propagate terminal refresh failures * test(web): exercise cross-instance refresh race * test(shared): lock session copy split * test(web): target wrapped account actions * fix(web): confirm terminal session state * fix(web): await session revalidation * fix(web): recover inverse refresh races * fix(web): recover successful server actions
* fix: keep habit controls responsive during search * test(mobile): fix today search test types * fix(web): close populated search in one press
* Fix mobile menu targets and search keyboard * Fix search keyboard dismissal lifecycle
…1022) * chore: pin Pullfrog reviewer to anthropic/claude-opus-5 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore: fall back to Claude only when the Codex reviewer step fails Codex stays the reviewer. The primary step keeps Pullfrog's own default model and now carries continue-on-error, so an exhausted OpenAI allowance no longer loses the review: a second step re-runs it on anthropic/claude-opus-5 only when the first step failed. Provider keys move from the step to the job so both steps read one list. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Fix anchored menus and drill child visibility * Recover menu triggers after native dialog dismissal * Fix overdue drill children on past dates * Preserve fresh drill detail while enriching visibility * Make offline retry reporting test await completion * Isolate offline persistence retry rejection * Use one Sentry mock for offline retry tests * Score a general drill child's completion for the selected date (#633) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* chore(ci): carry forward verified Actions updates from Dependabot * fix(ci): restore Dependabot security checks without auto merge
* fix: resolve dependency alerts on main * fix: keep Expo SDK checks and web tests passing * chore: keep only required transitive overrides * fix: restore Expo Router query parsing
* fix(mobile): recover elapsed Android sessions (#994) * fix(mobile): recover expired sessions * fix(mobile): show session refresh progress * fix(mobile): coordinate session recovery * fix(mobile): require a plan for onboarding login * fix(mobile): protect rotated sessions from stale teardown * fix(mobile): preserve recoverable refresh sessions * fix(mobile): make session transitions atomic * fix(mobile): guard every credential transition * fix(mobile): gate authentication on session setup * fix(mobile): finish session phase ownership * fix(mobile): separate session and credential versions * fix(mobile): fence auth teardown by credential version * fix(mobile): fence stale session continuations * test(mobile): prove the store produces superseded Round 14 split `unauthorized` into a real rejection and a lost session race, and covered every consumer of the new `superseded` outcome. Nothing covered the producer. Collapsing `auth-store.ts`'s one `superseded` return back to `unauthorized` left all four new tests green, because each one mocks `refreshSession` or drives a consumer of its result. The defect would have returned invisibly. This test drives the real path: a server refresh succeeds while a sign out lands mid-flight, so publication loses the epoch and the outcome must be `superseded`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(mobile): capture auth ownership at entry * fix(mobile): distinguish session teardown authority --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> (cherry picked from commit ce5ad59) * fix: fence stale logout completion after replacement login * fix: sequence web auth cookies and recover rejected mobile refresh * test: update web login mock for logout sequencing * fix(web): coordinate session cookie writes across tabs * Fence stale mobile refresh and login profile effects * Fence stale mobile login continuations and web session reads * fix(mobile): fence post-login effects to current session * fix(mobile): scope auth return URLs to login attempts * fix(mobile): preserve Google callback and return URL ownership * chore: re-baseline the contract snapshot on main (intervalWeeks, lastFreezeCoveredOrigin) orbit-api PR 539 added optional intervalWeeks to POST /api/habits/bulk and PR 540 added optional lastFreezeCoveredOrigin to both streak repair responses. Generated with orval 8.37.0, the version main's lockfile pins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Pin contract drift checks and automate rebaseline PRs * Retry pull request creation after interrupted rebaseline runs * fix: keep the write token out of install and generation in the rebaseline job (#668) npm ci runs install scripts and Orval runs generated code, so neither may see a repository write credential. Checkout no longer persists credentials, and GH_TOKEN plus the gh git credential helper exist only in the final commit, push and pull request step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: backport Supabase session replay protection to main * fix: keep the newer Google attempt when an old callback is rejected Only a callback that owns the stored attempt clears it; an expired or malformed marker is still cleared. This matches Android, which already returns before deleting on a mismatched attempt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # packages/shared/CONTRACT_DRIFT.md # tools/__tests__/_harness.mjs
…91-main-sync # Conflicts: # .github/workflows/contract-rebaseline.yml # .github/workflows/test.yml # packages/shared/CONTRACT_DRIFT.md # packages/shared/src/types/__generated__/api.generated.ts # packages/shared/src/types/__generated__/api.spec.commit
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
There was a problem hiding this comment.
Important
Editable checklist row identities can diverge from rolled-back checklist data after a failed update, moving focus or draft state to the wrong item.
Reviewed changes I reviewed the complete merge reconciliation through 26998e67, including its workflow, dependency, auth, mobile interaction, checklist identity, and regression-test behavior.
- Merge ancestry and conflict dispositions: Preserves the real
mainmerges while retaining redesign-owned screens, design-system files, generated contracts, and deleted legacy surfaces. - Mobile auth and input behavior: Carries Supabase replay cleanup, focused parent-value synchronization, scoped native test mocks, and keyboard tap persistence across normal and exceptional list states.
- Checklist identity: Adds parallel generated row keys on web and mobile for add, duplicate, remove, clear, and reorder operations, with focused-edit regression coverage.
- Dependency reconciliation: Retains the CommonJS
decode-uri-componentpatch, query-parser overrides, lockfile updates, and the Vitest patch release. - Automation and backlog guards: Brings in CodeQL, Dependabot approval, Pullfrog fallback, Actions updates, hook fixture corrections, and source-level design guards.
GPT Sol | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes I reviewed the checklist identity fix added since the prior Pullfrog review at 26998e67.
- Reconciled checklist identity: Added shared object, value, and positional reconciliation so row keys follow checklist items through optimistic updates, rollback, and refetch replacement.
- Simplified both platform editors: Removed independent web and mobile key bookkeeping in favor of the shared reconciler while preserving add, edit, duplicate, remove, clear, and reorder behavior.
- Covered rejected mutations: Added web and Android regressions that assert focused rows and mobile drafts stay attached through reorder and positional-removal rollbacks.
GPT Sol | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes I reviewed the build-boundary repair and base synchronization added since the prior Pullfrog review at dc8f3a84.
- Separated React from shared logic: Extracted checklist key state and reconciliation into a pure shared core, with equivalent app-local hooks owning React state and layout effects.
- Preserved rollback identity coverage: Added core-level cases for reorder rollback, positional-removal rollback, edits, and additions while the existing web and Android rollback suites remain green.
- Synchronized redesign ancestry: Merged the current
redesign/main; its handoff and spec updates are base-only, so the net incremental PR behavior remains the checklist module move.
GPT Sol | 𝕏
The web and mobile use-checklist-item-keys hooks are parity mirrors that differ only by 'use client', like the other excluded hook pairs; Sonar counted them as 3.3% duplicated new code on ui#1107. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes I reviewed the Sonar configuration update added since the prior Pullfrog review at 61d8f12d.
- Excluded intentional parity mirrors: Added the web and mobile
use-checklist-item-keysadapters tosonar.cpd.exclusions, matching the existing treatment of explicit platform hook mirrors without changing runtime behavior.
GPT Sol | 𝕏
|
no API key found — this run used To fix: add the key as a GitHub Actions secret (referenced from your workflow's Open repo secrets → · Configure model → · Setup docs → · Ask in Discord →
|
|
|
@pullfrog review |
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes I reviewed the full merge reconciliation at 4cc1f620, including the previously approved checklist repair and current base synchronization.
- Merge and automation: Preserves main ancestry while reconciling release, CodeQL, Dependabot, Pullfrog, SonarCloud, and hook workflows.
- Mobile behavior: Carries Supabase session cleanup, keyboard tap handling, controlled sheet input updates, and focused regression tests.
- Checklist identity: Shares reconciliation logic across web and mobile editors, with rollback and focused-row tests.
- Dependencies and guards: Carries the CommonJS URI decoder, updated lockfile, and backlog source checks.
GPT Sol | 𝕏




Tracks thomasluizon/orbit-tickets#691.
This branch contains real merges of
mainintoredesign/main. Currentmainandredesign/mainare ancestors of the reviewed head. The release integration must fast-forward to this head to retain ancestry.Main commit coverage
75fe469d#977apps/mobile/components/ui/centered-overlay-frame.tsand redesigned modal layouts, ported earlier by #979.e5d4044f#971apps/mobile/components/habits/habit-row.tsx.81f5d619#972apps/mobile/app/(tabs)/use-today-selection.tsandapps/mobile/hooks/use-habit-visibility.ts.bb7e52df#973apps/mobile/lib/offline-mutations.ts,apps/mobile/hooks/use-offline.ts, and auth cleanup.76e01034#978apps/mobile/components/offline-notice.tsx, both chat components, andpackages/shared/src/__tests__/backlog-port-source.test.ts.c10a2ccd#976adc070bc#974apps/web/lib/session-refresh.ts,apps/web/lib/api-fetch.ts, andapps/web/stores/auth-store.ts.a9558f7a#9997771c79a#101138a09441#1015apps/mobile/components/ui/menu.tsxand keyboard handling in habit lists.959381da#1022.github/workflows/pullfrog.yml.2809b017#1041apps/mobile/components/habit-list/habit-drill.tsxandapps/mobile/components/habit-list.tsx.d7b5448f#1062.github/workflows/dependabot-auto-merge.ymland other merged workflows.e0d82c6e#1063package.json,package-lock.json, andapps/web/__tests__/setup.ts.af2acf56#1070packages/decode-uri-component/and root override.1ea4baab#10576d2468ca#1097e4698b8b#1099apps/web/app/fonts.ts, already ported by #1096; redundant Inter, Roboto, and Rubik files stay absent.ffabad07#1101.github/workflows/redesign-drift.yml.a1ccc4e2#110080cad0fd#1103.claude/hooks/_lib/repo-roots.mjs, hook tests, andtools/__tests__/_harness.mjs.de3c3d15#1104Conflict dispositions
All 294 conflicted paths across three merges are listed below. Main behavior on deleted surfaces was ported to the current surfaces shown above.
Stayed deleted
apps/mobile/__tests__/app/upgrade-model.test.ts: stayed deleted.apps/mobile/__tests__/app/use-today-view-sync.test.ts: stayed deleted.apps/mobile/__tests__/components/bottom-sheet-modal.test.tsx: stayed deleted.apps/mobile/__tests__/components/gamification/streak-celebration.test.tsx: stayed deleted.apps/mobile/__tests__/screens/account-deletion.test.tsx: stayed deleted.apps/mobile/app/(tabs)/use-today-view-sync.ts: stayed deleted.apps/mobile/app/chat.styles.ts: stayed deleted.apps/mobile/app/retrospective.tsx: stayed deleted.apps/mobile/app/upgrade-model.ts: stayed deleted.apps/mobile/app/wrapped-player.tsx: stayed deleted.apps/mobile/components/bottom-sheet-modal.tsx: stayed deleted.apps/mobile/components/chat/chat-input-bar.tsx: stayed deleted.apps/mobile/components/gamification/achievement-toast.tsx: stayed deleted.apps/mobile/components/gamification/all-done-celebration.tsx: stayed deleted.apps/mobile/components/gamification/goal-completed-celebration.tsx: stayed deleted.apps/mobile/components/gamification/level-up-overlay.tsx: stayed deleted.apps/mobile/components/gamification/streak-celebration.tsx: stayed deleted.apps/mobile/components/gamification/streak-freeze-celebration.tsx: stayed deleted.apps/mobile/components/gamification/welcome-back-toast.tsx: stayed deleted.apps/mobile/components/goals/goal-detail-drawer/use-goal-progress-form-state.ts: stayed deleted.apps/mobile/components/goals/goals-view.tsx: stayed deleted.apps/mobile/components/habit-list/drill-view.tsx: stayed deleted.apps/mobile/components/today/today-habits-header.tsx: stayed deleted.apps/mobile/components/tour/tour-provider.tsx: stayed deleted.apps/mobile/components/ui/anchored-menu.tsx: stayed deleted.apps/mobile/components/ui/app-select.tsx: stayed deleted.apps/mobile/components/ui/app-time-picker.tsx: stayed deleted.apps/mobile/components/ui/confirm-dialog.tsx: stayed deleted.apps/mobile/components/ui/create-api-key-modal.tsx: stayed deleted.apps/mobile/components/ui/push-prompt.tsx: stayed deleted.apps/mobile/eslint-suppressions.json: stayed deleted.apps/web/__tests__/app/use-today-search.test.ts: stayed deleted.apps/web/__tests__/app/use-today-view-sync.test.tsx: stayed deleted.apps/web/__tests__/components/tour/tour-overlay.test.tsx: stayed deleted.apps/web/__tests__/components/ui/push-prompt.test.tsx: stayed deleted.apps/web/__tests__/pages/retrospective.test.tsx: stayed deleted.apps/web/app/(app)/profile/_components/profile-header-bar.tsx: stayed deleted.apps/web/app/(app)/retrospective/page.tsx: stayed deleted.apps/web/app/(app)/use-today-search.ts: stayed deleted.apps/web/app/(app)/use-today-view-sync.ts: stayed deleted.apps/web/app/(chat)/chat/page.tsx: stayed deleted.apps/web/components/gamification/all-done-celebration.tsx: stayed deleted.apps/web/components/gamification/goal-completed-celebration.tsx: stayed deleted.apps/web/components/gamification/level-up-overlay.tsx: stayed deleted.apps/web/components/gamification/streak-celebration.tsx: stayed deleted.apps/web/components/gamification/streak-freeze-celebration.tsx: stayed deleted.apps/web/components/shell/app-shell.tsx: stayed deleted.apps/web/components/shell/astra-copilot-rail.tsx: stayed deleted.apps/web/components/tour/tour-overlay.tsx: stayed deleted.apps/web/components/tour/tour-replay-modal.tsx: stayed deleted.apps/web/components/ui/app-overlay.tsx: stayed deleted.apps/web/components/ui/push-prompt.tsx: stayed deleted.apps/web/eslint-suppressions.json: stayed deleted.apps/web/hooks/use-summary.ts: stayed deleted.Kept redesign
.github/workflows/contract-rebaseline.yml: kept redesign..github/workflows/test.yml: kept redesign.DESIGN.md: kept redesign.apps/mobile/__tests__/app/(tabs)/profile/_components/fresh-start-modal.test.tsx: kept redesign.apps/mobile/__tests__/components/chat/action-chips.test.tsx: kept redesign.apps/mobile/__tests__/components/expiry-warning.test.tsx: kept redesign.apps/mobile/__tests__/components/habits/edit-habit-modal.test.tsx: kept redesign.apps/mobile/__tests__/components/habits/habit-form-fields.test.tsx: kept redesign.apps/mobile/__tests__/components/habits/habit-form-fields/habit-emoji-selector.test.tsx: kept redesign.apps/mobile/__tests__/components/habits/habit-list.test.tsx: kept redesign.apps/mobile/__tests__/components/habits/habit-row.test.tsx: kept redesign.apps/mobile/__tests__/components/navigation/bottom-tab-bar.test.tsx: kept redesign.apps/mobile/__tests__/components/offline-notice.test.tsx: kept redesign.apps/mobile/__tests__/components/onboarding/onboarding-flow.test.tsx: kept redesign.apps/mobile/__tests__/components/share/share-card.test.tsx: kept redesign.apps/mobile/__tests__/components/ui/markdown.test.tsx: kept redesign.apps/mobile/__tests__/hooks/use-drill-navigation.test.tsx: kept redesign.apps/mobile/__tests__/hooks/use-login-flow.test.ts: kept redesign.apps/mobile/__tests__/hooks/use-offline.test.tsx: kept redesign.apps/mobile/__tests__/hooks/use-today-selection.test.tsx: kept redesign.apps/mobile/__tests__/lib/auth-flow.test.ts: kept redesign.apps/mobile/__tests__/lib/google-auth-callback.test.ts: kept redesign.apps/mobile/__tests__/lib/google-auth.test.ts: kept redesign.apps/mobile/__tests__/lib/i18n-interpolation.test.ts: kept redesign.apps/mobile/__tests__/lib/offline-mutations.test.ts: kept redesign.apps/mobile/__tests__/lib/offline-state.test.ts: kept redesign.apps/mobile/__tests__/lib/theme.test.ts: kept redesign.apps/mobile/__tests__/screens/calendar-views.test.tsx: kept redesign.apps/mobile/__tests__/screens/today-screen.test.tsx: kept redesign.apps/mobile/__tests__/stores/app-toast-store.test.ts: kept redesign.apps/mobile/__tests__/stores/auth-store.test.ts: kept redesign.apps/mobile/__tests__/stores/offline-sync-store.test.ts: kept redesign.apps/mobile/__tests__/stores/ui-store.test.ts: kept redesign.apps/mobile/app/(tabs)/calendar.tsx: kept redesign.apps/mobile/app/(tabs)/index.tsx: kept redesign.apps/mobile/app/(tabs)/profile.tsx: kept redesign.apps/mobile/app/(tabs)/profile/_components/delete-account-modal.tsx: kept redesign.apps/mobile/app/(tabs)/profile/_components/fresh-start-modal.tsx: kept redesign.apps/mobile/app/(tabs)/use-today-date.ts: kept redesign.apps/mobile/app/(tabs)/use-today-selection.ts: kept redesign.apps/mobile/app/_layout.tsx: kept redesign.apps/mobile/app/auth-callback.tsx: kept redesign.apps/mobile/app/chat.tsx: kept redesign.apps/mobile/app/login.tsx: kept redesign.apps/mobile/app/upgrade.tsx: kept redesign.apps/mobile/app/use-login-flow.ts: kept redesign.apps/mobile/components/chat/action-chips.tsx: kept redesign.apps/mobile/components/goals/edit-goal-modal.tsx: kept redesign.apps/mobile/components/habits/create-habit-modal.tsx: kept redesign.apps/mobile/components/habits/create-habit-modal/apply-suggestion.ts: kept redesign.apps/mobile/components/habits/edit-habit-modal.tsx: kept redesign.apps/mobile/components/habits/habit-form-fields.tsx: kept redesign.apps/mobile/components/habits/habit-form-fields/habit-emoji-selector.tsx: kept redesign.apps/mobile/components/habits/habit-row-trailing.tsx: kept redesign.apps/mobile/components/habits/habit-row.tsx: kept redesign.apps/mobile/components/milestone-share/milestone-share-card.tsx: kept redesign.apps/mobile/components/navigation/bottom-tab-bar.tsx: kept redesign.apps/mobile/components/offline-notice.tsx: kept redesign.apps/mobile/components/onboarding/onboarding-flow.tsx: kept redesign.apps/mobile/components/referral/referral-drawer.tsx: kept redesign.apps/mobile/components/share/share-card.tsx: kept redesign.apps/mobile/components/ui/app-toast.tsx: kept redesign.apps/mobile/components/ui/date-field.tsx: kept redesign.apps/mobile/components/ui/expiry-warning.tsx: kept redesign.apps/mobile/components/ui/markdown.tsx: kept redesign.apps/mobile/components/ui/status-dot.tsx: kept redesign.apps/mobile/components/ui/trial-expired-modal.tsx: kept redesign.apps/mobile/eslint.config.js: kept redesign.apps/mobile/hooks/use-drill-navigation.ts: kept redesign.apps/mobile/hooks/use-logout.ts: kept redesign.apps/mobile/hooks/use-offline.ts: kept redesign.apps/mobile/lib/api-client.ts: kept redesign.apps/mobile/lib/auth-flow.ts: kept redesign.apps/mobile/lib/google-auth-callback.ts: kept redesign.apps/mobile/lib/google-auth.ts: kept redesign.apps/mobile/lib/offline-mutations.ts: kept redesign.apps/mobile/lib/offline-recovery.ts: kept redesign.apps/mobile/lib/providers.tsx: kept redesign.apps/mobile/lib/theme.ts: kept redesign.apps/mobile/package.json: kept redesign.apps/mobile/stores/app-toast-store.ts: kept redesign.apps/mobile/stores/auth-store.ts: kept redesign.apps/mobile/stores/offline-sync-store.ts: kept redesign.apps/mobile/test-mocks/react-native.ts: kept redesign.apps/mobile/test-setup.ts: kept redesign.apps/web/__tests__/actions/auth.test.ts: kept redesign.apps/web/__tests__/actions/habits.test.ts: kept redesign.apps/web/__tests__/actions/profile.test.ts: kept redesign.apps/web/__tests__/app/api/auth-session-route.test.ts: kept redesign.apps/web/__tests__/app/api/chat-stream-route.test.ts: kept redesign.apps/web/__tests__/app/api/subscriptions-checkout-route.test.ts: kept redesign.apps/web/__tests__/app/fonts.test.ts: kept redesign.apps/web/__tests__/components/calendar/calendar-day-detail.test.tsx: kept redesign.apps/web/__tests__/components/calendar/calendar-page-view-switcher.test.tsx: kept redesign.apps/web/__tests__/components/chat/action-chips.test.tsx: kept redesign.apps/web/__tests__/components/habits/create-habit-modal.test.tsx: kept redesign.apps/web/__tests__/components/habits/edit-habit-modal.test.tsx: kept redesign.apps/web/__tests__/components/habits/habit-form-fields.test.tsx: kept redesign.apps/web/__tests__/components/habits/habit-list.test.tsx: kept redesign.apps/web/__tests__/components/preferences/use-preference-controls.test.ts: kept redesign.apps/web/__tests__/components/profile/delete-account-modal.test.tsx: kept redesign.apps/web/__tests__/components/shell/shell-hydration.test.tsx: kept redesign.apps/web/__tests__/components/ui/markdown.test.tsx: kept redesign.apps/web/__tests__/hooks/use-chat-composer.test.tsx: kept redesign.apps/web/__tests__/hooks/use-color-scheme.test.ts: kept redesign.apps/web/__tests__/hooks/use-drill-navigation.test.ts: kept redesign.apps/web/__tests__/hooks/use-goals.test.ts: kept redesign.apps/web/__tests__/hooks/use-habits.test.ts: kept redesign.apps/web/__tests__/hooks/use-login-flow.test.ts: kept redesign.apps/web/__tests__/hooks/use-notifications.test.ts: kept redesign.apps/web/__tests__/hooks/use-onboarding-flush.test.tsx: kept redesign.apps/web/__tests__/hooks/use-retained-onboarding-guard.test.ts: kept redesign.apps/web/__tests__/lib/auth-api.test.ts: kept redesign.apps/web/__tests__/lib/server-fetch.test.ts: kept redesign.apps/web/__tests__/lib/session-refresh-recovery.test.tsx: kept redesign.apps/web/__tests__/pages/auth-callback-account-replacement.test.tsx: kept redesign.apps/web/__tests__/pages/auth-callback.test.tsx: kept redesign.apps/web/__tests__/pages/calendar-sync.test.tsx: kept redesign.apps/web/__tests__/pages/error.test.tsx: kept redesign.apps/web/__tests__/pages/upgrade.test.tsx: kept redesign.apps/web/__tests__/proxy.test.ts: kept redesign.apps/web/__tests__/stores/auth-store.test.ts: kept redesign.apps/web/__tests__/stores/ui-store.test.ts: kept redesign.apps/web/app/(app)/ai-settings/page.tsx: kept redesign.apps/web/app/(app)/calendar-sync/_components/connect-google.ts: kept redesign.apps/web/app/(app)/calendar/page.tsx: kept redesign.apps/web/app/(app)/layout.tsx: kept redesign.apps/web/app/(app)/preferences/_components/marketing-consent-section.tsx: kept redesign.apps/web/app/(app)/preferences/_components/use-preference-controls.ts: kept redesign.apps/web/app/(app)/profile/_components/delete-account-modal.tsx: kept redesign.apps/web/app/(app)/profile/_components/edit-name-sheet.tsx: kept redesign.apps/web/app/(app)/profile/_components/fresh-start-modal.tsx: kept redesign.apps/web/app/(app)/profile/_components/use-data-export.ts: kept redesign.apps/web/app/(app)/support/page.tsx: kept redesign.apps/web/app/(app)/today-page-view.tsx: kept redesign.apps/web/app/(app)/today-shell.tsx: kept redesign.apps/web/app/(app)/upgrade/page.tsx: kept redesign.apps/web/app/(app)/use-today-page.tsx: kept redesign.apps/web/app/(auth)/auth-callback/page.tsx: kept redesign.apps/web/app/(auth)/layout.tsx: kept redesign.apps/web/app/(auth)/login/login-form-helpers.ts: kept redesign.apps/web/app/(auth)/login/use-login-flow.ts: kept redesign.apps/web/app/actions/action-result.ts: kept redesign.apps/web/app/actions/api-keys.ts: kept redesign.apps/web/app/actions/auth.ts: kept redesign.apps/web/app/actions/calendar.ts: kept redesign.apps/web/app/actions/chat.ts: kept redesign.apps/web/app/actions/checklist-templates.ts: kept redesign.apps/web/app/actions/gamification.ts: kept redesign.apps/web/app/actions/goals.ts: kept redesign.apps/web/app/actions/habits.ts: kept redesign.apps/web/app/actions/notifications.ts: kept redesign.apps/web/app/actions/onboarding.ts: kept redesign.apps/web/app/actions/profile.ts: kept redesign.apps/web/app/actions/subscription.ts: kept redesign.apps/web/app/actions/support.ts: kept redesign.apps/web/app/actions/tags.ts: kept redesign.apps/web/app/actions/uploads.ts: kept redesign.apps/web/app/api/[...path]/route.ts: kept redesign.apps/web/app/api/auth/session/route.ts: kept redesign.apps/web/app/api/chat/stream/route.ts: kept redesign.apps/web/app/api/subscriptions/checkout/route.ts: kept redesign.apps/web/app/fonts.ts: kept redesign.apps/web/app/global-error.tsx: kept redesign.apps/web/app/globals.css: kept redesign.apps/web/app/layout.tsx: kept redesign.apps/web/components/calendar/calendar-agenda-view.tsx: kept redesign.apps/web/components/calendar/calendar-day-detail.tsx: kept redesign.apps/web/components/calendar/calendar-time-grid.tsx: kept redesign.apps/web/components/chat/action-chips.tsx: kept redesign.apps/web/components/habits/create-habit-modal.tsx: kept redesign.apps/web/components/habits/create-habit-modal/apply-suggestion.ts: kept redesign.apps/web/components/habits/edit-habit-modal.tsx: kept redesign.apps/web/components/habits/habit-form-fields.tsx: kept redesign.apps/web/components/habits/habit-form-fields/habit-emoji-selector.tsx: kept redesign.apps/web/components/habits/habit-list.tsx: kept redesign.apps/web/components/marketing-consent/marketing-consent-prompt.tsx: kept redesign.apps/web/components/milestone-share/milestone-share-card.tsx: kept redesign.apps/web/components/onboarding/onboarding-actions-context.tsx: kept redesign.apps/web/components/onboarding/onboarding-flow.tsx: kept redesign.apps/web/components/share/share-card.tsx: kept redesign.apps/web/components/ui/markdown.tsx: kept redesign.apps/web/components/ui/status-dot.tsx: kept redesign.apps/web/eslint.config.mjs: kept redesign.apps/web/hooks/use-api-key-management.ts: kept redesign.apps/web/hooks/use-billing.ts: kept redesign.apps/web/hooks/use-calendar-data.ts: kept redesign.apps/web/hooks/use-calendar-events.ts: kept redesign.apps/web/hooks/use-calendars.ts: kept redesign.apps/web/hooks/use-chat-composer.ts: kept redesign.apps/web/hooks/use-chat-pending-operations.ts: kept redesign.apps/web/hooks/use-checklist-templates.ts: kept redesign.apps/web/hooks/use-config.ts: kept redesign.apps/web/hooks/use-drill-navigation.ts: kept redesign.apps/web/hooks/use-gamification.ts: kept redesign.apps/web/hooks/use-goals.ts: kept redesign.apps/web/hooks/use-habit-suggestion.ts: kept redesign.apps/web/hooks/use-notifications.ts: kept redesign.apps/web/hooks/use-onboarding-flush.ts: kept redesign.apps/web/hooks/use-push-notification-preferences.ts: kept redesign.apps/web/hooks/use-reschedule-suggestion.ts: kept redesign.apps/web/hooks/use-resolve-clarification.ts: kept redesign.apps/web/hooks/use-retained-onboarding-guard.ts: kept redesign.apps/web/hooks/use-retrospective.ts: kept redesign.apps/web/hooks/use-speech-to-text.ts: kept redesign.apps/web/hooks/use-tags.ts: kept redesign.apps/web/hooks/use-timezone-auto-sync.ts: kept redesign.apps/web/lib/actions/api-keys.ts: kept redesign.apps/web/lib/actions/gamification.ts: kept redesign.apps/web/lib/actions/profile.ts: kept redesign.apps/web/lib/api-fetch.ts: kept redesign.apps/web/lib/google-auth-session.ts: kept redesign.apps/web/lib/profile-presentation.ts: kept redesign.apps/web/lib/upload-file.ts: kept redesign.apps/web/proxy.ts: kept redesign.apps/web/stores/auth-store.ts: kept redesign.eslint-rules/__tests__/rules.test.mjs: kept redesign.eslint-rules/no-overshoot-easing.cjs: kept redesign.packages/shared/CONTRACT_DRIFT.md: kept redesign.packages/shared/package.json: kept redesign.packages/shared/src/__tests__/drill-navigation.test.ts: kept redesign.packages/shared/src/__tests__/i18n.test.ts: kept redesign.packages/shared/src/__tests__/motion.test.ts: kept redesign.packages/shared/src/__tests__/theme-button.test.ts: kept redesign.packages/shared/src/__tests__/theme.test.ts: kept redesign.packages/shared/src/hooks/index.ts: kept redesign.packages/shared/src/i18n/en.json: kept redesign.packages/shared/src/i18n/pt-BR.json: kept redesign.packages/shared/src/theme/button.ts: kept redesign.packages/shared/src/theme/color-schemes.ts: kept redesign.packages/shared/src/theme/neutral-ramp.ts: kept redesign.packages/shared/src/theme/types.ts: kept redesign.packages/shared/src/types/__generated__/api.generated.ts: kept redesign.packages/shared/src/types/__generated__/api.spec.commit: kept redesign.packages/shared/src/utils/drill-navigation.ts: kept redesign.packages/shared/src/utils/habit-visibility.ts: kept redesign.tools/__tests__/_harness.mjs: kept redesign.Carried main behavior
apps/mobile/components/habits/habit-checklist.tsx: Carried main row identity and input spacing into the redesigned editor.apps/web/components/habits/habit-checklist.tsx: Carried stable row identity into the web editor for platform parity.package-lock.json: Carried main dependency fixes into the regenerated merged lockfile.Test evidence
npm test --workspace @orbit/web -- __tests__/components/habits/habit-checklist.test.tsx -t 'removes an item on delete click'passed with the defect.npm test --workspace @orbit/web -- __tests__/components/habits/habit-checklist.test.tsx -t 'keeps focus on the same row when an earlier item is removed'failed because React replaced the focused row, then passed after the fix. The full file passed 28 tests.npm test --workspace @orbit/mobile -- __tests__/stores/auth-store.test.ts -t 'deletes the pending OAuth attempt when another account signs in'passed unchanged with cleanup absent. The strengthened test failed with zero cleanup calls, then passed after the fix. The full auth store file passed 61 tests.npm test --workspace @orbit/mobile -- __tests__/components/habits/habit-list.test.tsx -t 'uses plain lists for all view and drill view'passed unchanged with drill keyboard handling absent. The strengthened test failed withundefinedinstead ofhandled, then passed after the fix.npm test --workspace @orbit/mobile -- __tests__/components/habits/habit-checklist.test.tsxfailed two of three cases before the row key and padding port. All three passed after the fix.NativeModules. Scoped mocks restored 75 focused tests; the direct Supabase and auth store tests still cover cleanup.npm run lint,npm run type-check,npm test,node tools/test-tools.mjs, andnode .claude/hooks/test-hooks.mjspassed on the final head.node tools/arch-map.mjsran; its ignored artifacts remain uncommitted under test(shared): cover goal/habit form validation boundaries #470.Before the fix, unchanged checklist suites passed: web 28/28 and mobile 3/3.
The strengthened rollback tests then failed on both platforms: 2 failures each.
After the fix, focused suites passed: web 30/30 and mobile 5/5.
Full suites passed: web 3497, mobile 2980, shared 2197. Lint, type check, tool harness, and hook harness passed.
Round 2 (
d046a8d7, Build was red atdc8f3a84because a React hook sat inpackages/sharedand reached the server Sentry config through the root barrel): the key reconciliation moved to a React-freepackages/shared/src/hooks/checklist-item-keys-core.tswith its tests, and each app now carries a thinhooks/use-checklist-item-keys.ts. Behaviour is unchanged. The worker's run atd046a8d7recorded lint 0 errors, type-check OK, web 3,497, mobile 2,980, shared 2,201 and hooks OK before it was killed with its session. The orchestrator then re-ran on the same head:npm run type-checkexit 0,npm run build --workspace apps/webexit 0 (the red check),node tools/test-tools.mjsORBIT TOOLS GATE OK (2,166 assertions),node .claude/hooks/test-hooks.mjsORBIT HOOKS OK, andchecklist-item-keys-core.test.ts4/4. The UI sweep found no visual change in this commit (a module move).e7ed3896(orchestrator): SonarCloud's quality gate failed at61d8f12don 3.3% duplicated new code (limit 3%). The duplicate is the web and mobilehooks/use-checklist-item-keys.tspair, identical except for'use client'; like the other parity hook pairs (use-tag-selection.ts,use-tags.tsand more), both are now insonar.cpd.exclusions.External interface evidence
signOut({ scope: 'local' })interface proved in Fix Supabase session replay on main (#631) #1100 and Fix Supabase session replay across web and mobile #1066. The installed source locations are@supabase/supabase-js/dist/index.cjs:631-635and@supabase/auth-js/dist/main/GoTrueClient.js:3398-3431.FlatListprop accepts"handled"in the installedreact-native/Libraries/Lists/FlatList.d.ts:36andScrollView.js:1454.git ls-remotestatus andgh pr listresponse already proved in Pin API contract checks and automate rebaseline reviews #1097 and Pin redesign API contract and enable rebaseline dispatch #1098. This merge adds no new parsed external fields.Assumptions
mainmoved to2db3f2e6(Backport ticket admission and CI waiting to main #1105, the admission gate backport) during round 2. It is not merged here: ticket fix: restore parent prompts after subhabit resolution (ORB-86) #692 is the conflict resolution for that commit and runs after this sync lands, per its sequencing comment.Kept the redesign design system and deleted legacy screens; rejected restoring main copies of those surfaces.
Kept the orbit-api
redesign/mainpin and snapshot; rejected the separate main API pin for this branch.Kept Orval 8.37.0 from Pin redesign API contract and enable rebaseline dispatch #1098 in the redesign workflow; rejected changing its generator during this merge.
Retained the three real merge commits; rejected cherry-picking because it would not close ancestry drift.
Rollback restores prior item objects, as both mutation hooks restore snapshots. Positional key matching alone was rejected.
Review harness
Browser checks remain unverified because the work order forbids browser use.
Manual steps
None.