docs(card): estate audit 2026-09-25 — honest labels, dead links, metadata
#1
by betterwithage - opened
README.md
CHANGED
|
@@ -7,16 +7,44 @@ tags:
|
|
| 7 |
- doctrine-v11
|
| 8 |
- estate
|
| 9 |
- hub
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
---
|
| 11 |
|
| 12 |
# szl-training-scripts
|
| 13 |
|
| 14 |
The forge. Hub copy of the Unsloth-receipted training scripts. Tags were empty — this atelier is the card.
|
| 15 |
|
| 16 |
-
**Family.** estate · **Evidence.** HUB · **Weights.** none
|
| 17 |
|
| 18 |
Hub: [SZLHOLDINGS/szl-training-scripts](https://huggingface.co/SZLHOLDINGS/szl-training-scripts)
|
| 19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
## The cut
|
| 21 |
|
| 22 |
Training code is usually a gist. We give it a model id so the estate graph stays one piece.
|
|
@@ -29,9 +57,9 @@ A Hub id you can pin in a receipt: 'trained by this repo at this SHA'.
|
|
| 29 |
|---|---|
|
| 30 |
| Anthropic | No public train scripts for Claude. |
|
| 31 |
| NVIDIA | NeMo recipes. |
|
| 32 |
-
| Unsloth | The scripts wrap Unsloth. Cut is the receipt
|
| 33 |
|
| 34 |
-
|
| 35 |
|
| 36 |
## Intended use
|
| 37 |
|
|
@@ -40,6 +68,7 @@ Canonical train entrypoint.
|
|
| 40 |
## Limitations
|
| 41 |
|
| 42 |
- Not a checkpoint. Wire to GitHub kit in this atelier.
|
|
|
|
| 43 |
|
| 44 |
## Honesty
|
| 45 |
|
|
@@ -56,78 +85,32 @@ Apache-2.0. Copyright 2026 SZL Holdings · Stephen P. Lutar Jr. · ORCID [0009-0
|
|
| 56 |
|
| 57 |
## GitHub-aligned Python
|
| 58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
```python
|
| 60 |
-
|
| 61 |
-
# receipted_unsloth.py
|
| 62 |
-
# Silhouette: Unsloth FastLanguageModel QLoRA.
|
| 63 |
-
# Cut: dataset SHA, LoRA knobs, seed, and final loss go into a training receipt
|
| 64 |
-
# BEFORE merge. GGUF is derived — never the signed object.
|
| 65 |
-
|
| 66 |
-
from __future__ import annotations
|
| 67 |
-
|
| 68 |
-
import argparse
|
| 69 |
-
import hashlib
|
| 70 |
-
import json
|
| 71 |
-
import time
|
| 72 |
-
from pathlib import Path
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
def sha256_file(p: Path) -> str:
|
| 76 |
-
h = hashlib.sha256()
|
| 77 |
-
with p.open("rb") as f:
|
| 78 |
-
for chunk in iter(lambda: f.read(1 << 20), b""):
|
| 79 |
-
h.update(chunk)
|
| 80 |
-
return h.hexdigest()
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
def main() -> None:
|
| 84 |
-
ap = argparse.ArgumentParser()
|
| 85 |
-
ap.add_argument("--base", default="Qwen/Qwen2.5-1.5B-Instruct")
|
| 86 |
-
ap.add_argument("--data", default="doctrine.jsonl")
|
| 87 |
-
ap.add_argument("--out", default="out/adapter")
|
| 88 |
-
ap.add_argument("--r", type=int, default=16)
|
| 89 |
-
ap.add_argument("--seed", type=int, default=20260721)
|
| 90 |
-
ap.add_argument("--max-seq", type=int, default=2048)
|
| 91 |
-
args = ap.parse_args()
|
| 92 |
-
|
| 93 |
-
data_sha = sha256_file(Path(args.data))
|
| 94 |
-
from unsloth import FastLanguageModel
|
| 95 |
-
from datasets import load_dataset
|
| 96 |
-
from trl import SFTConfig, SFTTrainer
|
| 97 |
-
|
| 98 |
-
model, tokenizer = FastLanguageModel.from_pretrained(
|
| 99 |
-
model_name=args.base,
|
| 100 |
-
max_seq_length=args.max_seq,
|
| 101 |
-
load_in_4bit=True,
|
| 102 |
-
)
|
| 103 |
-
model = FastLanguageModel.get_peft_model(
|
| 104 |
-
model,
|
| 105 |
-
r=args.r,
|
| 106 |
-
lora_alpha=args.r,
|
| 107 |
-
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
|
| 108 |
-
lora_dropout=0,
|
| 109 |
-
bias="none",
|
| 110 |
-
use_gradient_checkpointing="unsloth",
|
| 111 |
-
random_state=args.seed,
|
| 112 |
-
)
|
| 113 |
-
ds = load_dataset("json", data_files=args.data, split="train")
|
| 114 |
-
trainer = SFTTrainer(
|
| 115 |
-
model=model,
|
| 116 |
-
tokenizer=tokenizer,
|
| 117 |
-
train_dataset=ds,
|
| 118 |
-
args=SFTConfig(
|
| 119 |
-
output_dir=args.out,
|
| 120 |
-
per_device_train_batch_size=2,
|
| 121 |
-
gradient_accumulation_steps=4,
|
| 122 |
-
max_steps=120,
|
| 123 |
-
learning_rate=2e-4,
|
| 124 |
-
logging_steps=10,
|
| 125 |
-
seed=args.seed,
|
| 126 |
-
),
|
| 127 |
-
)
|
| 128 |
t0 = time.time()
|
| 129 |
trainer.train()
|
|
|
|
| 130 |
model.save_pretrained(args.out)
|
| 131 |
loss = None
|
| 132 |
-
if trainer.state.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
```
|
|
|
|
|
|
|
|
|
| 7 |
- doctrine-v11
|
| 8 |
- estate
|
| 9 |
- hub
|
| 10 |
+
- training-scripts
|
| 11 |
+
szl:
|
| 12 |
+
doctrine: v11-LOCKED
|
| 13 |
+
artifact_class: SCRIPTS_AND_RECEIPTS
|
| 14 |
+
weights: UNAVAILABLE
|
| 15 |
+
evals: NOT_APPLICABLE
|
| 16 |
+
publication_eligible: false
|
| 17 |
+
card_resync: 2026-09-25
|
| 18 |
---
|
| 19 |
|
| 20 |
# szl-training-scripts
|
| 21 |
|
| 22 |
The forge. Hub copy of the Unsloth-receipted training scripts. Tags were empty — this atelier is the card.
|
| 23 |
|
| 24 |
+
**Family.** estate · **Evidence.** HUB · **Weights.** none (UNAVAILABLE on this Hub ID: scripts and receipts only)
|
| 25 |
|
| 26 |
Hub: [SZLHOLDINGS/szl-training-scripts](https://huggingface.co/SZLHOLDINGS/szl-training-scripts)
|
| 27 |
|
| 28 |
+
**Canonical source (GitHub):** the atelier kit lives in [`szl-holdings/a11oy`](https://github.com/szl-holdings/a11oy) under [`.github/atelier-kit/`](https://github.com/szl-holdings/a11oy/tree/main/.github/atelier-kit) (`receipted_unsloth.py`, `unsloth-recipes.json`, `cards/szl-training-scripts.md`, `kit-README.md`). The kit README names [`szl-holdings/szl-khipu`](https://github.com/szl-holdings/szl-khipu), [`szl-holdings/szl-forge`](https://github.com/szl-holdings/szl-forge) and [`szl-holdings/szl-nemo`](https://github.com/szl-holdings/szl-nemo) as its upstream sources. GitHub is canonical; this Hub repository is the mirror.
|
| 29 |
+
|
| 30 |
+
## Hub tree (OBSERVED 2026-09-25)
|
| 31 |
+
|
| 32 |
+
Listed through the Hub file API; the revision SHA was not captured by this pass. No weight file of any kind is present.
|
| 33 |
+
|
| 34 |
+
| Path | Bytes | What it is (from the file's own header) |
|
| 35 |
+
|---|---:|---|
|
| 36 |
+
| `receipted_unsloth.py` | 12,165 | "Receipted Unsloth — take the speed, bind the knobs, refuse the folklore." Unsloth QLoRA trainer with one `PROFILES` entry per organ (khipu, khipu-r2, receiptagent, willay, chaski, chaski-5050, chaski-r2), house seed 20260721, `--receipt-only` (mint the recipe receipt, no GPU) and `--list`. Same file name and byte size as the a11oy atelier-kit copy; the first ~3 KB were compared and match, the full-file digest was not compared. |
|
| 37 |
+
| `train_receipted_unsloth.py` | 12,431 | "Receipted Unsloth unique-cut GPU trainer. Runs on Hugging Face Jobs (A10G)." `uv run` script header; `--profile willay` / `--profile chaski`. |
|
| 38 |
+
| `train_willay.py` | 6,799 | WILLAY signed-refusal SFT LoRA script (base `Qwen/Qwen2.5-0.5B-Instruct`, target `SZLHOLDINGS/WILLAY`). |
|
| 39 |
+
| `train_cohort.py` | 17,351 | "CPU-train WILLAY + Chaski silhouettes. Measure kernels. No 1.5B retrain." NumPy silhouettes, seed 20260721, `--kernels-only`. |
|
| 40 |
+
| `szl_khipu_eval.py` | 10,412 | KHIPU-R2 held-out eval port (eval.jsonl 5 navigate + adversarial.jsonl 6; fp16 and optional 4-bit NF4 comparison). |
|
| 41 |
+
| `unsloth-recipes.json` | 16,247 | recipe table (same size as the atelier-kit copy). |
|
| 42 |
+
| `receipts/chaski-unsloth.json`, `receipts/chaski-5050-unsloth.json`, `receipts/chaski-r2-unsloth.json`, `receipts/willay-unsloth.json` | 1,592 / 1,638 / 1,587 / 1,641 | `szl.training_receipt.v2` receipts minted by the profile trainer (unsigned). |
|
| 43 |
+
| `training_receipt.unsloth.json` | 1,638 | profile `chaski-5050` receipt (`path_in_repo: adapter-unsloth`, train loss 0.5588 MEASURED, `evals: none-this-run`, energy UNAVAILABLE, `proven_trust: false`). |
|
| 44 |
+
| `provenance.json` / `status.json` / `LICENSE` | 1,755 / 1,394 / 11,357 | license-candidate records and standalone Apache-2.0 text. `status.json` keeps lineage, consent, privacy, training-suitability and deployment fields BLOCKED and `production_ready: false`. |
|
| 45 |
+
| `bom/model-bom.cdx.json` | 5,324 | CycloneDX BOM |
|
| 46 |
+
| `.gitattributes` | 1,519 | platform-managed |
|
| 47 |
+
|
| 48 |
## The cut
|
| 49 |
|
| 50 |
Training code is usually a gist. We give it a model id so the estate graph stays one piece.
|
|
|
|
| 57 |
|---|---|
|
| 58 |
| Anthropic | No public train scripts for Claude. |
|
| 59 |
| NVIDIA | NeMo recipes. |
|
| 60 |
+
| Unsloth | The scripts wrap Unsloth v2 profiles. Cut is unique knobs per organ, bound in the receipt. |
|
| 61 |
|
| 62 |
+
No equivalent public combination was found among the leaders surveyed above (a snapshot, not an ecosystem-wide novelty claim).
|
| 63 |
|
| 64 |
## Intended use
|
| 65 |
|
|
|
|
| 68 |
## Limitations
|
| 69 |
|
| 70 |
- Not a checkpoint. Wire to GitHub kit in this atelier.
|
| 71 |
+
- The receipts here are unsigned recipe/run envelopes; a receipt on this Hub ID does not by itself bind any adapter bytes on another repository.
|
| 72 |
|
| 73 |
## Honesty
|
| 74 |
|
|
|
|
| 85 |
|
| 86 |
## GitHub-aligned Python
|
| 87 |
|
| 88 |
+
An earlier version of this card embedded a code block that stopped mid-statement (`if trainer.state.log_hi`) and that did not match the `receipted_unsloth.py` actually stored on this Hub ID (it showed an older 2,932-byte single-profile variant with `--base/--r/--seed` flags, which still exists as `atelier/receipted_unsloth.py` in szl-khipu and szl-forge). That block is removed. What follows is quoted verbatim from the 12,165-byte `receipted_unsloth.py` on this repository (2026-09-25 read).
|
| 89 |
+
|
| 90 |
+
Usage lines from the module docstring:
|
| 91 |
+
|
| 92 |
+
```text
|
| 93 |
+
python receipted_unsloth.py --profile willay --receipt-only
|
| 94 |
+
python receipted_unsloth.py --profile chaski --data doctrine.jsonl --out out/chaski
|
| 95 |
+
```
|
| 96 |
+
|
| 97 |
+
The receipt-minting tail of `main()` — the point of the file: every knob lands in `training_receipt.json`, loss is read from the trainer log, and the envelope is meant to be signed before any merge:
|
| 98 |
+
|
| 99 |
```python
|
| 100 |
+
trainer = SFTTrainer(model=model, tokenizer=tokenizer, train_dataset=ds, args=SFTConfig(**sft_kw))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
t0 = time.time()
|
| 102 |
trainer.train()
|
| 103 |
+
Path(args.out).mkdir(parents=True, exist_ok=True)
|
| 104 |
model.save_pretrained(args.out)
|
| 105 |
loss = None
|
| 106 |
+
if trainer.state.log_history:
|
| 107 |
+
last = trainer.state.log_history[-1]
|
| 108 |
+
loss = last.get("train_loss") or last.get("loss")
|
| 109 |
+
extra.update({"final_loss": loss, "seconds": round(time.time() - t0, 3), "honesty": "REPORTED"})
|
| 110 |
+
rec = mint_receipt(args.profile, cfg, extra)
|
| 111 |
+
Path(args.out, "training_receipt.json").write_text(json.dumps(rec, indent=2) + "\n")
|
| 112 |
+
print(json.dumps(rec, indent=2))
|
| 113 |
+
return 0
|
| 114 |
```
|
| 115 |
+
|
| 116 |
+
`mint_receipt` refuses `proven_trust: true` and refuses any non-null `energy_j` ("refusing to fabricate joules"); the receipt records `"gguf": "derived — never the signed object"`. Read the full file on this repository or in the canonical kit linked above; do not treat this excerpt as the whole program.
|