Spaces:
Running
The Molt
Puck's actual fine-tuning pipeline. Night Bloom (nightly, symbolic) exports decision traces; when enough curated examples accumulate, a molt trains a fresh LoRA from base, runs this eval gate, and only swaps the adapter if it clears the bar. Each successful molt is a generation β versioned, revertible.
Pipeline
frontend: bun run export:deck # engine deck β data/deck.json (gold tier lines)
molt: uv run build_dataset.py # deck + traces β sft.jsonl / eval.jsonl / dpo_seeds.jsonl
molt: uv run eval.py --tag X # score PUCK_BRAIN_URL against the held-out set
- Held out, never trained on:
mail_finance,discord_mentiondeck events. - Traces (
server/data/traces.jsonl): rated-helpful lines join SFT; annoying ratings become DPO seed pairs (chosen = deck plain line, rejected = what annoyed). - Datasets are generated + may embed personal traces β gitignored.
deck.jsonis source-derived and committed.
Base model: Holotron-12B (switched from Holo-3.1-4B, 2026-06-07)
Holotron-12B is post-trained from NVIDIA Nemotron-Nano-12B-v2-VL (Nemotron Quest eligibility + stronger CUA). The LoRA + eval target this base now. Baseline below is being re-run against Holotron; the Holo-3.1-4B numbers are kept as a reference point. The targets don't change β they describe the character, not the base.
Zero-shot baseline β Holotron-12B Q8_0 (the bar to clear)
k=3 generations Γ 6 held-out samples, temp 0.7, 2026-06-07:
| metric | Holotron-12B | Holo-3.1-4B (prior) | target |
|---|---|---|---|
| fact_retention | 0.944 | 0.944 | β₯ 0.97 |
| no_banned | 1.0 | 1.0 | 1.0 |
| length_ok | 1.0 | 1.0 | 1.0 |
| clean_shape | 1.0 | 1.0 | 1.0 |
| first_person | 0.83 | 0.83 | 1.0 |
| register_ok | 0.72 | 0.72 | β₯ 0.95 |
| mean chars 12/45/85 | 112 / 113 / 170 | 131 / 136 / 106 | rising with mischief |
Holotron's gate metrics match Holo-3.1 zero-shot, but the register length-spread is already better β mythic (85) now runs 170 chars vs plain (12) at 112, the rising gradient the LoRA wants, where Holo-3.1 was flat/inverted. Same fine-tune job remains (register_ok + first_person β ~1.0); Holotron just starts closer on length.
Reference: prior Holo-3.1-4B baseline
| metric | baseline | target |
|---|---|---|
| fact_retention | 0.944 | β₯ 0.97 |
| no_banned | 1.0 | 1.0 |
| length_ok | 1.0 | 1.0 |
| clean_shape | 1.0 | 1.0 |
| first_person | 0.83 | 1.0 |
| register_ok | 0.72 | β₯ 0.95 |
Read of the failures: surface behavior is fine zero-shot; what's broken is register calibration β at mischief β€ 20 the model still writes "Rectangles arrived!" whimsy instead of the deck's dry plain register, and it occasionally narrates Puck in the third person. Mean length barely moves across mischief levels (131 / 136 / 106 chars at 12/45/85). That calibration curve is the fine-tune's primary job; the deck's three hand-written tiers per event are its gold supervision.
Swap rule: a candidate adapter must meet every target AND not regress any
metric by more than 0.02 vs the current generation. Metrics gate the swap;
a human reads the samples in data/eval_report_<tag>.json β charm isn't
programmatic.