Skip to content

feat(macos): ExecuTorch Parakeet-TDT STT for Talk Mode + model-plugin runtime#50051

Open
seyeong-han wants to merge 35 commits into
openclaw:mainfrom
seyeong-han:feat/parakeet-tdt-metal-macos
Open

feat(macos): ExecuTorch Parakeet-TDT STT for Talk Mode + model-plugin runtime#50051
seyeong-han wants to merge 35 commits into
openclaw:mainfrom
seyeong-han:feat/parakeet-tdt-metal-macos

Conversation

@seyeong-han

@seyeong-han seyeong-han commented Mar 18, 2026

Copy link
Copy Markdown

Summary

openclaw-parakeet-metal.mp4
  • Problem: No on-device STT option for macOS Talk Mode; executorch extension was single-model and injected technical text (e.g. "STT: ExecuTorch Parakeet-TDT") into the prompt and chat UI; PermissionManager could crash when UNUserNotificationCenter.current() was used outside an app bundle (e.g. Xcode run).
  • Why it matters: Users get optional offline Parakeet-TDT STT for Talk Mode; the model no longer echoes STT/backend names; chat shows only the spoken transcript; crashes in non-.app contexts (tests/debug) are avoided.
  • What changed: (1) ExecuTorch Parakeet-TDT Metal runtime as optional Talk Mode STT backend. (2) executorch refactored to model-plugin layout (registry, parakeet plugin, runtime-config). (3) Talk Mode prompt no longer includes STT backend name; chat UI shows only transcript via TalkPromptBuilder.displayText(fromPrompt:). (4) PermissionManager guards notification APIs with canQueryUserNotificationCenter (main bundle is .app).
  • What did NOT change (scope boundary): Default Talk Mode STT remains Apple Speech; gateway chat protocol and session format unchanged; no new gateway APIs; other channels/integrations untouched.
  • Platform support: While this diff focuses on macOS (Metal backend), OpenClaw's native app also supports Windows and Linux with both CUDA and CPU backends for on-device inference.

Change Type (select all)

  • Feature
  • Refactor
  • Bug fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations (executorch plugin, media/STT)
  • API / contracts
  • UI / DX (macOS Talk Mode, chat bubble display)
  • CI/CD / infra

Linked Issue/PR

  • Closes #
  • Related #

User-visible / Behavior Changes

  • New: Optional ExecuTorch Parakeet-TDT STT for Talk Mode (enable via plugin + defaults write … openclaw.talkSttBackend executorch). CLI: openclaw executorch setup|status|transcribe.
  • Changed: Talk Mode user message in chat shows only the transcript; model no longer sees "STT: ExecuTorch Parakeet-TDT" in the prompt.
  • Fixed: No crash when checking notification permission outside an app bundle (e.g. Xcode, tests).

Security Impact (required)

  • New permissions/capabilities? No (existing mic/speech permissions; optional plugin).
  • Secrets/tokens handling changed? No.
  • New/changed network calls? No (on-device STT; executorch setup may download model/runtime from Hugging Face per README).
  • Command/tool execution surface changed? No (new CLI subcommands under existing plugin).
  • Data access scope changed? No.
  • If any Yes, explain: N/A.

Repro + Verification

Environment

  • OS: macOS (Apple Silicon for Parakeet Metal).
  • Runtime/container: Node 22+, macOS app.
  • Model/provider: N/A for STT; model used for Talk Mode reply unchanged.
  • Integration/channel: executorch plugin; macOS Talk Mode.
  • Relevant config (redacted): plugins.entries.executorch.enabled, openclaw.talkSttBackend (macOS defaults).

Steps

  1. Enable executorch plugin; run openclaw executorch setup then openclaw executorch status (all OK).
  2. Set defaults write <bundleId> openclaw.talkSttBackend executorch; relaunch app; use Talk Mode and speak.
  3. Confirm chat user bubble shows only transcript (e.g. "Hello, can you hear me?") and reply does not mention ExecuTorch.
  4. Run macOS app from Xcode (or run tests that hit PermissionManager); confirm no crash on notification permission check.

