Skip to content

feat(ios): modernize navigation and settings#98811

Merged
steipete merged 7 commits into
mainfrom
codex/ios-interface-cleanup
Jul 2, 2026
Merged

feat(ios): modernize navigation and settings#98811
steipete merged 7 commits into
mainfrom
codex/ios-interface-cleanup

Conversation

@steipete

@steipete steipete commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Closes #98803

AI-assisted: Codex implemented, simulator-tested, live-tested, and reviewed this maintainer-requested iOS design pass.

What Problem This Solves

The iOS Control, Agent, and Settings roots still mixed custom cards, repeated labels, duplicate destinations, nested segmented controls, and inconsistent custom/native navigation. The result was visually dense, used space inefficiently, and could change header behavior when opening the iPad drawer.

Why This Change Was Made

This replaces the three primary roots with native inset-grouped lists, system large-title navigation, search, and toolbar menus. Appearance and agent-status filtering move out of content cells into standard toolbar menus; Control removes destinations already present in the tab bar; and phone versus iPad navigation chrome is now an explicit contract rather than inferred from whether a sidebar action happens to exist. Liquid Glass remains reserved for compact interactive controls instead of becoming decorative card chrome.

User Impact

  • Control presents the connected Gateway and actionable destinations without repeating Chat, Talk, or Agent.
  • Agent rows are shorter and easier to scan, with repeated product/runtime labels removed and status filtering in the toolbar.
  • Settings uses native sections and navigation links; Appearance is a compact toolbar menu with a visible selected state.
  • Overview retains a direct Gateway shortcut while using the standard system back affordance.
  • iPad detail headers remain stable when the drawer is opened.
  • Dynamic Type, accessibility identifiers, search, persisted appearance selection, Gateway routing, and existing destinations remain intact.

Evidence

  • iPhone 17 Pro simulator, iOS 26.0, production app build: passed.
  • All OpenClawLogicTests: passed.
  • Focused UI tests passed: testControlOverviewNavigation, testAppearanceUsesToolbarMenu, and testAgentUsesToolbarFilter.
  • Ten-view light/dark snapshot run passed and attached Control, Agent, Settings, Chat, and Talk captures.
  • testLiveGatewayControlOverviewNavigation: passed against a real local OpenClaw Gateway using short-lived setup-code pairing; Control loaded live state and Overview opened end to end.
  • pnpm native:i18n:sync && pnpm native:i18n:check: passed; generated inventory stable.
  • git diff --check: passed.
  • Fresh structured Codex autoreview: clean, no accepted/actionable findings (0.90 confidence).
  • Source-blind behavior validation: all navigation, menu, live-data, and iPad-chrome contract clauses satisfied; no anti-cheat or behavioral findings.

Light appearance

Matched iPhone fixture captures from the pre-change main baseline and this exact commit.

Surface Before After
Control Before: Control uses stacked custom cards and repeats tab destinations After: Control uses a native inset list with a compact Gateway row and focused destinations
Agent Before: Agent uses dense custom cards with repeated product and runtime labels After: Agent uses compact native rows, search, and a toolbar filter
Settings Before: Settings nests Appearance in a large segmented-control card After: Settings uses native sections and moves Appearance to the toolbar
Dark appearance comparison
Surface Before After
Control Before: dense Control cards in dark appearance After: native Control list in dark appearance
Agent Before: dense Agent cards in dark appearance After: compact Agent list in dark appearance
Settings Before: nested Settings cards in dark appearance After: native Settings sections in dark appearance

Standard controls

Agent filter Appearance menu
Agent status filter presented as a toolbar menu Appearance options presented as a toolbar menu with the current value checked

Live Gateway proof

Connected Control Overview navigation
Redacted simulator capture of Control connected to a real local Gateway Overview opened end to end with standard navigation and the Gateway toolbar shortcut

@steipete steipete self-assigned this Jul 2, 2026
@openclaw-barnacle openclaw-barnacle Bot added app: ios App: ios size: XL maintainer Maintainer-authored PR labels Jul 2, 2026
…leanup

