You might also like:
Local development with coding agents on Kubernetes using SignadotThe gap: agents can't tell you if a change is correct
Two concepts: Plans and Actions
- The action catalog is owned by your platform team. It's the set of primitives allowed to run against your cluster, so governance lives in the catalog. The catalog is open source at github.com/signadot/actions, and every action is documented as a markdown contract: inputs, outputs, behavior.
- Plans are authored by developers and agents, on top of that catalog, and versioned right next to the code they validate.
- It validates exactly one user-visible behavior (narrow, not a kitchen sink)
- It carries a natural-language selection hint, a one-line description of what it validates and how an agent figures out which plan applies to a given change
- It's versioned next to your code, so it evolves with the service it tests.
Two skills: one authors, one runs
signadot-planis the author. You describe what to validate in plain language, such as "drive the booking flow and assert the itinerary renders." The skill reads the action catalog, drafts the plan spec, runs it once against the baseline cluster to prove the plan itself works, and tags it under a stable name. You author once; you replay anytime.signadot-validateis the runner. It reads your diff, picks the right plan automatically using the selection hint, spins up a sandbox with your change wired into the live cluster, and runs the plan against it. When the plan fails, it reads the failure, traces it to the real cause (even if that's in a different service than the one you changed), fixes the code, and re-runs until the plan passes.
Prerequisites
signadot local connect. On top of that you'll need:- A Signadot account with the Signadot operator installed on your cluster
- Signadot CLI (recent version; check with
signadot version) - The HotROD demo app running in the
hotrodnamespace, withsignadot local connecthealthy - A coding agent with skills support (Copilot agent mode, Claude Code, or Cursor)
jqfor inspecting CLI output
Enable the Plan Runner
1/1 runner ready. On the same page, the Plan Runner Actions panel controls which actions are allowed to run on the cluster; the platform team uses it to decide what agents can compose with.Inspect the action catalog
ACTION.md (for example, playwright/ACTION.md) to see the typed inputs and outputs. You can list what's enabled on your cluster from the CLI:signadot plan action list
Install the skills
npx skills add signadot/agent-skills
signadot-plan and signadot-validate into the repo. Confirm they landed:ls .github/skills/
Part 1: Author a validation plan from one prompt
<your-cluster> with your cluster name):Prompt
hotrod-e2e-ride on cluster <your-cluster> that drives the HotROD frontend with Playwright: pick a pickup and dropoff location, click Request Ride, and assert the itinerary shows both location names. Take an optional routing key param so the same plan can validate against a sandbox, and make the plan fail when the test fails.signadot-plan skill runs four steps:- Reads the action catalog. It lists what's enabled on the cluster and reads the Playwright action's contract before composing the plan.
- Drafts the plan. A Playwright script walks the booking flow and conditionally injects the routing-key headers (
baggageandtracestate) when the routing key param is set. These are the same headers the Chrome extension injects for sandbox routing. The plan uses the same routing mechanism as the extension. It also wires in acheckstep that asserts the Playwright run exited zero, so the plan's overall result reflects the test result. - Proves the plan works. It creates the plan and runs it once against the baseline cluster with no sandbox and the real frontend, services, and database. This catches errors in the plan before you rely on it.
- Tags it, so the plan is addressable by name forever after.
signadot plan tag get hotrod-e2e-ride -o json | jq '{name, plan: .plan.id, selectionHint: .plan.spec.selectionHint}'
selectionHint: the one-line, agent-readable description of what this plan validates. The validate skill later uses this hint to find the plan automatically.signadot plan list
signadot plan run --tag hotrod-e2e-ride
Part 2: Break a contract and watch the loop close
signadot-validate.Make the breaking change
Prompt
services/location/interface.go, rename Name on the Location struct to LocationName. Update the json tag to match and make sure the build is clean.go test ./services/location/...
git diff --stat shows the change is scoped entirely to services/location/. By every signal the agent has inside this service, the change is done.locationName; the React app reads name. Nothing in the change set says so because no unit test crosses the service boundary. The failure appears only under real, end-to-end traffic.Hand it to the validate skill
<your-cluster>):Prompt
hotrod-e2e-ride plan on cluster <your-cluster>.signadot-validate working autonomously, in phases:- Sandbox setup. It picks up your
local connectsession, creates a sandbox that local-maps thelocationworkload to your machine, builds the binary from your changed source, pulls the real cluster environment viasignadot sandbox get-env, and startshotrod locationlocally. - First plan run → FAIL. It runs
hotrod-e2e-ridewith the sandbox's routing key, so the Playwright traffic in the cluster routes to your changed service. Playwright walks the booking flow, the itinerary never renders, and the visibility assertion times out. Within minutes, the plan catches a bug that the service-local build and tests missed. - Trace and fix. Because the diff only changes the location service, the skill searches for consumers of its response. It finds the call sites in the React app reading the old
namefield, updates each tolocationName, rebuilds the frontend, and addsfrontendto the sandbox as a second locally-mapped workload because both changed services now need validation together. - Re-run → PASS. The plan goes green. The itinerary renders with both location names, through both modified services, against the real cluster.
- Final report. Sandbox name and routing key, every file touched across both services, the processes left running, and the cleanup commands. It deliberately leaves the sandbox up so you can inspect everything.
Verify with your own eyes
Note
green (baseline) → green (replay) → red (the rename hit a real environment) → green (after the fix)
Tear down
pkill -f '/tmp/hotrod-bin'
signadot sandbox delete validate-location-rename






