Skip to content

refactor: reuse shared coercion helpers#86419

Merged
steipete merged 85 commits into
mainfrom
refactor/readability-loc-patterns
May 25, 2026
Merged

refactor: reuse shared coercion helpers#86419
steipete merged 85 commits into
mainfrom
refactor/readability-loc-patterns

Conversation

@steipete

@steipete steipete commented May 25, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace repeated trim/drop-empty/dedupe string-list code with shared helpers, including order-preserving uniqueStrings, unique normalized entries, and unique trimmed-list variants.
  • Reuse the helpers across core CLI, gateway, agents, plugin registry/setup, model catalog, doctor repairs, hooks, PATH handling, receipts, proxy capture, policy surfaces, Codex native search config, plugin SDK channel streaming, media-understanding text extraction, message-access, media URL, install path, update-runner, auth sidecar paths, runtime plugin IDs, pairing allow-from storage, command-risk summaries, and extension provider/channel surfaces.
  • Keep the existing modern-helper refactors and AGENTS readability guidance from the earlier PR stack, while preserving the browser-safe command registry import boundary.

Verification

  • git diff --check
  • node scripts/run-tsgo.mjs -p tsconfig.json --noEmit --pretty false
  • pnpm test src/shared/string-normalization.test.ts src/infra/path-env.test.ts src/infra/path-prepend.test.ts src/gateway/node-command-policy.test.ts src/infra/outbound/outbound-policy.test.ts src/plugins/provider-validation.test.ts src/plugins/bundle-manifest.test.ts src/model-catalog/provider-index/normalize.test.ts src/commands/doctor/shared/allowfrom-fallback-migration.test.ts src/commands/doctor/shared/allowlist-policy-repair.test.ts src/plugins/setup-registry.test.ts src/plugins/plugin-registry.test.ts src/plugins/registry.runtime-config.test.ts src/channels/plugins/catalog.test.ts src/channels/message/receipt.test.ts src/hooks/gmail.test.ts src/proxy-capture/store.sqlite.test.ts src/auto-reply/commands-registry.test.ts src/auto-reply/model.test.ts src/config/channel-capabilities.test.ts src/infra/exec-safe-bin-trust.test.ts
  • pnpm test ui/src/ui/chat/slash-commands.browser-import.test.ts src/auto-reply/commands-registry.test.ts
  • pnpm test src/hooks/workspace.test.ts src/hooks/install.test.ts src/plugin-sdk/channel-streaming.test.ts src/agents/codex-native-web-search.test.ts src/media-understanding/runner.video.test.ts src/media-understanding/media-understanding-misc.test.ts src/agents/tool-policy.test.ts src/agents/sandbox/tool-policy.test.ts src/agents/sandbox/registry.test.ts src/agents/tool-catalog.test.ts src/agents/tool-allowlist-guard.test.ts
  • pnpm test src/infra/update-runner.test.ts src/agents/auth-profiles/persisted-boundary.test.ts src/channels/message-access/message-access.test.ts src/auto-reply/skill-commands.test.ts src/plugin-sdk/access-groups.test.ts src/plugin-sdk/ssrf-policy.test.ts src/agents/pi-embedded-subscribe.tools.extract.test.ts src/agents/pi-embedded-subscribe.tools.media.test.ts src/agents/pi-embedded-subscribe.handlers.messages.test.ts src/agents/pi-embedded-runner/run/tool-media-payloads.test.ts src/agents/subagent-target-policy.test.ts src/agents/skills/filter.test.ts src/media/local-roots.test.ts src/agents/tools/media-tool-shared.test.ts src/commands/onboarding-plugin-install.test.ts src/infra/exec-safe-bin-trust.test.ts
  • pnpm test src/cli/channel-options.test.ts src/pairing/allow-from-store-file.test.ts src/agents/harness/runtime-plugin.test.ts src/infra/command-analysis/risks.test.ts src/infra/command-analysis/inline-eval.test.ts src/infra/command-analysis/explain.test.ts src/infra/command-analysis/explain.lazy.test.ts
  • pnpm test src/infra/host-env-security.test.ts src/infra/exec-safe-bin-trust.test.ts src/infra/approval-native-route-notice.test.ts src/gateway/protocol/index.test.ts src/gateway/server-plugins.test.ts src/gateway/session-transcript-files.fs.archive-events.test.ts src/gateway/session-utils.test.ts src/utils/message-channel.test.ts src/agents/memory-search.test.ts src/agents/auth-profiles/persisted-boundary.test.ts src/agents/cli-backends.test.ts src/agents/cli-runner/prepare.test.ts src/agents/model-scan.test.ts src/agents/openclaw-tools.media-factory-plan.test.ts src/agents/pi-embedded-subscribe.handlers.messages.test.ts src/agents/pi-tools.policy.test.ts src/agents/tools/message-tool.test.ts src/gateway/server/ws-connection/message-handler.post-connect-health.test.ts
  • pnpm test src/commands/auth-choice-options.test.ts src/commands/doctor-memory-search.test.ts src/commands/onboard-helpers.test.ts src/commands/migrate/selection.test.ts src/commands/models/list.provider-catalog.test.ts src/commands/doctor/shared/context-engine-host-compat.test.ts src/commands/doctor/shared/plugin-tool-allowlist-warnings.test.ts src/commands/doctor/shared/plugin-dependency-cleanup.test.ts src/talk/session-log-runtime.test.ts
  • pnpm test packages/memory-host-sdk/src/host/internal.test.ts packages/memory-host-sdk/src/host/backend-config.test.ts
  • pnpm test src/shared/string-normalization.test.ts extensions/phone-control/index.test.ts extensions/slack/src/scopes.test.ts extensions/xai/src/responses-tool-shared.test.ts extensions/discord/src/components.test.ts extensions/discord/src/send.components.test.ts extensions/anthropic/stream-wrappers.test.ts extensions/msteams/src/attachments/graph.test.ts extensions/irc/src/setup.test.ts
  • pnpm test src/secrets/provider-env-vars.test.ts src/secrets/provider-env-vars.dynamic.test.ts src/secrets/channel-env-vars.dynamic.test.ts src/secrets/runtime.test.ts src/secrets/runtime.fast-path.test.ts src/secrets/runtime-web-tools.test.ts src/secrets/runtime-command-secrets.test.ts src/secrets/resolve.test.ts src/channels/plugins/account-helpers.test.ts src/channels/plugins/message-actions.test.ts src/plugins/activation-planner.test.ts src/plugins/tools.optional.test.ts src/plugins/provider-runtime.test.ts src/plugins/discovery.test.ts src/commands/onboard-auth.test.ts
  • pnpm test src/video-generation/runtime.test.ts src/video-generation/capabilities.test.ts src/media-understanding/defaults.test.ts src/media-understanding/runner.video.test.ts src/media-understanding/media-understanding-misc.test.ts src/media-understanding/runner.cli-audio.test.ts src/daemon/service-env.test.ts src/daemon/service-audit.test.ts src/daemon/schtasks.test.ts src/cli/devices-cli.test.ts src/cli/plugins-authoring-command.test.ts src/cron/run-log.test.ts src/agents/model-auth.test.ts src/agents/models-config.providers.live-filter.test.ts src/plugins/captured-registration.test.ts src/infra/command-analysis/explain.test.ts src/plugins/plugin-registry.test.ts
  • pnpm test src/shared/string-normalization.test.ts
  • pnpm test src/plugin-sdk/session-transcript-hit.test.ts src/plugin-sdk/channel-policy.test.ts src/cli/daemon-cli/status.gather.test.ts src/agents/tool-search.test.ts src/agents/code-mode.test.ts src/agents/model-auth-markers.test.ts src/agents/openai-reasoning-effort.test.ts src/plugins/provider-self-hosted-setup.test.ts src/plugins/registry.provider-like.test.ts src/agents/subagent-registry-lifecycle.test.ts src/infra/provider-usage.auth.normalizes-keys.test.ts
  • pnpm test src/channels/status/read-model.test.ts src/channels/config-presence.test.ts src/channels/plugins/read-only.test.ts src/cli/command-secret-targets.test.ts src/cli/command-secret-targets.import.test.ts src/cli/config-cli.test.ts src/cron/isolated-agent/delivery-target.test.ts src/tasks/task-registry.test.ts src/plugins/document-extractors.runtime.test.ts src/plugins/plugin-registry.test.ts src/config/doc-baseline.test.ts src/config/io.shell-env-expected-keys.test.ts src/cli/run-main.exit.test.ts
  • pnpm test extensions/whatsapp/src/inbound/send-result.test.ts extensions/whatsapp/src/inbound/extract.test.ts extensions/whatsapp/src/inbound.test.ts extensions/moonshot/src/kimi-web-search-provider.test.ts extensions/perplexity/src/perplexity-web-search-provider.test.ts extensions/google-meet/index.test.ts extensions/google-meet/src/transports/chrome.test.ts extensions/telegram/src/status.test.ts extensions/nostr/src/channel.inbound.test.ts
  • pnpm test src/infra/bonjour-discovery.test.ts src/infra/tailnet.test.ts src/infra/npm-install-env.test.ts src/auto-reply/heartbeat-filter.test.ts src/flows/doctor-repair-flow.test.ts src/commands/model-picker.test.ts src/plugins/provider-model-helpers.test.ts src/agents/openai-transport-stream.test.ts src/agents/pi-embedded-runner/tool-name-allowlist.test.ts src/gateway/server-methods/agent.test.ts src/gateway/server-methods/chat.directive-tags.test.ts
  • pnpm test extensions/qa-lab/src/token-efficiency-report.test.ts extensions/qa-lab/src/cli.runtime.test.ts extensions/qa-lab/src/character-eval.test.ts extensions/qa-lab/src/scenario-packs.test.ts extensions/qa-lab/src/qa-gateway-config.test.ts extensions/qa-lab/src/multipass.runtime.test.ts extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.test.ts extensions/qa-lab/src/live-transports/whatsapp/whatsapp-live.runtime.test.ts extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts extensions/qa-lab/src/live-transports/discord/discord-live.runtime.test.ts extensions/qa-matrix/src/substrate/config.test.ts extensions/qa-matrix/src/substrate/client.test.ts
  • pnpm test extensions/memory-core/src/dreaming-phases.test.ts extensions/memory-core/src/dreaming.test.ts extensions/memory-core/src/short-term-promotion.test.ts extensions/memory-core/src/memory/manager-search.test.ts extensions/memory-core/src/memory/search-manager.test.ts extensions/memory-core/src/memory/qmd-manager.test.ts extensions/memory-wiki/src/query.test.ts extensions/memory-wiki/src/compile.test.ts extensions/memory-wiki/src/cli.test.ts
  • pnpm test extensions/mattermost/src/mattermost/monitor-auth.test.ts extensions/mattermost/src/mattermost/monitor.test.ts extensions/msteams/src/polls.test.ts extensions/discord/src/monitor/thread-bindings.lifecycle.test.ts extensions/discord/src/voice/command.test.ts extensions/feishu/src/bot.broadcast.test.ts extensions/telegram/src/message-dispatch-dedupe.test.ts extensions/telegram/src/state-migrations.test.ts extensions/matrix/src/matrix/sdk.test.ts extensions/matrix/src/matrix/actions/polls.test.ts extensions/matrix/src/matrix/monitor/events.test.ts extensions/imessage/src/monitor/inbound-processing.test.ts extensions/ollama/src/provider-models.test.ts extensions/browser/src/browser/routes/permissions.test.ts extensions/browser/src/browser/chrome-mcp.test.ts
  • pnpm test extensions/qqbot/src/engine/gateway/interaction-handler.test.ts extensions/qqbot/src/engine/gateway/stages/envelope-stage.test.ts extensions/qqbot/src/engine/commands/builtin/log-helpers.test.ts extensions/codex/src/migration/provider.test.ts extensions/codex/src/app-server/models.test.ts extensions/migrate-hermes/config.test.ts extensions/policy/src/doctor/register.test.ts extensions/volcengine/index.test.ts
  • pnpm test src/infra/outbound/session-binding-service.test.ts src/infra/exec-safe-bin-trust.test.ts src/config/redact-snapshot.raw.test.ts src/auto-reply/reply/startup-context.test.ts src/security/audit-extra.async.test.ts src/agents/harness/native-hook-relay.test.ts
  • pnpm test src/agents/openclaw-tools.session-status.test.ts src/agents/pi-hooks/compaction-safeguard.test.ts src/security/audit-channel-source-config-slack.test.ts src/security/audit-channel-source-config-discord.test.ts src/security/audit-channel-dm-policy.test.ts src/security/audit-channel-readonly-setup-fallback.test.ts src/security/audit-channel-readonly-resolution.test.ts src/security/audit-channel-account-metadata.test.ts
  • pnpm test extensions/comfy/index.test.ts extensions/comfy/image-generation-provider.test.ts extensions/comfy/video-generation-provider.test.ts extensions/comfy/music-generation-provider.test.ts
  • pnpm test src/plugins/hooks.sync-only.test.ts src/plugins/hooks.before-tool-call.test.ts src/plugins/plugin-registry.test.ts src/test-utils/openclaw-test-state.test.ts src/agents/tools/message-tool.test.ts src/agents/pi-tools.policy.test.ts src/plugins/provider-public-artifacts.test.ts src/plugins/document-extractor-public-artifacts.test.ts src/plugins/web-provider-public-artifacts.test.ts
  • pnpm test extensions/memory-core/src/memory/manager-search.test.ts extensions/memory-core/src/memory/search-manager.test.ts extensions/memory-core/src/memory/qmd-manager.test.ts extensions/qa-matrix/src/substrate/client.test.ts extensions/openai/openai-codex-provider.test.ts src/shared/string-normalization.test.ts src/plugin-sdk/channel-policy.test.ts
  • pnpm test src/infra/restart-stale-pids.test.ts src/infra/gateway-processes.test.ts extensions/matrix/src/matrix/actions/polls.test.ts extensions/browser/src/browser/chrome-mcp.test.ts extensions/browser/src/browser/pw-session.page-cdp.test.ts src/gateway/mcp-http.test.ts src/agents/pi-tools.schema.test.ts src/agents/pi-tools.policy.test.ts src/agents/schema/clean-for-gemini.test.ts
  • pnpm test src/channels/bundled-channel-catalog-read.test.ts src/channels/plugins/catalog.test.ts src/plugins/official-external-plugin-catalog.test.ts src/plugins/manifest-registry.test.ts src/config/validation.channel-metadata.test.ts src/auto-reply/reply/group-id.test.ts src/infra/outbound/outbound-session.test.ts src/media-understanding/runner.video.test.ts src/media-understanding/media-understanding-misc.test.ts src/media/image-ops.helpers.test.ts src/media/web-media.test.ts src/plugins/bundled-plugin-metadata.test.ts src/plugins/stage-bundled-plugin-runtime.test.ts src/plugins/public-surface-loader.test.ts src/cli/gateway-cli/qa-parent-watchdog.test.ts src/commands/doctor-state-integrity.test.ts extensions/meeting-notes/index.test.ts extensions/memory-core/src/dreaming-phases.test.ts extensions/memory-wiki/src/apply.test.ts extensions/memory-wiki/src/cli.test.ts extensions/active-memory/index.test.ts extensions/feishu/src/docx.test.ts extensions/qa-lab/src/gateway-child.test.ts extensions/qa-lab/src/run-config.test.ts
  • pnpm test src/plugin-sdk/reply-payload.test.ts src/plugin-sdk/provider-entry.test.ts src/plugin-sdk/windows-spawn.test.ts src/plugin-sdk/allow-from.test.ts src/agents/channel-tools.test.ts src/agents/memory-search.test.ts src/agents/openai-reasoning-effort.test.ts src/agents/models-config.providers.live-filter.test.ts src/agents/models-config.providers.implicit.discovery-scope.test.ts src/agents/live-auth-keys.test.ts src/agents/model-scan.test.ts src/agents/tool-search.test.ts src/agents/cli-output.test.ts src/agents/system-prompt-params.test.ts src/agents/pi-embedded-runner/run/attempt.session-lock.test.ts src/agents/pi-embedded-runner/run/attempt.tool-call-normalization.test.ts src/agents/pi-embedded-runner/run.incomplete-turn.test.ts src/agents/bash-tools.exec-runtime.test.ts src/agents/bash-tools.exec-approval-request.test.ts src/agents/skills-install.test.ts src/agents/skills-install-fallback.test.ts
  • pnpm test src/channels/account-snapshot-fields.test.ts src/channels/plugins/setup-group-access.test.ts src/channels/plugins/setup-group-access-configure.test.ts src/channels/plugins/setup-wizard-helpers.test.ts src/channels/message-access/message-access.test.ts src/plugins/setup-registry.test.ts src/plugins/setup-registry.runtime.test.ts src/plugins/captured-registration.test.ts src/plugins/plugin-scope.test.ts src/plugins/dependency-denylist.test.ts src/plugins/document-extractors.runtime.test.ts src/plugins/config-contracts.test.ts src/agents/model-compat.test.ts
  • pnpm test packages/memory-host-sdk/src/host/internal.test.ts packages/memory-host-sdk/src/host/backend-config.test.ts src/media-understanding/runner.video.test.ts src/media-understanding/media-understanding-misc.test.ts src/media-understanding/runner.cli-audio.test.ts src/cron/run-log.test.ts src/secrets/runtime-config-collectors-plugins.bundled.test.ts
  • pnpm test extensions/voice-call/src/webhook.test.ts extensions/voice-call/src/webhook-security.test.ts extensions/voice-call/src/response-generator.test.ts extensions/twitch/src/setup-surface.test.ts extensions/twitch/src/outbound.test.ts extensions/tlon/src/core.test.ts extensions/zalouser/src/setup-surface.test.ts extensions/line/src/reply-payload-transform.test.ts extensions/line/src/setup-surface.test.ts extensions/telegram/src/bot-handlers.runtime.test.ts
  • pnpm test extensions/slack/src/interactive-replies.test.ts extensions/irc/src/setup.test.ts extensions/msteams/src/sdk.test.ts extensions/msteams/src/outbound.test.ts extensions/msteams/src/probe.test.ts extensions/msteams/src/directory-live.test.ts extensions/msteams/src/polls.test.ts extensions/meeting-notes/index.test.ts extensions/meeting-notes/src/cli.test.ts
  • pnpm test extensions/memory-core/src/memory/hybrid.test.ts extensions/memory-core/src/memory/manager-search.test.ts extensions/memory-core/src/memory/search-manager.test.ts extensions/memory-core/src/dreaming-phases.test.ts extensions/memory-core/src/dreaming.test.ts extensions/memory-core/src/dreaming-repair.test.ts
  • pnpm test extensions/openai/embedding-batch.test.ts extensions/google/embedding-provider.test.ts extensions/anthropic/stream-wrappers.test.ts extensions/lmstudio/src/setup.test.ts
  • pnpm test extensions/qa-lab/src/coverage-report.test.ts extensions/qa-lab/src/docker-up.runtime.test.ts extensions/qa-lab/src/docker-harness.test.ts extensions/qa-lab/src/live-transports/whatsapp/whatsapp-live.runtime.test.ts extensions/qa-matrix/src/substrate/client.test.ts extensions/qa-matrix/src/substrate/config.test.ts
  • pnpm test src/commands/docs.test.ts src/infra/gateway-process-argv.test.ts src/infra/ssh-tunnel.test.ts src/infra/install-source-utils.test.ts src/daemon/systemd-unit.test.ts src/daemon/systemd.test.ts src/daemon/service-audit.test.ts
  • pnpm test extensions/feishu/src/outbound.test.ts extensions/feishu/src/comment-shared.test.ts extensions/synology-chat/src/core.test.ts extensions/synology-chat/src/channel.test.ts extensions/nostr/src/channel.test.ts extensions/whatsapp/src/resolve-outbound-target.test.ts extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.test.ts extensions/imessage/src/actions.runtime.test.ts extensions/imessage/src/probe.test.ts
  • pnpm test src/infra/bonjour-discovery.test.ts src/infra/exec-approval-forwarder.test.ts src/infra/clawhub.test.ts src/infra/control-ui-assets.test.ts src/infra/update-runner.test.ts src/security/audit-extra.async.test.ts src/security/audit-gateway.test.ts src/gateway/server-methods/config.test.ts src/wizard/setup.plugin-config.test.ts src/gateway/server-methods/agent.test.ts src/cli/plugins-install-config.test.ts
  • pnpm test extensions/slack/src/scopes.test.ts extensions/slack/src/setup-surface.test.ts extensions/phone-control/index.test.ts extensions/qa-matrix/src/substrate/config.test.ts extensions/telegram/src/message-dispatch-dedupe.test.ts extensions/telegram/index.test.ts extensions/discord/index.test.ts extensions/lmstudio/src/setup.test.ts extensions/memory-wiki/src/apply.test.ts extensions/memory-wiki/src/cli.test.ts extensions/zalouser/src/setup-surface.test.ts
  • pnpm test src/security/audit-gateway.test.ts src/plugin-sdk/channel-policy.test.ts extensions/browser/src/node-host/invoke-browser.test.ts extensions/signal/src/normalize.test.ts extensions/mattermost/src/mattermost/monitor-onchar.test.ts extensions/msteams/src/channel.test.ts extensions/matrix/src/matrix/sdk.test.ts extensions/memory-core/src/short-term-promotion.test.ts extensions/qa-lab/src/suite.test.ts
  • pnpm test ui/src/ui/chat/message-extract.test.ts ui/src/ui/views/agents-panels-tools-skills.browser.test.ts ui/src/ui/views/cron.test.ts ui/src/ui/app-render.helpers.browser.test.ts extensions/qa-matrix/src/runners/contract/runtime.test.ts extensions/codex/src/app-server/event-projector.test.ts extensions/memory-core/src/dreaming-phases.test.ts extensions/acpx/src/runtime.test.ts extensions/whatsapp/src/inbound/send-result.test.ts extensions/active-memory/index.test.ts extensions/matrix/src/approval-handler.runtime.test.ts extensions/mattermost/src/mattermost/monitor-resources.test.ts src/auto-reply/commands-registry.test.ts src/commands/agent.runtime-config.test.ts
  • pnpm test extensions/qa-lab/src/character-eval.test.ts extensions/qa-lab/src/gateway-child.test.ts src/agents/subagent-announce-delivery.test.ts src/agents/subagent-announce.test.ts
  • pnpm test src/agents/model-auth.test.ts src/agents/models-config.providers.plugin-allowlist-compat.test.ts src/channels/plugins/account-helpers.test.ts src/infra/net/ssrf.test.ts src/media-understanding/apply.test.ts extensions/whatsapp/src/inbound.test.ts
  • pnpm test extensions/irc/src/normalize.test.ts extensions/irc/src/setup.test.ts src/agents/auth-health.test.ts src/agents/subagent-target-policy.test.ts src/infra/net/ssrf.test.ts src/model-catalog/manifest-planner.test.ts src/plugins/tools.optional.test.ts src/security/audit-extra.sync.test.ts
  • pnpm test src/agents/model-auth.test.ts src/plugin-sdk/ssrf-policy.test.ts src/agents/tool-allowlist-guard.test.ts src/agents/pi-embedded-runner/run/attempt-tool-construction-plan.test.ts src/pairing/allow-from-store-read.test.ts src/security/audit-extra.async.test.ts src/infra/provider-usage.auth.plugin.test.ts src/infra/provider-usage.auth.normalizes-keys.test.ts src/plugins/web-provider-public-artifacts.test.ts src/plugins/web-provider-public-artifacts.fallback.test.ts
  • pnpm test src/auto-reply/reply/commands-dock.test.ts src/commands/doctor-command-owner.test.ts src/gateway/server-methods/nodes-pending.test.ts src/gateway/server-methods/nodes.invoke-wake.test.ts src/agents/tools/sessions-resolution.test.ts src/agents/skills.test.ts src/agents/skills.buildworkspaceskillsnapshot.test.ts src/agents/auth-profiles/state-observation.test.ts
  • pnpm test src/shared/string-coerce.test.ts src/commands/doctor-session-state-providers.test.ts src/commands/sandbox-explain.test.ts src/agents/runtime-capabilities.test.ts src/agents/system-prompt.test.ts extensions/matrix/src/matrix/monitor/auto-join.test.ts extensions/matrix/src/approval-handler.runtime.test.ts extensions/qqbot/src/command-auth.test.ts extensions/signal/src/monitor/access-policy.test.ts ui/src/ui/controllers/cron.test.ts ui/src/ui/views/activity.test.ts
  • pnpm test extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts extensions/slack/src/monitor/slash.test.ts extensions/synology-chat/src/channel.test.ts
  • pnpm test src/shared/string-normalization.test.ts src/infra/host-env-security.test.ts src/infra/host-env-security.policy-parity.test.ts src/infra/host-env-security.reported-baseline.test.ts src/gateway/node-catalog.test.ts src/gateway/server-methods/environments.test.ts src/plugins/providers.test.ts src/plugins/contracts/loader.contract.test.ts src/plugins/contracts/registry.contract.test.ts extensions/qa-lab/src/providers/image-generation.test.ts extensions/slack/src/channel.test.ts extensions/slack/src/interactive-replies.test.ts
  • pnpm test src/commands/doctor-device-pairing.test.ts extensions/slack/src/monitor/events/interactions.test.ts
  • pnpm test extensions/lmstudio/src/models.test.ts src/agents/api-key-rotation.test.ts src/agents/model-auth-label.test.ts src/agents/harness/runtime-plugin.test.ts src/channels/channel-config.test.ts src/gateway/input-allowlist.test.ts
  • pnpm test src/commands/doctor-device-pairing.test.ts src/media-generation/catalog.test.ts src/channels/plugins/directory-config-helpers.test.ts
  • pnpm test src/shared/string-normalization.test.ts src/infra/diagnostic-flags.test.ts src/agents/pi-tools.policy.test.ts src/channels/plugins/session-conversation.test.ts src/channels/plugins/session-conversation.bundled-fallback.test.ts extensions/tlon/src/monitor/settings-helpers.test.ts extensions/tlon/src/core.test.ts
  • pnpm test src/agents/bootstrap-budget.test.ts src/agents/pi-auth-discovery.external-cli.test.ts src/gateway/sessions-patch.test.ts src/agents/subagent-spawn.depth-limits.test.ts src/agents/tools/sessions-spawn-tool.test.ts src/infra/device-pairing.test.ts src/infra/device-pairing-churn.test.ts extensions/codex/src/app-server/config.test.ts src/agents/subagent-announce-delivery.test.ts src/agents/tools/media-generate-background-shared.test.ts
  • pnpm test extensions/codex/src/commands.test.ts extensions/codex/src/app-server/config.test.ts
  • env -u OPENCLAW_TESTBOX pnpm check:changed
  • /Users/steipete/Projects/agent-skills/skills/autoreview/scripts/autoreview --mode local

