Repository navigation
feat(fleet): dsh as a sandboxed low-trust fleet adapter, pilot (#773) - #788
Conversation
DeepSeek Harness (@deepseek-ai/dsh 0.2.0-rc.2, headless profile, --json)
joins the adapter registry as one JSON entry whose command is docker: it
runs only inside the agentic-board/dsh image (containers/dsh), never on
the host.
- Launch/probe: docker run --rm --pull=never, worktree as the only bind
mount, read-only root + tmpfs /tmp (DSH_HOME), non-root, cap-drop ALL,
no-new-privileges, cpu/memory/pid limits, only DEEPSEEK_API_KEY passed
by name, telemetry collectors pinned to 127.0.0.1.
- Image: node base by tag+digest, exact dsh pin + lockfile via npm ci.
The session-log upload (session-log-deepseek, on by default and carried
inside the API request), OTLP telemetry and the package inventory are
disabled by a --patch layer; the build fails if --dump-config still
mounts them; the entrypoint refuses a workspace .env, weakened
switches and stray credentials.
- lowTrust (new registry field): docs/chore routes only, never reviewer or
default, sticky across tiers; offered only for PUBLIC repos (Fleet-Plan
reads repository visibility) and re-checked at fleet launch, unknown
visibility fails closed.
- {workPath} launch placeholder, refusing paths that could inject mount
options. No bypass needed: workspace-write edits headless.
- Probe rules from dsh's real outputs (AUTH, MISSING_CREDENTIAL, QUOTA,
RATE_LIMIT, CONTEXT_WINDOW_EXCEEDED, Docker errors); OK needs the
final event to answer OK.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Plugin README "runs, sends and fetches": dsh runs only in the container,
is never installed for you, and sends its task and workspace reads to
DeepSeek's API under DeepSeek's terms with the session-log upload and
telemetry off. presets/README: the lowTrust field, the {workPath}
placeholder, dsh in the routes table. containers/dsh/README: the pins,
what the container gets, and how the upload is disabled and verified.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
) Launch gate: Start-WorktreeSession is the one door every session goes through (fleet picker, per-issue choice, relaunch). It now refuses a lowTrust CLI unless the issue's route (Select-CliRoute on its labels, Type and Size) is docs or chore AND its repo is PUBLIC; missing facts (e.g. a relaunch) are refused. On refusal it starts claude and prints one warning line. The issue facts come from the board item (Get-IssueLaunchFacts, visibility now in the GraphQL read) and travel through Build-FleetPlan. The fleet hook and relaunch record the CLI that actually started. Briefing: dsh has no gh, pwsh, plugin scripts or token, so it gets Get-ContainerEditBriefing (the issue text, capped, plus one job: edit the files in /work; no git, no PR, no network) instead of the fleet briefing. After the container exits, the launch script prints the human next step: review git diff in the worktree, then commit and open the PR. Nothing is committed or pushed automatically. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (sha d6c0348) El diseño es sólido: el gate low-trust falla cerrado (visibilidad desconocida se rechaza, no se puede quitar Seguridad (medio): exfiltración de
Menores
Tests: la cobertura es amplia (Dsh/AdapterRegistry/Board-Work). Faltan casos para |
The RawGh lint ratchet (#571) caught a bare gh call added for the dsh visibility check. Invoke-Gh throws on failure instead of reading a 401 as an empty answer; the catch still turns it into $null, which keeps dsh away. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (sha 166efc1) El diseño es sólido: defensa en capas, falla cerrado, gate de low-trust en planner y en launch, imagen fijada por digest y lockfile. Hallazgos, de mayor a menor:
Sin bugs de lógica evidentes en el gate low-trust (visibilidad desconocida → rechazo, flag pegajoso entre tiers, |
Refs #773. A pilot of dsh (DeepSeek Harness) as a sandboxed, low-cost fleet adapter, under the issue's security terms.
Security terms, how each is met
docker run --rm --pull=never:/tmpis a tmpfs.node(uid 1000), all capabilities dropped, no-new-privileges.DEEPSEEK_API_KEYis passed, by name, and there is no GitHub token..env, on weakened switches, or on extra token-like variables.--profile headless --json, not the SDK.lowTrustkeeps dsh out of the default and reviewer roles, and no override tier can clear it.node:22.23.3-bookworm-slim@sha256:…;@deepseek-ai/dsh@0.2.0-rc.2, installed withnpm cifrom a lockfile;@latestor curl. The container files live incontainers/dsh/at the repo root, because the lockfile is over the plugin's per-file size gate./work. It runs no git and opens no PR. After it exits, you are told to reviewgit diffand open the PR yourself. Nothing is committed or pushed automatically.Real pilot (Docker 29.8, real credential)
docker diffwas empty./workand/tmp.deepseek-flash; one run used 675 input and 309 output tokens.Known limits (pilot)
Tests
Hermetic runs, all 0 failed:
Update-Docs -Checkandclaude plugin validate --strictpass. The directory checker still reports 0 blocking.🤖 Generated with Claude Code