Help us shape the future of Go! Take the 2026 Go Developer Survey

steadmesh

module
v0.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 19, 2026 License: Apache-2.0

README

Steadmesh

This platform turns an organisation declared in Terraform (culture, teams, seats, harnesses, memory, grants, message routes and channel bindings) into persistent agents running on Kubernetes. Each seat runs Claude Code, Codex or Pi on a model endpoint you choose. People message their personal representatives over Slack (or a terminal). Representatives keep context, delegate to other seats, and agents can track work in Linear.

Steadmesh is early-stage. Check releases for published artifacts. This source tree and its quickstart target v0.7.0; wait for that release's publishing workflow to finish before installing its chart, images and Terraform provider.

Documentation: steadmesh.com, built from the static pages in docs/ with no build step: a quickstart, a tutorial, guides, reference pages, an FAQ, the demo results and the acceptance status. The design is in agent_organisation_initial_technical_design.md, and acceptance status is tracked in tests/acceptance/RESULTS.md.

Operate and delegate bounded work

Introduced in v0.6.0:

See the upgrade notes before using these features on an older deployment.

Compose native teams

v0.7.0 adds native teams: combine declared leaders with bounded pools of independent teammates, coordinate through an explicitly shared work board, and choose fixed, self-editable or reviewed working instructions. Membership, mission editing, review, messaging and tool access remain separately controlled. Existing organizations keep their declared-team behavior unless these policies are enabled. Read the v0.7.0 upgrade notes before rollout.

External representative MCP gateway

The source tree includes an opt-in representative MCP gateway for an external agent to send durable messages, check their status and read its own representative conversation. It uses a separate authenticated listener; the internal platform API is never its public endpoint. It is disabled by default and requires an approved compatible deployment and HTTPS host. ChatGPT/dot connections require an existing OAuth provider; compatible MCP clients can also use a locally generated private bearer key. The setup guide covers Secret-based configuration, permissions, rotation and smoke tests.

Fastest start: the example organisation

darcys22/steadmesh-example is a four-seat organisation (representative, tech lead, senior engineer, reviewer) on Pi, with any OpenAI-compatible model endpoint and one GitHub repository. Clone it, fill in .env, apply platform/ then organisation/, and chat from the terminal with orgctl. No Slack needed. Its README and the quickstart walk through every step. Sandbox GitHub access on the hardened platform requires an existing credential-ledger Secret, including when delivering a PAT. Keep its key outside Terraform and Helm state; pass only its name with credential_ledger_secret_name. Older deployments need the permission-hardening rollout.

Quickstart: run agents in your cluster with Slack

You don't need to clone this repository. Terraform downloads everything: the provider from the Terraform Registry, the platform chart and images from ghcr.io, and the modules from GitHub.