Real behavior proof

Behavior addressed: Repeated string-list normalization code is centralized without changing trim, blank-drop, ordering, sorting, or dedupe semantics at the touched call sites; string-only raw-array normalization still skips non-strings; the browser command registry import boundary remains unchanged.
Real environment tested: Local macOS checkout on repo Node/pnpm defaults.
Exact steps or command run after this patch: git diff --check; node scripts/run-tsgo.mjs -p tsconfig.json --noEmit --pretty false; targeted pnpm test commands listed above; env -u OPENCLAW_TESTBOX pnpm check:changed; /Users/steipete/Projects/agent-skills/skills/autoreview/scripts/autoreview --mode local.
Evidence after fix: Earlier targeted tests passed 21 files / 252 tests across 8 Vitest shards; browser-import follow-up passed 2 files / 30 tests across 2 shards; trimmed-list/tool-policy batch passed 11 files / 127 tests across 5 shards; string-dedupe helper batch passed 16 files / 276 tests across 7 shards; local dedupe helper batch passed 7 files / 57 tests across 5 shards; latest internal string dedupe batch passed 18 files / 508 tests across 5 shards; command/talk string dedupe batch passed 9 files / 161 tests across 3 shards plus the rerun of plugin-tool warnings passed 1 file / 30 tests; memory SDK path dedupe batch passed 2 files / 31 tests; plugin SDK/export batch passed 9 files / 107 tests across 7 shards plus the IRC rerun passed 1 file / 10 tests; core secrets/channel/plugin helper batch passed 15 files / 342 tests across 4 shards; shared unique-value helper batch passed 17 files / 365 tests across 7 shards plus the helper unit rerun passed 1 file / 33 tests; agent utility unique-helper batch passed 10 files / 185 tests across 5 shards after dropping one nonexistent direct test path; config/channel unique-helper batch passed 13 files / 405 tests across 7 shards after dropping one nonexistent direct test path; extension unique-helper batch passed 9 files / 201 tests across 6 shards; core utility unique-helper batch passed 11 files / 530 tests across 6 shards; QA Lab/Matrix unique-helper batch passed 12 files / 234 tests across 2 shards; memory plugin unique-helper batch passed 9 files / 355 tests across 1 shard; channel plugin unique-helper batch passed 15 files / 325 tests across 9 shards; plugin-tail unique-helper batch passed 8 files / 199 tests across 3 shards; core-tail unique-helper batch passed 14 files / 258 tests across 8 shards after dropping three nonexistent direct paths; Comfy workflow unique-helper batch passed 4 files / 17 tests across 1 shard; core test-helper unique-helper batch passed 9 files / 181 tests across 3 shards; plugin unique-values export batch passed 7 files / 247 tests across 4 shards; numeric/schema unique-helper batch passed 9 files / 249 tests with 2 skipped across 6 shards; index-filter dedupe batch passed 24 files across 14 shards; agent/plugin-sdk trim-normalization batch passed 21 files / 393 tests across 3 shards; channel/plugin helper trim-normalization batch passed 13 files / 221 tests across 4 shards; memory/media/secrets trim-normalization batch passed 7 files / 65 tests across 4 shards; extension trim-normalization batch passed 10 files / 168 tests across 5 shards; channel parser trim-normalization batch passed 9 files / 82 tests across 4 shards; memory search trim-normalization batch passed 6 files / 149 tests across 1 shard; provider parser trim-normalization batch passed 4 files / 61 tests across 2 shards after dropping one nonexistent Voyage direct test path; QA runtime trim-normalization batch passed 6 files / 44 tests across 2 shards after dropping one nonexistent docker-runtime direct test path; infra parser trim-normalization batch passed 7 files / 140 tests across 4 shards; messaging parser trim-normalization batch passed 9 files / 240 tests across 4 shards; core parser trim-normalization batch passed 11 files / 290 tests across 5 shards; extension parser trim-normalization batch passed 11 files / 96 tests across 8 shards; remaining parser trim-normalization batch passed 9 files / 198 tests across 8 shards; final parser trim-normalization batch passed 14 files / 377 tests across 10 shards; QA media normalization batch passed 4 files / 143 tests across 2 shards; provider/media normalization batch passed 6 files / 208 tests across 5 shards; set-filter normalization batch passed 8 files / 161 tests across 4 shards; policy allowlist normalization batch passed 10 files / 169 tests across 5 shards; session/owner normalization batch passed 8 files / 75 tests across 4 shards; primitive string-list helper batch passed 11 files / 179 tests across 7 shards; lowercase entry helper batch passed 3 files / 89 tests across 3 shards; sorted helper batch passed 12 files / 210 tests across 7 shards; unique trimmed helper batch passed 2 files / 51 tests across 2 shards; final helper reuse batch passed 6 files / 69 tests across 4 shards; catalog helper reuse batch passed 3 files / 22 tests across 2 shards; remaining string helper batch passed 7 files / 144 tests across 4 shards; final list-normalization batch passed 10 files / 279 tests across 5 shards; Codex auth order helper batch passed 2 files / 159 tests across 1 shard; root tsgo passed; extension tsgo rerun passed after removing an unused import; check:changed passed typecheck, lint, import-cycle, and guard lanes; autoreview reported no accepted/actionable findings.
Observed result after fix: PR diff is now 725 files, +2511/-3730, net -1219 LOC, while replacing another obvious string/list normalization and dedupe cluster with shared helpers.
What was not tested: Live provider and cross-platform E2E scenarios; this is a local refactor. pnpm build was not rerun after the final helper batches.

