sable-v22-canon โ€” hints, gameplay fixes, one combined run (2026-10-31)

The combined retrain from docs/gameplay-corpus-plan.md and docs/hint-system-plan.md: the v21 canon corpus plus the separate-call HINT shape, the gamer mid-game arc, steer/volunteer, long histories, unnamed referents, hard keys, and the contrastive classifier rows.

Weights: https://huggingface.co/Thingamatronics/sable-v22-canon (public). The merged fp16 model, the LoRA checkpoint-200, and the Q8_0 GGUF are there.

Data

build/train-canon.jsonl: 3,514 shipping rows from three signed batches.

batch rows what
CB-0005 2,936 v21 canon corpus (uppercase, fixed opening, arc)
CB-0006 137 separate-call HINT rows, 35 critical-path edges
CB-0007 441 gameplay corpus: A2/A3 classifier, B1-B5 speak

Slices: classify 2,485, reveal 345, converse 157, hint 137, offer 130, opener 59, end 77, volunteer 57, steer 47.

Settings

Qwen2.5-1.5B-Instruct, LoRA r=32 / alpha=64 / dropout=0.05, 3 epochs, lr 2e-4 cosine with 3% warmup, micro-batch 4 x grad-accum 4, seq-len 2,048, NEFTune 5, seed 42, bf16, gradient checkpointing. torch 2.8.0+cu128, transformers 4.57.6, peft 0.21.2. Stopped after step ~446 when the eval curve flattened; every checkpoint 25โ€“425 was kept.

Pod zizjjlxtwpmzni: 2,757 s, $0.4518 at $0.59/hr, terminated after fetch.

Checkpoint selection (generation eval, not eval_loss)

K=4 sampled replies at temp 0.8 / top_p 0.9 / max 256 / stop <|im_end|>, on the opening, the sick reveal, the Walter reveal, and a short converse. stop, upper, key are rates; bad counts asterisks/brackets/HTML/ third-person.

ckpt sick stop sick key sick p95c walter key walter p95c opening upper/bad
25 1.00 0.75 84 0.00 137 0.00 / 3
50 1.00 1.00 140 0.25 291 1.00 / 0
75 1.00 0.75 111 0.50 136 1.00 / 0
100 1.00 0.75 110 1.00 191 1.00 / 0
125 1.00 1.00 152 1.00 197 1.00 / 0
150 1.00 1.00 108 0.75 172 1.00 / 0
175 1.00 0.75 117 1.00 177 1.00 / 0
200 1.00 1.00 131 1.00 134 1.00 / 0
225 1.00 1.00 152 1.00 145 1.00 / 0
250 1.00 0.75 136 0.75 172 1.00 / 0
300 1.00 1.00 119 1.00 136 1.00 / 0
350 1.00 1.00 141 1.00 172 1.00 / 0
425 1.00 1.00 136 1.00 145 1.00 / 0

Chosen: checkpoint-200. 100% stop, 100% uppercase, 0 artifacts, sick and Walter keys 100%, shortest best-key Walter replies. The lowest eval_loss was step 425 (0.4214), but it is longer and no better on keys.

Merge: python merge.py --adapter out/sable-v22-canon/adapter/checkpoint-200 --out out/sable-v22-canon/merged. Verified tensor hash 06003b0b0eb1fb33. GGUF: Sable_v22_canon-Q8_0.gguf (Q8_0, 1.65 GB).

Runtime

  • mise run play:canon uses Sable_v22_canon-Q8_0.gguf with SABLE_NO_PENALTIES=1; the v20 penalty settings still collapse the uppercase model.
  • The classifier now labels the repeat denial ask_walter directly; the session's denial guard remains as a safety net.
  • HINT is a separate second pass; the edge hint.prompts is the direction, never displayed.

Probe (acceptance)

See probe-transcript.txt:

  1. opening: the fixed greeting, verbatim;
  2. lol what is this -> what_is_this, in voice;
  3. are you a bot -> ask_who, in voice;
  4. I'm fine -> ask_fine -> sick, gaslighting, key present;
  5. No I'm fine really -> ask_walter -> walter (raw classifier, not just the guard);
  6. who's walter -> ask_who_walter -> walt_class;
  7. did you kill him -> accuse, deflection.

Weaknesses

  • 3 of 140 HINT rows were rejected by their checks.
  • The 140 hint rows were assembled from the edge directions before the session-simulator emitter landed; the emitter is now in pipeline/corpus.py.
  • canon check still warns the floor stalls at ask_sleeper; that is the required-hint tradeoff.
  • Steer 47 / volunteer 57, just under the plan's >=60 each.
Downloads last month
49
GGUF
Model size
2B params
Architecture
qwen2
Hardware compatibility
Log In to add your hardware

8-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for Thingamatronics/sable-v22-canon

Adapter
(1708)
this model