Skip to content

feat(clients): adopt model controls, session management, and keyboard history recall on iOS#110831

Merged
steipete merged 11 commits into
mainfrom
claude/ios-chat-adopt
Jul 19, 2026
Merged

feat(clients): adopt model controls, session management, and keyboard history recall on iOS#110831
steipete merged 11 commits into
mainfrom
claude/ios-chat-adopt

Conversation

@steipete

Copy link
Copy Markdown
Contributor

What Problem This Solves

The macOS/web chat parity rounds (#110254, #110276, #110339, #110347) landed all capability in shared OpenClawKit, but iOS still only forwarded transport fields: no model controls, no session groups/batch/inspector, no worktree-aware creation, and no hardware-keyboard input history.

Why This Change Was Made

Adopt the shared surfaces on iOS with iOS-idiomatic UX, keeping the shared API additive:

  • Model controls (ChatModelControlsMenu.swift, wired from ChatPro's existing action menu): provider-grouped model picker via the shared ChatModelPickerStore (pinned + recents first, default badges), thinking with Default (inherited), Fast as Default/On/Off (Default patches fastMode: null; display rides effectiveFastMode; legacy auto not re-selectable), verbosity as Default/off/on/full (Default patches null).
  • Session management: the sessions affordance now presents the shared ChatSessionsSheet (groups, select/batch mode, inspector); advanced new-session options (agent, managed worktree, base ref) present in a medium-detent sheet.
  • Transport (IOSGatewayChatTransport.swift): exact-route leases for settings, mutations, groups, and new-session; 6-arg createSession mapping agentId/worktree/worktreeBaseRef; settings patches forward the fast-mode double-optional including explicit null. Implementing the real overload removes iOS from the fail-closed protocol default.
  • Input history: hardware-keyboard ↑ starts recall only from an empty draft; active recall supports ↑/↓; non-empty and soft-wrapped drafts keep native caret movement; no touch-UX change (shared ChatInputHistory state machine).

User Impact

iOS chat users get the same model, Fast, verbosity, and thinking controls as web/macOS, full session organization (groups, batch actions, inspector, worktree sessions from a chosen base ref), and terminal-style input history on hardware keyboards.

Evidence

  • Shared OpenClawKit suite: 994 tests green (48 XCTest + 946 Swift Testing, 81+ suites).
  • iOS build-for-testing (generic simulator, Xcode project via xcodegen): green — app and test targets compile.
  • IOSGatewayChatTransportTests: 15/15, including advanced-create encoding, fast-mode set/null, and groups-lease methods/params/decoding.
  • pnpm format:swift clean; pnpm lint:swift 0 violations; all touched files under the 1500-line cap; git diff --check clean.
  • i18n: new strings translated across all locales; pnpm native:i18n:check clean; apple/android i18n vitest gates green.
  • Autoreview (branch mode): "patch is correct", zero accepted/actionable findings (one earlier P2 — soft-wrapped draft caret interception — found and fixed during development).
  • Known non-gate: the local-only OpenClawTypographyTests broad source audit flags pre-existing lines in untouched shared/macOS files; CI's ios-build job compiles but does not execute the iOS test bundle, and the new controls use branded typography.

@openclaw-barnacle openclaw-barnacle Bot added app: android App: android app: ios App: ios size: XL maintainer Maintainer-authored PR labels Jul 18, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. 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: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jul 18, 2026
@clawsweeper

clawsweeper Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 19, 2026, 4:47 AM ET / 08:47 UTC.

Summary
The branch adopts shared model controls, session-management UI, worktree-aware session creation, and hardware-keyboard input-history recall in the iOS chat client.

PR surface: Other +1878. Total +1878 across 54 files.

Reproducibility: not applicable. as a bug report; the two review defects are source-reproducible from the current head: external construction loses public visibility, and modified arrow keys enter the new recall handler.

Review metrics: 1 noteworthy metric.

  • Public constructors: 3 removed. Removing all three explicit public response constructors changes the usable API of the exported Swift package for external transport implementations.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🦪 silver shellfish
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:

  • Restore public initializers for the exported session DTOs.
  • Filter modified Up/Down key presses before history recall.
  • [P1] Add redacted simulator or device evidence of the changed iOS flows; updating the PR body should trigger a fresh review.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR describes builds and tests but supplies no inspectable after-fix iOS simulator/device proof; add redacted screenshots, a recording, terminal output, or runtime logs showing the controls, shared sessions sheet, and keyboard recall behavior. 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] Merging the removed public DTO initializers breaks external Swift clients that construct session-group gateway responses, even though in-package tests still compile.
  • [P1] The iOS feature set has no inspectable after-fix runtime proof for the session sheet, model settings, and hardware-keyboard history behavior.

Maintainer options:

  1. Preserve the shared public response API (recommended)
    Restore explicit public initializers for the three session-group DTOs, add focused external-facing coverage if available, and then provide real iOS runtime proof for the adopted controls.
  2. Pause the adoption branch
    If preserving the existing OpenClawChatUI construction contract is not intended, pause this PR for an explicit API-breaking-change decision rather than silently narrowing the public surface.

Next step before merge

  • [P1] The concrete fixes are clear, but the protected maintainer label and missing contributor runtime proof require a human review cycle rather than automated repair routing.

Security
Cleared: The reviewed patch changes native UI, shared Swift types, transport mapping, and locale resources without adding dependency, workflow, secret, permission, or artifact-execution behavior.

Review findings

  • [P1] Restore public session DTO initializers — apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessions.swift:255-275
  • [P2] Ignore modified arrow keys during history recall — apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatComposer.swift:889-900
Review details

Best possible solution:

Restore the public session DTO constructors, ignore modified Up/Down keys in the iOS recall handler, and add redacted simulator or device evidence covering the updated chat controls and session flow before merge.

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

Not applicable as a bug report; the two review defects are source-reproducible from the current head: external construction loses public visibility, and modified arrow keys enter the new recall handler.

Is this the best way to solve the issue?

No: adopting the shared iOS surfaces is directionally appropriate, but the patch must preserve the existing exported DTO contract and leave modified arrow-key editing to the native composer path.

Full review comments:

  • [P1] Restore public session DTO initializers — apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessions.swift:255-275
    Keep explicit public init declarations for OpenClawChatSessionGroup, OpenClawChatSessionGroupsResponse, and OpenClawChatSessionGroupsMutationResponse. Removing them makes the synthesized memberwise initializers internal, so external OpenClawChatTransport implementations cannot construct these public response types after upgrading; @testable package tests do not cover that consumer contract.
    Confidence: 0.98
  • [P2] Ignore modified arrow keys during history recall — apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatComposer.swift:889-900
    Check KeyPress.modifiers before invoking recall. Once recall is active, Shift-Up or Option-Up is handled here and changes history entries instead of extending selection or moving the caret; preserve native editing by returning .ignored for modified arrows.
    Confidence: 0.94

Overall correctness: patch is incorrect
Overall confidence: 0.94

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 2e8b042f9fba.

Label changes

Label changes:

  • remove merge-risk: 🚨 session-state: Current PR review merge-risk labels are merge-risk: 🚨 compatibility.

Label justifications:

  • P2: This is a substantial but non-emergency iOS capability adoption with concrete correctness blockers.
  • merge-risk: 🚨 compatibility: The current diff removes public constructors from exported session DTOs, which can break external Swift consumers on upgrade.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦪 silver shellfish.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR describes builds and tests but supplies no inspectable after-fix iOS simulator/device proof; add redacted screenshots, a recording, terminal output, or runtime logs showing the controls, shared sessions sheet, and keyboard recall behavior. 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:

Other +1878. Total +1878 across 54 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 0 0 0 0
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 54 3559 1681 +1878
Total 54 3559 1681 +1878

What I checked:

Likely related people:

  • steipete: The related merged native-client work introduced the shared model-control and session-management paths now being wired into iOS, and the current branch continues that work. (role: introduced the shared native chat surfaces and is the recent iOS adopter; confidence: high; commits: 8ae1581798b8, 1cddec35f4b7, 41dbaca83ad3; files: apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessions.swift, apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatComposer.swift, apps/ios/Sources/Chat/IOSGatewayChatTransport.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 (9 earlier review cycles; latest 8 shown)
  • reviewed 2026-07-18T19:22:05.380Z sha e37cf4e :: needs real behavior proof before merge. :: [P2] Preserve fixture gating for session-management actions | [P2] Disable advanced session options for local fixtures
  • reviewed 2026-07-18T20:13:58.387Z sha eb3bc75 :: needs real behavior proof before merge. :: [P2] Restore fixture gating for session-management actions | [P2] Disable advanced session options for local fixtures
  • reviewed 2026-07-18T20:25:44.126Z sha eb3bc75 :: needs real behavior proof before merge. :: [P2] Restore fixture gating for session-management actions | [P2] Disable advanced session options for local fixtures
  • reviewed 2026-07-18T20:44:25.481Z sha eb3bc75 :: needs real behavior proof before merge. :: [P1] Preserve the public session-response constructors | [P2] Preserve fixture capability gating for session actions | [P2] Gate advanced session options in local fixture mode
  • reviewed 2026-07-18T21:33:14.883Z sha eb3bc75 :: needs real behavior proof before merge. :: [P1] Restore the public session-response initializers | [P2] Keep fixture session actions capability-gated | [P2] Disable advanced session options for local fixtures
  • reviewed 2026-07-18T22:41:12.919Z sha 72275cf :: needs real behavior proof before merge. :: [P1] Restore the public session-response initializers
  • reviewed 2026-07-19T08:15:58.289Z sha 8269ae3 :: needs real behavior proof before merge. :: [P2] Unify iOS session-group storage across entry points
  • reviewed 2026-07-19T08:36:58.980Z sha c1b9fdb :: needs real behavior proof before merge. :: [P2] Unify iOS session-group storage across entry points

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

ℹ️ 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 152 to +155
.sheet(isPresented: self.$showsSessions) {
NavigationStack {
CommandSessionsScreen(
usesNativeNavigationChrome: true,
openChat: { self.showsSessions = false })
if let viewModel {
ChatSessionsSheet(viewModel: viewModel)
}

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 Keep fixture sessions on the capability-gated screen

When Apple Review or screenshot fixture mode is active, this replacement exposes rename, pin, archive, delete, fork, batch, and group actions even though LocalFixtureChatTransport does not implement those mutation/group methods and therefore falls through to the throwing defaults in apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatTransport.swift:675-723. The previous CommandSessionsScreen explicitly disabled these actions when isLocalChatFixtureEnabled, so fixture users now encounter “not supported” errors; retain that screen or pass equivalent capability gating into the shared sheet.

Useful? React with 👍 / 👎.

Image(systemName: "slider.horizontal.3")
}
}
.disabled(self.viewModel == nil || !self.gatewayConnected || self.isAttachmentOwnerPinned)

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 Disable advanced session options for local fixtures

In Apple Review or screenshot fixture mode, gatewayConnected is true, so this button is enabled, but AppleReviewDemoChatTransport/LocalFixtureChatTransport do not implement listAgents() and inherit the protocol default returning nil (apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatTransport.swift:671). Consequently the newly exposed sheet can only report “No agents are available” and can never create a session; gate it with !appModel.isLocalChatFixtureEnabled or provide fixture agent support.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jul 18, 2026
@steipete steipete closed this Jul 18, 2026
@steipete steipete reopened this Jul 18, 2026
@openclaw-barnacle openclaw-barnacle Bot reopened this Jul 18, 2026
@openclaw-barnacle openclaw-barnacle Bot reopened this Jul 18, 2026
@steipete
steipete force-pushed the claude/ios-chat-adopt branch from eb3bc75 to 72275cf Compare July 18, 2026 21:54

@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: 72275cfbce

ℹ️ 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 256 to 258
public let name: String
public let position: Int

public init(name: String, position: Int) {
self.name = name
self.position = position
}
}

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 Restore the public session-group initializers

Removing these explicit initializers makes Swift's synthesized memberwise initializers internal, even though OpenClawChatUI is exported as a library product. External/custom OpenClawChatTransport implementations can therefore no longer construct OpenClawChatSessionGroup, OpenClawChatSessionGroupsResponse, or OpenClawChatSessionGroupsMutationResponse after upgrading; the repo tests only continue compiling because they use @testable import. Retain public initializers for all three response types.

Useful? React with 👍 / 👎.

@steipete steipete self-assigned this Jul 19, 2026
@steipete
steipete force-pushed the claude/ios-chat-adopt branch from 72275cf to 55554fe Compare July 19, 2026 07:16

@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: 55554fe9bf

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

usesNativeNavigationChrome: true,
openChat: { self.showsSessions = false })
if let viewModel {
ChatSessionsSheet(viewModel: viewModel)

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 Unify iOS session-group storage across entry points

When an iOS user manages groups from Chat, this replacement opens the shared sheet backed by gateway sessions.groups.*, while the still-reachable Sessions destination uses CommandSessionsScreen (apps/ios/Sources/RootTabs.swift:414-417) and reads/writes the device-local SessionGroupStore (apps/ios/Sources/Design/CommandCenterTab.swift:986-1013). Consequently renaming or deleting a group in the new sheet leaves a stale group in the other screen, groups created there do not reliably appear here, and existing empty local groups disappear from this entry point; migrate/synchronize the catalog or move all iOS entry points to the same implementation.

Useful? React with 👍 / 👎.

@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: 8269ae3b58

ℹ️ 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 +600 to +601
if let viewModel {
ChatModelControlsMenuItems(viewModel: viewModel)

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 Hide unsupported model controls in fixture mode

When Apple Review or screenshot fixture mode is active, this newly exposes thinking, Fast, and verbosity controls even though LocalFixtureChatTransport does not implement the full patchSessionSettings contract. Its inherited default throws when clearing the thinking override and silently ignores Fast/verbosity-only patches (ChatTransport.swift:809-840), so those selections either fail or appear accepted before reverting on refresh. Gate these controls with !appModel.isLocalChatFixtureEnabled or implement fixture settings patches.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the claude/ios-chat-adopt branch from c1b9fdb to 41dbaca Compare July 19, 2026 08:41

@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: 41dbaca83a

ℹ️ 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 +892 to +896
.onKeyPress(.upArrow) {
guard !self.isSlashPopoverPresented else { return .ignored }
return self.viewModel.recallPreviousInput(caretOnFirstLine: false)
? .handled
: .ignored

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 modified arrow-key editing during recall

With a hardware keyboard after recall has started, Shift-Up or Option-Up reaches this key-only handler and recallPreviousInput returns true whenever history.isRecalling, so the event is consumed and the composer changes history entries instead of extending the selection or moving the caret. The macOS path explicitly filters modified arrows in ChatComposerKeyRouting.command, with coverage in ChatInputHistoryKeyContextTests; inspect KeyPress.modifiers here and return .ignored for modified arrows as well.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot removed the merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. label Jul 19, 2026
@steipete
steipete merged commit 8178b3c into main Jul 19, 2026
172 of 177 checks passed
@steipete
steipete deleted the claude/ios-chat-adopt branch July 19, 2026 10:08
@steipete

Copy link
Copy Markdown
Contributor Author

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 20, 2026
… history recall on iOS (openclaw#110831)

* feat(clients): adopt model controls, session management, and keyboard history recall on iOS

* chore(i18n): translate iOS adoption strings and realign locale artifacts

* refactor(clients): drop test-only group response inits flagged by the shared dead-code intersect

* chore: retrigger ci

* chore(i18n): resync inventory after voice-unification main rebase

* chore(i18n): resync inventory after main rebase

* chore(i18n): resync inventory after main rebase

* chore(i18n): realign locale artifacts after main rebase

* fix(clients): preserve native chat API and locale copy

* fix(ios): retain public session DTO initializers

* refactor(clients): delete test-only session DTO inits flagged dead instead of suppressing
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 maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. 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