Expected

  • Talk Mode uses Parakeet when configured; chat shows transcript only; no PermissionManager crash in non-.app runs.

Actual

  • (Match expected after applying this PR.)

Evidence

  • Unit tests: TalkPromptBuilderTests (displayText strips prefix; STT not in prompt).
  • Manual: Talk Mode with executorch; chat transcript-only display; PermissionManager under Xcode/tests.
  • Failing test/log before + passing after (N/A for feature).
  • Perf numbers (if relevant): N/A.

Human Verification (required)

  • Verified scenarios: Talk Mode with executorch backend; chat shows only transcript; executorch status/setup/transcribe; no crash when running from Xcode with notification permission check.
  • Edge cases checked: Voice directive hint on/off; interruption line; non–Talk Mode user messages unchanged.
  • What I did not verify: Other platforms (iOS/Android); long-run stability; upgrade from a repo state before this branch.

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.

Compatibility / Migration

  • Backward compatible? Yes (executorch optional; default STT unchanged; displayText only affects messages that match Talk Mode prompt pattern).
  • Config/env changes? Yes (optional plugin config; optional openclaw.talkSttBackend on macOS).
  • Migration needed? No (new/optional features).
  • If yes, exact upgrade steps: N/A.

Failure Recovery (if this breaks)

  • How to disable/revert: Disable executorch plugin; or set openclaw.talkSttBackend to default/Apple; revert PR.
  • Files/config to restore: plugins.entries.executorch.enabled false; remove or unset openclaw.talkSttBackend.
  • Known bad symptoms: Talk Mode STT fails if executorch enabled but native addon or runtime missing; follow extensions/executorch/README.md setup.

Risks and Mitigations

  • Risk: Parakeet runtime/model mismatch or load failure when executorch is enabled.
    • Mitigation: Plugin logs and executorch status; README troubleshooting; plugin can be disabled without affecting rest of app.
  • Risk: Display text stripping could mis-strip if user message literally starts with the same Talk Mode header.
    • Mitigation: Pattern is specific (starts with "Talk Mode active." and has "\n\n"); normal typing won’t match.
  • Risk: None for PermissionManager change (narrow guard, no behavior change for shipped .app).

@openclaw-barnacle openclaw-barnacle Bot added app: macos App: macos scripts Repository scripts size: XL labels Mar 18, 2026
@greptile-apps

greptile-apps Bot commented Mar 18, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds optional on-device ExecuTorch Parakeet-TDT STT for macOS Talk Mode, refactors the executorch extension into a model-plugin architecture (registry, types, parakeet plugin), fixes the PermissionManager crash when UNUserNotificationCenter is used outside an .app bundle, and ensures chat bubbles show only the spoken transcript rather than the full Talk Mode system prompt.

The overall architecture is solid — the Swift actor (ExecuTorchSTTBridge) with its ring-buffer audio pipeline, VAD-gated polling, delta-suffix streaming, and finalize heuristics is well-thought-out and the FFI layer is correct. The PermissionManager fix is clean and narrowly scoped.

Key issues found:

  • extensions/executorch/index.ts:94 — The gateway_start hook uses a bare require() call inside an ESM package ("type": "module"). This always throws ReferenceError: require is not defined at runtime; the surrounding try/catch swallows it and prints "Native addon not available", giving a false-negative diagnostic even when the addon is properly built. STT still works lazily (the RunnerManager path uses createRequire correctly), but openclaw executorch status / setup logs will mislead users.

  • extensions/executorch/src/runner-manager.ts:79-88ensureReady() has a concurrency race: launch() calls stop() synchronously before its first await, which nulls this.readyPromise. A concurrent ensureReady() call that arrives during that window will bypass the dedup guard and start a second parallel launch, potentially corrupting the runner state.

  • extensions/executorch/src/runner-manager.ts:153-191validatePaths() performs redundant fs.access checks on paths already verified by resolveFirstExisting, introducing unnecessary filesystem round-trips and a minor TOCTOU window.

