Projects

ProjectAgentic Tools · 2026

Reckon

A read-only agent workspace for investigating production incidents across observability, CI/CD, cloud, databases, and source control.

  • Claude Code
  • Codex
  • Go
  • Grafana
  • Jenkins
  • CubeAPM
  • AWS
  • Kubernetes
A coding agent reaches production through a read-only workspace with three layers of denialCoding agentClaude Code · CodexReckon workspaceone clone, one environmentgrafanajenkinscubeapmawskubernetesdatabaseselasticsearchbrokersJSON OUT · CLEAN STDERRProductionmetricslogs · tracesdeploysdataASKSRCAREADSPROOFROLES · SESSIONS · APPROVALTHREE READ-ONLY LAYERS

Agentic Tools · Project

Chapter
Agents and operations
Year
Availability
Open source
Last commit
Writing
1 related post

Reckon is a workspace a coding agent opens to investigate an incident. It wires fourteen read-only observability, CI/CD, queue, Kubernetes and database CLIs into one isolated credential environment. Traces, builds, cloud metrics, Kafka lag and database state can then be correlated in a single session. Before it, I handed the agent a shell and my own credentials and watched carefully.

The hard part is not another agent framework. It is the environment: which systems the agent can reach, where its credentials live, where writes are refused, and where the operator should feel friction. Unrestricted shell access is not a safety model, it is the absence of one.

 ./scripts/reckon statusenv=production  direnv=on  config=.config/production/ ./scripts/reckon verifygrafana ok  jenkins ok  cubeapm ok  aws ok  gh okpsql: pg_is_in_recovery=t  default_transaction_read_only=on cubeapm metrics label-values service -o json["checkout","payments","auth"]
Reckon in use

One clone per environment

.envrc resolves RECKON_ENV, then pins XDG_CONFIG_HOME to .config/<env>/ inside the clone. It loads .env.common, then .env.<env>, then .env.<env>.local, with later files winning. Precedence runs from an exported RECKON_ENV, to the .reckon-env file that reckon use writes, to production. An unrecognized value fails closed. No credentials load at all, rather than quietly selecting something real. Grafana, Jenkins, CubeAPM and gh honor XDG_CONFIG_HOME by themselves. The AWS CLI does not, so .envrc also pins AWS_CONFIG_FILE and AWS_SHARED_CREDENTIALS_FILE, and points KUBECONFIG inside the clone. Production and staging sessions never share saved profiles.

Layers that actually deny

Database safety is three layers, and only one denies a write across every access path. Layer one is a true read-only role at the database, which the operator has to provision. Layer two hardens the clients only. PGOPTIONS carries default_transaction_read_only=on, and MySQL gets init-command=SET SESSION TRANSACTION READ ONLY in a workspace-local option file, since that client has no environment variable for it. Layer three is friction: the Claude Code allowlist deliberately omits psql, mysql and mongosh, so every query asks. Kafka mirrors the same shape. The principal carries only describe and read ACLs, and consuming is documented group-less, because kcat -G joins a production consumer group and commits offsets.

The control surface

scripts/reckon makes the workspace state legible, so neither the operator nor the agent has to guess. status prints the active environment and an integration matrix. doctor diagnoses setup problems, including the silent one. If direnv is not hooked into the shell, .envrc never runs and the CLIs fall back to saved profiles with no warning. preflight is the digest an agent reads before its first query, and it touches no infrastructure. verify is the only command that does. Values left at their .env.example defaults are reported as unconfigured, so the matrix does not flatter the setup. Without direnv, eval "$(./scripts/reckon env)" activates a shell.

Investigating an incident

Claude Code reads CLAUDE.md at the start of a session, and AGENTS.md carries the same contract to Codex CLI and OpenCode. Work routes by what is known. investigate takes a specific bad thing in a specific window. monitor sweeps when nothing is known to be broken. analyze covers capacity, cost and profiling with no fault at all. An investigation starts broad, at alerts and failed builds, then traces and logs, then metrics, deployments and dependencies. Queues, Kubernetes, caches and databases come last, and only where evidence points. Output lands in incidents/<YYYY-MM-DD>-<slug>/ beside its raw evidence. Each RCA carries a root cause category from a controlled vocabulary, a confidence score, and a split between what tools proved and what stays inference.

Decisions and costs

  • Wire existing CLIs rather than ship one binary. Upstream flags keep working and nothing is wrapped in a worse interface. The cost is fourteen install paths to keep current across macOS, two Linux families and WSL2.
  • Give the custom Go CLIs an agent shape. grafana, jenkins and cubeapm return JSON under -o json, keep stdout and stderr separate, and read their configuration from the clone.
  • Keep a human in the loop. Approval prompts are a real barrier today, which also means this safety model does not survive automation. That is the decision I would revisit, and it is exactly why the hosted edition is deferred.
  • Leave direnv optional. It is convenient and it fails silently, so doctor had to be written to catch it.

Limits and editions

The workspace edition is the only one being built. EDITIONS.md documents a hosted edition and argues for not starting it. Removing the human removes the approval layer, so every guarantee has to move into enforced credentials and a durable audit trail. The methodology in skills/reckon/ is the shared core, while infra-knowledge/ and incidents/ are gitignored wholesale, so no service inventory or incident history ships with the repository. Native Windows is partial, since direnv, kcat, rpk and redis-cli have no clean port. The workspace runs from a clone on a laptop and is meant to hold production credentials only.

Next projectApplied AI

Document OCR

View project