@openclaw-barnacle openclaw-barnacle Bot added size: S maintainer Maintainer-authored PR labels May 25, 2026
@clawsweeper

clawsweeper Bot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed May 25, 2026, 3:51 PM ET / 19:51 UTC.

Summary
The PR adds and reuses shared coercion, list-normalization, dedupe, and primitive helpers across core, Plugin SDK, UI, channels, providers, and bundled plugins.

Reproducibility: not applicable. as an issue reproduction; this is a PR review. The blocking concerns are source-reproducible from the diff: public SDK export expansion, Google Meet record coercion broadening, memory extraPaths stringification, and locale-dependent shared sorting.

Review metrics: 1 noteworthy metric.

  • Public SDK helper exports: 13 added; API baseline hashes changed. The PR widens a third-party plugin API subpath, so maintainers should review the compatibility contract before merge.

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

  • Add redacted real after-fix proof from one or more affected runtime surfaces, not only test commands.
  • Keep the string SDK subpath narrow or get explicit maintainer approval for a new public helper surface.
  • Restore strict record/path-list semantics and deterministic shared sorting before re-review.

Proof guidance:
Needs real behavior proof before merge: The PR body lists commands only, and a maintainer requested live proof; the contributor should add redacted terminal output, logs, screenshots, recordings, or linked artifacts from a real affected surface and update the PR body for a fresh review.

Risk before merge

  • Publishing non-string helpers from the existing string SDK subpath can create a permanent third-party plugin API contract before maintainers have approved that surface.
  • Config and path normalization changes can alter malformed-but-real user configs, including Google Meet provider config arrays and memorySearch.extraPaths non-string entries.
  • The PR still lacks redacted real after-fix proof from any affected runtime surface, so the long test list does not settle live upgrade or runtime behavior.

Maintainer options:

  1. Narrow helpers and preserve semantics (recommended)
    Move or remove broad non-string SDK exports, restore strict record/string-list behavior where callers relied on it, and refresh the API baseline only for the intended contract.
  2. Approve the broader SDK contract
    Maintainers can intentionally accept the expanded public subpath only after deciding the compatibility surface and documenting or testing the upgrade behavior.
  3. Pause for real proof
    Keep the PR waiting until the contributor adds redacted live output, logs, screenshots, recordings, or linked artifacts from a real affected surface.

Next step before merge
Manual review is needed because the remaining blockers include public SDK direction and contributor real behavior proof that repair automation cannot supply.

Security
Needs attention: No dependency or workflow supply-chain change was found, but the memory extraPaths normalization changes a filesystem read/index allowlist boundary.

Review findings

  • [P1] Keep non-string helpers out of the string SDK subpath — src/plugin-sdk/string-coerce-runtime.ts:17-22
  • [P2] Reject arrays when resolving Google Meet provider config — extensions/google-meet/src/config.ts:7
  • [P2] Preserve string-only memory extra paths — src/agents/memory-search.ts:243-246
