Skip to content

fix: resolve Tavily SecretRefs in agent tools#97827

Merged
steipete merged 7 commits into
openclaw:mainfrom
VACInc:tavily-exec-secretref-tool-runtime
Jul 15, 2026
Merged

fix: resolve Tavily SecretRefs in agent tools#97827
steipete merged 7 commits into
openclaw:mainfrom
VACInc:tavily-exec-secretref-tool-runtime

Conversation

@VACInc

@VACInc VACInc commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Fixes #95109

Summary

  • Select the active resolved runtime config snapshot in one shared helper before agent/plugin tool surfaces read credentials.
  • Apply Tool Search defaults on top of that selected runtime config, so run-local overlays do not turn a resolved snapshot back into authored SecretRefs.
  • Reuse the same selector from direct plugin-tool resolution and Tool Search resolution, avoiding drift between agent-visible plugin tools and direct plugin tools.
  • Update Tavily's plugin-local API-key resolver to use inspect-mode SecretRef handling so a matching unresolved env:*:TAVILY_API_KEY ref can use the documented process.env.TAVILY_API_KEY fallback.
  • Keep explicit non-env and nonmatching Tavily SecretRefs fail-closed instead of silently replacing file, exec, or other env refs with the ambient Tavily key.
  • Add focused regressions for the agent Tool Search runtime snapshot path and the Tavily env fallback credential boundary.

Root Cause

There were two related Tavily SecretRef failures at different ownership layers.

  1. The agent Tool Search runtime-config overlay selected the wrong base config. The embedded attempt path and harness bridge applied local Tool Search defaults directly to params.config. When params.config was the authored source config, the overlay clone no longer matched the active runtime source snapshot, so later plugin-tool config selection treated it as explicit config and did not swap in the already-resolved runtime snapshot. Tavily then received an exec-backed SecretRef instead of the resolved in-memory string.
  2. Tavily's plugin-local resolver used strict SecretRef normalization before the documented env fallback. extensions/tavily/src/config.ts called strict normalization on plugins.entries.tavily.config.webSearch.apiKey; an unresolved env SecretRef threw before process.env.TAVILY_API_KEY could be read.

RCA proof:

  • Agent Tool Search before behavior: src/agents/embedded-agent-runner/run/attempt.ts and src/agents/harness/tool-surface-bridge.ts applied Tool Search defaults before runtime snapshot selection.
  • Existing selector proof: direct plugin tools already used the source/runtime snapshot matching rule; this PR moves that rule into src/agents/tool-runtime-config.ts and reuses it.
  • Tavily before behavior: extensions/tavily/src/config.ts used strict SecretRef normalization ahead of the env fallback, which matches the UnresolvedSecretInputError in Tavily plugin throws UnresolvedSecretInputError before falling back to process.env #95109.
  • Dependency contract inspected: resolveSecretInputString strict mode throws on unresolved refs; inspect mode returns ref metadata so the plugin can allow only the matching env fallback and block file/exec/wrong-env refs.

What Problem This Solves

Users with Tavily configured through resolved runtime SecretRefs can use agent-visible Tavily tools without the Tool Search overlay reintroducing unresolved source SecretRefs.

Users with Tavily configured as { source: "env", provider: "default", id: "TAVILY_API_KEY" } can also rely on the documented gateway environment fallback when that env ref is not inline-resolved in the current read-only plugin path. Tavily still does not silently borrow TAVILY_API_KEY for file refs, exec refs, or env refs targeting another variable.

Why This Change Was Made

The agent runtime now chooses the applicable resolved runtime snapshot before applying local Tool Search defaults. That keeps run-local config overlays in memory, preserves the authored SecretRef in source config, and avoids storing plaintext credentials.

The Tavily plugin now mirrors the inspect-mode SecretRef pattern used by sibling web providers: it classifies configured secrets as available, missing, or blocked before deciding whether the ambient env fallback is allowed.

User Impact

Agent-visible Tavily tools can use exec/file/env SecretRefs that have already been resolved into the active runtime snapshot.

Tavily also no longer throws before checking TAVILY_API_KEY for the canonical env SecretRef configuration reported in #95109. Explicit non-env Tavily SecretRefs remain fail-closed if unavailable.

Real behavior proof

