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

steadmesh

module
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Oct 6, 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. People message their personal representatives over Slack. Representatives keep context, delegate to other seats, and agents create work in Linear.

Documentation: open docs/index.html in a browser. It is a static site, with no build step, containing a quickstart, a tutorial, guides and reference pages. The design is in agent_organisation_initial_technical_design.md, and acceptance status is tracked in tests/acceptance/RESULTS.md.

Quickstart: run agents in your cluster

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.
  • An Anthropic API key. Agents run Claude Code.
  • 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.1.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. The tokens end up in this root's Terraform state, so keep the state private.

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.

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 on darcys22/terraform-provider-steadmesh, which the Terraform Registry serves as darcys22/steadmesh;
  • a GitHub release in this repository.

To cut a release:

hack/set-version.sh X.Y.Z    # point quickstart/ at the new tag
git commit -am "Release vX.Y.Z" && git tag vX.Y.Z && git push origin main vX.Y.Z

The workflow refuses a tag that quickstart/ doesn't pin.

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), Linear, Anthropic model proxy, Vault/Kubernetes secret resolvers
harnesses/, cmd/seat-runner, cmd/steadmesh-tools In-Pod seat supervisor, the Claude Code 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, fresh readiness verification and orgctl console

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.
fakes command
Command fakes serves the deterministic Slack and Linear 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 and Linear 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) and opens the optional Steadmesh Console.
Command orgctl reports organisation status, runs a fresh readiness verification (design §5.4) and opens the optional Steadmesh Console.
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).
anthropic
Package anthropic is the model-serving adapter.
Package anthropic is the model-serving adapter.
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).
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).
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).
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).
conformance
Package conformance is the §7.1 harness adapter conformance suite.
Package conformance is the §7.1 harness adapter conformance suite.
fake
Package fake is a deterministic harness adapter for infrastructure tests.
Package fake is a deterministic harness adapter for infrastructure tests.
pkg
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).
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).
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.
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).
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.
scheduler
Package scheduler runs the platform's durable background work: firing wake schedules (§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: firing wake schedules (§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/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