Execution configuration reference

August 25, 2026 · View on GitHub

ExecutionInstallationConfig is the single versioned installation document consumed by every embedding. The canonical schema is execution.config@1.0.0; the release ships its JSON Schema, TypeScript types, YAML/JSON defaults, and the execution-config CLI. YAML and JSON are parser alternatives, not configuration layers: there is no merge, environment override, content sniffing, or fallback.

Use execution-config init|copy <absolute-path> [yaml|json], fill the required placeholders, then run execution-config validate <absolute-path> and execution-config dump-effective <absolute-path>. validate returns the canonical installation identity. dump-effective redacts path and endpoint values and never prints credential material.

Fields

PathClassMeaning and constraint
schemaVersionfixedexactly execution.config@1.0.0
paths.repositoryRootrequiredabsolute readable repository root
paths.workspaceRootrequiredabsolute readable workspace containing allowed worktrees
paths.allowedWorktreeRootsrequiredone or more absolute roots within workspaceRoot
paths.stateRootrequiredabsolute readable/writable durable root outside repository/workspace
paths.credentialStorePathrequiredabsolute readable external credential file
workflowSourcedefaultexactly one github or adapter variant; requests cannot override it
runner.implementationKeyfixedrunner.v1
runner.host.enginefixedlanggraph
runner.provider.keyfixeddsh
runner.provider.routerequiredexact provider route projected into admission
runner.provider.modelIdrequiredexact external modelId; no ambient model fallback
runner.provider.baseUrlrequiredHTTP(S) URL without userinfo
runner.provider.credentialRefrequiredkey in the external credential store; not key material
runner.provider.maxParallelToolCallsdefaultinteger 1..32
observation.enableddefaultfalse constructs no exporter/network resource
observation.endpointconditionalrequired only when enabled; trusted-preview endpoint is loopback HTTP(S) OTLP base URL
observation.timeoutMsdefault100..10000 ms
observation.maxBatchRecordsdefault1..512; official OTLP maximum used by this release is 512
observation.maxBatchBytesdefault1024..4194304 bytes; maximum 4 MiB
observation.flushIntervalMsdefault100..10000 ms
observation.shutdownFlushMsdefault100..10000 ms bounded best-effort flush
observation.serviceNamedefaultnon-empty OTLP Resource service name
controls.startupTimeoutMsdefault1000..120000 ms
controls.executionTimeoutMsdefault1000..86400000 ms
controls.shutdownTimeoutMsdefault1000..120000 ms
controls.maxConcurrentDeliveriesdefaultinstallation bound 1..32; same-worktree contention still returns immediately
controls.allowExplicitRefreshdefaultwhether a request may refresh latest; never chooses a Source
controls.diagnosticMaxBytesdefaultbounded redacted diagnostic 256..16384 bytes
intake.maxCorrelationBytesdefaultbounded presentation correlation 16..1024 bytes
intake.maxOutputBytesdefaultbounded renderer output 256..65536 bytes

paths.allowedWorktreeRoots remains the authority for the public application surface. The DSH Intake adapter additionally has a private, invocation-scoped admission path: after DSH registry and session-membership validation, it may authorize only the exact canonical conversation workspace supplied for that invocation. This does not widen the configured roots or admit a parent or sibling. Issue #94 will replace the issue #93 workspace-as-worktree transition with Delivery-selected worktrees.

The loader derives <stateRoot>/packages, manifests, current-slots, staging, and runner/{journal,checkpoints,sessions,custody}. Manifest/current-slot and Runner roots are durable truth; staging is temporary. The DSH plugin's separate bindingFile stores adapter-private session↔Delivery bindings and must also remain outside the plugin installation directory.

In the DSH Web product, configuration does not change the UI responsibility boundary: sidebar tabs invoke the existing list/status control-plane operations, while the chat timeline carries interactive commands, Action conversation, ordinary answers, and terminal results. The /wsr list and /wsr status aliases remain available for compatibility and automation.

The credential document is separate:

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

Only credentialRef: DEEPSEEK_API_KEY appears in ExecutionInstallationConfig. API key material never enters canonical config, Delivery Manifest/binding, result, diagnostic, or Observation.

Examples

The examples use redacted deployment paths and identities. Create those paths and the credential file before validation; the loader verifies canonical accessibility before any component effect.

Bootstrap and recovery

The application moves through CREATED → STARTING → RECOVERING → READY → CLOSING → CLOSED. New execution is accepted only in READY. Bootstrap validates config, constructs installation resources, enumerates each occupied canonical-worktree slot, restores exact persisted bindings, joins DSH private bindings, and publishes READY only after establishment. Startup failure rolls back in reverse dependency order with a bounded redacted diagnostic.

Closing first rejects new Intake, then quiesces, performs bounded Observation flush, and reverse-disposes Runner-owned DSH-E resources. Restart uses persisted Manifest/binding and Runner facts; it does not rebind an old Delivery to changed config, selector, or Package alias. State written after the last durable boundary may be lost.

Version 0.1.0 is an MVP developer preview. Configuration schema 1.0.0 is closed; unknown keys and incompatible schema versions fail closed. A future incompatible configuration schema or public TypeScript surface may require a new package version and explicit migration.