$ patchyard --help

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 human

Request 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.

intakestaff submitter

One form. The dashboard writes a single intake row and notifies.

triageno-shell subagent

Read-only pass classifies the request into a lane with a schema-valid TaskSpec.

implementisolated worker

Secret-free droplet, exact-base-SHA tree, one allowlisted model provider. Patch plus rationale out, nothing else.

verifyverifier

Clean environment, worker terminated first. Acceptance fixtures: hidden cases, near-misses, injection, crash windows.

publishsupervisor

Deterministic publisher applies the verified patch, confirms tree hash, opens the draft PR as the factory bot identity.

mergehuman

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.

The 2-open-PR cap + kill switch. Drain throttles at two open factory PRs and fails closed when GitHub state is stale. Operators get pause, per-run kill, and full stop; kills land in the ledger as terminal events. Daily run limits apply per submitter and globally.

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.
Phase-1 facts
ItemValue
Control planeRust (Axum dashboard as factory-web, supervisor daemon), local PostgreSQL over Unix socket with peer-mapped roles
DashboardSSR only (Axum + Askama), intake + observability, factory-native auth, strict CSP, all assets self-hosted
IdentityPRs authored by a dedicated factory machine identity; triggers recorded in intake row and PR body, never in commit author
InfrastructureOpenTofu + Ansible desired state, second converge reports no changes, clean-droplet rebuild is an acceptance criterion
StyleMatrix 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).