What you need
  • A Kubernetes cluster and a kubeconfig context for it. The cluster needs:
    • a CNI that enforces NetworkPolicy, because seats only start once their sandbox is verified (kind's default CNI, Calico and Cilium all qualify);
    • a default StorageClass;
    • about 4 CPUs and 8 GB of memory free.
  • Terraform 1.5 or later, and kubectl.
  • A Slack app. Create it from slack-app-manifest.yaml (api.slack.com/apps → Create New App → From a manifest). You need:
    • an app-level token (xapp-…, scope connections:write);
    • the bot token (xoxb-…);
    • your workspace ID (T…);
    • the member ID (U…) of each person who gets a representative. In Slack: profile → ⋮ → Copy member ID.
  • A model API key. Seats run Claude Code on Anthropic by default; Codex (OpenAI Responses) and Pi (Anthropic, OpenAI Responses or Chat Completions) can be chosen per seat. Your provider bills every model request.
  • Optional: a Linear API key and team ID, so agents can create projects and issues.
1. Get the quickstart
mkdir steadmesh && cd steadmesh
terraform init -from-module="github.com/darcys22/steadmesh//quickstart?ref=v0.7.0"

This copies two small Terraform roots into the directory:

  • platform/ installs Steadmesh into your cluster;
  • organisation/ declares your agents.

They are separate because the organisation's provider needs the platform's CRDs to exist before it can plan.

2. Install the platform
cd platform
cp terraform.tfvars.example terraform.tfvars   # set kube_context and your tokens
terraform init
terraform apply

This creates the steadmesh-system and steadmesh namespaces, Postgres, the platform chart and the credential Secrets. It never uses your current kubectl context, only the kube_context you set. Tokens given as variables end up in this root's Terraform state, so keep terraform.tfvars and the state private, or create the Secrets yourself and set existing_secret_refs instead.

3. Declare your organisation
cd ../organisation
cp terraform.tfvars.example terraform.tfvars   # workspace ID and the people
terraform init
terraform apply

Each person in humans gets a personal representative. Representatives can delegate to an engineering lead, who works with an engineer. The organisation stage reads the cluster, namespace and secret references from the platform stage's state. terraform apply returns once every seat has passed its readiness checks, which takes a few minutes the first time while the seat images are pulled.

4. Talk to your representative

In Slack, open the app and send it a direct message. Your representative replies in the same DM. Try:

  • asking it to remember a preference;
  • asking it to have engineering look into something;
  • with Linear connected, asking for a project for a small task.

To watch the agents work, set enable_console = true in platform/terraform.tfvars, apply, and open the read-only console:

kubectl --context <your-context> -n steadmesh-system port-forward deploy/steadmesh-console 8090
# http://127.0.0.1:8090
Shape your organisation

Everything about your organisation is in organisation/:

  • Culture and roles: edit instructions/culture.md (how everyone works) and instructions/representative.md (how representatives behave).
  • People: add an entry to humans in terraform.tfvars. One Slack app serves every representative.
  • Seats: add a teammate to local.engineering in main.tf, for example reviewer = { role = "reviewer", display_name = "Reviewer" }. Then give it a route under message_routes, such as eng_lead_reviewer = { from = "seat:eng_lead", to = "seat:reviewer", bidirectional = true }. Seats can only message along declared routes.
  • Access: connections are only usable through grants. The Linear grant gives the whole engineering team project.create and task.write.

terraform plan shows exactly which seats a change affects. Seats keep their identity, workspace and memory across applies. The tutorial walks through every part of the declaration.

Upgrade or remove
  • Upgrade: fetch the new release's quickstart into a fresh directory and carry over your terraform.tfvars, instructions/ and state. Or change every ?ref=v…, steadmesh_version and the provider version in your copy. Then apply platform/, then organisation/.
  • Remove: run terraform destroy in organisation/, then in platform/. With data_retention = "retain", destroying the organisation keeps its memory and history in the platform's database. Destroying platform/ deletes the namespaces, and with them that database. Retention is not a backup and there is no built-in backup yet: back up Postgres and the seat volumes yourself first.

Develop from source

Prerequisites:

  • Go 1.27
  • Docker (Colima or Docker Desktop)
  • kind
  • kubectl
  • helm
  • Terraform ≥ 1.5

Every cluster target pins the kind-steadmesh context.

make tools              # controller-gen, setup-envtest into ./bin
make test               # unit tests
make test-integration   # Postgres (testcontainers), envtest, Terraform acceptance
make e2e                # fresh kind cluster, local images, full apply-to-conversation suite with fakes
make quickstart-test    # fresh kind cluster, runs quickstart/ as a user would, with local builds

make e2e and make quickstart-test delete and recreate the kind cluster, and remove the example Terraform state, before they run.

To deploy the in-repo example organisation (examples/) from source and talk to it through fake Slack and Linear servers, follow docs/from-source.html. To use real Slack, Linear and Claude Code with that setup, see docs/real-services.html and tests/live/README.md.

Releasing

Pushing a tag vX.Y.Z runs .github/workflows/release.yml, which publishes:

  • images: ghcr.io/darcys22/steadmesh/<image>:X.Y.Z, for amd64 and arm64;
  • chart: oci://ghcr.io/darcys22/steadmesh/charts/platform, version X.Y.Z;
  • provider: signed builds and their Registry documentation on darcys22/terraform-provider-steadmesh, which the Terraform Registry serves as darcys22/steadmesh;
  • a GitHub release in this repository.

To cut a release, run make release on a clean, up-to-date main. It bumps the minor version from the latest tag (BUMP=patch or BUMP=major, or VERSION=X.Y.Z), runs make lint test, then does what you could do by hand:

hack/set-version.sh X.Y.Z    # point quickstart/ and the provider doc examples at the new tag
make provider-docs           # re-render provider/docs
git commit -am "Release vX.Y.Z" && git tag vX.Y.Z && git push origin main vX.Y.Z

It asks before pushing (YES=1 skips the question); answering no leaves the release commit and tag local, with the commands to push or undo them.

The workflow refuses a tag that quickstart/ doesn't pin, and fails if provider/docs is out of date. The provider documentation is rendered by make provider-docs from the schema's descriptions, provider/docs-templates and provider/docs-examples, so a change to the provider schema needs a make provider-docs too.

One-time setup:

  1. Provider release repository. Create the public repository darcys22/terraform-provider-steadmesh with at least one commit (a README is enough). The Terraform Registry only reads releases from a repository with that name.
  2. Signing key. Generate a GPG key (RSA, without an expiry or with a long one).
    • Add its ASCII-armoured private key and passphrase to this repository's secrets as GPG_PRIVATE_KEY and GPG_PASSPHRASE.
    • Add a fine-grained token with Contents: read and write on the provider repository as PROVIDER_RELEASE_TOKEN.
  3. Registry. After the first release, sign in to registry.terraform.io with GitHub. Publish the provider from darcys22/terraform-provider-steadmesh, and add the GPG public key under your namespace's signing keys.
  4. Package visibility. After the first release, make the ghcr.io packages public: the five images and charts/platform. Do this under the repository's Packages → Package settings.

Components

Path What it is
quickstart/ Bare-bones install from the published release: platform/ and organisation/ Terraform roots
pkg/spec, pkg/compile Organisation schema and the single validator/compiler used by both the provider and the controller
api/v1alpha1 The AgentOrganization and controller-owned AgentSeat CRDs
provider/ Terraform provider steadmesh (steadmesh_organization)
controller/, runtime/ Reconciler, seat lifecycle (wake, idle stop, fenced recovery, retirement) and Kubernetes sandbox backend
services/ Trusted platform service: identity, inbox/outbox, memory, tool gateway, operation ledger, scheduler, model proxy, console API
connectors/ Slack (Socket Mode), terminal chat, Linear, GitHub, browser sessions, the model proxy, Vault/Kubernetes secret resolvers
harnesses/, cmd/seat-runner, cmd/steadmesh-tools In-Pod seat supervisor, the Claude Code, Codex, Pi and fake harness adapters, and the MCP/CLI tool client
console/, cmd/console The optional read-only Steadmesh Console
charts/platform Helm chart: CRDs, controller, platform service and console
modules/, bundles/ Terraform modules (platform install, Postgres, team templates, representatives) and instruction bundles
examples/ Foundation → platform → organisation deployment roots built from source, and make plan/apply/status/teardown
cmd/orgctl Status, readiness verification, stable-key seat inspection/watch/pause/resume, terminal chat and console access

License

Apache License 2.0. See LICENSE.

Directories

Path Synopsis
api
v1alpha1
Package v1alpha1 contains the steadmesh.io/v1alpha1 API.
Package v1alpha1 contains the steadmesh.io/v1alpha1 API.
cmd
console command
Command console runs the Steadmesh Console, a read-only browser view of the organisation: seats, runs, handoffs, outputs and readiness.
Command console runs the Steadmesh Console, a read-only browser view of the organisation: seats, runs, handoffs, outputs and readiness.
controller command
Command controller runs the AgentOrganization and AgentSeat reconcilers.
Command controller runs the AgentOrganization and AgentSeat reconcilers.
egress command
Command egress runs the egress gateway (services/egress): the HTTP proxy that seats with egress access reach through their seat runner.
Command egress runs the egress gateway (services/egress): the HTTP proxy that seats with egress access reach through their seat runner.
fakes command
Command fakes serves the deterministic Slack, Linear and model fakes used by the e2e tests, so they can run as a Deployment in kind (image steadmesh/fakes:dev).
Command fakes serves the deterministic Slack, Linear and model fakes used by the e2e tests, so they can run as a Deployment in kind (image steadmesh/fakes:dev).
orgctl command
Command orgctl reports organisation status, runs a fresh readiness verification (design §5.4), inspects and controls seats by stable key, opens the optional Steadmesh Console and chats with a representative over a terminal connection.
Command orgctl reports organisation status, runs a fresh readiness verification (design §5.4), inspects and controls seats by stable key, opens the optional Steadmesh Console and chats with a representative over a terminal connection.
platform command
Command platform runs the trusted platform service: the seat and controller runtime API, channel ingress, outbox delivery, the capability gateway and the wake scheduler.
Command platform runs the trusted platform service: the seat and controller runtime API, channel ingress, outbox delivery, the capability gateway and the wake scheduler.
seat-runner command
Command seat-runner is the in-Pod seat supervisor (contracts.md, Seat Pod contract).
Command seat-runner is the in-Pod seat supervisor (contracts.md, Seat Pod contract).
steadmesh-tools command
Command steadmesh-tools is the seat's tool client.
Command steadmesh-tools is the seat's tool client.
terraform-provider-steadmesh command
Command terraform-provider-steadmesh serves the steadmesh Terraform provider.
Command terraform-provider-steadmesh serves the steadmesh Terraform provider.
Package connectors defines the adapter contracts used by the trusted platform service (§10).
Package connectors defines the adapter contracts used by the trusted platform service (§10).
browsersession
Package browsersession holds a signed-in browser session for the browser access plugin: a Playwright storage state (cookies and local storage), secret key storage_state.
Package browsersession holds a signed-in browser session for the browser access plugin: a Playwright storage state (cookies and local storage), secret key storage_state.
github
Package github is the GitHub connector.
Package github is the GitHub connector.
internal/httpx
Package httpx holds HTTP helpers shared by connector adapters: a transport that records whether a request reached the wire, so that a failure can be classified as "definitely not applied" or "outcome unknown" (§10.3).
Package httpx holds HTTP helpers shared by connector adapters: a transport that records whether a request reached the wire, so that a failure can be classified as "definitely not applied" or "outcome unknown" (§10.3).
linear
Package linear is the Linear work-tracker adapter (ADR-0003).
Package linear is the Linear work-tracker adapter (ADR-0003).
model
Package model is the model-serving connector for the anthropic, openai and model adapters.
Package model is the model-serving connector for the anthropic, openai and model adapters.
secretref
Package secretref resolves connection secret references (docs/architecture.html#secrets): "k8s:<name>" reads a Secret in the control-plane namespace and "vault:<path>" reads Vault KV v2 using Kubernetes auth.
Package secretref resolves connection secret references (docs/architecture.html#secrets): "k8s:<name>" reads a Secret in the control-plane namespace and "vault:<path>" reads Vault KV v2 using Kubernetes auth.
slack
Package slack is the Slack communication adapter (ADR-0003).
Package slack is the Slack communication adapter (ADR-0003).
terminal
Package terminal is the bare-bones command-line communication adapter.
Package terminal is the bare-bones command-line communication adapter.
Package console is the Steadmesh Console: a read-only browser view of an organisation's seats, runs, handoffs, outputs and readiness.
Package console is the Steadmesh Console: a read-only browser view of an organisation's seats, runs, handoffs, outputs and readiness.
Package controller contains the AgentOrganization and AgentSeat reconcilers (design §6, contracts.md "Readiness flow" and "Lifecycle decisions").
Package controller contains the AgentOrganization and AgentSeat reconcilers (design §6, contracts.md "Readiness flow" and "Lifecycle decisions").
lifecycle
Package lifecycle holds the controller's seat lifecycle decision (contracts.md "Lifecycle decisions").
Package lifecycle holds the controller's seat lifecycle decision (contracts.md "Lifecycle decisions").
platform
Package platform is the controller's client for the platform internal API (/internal/v1/*).
Package platform is the controller's client for the platform internal API (/internal/v1/*).
readiness
Package readiness computes organisation readiness conditions (design §5.4, contracts.md "Readiness flow").
Package readiness computes organisation readiness conditions (design §5.4, contracts.md "Readiness flow").
Package harnesses defines the harness adapter contract (design §7.1).
Package harnesses defines the harness adapter contract (design §7.1).
all
Package all registers every built-in harness adapter.
Package all registers every built-in harness adapter.
claudecode
Package claudecode is the Claude Code harness adapter (design §7, ADR-0001).
Package claudecode is the Claude Code harness adapter (design §7, ADR-0001).
codex
Package codex is the Codex harness adapter.
Package codex is the Codex harness adapter.
conformance
Package conformance is the §7.1 harness adapter conformance suite.
Package conformance is the §7.1 harness adapter conformance suite.
conformance/modelstub
Package modelstub is a scripted model endpoint speaking the Anthropic Messages, OpenAI Responses and OpenAI Chat Completions APIs, streamed and not.
Package modelstub is a scripted model endpoint speaking the Anthropic Messages, OpenAI Responses and OpenAI Chat Completions APIs, streamed and not.
fake
Package fake is a deterministic harness adapter for infrastructure tests.
Package fake is a deterministic harness adapter for infrastructure tests.
pi
Package pi is the adapter for the Pi coding agent (pi.dev, @earendil-works/pi-coding-agent).
Package pi is the adapter for the Pi coding agent (pi.dev, @earendil-works/pi-coding-agent).
pkg
access
Package access resolves access profiles (spec.AccessProfile) into what a seat may do from its sandbox, through plugins.
Package access resolves access profiles (spec.AccessProfile) into what a seat may do from its sandbox, through plugins.
compile
Package compile turns a declared organisation specification into a concrete, resolved specification and an effective manifest (§4.2, §4.6, §6.1).
Package compile turns a declared organisation specification into a concrete, resolved specification and an effective manifest (§4.2, §4.6, §6.1).
egressforward
Package egressforward is the seat's local egress proxy.
Package egressforward is the seat's local egress proxy.
modelforward
Package modelforward is the seat's local model forwarder.
Package modelforward is the seat's local model forwarder.
names
Package names derives deterministic, length-safe Kubernetes names for seat objects (docs/architecture.html).
Package names derives deterministic, length-safe Kubernetes names for seat objects (docs/architecture.html).
recur
Package recur describes when an automation runs: once, at a fixed interval, or at a local time of day on chosen weekdays in an IANA time zone.
Package recur describes when an automation runs: once, at a fixed interval, or at a local time of day on chosen weekdays in an IANA time zone.
runtimeapi
Package runtimeapi defines the wire contract of the platform runtime API (design §13.2).
Package runtimeapi defines the wire contract of the platform runtime API (design §13.2).
runtimeapi/client
Package client is the seat-side Go client for the platform runtime API (/v1/*).
Package client is the seat-side Go client for the platform runtime API (/v1/*).
spec
Package spec defines the organisation specification shared by the Terraform provider, the Kubernetes API types and the controller.
Package spec defines the organisation specification shared by the Terraform provider, the Kubernetes API types and the controller.
taskworker
Package taskworker defines the narrowed bootstrap for disposable task runs.
Package taskworker defines the narrowed bootstrap for disposable task runs.
Package provider implements the steadmesh Terraform provider (design §5).
Package provider implements the steadmesh Terraform provider (design §5).
Package runtime defines the sandbox backend contract (design §11.3).
Package runtime defines the sandbox backend contract (design §11.3).
kube
Package kube is the Kubernetes implementation of the sandbox backend (ADR-0002): per seat a ServiceAccount, a retained workspace PVC, a manifest ConfigMap, a default-deny NetworkPolicy and a StatefulSet with 0 or 1 replicas.
Package kube is the Kubernetes implementation of the sandbox backend (ADR-0002): per seat a ServiceAccount, a retained workspace PVC, a manifest ConfigMap, a default-deny NetworkPolicy and a StatefulSet with 0 or 1 replicas.
services
api
Package api serves the platform runtime API (pkg/runtimeapi): /v1/* for seats, /internal/v1/* for the controller, the optional read-only /console/v1/* for the console, health and metrics.
Package api serves the platform runtime API (pkg/runtimeapi): /v1/* for seats, /internal/v1/* for the controller, the optional read-only /console/v1/* for the console, health and metrics.
auth
Package auth authenticates the platform's callers (§13.2).
Package auth authenticates the platform's callers (§13.2).
connections
Package connections builds and supervises connector adapters for every declared connection (§10).
Package connections builds and supervises connector adapters for every declared connection (§10).
credentials
Package credentials delivers explicitly sandbox-authorized credentials.
Package credentials delivers explicitly sandbox-authorized credentials.
egress
Package egress is the egress gateway: an HTTP proxy that lets seats reach the hosts their access profiles allow, and nothing else (docs/sandbox.html).
Package egress is the egress gateway: an HTTP proxy that lets seats reach the hosts their access profiles allow, and nothing else (docs/sandbox.html).
gateway
Package gateway is the capability gateway and operation ledger for work-tracker connections (§10.1, §10.3, contracts.md "Gateway and operation ledger").
Package gateway is the capability gateway and operation ledger for work-tracker connections (§10.1, §10.3, contracts.md "Gateway and operation ledger").
ingress
Package ingress accepts verified inbound human events (§9.1, §9.2).
Package ingress accepts verified inbound human events (§9.1, §9.2).
internal/fakeconn
Package fakeconn provides in-process connector adapters for service tests.
Package fakeconn provides in-process connector adapters for service tests.
internal/orgfixture
Package orgfixture builds a compiled organisation for service tests: two representatives bound to humans, and an engineering team.
Package orgfixture builds a compiled organisation for service tests: two representatives bound to humans, and an engineering team.
metrics
Package metrics defines the platform's Prometheus metrics (§14).
Package metrics defines the platform's Prometheus metrics (§14).
outbox
Package outbox delivers representatives' replies to humans through the communication adapter (§9.2).
Package outbox delivers representatives' replies to humans through the communication adapter (§9.2).
platform
Package platform assembles the trusted platform service: the runtime API, connection manager with ingress loops, outbox dispatcher and background scheduler (§3, §13).
Package platform assembles the trusted platform service: the runtime API, connection manager with ingress loops, outbox dispatcher and background scheduler (§3, §13).
policy
Package policy evaluates a seat's committed capability manifest.
Package policy evaluates a seat's committed capability manifest.
publisher
Package publisher projects work items to a tracker for people to follow (work_publication).
Package publisher projects work items to a tracker for people to follow (work_publication).
representative
Package representative exposes a deliberately small MCP interface to an external agent.
Package representative exposes a deliberately small MCP interface to an external agent.
retirement
Package retirement completes graceful seat retirement (§5.5).
Package retirement completes graceful seat retirement (§5.5).
scheduler
Package scheduler runs the platform's durable background work: running due automations (§9.3), returning expired delivery leases to the queue, recording interrupted connector attempts as unknown, and refreshing the operational gauges (§14).
Package scheduler runs the platform's durable background work: running due automations (§9.3), returning expired delivery leases to the queue, recording interrupted connector attempts as unknown, and refreshing the operational gauges (§14).
store
Package store is the platform's durable operational store on PostgreSQL (design §13.1).
Package store is the platform's durable operational store on PostgreSQL (design §13.1).
tools
Package tools implements the seat tool surface (contracts.md "Tools").
Package tools implements the seat tool surface (contracts.md "Tools").
tests
fakes/github
Package github is a fake of the GitHub REST API subset Steadmesh uses: personal access tokens, a GitHub App (RS256 JWTs, scoped installation tokens, revocation), repositories, pull requests and issue comments.
Package github is a fake of the GitHub REST API subset Steadmesh uses: personal access tokens, a GitHub App (RS256 JWTs, scoped installation tokens, revocation), repositories, pull requests and issue comments.
fakes/linear
Package fakelinear is a deterministic, in-memory fake of the Linear GraphQL API subset used by connectors/linear.
Package fakelinear is a deterministic, in-memory fake of the Linear GraphQL API subset used by connectors/linear.
fakes/slack
Package fakeslack is a deterministic fake of the Slack Web API subset and the Socket Mode websocket used by connectors/slack.
Package fakeslack is a deterministic fake of the Slack Web API subset and the Socket Mode websocket used by connectors/slack.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL