feat(tracker): add alpha calibration and dynamic pricing
Add TOPLOC honest-noise calibration storage/dispatch and validator divergence reporting for AH-021. Add opt-in HuggingFace marketplace pricing refresh, price-change history, CLI flags, and AH-023 tracking docs. Verification: .venv/bin/python -m pytest tests/ -q -k 'not integration' => 346 passed, 2 skipped, 1 deselected; compileall packages tests passed; focused AH-021/AH-023 tests 32 passed.
This commit is contained in:
@@ -2,10 +2,15 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from collections import namedtuple
|
||||
from types import SimpleNamespace
|
||||
|
||||
from meshnet_validator import ToplocAuditConfig, ValidatorProcess
|
||||
from meshnet_validator.audit import build_activation_proofs, verify_activation_proofs
|
||||
from meshnet_validator.audit import (
|
||||
build_activation_proofs,
|
||||
verify_activation_proofs,
|
||||
verify_activation_proofs_detailed,
|
||||
)
|
||||
|
||||
|
||||
class FakeToploc:
|
||||
@@ -199,3 +204,70 @@ def test_validator_rejects_swapped_precision_toploc_claim():
|
||||
assert len(receipts) == 1
|
||||
assert contracts.registry.slashes[0]["wallet_address"] == "wallet-bad"
|
||||
assert "TOPLOC activation proof mismatch" in contracts.registry.slashes[0]["reason"]
|
||||
|
||||
|
||||
# AH-021: verify_activation_proofs_detailed surfaces the raw divergence
|
||||
# metric a calibration corpus needs, instead of only a pass/fail bool.
|
||||
|
||||
ChunkResult = namedtuple("ChunkResult", ["exp_intersections", "mant_err_mean", "mant_err_median"])
|
||||
|
||||
|
||||
class FakeToplocWithChunkResults:
|
||||
"""Mimics the real `toploc` library: verify returns per-chunk results,
|
||||
not a bool, so `bool(result)` alone (the AH-021 gap #1 bug) is always
|
||||
true for any non-empty response regardless of divergence."""
|
||||
|
||||
def build_proofs_base64(self, activations, *, decode_batching_size, topk, skip_prefill):
|
||||
return {"activations": activations}
|
||||
|
||||
def verify_proofs_base64(self, activations, proofs, *, decode_batching_size, topk, skip_prefill):
|
||||
return [
|
||||
ChunkResult(exp_intersections=8, mant_err_mean=0.01, mant_err_median=0.008),
|
||||
ChunkResult(exp_intersections=6, mant_err_mean=0.03, mant_err_median=0.02),
|
||||
]
|
||||
|
||||
|
||||
def test_verify_activation_proofs_detailed_aggregates_per_chunk_divergence():
|
||||
fake_toploc = FakeToplocWithChunkResults()
|
||||
activations = [[1.0, 2.0], [3.0, 4.0]]
|
||||
config = ToplocAuditConfig(topk=2, decode_batching_size=16)
|
||||
claim = build_activation_proofs(activations, config=config, backend=fake_toploc)
|
||||
|
||||
result = verify_activation_proofs_detailed(activations, claim, config=config, backend=fake_toploc)
|
||||
|
||||
assert result.passed is True # non-empty list is truthy, same as legacy behavior
|
||||
assert result.chunk_count == 2
|
||||
assert result.exp_intersections == 6 # worst-case (min) across chunks
|
||||
assert result.mant_err_mean == 0.02 # mean of per-chunk means
|
||||
assert result.mant_err_median == 0.014 # mean of per-chunk medians
|
||||
|
||||
# verify_activation_proofs still returns just the bool for existing callers.
|
||||
assert verify_activation_proofs(activations, claim, config=config, backend=fake_toploc) is True
|
||||
|
||||
|
||||
def test_verify_activation_proofs_detailed_no_metric_from_plain_bool_backend():
|
||||
fake_toploc = FakeToploc()
|
||||
activations = [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
|
||||
config = ToplocAuditConfig(topk=2, decode_batching_size=16)
|
||||
claim = build_activation_proofs(activations, config=config, backend=fake_toploc)
|
||||
|
||||
result = verify_activation_proofs_detailed(activations, claim, config=config, backend=fake_toploc)
|
||||
|
||||
assert result.passed is True
|
||||
assert result.chunk_count == 0
|
||||
assert result.exp_intersections is None
|
||||
assert result.mant_err_mean is None
|
||||
assert result.mant_err_median is None
|
||||
|
||||
|
||||
def test_verify_activation_proofs_detailed_rejects_config_mismatch_without_calling_backend():
|
||||
fake_toploc = FakeToplocWithChunkResults()
|
||||
activations = [[1.0, 2.0]]
|
||||
canonical = ToplocAuditConfig(dtype="bfloat16", quantization="bfloat16", topk=2, decode_batching_size=16)
|
||||
swapped = ToplocAuditConfig(dtype="bfloat16", quantization="int8", topk=2, decode_batching_size=16)
|
||||
claim = build_activation_proofs(activations, config=swapped, backend=fake_toploc)
|
||||
|
||||
result = verify_activation_proofs_detailed(activations, claim, config=canonical, backend=fake_toploc)
|
||||
|
||||
assert result.passed is False
|
||||
assert result.chunk_count == 0
|
||||
|
||||
Reference in New Issue
Block a user