Skip to content

fix(tui): autocomplete plugin commands like active-memory#73984

Closed
hpt wants to merge 4 commits into
openclaw:mainfrom
hpt:fix/tui-plugin-command-autocomplete
Closed

fix(tui): autocomplete plugin commands like active-memory#73984
hpt wants to merge 4 commits into
openclaw:mainfrom
hpt:fix/tui-plugin-command-autocomplete

Conversation

@hpt

@hpt hpt commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Merge remote command entries from commands.list into TUI slash-command autocomplete so plugin commands (for example /active-memory) appear in suggestions.
  • Refresh remote command suggestions when command context changes (/agent, /model, and session changes that alter agent/provider), while preserving local command argument-completion behavior on name collisions.
  • Align embedded and gateway command listing paths and add targeted TUI tests for command list hydration and refresh behavior.

Test plan

  • pnpm test src/tui/tui.test.ts
  • pnpm test src/tui/tui-command-handlers.test.ts
  • Manual: run pnpm tui, switch via /agents to claude-4, type /act, confirm /active-memory appears in autocomplete.
  • Manual: run /model <provider/model> and verify autocomplete updates to the current command surface.

Made with Cursor

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Thanks for the context here. I did a careful shell check against current main, and this is already implemented.

Close: current main already ships the central TUI plugin-command autocomplete behavior through the merged replacement path, and this older PR is now a conflicting branch with no unique mergeable remainder needed for the reported user problem.

So I’m closing this as already implemented rather than keeping a duplicate issue open.

Review details

Best possible solution:

Keep the shipped commands.list-based TUI autocomplete implementation and handle any newly observed local embedded-mode gap as a fresh narrow report against current main.

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

No current-main reproduction remains: current main and v2026.6.6 include dynamic TUI command fetching and alias merging from commands.list. The original gap is source-proven against the older path and fixed by the replacement merge.

Is this the best way to solve the issue?

Yes. The best solution is the already-shipped Gateway commands.list integration, which keeps command inventory ownership in Gateway/plugin contracts instead of preserving this stale conflicting branch.

Security review:

Security review cleared: The PR diff is limited to TUI runtime/client code and tests, with no dependency, workflow, package, secret, or new code-execution surface identified.

AGENTS.md: found and applied where relevant.

