Source pngwn/system-one-qwen3.5-4b-scorer@e6464dce15f013c2ef641593a85cc6afcdaea928 is the original System One scorer, with temperature 1.75. Its base is Qwen/Qwen3.5-4B-Base@1001bb4d826a52d1f399e183466143f4da7b741b (Apache-2.0); the scorer inherits the ticket training data’s non-commercial restriction and is cc-by-nc-4.0. The source card at lines 2 and 94–95 supplies that declaration; the source snapshot has no LICENSE file. The staged LICENSE is the official CC BY-NC 4.0 legal text.
The frozen Qwen3.5 S=1 graph is loaded from flat merged qwen3_5_text config and model.* tensors. Replace model.lm_head before checking for meta tensors with nn.Linear(2560, 1, bias=False) and load score.weight. The language metadata field vocab_size = 1 describes [1,1,1] output logits. The input embedding remains 248,320 rows. The supplied tokenizer has 248,077 entries; neither the embedding nor tokenizer is resized to the scalar output width.
The shipped metadata retains source revision e6464dce15f013c2ef641593a85cc6afcdaea928 and the exact decision block: scalar head, temperature 1.75, max_len 384, layout state-question-option, pinned base identifier and license cc-by-nc-4.0. Both modes use 32 layers: 24 linear-attention layers with loop-free single-step and eight full-attention layers. int8lin applies the existing block-32 symmetric-with-clipping linear quantizer; head, embedding, conv1d and norms remain FP16. in_proj_a and in_proj_b are quantized as linears but receive no LoRA update.
There are 400 LoRA tensors = 200 A/B pairs, plus one [1,2560] scalar head, rather than 400 pairs. Ten projection families are targeted: o_proj, in_proj_qkv, up_proj, k_proj, gate_proj, in_proj_z, out_proj, down_proj, v_proj, q_proj. Rank16, alpha32, no bias. The adapter did not pin a base revision, so this port fixes 1001bb4d826a52d1f399e183466143f4da7b741b explicitly. The author’s pad fallback executes only when pad is absent; the actual tokenizer already has pad = EOS =248044.
Call the author’s load_model(base, lora=False) on CPU FP32 and load the pinned PEFT adapter. Preserve this object for the canonical oracle, deepcopy it and merge the copy. The three-sequence maximum scalar error is 3.8743019104e-06 (tolerance1e-3), with the pooling hook confirming last-non-pad scalar equality. The text tower is stored BF16 and the score head FP32; the original BF16 score values cast losslessly to FP32. Merge proof occurs before tower storage rounding. The readout gates cover the stored graph’s precision. The actual int8lin LanguageBundle is 5,095,388,697 bytes, correcting the initial roughly4.3GB estimate; the FP16 embedding alone remains about1.27GB.
Import encode, score_options and softmax from the unchanged pinned system_one.py. Tokenize tail "\n\nQuestion:\n" + question + "\n\nOption:\n" + option with no special tokens. If tail length≥384, keep its last384 tokens. Otherwise tokenize "State:\n" + state, keep its prefix fitting 384-len(tail_ids), then append the complete tail. The state is cut from its end. Right padding in CPU batches uses EOS; last-non-pad pooling is equivalent to the bundle’s final row step because fixture rows contain no pad/EOS tokens.
Every option is one row. Start from fresh zero KV/conv/recurrent states and call the graph once per token with shapeS=1 and matching position. At slot=len(ids)-1, read logits[0,0,0]. Only after all options of one question have scalars, apply softmax(scalars/1.75) in option order. This is neither a letter-logit gather nor generation. noul options are yes/no in that order; Score options are ordered levels. Training’s16-option cap is not a readout restriction.
The canonical fixture has20 requests,48 questions,280 rows and schema coreai-scalar-fixtures/1; it is also the kit’s fixture. Six states exceed384 tokens and twelve rows are truncated. Four zoo-only questions have20–32 options. Both accepted bundles have48/48 argmax agreement, including46/46 at margin≥.02; max |
Δp | is0.003684332 fp16 and0.010874180 int8lin. Two near ties still agree. The readout’s mean averages options within questions, then questions; scalar errors average all option rows. |
On macOS27.0(26A428), use AOT h16c and SpecializationOptions.default(). Bound each Python process to at most15 row executions including reset checks because repeated runtime calls retain IOSurfaces. The first row is repeated with fresh states within workers and in a final new process; scalar bytes match. Both Release Swift engines receive raw ids, --max-tokens 1 --temperature 0.0 --warmup off, with COREAI_CHUNK_THRESHOLD=1.
With a one-wide head both engines always emit token id0; decoded text is meaningless. The eight engine calls prove that two rows per bundle load and complete with both engine variants. They do not prove Swift-side option probabilities, task accuracy, calibration or generation quality. The scalar probability proof is the Python GPU readout. Separately, the supervisor measured the kit’s sequential scalar engine using Decision.Format.scalar on 2026-09-23 09:05–09:25 JST: tokens and slots agree on 280/280 option rows and question argmax on 48/48 for both bundles. These supplied facts are recorded in measurements-coreai-kit.json, not re-derived here. All kit times are contended because the GPU was shared with two conversion runs. The kit reads the scalar metadata, preserves the author’s truncation, softmaxes option scalars at 1.75 and lists up to64 options. For the macOS-only system-one-scorer-4b catalog id with license: CC-BY-NC-4.0, kit catalog entry pending the Hub revision.
The quiet-window benchmark holds the GPU lock only during A, records process snapshots before/after, and executes six trials per engine at p128/g256. Pipelined/sequential median S=1 prefill proxies are89.347/76.039tok/s; decode rates are88.894/75.297tok/s, recorded only as rates. The benchmark’s one-wide output causes synthetic input/output id0. Real question cost includes every option row’s tokens; no decision latency is inferred from this synthetic rate.
../conversion/merge_system_one_scorer.py, ../conversion/export_system_one_scorer_decode_pipelined.py and ../conversion/scalar/README.md carry the runnable path. The model card, two recipes, canonical fixture, runtime transcripts and benchmark are together under models/system-one-scorer-4b/. Shipping uses copies of the accepted exports; the independent int8lin re-export comparison ignores only compilation.date in metadata and records IR sizes/hashes without requiring byte identity. No shared zoo mutation or publication is part of this run.