Skip to content

feat(apps): review durable approvals on mobile#103912

Merged
steipete merged 1 commit into
codex/durable-approval-registryfrom
codex/approval-native-clients
Jul 12, 2026
Merged

feat(apps): review durable approvals on mobile#103912
steipete merged 1 commit into
codex/durable-approval-registryfrom
codex/approval-native-clients

Conversation

@steipete

Copy link
Copy Markdown
Contributor

Related: #103505

What Problem This Solves

Operators using the Android, iPhone, or Apple Watch apps cannot reliably review the same Gateway approval that is visible in the Control UI or a chat channel. Lost acknowledgements can leave a native card looking actionable or resolved without canonical proof, and switching Gateways can misroute stale approval state.

Why This Change Was Made

This fourth stacked increment makes the official mobile clients read and resolve the durable Gateway approval record. Android and iPhone use the kind-aware unified RPCs, Watch relays reviewer-safe exec prompts through its paired iPhone, and every client treats Gateway terminal state as authoritative. Shipped Gateway v4 peers retain a narrow exec-method fallback; cross-surface retained terminal truth requires the unified methods.

The clients preserve approval and Gateway IDs as opaque exact identifiers, keep warning and owner context visible, bind credentials and cached prompts to the selected Gateway, and freeze actions after an ambiguous write until a canonical readback classifies the exact owner.

User Impact

Authorized operators can review pending exec approvals from Android, iPhone, or Apple Watch. The first answer from any authorized surface wins, every native surface displays that recorded result, and a lost response or reconnect cannot silently fabricate approval success or reopen execution rights.

Evidence

  • Android Play and ThirdParty unit lanes passed (35 tasks each); Play/ThirdParty APKs, Android lint, benchmark APK, and app/benchmark ktlint all passed (154 additional tasks).
  • Apple parser and repository SwiftFormat checks passed. Focused iPhone/Watch model and Gateway suites passed 219 tests with zero failures or skips, including dismiss/restart uncertainty, stale-readback fencing, queued Watch resume, owner-scoped replacement, terminal-vs-in-flight ordering, expired persisted uncertainty recovery, and failed canonical refresh correlation.
  • Native localization inventory sync is stable; native-app-i18n.test.ts passed 5/5.
  • Exact-ID regressions cover byte-distinct Unicode Gateway owners and approval IDs across notification, iPhone, Watch, and Gateway paths.
  • Full-stack fresh autoreview reported no accepted/actionable findings after the final authorization and Watch race fixes.
  • Known proof gap: no approval-specific XCUITest exists, so the full iPhone/Watch/Android multi-device interaction recipe remains manual. No screenshots or proof assets are committed to this branch.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation app: android App: android app: ios App: ios size: XL maintainer Maintainer-authored PR labels Jul 10, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels Jul 10, 2026
@clawsweeper

clawsweeper Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 11, 2026, 10:30 PM ET / July 12, 2026, 02:30 UTC.

Summary
Adds durable Gateway-backed exec approval review and resolution across Android, iPhone, and Apple Watch, including canonical readback, exact Gateway-owner identity, persisted-state migrations, and legacy Gateway RPC compatibility.

PR surface: Tests +30, Docs +65, Other +11376. Total +11471 across 63 files.

Reproducibility: not applicable. This PR adds a new native approval-review capability rather than repairing a reproducible current-main bug; the failing changed Android test is validation evidence, not a user-report reproduction.

Review metrics: 2 noteworthy metrics.

  • Persisted compatibility surfaces: 4 changed. Device auth, TLS pins, Gateway preferences, and Watch approval state cross app-upgrade boundaries.
  • Approval RPC families: 2 supported. Unified approval RPCs and shipped exec-specific fallbacks make version-skew behavior merge-relevant.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #103505
Summary: This PR is the native mobile implementation candidate within the durable cross-surface approvals program.

Members:

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

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🐚 platinum hermit
Result: blocked until real behavior proof is added.

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

Rank-up moves:

  • Clear the branch-caused Android test, ktlint, and docs failures on the exact head.
  • Attach redacted real-device proof for Android, iPhone, and paired Apple Watch approval flows.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR provides extensive automated coverage but no after-fix real-device screenshots, recording, live output, linked artifact, or redacted logs for Android, iPhone, and paired Apple Watch approvals; updating the PR body with proof should trigger review, or a maintainer can comment @clawsweeper re-review. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] The exact reviewed head is not validation-clean: both Android test variants, Android ktlint, and docs checks report failures that must be diagnosed before merge.
  • [P1] The PR changes persisted Gateway preferences, device-auth token keys, TLS pin accounts, and Watch approval state; an upgrade regression could disconnect or re-prompt existing mobile users.
  • [P1] No real-device evidence shows that Android, iPhone, and paired Apple Watch preserve Gateway ownership, freeze actions after ambiguous writes, and display the canonical first-answer result.

Maintainer options:

  1. Finish exact-head validation and proof (recommended)
    Diagnose and fix branch-caused check failures, rerun fresh-install and upgrade coverage, and attach redacted Android, iPhone, and paired Watch behavior proof before merge.
  2. Pause the native increment
    Keep the PR open but defer landing until the fallback, persisted-state, and authorization behavior can be reviewed on a stable exact head.

Next step before merge

  • [P1] This protected stacked feature needs contributor-supplied real-device proof and stable exact-head maintainer validation; no discrete automation-safe code defect is proven for a repair job.

Security
Cleared: No concrete authorization bypass, secret exposure, third-party execution, or supply-chain regression was found; owner-binding and credential migration remain explicit merge risks.

Review details

Best possible solution:

Keep the Gateway-owned durable lifecycle and exact-byte owner model, but merge only after branch-caused checks are fixed, fresh-install and upgrade paths pass, and redacted real-device proof covers pending review, competing resolution, Gateway switching, and ambiguous-write recovery on Android, iPhone, and paired Apple Watch.

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

Not applicable. This PR adds a new native approval-review capability rather than repairing a reproducible current-main bug; the failing changed Android test is validation evidence, not a user-report reproduction.

Is this the best way to solve the issue?

Yes at the architectural level: official clients should consume the Gateway-owned durable record and advertised method catalog rather than create native-local approval truth. Merge readiness still requires clean exact-head checks, upgrade proof, and real-device evidence.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 01fc1ed02a50.

Label changes

Label justifications:

  • P2: This is a significant official-app operator feature with bounded impact rather than an emergency current-user regression.
  • merge-risk: 🚨 compatibility: The diff changes persisted mobile state and retains a version-skew fallback path for shipped Gateways.
  • merge-risk: 🚨 auth-provider: Gateway-scoped device credentials and selected-Gateway owner keys are re-keyed and migrated with exact-byte semantics.
  • merge-risk: 🚨 security-boundary: The clients can resolve exec approvals across devices, so reviewer scope and exact issuing-Gateway ownership must remain fail-closed.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🐚 platinum hermit.
  • feature: ✨ showcase: ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. A single canonical first-answer-wins approval experience across Android, iPhone, and paired Apple Watch is an unusually valuable mobile operator workflow.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR provides extensive automated coverage but no after-fix real-device screenshots, recording, live output, linked artifact, or redacted logs for Android, iPhone, and paired Apple Watch approvals; updating the PR body with proof should trigger review, or a maintainer can comment @clawsweeper re-review. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Tests +30, Docs +65, Other +11376. Total +11471 across 63 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 1 30 0 +30
Docs 5 65 0 +65
Config 0 0 0 0
Generated 0 0 0 0
Other 57 14040 2664 +11376
Total 63 14135 2664 +11471

What I checked:

  • Canonical Gateway contract: Current main exposes unified approval.get/approval.resolve alongside shipped exec.approval.get/exec.approval.resolve methods, supporting the PR's bounded version-skew selection. (src/gateway/server-aux-methods.ts:5, 01fc1ed02a50)
  • Reviewer authorization contract: Current Gateway E2E coverage requires operator.approvals for unified approval reads and resolutions, matching the native clients' intended authorization boundary. (src/gateway/operator-approvals-client.e2e.test.ts:250, 01fc1ed02a50)
  • Exact owner identity: The PR compares opaque Gateway and approval identifiers by UTF-8 bytes, preventing canonically equivalent Unicode owners from sharing credentials, pins, or approval state. (apps/ios/Sources/Services/ExactOpaqueIdentifier.swift:3, 175b049a886c)
  • Legacy-race coverage: The exact-head Android test exercises a resolve racing a Gateway method-epoch change and requires later canonical readback instead of leaving the approval permanently frozen. (apps/android/app/src/test/java/ai/openclaw/app/GatewayExecApprovalRuntimeTest.kt:731, 175b049a886c)
  • Exact-head validation state: GitHub reports failures for both Android test variants, Android ktlint, and docs checks at the reviewed head; the overall workflow was still in progress when inspected. (175b049a886c)
  • Proof gap: The PR body expressly says the Android/iPhone/Watch multi-device recipe remains manual and provides no attached screenshots, recording, live output, or redacted runtime logs. (175b049a886c)

Likely related people:

  • steipete: Introduced the durable approval registry, typed cross-surface actions, standalone approval UI, and this native-client increment. (role: feature owner; confidence: high; commits: 02dc25a1b51f, 7a456e362d0b, 4eb1f5225c5f; files: apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt, apps/ios/Sources/Model/NodeAppModel.swift, apps/shared/OpenClawKit/Sources/OpenClawKit/DeviceAuthStore.swift)
  • Sarah Fortune: Current-main blame ties the Android approval entry point and shared Gateway operator-scope filtering to recent integration history, making this a useful secondary review route. (role: recent adjacent contributor; confidence: medium; commits: fd37c0318dcb; files: apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt, apps/shared/OpenClawKit/Sources/OpenClawKit/GatewayChannel.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.
Review history (5 earlier review cycles)
  • reviewed 2026-07-10T19:52:17.915Z sha f73c56e :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-11T14:46:15.382Z sha 7d82c13 :: needs real behavior proof before merge. :: [P1] Preserve existing non-ASCII TLS pins during upgrade
  • reviewed 2026-07-12T00:58:26.738Z sha 2a60619 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-12T01:31:15.905Z sha 6f0c386 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-12T01:38:22.851Z sha 6f0c386 :: needs real behavior proof before merge. :: none

@steipete
steipete force-pushed the codex/approval-deep-links branch from 72e8289 to fdad6d7 Compare July 11, 2026 14:24
@steipete
steipete force-pushed the codex/approval-native-clients branch from f73c56e to 2ed37ce Compare July 11, 2026 14:24
@steipete
steipete force-pushed the codex/approval-deep-links branch from fdad6d7 to 12ec1bc Compare July 11, 2026 14:31
@steipete
steipete force-pushed the codex/approval-native-clients branch from 2ed37ce to 77a798b Compare July 11, 2026 14:31
@steipete

Copy link
Copy Markdown
Contributor Author

Land-ready update: rebased through the reconciled stack; review findings fixed and revalidated across four structured-review cycles until clean.

Fixes since the last head — iOS: gateway switches preserve owner-scoped in-flight write fences and ambiguous outcomes (rapid A→B→A can no longer double-submit or lose a lost-write record); re-presented cards render resolving for the whole active attempt including post-write readback; the Watch pending-retry path unlocks the phone card with the retry message; the Watch snapshot-request decoder accepts the shipped (pre-heldApprovals) request shape during version skew, with a named removal condition. Android: losing first-answer outcomes render as a standalone dismissible banner that survives refreshes and unrelated writes, with publication-distinct atomic dismissal; the legacy already-resolved/epoch race no longer strands in-flight write records. Both v4 fallback selectors carry removal-plan comments; a lint-shape refactor split WatchInboxStore and extracted NodeAppModel helpers (behavior-preserving, swiftlint --strict clean).

Validation: full iOS OpenClawTests bundle 817 tests with only 4 pre-existing failures proven byte-identical to origin/main (typography offenders, TLS port-format, two Talk-mode; macOS CI is the platform gate); OpenClawKit SPM 723/723; SwiftFormat/SwiftLint strict clean; structured Codex reviews of all five fix commits clean on the final pass. Remaining gap unchanged from the PR body: the multi-device live recipe stays manual; a superseded set of main's shipped-surface watch push-recovery tests was replaced by this branch's owner-scoped recovery coverage per repo test policy.

@steipete
steipete force-pushed the codex/approval-deep-links branch from 12ec1bc to 548cca6 Compare July 11, 2026 14:34
@steipete
steipete force-pushed the codex/approval-native-clients branch from 77a798b to 7d82c13 Compare July 11, 2026 14:34
@steipete
steipete marked this pull request as ready for review July 11, 2026 14:38
@clawsweeper clawsweeper Bot removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. labels Jul 11, 2026

@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: 7d82c13abd

ℹ️ 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".

Comment on lines +1175 to +1177
var pendingApprovalCount: Int {
self.appModel.pendingExecApprovalCount
}

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 Badge the approvals row from the inbox count

Now that durable approvals can sit in pendingExecApprovalInboxItems without a selected modal prompt, pendingApprovalCount can be >0 while pendingApproval is nil. The Approvals detail uses this count, but the Settings home row still keys its orange state and badge off pendingApproval == nil in apps/ios/Sources/Design/SettingsProTabSections.swift:143-146, so if a user dismisses/suppresses the modal and leaves approvals in the inbox, the Settings list shows the row as green with no badge even though exec approvals are waiting.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added the rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. label Jul 11, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels Jul 12, 2026
@steipete
steipete force-pushed the codex/approval-deep-links branch from dcf1cb6 to 7f72cbf Compare July 12, 2026 01:23
steipete added a commit that referenced this pull request Jul 12, 2026
Squash-rebased #103912 segment onto the deep-links tip on current main.
Native approval surfaces: iOS approval presentation with gateway-switch
lease preservation and resolution fencing, watchOS inbox + approval
actions with shipped-shape payload codec, Android approval notices with
publication-tokened dismissal. Native i18n inventory regenerated.

(cherry picked from commit 428a76670ffeede54248b7bd7aa4438e2589851b)
(cherry picked from commit 80225d5707c3645eeea5435f266131037b50ede6)
(cherry picked from commit 2a23b714dc30d773a294aa45adc617e46b80732e)
(cherry picked from commit 9ff1153827769e2cbab7c11c153f0f8634662c28)
(cherry picked from commit 5b25723525bd562e5f97478af492f7b46ad30fd1)
(cherry picked from commit 8c80e8467b5fe89aad0d4c74a0573f1600ed3af9)
(cherry picked from commit ad4037bc9846bf6f082b41c129ee68aa344576c3)
(cherry picked from commit fdf767dd662cff3c8a5a6d571f38f153410651ca)
(cherry picked from commit 00c120376ffd992ea68ce29254a9bc0a25ed1740)
(cherry picked from commit f36a952)
(cherry picked from commit e2c25cbe2baacab44d21871d8cb6734704f065ac)
(cherry picked from commit 7c4fda519080486d341a9f4df36d63f9e24b1235)
(cherry picked from commit 1b3d4eda3dc5988012124597f9454ae21fb187a1)
(cherry picked from commit 2a60619)
@steipete
steipete force-pushed the codex/approval-native-clients branch from 2a60619 to 6f0c386 Compare July 12, 2026 01:23
@steipete
steipete force-pushed the codex/approval-deep-links branch from 7f72cbf to 1bf6791 Compare July 12, 2026 02:08
steipete added a commit that referenced this pull request Jul 12, 2026
Squash-rebased #103912 segment onto the deep-links tip on current main.
Native approval surfaces: iOS approval presentation with gateway-switch
lease preservation and resolution fencing, watchOS inbox + approval
actions with shipped-shape payload codec, Android approval notices with
publication-tokened dismissal. Native i18n inventory regenerated.

(cherry picked from commit 428a76670ffeede54248b7bd7aa4438e2589851b)
(cherry picked from commit 80225d5707c3645eeea5435f266131037b50ede6)
(cherry picked from commit 2a23b714dc30d773a294aa45adc617e46b80732e)
(cherry picked from commit 9ff1153827769e2cbab7c11c153f0f8634662c28)
(cherry picked from commit 5b25723525bd562e5f97478af492f7b46ad30fd1)
(cherry picked from commit 8c80e8467b5fe89aad0d4c74a0573f1600ed3af9)
(cherry picked from commit ad4037bc9846bf6f082b41c129ee68aa344576c3)
(cherry picked from commit fdf767dd662cff3c8a5a6d571f38f153410651ca)
(cherry picked from commit 00c120376ffd992ea68ce29254a9bc0a25ed1740)
(cherry picked from commit f36a952)
(cherry picked from commit e2c25cbe2baacab44d21871d8cb6734704f065ac)
(cherry picked from commit 7c4fda519080486d341a9f4df36d63f9e24b1235)
(cherry picked from commit 1b3d4eda3dc5988012124597f9454ae21fb187a1)
(cherry picked from commit 2a60619)
(cherry picked from commit 6f0c386)
@steipete
steipete force-pushed the codex/approval-native-clients branch from 6f0c386 to 784a585 Compare July 12, 2026 02:08
@steipete
steipete force-pushed the codex/approval-deep-links branch 2 times, most recently from 115acda to cc0c3f8 Compare July 12, 2026 02:16
steipete added a commit that referenced this pull request Jul 12, 2026
Squash-rebased #103912 segment onto the deep-links tip on current main.
Native approval surfaces: iOS approval presentation with gateway-switch
lease preservation and resolution fencing, watchOS inbox + approval
actions with shipped-shape payload codec, Android approval notices with
publication-tokened dismissal. Native i18n inventory regenerated.

(cherry picked from commit 428a76670ffeede54248b7bd7aa4438e2589851b)
(cherry picked from commit 80225d5707c3645eeea5435f266131037b50ede6)
(cherry picked from commit 2a23b714dc30d773a294aa45adc617e46b80732e)
(cherry picked from commit 9ff1153827769e2cbab7c11c153f0f8634662c28)
(cherry picked from commit 5b25723525bd562e5f97478af492f7b46ad30fd1)
(cherry picked from commit 8c80e8467b5fe89aad0d4c74a0573f1600ed3af9)
(cherry picked from commit ad4037bc9846bf6f082b41c129ee68aa344576c3)
(cherry picked from commit fdf767dd662cff3c8a5a6d571f38f153410651ca)
(cherry picked from commit 00c120376ffd992ea68ce29254a9bc0a25ed1740)
(cherry picked from commit f36a952)
(cherry picked from commit e2c25cbe2baacab44d21871d8cb6734704f065ac)
(cherry picked from commit 7c4fda519080486d341a9f4df36d63f9e24b1235)
(cherry picked from commit 1b3d4eda3dc5988012124597f9454ae21fb187a1)
(cherry picked from commit 2a60619)
(cherry picked from commit 6f0c386)
(cherry picked from commit 784a585)
@steipete
steipete force-pushed the codex/approval-native-clients branch from 784a585 to cbf294e Compare July 12, 2026 02:16
@steipete
steipete deleted the branch codex/durable-approval-registry July 12, 2026 02:16
@steipete steipete closed this Jul 12, 2026
Squash-rebased #103912 segment onto the deep-links tip on current main.
Native approval surfaces: iOS approval presentation with gateway-switch
lease preservation and resolution fencing, watchOS inbox + approval
actions with shipped-shape payload codec, Android approval notices with
publication-tokened dismissal. Native i18n inventory regenerated.

(cherry picked from commit 428a76670ffeede54248b7bd7aa4438e2589851b)
(cherry picked from commit 80225d5707c3645eeea5435f266131037b50ede6)
(cherry picked from commit 2a23b714dc30d773a294aa45adc617e46b80732e)
(cherry picked from commit 9ff1153827769e2cbab7c11c153f0f8634662c28)
(cherry picked from commit 5b25723525bd562e5f97478af492f7b46ad30fd1)
(cherry picked from commit 8c80e8467b5fe89aad0d4c74a0573f1600ed3af9)
(cherry picked from commit ad4037bc9846bf6f082b41c129ee68aa344576c3)
(cherry picked from commit fdf767dd662cff3c8a5a6d571f38f153410651ca)
(cherry picked from commit 00c120376ffd992ea68ce29254a9bc0a25ed1740)
(cherry picked from commit f36a952)
(cherry picked from commit e2c25cbe2baacab44d21871d8cb6734704f065ac)
(cherry picked from commit 7c4fda519080486d341a9f4df36d63f9e24b1235)
(cherry picked from commit 1b3d4eda3dc5988012124597f9454ae21fb187a1)
(cherry picked from commit 2a60619)
(cherry picked from commit 6f0c386)
(cherry picked from commit 784a585)
(cherry picked from commit cbf294e)
@steipete steipete reopened this Jul 12, 2026
@steipete
steipete changed the base branch from codex/approval-deep-links to main July 12, 2026 02:17
@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui gateway Gateway runtime agents Agent runtime and tooling labels Jul 12, 2026
@steipete
steipete force-pushed the codex/approval-native-clients branch from cbf294e to 175b049 Compare July 12, 2026 02:18
@openclaw-barnacle openclaw-barnacle Bot removed the app: web-ui App: web-ui label Jul 12, 2026

@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: 175b049a88

ℹ️ 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".

{
guard self.isExecApprovalPromptCurrent(prompt),
let inboxKey = Self.execApprovalInboxKey(prompt),
!self.terminalExecApprovalKeys.contains(inboxKey)

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 Clear terminal tombstones on same-id re-requests

When a gateway restarts or otherwise re-requests an approval with the same id after a terminal result, markExecApprovalOwnerTerminal leaves this owner key in terminalExecApprovalKeys until a gateway switch or tombstone eviction. A fresh pending approval.get then reaches this guard and is dropped instead of being shown or re-added to the inbox/watch cache, so the user cannot review the replacement approval; the Android side explicitly tests this same-id re-request flow. Clear or replace the tombstone when a new pending snapshot/event for the same owner arrives.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: android App: android app: ios App: ios docs Improvements or additions to documentation feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. maintainer Maintainer-authored PR merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. scripts Repository scripts size: XL status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant