[Feat] Integration tool approvals are no longer experimental; Auto becomes its own experiment - #3169
Conversation
…eriment Per-tool approvals (Always allow, Always ask, Disable, session overrides, task asks, chat actions) are now a normal feature: no experiment gates the rules, the proxy, the task path, the approval routes, or the Manage tools controls. The old experiment also acted as a kill switch that cancelled open approvals and blocked claims; that path goes with it. Auto gets its own experiment, integrationToolAutoApprovals. With it off, nothing is assessed, not even in the background, and a tool nobody has made a choice about simply runs; the Manage tools rows show it as Always allow and the group row offers no Auto. With it on, the Auto-approval decisions card appears in Agent Guidance and Auto behaves as before. The legacy enable checkboxes and Save footer in both Manage tools dialogs are removed; Disable replaces them and still syncs the legacy columns. The old experiment's metadata key stays in the database as a legacy flag.
|
No new code issues found. See task
Reviewed c127533 |
|
Smoke test at exact head
Sandbox setup: The first approval POST got 403 due to mismatched bundled/preview origins; aligning the web origin fixed it. Subsequent model calls initially got 401 because the local web process inherited this task's global OpenCode config pointing to a different inference gateway. Isolating its XDG config restored local DeepWiki execution. The final runtime claims above come from the successful runs after those environmental interruptions. |
…icies The native MCP handlers' auth tests used to switch the approvals experiment off to keep the approval guard inert. With no experiment to switch, they now mock the approval enforcement to 'no policies' instead. Also drops the ToggleLeft/ToggleRight icon exports the removed legacy footers used.
Related issue
No linked issue; internal Roomote work.
Why this PR exists
What changed
Per-tool integration approvals come out of Experimental. Auto stays experimental, behind its own switch.
Per-tool approvals are always on. Always allow, Always ask, Disable, "ask me for this tool this session", task asks, and the chat approval actions no longer depend on
integrationToolApprovals. The Fast session rules, the integration proxy, the native MCP guard, the task path, the approval routes, and the Manage tools controls all run for every deployment. Personal policies for private servers are available to every member.Auto is its own experiment,
integrationToolAutoApprovals. Settings → Experimental now shows "Auto tool approvals" instead of "Integration tool approvals".The old kill switch is gone. Turning the approvals experiment off used to cancel every open approval and make claims fail under a share lock on the settings row. With no experiment to turn off, the cancel sweep, the share-locked read, and the experiment re-checks in the relay loop are removed.
Legacy availability UI is removed. Both Manage tools dialogs lose the old enable checkboxes and their Save footer. Disable replaces them and still keeps the legacy
disabled_toolscolumns in sync.Docs. The integrations docs describe the per-tool choices, and the custom MCP servers page notes that Always ask is enforced at the proxy for tasks.
Rollback. No schema change. The old
integration_tool_approvals_experiment_enabledmetadata key stays in the database and now classifies as a legacy flag. Deployments that had Auto On keep their saved setting, but Auto stays inactive until an admin turns on the new experiment.How it was tested
Unit suites updated for the new gates. Kill-switch tests are removed, and experiment-off cases are replaced with "no experiment needed" assertions and an Auto-off rendering case. Typecheck, format, and oxlint pass locally. CI runs the full suites. Live smoke at head
ab6b0710don a running sandbox stack: steps 1–6 passed on the observed UI and runtime checks. Full smoke session.read_wiki_structurechanged to Always ask.read_wiki_structureunavailable without running it. Resetting Always allow and clicking it again left it selected with Auto off. The earlier report of a repeat-click failure came from testing under Auto-on semantics and was incorrect for this case.read_wiki_structurewithout a card and recordedauto_approvedwith NULL human decider. Turning the experiment off allowed another call without a card and leftintegration_tool_auto_evaluationsat zero.The sandbox initially misrouted model calls to an inherited production inference gateway, yielding
Provider error (openrouter/openai/gpt-5.6-terra): HTTP 401: Unauthorized: authentication_required. IsolatingXDG_CONFIG_HOMEfor the local web process restored live execution; the successful checks above were observed after that correction. No product code changed or PR merge occurred.Checklist
pnpm lintandpnpm check-typespass locallypnpm changesetScreenshots
Experimental page: Auto tool approvals is off; the old integration approvals switch is absent.
Manage tools, Auto off: Always allow is pressed and the group row has no Auto.
Manage tools, Auto on: untouched tool rows have nothing pressed and the group row offers Auto.
Approval card: displayed without an Auto line during step 3; screenshot pending capture.