The software factory
Every station is an existing platform behind an adapter. Agents do the work; people decide at two points, intent and release. What runs comes back as new work along the blue line.
01
Intake 4
mail, calls, feedback, requests
i-20261030-05 · ops
factory-sample test is down
i-20261030-06 · ops
factory-sample stg is down
i-20261030-07 · ops
factory-sample prod is down
i-20261030-08 · files
A wishlist on the product pages
02
Shape 0
spec and frozen acceptance tests
human: intent
03
Build 1
agent on its own branch
04
Verify 0
gate, browser tests, evidence
05
Preview 0
own URL per change
06
Show 0
demo, click, annotate
human: release
07
Release 0
test, then stg and prod by PR
08
Operate 3
health, usage, cost
t-0003
A page per product with a readable URL
25s of 20m · $0.20
feedback loop: customers, alerts, schedules, outcomes
Shared context · specs, frozen acceptance tests, evidence and decisions live in git. Every agent reads it; every loop grows it.
Cost meter
1m 0s · $0.38
agent time and model cost over 4 tickets · 0 over budget
A ticket at its budget stops and goes back to shape. Hosting, gateway spend and review minutes join as their adapters go live.
Environments
test
healthy
live sha-4019d27 · pinned at snapshot sha-25ecdc4
https://factory-sample-test.mj.mijp.nl
Platforms behind the stations
| # | Station | Platform | Adapter | Direction | Status |
|---|---|---|---|---|---|
| 1 | Intake | FasterFixes feedback widget | fasterfixes: GET /api/v1/agent/feedbacks?project=&status=new → intake/<id>.md, key ff:<id> | read | fake |
| 1 | Intake | Paraaf annotations on a published page | paraaf: GET /api/paraaf/annotaties?slug=&ongeharvest=1 → intake, key paraaf:<id> | read | fake |
| 1 | Intake | Offer requests, mail, call transcripts | files: markdown or JSON files dropped in a directory (the offer inbox, gog gmail search … -j output, transcribe-skill output) → intake, key file:<sha> | read | live |
| 1 | Intake | Operate signals | operate.Plan: env down, over budget, success due, errors, usage | read | live (env, budget, success) |
| 2 | Shape | OpenSpec + blueprint | factory shape writes a ticket with spec, frozen acceptance, scope, risk, budget, success; OpenSpec changes for behaviour in the target repo | own | live |
| 3 | Build | Paperclip agents (primary) | runner paperclip: issue in a project with a git workspace, assignee agent, branch runner/<id>, cost-summary for cost | write (own repo) | fake |
| 3 | Build | herdr, smithy, Claude Code CLI | runners herdr, smithy, claude, script | write (own repo) | live (claude, herdr, script) |
| 4 | Test | GitHub Actions | factory-verify.yml: the gate, judged with the base commit's factory | own | live |
| 4 | Test | Playwright | e2e/: browser tests against a URL (BASE_URL), screenshots as evidence, after a preview or a test release | read | live |
| 5 | Preview | AppHaven preview/* | apphaven: push preview/<id>, read apphaven status <app> --json for the URL | write (own repo) | fake |
| 5 | Preview | Cluster fallback | the preview-mj ResourceSet: image pr-<n>-<sha7> for PRs labelled preview | own | live |
| 6 | Show | Feedback widget in the preview | the sample app loads the FasterFixes widget when FF_PROJECT_ID and FF_WIDGET_SRC are set; feedback comes back through station 1 | read | fake |
| 6 | Show | Paraaf portal | paraaf show: a demo page as a draft (markdown in the PR), published to Paraaf by a human | draft | planned |
| 6 | Show | GitHub PR + board | evidence, gate, preview URL and success measure on the PR and on the board | own | live (PR) |
| 7 | Release | Flux from ./deploy | pins per environment, factory promote | own | live |
| 8 | Operate | platform API (platform CLI) | platform: urls per app → url-dead:<host>, usage → hosting cost | read | live |
| 8 | Operate | Traceway (OpenTelemetry) | traceway: traceway exceptions list -o json --project → errors:<app> signal | read | fake |
| 8 | Operate | Umami | umami: GET /api/websites/{id}/stats → unused:<app>:<week> when a week stays under the threshold | read | fake |
| 8 | Cost | LiteLLM gateway | litellm: spend per tag ticket:<id> | read | live (no tagged calls yet) |
| 8 | Cost | Paperclip | cost-summary per issue (from the runner) | read | fake |
| 8 | Cost | MoneyMonk | factory hours: hours per ticket as a CSV draft for manual entry (MoneyMonk has no public API) | draft | live |