Small staff requests in, evidenced pull requests out.
patchyard is a software factory for small, self-describing requests. A Rust control plane moves each request through triage, an isolated implement worker, verification, and a draft PR. One human gate holds the line: the pull request. Review is the only human cost.
$ status phase 1 under construction - sessions 0-14 merged, every merge humanRequest to ready-for-review, no hands in between
For a request triaged lane A, no human action exists between completing the intake form and the ready-for-review draft PR. Guardrails may delay a run - queued, throttled - never require a person to advance it. The next human touch is PR review.
One form. The dashboard writes a single intake row and notifies.
Read-only pass classifies the request into a lane with a schema-valid TaskSpec.
Secret-free droplet, exact-base-SHA tree, one allowlisted model provider. Patch plus rationale out, nothing else.
Clean environment, worker terminated first. Acceptance fixtures: hidden cases, near-misses, injection, crash windows.
Deterministic publisher applies the verified patch, confirms tree hash, opens the draft PR as the factory bot identity.
Engineering plus owner hold the gate. The factory never merges its own PRs.
Built so the untrusted part holds nothing worth stealing
Isolation substrate
The component that reads untrusted request content runs on a dedicated secret-free worker droplet: no SSH material, no vault token, no database or GitHub credentials, no private-network access. Egress goes to exactly one allowlisted model provider per boot on a short-lived, spend-capped credential.
Deterministic core
The supervisor is a Rust daemon with no prompt at its layer to inject: it claims queue rows from PostgreSQL, execs bounded stages, applies verified patches, publishes. Recovery is state-derived - rows determine work, notifications only wake it. Every side effect carries an idempotency key and a replay rule.
Every run leaves a paper trail
- ledger append-only requests, runs, events, artifacts, PR state - the authoritative record, served to Grafana through pinned read-only views.
- transcripts artifact store full harness transcript of every agentic invocation, attached to the run, retention-swept. Never in Git, never leaves the control plane.
- live SSE timeline the request page streams ledger transitions as they happen; the zero-JS path still refreshes while non-terminal.
- metrics Prometheus runs by stage and outcome, tokens and cost, stage-latency histograms - scraped over the private network.
| Item | Value |
|---|---|
| Control plane | Rust (Axum dashboard as factory-web, supervisor daemon), local PostgreSQL over Unix socket with peer-mapped roles |
| Dashboard | SSR only (Axum + Askama), intake + observability, factory-native auth, strict CSP, all assets self-hosted |
| Identity | PRs authored by a dedicated factory machine identity; triggers recorded in intake row and PR body, never in commit author |
| Infrastructure | OpenTofu + Ansible desired state, second converge reports no changes, clean-droplet rebuild is an acceptance criterion |
| Style | Matrix boxy terminal aesthetic, brand green #00A651 on dark green-cast ground, system mono, no webfonts |
Follow the build
patchyard is open source and under active construction. The spec, the session-by-session plan, the constitution every factory agent prompt carries, and the decision log are all in the repo.
Good first reads: SPEC.md (phase-1 build contract) - PLAN.md (session plan) - AGENTS.md (constitution) - docs/decision-log.md (rulings) - docs/bench.md (provider seat status).