Skip to content

Teams: support separate graphTenantId for cross-tenant Graph API access#67174

Closed
hddevteam wants to merge 6 commits into
openclaw:mainfrom
hddevteam:teams-thread-mention-context
Closed

Teams: support separate graphTenantId for cross-tenant Graph API access#67174
hddevteam wants to merge 6 commits into
openclaw:mainfrom
hddevteam:teams-thread-mention-context

Conversation

@hddevteam

Copy link
Copy Markdown

Summary

Adds graphTenantId config field (and MSTEAMS_GRAPH_TENANT_ID env var) to the Microsoft Teams provider so deployments where the bot app is registered in one Azure tenant but Teams/M365 data lives in a separate Microsoft 365 tenant can acquire tokens from the correct tenant for each operation.

Problem

In multi-tenant deployments (bot app registered in Azure AD tenant A, Teams data in M365 tenant B), the existing code used the same Bot Framework App instance to acquire both:

  • Bot Framework reply tokens (must use Azure tenant A)
  • Microsoft Graph API tokens for thread context (must use tenant B)

This caused 403 errors on all Graph API calls (ChannelMessage.Read.All, etc.), silently returning no thread context when a bot was @mentioned in a channel thread.

Solution

  • MSTeamsConfig.graphTenantId: new optional config field
  • MSTEAMS_GRAPH_TENANT_ID: env var fallback (same precedence pattern as existing TEAMS_TENANT_ID)
  • monitor.ts: creates a dedicated graphTokenProvider Bot Framework App instance using graphTenantId when it differs from tenantId
  • message-handler.ts: uses effectiveGraphTokenProvider = graphTokenProvider ?? tokenProvider for all Graph API token acquisitions — no behavior change for single-tenant setups
  • graph-thread.ts: removed silent try/catch in fetchChannelMessage so Graph 403s propagate to the Promise.allSettled handler in the message handler instead of returning undefined silently

Configuration

Single-tenant deployments (most users): no change needed.

Cross-tenant deployments — add to openclaw.json:

{
  "providers": {
    "msteams": {
      "tenantId": "<azure-tenant-id>",
      "graphTenantId": "<m365-tenant-id>"
    }
  }
}

Or via environment: MSTEAMS_GRAPH_TENANT_ID=<m365-tenant-id>

Testing

  • All 866 tests pass (pnpm test)
  • pnpm check clean (lint, type-check, import cycles)
  • Config baseline hash regenerated (pnpm config:docs:gen)
  • Manually verified thread context fetching in a cross-tenant Teams deployment

Checklist

  • Tests pass
  • pnpm check clean
  • Config baseline updated
  • CHANGELOG entry added
  • No behavior change for single-tenant setups

Copilot AI review requested due to automatic review settings April 15, 2026 12:36
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: msteams Channel integration: msteams size: L labels Apr 15, 2026
@greptile-apps

greptile-apps Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds graphTenantId config field and MSTEAMS_GRAPH_TENANT_ID env var to the Microsoft Teams provider, enabling cross-tenant deployments where the bot app registration and the Teams/M365 data live in different Azure tenants. The monitor now creates a dedicated Bot Framework App instance for Graph API token acquisition when the tenant IDs differ, and the message handler uses an effectiveGraphTokenProvider fallback so single-tenant setups are completely unaffected.

All three inline findings are P2 and do not block merge.

Confidence Score: 5/5

Safe to merge; all findings are P2 style/improvement suggestions with no current production breakage.

The cross-tenant token-provider plumbing is logically correct and well-scoped. Single-tenant behavior is unchanged. The three flagged items (error-result caching after removing the silent catch, undocumented federated-auth limitation, missing tests for the new cross-tenant path) are all quality/documentation concerns rather than defects in the changed code path.

extensions/msteams/src/thread-parent-context.ts (error-caching behavior after fetchChannelMessage change), extensions/msteams/src/graph.ts and token.ts (missing test coverage for graphTenantId paths)

Comments Outside Diff (2)

  1. extensions/msteams/src/thread-parent-context.ts, line 86-88 (link)

    P2 Error results no longer cached; persistent 403s will retry on every message

    Before this PR, fetchChannelMessage silently caught errors and returned undefined. fetchParentMessageCached cached that undefined, so repeated calls for the same parent (e.g., a burst of replies) would not re-hit Graph. Now that fetchChannelMessage propagates errors, the await fetchParent(...) on line 86 throws instead of returning undefined, and touchLru is never reached — meaning nothing is cached on failure.

    In environments where Graph is persistently inaccessible (wrong permissions, restricted tenant), every incoming channel thread message will trigger two failing Graph calls (parent + replies) without any backoff or negative-result cache. The test "caches undefined (Graph error) so failures do not re-fetch on burst" in thread-parent-context.test.ts still passes because it injects a mock fetcher that returns undefined — it no longer describes the real behavior of the default fetchChannelMessage.

    Consider wrapping the await fetchParent(...) in a try/catch that stores a sentinel on error so burst retries still hit the cache:

    let message: GraphThreadMessage | undefined;
    try {
      message = await fetchParent(token, groupId, channelId, parentId);
    } catch {
      // Cache the failure so burst retries do not hammer Graph on persistent errors.
      touchLru(parentCache, key, { message: undefined, expiresAt: now + PARENT_CACHE_TTL_MS }, PARENT_CACHE_MAX);
      throw;
    }
    touchLru(parentCache, key, { message, expiresAt: now + PARENT_CACHE_TTL_MS }, PARENT_CACHE_MAX);
    return message;
    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: extensions/msteams/src/thread-parent-context.ts
    Line: 86-88
    
    Comment:
    **Error results no longer cached; persistent 403s will retry on every message**
    
    Before this PR, `fetchChannelMessage` silently caught errors and returned `undefined`. `fetchParentMessageCached` cached that `undefined`, so repeated calls for the same parent (e.g., a burst of replies) would not re-hit Graph. Now that `fetchChannelMessage` propagates errors, the `await fetchParent(...)` on line 86 throws instead of returning `undefined`, and `touchLru` is never reached — meaning nothing is cached on failure.
    
    In environments where Graph is persistently inaccessible (wrong permissions, restricted tenant), every incoming channel thread message will trigger two failing Graph calls (parent + replies) without any backoff or negative-result cache. The test `"caches undefined (Graph error) so failures do not re-fetch on burst"` in `thread-parent-context.test.ts` still passes because it injects a mock fetcher that returns `undefined` — it no longer describes the real behavior of the default `fetchChannelMessage`.
    
    Consider wrapping the `await fetchParent(...)` in a try/catch that stores a sentinel on error so burst retries still hit the cache:
    
    ```ts
    let message: GraphThreadMessage | undefined;
    try {
      message = await fetchParent(token, groupId, channelId, parentId);
    } catch {
      // Cache the failure so burst retries do not hammer Graph on persistent errors.
      touchLru(parentCache, key, { message: undefined, expiresAt: now + PARENT_CACHE_TTL_MS }, PARENT_CACHE_MAX);
      throw;
    }
    touchLru(parentCache, key, { message, expiresAt: now + PARENT_CACHE_TTL_MS }, PARENT_CACHE_MAX);
    return message;
    ```
    
    How can I resolve this? If you propose a fix, please make it concise.
  2. extensions/msteams/src/graph.ts, line 217-229 (link)

    P2 graphTenantId path untested; new App instance created on every call

    loadMSTeamsSdkWithAuth(graphCreds) is called on every invocation of resolveGraphToken. For the cross-tenant path (graphTenantId !== tenantId), this instantiates a second Bot Framework App per call. For CLI commands that call resolveGraphToken in a loop this can be expensive.

    Additionally, the new graphCreds substitution has no test coverage in graph.test.ts — neither the token acquisition with graphTenantId nor the fallback when graphTenantId === tenantId. Similarly, token.test.ts has no cases that exercise graphTenantId propagation through resolveMSTeamsCredentials. For a feature that changes which OAuth tenant is used to acquire tokens, adding at least happy-path tests would help prevent regressions.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: extensions/msteams/src/graph.ts
    Line: 217-229
    
    Comment:
    **`graphTenantId` path untested; new `App` instance created on every call**
    
    `loadMSTeamsSdkWithAuth(graphCreds)` is called on every invocation of `resolveGraphToken`. For the cross-tenant path (`graphTenantId !== tenantId`), this instantiates a second Bot Framework `App` per call. For CLI commands that call `resolveGraphToken` in a loop this can be expensive.
    
    Additionally, the new `graphCreds` substitution has no test coverage in `graph.test.ts` — neither the token acquisition with `graphTenantId` nor the fallback when `graphTenantId === tenantId`. Similarly, `token.test.ts` has no cases that exercise `graphTenantId` propagation through `resolveMSTeamsCredentials`. For a feature that changes which OAuth tenant is used to acquire tokens, adding at least happy-path tests would help prevent regressions.
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/msteams/src/thread-parent-context.ts
Line: 86-88

Comment:
**Error results no longer cached; persistent 403s will retry on every message**

Before this PR, `fetchChannelMessage` silently caught errors and returned `undefined`. `fetchParentMessageCached` cached that `undefined`, so repeated calls for the same parent (e.g., a burst of replies) would not re-hit Graph. Now that `fetchChannelMessage` propagates errors, the `await fetchParent(...)` on line 86 throws instead of returning `undefined`, and `touchLru` is never reached — meaning nothing is cached on failure.

In environments where Graph is persistently inaccessible (wrong permissions, restricted tenant), every incoming channel thread message will trigger two failing Graph calls (parent + replies) without any backoff or negative-result cache. The test `"caches undefined (Graph error) so failures do not re-fetch on burst"` in `thread-parent-context.test.ts` still passes because it injects a mock fetcher that returns `undefined` — it no longer describes the real behavior of the default `fetchChannelMessage`.

Consider wrapping the `await fetchParent(...)` in a try/catch that stores a sentinel on error so burst retries still hit the cache:

```ts
let message: GraphThreadMessage | undefined;
try {
  message = await fetchParent(token, groupId, channelId, parentId);
} catch {
  // Cache the failure so burst retries do not hammer Graph on persistent errors.
  touchLru(parentCache, key, { message: undefined, expiresAt: now + PARENT_CACHE_TTL_MS }, PARENT_CACHE_MAX);
  throw;
}
touchLru(parentCache, key, { message, expiresAt: now + PARENT_CACHE_TTL_MS }, PARENT_CACHE_MAX);
return message;
```

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/msteams/src/token.ts
Line: 95-98

Comment:
**`graphTenantId` silently dropped for federated auth**

`graphTenantId` is resolved from config/env for both auth types but is only placed on the returned `MSTeamsSecretCredentials` struct. For `authType === "federated"`, the value is silently discarded and `MSTeamsFederatedCredentials` has no `graphTenantId` field, so `monitor.ts` and `graph.ts` will never use it regardless of what the operator configures.

The docs (`docs/channels/msteams.md`) and the `MSTeamsConfig` JSDoc on `graphTenantId` should note that this field is only effective when `authType` is `"secret"` (the default). Setting `MSTEAMS_GRAPH_TENANT_ID` with a federated identity setup will have no effect.

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/msteams/src/graph.ts
Line: 217-229

Comment:
**`graphTenantId` path untested; new `App` instance created on every call**

`loadMSTeamsSdkWithAuth(graphCreds)` is called on every invocation of `resolveGraphToken`. For the cross-tenant path (`graphTenantId !== tenantId`), this instantiates a second Bot Framework `App` per call. For CLI commands that call `resolveGraphToken` in a loop this can be expensive.

Additionally, the new `graphCreds` substitution has no test coverage in `graph.test.ts` — neither the token acquisition with `graphTenantId` nor the fallback when `graphTenantId === tenantId`. Similarly, `token.test.ts` has no cases that exercise `graphTenantId` propagation through `resolveMSTeamsCredentials`. For a feature that changes which OAuth tenant is used to acquire tokens, adding at least happy-path tests would help prevent regressions.

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

Reviews (1): Last reviewed commit: "Teams: support separate graphTenantId fo..." | Re-trigger Greptile

Comment thread extensions/msteams/src/token.ts

Copilot AI 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.

Pull request overview

Adds cross-tenant Microsoft Graph token acquisition support for the bundled Microsoft Teams integration, so Bot Framework reply tokens and Graph API tokens can be issued from different Azure tenants when needed.

Changes:

  • Introduces graphTenantId / MSTEAMS_GRAPH_TENANT_ID and wires a dedicated Graph token provider into Teams runtime.
  • Improves channel thread context behavior (thread root resolution, mention-only thread replies, Graph error propagation, and an in-memory fallback cache).
  • Hardens Teams webhook JSON parsing by repairing invalid escape sequences; extends runtime logging to forward structured meta.

Reviewed changes

Copilot reviewed 20 out of 20 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/plugins/runtime/runtime-logging.ts Passes meta through runtime logger methods.
src/plugins/runtime/runtime-logging.test.ts Adds tests ensuring logger meta is forwarded and shouldLogVerbose is re-exported.
src/plugin-sdk/msteams.ts Re-exports resolveThreadSessionKeys via the Teams plugin SDK surface.
src/config/zod-schema.providers-core.ts Adds graphTenantId to the Teams config schema.
src/config/types.msteams.ts Documents and types the new graphTenantId config field.
extensions/msteams/src/token.ts Resolves graphTenantId from config/env and returns it in secret credentials.
extensions/msteams/src/thread-message-cache.ts Adds a simple in-memory per-thread message cache with TTL.
extensions/msteams/src/sdk-types.ts Extends activity typing to include team.aadGroupId.
extensions/msteams/src/monitor.ts Creates a dedicated Graph token provider when graphTenantId differs; switches webhook parsing to raw + repair middleware.
extensions/msteams/src/monitor.lifecycle.test.ts Updates Express mocking for raw() and middleware count/order assertions.
extensions/msteams/src/monitor-handler/message-handler.ts Uses graph token provider, adds mention-only thread handling, thread root resolution, and cache-based context fallback.
extensions/msteams/src/monitor-handler/message-handler.thread-parent.test.ts Adds coverage for mention-only thread invocation and cache fallback behaviors.
extensions/msteams/src/monitor-handler/message-handler.test-support.ts Extends test logger stub with warn.
extensions/msteams/src/monitor-handler.types.ts Adds optional graphTokenProvider dependency.
extensions/msteams/src/graph.ts Uses graphTenantId when resolving app-only Graph tokens.
extensions/msteams/src/graph-thread.ts Removes silent error swallowing in fetchChannelMessage.
extensions/msteams/src/graph-thread.test.ts Updates test to assert errors propagate.
extensions/msteams/src/tests/monitor-json-repair.test.ts Adds regression tests for the JSON repair behavior.
docs/channels/msteams.md Documents mention-only thread behavior and Graph permission requirement.
CHANGELOG.md Adds changelog entry for the new cross-tenant Graph token acquisition support.

Comment thread extensions/msteams/src/thread-message-cache.ts Outdated
Comment thread extensions/msteams/src/graph-thread.ts
Comment thread docs/channels/msteams.md Outdated
Comment thread extensions/msteams/src/token.ts
Comment thread extensions/msteams/src/monitor-handler/message-handler.ts Outdated
Comment thread extensions/msteams/src/thread-message-cache.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: b782db1718

ℹ️ 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/msteams/src/graph.ts Outdated
@hddevteam
hddevteam force-pushed the teams-thread-mention-context branch from b782db1 to 38defac Compare April 19, 2026 11:54

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 38defaca07

ℹ️ 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/msteams/src/monitor-handler/message-handler.ts Outdated
@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

Thanks for the context here. I swept through the related work, and this is now duplicate or superseded.

Keep this PR open because the split-tenant Teams Graph idea is still not implemented on current main and the newer overlapping PR is not a safe superseding target, but this branch is not merge-ready: it needs a current-main rebase that preserves Teams cloud/serviceUrl and China Graph guard behavior plus redacted real split-tenant proof.

Canonical path: Close this stale PR. The latest review rated it F, the branch still lacks merge-ready proof, and there has been no human follow-up after the durable review.

So I’m closing this here because the remaining work is already tracked in the canonical issue.

Review details

Best possible solution:

Close this stale PR. The latest review rated it F, the branch still lacks merge-ready proof, and there has been no human follow-up after the durable review.

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

Partially. The missing capability is source-visible because current main has no graphTenantId or MSTEAMS_GRAPH_TENANT_ID, but the successful cross-tenant Microsoft Graph path needs external tenant proof.

Is this the best way to solve the issue?

No, not yet. The Teams plugin is the right owner, but this branch must be rebased to preserve current cloud/serviceUrl boundaries and then proven against a real split-tenant setup.

Security review:

Security review needs attention: The diff is security-sensitive because the new Graph tenant override must not bypass existing Teams cloud/serviceUrl boundaries.

  • [medium] Graph token path can drop cloud boundary — extensions/msteams/src/graph.ts:71
    The PR branch creates the Graph-token SDK App without current main's cloud/serviceUrl options or China Graph fail-closed guard, which can misroute sovereign-cloud Graph token acquisition after conflict resolution.
    Confidence: 0.88

AGENTS.md: found and applied where relevant.

What I checked:

  • stale F-rated PR: PR was opened 2026-04-15T12:36:58Z, is older than 60 days, and the latest review rated it F.
  • proof blocker: real behavior proof is missing and proof tier is F, so this branch is not merge-ready without contributor follow-up.
  • no human follow-up: live comments and timeline hydrated by apply contain no non-automation activity after the ClawSweeper review.

Likely related people:

  • heyitsaamir: GitHub path history shows commit 04c2982 added Teams SDK cloud/serviceUrl and China boundary work across graph.ts, cloud.ts, and docs. (role: introduced current cloud boundary behavior; confidence: high; commits: 04c29825356f; files: extensions/msteams/src/graph.ts, extensions/msteams/src/cloud.ts, docs/channels/msteams.md)
  • sudie-codes: GitHub path history shows substantial Teams Graph, delegated auth, pagination, reaction, and helper work in the same graph.ts/token.ts area. (role: Teams Graph feature owner; confidence: high; commits: 355794c24a39, f71ee71787c7; files: extensions/msteams/src/graph.ts, extensions/msteams/src/token.ts)
  • HDYA: Commit 26f633b added federated Teams credential support across token, SDK, config type/schema, and docs surfaces now adjacent to graphTenantId. (role: Teams auth feature introducer; confidence: medium; commits: 26f633b604fd; files: extensions/msteams/src/token.ts, extensions/msteams/src/sdk.ts, src/config/types.msteams.ts)
  • vincentkoc: Recent history shows Teams SDK import and Graph guard work near graph.ts, sdk.ts, and token.ts, including Graph fetch hardening. (role: recent Teams SDK/auth contributor; confidence: medium; commits: d0034e2f9912, 3cc83cb81ec3; files: extensions/msteams/src/graph.ts, extensions/msteams/src/sdk.ts, extensions/msteams/src/token.ts)
  • steipete: Recent path history shows adjacent Teams docs/config/token work and the local shallow blame points current-main Teams Graph/cloud lines to the grafted current snapshot. (role: recent area contributor; confidence: medium; commits: 58912f8fd842, 3fffb34ba0c0; files: extensions/msteams/src/graph.ts, extensions/msteams/src/token.ts, docs/channels/msteams.md)

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

@hddevteam
hddevteam force-pushed the teams-thread-mention-context branch 2 times, most recently from 0eb41ae to 6c36b1f Compare April 29, 2026 01:04
Ming and others added 6 commits April 29, 2026 09:14
Add `graphTenantId` config field (and `MSTEAMS_GRAPH_TENANT_ID` env var)
so the bot can acquire Bot Framework reply tokens and Graph API tokens
from different Azure tenants. This enables thread context fetching when
the bot app is registered in one Azure tenant but Teams/M365 data lives
in a separate Microsoft 365 tenant.

Changes:
- `MSTeamsConfig.graphTenantId`: new optional field in config type + zod schema
- `MSTeamsSecretCredentials.graphTenantId`: carry through credential resolution
- `token.ts`: resolve graphTenantId from config or MSTEAMS_GRAPH_TENANT_ID env
- `graph.ts`: use graphTenantId tenant when acquiring Graph-only token
- `monitor.ts`: create dedicated graphTokenProvider App when tenants differ
- `monitor-handler.types.ts`: add optional graphTokenProvider to handler deps
- `message-handler.ts`: use effectiveGraphTokenProvider for thread context calls
- `graph-thread.ts`: remove silent error catch in fetchChannelMessage so 403s
  surface to the caller's Promise.allSettled handler instead of silently
  returning undefined

Co-authored-by: Copilot <[email protected]>
@hddevteam
hddevteam force-pushed the teams-thread-mention-context branch from 6c36b1f to a07328f Compare April 29, 2026 01:17
@clawsweeper clawsweeper Bot added 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. P2 Normal backlog priority with limited blast radius. labels May 19, 2026
@clawsweeper clawsweeper Bot added merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels May 19, 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 19, 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 6, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed 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. labels Jun 6, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label Jun 7, 2026
@clawsweeper clawsweeper Bot added 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. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. 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. labels Jun 14, 2026
@clawsweeper

clawsweeper Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper applied the proposed close for this PR.

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

Labels

channel: msteams Channel integration: msteams docs Improvements or additions to documentation merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. 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: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: M status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. 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.

3 participants