Confidence Score: 2/5

  • Not safe to merge without addressing the require() ESM bug and the ensureReady() launch race in the Node.js runner layer.
  • Two P1 issues in the TypeScript plugin layer: (1) the gateway_start hook always silently fails with a spurious diagnostic due to bare require() in ESM, and (2) RunnerManager.ensureReady() has a concurrent-launch race that can corrupt runner state under rapid transcription requests. The Swift layer (FFI, STT bridge, PermissionManager, TalkPromptBuilder) appears correct and the test coverage is appropriate.
  • extensions/executorch/index.ts (require() in ESM) and extensions/executorch/src/runner-manager.ts (ensureReady race condition).
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/executorch/index.ts
Line: 93-97

Comment:
**Bare `require()` in ESM module always throws `ReferenceError`**

`package.json` sets `"type": "module"`, so this file is treated as ESM and `require` is not available as a global. At runtime this will throw `ReferenceError: require is not defined`, which is caught by the surrounding `try/catch`, producing the misleading warning *"Native addon not available — on-device STT will not work until the addon is built"* even when the addon is properly built.

The practical consequence is that `openclaw executorch status` / `setup` always show the spurious warning, and the gateway-start log suggests the addon is broken even when it isn't. The addon still loads lazily on first transcription (because `RunnerManager.native` uses the already-imported `loadNativeExecuTorchAddon`), so STT works — but the diagnostics are always wrong.

`loadNativeExecuTorchAddon` is already imported (as a type-only import) from `./src/native-addon.js`. Fix by importing the value and calling it directly, or make the hook async and use `await import(...)`:

```suggestion
    api.registerHook("gateway_start", async () => {
      api.logger.info(
        `[executorch] Registered embedded STT provider (modelPlugin=${modelPlugin.id}, backend=${backend}, library=${runtimeLibraryPath}, models=${modelDir})`,
      );

      try {
        const { loadNativeExecuTorchAddon } = await import("./src/native-addon.js");
        loadNativeExecuTorchAddon();
        api.logger.info("[executorch] Native addon loaded successfully");
      } catch {
        api.logger.warn(
          "[executorch] Native addon not available — on-device STT will not work until the addon is built. " +
            "See extensions/executorch/README.md for setup instructions.",
        );
      }
    });
```

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

---

This is a comment left during a code review.
Path: extensions/executorch/src/runner-manager.ts
Line: 79-104

Comment:
**`readyPromise` guard bypassed by concurrent `ensureReady()` calls**

`launch()` calls `this.stop()` synchronously before its first `await`. `stop()` sets `this.readyPromise = null`. This means that once `launch()` suspends at `await this.validatePaths()`, any concurrent call to `ensureReady()` will see `this._state === "unloaded"` and `this.readyPromise === null`, bypassing the dedup guard and starting a second concurrent launch.

Sequence that triggers the bug:
1. Call A → `ensureReady()` → sets `this.readyPromise = this.launch()`, `launch()` calls `stop()` (nulls `readyPromise`), suspends at `await validatePaths()`.
2. Call B → `ensureReady()``readyPromise` is `null`, `_state` is `"unloaded"` → starts *another* `launch()`.
3. Call B's `launch()` calls `stop()` which destroys the handle being set up by call A, leaving both in an inconsistent state.

In the Talk Mode polling loop (`startOfflinePollTask`) and the finalize path (`forceFinalOfflineDecodeDelta`), concurrent `transcribe()``ensureReady()` calls can realistically interleave here.

Fix: capture the launch promise before mutating `readyPromise` so concurrent callers can share it, or use an internal flag that `stop()` does not clear:

```typescript
async ensureReady(): Promise<void> {
  if (this._state === "ready" && this.isAlive) return;
  if (this.readyPromise) return this.readyPromise;
  const p = this.launch();
  this.readyPromise = p; // assign BEFORE first await so stop() inside launch() can't clear it for new callers
  try {
    await p;
  } finally {
    if (this.readyPromise === p) this.readyPromise = null;
  }
}
```

Additionally, `stop()` should not unconditionally null `readyPromise` — only `launch()` / `ensureReady()` should manage its lifecycle.

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

---

This is a comment left during a code review.
Path: extensions/executorch/src/runner-manager.ts
Line: 153-191

Comment:
**Redundant `fs.access` checks for model and tokenizer paths**

`resolveFirstExisting` already calls `fs.access` on each candidate to find the first existing path. When a path is found, it is added to `required` and then `fs.access` is called on it *again* in the loop at lines 179–185. This doubles the filesystem calls for the common success path and can cause a TOCTOU-style false positive if the file is deleted between the two checks (it would be added to `missing` despite `resolvedModelPath` being truthy).

Consider only adding `this.runtimeLibraryPath` (which is not covered by `resolveFirstExisting`) to `required`, and skip the loop entries for already-resolved model/tokenizer paths:

```typescript
// Only check runtime library in the loop; model/tokenizer are already verified by resolveFirstExisting
const required = [this.runtimeLibraryPath];
if (this.dataPath) required.push(this.dataPath);

for (const p of required) {
  try {
    await fs.access(p);
  } catch {
    missing.push(p);
  }
}
```

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

Last reviewed commit: "Talk Mode: show only..."

Comment thread extensions/executorch/index.ts
Comment thread extensions/executorch/src/runner-manager.ts
Comment thread extensions/executorch/src/runner-manager.ts

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

Copy link
Copy Markdown

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: 1f26cb9152

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/executorch/index.ts
Comment thread apps/macos/Sources/OpenClaw/TalkModeRuntime.swift Outdated
Comment thread extensions/executorch/native/parakeet_runtime_addon.cc Outdated

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

Copy link
Copy Markdown

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: 3bd0f391d3

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/auto-reply/reply/get-reply.ts
Comment thread extensions/executorch/src/runner-manager.ts
Comment thread apps/macos/Sources/OpenClaw/TalkModeRuntime.swift Outdated
seyeong-han and others added 22 commits March 31, 2026 09:18
Replace Voxtral-realtime wiring with an embedded Parakeet-TDT Metal runtime across the executorch plugin and macOS Talk Mode so setup, status, and on-device transcription run through one stable path with simpler artifact management.

Made-with: Cursor
Treat overlapping Parakeet polling outputs as competing hypotheses instead of append-only tails so revised phrases do not concatenate into duplicated transcript lines, and cover the regression with focused merge tests.

Made-with: Cursor
Gate finalize-time deltas on recent voiced activity and simplify finalization to a single vetted tail pass so silence and post-TTS boundaries no longer append phantom words.

Made-with: Cursor
Remove the optional voice-agent demo and revert unrelated plugin/permission tweaks so this branch stays focused on required Parakeet STT integration and Talk Mode behavior.
Document the ExecuTorch Parakeet example repository alongside the model artifact URL so setup references are easier to trace.
Added a link to user attachments in the README.

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