What I checked:

  • Current-main TUI fetches dynamic command suggestions: Current main schedules a dynamic slash-command refresh and calls client.listCommands({ agentId, scope: "text", includeArgs: false }) before applying autocomplete, covering the Gateway-backed plugin command suggestion path. (src/tui/tui.ts:820, 66880a5d736c)
  • Current-main autocomplete merges returned command aliases: getSlashCommands now accepts dynamic command entries and appends their textAliases or names into the slash command list after built-ins, preserving the same central autocomplete behavior requested here. (src/tui/commands.ts:170, 66880a5d736c)
  • Gateway command catalog includes plugin entries: The commands.list result builder includes plugin command entries after chat and skill commands, so the TUI is consuming the canonical Gateway command inventory rather than a separate plugin scan. (src/gateway/server-methods/commands-list-result.ts:228, 66880a5d736c)
  • Merged replacement provenance: Live GitHub data shows the canonical replacement PR merged as 6fcfeed5dc6709ecff6bed5ac2e0085465772767 on 2026-05-19T03:55:27Z for the same Gateway plugin command autocomplete problem. (6fcfeed5dc67)
  • Fix commit metadata: The merge commit subject is fix: include gateway plugin commands in TUI autocomplete (#83941) with commit time 2026-05-19T03:55:26Z. (6fcfeed5dc67)
  • Release provenance: The v2026.6.6 tag contains the TUI dynamic command code and the changelog entry: CLI/TUI: include gateway plugin slash commands in TUI autocomplete... (#83640). (CHANGELOG.md:897, 8c802aa68351)

Likely related people:

  • se7en-agent: Authored the source replacement PR lineage that implemented Gateway-backed TUI plugin-command autocomplete and was later merged through the writable replacement PR. (role: replacement implementation author; confidence: high; commits: 53f8ccd89aa1, 6fcfeed5dc67; files: src/tui/tui.ts, src/tui/commands.ts, src/tui/gateway-chat.ts)
  • samzong: git log -S buildCommandsListResult identifies this person with the commit that added the commands.list RPC surface consumed by the current TUI implementation. (role: protocol feature introducer; confidence: high; commits: 723dec043214; files: src/gateway/server-methods/commands.ts, src/gateway/server-methods/commands-list-result.ts, packages/gateway-protocol/src/schema/commands.ts)
  • Takhoffman: The replacement PR history records this person requesting ClawSweeper automerge for the canonical branch that landed the fix. (role: replacement merge requester; confidence: medium; commits: 6fcfeed5dc67; files: src/tui/tui.ts, src/tui/commands.ts)

Codex review notes: model internal, reasoning high; reviewed against 66880a5d736c; fix evidence: release v2026.6.6, commit 6fcfeed5dc67.

@greptile-apps

greptile-apps Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR introduces listCommands on TuiBackend and wires it into the autocomplete pipeline so plugin commands like /active-memory surface as TUI slash-command suggestions, with cache invalidation on /agent and /model changes.

  • Stale autocomplete on concurrent refresh: when refreshRemoteCommands(true) is called while another fetch is already in flight, the function awaits the existing promise and returns without issuing a new fetch for the updated context (new agent or provider). The cache key is then written with the old context, so the wrong command set is displayed until the user triggers another context change (see comment on tui.ts lines 591–594).
  • The refreshKey closure captures currentAgentId/modelProvider before the async fetch, so a mid-flight external session change can write a stale cache key even when the seq guard is active.

Confidence Score: 3/5

Safe to merge for the happy path, but the concurrent-refresh race can leave plugin commands stale after rapid agent/model switching.

One P1 concurrency defect (forced refresh defers to in-flight, never issues a catch-up fetch for the new context) caps the score at 4; the additional stale-closure concern on the cache key pulls it to 3. Both are in newly added TUI logic not covered by the existing tests for the race scenario.

src/tui/tui.ts — refreshRemoteCommands function (lines 583–627)

Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/tui/tui.ts
Line: 591-594

Comment:
**Stale autocomplete after concurrent forced refresh**

When `force=true` arrives while another fetch is already in flight, the function awaits the existing promise and returns without issuing a new fetch for the *current* context. After the in-flight completes, `remoteCommandsCacheKey` is set to the *old* context key. Because the non-forced path then sees the key as a cache hit, the wrong command set persists until the next agent/model/session change.

A realistic trigger: `/agent Work` starts a fetch tagged `work:openai`; the user immediately runs `/model anthropic/<model>` which calls `refreshRemoteCommands(true)` for `work:anthropic`. That second call defers to the first in-flight and returns — provider-specific plugin commands are never fetched.

The fix is to re-check the context key after the awaited in-flight resolves, and recurse if it has drifted from `remoteCommandsCacheKey`.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/tui/tui.ts
Line: 613

Comment:
**`refreshKey` closure captures pre-fetch context**

`refreshKey` is captured before the `await client.listCommands` call at line 587, so if `currentAgentId` or `sessionInfo.modelProvider` changes during the fetch (via an external session event), `remoteCommandsCacheKey` will be set to the stale key even though `seq === remoteCommandsRefreshSeq`. Consider re-computing the cache key from the live state at completion time, or ensure the seq guard is sufficient to invalidate it.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/tui/tui-backend.ts
Line: 116

Comment:
**`listCommands` is optional on the interface but always called without a null-check in tests**

Marking `listCommands?` as optional is fine for backward-compat, but the call sites in `tui.ts` guard with `typeof client.listCommands !== "function"` while `tui-command-handlers.test.ts` always provides the mock. Consider documenting that implementations should provide the method, or make the guard explicit in all call sites to avoid a silent no-op when a new backend type omits it.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix(tui): autocomplete plugin commands l..." | Re-trigger Greptile

Comment thread src/tui/tui.ts
Comment on lines +591 to +594
if (remoteCommandsRefreshInFlight) {
await remoteCommandsRefreshInFlight;
return;
}

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 Stale autocomplete after concurrent forced refresh

When force=true arrives while another fetch is already in flight, the function awaits the existing promise and returns without issuing a new fetch for the current context. After the in-flight completes, remoteCommandsCacheKey is set to the old context key. Because the non-forced path then sees the key as a cache hit, the wrong command set persists until the next agent/model/session change.

A realistic trigger: /agent Work starts a fetch tagged work:openai; the user immediately runs /model anthropic/<model> which calls refreshRemoteCommands(true) for work:anthropic. That second call defers to the first in-flight and returns — provider-specific plugin commands are never fetched.

The fix is to re-check the context key after the awaited in-flight resolves, and recurse if it has drifted from remoteCommandsCacheKey.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/tui/tui.ts
Line: 591-594

Comment:
**Stale autocomplete after concurrent forced refresh**

When `force=true` arrives while another fetch is already in flight, the function awaits the existing promise and returns without issuing a new fetch for the *current* context. After the in-flight completes, `remoteCommandsCacheKey` is set to the *old* context key. Because the non-forced path then sees the key as a cache hit, the wrong command set persists until the next agent/model/session change.

A realistic trigger: `/agent Work` starts a fetch tagged `work:openai`; the user immediately runs `/model anthropic/<model>` which calls `refreshRemoteCommands(true)` for `work:anthropic`. That second call defers to the first in-flight and returns — provider-specific plugin commands are never fetched.

The fix is to re-check the context key after the awaited in-flight resolves, and recurse if it has drifted from `remoteCommandsCacheKey`.

How can I resolve this? If you propose a fix, please make it concise.

Comment thread src/tui/tui.ts
}))
.filter((command) => Boolean(command.name))
: [];
remoteCommandsCacheKey = refreshKey;

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 refreshKey closure captures pre-fetch context

