Skip to content

feat(tools): per-sender tool capability tiers via toolsBySender#66933

Merged
steipete merged 1 commit into
openclaw:mainfrom
JerranC:feat/per-sender-tool-policy
May 11, 2026
Merged

feat(tools): per-sender tool capability tiers via toolsBySender#66933
steipete merged 1 commit into
openclaw:mainfrom
JerranC:feat/per-sender-tool-policy

Conversation

@JerranC

@JerranC JerranC commented Apr 15, 2026

Copy link
Copy Markdown

Summary

  • Adds tools.toolsBySender (global) and agents.<id>.tools.toolsBySender (per-agent override) config fields that strip tools from the LLM's schema on a per-sender basis — denied capabilities are genuinely invisible to the model for that user, not just blocked at runtime
  • Adds platform-scoped compound key format (discord:<snowflake>, telegram:<userId>, etc.) to prevent cross-platform sender ID collisions — works in both the new global policy and existing group-level toolsBySender configs
  • Threads messageProvider through GroupToolPolicySender so all toolsBySender lookups are platform-aware

Motivation

Right now there's no way to give different users different capability levels. If a friend messages your OpenClaw instance and asks it to run a destructive shell command, OpenClaw will attempt it. The owner should have full access; guests should get a restricted toolset baked into the model's context at the schema level so the LLM doesn't even know those tools exist for them.

Key formats

Key Matches
discord:123456789012345678 That Discord snowflake only
telegram:987654321 That Telegram user ID only
<channel>:<senderId> Generic platform-scoped form
id:<senderId> Raw sender ID (all platforms)
e164:+15551234567 Phone number
username:bob Platform username
* Wildcard fallback

Match priority: channel-scoped → id → e164 → username → name → *

Example openclaw.json

{
  "tools": {
    "toolsBySender": {
      "discord:123456789012345678": {},
      "telegram:987654321": {},
      "*": { "deny": ["exec", "process", "write", "edit"] }
    }
  }
}

Run /whoami in any channel to get your senderId and channel name.

Files changed

  • src/config/types.tools.tstoolsBySender field on ToolsConfig and AgentToolsConfig
  • src/config/group-policy.tsmessageProvider on GroupToolPolicySender, channel bucket, compound key detection
  • src/agents/sender-tool-policy.ts (new)resolveGlobalSenderToolPolicy()
  • src/agents/pi-tools.ts — resolve + inject sender policy into the pipeline

4 files, ~175 lines net. No breaking changes — all new fields are optional.

Test plan

  • Owner key (discord:<my-snowflake>: {}) — all tools available as normal
  • Guest key (discord:<friend-snowflake>: { "deny": ["exec", "process"] }) — exec/process absent from tool schema; model replies it cannot run commands
  • Wildcard * deny — applies to any sender without an explicit entry
  • No toolsBySender in config — behaviour unchanged from before

AI-assisted checklist

  • Built with Claude Sonnet 4.6
  • Lightly tested (manual config review; full pnpm test not yet run on this machine)
  • Author understands what the code does
  • Prompts/session available on request

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: S labels Apr 15, 2026
@greptile-apps

greptile-apps Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR introduces per-sender tool capability tiers by adding toolsBySender to ToolsConfig (global) and AgentToolsConfig (per-agent override), using compound platform-scoped keys (channel:<provider>:<senderId>) to prevent cross-platform collisions. The new resolveGlobalSenderToolPolicy function is integrated into both the main tool pipeline (pi-tools.ts) and the embedded-runner bundled-tool pipeline (effective-tool-policy.ts), and messageProvider is correctly threaded through both paths.

Confidence Score: 5/5

Safe to merge — implementation is correct, null-safe, and properly integrated into both tool pipelines.

All previously flagged P0/P1 concerns appear addressed in the current HEAD: normalizeSenderKey is called only after normalizeOptionalString + a truthy guard, the JSDoc priority list now correctly lists channel → id → ..., and the key-format examples in both ToolsConfig and AgentToolsConfig use the correct channel:<provider>:<id> form. The pipeline semantics are deny-wins/cumulative, so senderPolicy can only narrow tool access, never widen past earlier stages. Both applyFinalEffectiveToolPolicy call sites in attempt.ts and compact.ts already pass messageProvider. No new P0/P1 issues found.

No files require special attention.

