{
  "live": {
    "prod": {
      "version": "sha-436a003",
      "state": "lagging"
    },
    "stg": {
      "version": "sha-cb12c5e",
      "state": "lagging"
    },
    "test": {
      "version": "sha-4019d27",
      "state": "lagging"
    }
  },
  "snapshot": {
    "commit": "cb12c5e",
    "taken": "2026-10-30T21:42:24Z",
    "cards": [
      {
        "id": "t-0001",
        "title": "Readable URL slugs for order pages",
        "kind": "ticket",
        "station": "release",
        "risk": "low",
        "runner": "claude",
        "pr": 1,
        "pr_url": "https://github.com/jongep86/software-factory/pull/1",
        "pr_state": "MERGED",
        "gate": "auto",
        "passed": true,
        "success": "The next ticket that builds order URLs uses Slugify instead of its own helper.",
        "seconds": 16,
        "usd": 0.1771343,
        "budget_minutes": 20,
        "budget_usd": 3,
        "over_budget": false
      },
      {
        "id": "t-0002",
        "title": "Truncate long order titles",
        "kind": "ticket",
        "station": "build",
        "risk": "low",
        "runner": "red-team",
        "pr": 2,
        "pr_url": "https://github.com/jongep86/software-factory/pull/2",
        "pr_state": "CLOSED",
        "gate": "red",
        "success": "No order title in the list view is wider than its column.",
        "seconds": 0,
        "usd": 0,
        "budget_minutes": 5,
        "over_budget": false
      },
      {
        "id": "t-0003",
        "title": "A page per product with a readable URL",
        "kind": "ticket",
        "station": "release",
        "risk": "low",
        "runner": "claude",
        "pr": 3,
        "pr_url": "https://github.com/jongep86/software-factory/pull/3",
        "pr_state": "MERGED",
        "gate": "auto",
        "passed": true,
        "success": "Product URLs from the list are opened after release (requests to /p/ in the app log).",
        "seconds": 25,
        "usd": 0.20418469999999997,
        "budget_minutes": 20,
        "budget_usd": 3,
        "over_budget": false
      },
      {
        "id": "t-0004",
        "title": "Initials for customer badges",
        "kind": "ticket",
        "station": "release",
        "risk": "low",
        "runner": "herdr",
        "pr": 4,
        "pr_url": "https://github.com/jongep86/software-factory/pull/4",
        "pr_state": "MERGED",
        "gate": "auto",
        "passed": true,
        "success": "The order list shows a badge for every customer with a name.",
        "seconds": 19,
        "usd": 0,
        "budget_minutes": 15,
        "budget_usd": 2,
        "over_budget": false
      },
      {
        "id": "i-20261030-05",
        "title": "factory-sample test is down",
        "kind": "intake",
        "station": "intake",
        "source": "ops",
        "seconds": 0,
        "usd": 0,
        "over_budget": false
      },
      {
        "id": "i-20261030-06",
        "title": "factory-sample stg is down",
        "kind": "intake",
        "station": "intake",
        "source": "ops",
        "seconds": 0,
        "usd": 0,
        "over_budget": false
      },
      {
        "id": "i-20261030-07",
        "title": "factory-sample prod is down",
        "kind": "intake",
        "station": "intake",
        "source": "ops",
        "seconds": 0,
        "usd": 0,
        "over_budget": false
      },
      {
        "id": "i-20261030-08",
        "title": "A wishlist on the product pages",
        "kind": "intake",
        "station": "intake",
        "source": "files",
        "seconds": 0,
        "usd": 0,
        "over_budget": false
      }
    ],
    "envs": [
      {
        "name": "test",
        "url": "https://factory-sample-test.mj.mijp.nl",
        "pinned": "sha-6d1e718"
      },
      {
        "name": "stg",
        "url": "https://factory-sample-stg.mj.mijp.nl",
        "pinned": "sha-436a003"
      },
      {
        "name": "prod",
        "url": "https://factory-sample.mj.mijp.nl",
        "pinned": "sha-e854806"
      }
    ],
    "platforms": [
      {
        "number": "1",
        "station": "Intake",
        "platform": "FasterFixes feedback widget",
        "adapter": "`fasterfixes`: `GET /api/v1/agent/feedbacks?project=\u0026status=new` → `intake/\u003cid\u003e.md`, key `ff:\u003cid\u003e`",
        "direction": "read",
        "status": "fake"
      },
      {
        "number": "1",
        "station": "Intake",
        "platform": "Paraaf annotations on a published page",
        "adapter": "`paraaf`: `GET /api/paraaf/annotaties?slug=\u0026ongeharvest=1` → intake, key `paraaf:\u003cid\u003e`",
        "direction": "read",
        "status": "fake"
      },
      {
        "number": "1",
        "station": "Intake",
        "platform": "Offer requests, mail, call transcripts",
        "adapter": "`files`: markdown or JSON files dropped in a directory (the offer inbox, `gog gmail search … -j` output, transcribe-skill output) → intake, key `file:\u003csha\u003e`",
        "direction": "read",
        "status": "live"
      },
      {
        "number": "1",
        "station": "Intake",
        "platform": "Operate signals",
        "adapter": "`operate.Plan`: env down, over budget, success due, errors, usage",
        "direction": "read",
        "status": "live (env, budget, success)"
      },
      {
        "number": "2",
        "station": "Shape",
        "platform": "OpenSpec + blueprint",
        "adapter": "`factory shape` writes a ticket with spec, frozen acceptance, scope, risk, budget, success; OpenSpec changes for behaviour in the target repo",
        "direction": "own",
        "status": "live"
      },
      {
        "number": "3",
        "station": "Build",
        "platform": "Paperclip agents (primary)",
        "adapter": "runner `paperclip`: issue in a project with a git workspace, assignee agent, branch `runner/\u003cid\u003e`, `cost-summary` for cost",
        "direction": "write (own repo)",
        "status": "fake"
      },
      {
        "number": "3",
        "station": "Build",
        "platform": "herdr, smithy, Claude Code CLI",
        "adapter": "runners `herdr`, `smithy`, `claude`, `script`",
        "direction": "write (own repo)",
        "status": "live (claude, herdr, script)"
      },
      {
        "number": "4",
        "station": "Test",
        "platform": "GitHub Actions",
        "adapter": "`factory-verify.yml`: the gate, judged with the base commit's factory",
        "direction": "own",
        "status": "live"
      },
      {
        "number": "4",
        "station": "Test",
        "platform": "Playwright",
        "adapter": "`e2e/`: browser tests against a URL (`BASE_URL`), screenshots as evidence, after a preview or a test release",
        "direction": "read",
        "status": "live"
      },
      {
        "number": "5",
        "station": "Preview",
        "platform": "AppHaven `preview/*`",
        "adapter": "`apphaven`: push `preview/\u003cid\u003e`, read `apphaven status \u003capp\u003e --json` for the URL",
        "direction": "write (own repo)",
        "status": "fake"
      },
      {
        "number": "5",
        "station": "Preview",
        "platform": "Cluster fallback",
        "adapter": "the `preview-mj` ResourceSet: image `pr-\u003cn\u003e-\u003csha7\u003e` for PRs labelled `preview`",
        "direction": "own",
        "status": "live"
      },
      {
        "number": "6",
        "station": "Show",
        "platform": "Feedback widget in the preview",
        "adapter": "the sample app loads the FasterFixes widget when `FF_PROJECT_ID` and `FF_WIDGET_SRC` are set; feedback comes back through station 1",
        "direction": "read",
        "status": "fake"
      },
      {
        "number": "6",
        "station": "Show",
        "platform": "Paraaf portal",
        "adapter": "`paraaf` show: a demo page as a draft (markdown in the PR), published to Paraaf by a human",
        "direction": "draft",
        "status": "planned"
      },
      {
        "number": "6",
        "station": "Show",
        "platform": "GitHub PR + board",
        "adapter": "evidence, gate, preview URL and success measure on the PR and on the board",
        "direction": "own",
        "status": "live (PR)"
      },
      {
        "number": "7",
        "station": "Release",
        "platform": "Flux from `./deploy`",
        "adapter": "pins per environment, `factory promote`",
        "direction": "own",
        "status": "live"
      },
      {
        "number": "8",
        "station": "Operate",
        "platform": "platform API (`platform` CLI)",
        "adapter": "`platform`: `urls` per app → `url-dead:\u003chost\u003e`, `usage` → hosting cost",
        "direction": "read",
        "status": "live"
      },
      {
        "number": "8",
        "station": "Operate",
        "platform": "Traceway (OpenTelemetry)",
        "adapter": "`traceway`: `traceway exceptions list -o json --project` → `errors:\u003capp\u003e` signal",
        "direction": "read",
        "status": "fake"
      },
      {
        "number": "8",
        "station": "Operate",
        "platform": "Umami",
        "adapter": "`umami`: `GET /api/websites/{id}/stats` → `unused:\u003capp\u003e:\u003cweek\u003e` when a week stays under the threshold",
        "direction": "read",
        "status": "fake"
      },
      {
        "number": "8",
        "station": "Cost",
        "platform": "LiteLLM gateway",
        "adapter": "`litellm`: spend per tag `ticket:\u003cid\u003e`",
        "direction": "read",
        "status": "live (no tagged calls yet)"
      },
      {
        "number": "8",
        "station": "Cost",
        "platform": "Paperclip",
        "adapter": "`cost-summary` per issue (from the runner)",
        "direction": "read",
        "status": "fake"
      },
      {
        "number": "8",
        "station": "Cost",
        "platform": "MoneyMonk",
        "adapter": "`factory hours`: hours per ticket as a CSV draft for manual entry (MoneyMonk has no public API)",
        "direction": "draft",
        "status": "live"
      }
    ],
    "totals": {
      "seconds": 60,
      "usd": 0.38131899999999996,
      "over_budget": 0
    }
  }
}
