Skip to content

feat(ui): worktrees page owners and creation, structured snapshot failures, preserved-checkout cleanup#103526

Merged
steipete merged 3 commits into
mainfrom
feat/worktrees-page-owners
Jul 10, 2026
Merged

feat(ui): worktrees page owners and creation, structured snapshot failures, preserved-checkout cleanup#103526
steipete merged 3 commits into
mainfrom
feat/worktrees-page-owners

Conversation

@steipete

Copy link
Copy Markdown
Contributor

Related: #103431
Stacked on #103498 (sidebar redesign) and #103432 (protocol/server foundation).

What Problem This Solves

The Worktrees settings page listed checkouts without saying who owns them, offered no way to create one, and decided whether to offer a force delete by string-matching "snapshot failed" inside error messages. Deleting a session whose worktree had uncommitted or unpushed work silently left the checkout orphaned under the state directory with no UI pointing back at it.

Why This Change Was Made

The Worktrees page gains an Owner column (Manual, Workboard, or Session with a link into the owning chat) and a New worktree form that defaults to the selected agent's workspace and offers a worktrees.branches-backed base-ref picker. Non-forced removals that fail their safety snapshot now return a structured { removed: false, snapshotError } result — the service throws a typed WorktreeSnapshotError that the gateway handler maps — so the force-retry decision stops depending on error-message wording. Session deletion surfaces the foundation PR's worktreePreserved result: the sidebar explains that the dirty checkout was kept (branch included) and offers an explicit force removal.

User Impact

Operators can see which worktree belongs to which session and jump to it, create worktrees from the UI on any base branch, and no longer leak forgotten checkouts when deleting sessions — keeping dirty work stays the default, deleting it is one explicit confirm.

Evidence

  • Live on a scratch gateway: Worktrees page showed the session-owned checkout with Owner "Session" linking to ?session=agent:main:dashboard:…; New worktree defaulted to the agent workspace, listed branches main/feature-base/openclaw/live-test/topic-x, and created manual-one on base topic-x (Owner "Manual"). After dirtying the session worktree and deleting the session, the UI confirmed "The session's worktree has uncommitted or unpushed work, so it was kept (openclaw/live-test). Delete the checkout anyway?" and the forced removal deleted both checkout and branch.
  • pnpm test ui/src/pages/worktrees/worktrees-page.test.ts src/gateway/server-methods/worktrees.test.ts src/agents/worktrees/service.test.ts ui/src/components/app-sidebar.test.ts — green, including new coverage for the structured removed=false snapshot outcome and the force-retry flow.
  • tsgo core + test lanes green; pnpm ui:build clean; locale bundles regenerated with the keyless raw-copy baseline.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation app: web-ui App: web-ui gateway Gateway runtime agents Agent runtime and tooling size: L maintainer Maintainer-authored PR labels Jul 10, 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: 9dafcddfb3

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

this.createOpen = !this.createOpen;
if (this.createOpen && !this.createRepoRoot) {
const agents = this.context.agents.state.agentsList;
const defaultAgent = agents?.agents.find((agent) => agent.id === agents.defaultId);

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 Default new worktrees to the selected agent

When the operator has selected a non-default agent, this still seeds the create form from agents.defaultId, so clicking New worktree can create a checkout for the default agent's repository instead of the active agent's workspace. The app already tracks the selected agent via context.agentSelection.state.selectedId; use that before falling back to the configured default so the new form matches the current agent context.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the feat/sessions-sidebar-redesign branch from bec30b1 to 04016c5 Compare July 10, 2026 07:54
@steipete
steipete force-pushed the feat/worktrees-page-owners branch from 9dafcdd to d8a225a Compare July 10, 2026 07: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: d8a225aacb

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

.request<WorktreeBranchesResult>("worktrees.branches", { repoRoot })
.then((result) => {
if (this.isOperationScopeCurrent(scope) && repoRoot === this.createRepoRoot.trim()) {
this.createBranches = result.branches.map((branch) => branch.name);

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.

P1 Badge Preserve remote branch refs in the create picker

When the branch list contains a remote-only entry, this stores only branch.name and createWorktree() later sends that bare name as baseRef. git worktree add -h documents --guess-remote as trying to match the new branch name with a remote-tracking branch, and with only origin/feature-a present git worktree add -b openclaw/foo ... feature-a creates/checks out local feature-a instead of the openclaw/foo branch the service records. That leaves the registry pointing at a branch that was never created, so later removal tries to delete openclaw/foo and fails after the checkout is removed; preserve kind and pass a full remote ref such as origin/<name> for remote picker entries.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the feat/sessions-sidebar-redesign branch from 04016c5 to 0ee43cb Compare July 10, 2026 08:35
@steipete
steipete force-pushed the feat/worktrees-page-owners branch from d8a225a to 6120545 Compare July 10, 2026 08:40

@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: 6120545bc0

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

if (!deleted || !session.active) {
// Dirty/unpushed checkouts survive the delete; offer an explicit force
// removal instead of silently orphaning them under the state dir.
if (outcome.worktreePreserved) {

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 Surface preserved worktrees outside the sidebar

This handles preserved worktrees only for the sidebar delete path. The Sessions page uses context.sessions.deleteMany() for both selected deletes and its row menu (ui/src/pages/sessions/sessions-page.ts:550 and ui/src/pages/sessions/sessions-page.ts:612-618), and deleteMany() still drops the worktreePreserved value from sessions.delete; deleting a dirty worktree-backed session there leaves the checkout preserved with no force-delete prompt, so the orphaned-checkout flow remains outside the sidebar.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the feat/worktrees-page-owners branch from 6120545 to a4201b0 Compare July 10, 2026 09:19

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

ℹ️ 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 +302 to +304
if (this.isOperationScopeCurrent(scope)) {
this.creating = false;
await this.load();

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 Reset create progress after gateway changes

When a create request is in flight and the Gateway disconnects/reconnects or the page is rebound, invalidateOperations() bumps operationEpoch, so this guarded finally block is skipped and creating stays true. The New worktree button then remains disabled for the rest of the page lifetime even though the replacement connection is usable; reset creating when invalidating operations or outside the stale-scope guard.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the feat/sessions-sidebar-redesign branch from ee14841 to d79a2a6 Compare July 10, 2026 09:37
@steipete
steipete force-pushed the feat/worktrees-page-owners branch from a4201b0 to 2b3d058 Compare July 10, 2026 09:38

@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: 2b3d0581f0

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

if (!deleted || !session.active) {
// Dirty/unpushed checkouts survive the delete; offer an explicit force
// removal instead of silently orphaning them under the state dir.
if (outcome.worktreePreserved) {

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 Check delete freshness before forcing preserved worktrees

When the Gateway reconnects or the context is rebound after sessions.delete returns but before the capability's refresh() finishes, context.sessions.delete() can return deleted: false while still carrying worktreePreserved; this branch runs before the !outcome.deleted guard below, so the sidebar can prompt and send a force worktrees.remove through the replacement client for a stale delete epoch. Check outcome.deleted before offering the force removal, or drop preserved worktree data when the delete result is stale.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jul 10, 2026
@clawsweeper

clawsweeper Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed July 10, 2026, 7:18 AM ET / 11:18 UTC.

Summary
The branch adds worktree ownership and creation controls to the Control UI, structured snapshot-failure results, and user-visible preserved-worktree handling after session deletion.

PR surface: Source +545, Tests +44, Docs 0. Total +589 across 73 files.

Reproducibility: yes. for the review defects: the current-head source deterministically shows the selected-agent mismatch and both reconnect/freshness failures without needing environment-specific data.

Review metrics: none identified.

Stored data model
Persistent data-model change detected: persistent cache schema: ui/src/i18n/.i18n/ar.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/de.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/es.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/fa.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/fr.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/hi.tm.jsonl, and 19 more. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #103431
Summary: This PR is the Worktrees-page and preserved-cleanup layer of the broader Control UI session-management redesign.

Members:

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

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🐚 platinum hermit
Patch quality: 🦪 silver shellfish
Result: blocked by patch quality or review findings.

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

Rank-up moves:

  • [P2] Fix the three remaining findings and add selected-agent plus reconnect regression coverage.
  • Refresh the scratch-gateway proof on the repaired exact stacked head.

Risk before merge

  • [P1] Merging before the two lower stacked PRs settle can couple this UI to moving protocol and session-state contracts.
  • [P1] A stale delete outcome can prompt destructive cleanup through a replacement Gateway client even though the UI considers the deletion unsuccessful.

Maintainer options:

  1. Fix the remaining epoch invariants (recommended)
    Default creation from the selected agent, reset creation state on invalidation, and suppress preserved-worktree cleanup for stale or unsuccessful deletes.
  2. Pause until the stack stabilizes
    Keep this PR open and refresh it after the foundation and sidebar heads settle if repairing against moving bases would create more churn.

Next step before merge

  • [P2] The maintainer-labeled stacked PR needs explicit maintainer/contributor handling rather than automatic repair routing, despite the blockers being mechanically clear.

Security
Cleared: The diff adds no dependency, workflow, permission, secret, download, or package-resolution changes, and no concrete security or supply-chain concern was found.

Review findings

  • [P2] Default new worktrees to the selected agent — ui/src/pages/worktrees/worktrees-page.ts:249-250
  • [P2] Clear create progress when operations are invalidated — ui/src/pages/worktrees/worktrees-page.ts:302-303
  • [P2] Reject stale preserved-worktree cleanup outcomes — ui/src/components/app-sidebar.ts:884-895
Review details

Best possible solution:

Preserve the owner-aware Worktrees UI and structured snapshot contract, but bind creation and deletion follow-up to the selected agent and originating Gateway epoch, with focused reconnect regressions before merge.

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

Yes for the review defects: the current-head source deterministically shows the selected-agent mismatch and both reconnect/freshness failures without needing environment-specific data.

Is this the best way to solve the issue?

No, not on the current head; typed snapshot outcomes and owner-aware management are the right design, but the implementation must preserve selected-agent and Gateway-epoch invariants.

Full review comments:

  • [P2] Default new worktrees to the selected agent — ui/src/pages/worktrees/worktrees-page.ts:249-250
    The creation form still seeds from agents.defaultId, so operators viewing a non-default agent can create a manual worktree in the wrong repository. Resolve context.agentSelection.state.selectedId first, then fall back to the configured default.
    Confidence: 0.99
  • [P2] Clear create progress when operations are invalidated — ui/src/pages/worktrees/worktrees-page.ts:302-303
    If the Gateway disconnects or is rebound while worktrees.create is pending, the old scope fails this finally guard and creating remains true permanently. Reset creating in invalidateOperations() or unconditionally outside the stale-scope result handling.
    Confidence: 0.99
  • [P2] Reject stale preserved-worktree cleanup outcomes — ui/src/components/app-sidebar.ts:884-895
    sessions.delete() can return deleted: false while retaining worktreePreserved when its refresh crosses to a replacement connection, but this prompt runs before the deleted check and sends force removal through the current client. Only offer cleanup when the delete is current and successful, or strip preserved data from stale outcomes.
    Confidence: 0.97

Overall correctness: patch is incorrect
Overall confidence: 0.98

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 7b03a2ae201a.

Label changes

Label changes:

  • add P2: The PR is a bounded Control UI feature with merge-blocking correctness defects but no core-runtime outage.
  • add merge-risk: 🚨 session-state: Stale session deletion results can trigger cleanup against the wrong Gateway epoch and mis-handle a preserved session-owned checkout.
  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body provides after-fix scratch-gateway evidence for owner links, branch-backed creation, preserved-checkout messaging, and forced cleanup.
  • add rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🐚 platinum hermit and patch quality is 🦪 silver shellfish.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body provides after-fix scratch-gateway evidence for owner links, branch-backed creation, preserved-checkout messaging, and forced cleanup.

Label justifications:

  • P2: The PR is a bounded Control UI feature with merge-blocking correctness defects but no core-runtime outage.
  • merge-risk: 🚨 session-state: Stale session deletion results can trigger cleanup against the wrong Gateway epoch and mis-handle a preserved session-owned checkout.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🐚 platinum hermit and patch quality is 🦪 silver shellfish.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body provides after-fix scratch-gateway evidence for owner links, branch-backed creation, preserved-checkout messaging, and forced cleanup.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body provides after-fix scratch-gateway evidence for owner links, branch-backed creation, preserved-checkout messaging, and forced cleanup.
Evidence reviewed

PR surface:

Source +545, Tests +44, Docs 0. Total +589 across 73 files.

View PR surface stats
Area Files Added Removed Net
Source 68 695 150 +545
Tests 4 50 6 +44
Docs 1 1 1 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 73 746 157 +589

What I checked:

  • Current-main gap: Current main still has the list/delete/restore Worktrees page and boolean session deletion API; it does not contain this PR's creation form, owner links, typed snapshot outcome, or preserved-worktree reporting. (ui/src/pages/worktrees/worktrees-page.ts:124, 7b03a2ae201a)
  • Selected-agent finding remains: Opening the creation form still resolves only agents.defaultId; the current selected agent available through context.agentSelection.state.selectedId is ignored. (ui/src/pages/worktrees/worktrees-page.ts:249, 2b3d0581f021)
  • Create reconnect finding remains: Operation invalidation clears busyId but not creating, while the create finally only clears it for the old operation epoch; a reconnect can therefore leave creation disabled. (ui/src/pages/worktrees/worktrees-page.ts:302, 2b3d0581f021)
  • Delete reconnect finding remains: The session capability can return deleted: false with worktreePreserved after the refresh crosses to a replacement connection, and the sidebar prompts before checking outcome.deleted. (ui/src/components/app-sidebar.ts:884, 2b3d0581f021)
  • Remote-ref finding resolved: The updated foundation now returns remote-only branches with a resolvable qualified name such as origin/feature-a, and this PR forwards branch.name as baseRef; the earlier bare-ref concern no longer applies. (src/agents/worktrees/service.ts:502, 9bbb1b4efaed)
  • Bulk-delete finding resolved: The latest head aggregates preserved worktrees in deleteMany and the Sessions page surfaces one notice after a current-scope result. (ui/src/lib/sessions/index.ts:1048, 2b3d0581f021)

Likely related people:

  • steipete: Recent merged current-main work touches the Control UI sidebar, and this contributor also authored the worktree/session redesign stack, making them the clearest routing owner for the remaining UI invariants. (role: recent area contributor; confidence: high; commits: bacc75a35854, d6c7dbc3aa88; files: ui/src/components/app-sidebar.ts, ui/src/pages/worktrees/worktrees-page.ts, ui/src/lib/sessions/index.ts)
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.

@steipete
steipete force-pushed the feat/sessions-sidebar-redesign branch 3 times, most recently from 487f718 to 9a35da8 Compare July 10, 2026 17:21
@steipete
steipete force-pushed the feat/sessions-sidebar-redesign branch from 06c824d to 11ea65a Compare July 10, 2026 17:45
Base automatically changed from feat/sessions-sidebar-redesign to main July 10, 2026 17:54
steipete added 3 commits July 10, 2026 10:57
…lures, preserved-checkout cleanup

- Worktrees settings page gains an Owner column (manual/Workboard/session
  with a link into the owning chat) and a New worktree form with repo
  default, optional name, and a worktrees.branches-backed base picker
- non-forced worktrees.remove snapshot failures are a structured
  { removed: false, snapshotError } result (typed WorktreeSnapshotError in
  the service) instead of error-string sniffing in the UI
- deleting a session whose dirty/unpushed checkout was preserved now
  reports worktreePreserved through the session capability and offers an
  explicit force removal instead of silently orphaning the checkout

Part of #103431
deleteMany now aggregates worktreePreserved results, and the Sessions
page surfaces one notice pointing at Settings -> Worktrees instead of
silently orphaning dirty checkouts during bulk deletion.

Part of #103431
@steipete
steipete force-pushed the feat/worktrees-page-owners branch from 2b3d058 to fecf6f4 Compare July 10, 2026 18:02
@steipete
steipete merged commit 8f89341 into main Jul 10, 2026
98 checks passed
@steipete
steipete deleted the feat/worktrees-page-owners branch July 10, 2026 18:16
@steipete

Copy link
Copy Markdown
Contributor Author

Merged via squash.

@steipete

Copy link
Copy Markdown
Contributor Author

Before/after screenshots for the Worktrees page (deterministic mock-gateway harness, identical seeded records):

Before — no Owner column, no create form (the stacked layout is a pre-existing breakpoint bug, fixed in #103899):

worktrees before

After — Owner column (Session link / Workboard / Manual) and the New worktree form with base-branch picker:

worktrees after

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 11, 2026
…lures, preserved-checkout cleanup (openclaw#103526)

* feat(ui): worktrees page owners and creation, structured snapshot failures, preserved-checkout cleanup

- Worktrees settings page gains an Owner column (manual/Workboard/session
  with a link into the owning chat) and a New worktree form with repo
  default, optional name, and a worktrees.branches-backed base picker
- non-forced worktrees.remove snapshot failures are a structured
  { removed: false, snapshotError } result (typed WorktreeSnapshotError in
  the service) instead of error-string sniffing in the UI
- deleting a session whose dirty/unpushed checkout was preserved now
  reports worktreePreserved through the session capability and offers an
  explicit force removal instead of silently orphaning the checkout

Part of openclaw#103431

* fix(ui): report preserved checkouts from batch session deletes

deleteMany now aggregates worktreePreserved results, and the Sessions
page surfaces one notice pointing at Settings -> Worktrees instead of
silently orphaning dirty checkouts during bulk deletion.

Part of openclaw#103431

* fix(ui): reconcile generated locale artifacts after rebase
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling app: web-ui App: web-ui docs Improvements or additions to documentation gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. 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.

1 participant