DSH Orchestrator Security Boundaries
September 4, 2026 ยท View on GitHub
Credentials
The repository contains no provider key, token, OAuth client, credential path, or login implementation. Both provider rows use env: {}. DSH preserves ordinary child process facts such as HOME but scrubs credential-shaped ambient variables. Each vendor CLI may use only the native account state it owns.
Permissions
- Claude uses
permissionMode: dontAsk, fixed for the provider instance and not inherited from any session. It denies operations that native policy has not already authorized. - Codex uses
workspace-writeplusuntrustedas its static fallback. WithinheritSessionPermissions, the session's sandbox and approval policy are inherited independently: any validsandbox/modeis adopted, while only the DSHneverapproval policy is; every other policy keeps the fallback. - Copilot
permission: rejectdeclines every ACP permission request and the CLI receives an empty available-tool catalog. - Copilot custom instructions, built-in MCP servers,
ask_user, remote control/export, and auto-update are disabled. - No child permission request is surfaced as a blocking human dialog.
- Changing Claude to
bypassPermissionsrequires explicit user approval and a dedicated security review.
The repository contains no direct Google provider, credentials, proxy, custom OAuth, or headless Antigravity wrapper. Gemini runs as a model hosted behind GitHub Copilot's documented ACP interface and GitHub authentication boundary.
Codex dynamic-tool bridge
@softspark/dsh-codex keeps its standalone experimentalDynamicTools and inheritSessionPermissions defaults disabled. This bundle must follow dsh-codex in the DSH profile bundle order and replaces the complete llm-codex configuration with the reviewed orchestration settings: workspace-write and untrusted fallbacks, inheritSessionPermissions: true, allowApiKeyAuth: false, bounded request/turn/tool timeouts, and experimentalDynamicTools: true. Inheritance needs dsh-codex 1.4.0 or newer; an older package keeps the unknown key and ignores it. A session running the DSH danger-full-access preset starts its Codex thread with danger-full-access and never, so the presets a profile offers are part of this boundary.
The bridge only exposes the DSH tool catalog to the Codex app-server turn. DSH remains responsible for executing a selected tool and returning its correlated text result; dsh-codex does not call Claude, Copilot, or credentials directly. When no earlier llm-codex row exists, DSH warns and skips the override rather than creating a second or incomplete provider. Reordering or changing either bundle requires a new composition test and live subscription-backed smoke test.
Process and workspace
Each delegation starts a fresh process in the parent workspace. A child can observe or modify files only according to its vendor runtime and permission configuration. Cancellation does not roll back effects already committed by the child.
Data flow
Prompts and model-visible workspace content leave the computer through the selected vendor CLI. DSH does not make that traffic local. Copilot Gemini has no file tools, but the standalone prompt itself still reaches GitHub and the hosted model. Review repository sensitivity before delegating.
Logging
Do not attach credentials, complete session logs, private prompts, or proprietary file contents to issues. Keep DSH telemetry disabled unless a separate policy explicitly authorizes it.
Upstream verification
The separately installed Copilot CLI 1.0.80 macOS arm64 artifact matched official npm and GitHub/Homebrew hashes during review, but its embedded Apple signature did not pass codesign --verify. The bundle neither installs nor redistributes that binary. Keep auto-update disabled and repeat provenance, static, and platform-signature checks before changing the accepted version.