Repository navigation
Conversation
- recipe/vela/export_native.py: gate-verified export into a native bundle — 320 backbone tensors re-keyed backbone. -> model. with per-tensor dtypes preserved (204 BF16 Linear/conv1d + 116 F32), the 37 F32 heads incl. the side-loaded broad span head in one file, backbone_config at the config root (the family Config::load shape), and a manifest pinning the source revision, the gate table, the tensor inventory and every bundle file's SHA-256. - src/models/vela/native (omni-vela-native): the bundle manifest gate and the wire admission mirroring protocol.py and the pinned runtime's preamble with byte-equal 422/400 bodies. - recipe/vela/export_token_plan.py and five frozen token plans under tests/vela/fixtures/: the predict mapping, the row decomposition and the rendered records (p_ids, blocks, readout positions, truncation, a windowed long-span case); example-request totals 1,041 tokens, matching the oracle's usage. Checks: cargo test (15 tests, no weights, no GPU), fmt/clippy clean, mkdocs --strict.
The Rust processing of the native path, mirrored from the pinned runtime and checked field-for-field against the five frozen token plans (opt-in render parity with the exported bundle's tokenizer): - state.rs: the state -> typed-parts mapping (role grouping, field ranges, canonical DEV2.0 JSON) with the pinned rejection triples; - questions.rs: the SystemOne -> predict mapping — the validation walk and order, Noul folded into a two-option choice (choice renders [ABS], the reference's abstain default), over resolution, threshold/head carried, the set-label collision check; - words.rs: the GLiNER2/CJK _WORD splitter and the first-token word mapping; - render.rs: the encoder (char-offset tokens, memoized), the six-rule span-head dispatch with the hallucination-alias label replacement, the truncation budget, the DEV2.0 rendering (parts pass, question blocks with option ends and query positions, span layout a/c with word positions) and the window rows (head only, as the reference); - processing.rs: the Processor over the exported bundle. Also: the envelope error locs are flat arrays, matching the reference triples exactly. Checks: cargo test (26 tests) + fmt/clippy clean + opt-in render parity (5/5 fixtures).
The Rust processing of the native path, mirrored from the pinned runtime and checked field-for-field against the five frozen token plans (opt-in render parity with the exported bundle's tokenizer): - state.rs: the state -> typed-parts mapping (role grouping, field ranges, canonical DEV2.0 JSON) with the pinned rejection triples; - questions.rs: the SystemOne -> predict mapping — the validation walk and order, Noul folded into a two-option choice (choice renders [ABS], the reference's abstain default), over resolution, threshold/head carried, the set-label collision check; - words.rs: the GLiNER2/CJK _WORD splitter and the first-token word mapping; - render.rs: the encoder (char-offset tokens, memoized), the six-rule span-head dispatch with the hallucination-alias label replacement, the truncation budget, the DEV2.0 rendering (parts pass, question blocks with option ends and query positions, span layout a/c with word positions) and the window rows (head only, as the reference); - processing.rs: the Processor over the exported bundle. Also: the envelope error locs are flat arrays, matching the reference triples exactly. Checks: cargo test (26 tests) + fmt/clippy clean + opt-in render parity (5/5 fixtures).
- heads.rs: CandidateHead (option-end + query hiddens; bilinear + scalar-MLP, [ABS] last), both SpanHeadV2 instances (router and the side-loaded broad head) and set_bias, loaded from the exported bundle's heads.safetensors — plain float32, the reference's own autocast-off setting (erf-based GELU via libm). - scoring.rs: the calibration mirror — per-type temperatures, set thresholds, the PII length rule (log-space interp) and sparse gate, span thresholds by id/label set, softmax/sigmoid, span_decode_r4 (word units, unit vote, fill, edge/URL trim), label aliasing, score value normalization (i/(n-1)), and the window aggregation (mean over covering windows, -30 uncovered). - recipe/vela/export_head_inputs.py and the recorded head-input fixtures: the reference's consumed hidden states, its head logits and its calibrated predict answers for the five frozen cases. Opt-in parity (VELA_NATIVE_BUNDLE): five cases, head-logit drift <= 3.8e-5, predict-answer drift <= 7.3e-7 (the windowed long-span case exact), discrete picks, span structures and threshold rules equal.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
…processing # Conflicts: # Cargo.toml # README.md # docs/supported-models.md # recipe/README.md
…heads # Conflicts: # Cargo.toml # README.md # docs/supported-models.md # recipe/README.md
2564709 to
ba86215
Compare
…ows alongside the Clef/pplx-decider additions
… add the Clef/pplx rows
…native-processing # Conflicts: # recipe/README.md
…heads # Conflicts: # recipe/vela/native.md
hsliuustc0106
left a comment
There was a problem hiding this comment.
Draft review — PR #176 (first-pass review; not posted)
PR: #176 "vela: add the 0.8B native F32 heads, scoring and span decoding"
Reviewed head: c2d704d71cb67ea64b4b0ace60be349b53437d1c (matches the API head.sha; non-draft, open, base main)
Own delta: 21 files, +1615/−16 over #175 (0f1e4da5..c2d704d7); 8 first-parent commits incl. 3 merges.
Stack position
Second slice; 0f1e4da5 (#175) is an ancestor of this head (verified), and this head is an ancestor of #177/#195. Review scope here: the delta only — the #175 findings (exporter staging P2, recorder pinning P3, single-level walk P3) are filed there and apply unchanged to this tree.
- The parallel-line duplication risk materialized in this slice's history: the heads branch carried its own copies (
9812853b"token-level processing",7d50f571heads/scoring) merged at6bedca90"keep the canonical shared layer". Verified the resolution is real:git diff 0f1e4da5..c2d704d7touches only heads/scoring/exporter/docs — the canonical processing layer survived untouched, the duplicate was dropped. Alsodf901b24"restore float_roundtrip and drop the duplicate sha2 dev-dependency" — the parallel line had dropped serde_json'sfloat_roundtrip(which would have broken f64 shortest-repr parity) and duplicated sha2; both restored. Churn caught before merge; fine, but this is the slice where divergence could have silently shipped.
Numerics (own delta deep-dive)
- F32 heads (
src/models/vela/native/src/heads.rs): per-tensorDtype::F32enforced on load; erf-based GELU vialibm::erff; LayerNorm with PyTorch defaults (eps 1e-5); CandidateHead bilinear + scalar-MLP faithful to the described reference module; span-head slot embedding clampedindex.min(slots-1)(beyond-64 labels share the last slot — matches the recorded fixtures). - Tolerances, measured-then-declared: the test gates default to logit 4e-5 / answer 1e-6, env-overridable tighten-only (
.min(default)clamp — cannot be loosened);recipe/vela/native.mdrecords the measured maxima (3.8e-5 / 7.3e-7) next to the gates, and the body has the per-case table (worst 3.719e-5 / 7.252e-7; long-span answer drift exactly 0.0). Precedent bar met. - Structural drift scoring (
44012d6e):max_driftscores a missing key/array-length mismatch/unequal non-number as full 1.0 — a structural mismatch can no longer hide under a small numeric gate. Good. - FP64 calibration path (
scoring.rs): softmax/sigmoid in f64 with max-subtraction; the Valen CPython-float concern is covered at the assertion level —json_f64emits shortest-roundtrip f64 (serde_jsonfloat_roundtrip, restored indf901b24) and the answer comparison asserts ≤1e-6 drift with exact discrete picks rather than byte-equality of reprs, which is the right call given numpy-pairwise vs Rust-sequential summation can differ in the last ulp. - Determinism: the span unit-vote tie-break deliberately accumulates in a Vec keyed by first occurrence instead of a HashMap, and the winner scan keeps the first strict maximum — matches Python
max()semantics; documented in-code. - Span decode edge cases covered by fixtures: CJK (code-point indexing — the
cca9174abyte-offset fix is in this slice's base), windowed long-span beyond HYBRID_RMAX, score kind, threshold overrides,[ABS]slicing, label aliasing, PII length rule + sparse gate second pass.
Findings (own delta)
- P3 — window aggregation is O(tokens × original words) per span question.
src/models/vela/native/src/scoring.rs:612matches each window token's offsets by linearposition()overoriginal_offs— ~1800 × ~7700 comparisons on the long-span fixture, growing quadratically toward the 16,384 max_length. Trigger: longover=requestspan questions. Consequence: latency only, no correctness effect. (Fixed in the stack: #195'se5a16849indexes the aggregation with a HashMap.) - P3 (inherited tree, filed at #175, restated for this slice's record): exporter writes without atomic staging; fixture recorders don't call
verify_packageat this head.
Notes
Heads::loadhardcodes HIDDEN=1024 / HEAD_DIM=256 / slots=64 at this head ("for this member" per the comment) — acceptable for the 0.8B-only slice; #195 derives widths from tensor shapes and adds the empty-slot-table refusal (67991a9a).export_head_inputs.pyrecords hidden states as frozen safetensors (weight-free head tests), CPU FP32 with autocast off — the deterministic setting, properly documented.- Registration updated coherently in this slice: README row adds "F32 heads", supported-models adds "and scoring", recipe checklist adds the heads replay command.
recipe/README.mdunchanged from #175 (still accurate). - Body: template answers present, checklist complete, pins its own head
c2d704d, per-case drift table included, "Not measured: GPU, performance" stated. - CI observed at the exact head
c2d704d7: workflow runs CIsuccess, Docssuccess; check-runs benchmarks/build/cuda-compile/cuda-contract/rust allsuccess, deploy skipped (Actions API, ThinkFlowLab/system1-omni; system1-agents has none for these SHAs). Combined status reads "pending" with zero status contexts — quirk as at #175.
Verdict: COMMENTED
Own-delta numerics are in good shape (measured-then-declared gates, tighten-only env, structural drift scoring, deterministic tie-breaks). COMMENTED rather than APPROVE solely because the reviewed tree still carries #175's P2/P3 export-contract findings (unchanged in this slice) and the O(n²) aggregation note above; both are resolved later in the stack (#195).
Review follow-up on the export recipe, kept minimal, mirroring the valen export precedent: - export_native.py stages the bundle set in a sibling directory and moves it into place with one rename, so a crash or a full disk mid-export can no longer strand a partial bundle under --out. The same staging covers the optional --bf16-out backbone directory. A non-empty target is refused and a stale staging directory from a killed run is cleared by the next run with the same target. - native.md records the staging behavior next to the export command. The written bytes are unchanged; only the path they take to the final directory differs. stage_into_place behavior checks and PYTHONPATH=src pytest tests/vela (135 passed) run at this head.
hsliuustc0106
left a comment
There was a problem hiding this comment.
Pass-107 fix-delta review — #176 (vela: 0.8B native F32 heads, scoring and span decoding)
Head reviewed: 86f689850 (model/vela2-native-heads) — pushed after pass-102's review of c2d704d71. OPEN, non-draft. Base: main.
Delta reviewed this pass
Exactly as declared — one merge, zero authored commits:
86f68985"Merge branch 'model/vela2-native-processing' into model/vela2-native-heads" (parentsc2d704d7+b9a60c0e). Combined diff (git show --cc) is empty → a pure absorption of #175's atomic-staging fix; no manual resolution hunks. Net diff vs first parent: 2 files, +52/−21 (export_native.py,native.md), i.e. exactly #175's fix.
Stack integrity
b9a60c0e ⊆ 86f689850 ⊆ #177's 65766b834 ⊆ #195's 7b60e4ec1 — all verified with git merge-base --is-ancestor. First-parent chain at the new head: 86f68985 on c2d704d7, nothing else added. The stack is intact.
Prior findings — status at this head
| Pass-102 finding | Status at 86f689850 |
|---|---|
P3 — O(n²) window aggregation (aggregate_windows per-window position() scan over original_offs) |
STILL OPEN at this head. src/models/vela/native/src/scoring.rs:600-615 at this head still does original_offs.iter().position(…) per (window, span) pair — quadratic in the number of windows. The fix is #195's e5a16849 (HashMap first-match index, or_insert(u)), which lives only on model/vela2-4b-9b: verified present at 7b60e4ec1 (or_insert ×1, position scan ×0) and absent from this branch's lineage. Note this fix predates this pass (it was already at pass-102's 71c18940); the stack, not this PR, carries it. |
(The pass-102 review had no other open findings on #176.)
New findings
P3 — body head pin is one merge behind. Test Plan pins "model/vela2-native-heads @ c2d704d" and line 1 says "review the last commit only", which described the pass-102 head; the new head 86f68985 (the absorbing merge) is not recorded anywhere in the body. Mitigation: the merge is content-pure (empty combined diff), so every body claim that was true at c2d704d remains true of this PR's own layer at 86f68985 — this is a pin-freshness nit, not a claims problem. Fix: bump the pin or add a one-line "head updated to 86f6898 (absorbs #175's atomic staging)" note, as done in the #195 body.
Numerics contract
Untouched by this delta: the merge brings only export_native.py/native.md staging text; scoring.rs, heads.rs, gates and the recorded maxima (3.719e-5 / 7.252e-7 etc.) are byte-identical to the pass-102 head (git diff c2d704d7 86f68985 --stat shows only the two export/doc files). Gates remain tighten-only; nothing measured changed.
Verification (sources kept separate)
- Source inspected:
git show --cc 86f689850(empty),git diff c2d704d7 86f68985;scoring.rsat this head vse5a16849's fix at7b60e4ec1. - Commands run: rev-parse (head matches
86f689850c4…);git merge-base --is-ancestor×3; first-parent log;grepforposition-scan /or_insert/total_cmpat this head (1 / 0 / 0 — the P3 stands here). - Observed CI: no Actions runs at
86f689850on eitherThinkFlowLab/system1-omniorInferMatrixLab/system1-omni; latest green on this branch is atc2d704d71(CI 40277592350, Docs 40277592361, 2026-10-26). Mitigated by the green run at descendant7b60e4ec1(2026-10-31, success). - Author-reported: nothing new this pass (the delta contains no commit message beyond the merge subject).
Template
All four required contributor answers, PR-needed decision, Test Plan, Test Result, Demo/evidence and Self-review checklist present; evidence tables unchanged and still accurate for this PR's layer.
Verdict: COMMENTED
Clean merge hygiene and no regressions, but the O(n²) aggregation P3 is still open at this head (fixed only in #195's lineage) and the body pin wasn't refreshed. Both are satisfied once the series merges.
|
Addressed: added a one-line head-update note pinning |
- Bundle::load now requires the manifest's own SHA-256 as an anchor, so files_sha256 is checked against a digest fixed outside the bundle directory instead of against itself: rewriting the manifest after swapping a file no longer passes the gate. The exporter prints the digest at the end of a successful export; Processor::load takes it as pinned_manifest_sha256 and the opt-in checks read VELA_NATIVE_MANIFEST_SHA256. - files_sha256 keys must be plain relative names inside the bundle and must not cross a symlink at any level (pinned_path checks every component with symlink_metadata). - the encoder's tokenizer failure path is a controlled 500 RequestError instead of unreachable! (encode/ids/ids_offsets return Result; render and prepared_parts propagate), the two onig patterns compile once per process instead of per request, and the encode memo is capped (whole-table reset at 4096 entries) instead of unbounded. - four new always-run gate regressions: rewritten-manifest anchor refusal, an absolute key, a parent-escaping key, a symlinked key. cargo test -p omni-vela-native --locked: 31 passed, 1 ignored (was 27/1; bundle gate 7 -> 11). clippy -D warnings, fmt and pytest tests/vela (135) green.
Heads::load and Calibration::load now take pinned_manifest_sha256 and run Bundle::load first, so the F32 heads and the calibration are only read after every file in the bundle directory has matched the anchored manifest — the direct std::fs::read path bypassed the gate entirely. The opt-in heads parity check reads the anchor from VELA_NATIVE_MANIFEST_SHA256, like the processing check. This merges model/vela2-native-processing at eec1fe6 (anchored manifest gate, plain-relative symlink-free files_sha256 keys, controlled tokenizer failure path, per-process onig patterns, capped encode memo, four new gate regressions). cargo test -p omni-vela-native --locked: 31 passed, 2 ignored. clippy -D warnings and fmt green.
psv666
left a comment
There was a problem hiding this comment.
Two correctness/validation issues remain in this prerequisite slice; #195 already fixes the corresponding paths.
-
[P1] A rejected word must end the current span. In scoring.rs:358–367, a negative label does not reset the active span. Calling the actual compiled
decode_spans()withAlice met Bob, offsets[(0,5),(6,9),(10,13)], probabilities[0.9,0.1,0.9], labelPERSON, threshold0.5returns one span[0,13]; the pinned semantics require two spans[0,5]and[10,13]. I reproduced this on this head's independently built library. Track the current span separately from the last stored span and carry over the regression from #195. -
[P2] Reject non-finite logits and mismatched dimensions before reducing drift. native_heads.rs:170 and the span loop use
max(abs(got-reference))withzip, without finite/cardinality checks. A CPU reproduction with all-NaN outputs leaves the accumulated maximum at zero; missing trailing values are also omitted byzip. This is a defect in the acceptance gate, not an observation of actual GPU NaNs. Reuse #195's finite/shape checks.
The inherited token-plan exporter also reproduces the bytecode poisoning issue reported on #175; the head-input exporter has the same import policy. Please propagate those fixes through the stack. The new anchored head/calibration loaders are present.
Personally run: 31 Rust tests passed / 2 ignored, 135 Python tests passed, strict MkDocs passed, plus the failing span probe above. The passing default suite lacks that probe. Opt-in head replay was not run. Current main conflicts and the cumulative stack inventory still need reconciliation before integration.
Review scope and provenance
Head 07349034815e8958237b51be82ed52d1efd04c07; PR API base 05075d0f36e399e3a001ffedea400c666990cda9; diff merge-base 05075d0f36e399e3a001ffedea400c666990cda9. Inspected scope: head/scoring implementation and parity guards, inherited fixture-export behavior, and anchored-load follow-up. Complete changed-file inventory: 59 files, 5,730 changed authored-code lines / 6,944 total text lines (binary fixtures counted as files, not text lines).
Loaded trusted InferMatrixLab/system1-omni@5fa5179d57f9267bb0d20162004d8ce26352aa9d:.agents/skills/system1-omni-review/SKILL.md, SHA256 3a4b876162da14eee8db56af86664576aa5755b8f3e80b3072e944018647c3bc, plus architecture, repository contracts, CONTRIBUTING, self-review artifact requirements and CI/Docs workflows. Personally executed checks are distinguished above from author-reported GPU evidence. No GPU inference was run in this review; no approval or readiness transition is implied.
Importing vela2_inference and initializing the runtime with bytecode writes enabled leaves a __pycache__ in the package, which the verify_files gate then rejects at the next verification or worker startup. Disable bytecode writes across import and initialization — from_pretrained imports package modules lazily — and add a repeat-use regression covering both entry points. Backport of the PR InferMatrixLab#195 fix to this prerequisite slice.
…ve-processing # Conflicts: # Cargo.toml # README.md # docs/supported-models.md # recipe/README.md
…heads # Conflicts: # README.md # docs/supported-models.md # recipe/vela/native.md
A rejected valid word no longer merges into the surrounding span: the decoder tracks the current label separately from the last stored span, so probabilities [0.9, 0.1, 0.9] decode as two spans, not one covering span. Logit parity now goes through max_logit_drift, which rejects non-finite values and mismatched lengths before reducing, and the head-input exporter imports and initializes with bytecode writing off. Regressions cover the rejected-word decode, empty offsets, non-finite and misshaped logits, and repeat exporter use. Backport of the PR InferMatrixLab#195 fixes to this prerequisite slice.
|
Fixed in ce8c0ca. decode_spans now ends the current span at a rejected word, so 0.9 0.1 0.9 at threshold 0.5 returns two spans, covered by regressions along with empty offsets. Head logit parity goes through max_logit_drift which rejects non finite values and length mismatches before reducing. Both exporters disable bytecode writes. Updated 175 merged. 139 Python and 36 Rust tests pass, fmt clippy and strict mkdocs clean. |
Levius-Fubuki
left a comment
There was a problem hiding this comment.
Independent review and frozen-input replay at ce8c0ca9f66cd4c2e44a5d58131b42bf13939905. Changes required before advancing this slice.
[P2] The long-span replay drops the window calls
At native_heads.rs:296–297, calls have already been grouped by their recorded row ID, but window logits are selected from row_span_calls[1..] for the parent row.
For the committed long-span recording, the main row is 0 and the two windows are 1 and 2. Row 0 therefore has just the main span call, and this slice is empty. aggregate_windows receives no window logits and fills every word with -30. The 0.8B expected answer happens to contain no spans, so its passing test masks the missing coverage.
This exact inherited path was exercised unchanged on #195's positive 4B/9B long-span cases: 0 spans vs 76 / 373 expected, answer drift 1 > 0.008 / 0.012. Those failures are evidence from #195, not claimed as larger-member tests supported by this 0.8B slice.
Please map window calls back to their parent explicitly, assert that all expected window calls/word rows are consumed, and add a positive long-span regression that cannot pass with empty aggregation. Preserve the numeric gates and exact span count/label/offset checks. A diagnostic changing only window attribution on #195 exposes a separate fixture-consistency issue (79/377 vs 76/373), being reported on #195; fixing attribution alone does not establish its full parity.
Personally run on this head
- Vela Python: 139 passed.
- Release/locked crate tests: 36 passed, 0 failed, 2 ignored.
- Both ignored processing/head replays executed against the real pinned 0.8B export. All five existing cases report PASS, with the long-span coverage caveat above.
- fmt, strict crate clippy and strict MkDocs: passed.
- The earlier rejected-word span reset and finite/dimension checks are present and covered; those old findings are not being repeated.
Pinned package: vllm-sr/Vela-2.0-0.8B@326b01d81f61fff7fd4ae570e54b87a49119e490. No GPU is needed for these frozen-hidden-state head checks.
Scope: base/merge-base 5fa5179d; full diff 46 files, 4,999 authored-code / 5,407 total changed lines; own delta over current #175: 1,672 code / 1,753 total lines. Current #175 is an ancestor, and CI/Docs are green at this head.
Advance conditions: absorb #175's canonical-state fix, repair and positively validate window-call attribution here, then propagate both into #177/#195.
Review method: the repository's system1-omni-review skill at trusted main 5fa5179d, SHA-256 3a4b876162da14eee8db56af86664576aa5755b8f3e80b3072e944018647c3bc; contributor self-review/split rationale, component interfaces and complete changed-file inventory checked. Results below are reviewer-run; previous author measurements and green weight-free CI are not substituted for model/GPU replay.
| } else { | ||
| let which = row_span_calls[0].0.clone(); | ||
| let window_logits: Vec<Vec<Vec<f32>>> = | ||
| row_span_calls[1..].iter().map(|(_, l)| l.clone()).collect(); |
There was a problem hiding this comment.
[P2] Consume the separately indexed window rows. span_calls_by_row is keyed by recorder row IDs; the long-span fixture uses 0 for the main row and 1/2 for its windows. row_span_calls for parent 0 contains only one call, so [1..] is empty and aggregation supplies -30 for every word. The empty 0.8B expected answer hides this; the inherited #195 test produces 0 vs 76/373 expected spans. Please preserve parent/window ownership, assert complete window consumption and add a positive regression.
The recorder imported the package without running the worker's own verify_package gate, so a tampered package could execute code under the export path. Run the gate before sys.path gains the package, add a tampered-package regression, and note the ordering in native.md.
…heads # Conflicts: # recipe/vela/native.md
The head-input recorder shared the token-plan recorder's ungated import path; run verify_package before sys.path gains the package and extend the tampered-package regression to both exporters.
Stacked on #151 + #174 + #175 — incremental review:
ce8c0ca9plus the merges of #175 andinfermatrix/main.Required human contributor answers
What outcome are you trying to achieve?
Implement the Vela-owned output side of the native path: CandidateHead, both SpanHeadV2 heads, set_bias, and the full calibration/decode chain — checked against recorded reference fixtures without any GPU. (Source: issue [New Model]: Support the Vela 2.0 series #137.)
What is the highest-leverage variable?
Head-logit parity — if the F32 math doesn't match the reference to ~1e-5, every downstream answer is wrong.
How will this work move that variable?
The recorded head-input fixtures (hidden states, logits, calibrated answers) freeze both the math and the scoring chain; five cases pin the numbers.
Who is the customer or user?
Same as vela: add the 0.8B native bundle export, wire contract and token-level processing #175 — this is the second half of the native output path.
Is a PR needed? Yes — prerequisite for the executor PR.
For a bug fix: N/A.
Purpose
heads.rs(CandidateHead bilinear + scalar-MLP with erf-GELU via libm, both SpanHeadV2 instances, set_bias — plain F32),scoring.rs(temperatures, set thresholds, PII length rule, sparse gate,span_decode_r4, label aliasing, score normalization, f64 window aggregation), head-input fixture exporter, five recorded fixture sets (~15.8 MB safetensors).Test Plan
System1-Omni Version / Commit:
model/vela2-native-heads@ce8c0ca9cargo test -p omni-vela-nativecargo clippy -p omni-vela-native --all-targets -- -D warningsmkdocs build --strictVELA_NATIVE_BUNDLE=… VELA_NATIVE_MANIFEST_SHA256=… cargo test --test vela_native_heads -- --ignoredTest Result
All passed. Gates default 4e-5/1e-6 (env-overridable, tighten-only); recorded maxima 3.7e-5 / 7.3e-7.
ce8c0ca9; vela: add the 0.8B native bundle export, wire contract and token-level processing #175 andinfermatrix/mainmerged. Every check in the table plusPYTHONPATH=src pytest tests/vela(139 passed),cargo fmt --all --checkand strict mkdocs rerun and green at this head.Demo / evidence
Author-run, x86 WSL2, CPU FP32, five cases:
Structural assertions: discrete picks, span label/text/start/end, threshold rules — all equal.
Fixture facts: ~15.8 MB total safetensors; regenerable via documented command;
rowsblock in JSON is informational.Not measured: GPU, performance.
Self-review