# Conflicts:
#	apps/ios/UITests/OpenClawSnapshotUITests.swift
@clawsweeper

clawsweeper Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed July 1, 2026, 9:38 PM ET / 01:38 UTC.

Summary
The PR replaces the iOS Control, Agent, and Settings roots with native list/navigation/menu patterns, updates focused iOS tests, and refreshes native i18n inventory.

PR surface: Tests 0, Other +47. Total +47 across 19 files.

Reproducibility: yes. for the blocking finding: source inspection shows standalone CommandCenterTab can push CommandSessionsScreen with usesNativeNavigationChrome false, and that destination hides the native navigation bar with no custom back action. I did not run a simulator in this read-only review.

Review metrics: 1 noteworthy metric.

  • Navigation chrome mode: 1 new boolean mode propagated to 6 destination surfaces. The new mode controls native toolbar/back visibility, and the remaining defect comes from propagating the standalone false value into a pushed Sessions screen.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #98803
Summary: This PR is the candidate implementation for the linked iOS navigation and settings hierarchy feature request; the other related PRs are adjacent merged design passes, not replacements.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P2] Fix or prove the standalone View More to Sessions back path when openSessions is nil and more than three recent sessions exist.
  • [P2] Get maintainer visual/product acceptance for the primary iOS Control, Agent, and Settings hierarchy before merge.

Mantis proof suggestion
A real visual proof pass would help maintainers verify the repaired Sessions back path and compare the primary iOS hierarchy before merge. A maintainer can ask Mantis to capture proof by posting this exact PR comment:

@openclaw-mantis visual task: verify iOS Control View More opens Sessions with a working back path, and capture Control, Agent, and Settings after the hierarchy update.

Risk before merge

  • [P1] Standalone CommandCenterTab users with more than three recent sessions can still be stranded after tapping View More because the pushed Sessions screen has neither native Back chrome nor a custom leading action.
  • [P1] Even after the back-path repair, the primary Control, Agent, and Settings hierarchy is a protected product/design decision because the PR has the maintainer label and closes the linked maintainer-reviewed feature request.
  • [P1] maintainerCanModify is false, so a direct maintainer or automation push to the contributor branch is not available if the author does not make the repair.

Maintainer options:

  1. Fix the Sessions back path before merge (recommended)
    Keep native Back chrome or provide an explicit custom back control when standalone View More pushes CommandSessionsScreen, then rerun focused proof for that route.
  2. Accept the hierarchy after owner review
    After the back-path fix, maintainers can accept the native List/Menu hierarchy if the visual direction matches the intended iOS product experience.
  3. Pause if the hierarchy is not accepted
    If maintainers do not want this Control, Agent, and Settings hierarchy, pause or close the branch instead of merging partial visual churn.

Next step before merge

  • [P2] The concrete repair is small, but the protected maintainer label, uneditable contributor branch, and product/design acceptance gate make this author or maintainer-review work rather than a new autonomous repair lane.

Security
Cleared: The diff is limited to SwiftUI UI, iOS tests, and generated native i18n inventory; no dependency, CI, secret, permission, or code-execution surface change was found.

Review findings

  • [P2] Preserve a back path for standalone sessions — apps/ios/Sources/Design/CommandCenterTab.swift:261
Review details

Best possible solution:

Preserve a visible back path for every Sessions push path, then have the iOS owner/design reviewer decide whether the native Control, Agent, and Settings hierarchy should land.

Do we have a high-confidence way to reproduce the issue?

Yes for the blocking finding: source inspection shows standalone CommandCenterTab can push CommandSessionsScreen with usesNativeNavigationChrome false, and that destination hides the native navigation bar with no custom back action. I did not run a simulator in this read-only review.

Is this the best way to solve the issue?

No as submitted: the native SwiftUI List/Menu direction is plausible for the linked feature, but the branch is not the best merge shape until the Sessions back path is preserved and maintainers accept the visual hierarchy.

Full review comments:

  • [P2] Preserve a back path for standalone sessions — apps/ios/Sources/Design/CommandCenterTab.swift:261
    When standalone CommandCenterTab has more than three recent sessions, View More still pushes CommandSessionsScreen with usesNativeNavigationChrome: self.usesNativeNavigationChrome, which is false by default. That destination then hides the native navigation bar and has no custom leading action, so users can enter Sessions without a visible way back.
    Confidence: 0.9

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 080481fec95a.

Label changes

Label justifications:

  • P3: This is low-risk iOS UI polish with limited blast radius, not urgent runtime, security, data-loss, or channel-delivery work.
  • merge-risk: 🚨 other: Merging as-is can leave a user-visible iOS navigation path without a back control, which green CI does not fully settle.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (screenshot): The PR body includes simulator and live Gateway screenshots, and sampled PNGs directly show the changed iOS surfaces; the remaining Sessions edge case still needs proof after repair.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes simulator and live Gateway screenshots, and sampled PNGs directly show the changed iOS surfaces; the remaining Sessions edge case still needs proof after repair.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The PR body includes simulator and live Gateway screenshots, and sampled PNGs directly show the changed iOS surfaces; the remaining Sessions edge case still needs proof after repair.
Evidence reviewed

PR surface:

Tests 0, Other +47. Total +47 across 19 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 1 3 3 0
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 18 792 745 +47
Total 19 795 748 +47

What I checked:

  • Repository policy read: Root and scoped iOS AGENTS.md files were read fully; the review applied the whole-path review, protected-label, proof, and iOS guidance. (AGENTS.md:1, 080481fec95a)
  • Live PR state: Live GitHub data shows the PR is open, labeled maintainer/P3/proof sufficient/merge-risk other, maintainerCanModify is false, and latest head is 281bc84. (281bc84986ed)
  • Current main does not already contain the PR: The PR head is not contained in current main, so this is not implemented on main. (080481fec95a)
  • Current main target behavior: Current main still hides the CommandCenter native navigation bar in the standalone overview path, matching the area the PR changes. (apps/ios/Sources/Design/CommandCenterTab.swift:86, 080481fec95a)
  • PR head standalone Sessions path: At PR head, standalone View More still passes self.usesNativeNavigationChrome into CommandSessionsScreen; the default standalone value is false. (apps/ios/Sources/Design/CommandCenterTab.swift:261, 281bc84986ed)
  • PR head hides Sessions native chrome: CommandSessionsScreen hides the navigation bar when usesNativeNavigationChrome is false, and its custom header only shows a leading control when headerLeadingAction is provided. (apps/ios/Sources/Design/CommandCenterTab.swift:648, 281bc84986ed)

Likely related people:

  • steipete: Authored the merged adjacent iOS 26 redesign and Talk/Settings polish PRs that current main builds on, and authored this PR's iOS hierarchy branch beyond merely proposing it. (role: recent iOS redesign contributor; confidence: high; commits: 8502ef6c598b, 3e50f41dd6ea, 97d396a4d668; files: apps/ios/Sources/Design/CommandCenterTab.swift, apps/ios/Sources/Design/SettingsProTabSections.swift, apps/ios/UITests/OpenClawSnapshotUITests.swift)
  • mbelinky: CONTRIBUTING.md lists this handle for the iOS app area, making them a likely routing candidate for final visual hierarchy review. (role: listed iOS app area contact; confidence: medium; files: CONTRIBUTING.md, apps/ios/Sources/Design/SettingsProTab.swift, apps/ios/Sources/Design/RootTabsPhoneControlHub.swift)
  • ngutman: CONTRIBUTING.md lists this handle for the iOS app area and adjacent app features, making them a likely reviewer for companion-app UX decisions. (role: listed iOS app area contact; confidence: medium; files: CONTRIBUTING.md, apps/ios/Sources/RootTabs.swift, apps/ios/Sources/Design/RootTabsPhoneControlHub.swift)
  • Ayaan Zaidi: Current-main blame for sampled baseline CommandCenter, Settings, and Agent hierarchy lines points to this display name, but the checkout history is grafted and the commit subject is not iOS-specific, so confidence is low. (role: baseline code contributor; confidence: low; commits: 477b27b6f87e; files: apps/ios/Sources/Design/CommandCenterTab.swift, apps/ios/Sources/Design/SettingsProTab.swift, apps/ios/Sources/Design/AgentProTab+Destinations.swift)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 97d396a4d6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

}
.navigationTitle("Sessions")
.navigationBarTitleDisplayMode(.inline)
.toolbar(self.usesNativeNavigationChrome ? .visible : .hidden, for: .navigationBar)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Preserve a back path for sessions

When CommandCenterTab is used in its default standalone mode (ownsNavigationStack == true, openSessions == nil) and there are more than three recent sessions, the View More row pushes CommandSessionsScreen with usesNativeNavigationChrome == false and no headerLeadingAction. This new toolbar visibility line hides the system navigation bar in that case, while the custom header only shows the title, so the pushed Sessions screen has no Back control and users cannot return from it without leaving the flow.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. labels Jul 2, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jul 2, 2026
@steipete

steipete commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Land-ready proof for exact head 281bc84986ed067f3529e4574a3e083f24bcd0e7:

  • Exact-head CI: https://github.com/openclaw/openclaw/actions/runs/28558844818 — 62 checks passed, 10 intentionally skipped, zero failures or pending checks.
  • Native gates passed: ios-build, native-i18n, iOS Periphery, and macos-swift.
  • Live Gateway E2E passed against the local OpenClaw Gateway: pairing, Control, and Control → Overview navigation.
  • Simulator visual suites passed in light and dark appearance; the PR body contains detailed before/after evidence for Control, Agent, Settings, toolbar menus, and live Control/Overview.
  • Focused post-merge simulator suite: 3/3 passed.
  • pnpm native:i18n:sync and pnpm native:i18n:check passed.
  • pnpm test test/scripts/native-app-i18n.test.ts — 4/4 passed.
  • Fresh Codex autoreview — clean, 0.90 confidence.

Known proof gaps: none. The earlier macOS Swift cache infrastructure failure was fixed and landed separately in #98818, then this PR was refreshed and rerun to full exact-head green.

@openclaw-barnacle openclaw-barnacle Bot added channel: mattermost Channel integration: mattermost channel: telegram Channel integration: telegram scripts Repository scripts extensions: nvidia labels Jul 2, 2026
@steipete
steipete merged commit 313560d into main Jul 2, 2026
99 checks passed
@steipete
steipete deleted the codex/ios-interface-cleanup branch July 2, 2026 01:43
@steipete

steipete commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Merged via squash.

@steipete

steipete commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Final landed-head proof for PR head e6f87ff74d46369f018eee3d7dd1b02fcfbb344a:

Simulator before/after evidence and live Gateway E2E details remain in the PR body and the earlier land-ready proof comment.

vincentkoc added a commit that referenced this pull request Jul 2, 2026
* origin/main:
  feat(ios): modernize navigation and settings (#98811)
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 2, 2026
* feat(ios): modernize navigation and settings

* fix(ios): remove obsolete settings helpers

* test(ios): update i18n collector fixture

* test(ios): update i18n collector fixture

* test(ios): update i18n collector fixture
chenyangjun-xy pushed a commit to chenyangjun-xy/openclaw that referenced this pull request Jul 3, 2026
* feat(ios): modernize navigation and settings

* fix(ios): remove obsolete settings helpers

* test(ios): update i18n collector fixture

* test(ios): update i18n collector fixture

* test(ios): update i18n collector fixture
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: ios App: ios channel: mattermost Channel integration: mattermost channel: telegram Channel integration: telegram extensions: nvidia maintainer Maintainer-authored PR merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. scripts Repository scripts size: XL status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Modernize iOS navigation and settings hierarchy

1 participant