Puppets
A pure cloud-based automation harness that turns approved GitHub issues into reviewed pull requests using GitHub Actions compute and repository-owned policy.
Pure cloud automation on GitHub
Puppets has no controller service, server, database, or inbound webhook to deploy. Each repository runs a small caller workflow on GitHub-hosted runners, while issues, labels, workflow runs, and pull requests hold the complete lifecycle state. The repository owns its triggers, permissions, credentials, provider selection, and local policy.
From issue to reviewed pull request
Puppets is a gated lifecycle, not a fire-and-forget agent assignment. GitHub labels carry the durable state, while a small scheduled workflow repeatedly reconciles immediate safe steps (bounded per run).
- An issue is filed. A deterministic check asks for more information when the report is too thin. No model runs yet.
- A maintainer approves it. Applying
puppets:approvedis the human trust gate. Puppets verifies who applied the label and checks their current repository permission. - Curation screens the work. A read-only agent checks for abuse, duplicates, feasibility, and useful classification without changing code.
- The selected provider implements it. A ready issue is admitted under repository limits, implemented by Copilot, Claude Code, or Codex, and linked to the resulting pull request.
- Evidence is verified. Normal CI must pass, then an acceptance-review gate judges the diff against the issue and available check evidence.
- Failures loop or escalate. Actionable findings return to Copilot for bounded
remediation. Ambiguity, exhausted retries, or product decisions move to
puppets:needs-human. - A maintainer merges. Puppets observes the merge and closes the lifecycle as
puppets:done. Version 1 never auto-merges.
The default basic workflow labels
| State | Meaning |
|---|---|
puppets:needs-info |
The issue needs enough concrete detail to enter the approval queue. |
puppets:approved |
A trusted maintainer approved spending automation and model resources. |
puppets:curating |
Read-only curation is screening and classifying the issue. |
puppets:ready |
The issue passed curation and is waiting for an available work slot. |
puppets:claimed |
Copilot has been assigned and implementation is in progress. |
puppets:verifying |
CI is green and acceptance evidence is being reviewed. |
puppets:needs-work |
The linked PR needs bounded remediation. |
puppets:in-review |
Automated gates passed; the PR awaits maintainer review or merge. |
puppets:needs-human |
A decision or intervention cannot be made safely by automation. |
puppets:done |
The linked PR merged and the lifecycle is complete. |
puppets:no-auto |
Absolute opt-out; Puppets must not touch the issue or linked PR. |
The issue is authoritative. Labels mirrored onto a linked pull request are visibility
projections and cannot advance the issue. Callers may rename these labels in
.puppets/workflow.yml; the runtime follows stage and control roles rather than fixed
label strings.
Small in every repository, shared in one place
Each managed repository checks in:
.github/workflows/puppets.yml
.puppets/
config.json
workflow.yml # optional versioned DSL overlay
prompts/ # optional replacements
The caller workflow owns triggers, concurrency, explicit permissions, and local secrets. It calls a published version of this public framework. The framework owns the reusable workflow, runtime, default lifecycle, prompts, configuration validation, and regression tests.
Deterministic filtering, human approval, admission limits, and sticky verdict comments avoid unnecessary model calls. Copilot and external provider requests remain separately metered.