Copy link
Copy Markdown

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: cdf01faef0

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +113 to 116
private fun ChatMessageBody(role: String, content: List<ChatMessageContent>, textColor: Color) {
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
for (part in content) {
when (part.type) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Strip Talk Mode preamble in Android user message rendering

ChatMessageBody now receives role but never uses it, so Android still renders raw user text for Talk Mode turns instead of the transcript-only display introduced elsewhere (TalkPromptBuilder.displayText). In practice, Talk Mode messages synced to Android will continue showing the full "Talk Mode active..." instruction block and directive hints, which is inconsistent with macOS/iOS behavior and defeats the UX change this commit is implementing.

Useful? React with 👍 / 👎.

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

Copy link
Copy Markdown

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: 140491593f

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +107 to +110
std::string g_last_error;

void set_last_error(const std::string& message) {
g_last_error = message;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Eliminate global error buffer shared by async workers

createRunner now runs on libuv worker threads, but failures still write through the process-global g_last_error string. If two createRunner calls fail concurrently (for example from separate RunnerManager instances), unsynchronized writes to the same std::string are a data race and can corrupt memory or crash the process. Keep error state per work item (or make it thread-local/locked) instead of using shared mutable global storage.

Useful? React with 👍 / 👎.


get isAlive(): boolean {
return this.handle !== null;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Relaunch after stop instead of awaiting stale ready promise

When stop() is called during an in-flight cold load, ensureReady() can still return the old readyPromise via this early return. A subsequent caller that arrives before that promise clears will await a launch that was intentionally invalidated by generation checks, then continue with handle === null and fail transcription with Runtime handle is not initialized instead of starting a fresh launch. ensureReady() should detect that the awaited promise did not produce a ready handle and retry launch.

Useful? React with 👍 / 👎.

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

Copy link
Copy Markdown

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: 31293430e2

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/executorch/src/runtime-config.ts
@vincentkoc vincentkoc added the triage: dirty-candidate Candidate: broad unrelated surfaces; may need splitting or cleanup. label Apr 26, 2026
@clawsweeper

clawsweeper Bot commented Apr 28, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 9, 2026, 12:55 AM ET / 04:55 UTC.

Summary
Review failed before ClawSweeper could summarize the requested change.

Reproducibility: unclear. The review failed before ClawSweeper could establish a reproduction path.

Review metrics: none identified.

Merge readiness
Overall: 🌊 off-meta tidepool
Proof: 🌊 off-meta tidepool
Patch quality: 🌊 off-meta tidepool
Result: rating does not apply to this item.

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

Risk before merge

  • [P1] No close action taken because the review did not complete.

Maintainer options:

  1. Decide the mitigation before merge
    Retry the Codex review after fixing the execution failure.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge

  • [P1] Review did not complete, so no work-lane recommendation was made.
Review details

Best possible solution:

Retry the Codex review after fixing the execution failure.

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

Unclear. The review failed before ClawSweeper could establish a reproduction path.

Is this the best way to solve the issue?

Unclear. Retry the review first so ClawSweeper can evaluate the actual issue and fix direction.

AGENTS.md: unclear because the file could not be read completely.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 6fcc9457020e.

Label changes

Label changes:

  • remove P2: Current review triage priority is none.
  • remove merge-risk: 🚨 compatibility: Current PR review selected no merge-risk labels.
  • remove merge-risk: 🚨 security-boundary: Current PR review selected no merge-risk labels.
  • remove merge-risk: 🚨 availability: Current PR review selected no merge-risk labels.

Label justifications:

  • rating: 🌊 off-meta tidepool: Overall readiness is 🌊 off-meta tidepool; proof is 🌊 off-meta tidepool and patch quality is 🌊 off-meta tidepool.
Evidence reviewed

What I checked:

  • failure reason: codex execution failed.
  • codex failure detail: Codex review failed for this PR with exit 1.
  • codex stdout: Per-item Codex failure; continuing with the rest of the shard.

Likely related people:

  • unknown: Codex failed before it could trace repository history. (role: review did not complete; confidence: low)
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.

@clawsweeper clawsweeper Bot added the mantis: telegram-visible-proof Mantis should capture Telegram visible proof. label May 14, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 14, 2026
@clawsweeper clawsweeper Bot added P2 Normal backlog priority with limited blast radius. impact:security Security boundary, credential, authz, sandbox, or sensitive-data risk. impact:auth-provider Auth, provider routing, model choice, or SecretRef resolution may break. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. 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: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. and removed impact:security Security boundary, credential, authz, sandbox, or sensitive-data risk. impact:auth-provider Auth, provider routing, model choice, or SecretRef resolution may break. labels May 17, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

🎁 Pass real behavior proof to wake the egg and unlock a hatchable treat.

Where did the egg go?
  • The egg game starts only after the PR passes the real-behavior proof check.
  • Before that, no creature or rarity is rolled. The treat waits for real proof.
  • This is still just collectible flavor: proof affects review readiness, not creature quality.

@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 8, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. labels Jun 8, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label Jun 9, 2026
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: android App: android app: ios App: ios app: macos App: macos channel: discord Channel integration: discord channel: line Channel integration: line channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web cli CLI command changes docs Improvements or additions to documentation gateway Gateway runtime merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. 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: 🌊 off-meta tidepool PR readiness rating does not apply to this item. scripts Repository scripts size: XL triage: dirty-candidate Candidate: broad unrelated surfaces; may need splitting or cleanup. 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.

2 participants