micro--go-micro
3a9f45750b
* ci: self-merge Codex PRs via native auto-merge; retire the sweep With branch protection + "Allow auto-merge" now enabled on master, Codex enables GitHub auto-merge on its own PR (gh pr merge --squash --auto) right after opening it, so the PR lands the moment the required CI checks pass — no polling sweep, and the green-CI gate is enforced by GitHub instead of by gh pr checks in a cron. Removes auto-merge-codex.yml and updates the dispatch and AGENTS.md accordingly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CmdEY7pYmV5zzwCjNJ4ykL * docs: document the durable loop mechanics (stub→gh, branch, auto-merge) Capture the hard-won wiring of the autonomous loop so it isn't re-derived: fresh issue per increment, user-PAT dispatch (Codex ignores the bot), Codex opening the PR via gh (make_pr is a no-op stub), unique codex/ branch + label, and native auto-merge gated by branch protection with 0 approvals. Adds a "do-not-break" list (don't re-add approvals, don't reuse one tracker issue, don't use make_pr, don't re-implement during the summary→PR lag). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CmdEY7pYmV5zzwCjNJ4ykL * website: rename section to "Features"; trim subtitle Rename the feature-grid heading from "The Runtime Around the Agent" to "Features", and drop "once they leave the demo." from the subtitle. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CmdEY7pYmV5zzwCjNJ4ykL --------- Co-authored-by: Claude <noreply@anthropic.com>
130 行
6.5 KiB
Markdown
130 行
6.5 KiB
Markdown
# 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`](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:
|
|
|
|
1. **Roadmap** — the Now/Next items in `ROADMAP.md` (harness depth: durable runs,
|
|
observability, streaming, human-in-the-loop; hardening: resilience, conformance).
|
|
2. **Open issues** — the scoped backlog (e.g. #3010–#3014).
|
|
3. **Improvement radar** — a scan each cycle for: missing/weak tests, lint or
|
|
quality issues, docs/code drift, and DX friction.
|
|
4. **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)
|
|
|
|
1. Sync `master`.
|
|
2. If a Codex PR is open and CI-green → review (diff + gates + correctness vs its
|
|
issue) and merge it.
|
|
3. Else pick the single highest-value item from the sources above.
|
|
4. 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.**
|
|
5. Verify `build`/`test`/`lint` locally.
|
|
6. Open a PR (one concern) and merge it.
|
|
7. 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 on `codex/*`); never two agents on one branch;
|
|
base PRs on `master` (don't stack on an in-flight branch). See `CODEX.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_TOKEN` repo 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.yml` and 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:
|
|
|
|
1. **Opens a fresh issue per increment** (`Continuous improvement increment #N`)
|
|
and posts the `@codex` instruction 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.
|
|
2. **Posts as a user, not the Actions bot.** Codex ignores `@codex` comments
|
|
authored by `github-actions[bot]`, so the dispatch uses `CODEX_TRIGGER_TOKEN`
|
|
(a PAT for a user account Codex follows). No token → the step no-ops.
|
|
3. **Codex opens the PR itself with `gh` — never `make_pr`.** In the Codex Cloud
|
|
sandbox the `make_pr` tool 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 and [`AGENTS.md`](../../AGENTS.md) tell Codex to do it by hand:
|
|
|
|
```sh
|
|
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-branch
|
|
```
|
|
|
|
This requires the Codex setup script to install `gh` and run `gh auth
|
|
setup-git` (so `git push` is authenticated) with a write-scoped token.
|
|
4. **Merges via GitHub native auto-merge, gated by branch protection.** `master`
|
|
requires the CI status checks (build, tests, golangci-lint) and **0 approving
|
|
reviews**. `gh pr merge --auto` enables 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. `gh` is 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.
|
|
|
|
## 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.
|