Skip to content

fix(onboard): accept owned Teams webhook field - #9654

Merged
prekshivyas merged 1 commit into
mainfrom
codex/fix-9610-msteams-webhook-schema
Aug 19, 2026
Merged

fix(onboard): accept owned Teams webhook field#9654
prekshivyas merged 1 commit into
mainfrom
codex/fix-9610-msteams-webhook-schema

Conversation

@rsliter

@rsliter rsliter commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

Summary

Managed startup validation rejected the stock Microsoft Teams OpenClaw webhook object because the credential-field scanner treated every field with that name as secret-bearing.
This change accepts only the schema-owned non-secret object and keeps every other webhook location or shape fail closed.

Related Issue

Fixes #9610.

Changes

  • Accept messaging.plan.agentRender[i].value.webhook only for the exact Microsoft Teams OpenClaw channel, render, hook, handler, agent, target, and configuration path.
  • Require an object containing only integer port from 1 through 65,535 and exact path /api/messages; reject raw credentials, malformed values, extra fields, ownership mismatches, and the same object elsewhere.
  • Add a focused 24-case managed-profile regression suite without weakening the generic credential scanner or adding a broad allowlist.
  • Record the escaped-defect root cause: the recursive credential scanner lacked a schema-owned non-secret exception, and the managed-profile tests did not exercise the stock Teams render at that validation boundary.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior, justification:
  • Tests not applicable, justification:
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded, reviewer/approval link/justification: Complete validation-boundary review confirmed that credential custody is unchanged and raw credentials, malformed values, extra fields, ownership mismatches, and all other webhook paths remain rejected before canonicalization.
  • Non-success, skipped, or missing CI check accepted by maintainer, check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: This repairs internal validation for the existing Microsoft Teams OpenClaw manifest. Existing documentation already owns the webhook path, port, credential custody, and supported integration.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit:
  • Station profile/scenario:
  • Result:
  • Supporting evidence:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above, command/result or justification: Focused Teams webhook tests passed 24/24, and the managed-profile family passed 259/259. CLI and plugin builds, npm run typecheck:cli, focused formatting and lint, npm run test:titles:check, and npm run checks:repository passed.
  • Applicable broad gate passed, npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes, command/result: npm run test:changed passed 7,870 tests and ended with 10 unrelated failures: seven aggregate timeouts, two existing DCode preference-restore assertions, and one Hermes fixture Python compatibility error.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Rebecca Sliter 571084+rsliter@users.noreply.github.com

Summary by CodeRabbit

  • Bug Fixes
    • Improved validation for Microsoft Teams webhook configurations in managed startup profiles.
    • Valid webhook settings using the expected port and /api/messages path are now accepted.
    • Invalid, malformed, misplaced, or mismatched webhook configurations are rejected.
  • Tests
    • Added coverage for valid and invalid Teams webhook scenarios.

Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
@rsliter rsliter self-assigned this Aug 19, 2026
@coderabbitai

coderabbitai Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 6ad535c2-0cd2-4275-8298-a8e1160933be

📥 Commits

Reviewing files that changed from the base of the PR and between dbf48ba and 8962b36.

📒 Files selected for processing (2)
  • src/lib/onboard/managed-startup-profile-teams-webhook.test.ts
  • src/lib/onboard/managed-startup/profile.ts

Included review availability: Your plan provides up to 12 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

The managed startup profile now permits the stock OpenClaw Microsoft Teams webhook structure. Focused tests cover valid ports, malformed values, mismatched render metadata, extra fields, credentials, and unowned placement.

Changes

Microsoft Teams webhook validation

Layer / File(s) Summary
Authorize the stock Teams webhook
src/lib/onboard/managed-startup/profile.ts
The credential-shaped field scanner permits webhook only for the expected Teams render metadata, integer port range, exact path, and object shape.
Validate accepted and rejected webhook cases
src/lib/onboard/managed-startup-profile-teams-webhook.test.ts
Tests cover valid ports, malformed values, mismatched metadata, credential-bearing values, extra fields, and unowned placement.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 8962b

This narrowly accepts the schema-owned Microsoft Teams webhook object while continuing to reject other webhook locations and malformed or credential-bearing values. No actionable merge-blocking risk remains after normal checks and review.

Suggested reviewers: ericksoa, laitingsheng, apurvvkumaria

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: accepting the owned Microsoft Teams webhook field during onboarding.
Linked Issues check ✅ Passed The changes satisfy issue [#9610] by enforcing the owned Teams webhook path, exact shape, valid port, exact path, and regression coverage.
Out of Scope Changes check ✅ Passed The changes remain within issue [#9610] and do not weaken the generic scanner or add unrelated functionality.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/fix-9610-msteams-webhook-schema

Comment @coderabbitai help to get the list of available commands.

@github-code-quality

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall line coverage in commit 8962b36 in the codex/fix-9610-mstea... branch remains at 96%, unchanged from commit dbf48ba in the main branch.

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings match; normalized terminology decisions differ; normalized E2E selections differ; severity counts match.
2 terminology differences from the second opinion

Advisory only. These are normalized differences from the primary terminology receipt.

  • stock at src/lib/onboard/managed-startup/profile.ts:1100: selected only by the second-opinion lane as established.
  • webhook at src/lib/onboard/managed-startup/profile.ts:1112: selected only by the second-opinion lane as established.
2 additional E2E selections from the second opinion

Advisory only. The primary lane did not select these E2E jobs or targets.

  • messaging-providers: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • messaging-compatible-endpoint: The completed second-opinion lane identified E2E coverage that the primary lane omitted.

Second-opinion terminology and E2E selections are advisory. Live E2E does not run automatically for pull requests.

Since last review: 0 prior items resolved · 0 still apply · 0 new items found

2 semantic terminology decisions

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • justified — stock Microsoft Teams OpenClaw webhook at src/lib/onboard/managed-startup-profile-teams-webhook.test.ts:107: Keep the term in the test title because the test validates the fixed emitted shape.
  • justified — owned render value at src/lib/onboard/managed-startup-profile-teams-webhook.test.ts:165: Keep the term in the test title because the test proves location is part of the validation contract.

E2E guidance

Advisory only. A maintainer can dispatch the default E2E suite for the commit under review.

Recommended E2E: None

Manual-only E2E: managed-image-multiarch-startup, device-auth-health, onboard-repair, onboard-resume, openclaw-inference-switch, cloud-onboard, issue-4462-scope-upgrade-approval
The manual PR workflow does not run these selectors for the commit under review. Run them from reviewed code on main.

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@rsliter
rsliter requested a review from ericksoa August 19, 2026 19:34

@prekshivyas prekshivyas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed commit 8962b364874ae054529ad31217cea0f23c799935 against base dbf48bae9d35beda8d781205a46e881d6f8f900a.

The credential-field exception is limited to the exact Microsoft Teams OpenClaw render identity and a webhook object containing only an integer port in 1–65535 plus the exact /api/messages path. Normal payload traversal still rejects custom prototypes, accessors, symbols, extra fields, nested credential material, and placement outside that owned render. I found no blocking issue.

Test evidence: four focused/regression files passed (223 tests), including all managed startup profile, builder, runtime alias, and Teams webhook tests; git diff --check passed. The current failed CI shard is an unrelated timeout in host-local-vllm-selection.test.ts; the other CLI shards and security/build checks passed.

Security review:

  • Secrets and credentials: PASS — only a fixed non-secret webhook listener shape is exempted; nested credential scanning remains active.
  • Input validation: PASS — render identity, object shape, port bounds, and path are exact.
  • Authentication and authorization: PASS — no authentication or runtime authority changes.
  • Dependencies: PASS — no dependency changes.
  • Error handling and logging: PASS — rejection behavior remains fail-closed outside the owned shape.
  • Cryptography: PASS — no cryptographic changes.
  • Configuration and deployment: PASS — no deployment changes; the accepted configuration matches the owned Teams render contract.
  • Testing and coverage: PASS — positive, boundary, malformed, mismatched, extra-field, secret-bearing, and misplaced cases are covered.
  • System-level safety: PASS — the generic credential scanner remains authoritative for every non-matching path and value.

@prekshivyas
prekshivyas merged commit b5f3063 into main Aug 19, 2026
79 of 85 checks passed
@prekshivyas
prekshivyas deleted the codex/fix-9610-msteams-webhook-schema branch August 19, 2026 21:34
cjagwani added a commit that referenced this pull request Aug 20, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Add the canonical dated changelog entry required before planning the
v0.0.112 release.
The entry summarizes the 75 merged PRs in
`v0.0.111..af56158`, links user-facing
themes to published documentation routes, and links every included
source PR.

## Changes

- Add `docs/changelog/2026-08-20.mdx` with the exact `## v0.0.112`
release heading and parser-safe MDX SPDX comment.
- Cover managed local inference, onboarding and sandbox lifecycle
recovery, messaging continuity, review and release automation, E2E
qualification, dependency updates, and cumulative documentation
catch-up.
- Preserve the documentation skip list and supported-agent matrix; the
release entry contains none of the blocked terms or excluded
experimental surfaces.

### Source-to-doc mapping

- #8620 -> `docs/changelog/2026-08-20.mdx`: Record the LangChain Deep
Agents Code 0.1.55 update.
- #9192 -> `docs/changelog/2026-08-20.mdx`: Record the OpenShell 0.0.106
update.
- #9240 -> `docs/changelog/2026-08-20.mdx`: Record the cold base-image
pull heartbeat.
- #9412 -> `docs/changelog/2026-08-20.mdx`: Record voice context
preservation across sequential turns.
- #9483 -> `docs/changelog/2026-08-20.mdx`: Record Ollama model
verification through the sandbox endpoint.
- #9493 -> `docs/changelog/2026-08-20.mdx`: Record E2E cloud-check
wiring coverage.
- #9495 -> `docs/changelog/2026-08-20.mdx`: Record Model Router endpoint
health validation.
- #9534 -> `docs/changelog/2026-08-20.mdx`: Record default-sandbox
resolution for tunnel status.
- #9537 -> `docs/changelog/2026-08-20.mdx`: Record Linux AMD64 Muse and
Lightning profiles.
- #9543 -> `docs/changelog/2026-08-20.mdx`: Record corrected
network-policy preset examples.
- #9545 -> `docs/changelog/2026-08-20.mdx`: Record shared
runtime-adapter port validation.
- #9578 -> `docs/changelog/2026-08-20.mdx`: Record Portable network
creation before host aliases.
- #9589 -> `docs/changelog/2026-08-20.mdx`: Record running vLLM profile
validation.
- #9590 -> `docs/changelog/2026-08-20.mdx`: Record the two-turn atomic
advisor review.
- #9597 -> `docs/changelog/2026-08-20.mdx`: Record Portable uninstall
without host-owned lifecycle resources.
- #9605 -> `docs/changelog/2026-08-20.mdx`: Record release automation
for an initially empty tag history.
- #9607 -> `docs/changelog/2026-08-20.mdx`: Record credential retry
navigation.
- #9626 -> `docs/changelog/2026-08-20.mdx`: Record retirement of
DeepSeek V4 Pro from the featured menu.
- #9631 -> `docs/changelog/2026-08-20.mdx`: Record reduction-directed
advisor design blockers.
- #9632 -> `docs/changelog/2026-08-20.mdx`: Record Portable Ollama under
Podman.
- #9633 -> `docs/changelog/2026-08-20.mdx`: Record llama.cpp attachment
without `/props` model aliases.
- #9636 -> `docs/changelog/2026-08-20.mdx`: Record Docker authority
independent of terminal state.
- #9641 -> `docs/changelog/2026-08-20.mdx`: Record the separate Portable
host-gateway subnet.
- #9642 -> `docs/changelog/2026-08-20.mdx`: Record cumulative command
documentation catch-up.
- #9645 -> `docs/changelog/2026-08-20.mdx`: Record removal of completed
advisor rollout compatibility.
- #9647 -> `docs/changelog/2026-08-20.mdx`: Record diagnostics for
OpenShell deletion handoffs.
- #9650 -> `docs/changelog/2026-08-20.mdx`: Record OpenClaw pairing
settlement after route changes.
- #9652 -> `docs/changelog/2026-08-20.mdx`: Record repaired same-turn
advisor submissions.
- #9653 -> `docs/changelog/2026-08-20.mdx`: Record llama.cpp authority
preservation on resume.
- #9654 -> `docs/changelog/2026-08-20.mdx`: Record the schema-owned
Microsoft Teams webhook field.
- #9655 -> `docs/changelog/2026-08-20.mdx`: Record configured managed
vLLM ports.
- #9656 -> `docs/changelog/2026-08-20.mdx`: Record interrupted managed
vLLM installation recovery.
- #9660 -> `docs/changelog/2026-08-20.mdx`: Record catalog-owned vLLM
profiles and refreshed llama.cpp pins.
- #9663 -> `docs/changelog/2026-08-20.mdx`: Record attested LKG
production-image requests.
- #9664 -> `docs/changelog/2026-08-20.mdx`: Record corrected documented
environment-variable handling.
- #9665 -> `docs/changelog/2026-08-20.mdx`: Record retired gateway
evidence validation.
- #9666 -> `docs/changelog/2026-08-20.mdx`: Record Docker authority
across terminal sessions.
- #9667 -> `docs/changelog/2026-08-20.mdx`: Record contribution intake
and product-decision guidance.
- #9669 -> `docs/changelog/2026-08-20.mdx`: Record bounded DGX Spark
llama.cpp request bodies.
- #9670 -> `docs/changelog/2026-08-20.mdx`: Record managed llama.cpp
bridge authentication.
- #9671 -> `docs/changelog/2026-08-20.mdx`: Record gateway recreation
after Docker network loss.
- #9672 -> `docs/changelog/2026-08-20.mdx`: Record bounded WSL Ollama
host probes.
- #9674 -> `docs/changelog/2026-08-20.mdx`: Record cumulative inference
and command documentation catch-up.
- #9675 -> `docs/changelog/2026-08-20.mdx`: Record Muse Glimmer vLLM
image revision handling.
- #9676 -> `docs/changelog/2026-08-20.mdx`: Record the grouped CodeQL
Actions update.
- #9677 -> `docs/changelog/2026-08-20.mdx`: Record the actions/setup-go
7.0.0 update.
- #9678 -> `docs/changelog/2026-08-20.mdx`: Record resumable failed
llama.cpp cleanup.
- #9681 -> `docs/changelog/2026-08-20.mdx`: Record Docker executable
injection in the state-mutation harness.
- #9683 -> `docs/changelog/2026-08-20.mdx`: Record Windows Docker path
fixtures.
- #9684 -> `docs/changelog/2026-08-20.mdx`: Record isolated macOS status
subprocess cleanup.
- #9686 -> `docs/changelog/2026-08-20.mdx`: Record managed-inference
catalog compilation for Portable E2E.
- #9687 -> `docs/changelog/2026-08-20.mdx`: Record cumulative uninstall
documentation catch-up.
- #9688 -> `docs/changelog/2026-08-20.mdx`: Record DCode model-selector
loading through tsx.
- #9689 -> `docs/changelog/2026-08-20.mdx`: Record bounded docs-parity
process starts.
- #9690 -> `docs/changelog/2026-08-20.mdx`: Record reduced advisor
review protocol failures.
- #9691 -> `docs/changelog/2026-08-20.mdx`: Record managed llama.cpp
bridge cleanup coverage.
- #9692 -> `docs/changelog/2026-08-20.mdx`: Record upstream credential
rejection diagnostics.
- #9693 -> `docs/changelog/2026-08-20.mdx`: Record cumulative managed
vLLM documentation catch-up.
- #9694 -> `docs/changelog/2026-08-20.mdx`: Record the pinned Portable
rootless Podman runtime.
- #9695 -> `docs/changelog/2026-08-20.mdx`: Record owned llama.cpp image
publication.
- #9697 -> `docs/changelog/2026-08-20.mdx`: Record Windows-host Ollama
resume behavior.
- #9699 -> `docs/changelog/2026-08-20.mdx`: Record the separate trusted
Windows path oracle.
- #9702 -> `docs/changelog/2026-08-20.mdx`: Record sandbox bridge
cleanup coverage.
- #9703 -> `docs/changelog/2026-08-20.mdx`: Record hardened Ollama
installer downloads.
- #9704 -> `docs/changelog/2026-08-20.mdx`: Record supervised dashboard
recovery evidence.
- #9706 -> `docs/changelog/2026-08-20.mdx`: Record reused model and
reasoning health validation.
- #9708 -> `docs/changelog/2026-08-20.mdx`: Record fixed local vLLM
profile preservation.
- #9711 -> `docs/changelog/2026-08-20.mdx`: Record local registry
authority in E2E runs.
- #9712 -> `docs/changelog/2026-08-20.mdx`: Record Hermes dashboard
migration before gateway health.
- #9720 -> `docs/changelog/2026-08-20.mdx`: Record default OpenClaw
session admission during uninstall.
- #9721 -> `docs/changelog/2026-08-20.mdx`: Record MCP credential
republishing after policy binding.
- #9722 -> `docs/changelog/2026-08-20.mdx`: Record provider republishing
after Docker recreation.
- #9724 -> `docs/changelog/2026-08-20.mdx`: Record reclamation of dead
Shields lifecycle owners.
- #9725 -> `docs/changelog/2026-08-20.mdx`: Record fail-closed
unscripted onboarding prompts.
- #9729 -> `docs/changelog/2026-08-20.mdx`: Record aligned sandbox
launch forward ports.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [x] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates

- [ ] Tests added or updated for changed behavior
- [x] Existing tests cover changed behavior — justification:
`test/changelog-docs.test.ts` validates the dated release-entry
contract.
- [ ] Tests not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable; documentation-only change.
- Station profile/scenario: Not applicable.
- Result: Not applicable.
- Supporting evidence: Not applicable.

## Verification

- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run validate:pr` passed after refreshing `origin/main` when hooks
were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `npx vitest run
test/changelog-docs.test.ts` (7 passed).
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result: Not applicable to one
prose-only changelog page.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) — passed
with 0 errors and the 2 existing Fern warnings.
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)
— the parser-safe MDX SPDX comment is present; native changelog pages
intentionally do not use frontmatter.

---
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
  * Added release notes for v0.0.112.
* Documented improvements to managed model runtimes, sandbox recovery,
MCP and provider handling, messaging, Shields, and PR Review Advisor.
* Added details on release provenance, end-to-end qualification,
dependency updates, and documentation alignment.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@wscurran wscurran added the bug-fix PR fixes a bug or regression label Aug 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug-fix PR fixes a bug or regression

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Managed startup profile rejects schema-owned messaging webhook field

3 participants