{
 "origin": "2026-07-11",
 "days": [
  {
   "date": "2026-07-11",
   "day": 1,
   "spend": 0.0,
   "fund": 0.0,
   "spend_cum": 0.0,
   "events": [
    {
     "kind": "milestone",
     "title": "Ignition",
     "sub": "IronForge is born on a single RTX 3060 Ti (8GB). No fleet, no ledger, no site. Day 1."
    }
   ],
   "runs": [],
   "incidents": []
  },
  {
   "date": "2026-07-12",
   "day": 2,
   "spend": 0.0,
   "fund": 0.0,
   "spend_cum": 0.0,
   "events": [],
   "runs": [],
   "incidents": []
  },
  {
   "date": "2026-07-13",
   "day": 3,
   "spend": 0.0,
   "fund": 0.0,
   "spend_cum": 0.0,
   "events": [],
   "runs": [],
   "incidents": []
  },
  {
   "date": "2026-07-14",
   "day": 4,
   "spend": 0.0,
   "fund": 0.0,
   "spend_cum": 0.0,
   "events": [],
   "runs": [],
   "incidents": []
  },
  {
   "date": "2026-07-15",
   "day": 5,
   "spend": 0.57,
   "fund": 0.0,
   "spend_cum": 0.57,
   "events": [
    {
     "kind": "fleet",
     "title": "Fleet era begins",
     "sub": "First rented GPU dollar hits the books: $0.57. Every dollar after this one is in the ledger below."
    }
   ],
   "runs": [],
   "incidents": []
  },
  {
   "date": "2026-07-16",
   "day": 6,
   "spend": 1.06,
   "fund": 0.0,
   "spend_cum": 1.63,
   "events": [
    {
     "kind": "system",
     "title": "Training loop stands up",
     "sub": "First smoke LoRA through the local rig proves the train->preview->judge loop end to end."
    }
   ],
   "runs": [
    {
     "name": "smoke-test-te",
     "steps": 4,
     "n_train": 3,
     "res": 256,
     "verdict": null
    }
   ],
   "incidents": []
  },
  {
   "date": "2026-07-17",
   "day": 7,
   "spend": 7.35,
   "fund": 0.0,
   "spend_cum": 8.98,
   "events": [],
   "runs": [
    {
     "name": "ironforge-weapon-shapes",
     "steps": 1200,
     "n_train": 200,
     "res": 1024,
     "verdict": null
    },
    {
     "name": "proof-weapon-lora",
     "steps": 150,
     "n_train": 24,
     "res": 768,
     "verdict": null
    },
    {
     "name": "weapon-shapes-full",
     "steps": 1200,
     "n_train": 278,
     "res": 768,
     "verdict": null
    },
    {
     "name": "ironforge-crisp-icons",
     "steps": 1200,
     "n_train": 227,
     "res": 1024,
     "verdict": null
    },
    {
     "name": "ironforge-weapon-shapes-v2",
     "steps": 1400,
     "n_train": 278,
     "res": 1024,
     "verdict": "overcooked"
    }
   ],
   "incidents": []
  },
  {
   "date": "2026-07-18",
   "day": 8,
   "spend": 15.16,
   "fund": 0.0,
   "spend_cum": 24.14,
   "events": [
    {
     "kind": "system",
     "title": "The LoRA wave",
     "sub": "Six adapters trained in one day across local + pod as the playbook gels."
    }
   ],
   "runs": [
    {
     "name": "xi-weapons-lora",
     "steps": 1500,
     "n_train": 592,
     "res": 768,
     "verdict": null
    },
    {
     "name": "ironforge-beasts-test",
     "steps": 800,
     "n_train": 1520,
     "res": 768,
     "verdict": null
    },
    {
     "name": "ironforge-beasts-curated",
     "steps": 500,
     "n_train": 1223,
     "res": 768,
     "verdict": null
    },
    {
     "name": "ironforge-daggers",
     "steps": 1200,
     "n_train": 270,
     "res": 1024,
     "verdict": "keeper"
    },
    {
     "name": "ironforge-sword",
     "steps": 1200,
     "n_train": 118,
     "res": 768,
     "verdict": "keeper"
    },
    {
     "name": "ironforge-farm",
     "steps": 1200,
     "n_train": 1244,
     "res": 768,
     "verdict": null
    }
   ],
   "incidents": []
  },
  {
   "date": "2026-07-19",
   "day": 9,
   "spend": 17.29,
   "fund": 0.0,
   "spend_cum": 41.43,
   "events": [
    {
     "kind": "milestone",
     "title": "minkforge.dev registered",
     "sub": "The foundry gets a front door. Year one: $12.99."
    }
   ],
   "runs": [],
   "incidents": []
  },
  {
   "date": "2026-07-20",
   "day": 10,
   "spend": 17.06,
   "fund": 25.0,
   "spend_cum": 58.49,
   "events": [
    {
     "kind": "data",
     "title": "Corpus gate v4 tuned",
     "sub": "Quality gate recalibrated (aesthetic 4.5, keep-fraction 0.30) after the first gate proved too strict."
    },
    {
     "kind": "data",
     "title": "MTG training pool mined",
     "sub": "8,088 reference images mined by the dash fleet for style training."
    }
   ],
   "runs": [],
   "incidents": [
    {
     "kind": "wrongtarget",
     "summary": "Probed local :7869 (3060 Ti) believing it was Amethyst; local box owns :7869, Amethyst is reached via the :7870 tunnel \u2014 read the wrong forge's state and nearly acted on it"
    },
    {
     "kind": "dataloss",
     "summary": "Fresh weapon_forge run overwrote existing gens: default --seed-base 1 + deterministic prompt stream = identical filenames; and pod dropped to gens/<cat>/ not gens/_incoming/<cat>/ (non-parity). Silent overwrite, flat count masked it."
    }
   ]
  },
  {
   "date": "2026-07-21",
   "day": 11,
   "spend": 33.67,
   "fund": 20.0,
   "spend_cum": 92.16,
   "events": [
    {
     "kind": "era",
     "title": "MinkForge-XL v1 ships",
     "sub": "Continued pretrain: 4,000 steps, batch 12, on 14,956 NL-captioned images. One 48GB 4090. Our own model line."
    },
    {
     "kind": "judge",
     "title": "Blind judge: 8-8 split",
     "sub": "v1 vs the reigning champion checkpoint fights to a draw in a 16-round blind judge. The mink hangs in."
    },
    {
     "kind": "pack",
     "title": "SavyForge first e2e pack",
     "sub": "Sibling audio forge proves end-to-end on a community 3090: one sellable pack for $0.24."
    }
   ],
   "runs": [],
   "incidents": [
    {
     "kind": "crash",
     "summary": "bow: stage returned error"
    },
    {
     "kind": "crash",
     "summary": "bow: stage returned error"
    }
   ]
  },
  {
   "date": "2026-07-22",
   "day": 12,
   "spend": 12.95,
   "fund": 0.0,
   "spend_cum": 105.11,
   "events": [
    {
     "kind": "data",
     "title": "Archive crosses ~136k renders",
     "sub": "Cumulative forge output since day 1, quality-gated and banked."
    },
    {
     "kind": "fleet",
     "title": "Vultr front opens",
     "sub": "$250 credit unlocked; CPU-only strategy adopted after GPU smoke-tests triple-faulted (see scars)."
    }
   ],
   "runs": [],
   "incidents": [
    {
     "kind": "crash",
     "summary": "PermissionError: [WinError 5] Access is denied: 'C:\\\\Users\\\\Cody\\\\Desktop\\\\IronForge\\\\autoloop_state.json.tmp' -> 'C:\\\\Users\\\\Cody\\\\Desktop\\\\IronForge\\\\autoloop_state.json'"
    },
    {
     "kind": "crash",
     "summary": "PermissionError: [WinError 5] Access is denied: 'C:\\\\Users\\\\Cody\\\\Desktop\\\\IronForge\\\\autoloop_state.json.tmp' -> 'C:\\\\Users\\\\Cody\\\\Desktop\\\\IronForge\\\\autoloop_state.json'"
    },
    {
     "kind": "repeat",
     "summary": "Art widget goes blank whenever a new render pod is added: the collector blocks on ALL forge ports (BASE..BASE+SPAN) serially at 2s timeout each before/around the folder scan; new dash pods have no forge and their dead/half-open tunnels TIME OUT (not refuse), so each tick overruns the 2s refresh interval and the widget holds a dimmed last-good grid. Adding a card widens the dead-port span and/or le"
    },
    {
     "kind": "repeat",
     "summary": "Wrong GPU labels on minkforge.dev/live traced to TWO bugs. (1) Label double-source: the local 3060 forge on :7869 is fed to live_feed BOTH via /v1/live HTTP probe (labeled by port -> '3060Ti') AND via the folder scan of cards-v1 (labeled by filename -> 'local 3060'); the two items carry different (port,job_id) so dedup can't collapse them, so the same card shows twice with two labels. (2) Seed bac"
    },
    {
     "kind": "crash",
     "summary": "warhammer: stage returned error"
    },
    {
     "kind": "crash",
     "summary": "warhammer: stage returned error"
    },
    {
     "kind": "repeat",
     "summary": "Dash racer pods (no forge server) come up INVISIBLE to HUD + art feed; fleet_wire.py wire is forge-only (allocates port+tunnel) so it's the wrong tool, and dash_ctl.py wires nothing on create. Correct path (add name to HUD_FLEET_PODS + wire_restart.py restart; drain dir into ART_GALLERY_DIRS) exists but isn't forced, so every dash pod is manually re-wired."
    },
    {
     "kind": "repeat",
     "summary": "archive_mine.py OUT_DIR hardcoded to output/taste/archive-mine with no --out-dir flag; mining a new tag-set (8k card pool) overwrote the corpus-wide archive-mine manifests. No data lost (manifests recompute from intact embeds) but forced a full 160k regen. Backup-rename guard failed silently (path or device name error). FIX: add --out-dir flag so each mine writes its own dir."
    },
    {
     "kind": "crash",
     "summary": "crowns-circlets: stage returned error"
    }
   ]
  },
  {
   "date": "2026-07-23",
   "day": 13,
   "spend": 3.19,
   "fund": 0.0,
   "spend_cum": 108.3,
   "events": [
    {
     "kind": "system",
     "title": "FOREMAN launches",
     "sub": "A $0 always-on watcher: code-mode tick, digest, heartbeat watchdog, cost layer. The forge now watches itself."
    },
    {
     "kind": "fix",
     "title": "Keep-rate killer found",
     "sub": "Doubled-article prompt bug ('a a rusted sword') found and fixed across all 11 prompt builders. ~5,240 broken prompt heads -> 0, plus a preflight lint that aborts before GPU spend."
    },
    {
     "kind": "system",
     "title": "Free-list batch ships",
     "sub": "All 12 zero-dollar flywheel upgrades land in one day: work-steal queue, lane audit, distill lane, motion arm, and friends."
    },
    {
     "kind": "judge",
     "title": "Own-judge v1 calibrated",
     "sub": "In-house taste head (v0 AUC 0.944) recalibrated per-category; the 5.33-point creature bias flattened. Trained for $0 on the local 3060 Ti."
    },
    {
     "kind": "video",
     "title": "RIFE frame-interp promoted",
     "sub": "Frame interpolation pipeline wins its paired blind judge and promotes. Total run cost: $0.28 on an A5000."
    },
    {
     "kind": "fleet",
     "title": "OVH caption mill turning",
     "sub": "Free-credit caption mill feeding the flywheel: 12k ledger rows on the day it went live."
    }
   ],
   "runs": [],
   "incidents": [
    {
     "kind": "other",
     "summary": "blocked-fix idle-burn: rife A5000 sat RUNNING-idle ~5.5h (~$0.90) after rm was classifier-blocked; standing order already covered the delete \u2014 see CIP_BLOCKED_FIX_IDLE_BURN.md"
    },
    {
     "kind": "waste",
     "summary": "a stage TIMED OUT"
    },
    {
     "kind": "crash",
     "summary": "warhammer: stage returned error"
    },
    {
     "kind": "waste",
     "summary": "Vultr smoke boxes launched fire-and-forget; bootstraps died pre-heartbeat, self-destroy never fired, 0.635/hr dead burn found by accident 2.25h later"
    },
    {
     "kind": "waste",
     "summary": "RunPod S3 403s bare Python-urllib UA from Vultr IPs; FAILED flare also 403d -> 2 box generations silent, gen-1 nuked undiagnosed"
    },
    {
     "kind": "crash",
     "summary": "Ubuntu 24.04 debian-owned rich 13.7.1 (no RECORD) kills pip upgrade on smoke box"
    },
    {
     "kind": "crash",
     "summary": "hpsv3 imports matplotlib but doesn't declare it; smoke-hps died at last import"
    },
    {
     "kind": "other",
     "summary": "Cloudflare WAF 401s any S3 PUT whose body is a bare 16-hex token; kit VERSION stamp un-PUT-able"
    },
    {
     "kind": "other",
     "summary": "Vultr API key IP-restricted -> box-side self-destroy 401s; cleanup is always local nuke + dead-man"
    },
    {
     "kind": "crash",
     "summary": "hpsv3 also imports torch.utils.tensorboard undeclared \u2014 second consecutive smoke-hps FAILED past matplotlib; fix: tensorboard added to hps deps"
    },
    {
     "kind": "crash",
     "summary": "caption stage ran caption_dataset.py by absolute path with cwd=ROOT but no PYTHONPATH \u2014 No module named engine; absolute path puts script dir on sys.path not cwd; fix: PYTHONPATH=ROOT in stage env"
    },
    {
     "kind": "waste",
     "summary": "retry chicken-egg: relaunched provision pulls fixed kit but keeps executing already-imported old code; fix: scp changed files to live boxes \u2014 retries must run the code you fixed"
    },
    {
     "kind": "other",
     "summary": "HPSv3 7B fp32-on-CPU peaks 63.6GB RSS, OOM-SIGKILL on 62GB-usable 64GB Vultr box; real smoke finding \u2014 HPS-CPU is a fallback tier needing >64GB RAM or big swap; fixed this run with 40GB swap, loaded clean in 23s"
    },
    {
     "kind": "repeat",
     "summary": "cp1252 non-ASCII chars in .ps1/.vbs launchers desync the cp1252 PowerShell/WScript parser (bogus 'Missing closing }'), silently failing scheduled tasks; the .py-only cp1252 guard had a launcher-shaped blind spot"
    },
    {
     "kind": "wrongtarget",
     "summary": "Obsidian A5000 terminated mid-render (bluewitch a5000-bw lane, 100% GPU ~7h) and replaced by a bare pod 'Larimar-migration' on the same host; run deposited 0 imgs / no results.json to S3 = full loss of that render. No harvestable output. Termination happened outside the working session."
    },
    {
     "kind": "repeat",
     "summary": "fault-H HPS-CPU OOM fix declared 'in code' but was incomplete: in-place fp32 lowers RESIDENT to ~28GB yet the 64GB box still SIGKILL(9)'d at the hps stage because provision NEVER created the swap the CIP note itself required. Fix = _ensure_swap() before the hps subprocess + batch-1 + RSS instrumentation."
    }
   ]
  },
  {
   "date": "2026-07-24",
   "day": 14,
   "spend": 0.76,
   "fund": 0.0,
   "spend_cum": 109.06,
   "events": [
    {
     "kind": "system",
     "title": "batch_fire + taste-gate ship",
     "sub": "Staged lanes now rank+combine into one fire; the judge retrains itself for $0. Plus an hourly detector that catches finished runs nobody harvested (first sweep: 27 lanes, ~31k images found unbanked)."
    },
    {
     "kind": "judge",
     "title": "Thin-geometry gate confirms RIFE",
     "sub": "Standing promote-gate re-run frozen: promote=True, 80.2% win-rate, $0 (ran local)."
    },
    {
     "kind": "milestone",
     "title": "The site opens its books",
     "sub": "This page ships: every dollar, every run, every incident, day 1 to now."
    }
   ],
   "runs": [],
   "incidents": [
    {
     "kind": "other",
     "summary": "verdict json saved to state BEFORE the armed block added fire_cmd/gate_cmd, so persisted last_verdict never carried the commands a downstream reader (V15 page) needs"
    },
    {
     "kind": "waste",
     "summary": "4 A5000 create attempts stockout-failed in a row; list-gpu-types maxCount=10 is POOL CAPACITY not live availability"
    }
   ]
  }
 ]
}