Behavior fixed: Tool Search runtime config now carries resolved in-memory Tavily API key values to agent/plugin tools while the source config keeps the authored SecretRef; Tavily's plugin-local resolver now allows the matching env SecretRef fallback without weakening file/exec/wrong-env credential boundaries.

Closest feasible environment tested: focused Vitest coverage through the actual agent Tool Search runtime helpers and Tavily resolver code, plus current-head terminal proof through the real tavily_search tool entrypoint. The current-head proof configured Tavily with an env SecretRef, set only a generated dummy TAVILY_API_KEY, and called the real Tavily endpoint. Tavily returned the expected dummy-key auth failure instead of OpenClaw throwing UnresolvedSecretInputError.

Current-head Tavily env SecretRef proof:

node --import tsx --input-type=module <<'SCRIPT'
# script imported createTavilySearchTool and resolveTavilyApiKey from this checkout
# cfg.plugins.entries.tavily.config.webSearch.apiKey = { source: "env", provider: "default", id: "TAVILY_API_KEY" }
# process.env.TAVILY_API_KEY = generated dummy value only
SCRIPT

PR #97827 current-head Tavily env SecretRef proof
commit: 1b921e49532747c9031dc98096179f90fc3fb6b9
configured apiKey: env:default:TAVILY_API_KEY
endpoint: https://api.tavily.com/search
env key: generated dummy value only (redacted)
resolveTavilyApiKey returned env dummy: true
Tavily endpoint reached with dummy key: true
UnresolvedSecretInputError observed: no
observed error: Tavily Search API error (401): {"detail":{"error":"Unauthorized: missing or invalid API key."}}

Focused regression output:

node scripts/run-vitest.mjs extensions/tavily/src/config.test.ts src/agents/harness/tool-surface-bridge.test.ts src/agents/openclaw-tools.browser-plugin.integration.test.ts

[test] starting test/vitest/vitest.agents.config.ts
Test Files  2 passed (2)
Tests  10 passed (10)

[test] starting test/vitest/vitest.extension-misc.config.ts
Test Files  1 passed (1)
Tests  8 passed (8)

[test] passed 2 Vitest shards in 8.75s

Observed after behavior:

  • Agent Tool Search config keeps Tavily's resolved runtime string while the source config remains an authored SecretRef.
  • Tavily resolves a matching unresolved env:*:TAVILY_API_KEY SecretRef from process.env.TAVILY_API_KEY instead of throwing first.
  • The tavily_search tool path reaches Tavily with the resolved dummy env key and receives a Tavily auth error, proving provider execution was reached.
  • Tavily does not fall back to the ambient env key for file SecretRefs, exec SecretRefs, env refs with another id, or env providers whose allowlist blocks TAVILY_API_KEY.
  • No plaintext real credential is written to config, committed, or printed.

Evidence

Current-head real behavior proof:

node --import tsx --input-type=module <<'SCRIPT'
# redacted inline proof script; see Real behavior proof output above
SCRIPT
# commit: 1b921e49532747c9031dc98096179f90fc3fb6b9
# resolveTavilyApiKey returned env dummy: true
# Tavily endpoint reached with dummy key: true
# UnresolvedSecretInputError observed: no
# observed error: Tavily Search API error (401): {"detail":{"error":"Unauthorized: missing or invalid API key."}}

Focused tests:

node scripts/run-vitest.mjs extensions/tavily/src/config.test.ts src/agents/harness/tool-surface-bridge.test.ts src/agents/openclaw-tools.browser-plugin.integration.test.ts
# Test Files  3 passed (3); Tests 18 passed (18)

Formatting, lint, whitespace:

pnpm exec oxfmt --check --threads=1 extensions/tavily/src/config.ts extensions/tavily/src/config.test.ts src/agents/tool-runtime-config.ts src/agents/tool-search-runtime-config.ts src/agents/harness/tool-surface-bridge.ts src/agents/harness/tool-surface-bridge.test.ts src/agents/embedded-agent-runner/run/attempt.ts src/agents/openclaw-plugin-tools.ts
# All matched files use the correct format.

node scripts/run-oxlint.mjs extensions/tavily/src/config.ts extensions/tavily/src/config.test.ts src/agents/tool-runtime-config.ts src/agents/tool-search-runtime-config.ts src/agents/harness/tool-surface-bridge.ts src/agents/harness/tool-surface-bridge.test.ts src/agents/embedded-agent-runner/run/attempt.ts src/agents/openclaw-plugin-tools.ts
# passed with no diagnostics

git diff --check
# passed

Autoreview:

.agents/skills/autoreview/scripts/autoreview --mode local
# autoreview clean: no accepted/actionable findings reported
# overall: patch is correct (0.86)

Requested update command:

oc-update
# pushed commit 1b921e49532 first, then oc-update completed; health check passed on attempt 2/3

GitHub CI:

All required GitHub checks for commit 1b921e49532747c9031dc98096179f90fc3fb6b9 were green when this proof update was added.

Verification

  • Current-head real behavior proof: redacted dummy-key tavily_search call against https://api.tavily.com/search reached Tavily and returned 401 instead of UnresolvedSecretInputError.
  • Focused regression: node scripts/run-vitest.mjs extensions/tavily/src/config.test.ts src/agents/harness/tool-surface-bridge.test.ts src/agents/openclaw-tools.browser-plugin.integration.test.ts
  • Formatting: pnpm exec oxfmt --check --threads=1 ...
  • Lint: node scripts/run-oxlint.mjs ...
  • Whitespace: git diff --check
  • Autoreview: .agents/skills/autoreview/scripts/autoreview --mode local
  • Requested update command: oc-update
  • GitHub CI: required checks green for 1b921e49532747c9031dc98096179f90fc3fb6b9

What was not tested

  • Live Tavily search with a real Tavily credential, to avoid exposing or storing a real API key. The current-head proof intentionally used a generated dummy key and treated Tavily's 401 response as proof that the provider endpoint was reached.
  • A successful Tavily result payload with a real account quota.
  • Unrelated local oc-update doctor/security warnings, including local skill/tooling/security-audit findings, were not repaired by this PR.

AI Assistance

AI-assisted with Codex. I understand the change: it keeps the active resolved runtime snapshot as the base config for agent Tool Search overlays and direct plugin tools, and it repairs Tavily's plugin-local env SecretRef fallback without allowing unrelated configured credential refs to be silently replaced by ambient env state.

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: S labels Jun 29, 2026
@clawsweeper

clawsweeper Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 14, 2026, 8:46 PM ET / July 15, 2026, 00:46 UTC.

Summary
This PR centralizes resolved runtime-config selection for agent tool surfaces and changes Tavily SecretRef handling to permit the matching environment fallback while retaining fail-closed behavior for other refs.

PR surface: Source +66, Tests +178. Total +244 across 8 files.

Reproducibility: yes. at source level: strict Tavily normalization throws before its environment fallback, while applying Tool Search defaults before runtime-snapshot selection clones the authored SecretRef and loses snapshot identity. The PR also provides exact-head terminal proof of the Tavily path.

Review metrics: 2 noteworthy metrics.

  • Credential fallback surfaces: 1 changed. Tavily now conditionally permits one matching environment SecretRef path to use an ambient credential, making the boundary important to verify before merge.
  • Tool Search runtime entry points: 2 changed. Both embedded attempts and harness tool surfaces now select the resolved runtime snapshot before applying local Tool Search defaults.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #95109
Summary: The issue is canonical; this PR is the broader adopted candidate fix, while the related open PR covers only the Tavily-local portion.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

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

Risk before merge

  • [P1] The branch changes an auth-provider boundary: incorrect source/runtime snapshot selection could expose an authored unresolved SecretRef to plugin tools or select an unintended ambient credential.
  • [P1] The PR is behind current main and its latest check set includes a failed type gate, so the adopted head still needs fresh exact-head validation after updating the base.
  • [P1] Several open PRs target the same Tavily failure; landing more than one implementation would create overlapping credential-resolution paths and maintenance drift.

Maintainer options:

  1. Refresh and land the adopted branch (recommended)
    Update this branch against current main and require green affected exact-head gates before landing both the Tavily and Tool Search repairs together.
  2. Narrow to the Tavily-only candidate
    Pause this PR in favor of fix(tavily): fall back to process.env when config SecretRef is unresolvable #95110 only if maintainers intentionally exclude the independently demonstrated shared Tool Search repair.

Next step before merge

  • No automated repair job is warranted; the patch has no actionable code finding and needs routine current-main refresh, exact-head validation, and maintainer merge handling.

Security
Cleared: No concrete security or supply-chain regression was found; the patch restricts ambient fallback to a matching permitted env SecretRef and retains fail-closed handling for other configured refs.

Review details

Best possible solution:

Refresh the adopted branch onto current main, rerun the focused Tavily and agent-tool regressions plus the exact-head type gate, land it as the canonical two-layer fix, then retire the narrower duplicate PR and let the linked issue close after merge.

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

Yes, at source level: strict Tavily normalization throws before its environment fallback, while applying Tool Search defaults before runtime-snapshot selection clones the authored SecretRef and loses snapshot identity. The PR also provides exact-head terminal proof of the Tavily path.

Is this the best way to solve the issue?

Yes. The Tavily resolver follows the existing inspect-mode credential-boundary pattern, while the shared helper fixes the second root cause once for both agent-tool entry points instead of adding another provider-specific workaround.

AGENTS.md: found and applied where relevant.

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

Label changes

Label justifications:

  • P2: This fixes a real bundled Tavily and agent-tool credential-resolution bug with limited provider and runtime blast radius.
  • merge-risk: 🚨 auth-provider: The diff changes provider credential selection for Tavily SecretRefs and the runtime snapshots supplied to agent-visible plugin tools.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR includes redacted exact-head terminal proof through the real Tavily tool entrypoint: a generated dummy env key reached Tavily and produced the expected 401 instead of a SecretRef error.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR includes redacted exact-head terminal proof through the real Tavily tool entrypoint: a generated dummy env key reached Tavily and produced the expected 401 instead of a SecretRef error.
Evidence reviewed

PR surface:

Source +66, Tests +178. Total +244 across 8 files.

View PR surface stats
Area Files Added Removed Net
Source 6 124 58 +66
Tests 2 179 1 +178
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 8 303 59 +244

What I checked:

  • Tavily credential boundary: The PR uses inspect-mode SecretRef resolution, permits ambient fallback only for a matching allowed TAVILY_API_KEY env ref, and blocks file, exec, wrong-id, and disallowed-provider refs. (extensions/tavily/src/config.ts:41, dd07d2b21b1f)
  • Shared runtime-config ordering: The new helper selects the applicable resolved runtime snapshot before Tool Search defaults clone or overlay the config, preserving resolved plugin credentials. (src/agents/tool-search-runtime-config.ts:12, dd07d2b21b1f)
  • Regression coverage: Focused tests cover the resolved runtime snapshot overlay and Tavily's literal, matching-env, provider-allowlist, file, exec, wrong-id, and missing-key cases. (extensions/tavily/src/config.test.ts:27, dd07d2b21b1f)
  • Real behavior proof: The PR body records an exact-head real tavily_search invocation using a generated dummy key; the request reached Tavily and returned 401 rather than UnresolvedSecretInputError. (1b921e495327)
  • SecretRef dependency contract: The relevant SecretRef contract distinguishes strict throwing behavior from inspect-mode metadata, enabling the guarded fallback without catching unrelated credential failures. (src/config/types.secrets.ts:225, 1769fb2aa1d6)
  • Maintainer adoption: The timeline shows steipete assigned the PR, adopted its branch, and authored the current consolidated commit before the contributor's subsequent rebases. (dd07d2b21b1f)

Likely related people:

  • lakshyaag-tavily: Git history connects this person to the bundled Tavily plugin introduction and the affected config and client surfaces. (role: introduced behavior; confidence: high; commits: b36e456b0916; files: extensions/tavily/src/config.ts, extensions/tavily/src/tavily-client.ts)
  • Josh Avant: Authored the inspect-versus-strict SecretRef behavior used by this repair. (role: adjacent SecretRef contract owner; confidence: high; commits: 1769fb2aa1d6; files: src/config/types.secrets.ts, src/plugin-sdk/secret-input.ts)
  • VACInc: Has prior merged Tavily SecretRef runtime work in addition to proposing this branch. (role: recent area contributor; confidence: medium; commits: 1555165d1698; files: extensions/tavily/src/tavily-search-tool.ts, extensions/tavily/src/tavily-extract-tool.ts, extensions/tavily/src/tavily-tools.test.ts)
  • steipete: Assigned, adopted, and rebased this branch, and authored its current consolidated commit. (role: branch adopter and recent reviewer; confidence: high; commits: dd07d2b21b1f; files: extensions/tavily/src/config.ts, src/agents/tool-runtime-config.ts, src/agents/tool-search-runtime-config.ts)
  • Kris Wu: Recent current-main history touches the embedded agent attempt path changed by the Tool Search portion of this PR. (role: recent agent runtime contributor; confidence: low; commits: 444a09359377; files: src/agents/embedded-agent-runner/run/attempt-tool-base-prepare.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.
Review history (23 earlier review cycles; latest 8 shown)
  • reviewed 2026-07-14T22:17:40.716Z sha dd07d2b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-14T22:34:46.654Z sha dd07d2b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-14T22:53:02.820Z sha dd07d2b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-14T23:11:07.477Z sha dd07d2b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-14T23:27:52.098Z sha dd07d2b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-14T23:44:54.410Z sha dd07d2b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-15T00:01:47.277Z sha dd07d2b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-15T00:17:51.077Z sha dd07d2b :: needs maintainer review before merge. :: none

@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. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels Jun 29, 2026
@VACInc
VACInc force-pushed the tavily-exec-secretref-tool-runtime branch from 81526f4 to 860c0ad Compare June 29, 2026 15:55
@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. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. 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. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jun 29, 2026
@VACInc VACInc changed the title fix: keep Tavily exec SecretRefs resolved in Tool Search fix: resolve Tavily SecretRefs in agent tools Jun 30, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 30, 2026
@VACInc

VACInc commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 30, 2026
@VACInc

VACInc commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 30, 2026
@openclaw-barnacle openclaw-barnacle Bot added channel: msteams Channel integration: msteams channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web app: web-ui App: web-ui scripts Repository scripts channel: feishu Channel integration: feishu size: XL and removed size: M labels Jul 15, 2026
@openclaw-barnacle openclaw-barnacle Bot added cli CLI command changes extensions: onepassword 1Password plugin labels Jul 15, 2026
@openclaw-barnacle openclaw-barnacle Bot added the gateway Gateway runtime label Jul 15, 2026
@openclaw-barnacle openclaw-barnacle Bot removed docs Improvements or additions to documentation channel: discord Channel integration: discord channel: googlechat Channel integration: googlechat channel: matrix Channel integration: matrix channel: mattermost Channel integration: mattermost channel: msteams Channel integration: msteams channel: slack Channel integration: slack channel: telegram Channel integration: telegram labels Jul 15, 2026
@steipete

Copy link
Copy Markdown
Contributor

Maintainer landing proof for d82a700a302bc06a73f987ccb64cc0b626b316d9:

  • Deep review: ready. The canonical runtime snapshot is selected before the lean Tool Search overlay; Tavily retains plugin-owned SecretRef resolution and fails closed for unrelated file, exec, or env refs. Fresh autoreview found no accepted/actionable findings.
  • Focused Testbox: 23/23 tests passed across runtime config, harness bridge, browser-plugin integration, and Tavily config: https://github.com/openclaw/openclaw/actions/runs/29384089528
  • Live behavior: real Gateway -> OpenAI gpt-5.5 -> lean Tool Search -> Tavily discovery/call path passed. A generated invalid key reached Tavily and returned the expected 401 provider boundary instead of UnresolvedSecretInputError; build also passed: https://github.com/openclaw/openclaw/actions/runs/29383812677
  • Coordinator gate: hosted_exact_or_recent_parent passed for this PR under the 24-hour same-PR green-CI policy. The new head only removes the PR-local changelog bullet because CHANGELOG.md is release-owned; runtime/test trees are unchanged from the reviewed head.
  • Current exact-head CI is running. The earlier macOS Periphery failure was unrelated to this PR and is already fixed on main by b4cf7ca7f49.

Known proof gap: no successful search with a real Tavily credential; live proof deliberately used a generated invalid key to avoid handling a real secret while still proving provider execution.

@steipete

Copy link
Copy Markdown
Contributor

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling extensions: tavily merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tavily plugin throws UnresolvedSecretInputError before falling back to process.env

2 participants