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