Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

README.md

4.22 Kb · 98 lines

Agent Maintainer — an AI maintainer for an on-chain package that still can't ship on its own

"Give the AI commit access" is where most agent-automation stories quietly become horror stories. The useful version is narrower and much safer: let the agent drive the process — the tedious, valuable, around-the-clock parts — while an explicit policy still gates the one irreversible step, the ship.

This realm is that split, made concrete for a versioned on-chain package.

What the agent may do

  • open a version proposal committing to a package artifact hash,
  • collect independent reviews,
  • record CI test attestations,
  • write release notes, keep a compatibility matrix,
  • deprecate a version when a vulnerability lands.

What it cannot do

Deploy on its own say-so. Approve is gated by a machine-checked policy, and it panics with the first unmet condition rather than quietly proceeding:

tests pass
AND  ≥ MinReviewers (2) independent reviews
AND  every review scores ≥ MinScore (80)
AND  the challenge window has elapsed (height > ChallengeUntil)

The render turns that policy into a live checklist:

## Policy checklist
- ✅ tests pass
- ✅ ≥2 independent reviews (have 2)
- ❌ every review ≥80          ← one reviewer scored 70
- ✅ challenge window elapsed

The flow

 1id := maintainer.Propose(cross(cur), "v3", "artifact#H3", 100) // 100-block challenge window
 2maintainer.AttestTests(cross(cur), id, true)                    // CI attests
 3
 4maintainer.AddReview(cross(cur), id, 85, "ok")   // reviewer 1 (not the proposer)
 5maintainer.AddReview(cross(cur), id, 95, "great")// reviewer 2
 6
 7// ...after the challenge window passes...
 8maintainer.Approve(cross(cur), id)               // promotes to a release, or panics with the reason
 9
10maintainer.LatestVersion()          // "v3"
11maintainer.Deprecate(cross(cur), "v3", "CVE-xyz")
12maintainer.IsDeprecated("v3")       // true

Two independence rules keep the reviews honest: the proposer can't review its own proposal, and each address reviews at most once.

Note the realm records the approved release — the actual package publish (addpkg) is a separate, deliberately human/authority step. The agent produces a green checklist; it never holds the deploy key.

Browse the release matrix + open proposals at the realm root; each proposal's policy checklist and reviews are at :<id>.

1gno test .

Where it goes next

  • Wire Approve to actually authorize a downstream deploy via a capability (see the capwallet demo) instead of a trusted caller — then even "approved" can't over-spend or over-deploy.
  • Route contested proposals to a jury instead of a simple score gate.
  • Add a maintainer budget so the agent's activity itself is bounded.

Each of those is a different demo in this series clicking into place — which is the real thesis: agent trust is not one primitive, it's a stack of small, composable ones.


Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.

On mainnet: deployment status transactions unique callers deployed revision

Dependency graph:

gno.land/r/moul/agents/maintainer/v0 dependency graph

⚠️ Disclaimer: provided as-is, without warranty; not security-audited. Full disclaimer: DISCLAIMER.