Reviews (4): Last reviewed commit: "fix(tools): address Codex P2 review find..." | Re-trigger Greptile

Comment thread src/config/group-policy.ts Outdated
Comment thread src/agents/sender-tool-policy.ts Outdated

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: be4941d698

ℹ️ 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/config/group-policy.ts Outdated
Comment thread src/config/group-policy.ts Outdated
@JerranC

JerranC commented Apr 15, 2026

Copy link
Copy Markdown
Author

@codex review

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5e5f505c74

ℹ️ 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/config/types.tools.ts
Comment thread src/config/group-policy.ts Outdated
@openclaw-barnacle openclaw-barnacle Bot added commands Command implementations size: M and removed size: S labels Apr 15, 2026
@JerranC

JerranC commented Apr 15, 2026

Copy link
Copy Markdown
Author

@codex review

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e1efe5c8f0

ℹ️ 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/config/group-policy.ts Outdated
@openclaw-barnacle openclaw-barnacle Bot removed the commands Command implementations label Apr 15, 2026
@JerranC
JerranC force-pushed the feat/per-sender-tool-policy branch from f1e4e75 to dcd3e69 Compare April 15, 2026 03:16

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: dcd3e69ee8

ℹ️ 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/config/types.tools.ts Outdated
Comment thread src/agents/pi-tools.ts Outdated
@obviyus

obviyus commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

@greptile-apps review please

Comment thread src/config/types.tools.ts Outdated

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f9c776aa75

ℹ️ 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/agents/pi-tools.policy.ts Outdated
Comment thread src/agents/pi-tools.ts Outdated
@JerranC
JerranC force-pushed the feat/per-sender-tool-policy branch from 88652ca to f2d2838 Compare April 19, 2026 17:50
@JerranC

JerranC commented Apr 19, 2026

Copy link
Copy Markdown
Author

@greptile-apps review please

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 34a70ee22d

ℹ️ 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/agents/pi-tools.ts Outdated
Comment thread src/config/zod-schema.agent-runtime.ts Outdated
@JerranC

JerranC commented Apr 19, 2026

Copy link
Copy Markdown
Author

@greptileai review

@JerranC

JerranC commented Apr 19, 2026

Copy link
Copy Markdown
Author

@codex review

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9c259c975f

ℹ️ 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/agents/sender-tool-policy.ts Outdated
@JerranC

JerranC commented Apr 19, 2026

Copy link
Copy Markdown
Author

Review status

Greptile (latest): 5/5 — Safe to merge. All previously flagged P0/P1 concerns addressed in current HEAD (9c259c975f).

Codex (latest re-review): 8 findings — verified against current code:

Codex finding Status
P1 — toolsBySender missing from runtime schemas ❌ Stale. Present in CommonToolPolicyFields (zod-schema.agent-runtime.ts:586,594) and spread into both AgentToolsSchema and ToolsSchema.
P1 — Bare discord:/telegram: keys not parsed ❌ Stale. JSDoc uses channel:discord:<id> form throughout — bare prefixes were never advertised in the current docs (types.tools.ts:319-322).
P2 — pluginToolAllowlist missing senderPolicy ❌ Stale. Added in f2d28381e7 (pi-tools.ts:608).
P2 — Bundled-tool pipeline missing senderPolicy ❌ Stale. Added in 9c259c975f (effective-tool-policy.ts:141-149,179).
P2 — Schema missing allow/alsoAllow conflict check ❌ Stale. ToolsBySenderSchema switched from ToolPolicyBaseSchemaToolPolicySchema in 9c259c975f.
P2 ×2 — Channel/provider canonicalization for aliases 📝 Minor edge case. Aliased channel names (e.g. plugin teamsmsteams) would fall through to less-specific rules rather than break security. Not a regression — groupId/channel lookups elsewhere in the codebase use the same un-canonicalized provider string. Happy to address as a follow-up if maintainers prefer.
P2 — Wildcard "*" applies to no-sender CLI/cron runs 📝 Intentional. Wildcard means wildcard; if you don't want it to apply globally, scope it with a typed key. Same semantics already exist for other policy layers.

Codex's stateless re-runs appear to be re-flagging issues from the cumulative PR diff without retaining context that they were addressed in subsequent commits. Greptile's in-place comment update reflects the current state more reliably.

Resolving threads as they're either fixed or non-blocking. Ready for maintainer review.

@clawsweeper

clawsweeper Bot commented Apr 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge.

Summary
This PR adds global and per-agent per-sender tool policies with channel-scoped sender keys across config/schema/docs/core and bundled tool filtering, plus an unrelated cron target guard.

Reproducibility: yes. for the review finding via source inspection: current main sends untyped keys through the legacy id fallback, while PR head classifies channel:alice as typed and drops it before fallback. I did not run tests because this review is read-only.

Real behavior proof
Override: The PR has proof: override, so the external contributor proof gate is bypassed by maintainer policy for this review.

Next step before merge
A narrow parser compatibility regression can be fixed with focused config-policy tests on the PR branch; broader merge conflicts and product/security signoff remain maintainer-owned.

Security
Needs attention: The diff changes a tool-capability boundary and currently has one concrete compatibility regression that can remove an existing sender-specific restriction.

Review findings

  • [P2] Preserve legacy channel: sender IDs — src/config/types.tools.ts:230
Review details

Best possible solution:

Keep the PR open, preserve legacy sender-id matching for malformed channel: keys, separate or justify the cron guard, then rebase and land only after the tool-capability semantics and targeted checks are green.

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

Yes for the review finding via source inspection: current main sends untyped keys through the legacy id fallback, while PR head classifies channel:alice as typed and drops it before fallback. I did not run tests because this review is read-only.

Is this the best way to solve the issue?

No. The overall direction is plausible, but the current parser is not the safest implementation until malformed channel: typed keys preserve legacy sender-id behavior or the typed parser only accepts the full channel:<channelId>:<senderId> form.

Full review comments:

  • [P2] Preserve legacy channel: sender IDs — src/config/types.tools.ts:230
    Adding channel to the typed prefixes makes an existing legacy key like channel:alice enter the channel parser. Because the value has no second colon, normalizeChannelSenderKey returns empty and parseSenderPolicyKey drops the entry before the legacy id fallback, so an existing sender-specific deny/allow can silently stop applying. Only treat channel: as typed for the full channel:<channelId>:<senderId> form, or fall back to legacy id matching when channel normalization fails.
    Confidence: 0.88

Overall correctness: patch is incorrect
Overall confidence: 0.84

Security concerns:

  • [medium] Legacy sender restriction can be dropped — src/config/types.tools.ts:230
    A legacy toolsBySender key beginning with channel: is now parsed as a malformed channel key and ignored instead of being matched as a sender id, which can unintentionally expose tools that an operator had restricted for that sender.
    Confidence: 0.86

Acceptance criteria:

  • pnpm test src/config/group-policy.test.ts src/agents/pi-tools-agent-config.test.ts src/agents/pi-embedded-runner/effective-tool-policy.test.ts
  • pnpm check:changed

What I checked:

  • Current main lacks the new sender key type: On current main, TOOLS_BY_SENDER_KEY_TYPES only includes id, e164, username, and name, so the PR is not obsolete on main. (src/config/types.tools.ts:230, f95b38baeced)
  • Current main keeps untyped keys on the legacy id fallback: The current parser only enters typed handling when parseToolsBySenderTypedKey matches; otherwise it warns and stores the key as an id entry, preserving legacy sender IDs such as channel:alice. (src/config/group-policy.ts:133, f95b38baeced)
  • PR head adds channel as a typed sender-key prefix: At PR head, channel is added to TOOLS_BY_SENDER_KEY_TYPES, so channel:alice now enters typed parsing instead of the legacy id fallback. (src/config/types.tools.ts:230, a0835366ac0e)
  • PR head drops malformed channel-typed keys before fallback: At PR head, parseSenderPolicyKey returns undefined when typed normalization produces an empty key, and normalizeChannelSenderKey returns empty unless the value contains channelId:senderId; that means channel:alice is ignored instead of matched as a legacy id. (src/config/group-policy.ts:160, a0835366ac0e)
  • Review discussion already surfaced the same current-head regression: A latest review comment on PR head a0835366ac0e41de6ff8eb0661ddd7932f29f55a flags that legacy sender IDs beginning with channel: are no longer preserved. (src/config/types.tools.ts:230, a0835366ac0e)
  • PR state and CI/merge status: GitHub reports PR head a0835366ac0e41de6ff8eb0661ddd7932f29f55a, mergeStateStatus DIRTY, mergeable CONFLICTING, and multiple broad checks still queued at review time. (a0835366ac0e)