Review details

Best possible solution:

Land only a narrowed refactor that preserves existing coercion semantics, keeps public SDK exports intentional and documented, uses deterministic sorting, and includes redacted real behavior proof.

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

Not applicable as an issue reproduction; this is a PR review. The blocking concerns are source-reproducible from the diff: public SDK export expansion, Google Meet record coercion broadening, memory extraPaths stringification, and locale-dependent shared sorting.

Is this the best way to solve the issue?

No; the cleanup direction is reasonable, but the current implementation broadens public API and config/path semantics. The safer solution is a narrower refactor that preserves existing behavior and adds real runtime proof.

Full review comments:

  • [P1] Keep non-string helpers out of the string SDK subpath — src/plugin-sdk/string-coerce-runtime.ts:17-22
    This public SDK subpath is currently the narrow string-coercion runtime surface, but the PR adds number, boolean, and generic unique helpers to it and refreshes the API baseline. Because SDK exports become third-party plugin contract, keep this subpath string-focused or add an explicitly approved narrow surface with matching docs/tests.
    Confidence: 0.9
  • [P2] Reject arrays when resolving Google Meet provider config — extensions/google-meet/src/config.ts:7
    The removed local helper returned {} for arrays, but SDK asRecord accepts any object, including arrays. resolveProvidersConfig then iterates Object.entries(raw), so an array under provider config can create numeric provider IDs instead of being ignored; use a strict record helper for config roots.
    Confidence: 0.88
  • [P2] Preserve string-only memory extra paths — src/agents/memory-search.ts:243-246
    normalizeStringEntries stringifies every entry, while memorySearch.extraPaths is a schema-backed string list used for memory path indexing. This can turn invalid config values like false or objects into path strings; keep this normalization string-only before path handling.
    Confidence: 0.78
  • [P2] Use a locale-independent shared string sort — src/shared/string-normalization.ts:20
    sortUniqueStrings centralizes sorted IDs, labels, allowlists, and cache/config inputs, but localeCompare can vary with host locale/ICU and replaces some code-unit .toSorted() call sites. Use a deterministic comparator so normalized lists stay stable across environments.
    Confidence: 0.82