refreshKey is captured before the await client.listCommands call at line 587, so if currentAgentId or sessionInfo.modelProvider changes during the fetch (via an external session event), remoteCommandsCacheKey will be set to the stale key even though seq === remoteCommandsRefreshSeq. Consider re-computing the cache key from the live state at completion time, or ensure the seq guard is sufficient to invalidate it.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/tui/tui.ts
Line: 613

Comment:
**`refreshKey` closure captures pre-fetch context**

`refreshKey` is captured before the `await client.listCommands` call at line 587, so if `currentAgentId` or `sessionInfo.modelProvider` changes during the fetch (via an external session event), `remoteCommandsCacheKey` will be set to the stale key even though `seq === remoteCommandsRefreshSeq`. Consider re-computing the cache key from the live state at completion time, or ensure the seq guard is sufficient to invalidate it.

How can I resolve this? If you propose a fix, please make it concise.

Comment thread src/tui/tui-backend.ts
@@ -107,4 +112,5 @@ export type TuiBackend = {
resetSession: (key: string, reason?: "new" | "reset") => Promise<unknown>;
getGatewayStatus: () => Promise<unknown>;
listModels: () => Promise<TuiModelChoice[]>;
listCommands?: (opts?: { agentId?: string; provider?: string }) => Promise<TuiCommandChoice[]>;
};

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 listCommands is optional on the interface but always called without a null-check in tests

Marking listCommands? as optional is fine for backward-compat, but the call sites in tui.ts guard with typeof client.listCommands !== "function" while tui-command-handlers.test.ts always provides the mock. Consider documenting that implementations should provide the method, or make the guard explicit in all call sites to avoid a silent no-op when a new backend type omits it.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/tui/tui-backend.ts
Line: 116

Comment:
**`listCommands` is optional on the interface but always called without a null-check in tests**

Marking `listCommands?` as optional is fine for backward-compat, but the call sites in `tui.ts` guard with `typeof client.listCommands !== "function"` while `tui-command-handlers.test.ts` always provides the mock. Consider documenting that implementations should provide the method, or make the guard explicit in all call sites to avoid a silent no-op when a new backend type omits it.

