Repository navigation
chore: triage post-redesign backlog fixes (#554) - #978
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
There was a problem hiding this comment.
Caution
This PR can leave mobile offline changes permanently stranded and can resurrect pre-reset mutations after Fresh Start; the affected paths need correction before merge.
Reviewed changes Reviewed the complete 102-file diff that consolidates ten reachable backlog ports into the current main implementation.
- Offline delivery and recovery Adds single-owner flushing, capped backoff, auth cancellation, orphan expiry, persisted dropped-mutation notices, and retry/create recovery actions.
- Cross-platform visual cleanup Removes shipped gradients from web and mobile shell, celebration, upgrade, wrapped, onboarding, calendar, and share-card surfaces.
- Accessibility and interaction fixes Adds semantic markdown links, external-link handling, corrected status text roles, and a compliant goal-deadline clear icon.
- Runtime and shared behavior Stabilizes speech hydration and dnd-kit IDs, improves Astra action labels, adjusts button geometry, and expands no-overshoot lint coverage.
GPT Sol | 𝕏
…log-triage # Conflicts: # apps/mobile/__tests__/hooks/use-offline.test.tsx # apps/mobile/__tests__/lib/i18n-interpolation.test.ts # apps/mobile/__tests__/lib/offline-mutations.test.ts # apps/mobile/components/ui/app-toast.tsx # apps/mobile/hooks/use-offline.ts # apps/mobile/lib/offline-mutations.ts # apps/mobile/lib/providers.tsx # packages/shared/src/i18n/en.json # packages/shared/src/i18n/pt-BR.json
There was a problem hiding this comment.
✅ No new issues found.
The four findings from the prior review are addressed at this head: both mobile share-card bands use the semantic card surface, retained offline replay resumes after session recovery triggers, Fresh Start clears persisted recovery payloads, and web consumes the corrected status colors. Focused verification passed with 108 tests across 8 files plus the mobile type-check.
GPT Sol | 𝕏
|
* fix(mobile): clear Play large screen warnings (#977) * fix(mobile): support edge-to-edge large screens * test(mobile): assert Today content column exists * fix(mobile): isolate habit menu press target (#971) * 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 Today completed habit filtering (#547) (#972) * 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(mobile): preserve toast edge gap * fix: stop mobile offline sync spin (#552) (#973) * 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: triage post-redesign backlog fixes (#554) (#978) * 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 (#976) * 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(mobile): keep auth-stopped replay closed * fix(web): refresh sessions silently (#974) * 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 * test(web): cover session-aware action boundary * fix(web): route streak repair through the session boundary repairStreakGap came from the raw Server Action module and was unwrapped by hand, so a confirmed refresh rejection never reached the auth store. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(web): stop inner catches swallowing session refresh failures confirmApiKeyCreationChallenge and confirmDeletion caught every error before wrapServerAction could read sessionRefreshFailed. Both rethrow it now. The habit emoji selector also honours isDisabled on both platforms. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * test(mobile): await retry persistence report * test(mobile): await retry error without fake timers * test(mobile): stabilize retry error capture --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>




Closes thomasluizon/orbit-tickets#554
Summary
The live gate returned exactly 97 closed
repo:uiandBugtickets after the redesign fork cutoff. This PR ports every defect still reachable on main and records one terminal verdict for every result.The finishing contract requires exactly one non-draft PR, so all ten coherent ports are grouped here. No PORT item remains delayed.
Verdicts
Counts: PORT 10, GONE 14, REDESIGN 15, HARNESS 58. Total 97.
packages/shared/src/i18n/en.json| Main contains zero ICU plural expressions, so the Android ICU parser defect is absent.packages/shared/src/__tests__/theme.test.ts| Theme inventory snapshot stability is test infrastructure.apps/web/lighthouserc.json| The authed Today LCP noise band is a performance gate defect.apps/web/vitest.config.ts| Cold Chromium launch timing affects the test runner only..claude/hooks/require-wake-source.mjs| Wake-source registration ordering is worker orchestration.packages/shared/src/__tests__/theme.test.ts| Generated status-token inventory is guard coverage..claude/skills/sleep/SKILL.md| Sleep run-state transfer is an agent workflow concern.packages/shared/src/theme/neutral-ramp.ts:204| Main reused fill reds for text below 4.5:1; AA text variants now ship.apps/mobile/__tests__/scripts/widget-color-generator.test.ts| Fresh-worktree dirt and Windows generation are test harness defects.apps/mobile/components/goals/edit-goal-modal/edit-goal-deadline-field.tsx:46| Main's reachable deadline clear icon now uses the compliant foreground token.apps/web/app/(app)/progress/_components/progress-content.tsx| The fixed retrospective-window implementation named by the ticket is absent on main.apps/web/components/ui/field-input.tsx| The ticket targets redesigned Input and OTP primitives, not main's current controls..claude/skills/handoff/SKILL.md| Handoff pointer and delta conversion are agent workflow behavior.tools/lib/github-issues.mjs| Missing project cards affect ticket tooling.tools/check-suppressions-ratchet.mjs| Base selection affects the suppressions gate.tools/teardown-worktree.mjs| Worktree discovery is orchestration cleanup..claude/skills/orchestrate/SKILL.md| Stale worktree base selection is orchestration infrastructure.packages/shared/src/theme/button.ts:27| The shared medium button now uses an allowed 20px icon.eslint-rules/icon-size-grid.cjs| Tailwind icon-size detection is lint coverage.tools/compose-prompt.mjs| Red-first proof belongs to the worker contract..claude/playbooks/redesign-screen.md| Missing redesign step enforcement is workflow infrastructure.tools/record-readiness.mjs| Pullfrog readiness receipts are delivery automation.tools/compose-prompt.mjs| Architecture artifact instructions belong to the worker contract.tools/verify-delivery.mjs| Cross-repository ticket matching is delivery verification..claude/hooks/require-wake-source.mjs| PID reuse affects the sleep stop gate.apps/mobile/package.json| Main's Expo dependency set is aligned; the redesign SDK pin failure is absent.tools/lib/cloud-worker.mjs| Empty-diff cloud-worker readiness is orchestration behavior.tools/verify-delivery.mjs| Unprotected-base handling is delivery verification.tools/__tests__/cloud-worker.mjs| Scheduling-window assertions are worker harness tests.tools/__tests__/protected-route-redirect.mjs| Retired screenshot contracts are test tooling.packages/shared/src/theme/motion.ts| The shipped overshoot curve is removed andeslint-rules/no-overshoot-easing.cjs:19now catches numeric arrays.tools/lib/cloud-worker.mjs| Windows lock rename failures affect the tools harness..github/workflows/guards.yml| The retiring npm audit endpoint is a CI gate dependency.apps/web/app/globals.css| The undeclared radius-token set belongs to the rebuilt web theme surface.apps/web/components/upgrade/plan-selection.tsx| The requested upgrade-screen rebuild is redesign-owned.apps/mobile/components/ui/badge.tsx| Main's Badge does not read the undeclared redesign token.packages/shared/src/chat/action-labels.ts:51| Failed Astra actions now use failure copy and never invent an unknown success name.apps/web/components/ui/context-menu.tsx| The blocking row-menu implementation is part of the redesigned interaction model.apps/web/components/habits/habit-form-fields.tsx| The ticket requests a redesign-specific habit-form rebuild.apps/mobile/app/(tabs)/index.tsx| The shell chrome and NativeWind failures target the rebuilt mobile shell.apps/mobile/lib/theme.ts| The font migration belongs to the redesign typography system.apps/web/hooks/use-speech-to-text.ts:41| Browser speech support now uses a hydration-safe external-store snapshot.apps/web/app/(app)/today-page-view.tsx| Today and its global trial modal do not calluseSubscriptionPlanson main.apps/web/app/globals.css| The missing hover, scrim, and control tokens belong to the redesign token contract.apps/web/components/habits/habit-list.tsx:133| All three reachable dnd-kit contexts now receive stable React IDs.tools/lib/cloud-worker.mjs| Cloud task statuses and absence polling are orchestration concerns.packages/shared/src/theme/color-schemes.ts| The warm-orange grant belongs to the redesign theme palette..github/workflows/sonarcloud.yml| Branch analysis selection is CI configuration.packages/shared/src/__tests__/backlog-port-source.test.ts| Banned gradient washes are removed from shipped web and mobile surfaces, with a source gate.eslint-rules/icon-size-grid.cjs| Type-aware lint parity between CI and local runs is gate infrastructure..github/workflows/redesign-drift.yml| Workflow-scope propagation is CI automation.design/handoff/orbit/project/design-canvas.jsx| The accessible icon-only canvas contract is redesign authority, not shipped main code.design/handoff/orbit/project/design-canvas.jsx| This duplicate canvas Button contract remains redesign-owned..claude/hooks/forbid-raw-ticket-mutation.mjs| Raw ticket write interception is a tooling guard.tools/worker-watch.mjs| Finished-worker watchdog handling is orchestration.design/handoff/orbit/project/orbit-screens-chat.jsx| The requested offline behavior drawing belongs to redesign artifacts..claude/skills/orchestrate/SKILL.md| Unused Projects-board reads are orchestration overhead.packages/shared/src/chat/sse-stream.ts| Main strips streamed directives generically; the habits-only parser defect is absent.apps/web/components/ui/markdown.tsx:55| External web links now open safely, and both platforms use persistent accessible link styling.apps/mobile/lib/offline-mutations.ts:279| Queue replay now has capped backoff, auth cancellation, orphan expiry, persisted recovery, and deduplicated notices.apps/web/components/habits/description-viewer.tsx| Main's current description and chat surfaces already wrap unbroken text.tools/lib/github-issues.mjs| Re-reading every project item is ticket adapter behavior.apps/web/app/(app)/profile/_components/use-profile-screen.ts| Main has no social-tab URL state matching the reported implementation.apps/web/__tests__/lib/server-fetch.test.ts| Intermittent server-fetch assertions and cache masking are test defects.apps/web/lighthouserc.json| The authed Today TBT noise band is a performance gate issue..claude/skills/orchestrate/SKILL.md| Ignored branch mode affects worktree planning.tools/__tests__/plan-queue.mjs| The ineffective base assertion is harness coverage.tools/plan-queue.mjs| DAG planning is orchestration infrastructure.apps/web/components/habits/habit-list.tsx:541| Main's parent-completion path does not fire celebration for an incomplete child..claude/skills/orchestrate/SKILL.md| Independent current-head review is delivery policy..claude/hooks/orchestrator-guardrails.mjs| Raw repo-tool surfacing is a worker guard.apps/web/app/(app)/progress/_components/progress-content.tsx| The unbounded client read path named by the ticket is absent on main.tools/worker-watch.mjs| Detecting an early worker exit is orchestration.tools/check-ticket.mjs| The nonexistent parent field is a ticket-tool integration defect.tools/launch-worker.mjs| Parallel worktree admission is orchestration.tools/lib/run-state.mjs| Spend-ledger accounting is orchestration state.tools/lib/orchestrator-config.mjs| Worker model resolution is orchestration configuration.tools/worker-status.mjs| Worker readiness inference is orchestration.tools/compose-prompt.mjs| Draft PR rejection belongs to the worker contract.tools/teardown-worktree.mjs| Merged-commit teardown checks are delivery cleanup.tools/record-readiness.mjs| Current-head reviewer evidence is delivery automation.tools/merge-sweep.sh| Ticket-state reassertion at merge time is merge automation.tools/merge-sweep.sh| Sibling-merge branch adoption is merge automation.tools/pr-watch.mjs| Actionable transition tracking is PR monitoring.tools/nudge-worker.mjs| Stale terminal blocked reasons affect orchestration messaging.tools/worker-watch.mjs| Terminal handle display and retry behavior are orchestration.tools/compose-prompt.mjs| Worker delegation requirements belong to prompt infrastructure.tools/launch-worker.mjs| Prompt delivery and worker liveness are orchestration..claude/agents/design-reviewer.md| Stale gate names affect reviewer instructions.packages/shared/src/i18n/en.json| Main's privacy copy already names the processors and retention periods requested.apps/web/components/habits/habit-list.tsx:541| Main now derives skip progress, resets prompt state, and checks force-log completion.package.json| The mobile-only overrides are already folded into the root workspace configuration.apps/mobile/app| Later ticket evidence marks this an exact duplicate of redesign route-structure work.apps/web/lighthouserc.json| The flaky Today TBT budget is performance infrastructure.packages/shared/src/stores/ui-store.ts:180| Search query is outside the persisted slice and resets on main.apps/mobile/components/gamification/streak-badge.tsx| Later decision D69 explicitly removed the celebration and Today badge behavior.packages/shared/src/utils/engagement-slot.ts| Later ticket evidence folds this into redesign Today and upgrade work.Explicit exclusions
The live query did not include #552, #547, #548, #134, #550, or #553. They were excluded exactly as the work order requires.
Port delivery
CLAUDE.mdnow requires backporting shipping fixes.Test evidence
Observed before implementation:
Committed-state verification:
npm run type-check: 3 packages passed.npm run lintin web: 0 errors.npm run lintin mobile: 0 errors.npm test: 4 packages passed.node tools/arch-map.mjs: completed; generated artifacts remain uncommitted perAGENTS.md.Assumptions
The only assumption is PR grouping: the finishing contract requires exactly one PR, which overrides the work order's preference for multiple coherent PRs. No external response field was added or parsed by shipped code.