The purpose-prefixed labels (hanzo-build-*, hanzo-deploy-*, hanzo-docs-build-*)
are retired in favour of the bare <os>-<arch> every runner already advertises.
They were not a capability, only a habit, and the habit cost builds: papers asked
for hanzo-build-linux-amd64, no online runner offered it, and two idle
linux-amd64 runners sat beside the queue while the build simply never ran. The
lux tree lost three days to lux-linux-amd64 the same way.
What a job is FOR is the workflow's name. runs-on is the machine it needs.
Co-authored-by: Hanzo Dev <[email protected]>
The purpose-prefixed labels (hanzo-build-*, hanzo-deploy-*, hanzo-docs-build-*)
are retired in favour of the bare <os>-<arch> every runner already advertises.
They were not a capability, only a habit, and the habit cost builds: papers asked
for hanzo-build-linux-amd64, no online runner offered it, and two idle
linux-amd64 runners sat beside the queue while the build simply never ran. The
lux tree lost three days to lux-linux-amd64 the same way.
What a job is FOR is the workflow's name. runs-on is the machine it needs.
Co-authored-by: Hanzo Dev <[email protected]>
runs-on named hanzo-build-macos-arm64. RUNNERS.md registers the Apple pool as
hanzo-build-darwin-arm64 (with metal, m4max and dbc alongside it), and a job
asking for a label nobody carries is accepted and queued rather than refused —
so this leg has been sitting in a queue while its sibling job, on a registered
label, ran and made the repo look like it had CI.
Co-authored-by: Hanzo Dev <[email protected]>
Rollouts go through a KV cache (prompt prefilled once per group, one decode
step per token); cached logits match the full forward to 1e-4. GRPO runs end
to end on Metal — a mixed group at step 5 gives reward 0.75, loss −0.032,
gradient norm 1.19 — after the clipping reduction stopped going through f64,
which Metal does not have.
gym synth ports Data Designer's core: sampler, expression and LLM columns
(text, structured, judge) generated per row in dependency order against any
OpenAI-compatible endpoint, validators that drop or regenerate, jsonl or
parquet out.
gym trainjob is the Kubeflow TrainJob entry for the hosted fine-tuning API:
the broker's env contract becomes a Config; METHOD=lora is served, qlora and
full are refused by name. Dockerfile.cuda and image.yml build
ghcr.io/hanzoai/gym on the forge runners.
84 tests.
Co-authored-by: Hanzo Dev <[email protected]>
model: one trainable Llama-family decoder (Qwen3 with q/k norm, Llama) built
from differentiable hanzo-nn primitives, LoRA on the projections the config
names, PEFT adapter save/load/merge; logits match hanzo-transformers to 1e-4.
data: chat_template / alpaca / completion with Axolotl's label semantics
(dummy-render turn spans, train_on_eos), jsonl/json/parquet, HF datasets and
split grammar, seeded shuffle, validation tail, GRPO prompts, collate.
train: chunked masked cross-entropy, warmup + cosine/linear/constant,
accumulation, global-norm clipping, AdamW, checkpoints, eval.
grpo: the hanzo-training core ported unchanged in its math, with LmPolicy
over CausalLm (batched masked scoring), exact/numeric/format/length/http
verifiers.
61 tests. gradient_checkpointing, QLoRA, full fine-tune, multi-GPU and the
DPO family are rejected at config load rather than approximated.
Co-authored-by: Hanzo Dev <[email protected]>