The hourly loop ships increments but nothing watches the whole. Add two periodic high-altitude passes, same dispatch mechanism (fresh issue → @codex): - devrel-review.yml (daily): audits README, website, docs, blog for coherence with the North Star, README crispness, and blog-worthy material. Safe alignment/crispness fixes auto-merge; brand/positioning copy and blog drafts are surfaced in a report for the human, never auto-merged. - architecture-review.yml (every ~3 days): reviews the framework/harness against the thesis and files scoped follow-up issues that feed the increment loop. It does not make breaking/architectural changes itself. Documented both in CONTINUOUS_IMPROVEMENT.md (Overseer passes). Claude-Session: https://claude.ai/code/session_01CmdEY7pYmV5zzwCjNJ4ykL Co-authored-by: Claude <noreply@anthropic.com>
7.8 KiB
Continuous Improvement Loop
Go Micro is an agent harness. This file defines the autonomous loop that builds it — the framework's own thesis (an agent operating a system) pointed at itself. Claude Code drives the loop; Codex executes scoped tasks; the human sets direction and can stop or revert anything at any time.
North Star. Every increment must advance the thesis in
THESIS.md: a holistic agent harness and service framework encapsulating the lifecycle of services → agents → workflows. Judge each change against it — work that doesn't move toward that lifecycle isn't an improvement, however clean.
Autonomy
Full autonomy, no approval gates. Each increment: Claude Code picks the work,
implements it (or dispatches Codex), opens a PR, and merges it — including
reviewing and merging Codex's PRs. The only gate is correctness: go build,
go test, and golangci-lint must be green (that's not an approval, it's not
shipping broken code).
Transparency replaces approval: every increment ends with a one-line digest, and every change is a small, reversible, single-concern PR the human can revert.
What counts as an improvement
Grounded in real signal, never speculative rewrites. Each cycle draws from:
- Roadmap — the Now/Next items in
ROADMAP.md(harness depth: durable runs, observability, streaming, human-in-the-loop; hardening: resilience, conformance). - Open issues — the scoped backlog (e.g. #3010–#3014).
- Improvement radar — a scan each cycle for: missing/weak tests, lint or quality issues, docs/code drift, and DX friction.
- Dogfooding — actually build with the harness (
micro new→run→chat, an agent + a flow) and fix what hurts. Friction found here is high-signal.
The cycle (one increment)
- Sync
master. - If a Codex PR is open and CI-green → review (diff + gates + correctness vs its issue) and merge it.
- Else pick the single highest-value item from the sources above.
- Implement it, or dispatch to Codex (
@codex <instruction>on the issue) if it's a well-scoped chunk and Codex is free. Codex is serial — one task at a time. - Verify
build/test/lintlocally. - Open a PR (one concern) and merge it.
- Post a one-line digest; refresh the backlog from the radar.
Roles
- Claude Code — orchestrator, implementer, reviewer, integrator, merger.
- Codex — serial builder for well-scoped chunks, dispatched via
@codex. - Human — sets direction; owns brand/positioning copy and breaking public-API decisions; can stop or revert anything.
Guardrails
- One concern per PR; small and reversible.
- Stay on
claude/*branches (Codex oncodex/*); never two agents on one branch; base PRs onmaster(don't stack on an in-flight branch). SeeCODEX.md. - Off-limits without the human: brand/positioning/marketing copy, breaking public API changes, product-default changes with broad behavioral impact, new dependencies, architectural rewrites. The loop proposes these in the digest; it does not merge them autonomously.
Scheduling
- In-session cron (
CronCreate) — runs increments while this Claude session is alive. Convenient, but the remote environment is reclaimed on inactivity and recurring jobs expire after 7 days, so it is not a durable scheduler. - GitHub Actions (durable) — a scheduled workflow that runs the loop
independently of any session. This is the real backbone; it opens a fresh
tracking issue for each increment and dispatches Codex there. It needs a
CODEX_TRIGGER_TOKENrepo secret from a user account Codex responds to; without that secret the workflow deliberately no-ops to avoid ignored bot comments. See.github/workflows/continuous-improvement.ymland the mechanics below.
How the durable loop works (mechanics)
Hard-won wiring — change any one piece and the loop silently stops producing merged PRs. Each scheduled run:
-
Opens a fresh issue per increment (
Continuous improvement increment #N) and posts the@codexinstruction on it. Why a fresh issue: Codex derives its branch name from the triggering issue's context, so re-using one tracker issue collapses every run onto one branch name and only the first PR opens — the rest collide and silently fail. -
Posts as a user, not the Actions bot. Codex ignores
@codexcomments authored bygithub-actions[bot], so the dispatch usesCODEX_TRIGGER_TOKEN(a PAT for a user account Codex follows). No token → the step no-ops. -
Codex opens the PR itself with
gh— nevermake_pr. In the Codex Cloud sandbox themake_prtool is a no-op stub: it records the PR title/body for the manual "Create PR" button and never pushes a branch or calls the API. So the dispatch andAGENTS.mdtell Codex to do it by hand:git switch -c codex/increment-<issue> # unique branch, codex/ prefix git push -u origin codex/increment-<issue> gh pr create --base master --label codex --title "…" --body "… Closes #<issue>" gh pr merge --squash --auto --delete-branchThis requires the Codex setup script to install
ghand rungh auth setup-git(sogit pushis authenticated) with a write-scoped token. -
Merges via GitHub native auto-merge, gated by branch protection.
masterrequires the CI status checks (build, tests, golangci-lint) and 0 approving reviews.gh pr merge --autoenables auto-merge; GitHub lands the PR the moment checks pass and deletes the branch.Closes #<issue>auto-closes the tracking issue. There is no merge sweep workflow — branch protection is the gate.
Do-not-break list
- Don't re-add required approvals to
master— it blocks every autonomous merge. The intended gate is green CI only. - Don't point the dispatch at one standing tracker issue — one issue per run.
- Don't tell Codex to use
make_pr(or imply a token "isn't a substitute"): it cannot open a PR.ghis the only path. - Don't manually re-implement a Codex increment during the summary→PR lag (Codex posts an optimistic "opened a PR" comment ~30–45 min before the PR actually appears). Re-doing it creates duplicate PRs and stale branches that then block the next run. Wait for the PR, or let it ride.
Overseer passes (DevRel + Architect)
The hourly loop ships increments; two periodic passes keep the whole heading in
the right direction. Both use the same mechanism (fresh issue → @codex →
output) but produce direction and coherence, not just code.
- DevRel — daily (
.github/workflows/devrel-review.yml). Audits the public surface (README, website landing + docs, blog) for coherence with the North Star, README crispness, and blog-worthy material. Autonomy boundary: safe factual-alignment and crispness fixes auto-merge like any increment; brand/positioning copy and blog drafts are surfaced in a report for the human, never auto-merged. - Architect — every few days (
.github/workflows/architecture-review.yml). Reviews the framework/harness against the thesis: API coherence, lifecycle gaps, drift/sprawl. Its output is an assessment plus scoped follow-up issues that feed the hourly increment loop — it does not make breaking or architectural changes itself (those stay with the human).
Together they close the loop: the architect decides what should change and files
issues, the increment loop builds them, and DevRel keeps the public story
honest. Cadence is tunable in each workflow's cron. Codex is serial, so these
passes queue behind any in-flight increment rather than running concurrently.
Stop / redirect
- In-session:
CronDelete <id>(or end the session). - Durable: disable/delete the workflow.
- Or just tell Claude Code to pause or change focus — direction always wins over the loop.