Overall correctness: patch is incorrect
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add merge-risk: 🚨 security-boundary: The memorySearch.extraPaths refactor can stringify non-string config values before path handling, which touches a filesystem read/index allowlist boundary.

Label justifications:

  • P3: This is a broad cleanup/refactor PR with merge blockers, but it is not an urgent shipped-user regression.
  • merge-risk: 🚨 compatibility: The diff expands public Plugin SDK exports and changes config normalization behavior that existing plugins or configs could rely on.
  • merge-risk: 🚨 security-boundary: The memorySearch.extraPaths refactor can stringify non-string config values before path handling, which touches a filesystem read/index allowlist boundary.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🧂 unranked krab.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body lists commands only, and a maintainer requested live proof; the contributor should add redacted terminal output, logs, screenshots, recordings, or linked artifacts from a real affected surface and update the PR body for a fresh review.
Evidence reviewed

Security concerns:

  • [medium] Non-string extra paths can become memory roots — src/agents/memory-search.ts:243
    The changed normalization stringifies every extraPaths entry before dedupe, so invalid config values can become path strings that later feed memory path resolution and indexing.
    Confidence: 0.72

What I checked:

  • Repository policy applied: Root AGENTS.md and relevant scoped guides were read; Plugin SDK exports, config normalization, channel/plugin paths, and proof requirements are compatibility-sensitive review surfaces. (AGENTS.md:18, a0023fbfa0ab)
  • Live PR state: GitHub API shows the PR is open at head b0f8fd6 with 727 changed files, mergeable_state unstable, the maintainer label, and no merge. (b0f8fd6ccf88)
  • Real proof is still missing: The PR body lists test/typecheck commands, and a maintainer comment asks for live proof from an affected surface rather than only tests, mocked tests, or source inspection. (b0f8fd6ccf88)
  • Public SDK surface expansion: The diff adds 13 exports to the existing string-coerce-runtime SDK subpath and refreshes SDK API baseline hashes, widening the third-party plugin contract. (src/plugin-sdk/string-coerce-runtime.ts:17, b0f8fd6ccf88)
  • Google Meet config semantics change: The diff replaces Google Meet's local array-rejecting config record helper with SDK asRecord, while resolveProvidersConfig iterates Object.entries(raw); arrays can become numeric provider IDs instead of being ignored. (extensions/google-meet/src/config.ts:7, b0f8fd6ccf88)
  • Memory extraPaths coercion changes: The diff changes memorySearch.extraPaths from string trim/dedupe to normalizeStringEntries, which stringifies non-string entries before they feed memory path handling. (src/agents/memory-search.ts:243, b0f8fd6ccf88)

Likely related people:

  • fuller-stack-dev: GitHub commit/PR metadata and current-main blame tie the central shared coercion, Plugin SDK helper facade, Google Meet config, and memory-search helper surfaces to d5b0174. (role: recent area contributor; confidence: medium; commits: d5b0174eb1d7; files: src/shared/string-normalization.ts, src/shared/record-coerce.ts, src/plugin-sdk/string-coerce-runtime.ts)
  • steipete: Recent main history shows repeated shared helper, Plugin SDK, allowlist, and memory-search refactors by Peter Steinberger on the same surfaces, so he is a relevant routing candidate beyond authoring this PR. (role: adjacent owner; confidence: medium; commits: 418056f7a0c8, 9db1a7acf0c6, 8407eeb33c15; files: src/plugin-sdk/string-coerce-runtime.ts, src/shared/record-coerce.ts, src/shared/string-normalization.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.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime agents Agent runtime and tooling labels May 25, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. labels May 25, 2026
@clawsweeper

clawsweeper Bot commented May 25, 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.

@steipete steipete requested a review from a team as a code owner May 25, 2026 09:45
@openclaw-barnacle openclaw-barnacle Bot added cli CLI command changes commands Command implementations size: M and removed size: S labels May 25, 2026
@steipete steipete changed the title refactor: share talk event metric extraction refactor: reuse shared coercion helpers May 25, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels May 25, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels May 25, 2026
@openclaw-barnacle openclaw-barnacle Bot added the channel: msteams Channel integration: msteams label May 25, 2026
@steipete

Copy link
Copy Markdown
Contributor Author

Verification for head 29146d7e880a8e95b9f199874f5c83ae4c017cfe:

Behavior addressed: PR branch rebased onto current main; conflict resolutions preserve current Feishu native card sanitization, Discord realtime wake-name sorting, Claude live-control request handling, provider model-support regex safety, and refreshed plugin SDK API baseline.
Real environment tested: local macOS checkout; GitHub Actions for PR head 29146d7e880a8e95b9f199874f5c83ae4c017cfe.
Exact steps or command run after this patch:

  • pnpm plugin-sdk:api:check
  • node scripts/generate-host-env-security-policy-swift.mjs --check
  • pnpm test src/shared/string-normalization.test.ts src/plugins/providers.test.ts src/infra/exec-safe-bin-policy.test.ts src/infra/host-env-security.policy-parity.test.ts src/infra/host-env-security.reported-baseline.test.ts src/infra/host-env-security.test.ts ui/src/ui/chat/slash-commands.browser-import.test.ts
  • pnpm test src/shared/string-normalization.test.ts src/shared/string-coerce.test.ts src/shared/number-coercion.test.ts src/agents/auth-profiles/legacy-oauth-sidecar.test.ts src/cron/store.test.ts extensions/feishu/src/outbound.test.ts extensions/policy/src/doctor/register.test.ts extensions/qa-lab/src/suite-runtime-gateway.test.ts extensions/discord/src/voice/manager.e2e.test.ts extensions/discord/src/voice/command.test.ts
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.extensions.test.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/extensions-test-retry.tsbuildinfo
  • env -u OPENCLAW_TESTBOX pnpm check:changed
  • /Users/steipete/Projects/agent-skills/skills/autoreview/scripts/autoreview --mode branch --base origin/main
    Evidence after fix: local checks pass; autoreview clean; live GitHub check-runs for head 29146d7e880a8e95b9f199874f5c83ae4c017cfe have no pending or failing required/problem checks.
    Observed result after fix: PR is mergeable with mergeable_state=clean and current-head CI green.
    What was not tested: no live provider/channel manual scenario; this is a helper refactor plus conflict/test/ordering repair.

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: macos App: macos app: web-ui App: web-ui channel: discord Channel integration: discord channel: feishu Channel integration: feishu channel: imessage Channel integration: imessage channel: irc channel: line Channel integration: line channel: matrix Channel integration: matrix channel: mattermost Channel integration: mattermost channel: msteams Channel integration: msteams channel: nostr Channel integration: nostr channel: qqbot channel: signal Channel integration: signal channel: slack Channel integration: slack channel: synology-chat channel: telegram Channel integration: telegram channel: tlon Channel integration: tlon channel: twitch Channel integration: twitch channel: voice-call Channel integration: voice-call channel: whatsapp-web Channel integration: whatsapp-web channel: zalouser Channel integration: zalouser cli CLI command changes commands Command implementations docker Docker and sandbox tooling docs Improvements or additions to documentation extensions: acpx extensions: admin-http-rpc extensions: amazon-bedrock extensions: anthropic extensions: brave extensions: byteplus extensions: codex extensions: copilot-proxy Extension: copilot-proxy extensions: deepinfra extensions: elevenlabs extensions: fal extensions: google extensions: lmstudio extensions: memory-core Extension: memory-core extensions: memory-lancedb Extension: memory-lancedb extensions: memory-wiki extensions: mistral extensions: moonshot extensions: ollama extensions: openai extensions: opencode extensions: openrouter extensions: perplexity extensions: phone-control extensions: policy extensions: qa-lab extensions: volcengine extensions: xai gateway Gateway runtime maintainer Maintainer-authored PR 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. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. plugin: google-meet plugin: meeting-notes plugin: migrate-claude plugin: migrate-hermes 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.

2 participants