How can I resolve this? If you propose a fix, please make it concise.

@hpt
hpt force-pushed the fix/tui-plugin-command-autocomplete branch 2 times, most recently from 7719365 to 69feb6c Compare April 29, 2026 03:47
@hpt

hpt commented Apr 29, 2026

Copy link
Copy Markdown
Contributor Author

Could a maintainer please rerun the failed checks for this PR?

I don’t have permission to rerun jobs in this repository.
From the logs, the current failures appear unrelated to the TUI changes in this PR:

check-lint: failing on existing lint issues in other files outside this PR’s touched surface.
checks-node-agentic-commands: shard timeout (no output for 180000ms, exit 143).
checks-node-core and check: aggregate failures caused by the two jobs above.
A rerun should help confirm whether these are transient/upstream issues.

hpt added 4 commits April 30, 2026 13:21
Merge remote plugin/active-memory command entries into TUI slash autocomplete and refresh them on agent/model/session context changes while preserving local argument completion behavior on name collisions.

Made-with: Cursor
Re-check command refresh context after awaiting an in-flight request and pin request agent/provider values to avoid dropping forced refreshes during rapid agent/model switches.

Made-with: Cursor
Replace the remaining getSlashCommands test call with getBuiltinSlashCommands to match the renamed API and avoid lint/test-types failures.

Made-with: Cursor
@hpt
hpt force-pushed the fix/tui-plugin-command-autocomplete branch from 90d080d to 66217f6 Compare April 30, 2026 05:23
se7en-agent added a commit to se7en-agent/openclaw that referenced this pull request May 18, 2026
## Summary

- Problem: gateway-connected TUI slash autocomplete used its local/static command list, so plugin commands already exposed by the running Gateway through `commands.list` were invisible in TUI suggestions.
- Why it matters: users can verify plugin commands such as `/phone`, `/pair`, or `/dreaming` in the Gateway command surface, but typing the same prefix in `openclaw tui` did not suggest those plugin-owned commands.
- What changed: `GatewayChatClient` now exposes `commands.list`; TUI fetches text-scope command entries from the connected Gateway when supported and merges their aliases into slash autocomplete while keeping built-ins first.
- What did NOT change (scope boundary): this does not change plugin command registration, command execution/dispatch semantics, Discord native slash command sync, or embedded/local TUI command discovery.

## Change Type (select all)

- [x] Bug fix
- [ ] Feature
- [ ] Refactor required for the fix
- [ ] Docs
- [ ] Security hardening
- [ ] Chore/infra

## Scope (select all touched areas)

- [ ] Gateway / orchestration
- [ ] Skills / tool execution
- [ ] Auth / tokens
- [ ] Memory / storage
- [ ] Integrations
- [ ] API / contracts
- [x] UI / DX
- [ ] CI/CD / infra

## Linked Issue/PR

- Closes #
- Related openclaw#78347
- Related openclaw#73984
- Related openclaw#61966
- [x] This PR fixes a bug or regression

## Real behavior proof (required for external PRs)

- Behavior or issue addressed: plugin commands present in the running Gateway command registry did not appear in `openclaw tui` slash autocomplete.
- Real environment tested: patched OpenClaw Docker image built from this branch (`se7en/openclaw:tui-plugin-autocomplete-test`), OpenClaw `2026.5.17`, loopback Gateway, temporary plugin command setup.
- Exact steps or command run after this patch:
  1. Confirm a plugin command exists in the running Gateway text command surface. Example from an existing OpenClaw setup:
     ```bash
     openclaw gateway call commands.list --params '{"scope":"text","includeArgs":false}' --json \
       | jq '.commands[] | select(.name == "phone")'
     ```
  2. Start the patched TUI against a Gateway with a plugin command loaded.
  3. Type the plugin command prefix, for example `/pho` for `/phone` or `/nemo` in the temporary NemoClaw validation setup.
  4. Submit the plugin command through TUI.
- Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output):
  ```text
  Existing Gateway plugin command example:
  {
    "name": "phone",
    "textAliases": ["/phone"],
    "description": "Arm/disarm high-risk phone node commands (camera/screen/writes).",
    "source": "plugin",
    "scope": "both",
    "acceptsArgs": true
  }

  Patched Docker/TUI validation command surface contained:
  {
    "name": "nemoclaw",
    "nativeName": "nemoclaw",
    "textAliases": ["/nemoclaw"],
    "description": "NemoClaw sandbox management (status, eject).",
    "source": "plugin",
    "scope": "both",
    "acceptsArgs": true
  }

  openclaw tui autocomplete after typing /nemo showed:
  → nemoclaw    NemoClaw sandbox management (status, eject).

  openclaw tui --message '/nemoclaw status' returned:
  NemoClaw: No operations performed yet. Run nemoclaw onboard to get started.
  ```
- Observed result after fix: plugin command aliases from the running Gateway appeared in TUI slash autocomplete and the command could be submitted through the TUI/Gateway path.
- What was not tested: Discord native slash command registration/sync, `openclaw agent --message` plugin dispatch, and embedded/local TUI dynamic plugin discovery.
- Before evidence (optional but encouraged): current installed host OpenClaw `2026.5.12` and sandbox OpenClaw `2026.4.24` TUI bundles used static `getSlashCommands(...)` autocomplete and did not call `commands.list`.

## Root Cause (if applicable)

- Root cause: `src/tui/tui.ts` built its autocomplete provider from `getSlashCommands(...)`, which combined built-in/local command metadata but did not consume the running Gateway's plugin command registry.
- Missing detection / guardrail: there was no TUI-side regression coverage proving `commands.list` entries are requested and merged into slash autocomplete.
- Contributing context (if known): plugin commands can be registered and exposed by the Gateway independently from the static TUI command list, so a connected TUI needs to use the Gateway command surface as the source of truth for dynamic commands.

## Regression Test Plan (if applicable)

- Coverage level that should have caught this:
  - [x] Unit test
  - [x] Seam / integration test
  - [ ] End-to-end test
  - [ ] Existing coverage already sufficient
- Target test or file:
  - `src/tui/commands.test.ts`
  - `src/tui/gateway-chat.test.ts`
- Scenario the test should lock in: dynamic command entries from the Gateway are requested through `commands.list`, merged into TUI slash commands, deduplicated, and do not replace built-in commands on name collisions.
- Why this is the smallest reliable guardrail: it tests the TUI command merge behavior and the Gateway client RPC without requiring a real plugin package or a channel integration.
- Existing test that already covers this (if any): none before this change.
- If no new test is added, why not: N/A; focused tests were added.

## User-visible / Behavior Changes

Gateway-connected `openclaw tui` can now suggest plugin-owned slash command aliases that are already exposed by the running Gateway command surface. Built-in/static suggestions remain first and keep priority on collisions.

## Diagram (if applicable)

```text
Before:
[user types /pho in openclaw tui]
  -> TUI local/static slash list only
  -> plugin command from Gateway commands.list is not suggested

After:
[user types /pho in openclaw tui]
  -> TUI local/static slash list
  -> Gateway commands.list text-scope entries
  -> merged autocomplete suggestions include plugin aliases such as /phone
```

## Security Impact (required)

- New permissions/capabilities? (`Yes/No`): No
- Secrets/tokens handling changed? (`Yes/No`): No
- New/changed network calls? (`Yes/No`): Yes
- Command/tool execution surface changed? (`Yes/No`): No
- Data access scope changed? (`Yes/No`): No
- If any `Yes`, explain risk + mitigation: the TUI may call the existing authenticated Gateway RPC method `commands.list` over the already-established Gateway connection. This reads command metadata only; it does not execute commands or expose secrets. Failures are caught and ignored so autocomplete falls back to the existing static list.

## Repro + Verification

### Environment

