Skip to content

Merge main into redesign and preserve current behavior (#691) - #1107

Merged
thomasluizon merged 36 commits into
redesign/mainfrom
fix/ticket-691-main-sync
Sep 26, 2026
Merged

thomasluizon merged 36 commits into
redesign/mainfrom
fix/ticket-691-main-sync

Conversation

@thomasluizon

@thomasluizon thomasluizon commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

Tracks thomasluizon/orbit-tickets#691.

This branch contains real merges of main into redesign/main. Current main and redesign/main are ancestors of the reviewed head. The release integration must fast-forward to this head to retain ancestry.

Main commit coverage

Main commit Behavior now present in redesign
75fe469d #977 Large screen Play warning fixes in apps/mobile/components/ui/centered-overlay-frame.ts and redesigned modal layouts, ported earlier by #979.
e5d4044f #971 Separate habit body and menu press targets in apps/mobile/components/habits/habit-row.tsx.
81f5d619 #972 Completed habit selection and visibility in apps/mobile/app/(tabs)/use-today-selection.ts and apps/mobile/hooks/use-habit-visibility.ts.
bb7e52df #973 Offline queue recovery in apps/mobile/lib/offline-mutations.ts, apps/mobile/hooks/use-offline.ts, and auth cleanup.
76e01034 #978 Redesigned offline notice, chat action chips, markdown, neutral theme, and backlog checks in apps/mobile/components/offline-notice.tsx, both chat components, and packages/shared/src/__tests__/backlog-port-source.test.ts.
c10a2ccd #976 Emoji suggestion in both create forms and their shared request coordinator, with mobile create form coverage.
adc070bc #974 Silent web refresh in apps/web/lib/session-refresh.ts, apps/web/lib/api-fetch.ts, and apps/web/stores/auth-store.ts.
a9558f7a #999 Stable editable row identity and input padding in both habit checklists; mobile regression tests cover moves and focused edits.
7771c79a #1011 Menu taps and keyboard persistence in mobile habit lists, including error and drill branches. Obsolete pre-redesign search code stays deleted.
38a09441 #1015 Android menu targets in apps/mobile/components/ui/menu.tsx and keyboard handling in habit lists.
959381da #1022 Reviewer fallback in .github/workflows/pullfrog.yml.
2809b017 #1041 Drill menus and completed sub-habits in apps/mobile/components/habit-list/habit-drill.tsx and apps/mobile/components/habit-list.tsx.
d7b5448f #1062 Dependabot and Actions changes in .github/workflows/dependabot-auto-merge.yml and other merged workflows.
e0d82c6e #1063 Dependency and query parsing fixes in package.json, package-lock.json, and apps/web/__tests__/setup.ts.
af2acf56 #1070 Patched CommonJS decoder in packages/decode-uri-component/ and root override.
1ea4baab #1057 Elapsed Android session recovery in mobile expiry and auth paths, previously ported by #994.
6d2468ca #1097 Pinned contract snapshot and drift checks in shared generated files and both workflows; redesign uses its branch-specific #1098 port.
e4698b8b #1099 Local web fonts in apps/web/app/fonts.ts, already ported by #1096; redundant Inter, Roboto, and Rubik files stay absent.
ffabad07 #1101 Merge output parsing without a broken pipe in .github/workflows/redesign-drift.yml.
a1ccc4e2 #1100 Supabase replay guard in mobile callback and auth flow, including cleanup on login and teardown; web port was already in redesign.
80cad0fd #1103 macOS path normalization in .claude/hooks/_lib/repo-roots.mjs, hook tests, and tools/__tests__/_harness.mjs.
de3c3d15 #1104 Isolated contract write token in the redesigned rebaseline workflow, already ported by #1098.

Conflict 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

  • Web checklist: 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.
  • Mobile auth: 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.
  • Mobile habit list: 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 with undefined instead of handled, then passed after the fix.
  • Mobile checklist: npm test --workspace @orbit/mobile -- __tests__/components/habits/habit-checklist.test.tsx failed two of three cases before the row key and padding port. All three passed after the fix.
  • The Supabase import made five React Native mocked suites fail at import with missing 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, and node .claude/hooks/test-hooks.mjs passed on the final head.
  • The redesign API pin and Orval 8.37.0 snapshot from Pin redesign API contract and enable rebaseline dispatch #1098 were retained. node tools/arch-map.mjs ran; 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 at dc8f3a84 because a React hook sat in packages/shared and reached the server Sentry config through the root barrel): the key reconciliation moved to a React-free packages/shared/src/hooks/checklist-item-keys-core.ts with its tests, and each app now carries a thin hooks/use-checklist-item-keys.ts. Behaviour is unchanged. The worker's run at d046a8d7 recorded 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-check exit 0, npm run build --workspace apps/web exit 0 (the red check), node tools/test-tools.mjs ORBIT TOOLS GATE OK (2,166 assertions), node .claude/hooks/test-hooks.mjs ORBIT HOOKS OK, and checklist-item-keys-core.test.ts 4/4. The UI sweep found no visual change in this commit (a module move).
    e7ed3896 (orchestrator): SonarCloud's quality gate failed at 61d8f12d on 3.3% duplicated new code (limit 3%). The duplicate is the web and mobile hooks/use-checklist-item-keys.ts pair, identical except for 'use client'; like the other parity hook pairs (use-tag-selection.ts, use-tags.ts and more), both are now in sonar.cpd.exclusions.

External interface evidence

Assumptions

  • main moved to 2db3f2e6 (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/main pin 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

  • execution lane: no findings
  • motion lane: not applicable; no changed animation
  • gates lane: no findings
  • interface-review: no findings
  • better-interface (full mode): no findings
  • design-reviewer: no findings
  • completeness-critic: no findings

Browser checks remain unverified because the work order forbids browser use.

Manual steps

None.

thomasluizon and others added 30 commits September 15, 2026 15:50
* 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
* fix: bound mobile offline sync retries (#552)

* fix: hydrate connectivity before offline replay (#552)

* fix: back off rejected offline flushes (#552)

* fix: settle offline retry timer failures (#552)

* fix: unify offline replay state (#552)

* fix: retain offline retry timer ownership (#552)
* chore: port reachable backlog fixes

* test: align backlog port coverage

* test: remove obsolete gradient assertion

* fix: resolve backlog port review findings
* 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>
* Fix linked worktree root matching on macOS

* Canonicalize tool fixture temp roots on macOS
# 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
@vercel

vercel Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
orbit-ui-mobile-web Ignored Ignored Sep 26, 2026 2:48am UTC

Request Review

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 main merges 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-component patch, 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.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using GPT Sol | 𝕏

Comment thread apps/web/components/habits/habit-checklist.tsx Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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.

Pullfrog  | View workflow run | Using GPT Sol | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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.

Pullfrog  | View workflow run | Using 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>

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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-keys adapters to sonar.cpd.exclusions, matching the existing treatment of explicit platform hook mirrors without changing runtime behavior.

Pullfrog  | View workflow run | Using GPT Sol | 𝕏

@pullfrog

pullfrog Bot commented Sep 25, 2026

Copy link
Copy Markdown

no API key found — this run used openai/gpt-6-sol, which needs OPENAI_API_KEY, but the runner has no key for it.

To fix: add the key as a GitHub Actions secret (referenced from your workflow's env: block) or as a Pullfrog secret in the console — or switch this repo to a different model (free models need no key).

Open repo secrets → · Configure model → · Setup docs → · Ask in Discord →

Pullfrog  | Rerun failed job ➔ | View workflow run | via Pullfrog | Using GPT Sol | 𝕏

@sonarqubecloud

Copy link
Copy Markdown

@thomasluizon

Copy link
Copy Markdown
Owner Author

@pullfrog review

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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.

Pullfrog  | View workflow run | Using GPT Sol | 𝕏

@thomasluizon
thomasluizon merged commit 4cc1f62 into redesign/main Sep 26, 2026
38 checks passed
@thomasluizon
thomasluizon deleted the fix/ticket-691-main-sync branch September 26, 2026 03:14
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.

1 participant