Skip to content

vela: add the 0.8B native F32 heads, scoring and span decoding - #176

Open
MrDongsls wants to merge 31 commits into
InferMatrixLab:mainfrom
MrDongsls:model/vela2-native-heads
Open

MrDongsls wants to merge 31 commits into
InferMatrixLab:mainfrom
MrDongsls:model/vela2-native-heads

Conversation

@MrDongsls

@MrDongsls MrDongsls commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Stacked on #151 + #174 + #175 — incremental review: ce8c0ca9 plus the merges of #175 and infermatrix/main.

Required human contributor answers

  1. 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.)

  2. 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.

  3. 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.

  4. 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 @ ce8c0ca9

Check Command Result
CPU tests cargo test -p omni-vela-native 36 passed; 2 ignored
clippy cargo clippy -p omni-vela-native --all-targets -- -D warnings clean
Docs mkdocs build --strict exit 0
Opt-in head parity VELA_NATIVE_BUNDLE=… VELA_NATIVE_MANIFEST_SHA256=… cargo test --test vela_native_heads -- --ignored 5/5: logit ≤3.8e-5, answer ≤7.3e-7

Test Result

All passed. Gates default 4e-5/1e-6 (env-overridable, tighten-only); recorded maxima 3.7e-5 / 7.3e-7.

Demo / evidence

Author-run, x86 WSL2, CPU FP32, five cases:

Case Logit drift Answer drift
example-request 3.719e-5 7.252e-7
set-threshold 6.676e-6 1.126e-7
cjk 3.624e-5 4.768e-7
score 1.669e-6 6.077e-7
long-span-windowed 1.121e-5 0.0 (exact)

Structural assertions: discrete picks, span label/text/start/end, threshold rules — all equal.

Fixture facts: ~15.8 MB total safetensors; regenerable via documented command; rows block in JSON is informational.

Not measured: GPU, performance.

Self-review

  • Full diff reviewed.
  • Architecture and scope checked.
  • Checks run and reported above.
  • Description and claims match implementation.

Mr.Dong added 4 commits October 25, 2026 02:57
- 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.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-25T06:03:47.911299Z
We couldn’t complete this review. Comment @codex review to try again.
7d50f57 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Mr.Dong added 2 commits October 25, 2026 14:26
…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
@MrDongsls
MrDongsls force-pushed the model/vela2-native-heads branch from 2564709 to ba86215 Compare October 25, 2026 06:48

@hsliuustc0106 hsliuustc0106 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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", 7d50f571 heads/scoring) merged at 6bedca90 "keep the canonical shared layer". Verified the resolution is real: git diff 0f1e4da5..c2d704d7 touches only heads/scoring/exporter/docs — the canonical processing layer survived untouched, the duplicate was dropped. Also df901b24 "restore float_roundtrip and drop the duplicate sha2 dev-dependency" — the parallel line had dropped serde_json's float_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-tensor Dtype::F32 enforced on load; erf-based GELU via libm::erff; LayerNorm with PyTorch defaults (eps 1e-5); CandidateHead bilinear + scalar-MLP faithful to the described reference module; span-head slot embedding clamped index.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.md records 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_drift scores 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_f64 emits shortest-roundtrip f64 (serde_json float_roundtrip, restored in df901b24) 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 cca9174a byte-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)

  1. P3 — window aggregation is O(tokens × original words) per span question. src/models/vela/native/src/scoring.rs:612 matches each window token's offsets by linear position() over original_offs — ~1800 × ~7700 comparisons on the long-span fixture, growing quadratically toward the 16,384 max_length. Trigger: long over=request span questions. Consequence: latency only, no correctness effect. (Fixed in the stack: #195's e5a16849 indexes the aggregation with a HashMap.)
  2. P3 (inherited tree, filed at #175, restated for this slice's record): exporter writes without atomic staging; fixture recorders don't call verify_package at this head.

Notes

  • Heads::load hardcodes 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.py records 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.md unchanged 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 CI success, Docs success; check-runs benchmarks/build/cuda-compile/cuda-contract/rust all success, 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).

Mr.Dong added 2 commits October 31, 2026 13:36
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.
@MrDongsls

Copy link
Copy Markdown
Collaborator Author

The #175 follow-up is merged in 86f6898 so the stack stays linear and this branch carries the staging fix unchanged. No own-delta change was needed here since the aggregation item is fixed by the later slices as the review notes. tests/vela passes with 135 tests at the merged head.

@hsliuustc0106 hsliuustc0106 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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" (parents c2d704d7 + 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.rs at this head vs e5a16849's fix at 7b60e4ec1.
  • Commands run: rev-parse (head matches 86f689850c4…); git merge-base --is-ancestor ×3; first-parent log; grep for position-scan / or_insert / total_cmp at this head (1 / 0 / 0 — the P3 stands here).
  • Observed CI: no Actions runs at 86f689850 on either ThinkFlowLab/system1-omni or InferMatrixLab/system1-omni; latest green on this branch is at c2d704d71 (CI 40277592350, Docs 40277592361, 2026-10-26). Mitigated by the green run at descendant 7b60e4ec1 (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.

@MrDongsls

Copy link
Copy Markdown
Collaborator Author

Addressed: added a one-line head-update note pinning 86f6898 (absorbs #175's atomic staging by merge; no authored change). No code change.

Mr.Dong added 3 commits November 1, 2026 11:53
- 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 psv666 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two correctness/validation issues remain in this prerequisite slice; #195 already fixes the corresponding paths.

  1. [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() with Alice met Bob, offsets [(0,5),(6,9),(10,13)], probabilities [0.9,0.1,0.9], label PERSON, threshold 0.5 returns 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.

  2. [P2] Reject non-finite logits and mismatched dimensions before reducing drift. native_heads.rs:170 and the span loop use max(abs(got-reference)) with zip, without finite/cardinality checks. A CPU reproduction with all-NaN outputs leaves the accumulated maximum at zero; missing trailing values are also omitted by zip. 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.

Mr.Dong added 4 commits November 1, 2026 20:57
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.
@MrDongsls

Copy link
Copy Markdown
Collaborator Author

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 Levius-Fubuki left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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.

Mr.Dong added 4 commits November 2, 2026 12:59
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.

This branch has not been deployed

No deployments
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.

4 participants