DSH Execution quickstart

August 31, 2026 · View on GitHub

This guide installs a qualified final Execution Release in a trusted local environment. Do not use it for an unpublished candidate; use the local pre-release E2E guide instead. The DSH plugin is the first Intake Adapter distribution; wsr-execution remains a host-neutral package that can be embedded without DSH.

0. Check the host prerequisites

Use Node 24.12.0 and DSH 0.1.1-rc.2. DSH's plugin subcommand requires pnpm, but it does not declare an exact pnpm version.

First, inspect the installed versions:

node --version
pnpm --version
dsh --version
gh --version

If pnpm --version fails because pnpm is missing, install it and rerun the check:

npm install --global pnpm

If dsh --version fails because DSH is missing, or reports a version other than 0.1.1-rc.2, install the required preview and rerun the check:

npm install --global @deepseek-ai/dsh@0.1.1-rc.2

Finally, inspect the launcher help:

dsh --help

1. Bind the qualified published coordinates

export WSR_DSH_VERSION="0.1.0"
export WSR_EXECUTION_VERSION="0.1.4"
export WSR_EXECUTION_ASSET="https://github.com/firestige/wsr-execution/releases/download/0.1.4-rc.1/wsr-execution-0.1.4.tgz"

dsh-wsr-execution@0.1.0 is the qualified stable DSH bundle. Its immutable metadata binds the exact wsr-execution@0.1.4 owner asset above (SHA-256 4407239534795f528b3ca597583a682636dd539516f567434a128d5437345e4d); do not substitute a branch, latest, or local checkout.

2. Initialize the canonical configuration

Choose durable paths outside the repository, worktree, and DSH plugin installation directory. The only installation schema is execution.config@1.0.0:

export WSR_CONFIG="$PWD/../wsr-local/execution.yaml"
export WSR_STATE="$PWD/../wsr-local/state"
export WSR_CREDENTIALS="$PWD/../wsr-local/credentials.yml"
mkdir -p "$(dirname "$WSR_CONFIG")" "$WSR_STATE"
npm exec --yes --package="$WSR_EXECUTION_ASSET" -- \
  execution-config init "$WSR_CONFIG" yaml

Replace only the values marked __REQUIRED__: paths.repositoryRoot, paths.workspaceRoot, the matching paths.allowedWorktreeRoots item, paths.stateRoot, paths.credentialStorePath, and runner.provider.route/modelId/baseUrl/credentialRef. Keep the default single Source, firestige/wsr-workflow-package, unless this installation deliberately selects one alternate Adapter.

Provision the referenced key outside the Execution config:

version: 1
refs:
  DEEPSEEK_API_KEY: replace-with-the-provider-key

Set the credential file to owner-only access, then validate and inspect the redacted effective value:

chmod 600 "$WSR_CREDENTIALS"
npm exec --yes --package="$WSR_EXECUTION_ASSET" -- \
  execution-config validate "$WSR_CONFIG"
npm exec --yes --package="$WSR_EXECUTION_ASSET" -- \
  execution-config dump-effective "$WSR_CONFIG"

dump-effective prints an installation identity and redacts paths, endpoints, and credential references. See the configuration reference.

3. Install the DSH Intake Adapter

Use locked DSH's built-in web profile. It is the supported interactive assembly because it includes DSH's conversation, attachment, command, and result-rendering surface; a new custom profile contains only dsh-base and is not interactive. The current DSH preview requires --workspace-root for its generated workspace. Core uses better-sqlite3 for durable checkpoints, so pnpm 11 must approve that native build in the DSH profile before either artifact is added. For a fresh profile, the first command below creates the profile and its allowBuilds map. For an existing profile, preserve every existing allowBuilds entry and merge better-sqlite3: true in $DSH_HOME/profiles/web/pnpm-workspace.yaml instead of replacing the map. Then install the host-neutral package first so the plugin can import its public surface:

dsh plugin --profile web config set --location=project --json allowBuilds '{"better-sqlite3":true}'
dsh plugin --profile web add --workspace-root "$WSR_EXECUTION_ASSET"
dsh plugin --profile web add --workspace-root "dsh-wsr-execution@$WSR_DSH_VERSION"

Edit $DSH_HOME/profiles/web/cordis.patch.yml so the stable WSR row contains only absolute presentation paths. web is the DSH profile name; workflow-execution remains the plugin's stable Cordis row ID:

- id: workflow-execution
  config:
    configFile: /absolute/path/wsr-local/execution.yaml
    bindingFile: /absolute/path/wsr-local/dsh-intake-bindings.json

Do not copy the Execution config or API key into this patch. Verify the composed profile and launcher:

dsh --profile web --dump-config
dsh --help

Expected: the dump includes webserver, ui-conversation, ui-commands, row workflow-execution, the absolute configFile/bindingFile, skill-filesystem, and tool-skill; it does not contain the API key. In locked DSH 0.1.1-rc.2, launcher-level dsh --help verifies syntax without booting the interactive profile. Neither help surface is the plugin command catalog. The closed operations are listed below; /wsr list and /wsr status remain compatibility/automation aliases rather than the default product entry:

/wsr list
/wsr create <name|name@latest|name@version>
/wsr recover [delivery-id]
/wsr status [delivery-id]
/wsr action finish
/wsr abandon <delivery-id>

4. Start and invoke

Product surface boundary: use the Delivery projections for list and current status. Use the chat timeline for create/recover/abandon/action-finish commands, Action output/input, ordinary user answers, errors, and terminal result. The native user bubble and one host-owned WSR command lifecycle are each rendered once; the keyed view shows a friendly result plus complete admitted JSON details. New Session starts an isolated blank timeline, while the prior Workflow conversation remains separately reopenable.

Start DSH Web from the target worktree:

dsh web

Direct command example—everything after the activation directive, plus chat attachments, becomes the TaskPrompt; there is no --intent argument:

/wsr create implementation-workflow@0.3.0
Implement the requested change and preserve existing user edits.

Explicit first-party skill example:

/workflow-execution
Create implementation-workflow@0.3.0 for this request and its attachments.

The explicit-only skill calls the DSH-I-only workflow_execution_intake tool exactly once. Command and skill use the same WorkflowIntakeService, M01 resolution/validation/READY path, and host-neutral Core operation. Workflow Actions execute in Runner-owned DSH-E, never in Intake DSH-I.

Manual #57 acceptance run

In the browser opened by dsh web, create or select a conversation rooted at the target worktree, then click the sidebar Deliveries tab. It must show an explicit empty result when no Delivery exists without requiring a chat command. Next attach any files needed by the task and submit one composer message whose first line is the command and whose remaining chat text is the task prompt:

/wsr create implementation-workflow@0.3.0
Perform the requested implementation using the text and attachments in this conversation.

Success requires the same chat timeline to render acknowledgement, Action output/input and terminal result; process logs, sidebar projection, or a helper-only response do not count. Inspect the bound Delivery through the sidebar Current status tab. If the Workflow enters a multi-turn Action such as grilling, answer normally in this conversation. When that interaction is complete, submit /wsr action finish; then use Current status again to observe the next state. A credential, Source, package-resolution, or Runner error is a failed acceptance run and must be fixed before #57 is closed.

The following compatibility/automation operations remain available even though the product UI uses sidebar tabs:

/wsr list
/wsr status

An ordinary reply while an Action is awaiting input remains inside that Action. Use /wsr action finish only to request closure of the current multi-turn interaction; the Action and validated workflow_complete remain the completion authority.

5. Recovery, shutdown, update, and removal

Stopping DSH closes the Intake gate, performs bounded Observation flush, and cascades through Execution to every Runner-owned DSH-E. It does not fabricate cancellation or delete Manifest/current-slot, Runner durable facts, or the private binding file. Restart the same profile to recover from the last durable boundary. Use /wsr recover [delivery-id] for an exact detached Delivery, or omit the ID to recover this canonical worktree's Delivery; selection never guesses by name, alias, or recency.

For a later compatible exact version, update Core first and Intake second. To remove the installation, remove Intake first and Core second:

dsh plugin --profile web update --workspace-root wsr-execution@<new-exact-version>
dsh plugin --profile web update --workspace-root dsh-wsr-execution@<new-exact-version>
dsh plugin --profile web remove --workspace-root dsh-wsr-execution
dsh plugin --profile web remove --workspace-root wsr-execution
dsh plugin --profile web add --workspace-root "$WSR_EXECUTION_ASSET"
dsh plugin --profile web add --workspace-root "dsh-wsr-execution@$WSR_DSH_VERSION"

DSH owns these package-lifecycle operations. WSR does not add install/remove hooks. Removal leaves external durable state untouched; a compatible reinstall resumes the same persisted Delivery binding. Interaction state written after the last durable boundary may be lost.