Likely related people:

  • steipete: Peter authored the current PR head commits and appears repeatedly in recent GitHub path history for the central config, tool-policy, and agent tool pipeline files. (role: recent area contributor and PR branch committer; confidence: high; commits: 8be30887263f, a0835366ac0e, ec55307df2c3; files: src/config/group-policy.ts, src/config/types.tools.ts, src/agents/pi-tools.ts)
  • eleqtrizit: The current tool-policy pipeline path includes prior merged work preserving restrictive allowlists, which is adjacent to this PR's sender policy filtering semantics. (role: adjacent tool-policy contributor; confidence: medium; commits: 193fdd6e3b0c; files: src/agents/tool-policy-pipeline.ts)
  • Kaspre: The PR includes an unrelated cron target guard, and recent GitHub path history for src/gateway/server-cron.ts shows Kaspre carrying nearby cron wake/session routing changes. (role: recent adjacent cron routing contributor; confidence: medium; commits: 5971f74bf133, db4f1fd7783c, 072fa9b17417; files: src/gateway/server-cron.ts)

Remaining risk / open question:

  • The no-sender wildcard behavior for CLI, cron, and internal runs still needs explicit maintainer agreement if the PR keeps applying * without requester identity.
  • GitHub reported the PR as DIRTY/CONFLICTING with several broad checks queued at review time.

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

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge.

What this changes:

This PR adds global and per-agent toolsBySender config, introduces explicit channel-scoped sender keys, and threads a sender-specific tool policy through main, plugin, and bundled tool filtering.

Maintainer follow-up before merge:

This is an active implementation PR for a security-sensitive tool-capability boundary, so the next step is maintainer review of product/security semantics plus requested tests and rebase, not an automated replacement PR.

Review details

Best possible solution:

Keep the PR open for maintainer review. If the direction is accepted, rebase onto current main, keep the explicit channel:<provider>:<senderId> contract, update config schema/docs/generated metadata, add focused regression tests for every filtering path, and settle the alias plus no-sender wildcard semantics before merge.

Acceptance criteria:

  • pnpm test src/config/group-policy.test.ts src/agents/pi-tools-agent-config.test.ts src/agents/pi-embedded-runner/effective-tool-policy.test.ts
  • pnpm check:changed

What I checked:

  • Current main checked: The checkout is on current main at the provided SHA, with a clean short status before review. (acae48b790fa)
  • Sender key types remain unscoped: TOOLS_BY_SENDER_KEY_TYPES is still limited to id, e164, username, and name; no channel typed key is present on current main. (src/config/types.tools.ts:208, acae48b790fa)
  • Global and per-agent config fields are absent: AgentToolsConfig and ToolsConfig include profile/allow/deny/byProvider and tool-specific settings, but no toolsBySender field at either scope. (src/config/types.tools.ts:308, acae48b790fa)
  • Runtime schema would reject proposed fields: CommonToolPolicyFields omits toolsBySender, and strict AgentToolsSchema/ToolsSchema spread only those known fields plus their existing tool-specific settings. (src/config/zod-schema.agent-runtime.ts:589, acae48b790fa)
  • Current sender policy is group-scoped only: GroupToolPolicySender has no messageProvider, sender matching checks only id/e164/username/name/wildcard, and resolveChannelGroupToolsPolicy resolves toolsBySender only from group/default group configs. (src/config/group-policy.ts:59, acae48b790fa)
  • Main tool pipeline lacks sender policy step: createOpenClawCodingTools applies profile/global/provider/agent/group/sandbox/subagent policies, but there is no resolveGlobalSenderToolPolicy import or senderPolicy step in the allow-background, plugin allowlist, or final tool-policy pipeline. (src/agents/pi-tools.ts:431, acae48b790fa)

Likely related people:

  • Peter Steinberger: Current-main blame and path history for the central tool-policy/config files used in this review point to Peter on the relevant toolsBySender, schema, and tool-pipeline lines. (role: recent maintainer and current-main owner for the affected paths; confidence: medium; commits: a972c9ec4547, be8c24633aaa; files: src/config/types.tools.ts, src/config/group-policy.ts, src/config/zod-schema.agent-runtime.ts)

