Skip to content

COB-561: Decision 2.0 (vllm-sr) as the family decision2, and the 2026.10 edition's 0.18.0 backlog - #153

Merged
cobanov merged 12 commits into
mainfrom
cob-561-decision2
Oct 26, 2026
Merged

cobanov merged 12 commits into
mainfrom
cob-561-decision2

Conversation

@cobanov

@cobanov cobanov commented Oct 25, 2026

Copy link
Copy Markdown
Member

COB-561: Decision 2.0 by vllm-sr (Kai-0.6B, Eos-0.8B, Sol-2B, Nox-4B, Lux-9B; Apache-2.0) as the new family decision2, plus the 2026.10 edition's backlog: the 0.18.0 tags bench_plan listed as unmeasured.

Decision 2.0

No new engine. Decision 2.0 is Decision 1.0's graph (backbone + the 10-tensor endpoint head) retrained, so it runs on decision's ONNX graph and Rust engine with a new layout, decision2-endpoint-v1 (prompt version decision2-segmented-options-global-query-v1).

  • Kai is a decoder now: Qwen3-0.6B-Base (28 causal layers, 8,192 tokens, its own tokenizer); Decision 1.0's Kai was an encoder. Its rows pad to 8 (seq_multiple); the Qwen3.5 models keep 64.
  • What changed from 1.0 (spec: docs/families/decision2.md):
    • noul defaults are "No" / "Yes", and caller order is kept when both sides are given; the engine still returns [false, true] (DecisionRow::true_first);
    • stricter json_payload checks (state, instructions, descriptions, levels), each one a goldens case;
    • Kai's score_bias.json: fixed offsets on five-level score logits, carried in decision.json and added in f64.
  • No calibration file, so probabilities are the plain softmax (T=1), as upstream.
  • Weights in memory: Nox and Lux keep BF16 weights in BF16 (weights_in_memory, over 6 GiB of BF16 bytes), as decider does.
  • Out of scope: the 27B Vega, share_context, the GGUF builds.

Code: convert/ollaya_convert/families/decision2/ (layout, reference, export, goldens), crates/ollaya-decision/src/decision.rs and crates/ollaya-runner/src/decision.rs (prompt version 2), the catalog entry, the site overlay and library page, and the family doc.

Parity (K1, K2 on hope)

The goldens come from each repo's own decision2 runtime in fp32: 107 records, 132 cases, 463 questions. The Python port reproduces the author's rows and positions before each record is written.

Tag decisions agree max |Δ logit| CUDA / CPU max |Δ prob| CUDA / CPU
kai 100 % 3.0e-5 / 2.7e-5 1.5e-6 / 2.1e-6
eos 100 % 1.3e-5 / 2.0e-5 2.5e-6 / 4.8e-6
sol 100 % 1.0e-5 / 8.4e-6 2.4e-6 / 2.1e-6
nox 100 % 1.6e-5 / 1.1e-5 4.6e-6 / 2.6e-6
lux 100 % 4.2e-5 / 5.0e-5 (smoke) 5.2e-6 / 2.9e-6 (smoke)
  • 0 rejection or encoding mismatches; all 25 upstream rejections are reproduced.
  • The wire answers equal the author's up to 4-decimal rounding.
  • Records: results/runs/2026-10-25-parity-rtx5090-{cuda,cpu}-cob561.json. The Lux CPU smoke is not recorded (parity_run records full sets only).
  • Tolerances are unchanged.
  • Two of the author's answer conventions differ from /v1/systemone by design, and parity_decision reads them in the author's form: the entropy confidence, and non-text score levels written into the legend as canonical JSON text. Ollaya's API is unchanged.
  • Fixed on the way: the one_too_long case was 16,275 tokens on the 16k models, under their limit. Upstream accepted it, and math-SDPA asked for 31.6 GiB on Nox and Lux. It is now over every limit. Goldens are written aside and moved into place when complete, so a crashed run can no longer leave a partial file that passes parity.

Registry

  • Manifests for kai, eos, sol, nox and lux (latest → nox: your call), with their kept copies.
  • Weights come from Hugging Face at the pinned commits (sha256 = the LFS oids). The graph, decision.json, calibration.json and license blobs are not uploaded. They are on hope: hope-wsl:~/Developer/ollaya-decision2/registry/blobs.

Bench (one session on hope, RTX 5090, the machine otherwise idle)

bench_plan (edition 2026.10) listed 13 tags, about 1,006 minutes:

  • the five decision2 tags (new);

  • d1-omni:600m, gliclass-v4:2b, gliclass-v4:9b, strands-decider:e2b and strands-decider:e4b (new tags);

  • decider:2b and decider:4b (new weights);

  • sura:0.8b (see below).

  • 0.18.0 tags: the installed 0.18.0 release (sha256-checked archives), pulled from ollaya.dev. Merged with bench_edition --update 0.18.0 --label r0180.

  • decision2: this branch's build, pulled from the candidate registry above. Merged with --update 0.19.0 --label cob561, following COB-560/562, which were measured on 0.17.0 and filed under 0.18.0.

    • Its accuracy suites ran on the branch's pre-rebase build (0.17.0 base, 68dddcc). 0.17→0.18 touches only decima's ordinal and the version, no decision code.
    • Latency ran on the rebased build (ce32259).
  • Every pulled manifest's digest matches the registry: main's for the 0.18.0 tags, this PR's for decision2.

  • Latency ran with no other GPU job, after parity and accuracy. A run is repeated if another process went above half a core.

decision2 (--update 0.19.0 --label cob561)

Tag Score (95 % CI) typed-decisions public macro acc. pooled ECE RTX 5090 p50 CPU p50 VRAM
decision2:lux 63.2 (61.3–65.2) 0.707 0.756 0.056 364 ms 18670 ms 20,349 MB
decision2:nox 60.9 (58.7–62.9) 0.680 0.746 0.050 250 ms 12130 ms 12,387 MB
decision2:sol 50.0 (47.8–52.2) 0.554 0.678 0.053 89 ms 4637 ms 11,027 MB
decision2:eos 47.0 (44.8–49.0) 0.460 0.661 0.093 68 ms 3226 ms 5,909 MB
decision2:kai 38.0 (35.7–40.2) 0.476 0.608 0.046 31 ms 1798 ms 3,701 MB

0.18.0 tags (--update 0.18.0 --label r0180)

Tag Score (95 % CI) typed-decisions public macro acc. pooled ECE RTX 5090 p50 CPU p50 VRAM
strands-decider:e4b 64.6 (62.8–66.5) 0.699 0.765 0.039 213 ms 9440 ms 15,813 MB
decider:4b 64.5 (62.4–66.6) 0.678 0.769 0.094 196 ms 9763 ms 11,279 MB
gliclass-v4:9b 64.3 (62.5–66.2) 0.650 0.763 0.034 263 ms 12977 ms 21,493 MB
gliclass-v4:2b 59.1 (57.2–60.9) 0.589 0.731 0.031 82 ms 3571 ms 9,127 MB
strands-decider:e2b 58.0 (56.0–60.0) 0.646 0.716 0.065 116 ms 5541 ms 10,323 MB
decider:2b 57.5 (55.4–59.5) 0.608 0.724 0.089 84 ms 3963 ms 8,463 MB
d1-omni:600m 45.5 (43.5–47.7) 0.575 0.639 0.075 17 ms 960 ms 2,681 MB
sura:0.8b 37.2 (34.9–39.5) 0.560 0.586 0.057 69 ms 1655 ms 4,293 MB
  • Every run row's digest equals its manifest in this PR's registry/.
  • New weights: decider:2b went from 54.3 to 57.5 and decider:4b from 62.9 to 64.5.
  • sura:0.8b scores 37.2 at the shipped digest, the same as the 2026-10-23 rows had under the unshipped one.
  • Five latency runs were repeated: the "another process above half a core" check caught our own exiting runner (<defunct>). Once, for sura:0.8b on CUDA, the first run really was slowed (131 ms against 69 ms on the repeat).
  • Site: npm run readme and npm run build pass, and every decision2 {{result …}} resolves. The build ran with OLLAYA_ALLOW_MISSING_BLOBS=1, because the blobs aren't in this worktree and decision2's aren't published.

sura:0.8b: "the edition's manifest is not kept in the registry"

  • Cause: 09cdeb0 (PR sura:2b and sura:0.8b, Ollaya's own decoder decision models (COB-552) #138, adding sura:2b) changed the family's license_text ("Base models: Qwen3.5-0.8B-Base and Qwen3.5-2B-Base").
    • Repackaging rewrote sura:0.8b's license layer (8c0b6089… → e883397b…) and its manifest digest (b5a8e8f4… → 473fa350…), and deleted the kept sha256-b5a8….
    • The edition's runs (2026-10-23) record b5a8e8f4…, a digest that never shipped: its license blob is 404 on ollaya.dev.
    • Graph, weights and tokenizer are unchanged.
  • Fix: restoring the kept manifest would vouch for a digest nobody can pull, so sura:0.8b is measured again in full at the shipped digest 473fa350….
  • Rule for the future: a new tag gets its own license_text instead of changing the family's.
  • Possible tooling follow-up: bench_plan could tell a license-only manifest change from a graph change.

🤖 Generated with Claude Code

https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631

cobanov and others added 12 commits October 25, 2026 16:58
…ldens) on decision's graph (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
…ision 2.0's options and checks, Kai's score offsets, noul order) and weights_in_memory (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
… cases, and the split reference for Lux (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
…non-text levels as canonical JSON) (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
…carry it; a test reads it through the engine's config (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
… as stored), and the family doc (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
…t 1,800 repeats it was 16,275 tokens, under 16,384) (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
…so a crashed run leaves no partial file (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
…arity text and the family doc's measured parity (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
… nox); the blobs stay on hope (COB-561)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
…18.0 tags bench_plan listed (r0180) (COB-561)

The 0.18.0 tags d1-omni:600m, gliclass-v4:2b, gliclass-v4:9b, strands-decider:e2b, strands-decider:e4b,
decider:2b, decider:4b and sura:0.8b were measured on the installed 0.18.0 release, and decision2 on this
branch's build. All of it ran in one session on hope (RTX 5090). sura:0.8b is now measured at its shipped
digest 473fa350.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015d6aog1XGFWMuJcCm5F631
@cobanov
cobanov merged commit 549b9b6 into main Oct 26, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant