-
models.txtupdated: Opus/Sonnet/Haiku 4.7, GPT-5.2/5.4/5.5/5.5-Pro, Kimi K2.6, Gemini 3.1 Flash Lite, Qwen 3.6-35B-A3B, Ternary-Bonsai-8B -
models.confupdated with provider routing for 4.7 family + mlx -
run_matrix_v41.py— resumable coordinator with per-cell state -
archive_v40_kernel.sh— moves kernel/kernel-cpu dirs aside pre-sweep -
smoke_test_new_models.sh— 1 benchmark per new model, pre-flight check
ostk --versionflips from4.0.0to4.1.xostk mlxsubcommand becomes available- Confirm MLX arm wiring — see "MLX arm resolution" below
cd ~/projects/haystack
git pull
make install # or: cargo install --path .
ostk --version # should show 4.1.x
ostk mlx models # should list MLX models (smoke test for v4.1)
cd ~/projects/needle-bench
./smoke_test_new_models.sh 2>&1 | tee smoke.log
Expect: most cells PASS. Any FAIL means: bad model ID, missing vendor CLI, or docker wiring issue. Fix before proceeding.
If GPT-5.5 IDs are wrong, edit models.txt + run_matrix_v41.py roster.
# Start mlx_lm.server for the bonsai model
ostk mlx start --model prism-ml/Ternary-Bonsai-8B-mlx-2bit
ostk mlx status # confirm "ready"
# Smoke test it
RUN_MLX=1 ./smoke_test_new_models.sh # runs just the MLX cells
./archive_v40_kernel.sh
# moves runs/*-kernel runs/*-kernel-cpu -> runs-v4.0-archive-YYYYMMDD/
# native dirs stay put (native arm is ostk-version-independent)
# Full matrix: existing models (kernel arms only) + new models (all arms)
nohup python3 run_matrix_v41.py --ostk-version-gate 4.1 2>&1 | tee matrix-v41.log &
# Progress:
tail -f matrix-v41.log
# Or count completions:
wc -l runs/.state.jsonl
Just re-run the same command — it reads runs/.state.jsonl and skips:
- cells with score files
- cells marked
successin state - cells marked
transient_failthat exhausted retries (unless--retry-failed) - cells marked
failed(unless--retry-failed)
# Look at the punch list printed at end of run_matrix_v41.py
# Investigate individual failures:
ostk bench <bench> --model <model> <arm-flags> --docker --keep
# Once fixed, retry the whole failed-cell set:
python3 run_matrix_v41.py --retry-failed
run_matrix_v41.py auto-invokes consolidate_scores.py on clean completion.
To run manually:
python3 consolidate_scores.py
# Writes public/scores.json + public/experiment-scores.json
# Just the new Anthropic family
python3 run_matrix_v41.py --model claude-opus-4-7 --model claude-sonnet-4-7 --model claude-haiku-4-7
# Just one arm across everyone
python3 run_matrix_v41.py --arm kernel-cpu
# Single benchmark across the new models
python3 run_matrix_v41.py --only-new --bench auth-bypass-path-traversal
# Dry-run (no execution, no state writes)
python3 run_matrix_v41.py --dry-run --only-new
As of v4.0.0, ostk bench has no MLX path. One of the following lands with v4.1.0:
Option A — --driver mlx flag (most likely; mirrors --driver cpu):
ostk bench <bench> --model ternary-bonsai-8b --arm kernel --driver mlx --local --docker
Score dir: runs/ternary-bonsai-8b-kernel-mlx/
→ In run_matrix_v41.py, add "kernel-mlx" to ARM_FLAGS with ["--arm", "kernel", "--driver", "mlx", "--local"].
Option B — model prefix routing (mlx/ → use mlx driver automatically):
ostk bench <bench> --model mlx/ternary-bonsai-8b --arm kernel --local --docker
Score dir: runs/mlx-ternary-bonsai-8b-kernel/
→ In coordinator, use the prefixed name in the roster.
Option C — openrouter with base_url override (mlx_lm.server exposes OpenAI-compatible API):
OPENAI_BASE_URL=http://127.0.0.1:11942/v1 \
ostk bench <bench> --model prism-ml/Ternary-Bonsai-8B-mlx-2bit --arm kernel --local --docker
Decision: run one smoke cell under each option at v4.1.0 drop. Whichever produces a valid score file is the one we adopt. Update run_matrix_v41.py roster + ARM_FLAGS accordingly before the sweep.
~1100 cells pending (new models + kernel arms re-run on existing). At avg ~$0.05/cell (mix of Haiku/Flash/cheap-tier) with Opus 4.7 / GPT-5.5-Pro at $0.50+:
- Estimate: $150-300 for the full sweep.
- GPT-5.5-Pro alone across 40 benchmarks × 2 arms at ~$1/bench = ~$80.
runs/.state.jsonl — append-only, one JSON row per attempt:
{"ts":"2026-04-23T...","model":"claude-opus-4-7","bench":"auth-bypass-path-traversal","arm":"kernel","status":"success","attempts":1,"tail":"(42s)"}Latest row per cell wins. Safe to delete to force a full re-run (combined with archive or score-file cleanup).