Shipwright Harness

Configuration Reference

Single authoritative reference for all Shipwright configuration options, organized by scope: Plugin Config, Agent Config, and Policy Config.

Precedence

When the same option can be set multiple ways, resolution order is:

env var  >  built-in default

Env vars are the only configuration path. All Shipwright configuration is supplied via env vars — injected by the admin service for managed agents, or set in the local environment for direct plugin use.

Plugin Config

Configuration for the Shipwright Claude Code plugin (plugins/shipwright/). These options control workspace discovery, task-store backend, and GitHub CLI integration.

Env vars

NameTypeDefaultDescription
GH_CMDstringghOverride the gh CLI executable. Useful in environments where gh is installed to a non-default path.
AGENT_HOMEstring/data/agent-homePersistent storage root for workspace files, mise caches, and ~/.claude.
WORKSPACE_PATHstringDirect workspace path override. Takes precedence over AGENT_HOME-based discovery when set.
SHIPWRIGHT_TASK_STORE_URLstringBase URL of the Shipwright task-store service. Injected into the agent Deployment by the admin provisioner; agents use this to authenticate with the task-store API when claiming tasks or updating status.
SHIPWRIGHT_TASK_STORE_TOKENstringBearer token for task-store API access. Minted per-agent by the admin provisioner; used by agents and plugin scripts to claim tasks, update status, and query the task queue. Env-var-only (secret).

Agent Config

Configuration for the Shipwright agent runtime (agent/ and admin/). All options are env vars — there is no file-based fallback for agent config. Secrets must be supplied as env vars and are never stored in config files.

Claude / Anthropic

NameTypeDefaultDescription
ANTHROPIC_MODELstringclaude-sonnet-4-6Claude model used for each agent invocation.
ANTHROPIC_FALLBACK_MODELstringFallback model if the primary is unavailable.
ANTHROPIC_EFFORT_LEVELstringEffort/thinking level passed to Claude (e.g. extended, auto, none).
SHIPWRIGHT_CLAUDE_TIMEOUT_MSnumber3600000Hard ceiling timeout in milliseconds for a single claude -p session spawned by the agent runner — a backstop, not the primary timeout (see SHIPWRIGHT_CLAUDE_IDLE_TIMEOUT_MS). Fires only for a continuously-active-but-never-converging session. Falls back to the default when unset or not a positive integer. When raising this, raise SHIPWRIGHT_TASK_STORE_CLAIM_TTL_MS in step (keep the ~5 min buffer) or the stale-claim reaper re-dispatches a duplicate run.
SHIPWRIGHT_CLAUDE_IDLE_TIMEOUT_MSnumber1500000Idle-reset timeout in milliseconds for a single claude -p session — the primary timeout in practice. Cleared and restarted on every stdout line; fires (ClaudeTimeoutError, reason: idle) only when the session goes silent this long. Falls back to the default when unset or not a positive integer.
ANTHROPIC_API_KEYstringAnthropic API key. Env-var-only (secret).
CLAUDE_CODE_OAUTH_TOKENstringClaude Code OAuth token (alternative to ANTHROPIC_API_KEY). Env-var-only (secret).

Slack

All Slack vars are env-var-only (secrets). The agent does not function as a Slack bot without them.

NameTypeDefaultDescription
SLACK_BOT_TOKENstringrequired for SlackSlack bot user OAuth token (xoxb-...).
SLACK_APP_TOKENstringrequired for SlackSlack app-level token for Socket Mode (xapp-...).
SLACK_SIGNING_SECRETstringrequired for SlackUsed to verify incoming Slack request signatures.
SLACK_ADMIN_TOKENstringOptional admin-level token for privileged Slack operations.
SLACK_ALERT_CHANNELstringSlack channel ID to post system alerts (e.g. startup errors).
SLACK_OWNER_USERstringSlack user ID of the agent owner, used for DM fallback.

GitHub

Provide either the GitHub App vars (recommended) or GH_TOKEN (PAT). App auth is used when the App env vars are present; GH_TOKEN is the fallback.

NameTypeDefaultDescription
GH_APP_IDstringrequired for App authGitHub App ID (integer as string). Env-var-only (secret).
GH_APP_INSTALLATION_IDstringrequired for App authInstallation ID for the target org/repo. Env-var-only (secret).
GH_APP_PRIVATE_KEYstringrequired for App authPEM private key for the GitHub App. Env-var-only (secret).
GH_TOKENstringPersonal Access Token. Used only when GitHub App vars are absent. Env-var-only (secret).

Shipwright platform

NameTypeDefaultDescription
SHIPWRIGHT_API_URLstringBase URL of the Shipwright admin service, used by the agent entrypoint to fetch config at startup.
SHIPWRIGHT_AGENT_IDstringThe agent's ID in the Shipwright platform. Also settable via --agent-id CLI flag.
SHIPWRIGHT_AGENT_API_KEYstringBearer token for the config fetch at startup (/agents/:id/config and /agents/:id/crons). Also settable via --api-key CLI flag.

Server

NameTypeDefaultDescription
PORTnumber3000Hono server port for the admin service (admin/src/main.ts).
SHIPWRIGHT_HEALTH_PORTnumber3459Agent health server port for the K8s liveness probe. Served in-process by entrypoint-main.ts on a dedicated port.
NODE_ENVstringRuntime environment. Set to production to enforce production-safety guards.

Metrics & Admin service

NameTypeDefaultDescription
DATABASE_URL_SHIPWRIGHT_ADMINstringrequiredPostgres connection string for the admin service schema.
SHIPWRIGHT_SESSION_SECRETstringHS256 secret for signing session cookies. Used by the metrics service (vitals_session cookie) and the admin service (admin_session cookie).
SHIPWRIGHT_ENCRYPTION_KEYstring64-char hex (32 bytes) for AES-256-GCM encryption of secrets at rest. If unset, secrets are stored in plain text.
SHIPWRIGHT_ADMIN_ALLOWED_EMAILSstringComma-separated list of Google email addresses permitted to log in to the admin UI.
SHIPWRIGHT_ADMIN_APP_BASE_URLstringhttp://localhost:{PORT}Public base URL of the admin service, used to construct the Google OAuth redirect URI.
GOOGLE_CLIENT_IDstringGoogle OAuth 2.0 client ID. Required for the admin UI login flow.
GOOGLE_CLIENT_SECRETstringGoogle OAuth 2.0 client secret. Required for the admin UI login flow.

Task store service

NameTypeDefaultDescription
DATABASE_URL_SHIPWRIGHT_TASK_STOREstringrequiredPostgres connection string for the task-store service. Must be a separate database from the admin service — the schema forbids sharing. Read by @shipwright/task-store and @shipwright/agent.
SHIPWRIGHT_TASK_STORE_URLstringBase URL of the Shipwright task-store service (e.g. http://task-store:3000 or https://tasks.example.com). When set alongside SHIPWRIGHT_TASK_STORE_ADMIN_TOKEN, the admin service wires per-agent tokens during provisioning and injects the URL + token into agent Deployment env vars. Agents use these to authenticate with the task-store API when claiming tasks or updating status.
SHIPWRIGHT_TASK_STORE_TOKENstringBearer token for task-store API access. Minted per-agent by the admin provisioner and stored in the agent Secret; injected into the agent Deployment via SHIPWRIGHT_TASK_STORE_TOKEN env var. Used by agents to claim tasks, update status, and query the task queue. Env-var-only (secret).
SHIPWRIGHT_TASK_STORE_ADMIN_TOKENstringBearer token for admin-side task-store token minting. Required (alongside SHIPWRIGHT_TASK_STORE_URL) to enable per-agent provisioning on POST /agents. Env-var-only (secret).
SHIPWRIGHT_TASK_STORE_CLAIM_TTL_MSnumber3900000Milliseconds a claim (Task or PR review/patch/deploy) remains valid without a heartbeat. When an agent's last heartbeat exceeds this TTL, the claim will be abandoned and the record eligible for re-claiming by another agent. A single unified TTL covers both Task claims (/shipwright:dev-task) and PR claims — 3900000ms (65 min) is the 1-hour claude -p hard ceiling timeout plus a 5-minute buffer.
SHIPWRIGHT_TASK_STORE_AGENTS_URLstringBase URL of the Shipwright agents service. When set alongside SHIPWRIGHT_TASK_STORE_AGENTS_API_KEY, the task-store service uses it to resolve agent tokens to their scoped repos. Optional — not required when agents do not need repo-scoping.
SHIPWRIGHT_TASK_STORE_AGENTS_API_KEYstringBearer token for the task-store service to call the agents service. Required alongside SHIPWRIGHT_TASK_STORE_AGENTS_URL to enable scope resolution. Env-var-only (secret).

Admin and metrics services

Cross-service vars read by the admin service and metrics service (not the task-store).

NameTypeDefaultDescription
SHIPWRIGHT_ADMIN_PUBLIC_REPOstringRepository slug (format: org/repo) scoped for the public read-only task board. When set, GET /public/tasks displays tasks for this repo only, unauthenticated. Optional — omit to disable the public board.
SHIPWRIGHT_ADMIN_TZstringAmerica/Los_AngelesIANA timezone name (e.g. America/New_York) for date/time display in the admin UI. When unset, defaults to America/Los_Angeles.
METRICS_DASHBOARD_URLstring/dashboardURL for the Metrics toolbar link in the admin UI. Defaults to /dashboard (same-host relative path). Set to an absolute URL when the metrics service runs on a different host or port.
METRICS_ADMIN_APP_URLstring""Base URL of the admin console for the metrics dashboard toolbar Agents/Tasks/PRs links. Defaults to empty (same-host relative links). Set to an absolute URL when the admin console runs on a different origin than the metrics dashboard.

Agent provisioning (Kubernetes)

Controls how the admin service provisions the Kubernetes workload backing each agent on POST /agents. When provisioning is disabled (the default), create/delete only write the database row — no cluster is required.

NameTypeDefaultDescription
SHIPWRIGHT_K8S_PROVISIONINGstringSet to enabled to provision a real Kubernetes PersistentVolumeClaim + Secret + Deployment per agent via KubernetesAgentProvisioner. Any other value (or unset) selects the no-op provisioner, preserving DB-only create/delete behavior.
SHIPWRIGHT_K8S_NAMESPACEstringTarget namespace for per-agent PersistentVolumeClaim, Secret, and Deployment. When unset, falls back to the pod's own release namespace. Only read when provisioning is enabled.
SHIPWRIGHT_AGENT_IMAGEstringAgent container image (without tag) used for the provisioned Deployment. Only read when provisioning is enabled.
SHIPWRIGHT_AGENT_IMAGE_TAGstringlatestImage tag joined as image:tag for the provisioned Deployment. Only read when provisioning is enabled.
SHIPWRIGHT_ADMIN_DEPLOYMENT_NAMEstringName of the admin Deployment, used as the ownerReference target so per-agent resources are garbage-collected with the admin Deployment. Only read when provisioning is enabled.
SHIPWRIGHT_ADMIN_DEPLOYMENT_UIDstringUID of the admin Deployment, paired with SHIPWRIGHT_ADMIN_DEPLOYMENT_NAME for the ownerReference. Only read when provisioning is enabled.
SHIPWRIGHT_AGENT_REPLICASnumber1Replica count for the provisioned agent Deployment. Only read when provisioning is enabled.
SHIPWRIGHT_AGENT_PVC_STORAGE_GInumber40Storage size in Gi for the per-agent persistent home directory (PVC). Only read when provisioning is enabled. Must be large enough to hold mise caches and workspace files across pod restarts.
SHIPWRIGHT_AGENT_PVC_NAME_TEMPLATEstringTemplate for deriving the PVC name from the agent's human-readable name. Use {name} as the placeholder. When unset, PVCs are named {sanitizedAgentId}-home. Only read when provisioning is enabled.

Workspace and tooling

NameTypeDefaultDescription
AGENT_HOMEstring/data/agent-homePersistent storage root. Mount a PVC here in Kubernetes so mise caches, workspace files, and ~/.claude survive pod restarts.
MISE_DATA_DIRstring<AGENT_HOME>/.miseOverride the mise data directory. Auto-derived from AGENT_HOME.
MISE_CACHE_DIRstring<AGENT_HOME>/.mise/cacheOverride the mise cache directory.
XDG_CACHE_HOMEstring<AGENT_HOME>/.cacheOverride the XDG cache directory.
XDG_DATA_HOMEstring$HOME/.local/shareOverride the XDG data directory. Used to locate the mise data dir ($XDG_DATA_HOME/mise) when seeding a fresh PVC.
SHIPWRIGHT_STARTUP_TIMEOUT_MSnumber180000Maximum milliseconds the entrypoint startup sequence may take before the agent exits. Override to a lower value (e.g. 10000) in dev for faster fail-fast feedback.
AGENT_ALLOWED_TOOLSstring (JSON array)JSON array of allowed Claude tool patterns. Set by the admin service config sync; do not set manually in production.

Voice

Optional. When unset, voice transcription and synthesis are disabled.

NameTypeDefaultDescription
GROQ_API_KEYstringGroq API key for voice processing. Env-var-only (secret).
ELEVENLABS_API_KEYstringElevenLabs API key for speech synthesis. Env-var-only (secret).
ELEVENLABS_VOICE_IDstringElevenLabs voice ID to use for synthesis.
WHISPER_SERVICE_URLstringURL of a Whisper transcription service for voice input.

Dev-only

Do not set these in production.

NameTypeDefaultDescription
ADMIN_DEV_AUTHboolfalseEnables GET /admin/dev-login (bypasses Google OAuth, mints a dev session). Blocked when NODE_ENV=production.
METRICS_DASHBOARD_DEV_AUTHboolfalseBypasses /dashboard session auth and /metrics/* API auth for local dev. Must not be enabled in production — exits with an error if NODE_ENV=production.
TASK_STORE_SEED_ADMIN_TOKENstringBootstrap admin token seeded into the task-store on startup. Used only in local dev (task stack) to provision a bootstrapped admin token without manual token creation. Ignored if empty.

Policy Config

Agent behavior is controlled by state/agent-policy.md. Ask your agent to change review posting, merge permissions, and autonomy levels without reconfiguring crons or restarting the agent. Alternatively, for local development or self-hosted setups without a connected agent, edit the Markdown file directly — it uses a YAML front-matter block.

Fields

FieldTypeDefaultDescription
auto_post_reviewsbooltruePost review comments to GitHub automatically without manual approval. Set to false to stage reviews locally for owner approval instead.
allowed_eventsstring[]["COMMENT", "APPROVE"]GitHub review event types the agent may emit.
review_external_prsbooltrueReview PRs opened by users other than the agent.
allow_self_reviewboolfalseSelf-review is excluded by default. Set to true to allow the agent to review its own PRs instead of requiring a human reviewer on agent-authored PRs.
min_confidencenumber75Minimum confidence score (0–100) for a finding to be included in a review.
max_findingsnumber5Maximum number of findings to include in a single review.
cleanup_merged_worktreesbooltrueAutomatically remove worktrees for merged branches.
cleanup_after_daysnumber14Age threshold (days) before a merged-branch worktree is eligible for cleanup.

Example

---
auto_post_reviews: true
allowed_events: [COMMENT, APPROVE]
review_external_prs: true
allow_self_review: false
min_confidence: 75
max_findings: 5
cleanup_merged_worktrees: true
cleanup_after_days: 14
---

See also

  • Task Store API — complete HTTP API reference for /tasks: endpoints, task schema, status lifecycle, and curl examples.
  • PRs API — HTTP API reference for /prs: PR review tracking, reviewState lifecycle, heartbeat TTL, and curl examples.
  • architecture.md — the four-artifact A→B→C→D design.
  • agent.md — Shipwright agent runtime, admin CRUD APIs, and data model.
  • quickstart.md — how to get the full dev stack running locally.