Remaining risk / open question:

  • The PR changes a tool-capability/security boundary, so channel canonicalization, wildcard behavior when sender identity is absent, and owner/guest policy precedence need explicit maintainer agreement before merge.
  • The provided PR context still lacks completed targeted test proof for global/per-agent toolsBySender, channel-scoped keys, plugin optional-tool allowlists, and bundled MCP/LSP tool filtering.

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

@steipete
steipete force-pushed the feat/per-sender-tool-policy branch from 9c259c9 to 209498d Compare May 11, 2026 15:10
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: msteams Channel integration: msteams labels May 11, 2026

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e507ed2c3b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/config/types.tools.ts
};

export const TOOLS_BY_SENDER_KEY_TYPES = ["id", "e164", "username", "name"] as const;
export const TOOLS_BY_SENDER_KEY_TYPES = ["channel", "id", "e164", "username", "name"] as const;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Preserve legacy sender IDs beginning with channel:

Adding "channel" to TOOLS_BY_SENDER_KEY_TYPES makes keys like "channel:alice" enter the typed-parser path, but they are malformed for the new channel:<channelId>:<senderId> format and get dropped (no legacy fallback). Before this commit, the same untyped key was treated as a legacy sender-id key and matched senderId="channel:alice"; after upgrade, that policy silently stops applying. This is a backward-compatibility regression for existing configs that use sender IDs starting with channel: and can unintentionally remove sender-specific restrictions unless operators rewrite them to id:channel:alice.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the feat/per-sender-tool-policy branch 2 times, most recently from ae75adf to a083536 Compare May 11, 2026 16:34
@openclaw-barnacle openclaw-barnacle Bot added the triage: dirty-candidate Candidate: broad unrelated surfaces; may need splitting or cleanup. label May 11, 2026
@steipete
steipete force-pushed the feat/per-sender-tool-policy branch from a083536 to 62a5575 Compare May 11, 2026 16:54
@steipete

Copy link
Copy Markdown
Contributor

Verification for rewritten implementation:

  • Rebased on latest origin/main before push; branch head: 62a5575727ef3e209179ff6b2fa89273534f6185.
  • Live .profile key smoke passed with a disposable script simulating messageProvider: "teams" and per-sender config for channel:msteams:blocked-live / channel:msteams:trusted-live. It verified denied runtime/fs tools were absent for the blocked sender, normal coding tools remained for the trusted sender, bundled MCP filtering applied, and a real OpenAI gpt-5.4 request completed using only safe live tools.
  • Local focused tests passed: pnpm test src/config/group-policy.test.ts src/agents/pi-tools-agent-config.test.ts src/agents/pi-embedded-runner/effective-tool-policy.test.ts.
  • Local changed gate passed: env -u OPENCLAW_TESTBOX -u OPENCLAW_TESTBOX_REMOTE_RUN pnpm check:changed.
  • Additional local checks passed: pnpm run lint:plugins:no-extension-test-core-imports, pnpm config:docs:check, git diff --check.
  • GitHub proof already green: Workflow Sanity run 25684443526, Real behavior proof run 25684439131.
  • GitHub CI run 25684440972 is in progress with no failing jobs at the time of this note; CodeQL/OpenGrep are still queued.

Known gap: the live smoke used a disposable ignored script under .artifacts/, not a committed e2e fixture, because it depends on local ~/.profile credentials.

@steipete
steipete merged commit 530b892 into openclaw:main May 11, 2026
87 checks passed
steipete added a commit that referenced this pull request May 12, 2026
Co-authored-by: Peter Steinberger <[email protected]>
# Conflicts:
#	docs/.generated/config-baseline.sha256
steipete added a commit that referenced this pull request May 12, 2026
Co-authored-by: Peter Steinberger <[email protected]>
# Conflicts:
#	docs/.generated/config-baseline.sha256
steipete added a commit that referenced this pull request May 13, 2026
steipete added a commit that referenced this pull request May 13, 2026
steipete added a commit that referenced this pull request May 13, 2026
steipete added a commit that referenced this pull request May 13, 2026
steipete added a commit that referenced this pull request May 13, 2026
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 2026
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 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 channel: msteams Channel integration: msteams channel: slack Channel integration: slack docs Improvements or additions to documentation gateway Gateway runtime proof: override Maintainer override for the external PR real behavior proof gate. size: M triage: dirty-candidate Candidate: broad unrelated surfaces; may need splitting or cleanup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants