Files
Maven/docs/evals/2026-08-13-onnx-runtime-lifecycle.md
claude 28c2ffb84f Make aggregate ONNX gates execute for real
Reference-count the process-global ONNX Runtime across embedder and routing-head sessions, make close idempotent, and require named proof that both aggregate routing gates executed rather than self-skipped (V-716). Owner explicitly requested direct commits to master.
2026-08-13 03:03:25 +04:00

2.3 KiB

ONNX aggregate gate lifecycle — 2026-08-13

Vikunja: V-716.

Finding

router.NewONNXEmbedder initialized onnxruntime_go unconditionally. Its Close method destroyed the model session but left the package-global runtime environment alive. In one Go process the first TestONNX* therefore ran and every later constructor returned The onnxruntime has already been initialized. Those tests converted the constructor error into t.Skip, so the aggregate package still reported PASS.

Reproduction before the fix:

TestONNXBaseline     PASS  classifier+onnx 72/96
TestONNXRoutingHeads SKIP  onnx: init environment: already initialized
package              PASS

Contract

The router now owns ONNX Runtime through reference-counted leases. Every model session holds one lease; routing heads hold their own, so daemon shutdown order cannot unload the library underneath a live graph. The last lease destroys an environment Maven initialized. Package TestMain holds one extra lease across all model-aware tests in internal/router/eval and cmd/mavend.

The aggregate router command additionally requires two named gates to record execution only after all of their model dependencies loaded. A second-test skip can no longer satisfy the command.

Measurement

Runtime and model:

deps/onnxruntime-linux-x64-1.26.0/lib/libonnxruntime.so.1.26.0
models/embedder/multilingual-e5-small/model_quantized.onnx
models/embedder/router-heads/router_heads.onnx

Focused aggregate, one process:

TestONNXBaseline     PASS  72/96 full (75.0%), destination 11/33
TestONNXRoutingHeads PASS  93/96 full (96.9%), destination 25/33
ONNX aggregate proof: verified 2 required model gates:
  [TestONNXBaseline TestONNXRoutingHeads]

The separate lifecycle test released the last lease and successfully acquired the runtime again. A second same-process package run also executed all three selected mavend gates without a skip:

TestONNXPersonalBoundary         PASS  29/29
TestONNXPersonalBoundaryFourFold PASS  99/104
TestONNXTopics                   PASS  43/43

Finally, make eval-router completed the full package. In addition to the two required proof gates, TestONNXClaimConfidenceDistribution and TestReachBaselineONNX executed; ecosystem reach remained 28/30.