- OS: Linux
- Runtime/container: Docker image built from patched OpenClaw source (`se7en/openclaw:tui-plugin-autocomplete-test`)
- Model/provider: not relevant for autocomplete; sandbox test used `nvidia/nemotron-3-super-120b-a12b` for the NemoClaw environment
- Integration/channel (if any): TUI connected to Gateway
- Relevant config (redacted): loopback Gateway with temporary local plugin registration; no secrets included in evidence

### Steps

1. Install or load a plugin that registers a slash command through `api.registerCommand(...)`.
2. Confirm the running Gateway exposes it:
   ```bash
   openclaw gateway call commands.list --params '{"scope":"text","includeArgs":false}' --json
   ```
3. Start `openclaw tui` against that Gateway and type the plugin command prefix.

### Expected

- TUI autocomplete includes plugin command aliases from the running Gateway command surface.

### Actual

- Before this patch, TUI autocomplete only included the local/static slash command list.
- After this patch, plugin command aliases from `commands.list` are merged into autocomplete.

## Evidence

Attach at least one:

- [x] Failing test/log before + passing after
- [x] Trace/log snippets
- [ ] Screenshot/recording
- [ ] Perf numbers (if relevant)

Focused verification run after the final narrowing change:

```bash
COREPACK_HOME=/tmp/corepack PNPM_HOME=/tmp/pnpm \
  node scripts/run-vitest.mjs run \
  src/tui/commands.test.ts \
  src/tui/gateway-chat.test.ts \
  src/tui/embedded-backend.test.ts
# 3 files passed, 43 tests passed

COREPACK_HOME=/tmp/corepack PNPM_HOME=/tmp/pnpm \
  pnpm exec tsc --noEmit --pretty false --project tsconfig.core.json
# passed

git diff --check
# passed
```

## Human Verification (required)

What you personally verified (not just CI), and how:

- Verified scenarios:
  - Patched Docker image built from the OpenClaw branch.
  - Gateway `commands.list` returned a plugin command entry for `/nemoclaw` in the temporary plugin validation setup.
  - Patched `openclaw tui` autocomplete showed `→ nemoclaw    NemoClaw sandbox management (status, eject).`
  - `/nemoclaw status` submitted through the patched TUI/Gateway path returned plugin output.
  - Focused TUI command merge/client tests passed after narrowing the code path to gateway backends.
- Edge cases checked:
  - Dynamic plugin commands do not override built-in command names.
  - `commands.list` failures are soft-failed and leave the static autocomplete list intact.
  - Backends without `listCommands` keep the previous behavior.
- What you did **not** verify:
  - Discord native slash command sync/ack behavior.
  - `openclaw agent --message` plugin command dispatch.
  - Embedded/local TUI dynamic plugin discovery.

## Review Conversations

- [ ] I replied to or resolved every bot review conversation I addressed in this PR.
- [ ] I left unresolved only the conversations that still need reviewer or maintainer judgment.

N/A — no PR review conversations exist yet.

## Compatibility / Migration

- Backward compatible? (`Yes/No`): Yes
- Config/env changes? (`Yes/No`): No
- Migration needed? (`Yes/No`): No
- If yes, exact upgrade steps: N/A

## Risks and Mitigations

- Risk: a Gateway may be older or may reject/fail `commands.list`.
  - Mitigation: the call is optional and failures are ignored; TUI keeps the existing static slash autocomplete.
- Risk: plugin command names could collide with built-in commands.
  - Mitigation: built-in/static commands are added first and dynamic commands are deduplicated without overriding them.
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added stale Marked as stale due to inactivity triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 30, 2026
@clawsweeper clawsweeper Bot added the rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. label May 30, 2026
@barnacle-openclaw barnacle-openclaw Bot removed the stale Marked as stale due to inactivity label May 30, 2026
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Jun 14, 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. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 14, 2026
@clawsweeper

clawsweeper Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper applied the proposed close for this PR.

@clawsweeper clawsweeper Bot closed this Jun 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal backlog priority with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. size: M stale Marked as stale due to inactivity status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant