Back to writing

Post

Local execution state should stay local

The sprintctl and kctl workflow is useful largely because it does not pretend every intermediate agent artifact belongs in Git. Live state stays local, committed artifacts stay small, and promotion has to be deliberate.

Published Apr 8, 2026 ยท Context window: workflow tooling work, 2025-2026

  • note
  • workflow
  • agents

One of the more useful process decisions in the repo is not about AI at all. It is about refusing to commit too much of the wrong state.

The runbooks split the world quite cleanly.

Live execution state belongs in local SQLite databases: .sprintctl and .kctl. Claim tokens stay local. Handoff bundles stay local unless there is a specific reason to share them. Session notes are local history. The committed shared view is much smaller: a sprint snapshot, a knowledge base, and curated training artifacts when something actually deserves promotion.

That boundary is more important than it first sounds.

Agent-heavy workflows produce a lot of intermediate material. Some of it is genuinely useful. Much of it is just execution residue: who held a claim, which session resumed which item, what command sequence happened to work once, which partial handoff was written because context was about to evaporate.

If you commit all of that by default, the repo becomes a log sink. If you commit nothing, the process turns into private folklore. The interesting part is the middle path.

This workflow keeps the fast-changing state local and insists that promotion into Git should be deliberate.

That means sprintctl is the live source of truth for execution status and claims. docs/sprint-snapshots/sprint-current.txt is rendered when a shared artifact is actually needed. docs/knowledge/knowledge-base.md gets updated when reviewed candidates are intentionally published. docs/training/ is reserved for curated worked examples that future agents or humans may genuinely learn from.

I like this because it respects the half-life of workflow artifacts.

Most session state is only valuable while the session is alive. Claim heartbeats, resume metadata, and local handoffs are operational scaffolding. Pretending they all deserve permanence in Git is just another way of avoiding judgment.

The runbooks also draw a second useful line: if a rule or example keeps mattering, promote it out of local notes into a runbook, skill, guide, or training doc. That avoids the opposite failure mode where everyone vaguely remembers that a good pattern exists somewhere under .agents/ but nobody can tell whether it is still current or whether it was ever meant to be canonical.

There is a quiet discipline in that model. Durable repo state should be small, human-readable, and intentionally curated. Local execution state can be noisy, machine-readable, and disposable. Mixing those two categories is how a working process slowly becomes archaeology.

The practical payoff is coordination. If an exclusive claim already exists, the repo expects real ownership proof rather than inference from branch names or wish thinking. If a session dies, the recovery file is local. If a pattern turns out to be reusable, it can be promoted into docs/training/ or a runbook where it belongs.

That is a much saner model than either extreme.

It is saner than pretending every scratch artifact is a precious institutional memory object. It is also saner than pretending there is no need for durable shared artifacts because the database or the current agent probably remembers.

The only thing I would watch closely is curation discipline. A model like this works well only if promotion actually happens when something becomes repeatedly useful. Otherwise the committed layer stays neat at the cost of becoming too thin, and the real knowledge drifts back into local-only history.

Still, the baseline principle seems right: not every agent artifact deserves a Git commit. Execution state should stay local until it earns promotion.