158 lines
5.6 KiB
Python
158 lines
5.6 KiB
Python
"""DGR-003 production-native identity emission boundary tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from meshnet_node.doctor import DoctorSelection, validate_loaded_backend
|
|
from meshnet_node.native_backend import (
|
|
ImmutableArtifactPin,
|
|
NativeIdentityInputs,
|
|
NativeLoadedArtifactReport,
|
|
NativeNumericalRecipe,
|
|
NativeSessionRejected,
|
|
NativeWorkerBackendAdapter,
|
|
shard_identity_from_native_report,
|
|
)
|
|
from meshnet_node.native_protocol import SCHEMA_VERSION, pb
|
|
from meshnet_node.recipe_manifest import parse_recipe_manifest
|
|
from meshnet_tracker.capability import STATE_UNCERTIFIED, evaluate_report
|
|
|
|
|
|
def _digest(letter: str) -> str:
|
|
return letter * 64
|
|
|
|
|
|
def _inputs(**changes: object) -> NativeIdentityInputs:
|
|
report = NativeLoadedArtifactReport(
|
|
owned_start_layer=2,
|
|
owned_end_layer=6,
|
|
mapped_bytes=1024,
|
|
resident_bytes=768,
|
|
registered_bytes=640,
|
|
architecture="llama",
|
|
architecture_digest=_digest("a"),
|
|
layer_count=8,
|
|
)
|
|
recipe = NativeNumericalRecipe(
|
|
weight_quantization="Q4_K_M",
|
|
activation_dtype="bfloat16",
|
|
compute_dtype="float32",
|
|
kv_dtype="q8_0",
|
|
kv_layout="llama-kv-v1",
|
|
architecture_adapter="dense-llama-v1",
|
|
backend_id="llama-cpp",
|
|
runtime_version="llama.cpp:e920c523",
|
|
recipe_id="native",
|
|
recipe_version="1",
|
|
catalogue_version="2026.07.1",
|
|
)
|
|
values: dict[str, object] = {
|
|
"loaded_artifact": report,
|
|
"artifact_pin": ImmutableArtifactPin(
|
|
artifact_id="acme/llama.gguf",
|
|
revision="0123456789abcdef",
|
|
content_digest=_digest("b"),
|
|
),
|
|
"tokenizer_revision": "abcdef0123456789",
|
|
"numerical_recipe": recipe,
|
|
}
|
|
values.update(changes)
|
|
return NativeIdentityInputs(**values) # type: ignore[arg-type]
|
|
|
|
|
|
def _open(adapter: NativeWorkerBackendAdapter, **changes: object) -> pb.SessionOpen:
|
|
identity = adapter.identity
|
|
fields: dict[str, object] = {
|
|
"schema_version": SCHEMA_VERSION,
|
|
"route_session_id": "tracker-session",
|
|
"route_epoch": 4,
|
|
"fingerprint": identity.fingerprint.to_proto(),
|
|
"shard_range": pb.ShardRange(
|
|
start_layer=identity.shard_start,
|
|
end_layer=identity.shard_end,
|
|
effective_start_layer=identity.shard_start,
|
|
),
|
|
}
|
|
fields.update(changes)
|
|
return pb.SessionOpen(**fields) # type: ignore[arg-type]
|
|
|
|
|
|
def test_native_identity_uses_loaded_report_not_a_caller_range():
|
|
identity = shard_identity_from_native_report(_inputs())
|
|
|
|
assert (identity.shard_start, identity.shard_end) == (2, 6)
|
|
assert identity.artifact.architecture == "llama"
|
|
assert identity.artifact.layer_count == 8
|
|
|
|
|
|
def test_native_identity_requires_an_immutable_pin_and_gguf_range():
|
|
with pytest.raises(Exception, match="moving reference"):
|
|
shard_identity_from_native_report(
|
|
_inputs(artifact_pin=ImmutableArtifactPin("a", "main", _digest("b")))
|
|
)
|
|
with pytest.raises(Exception, match="outside GGUF"):
|
|
NativeLoadedArtifactReport(0, 9, 1, 1, 1, "llama", _digest("a"), 8)
|
|
|
|
|
|
def test_native_worker_rejects_bad_session_open_before_session_acceptance():
|
|
adapter = NativeWorkerBackendAdapter(_inputs())
|
|
accepted = adapter.on_session_open(
|
|
_open(adapter), expected_route_session_id="tracker-session", expected_route_epoch=4
|
|
)
|
|
assert accepted.fingerprint.SerializeToString() == adapter.identity.fingerprint.to_proto().SerializeToString()
|
|
|
|
with pytest.raises(NativeSessionRejected) as rejected:
|
|
adapter.on_session_open(
|
|
_open(adapter, route_epoch=5),
|
|
expected_route_session_id="tracker-session",
|
|
expected_route_epoch=4,
|
|
)
|
|
assert rejected.value.error.code == pb.ERROR_CODE_EPOCH_STALE
|
|
|
|
|
|
def test_doctor_emits_native_identity_but_keeps_legacy_backend_dark():
|
|
manifest = parse_recipe_manifest(
|
|
{"schema_version": 1, "catalogue_version": "2026.07.1", "recipes": [
|
|
{"id": "native", "version": "1", "backend_id": "llama-cpp"}
|
|
]}
|
|
)
|
|
selection = DoctorSelection("acme/llama.gguf", 2, 5)
|
|
native = NativeWorkerBackendAdapter(_inputs())
|
|
# The probe needs only the normal backend shape; identity is supplied by the adapter.
|
|
native.hidden_size = 8
|
|
native.is_head = False
|
|
native.is_tail = False
|
|
native.device = "cpu"
|
|
native.forward_bytes = lambda *args, **kwargs: type("Payload", (), {"body": b"x", "shape": [1]})()
|
|
result = validate_loaded_backend(native, selection, manifest.recipes[0], manifest)
|
|
assert result.report.identity == native.identity
|
|
assert result.report.model.revision == native.identity.artifact.revision
|
|
assert result.report.model.config_fingerprint == "sha256:" + _digest("a")
|
|
assert result.report.backend.quantization == "Q4_K_M"
|
|
assert (result.report.shard.start, result.report.shard.end) == (2, 5)
|
|
state = evaluate_report(
|
|
result.report.to_dict(),
|
|
model_matches=lambda value: value == "acme/llama.gguf",
|
|
advertised_model="acme/llama.gguf",
|
|
shard_start=2,
|
|
shard_end=5,
|
|
declared_recipe_id="native",
|
|
declared_recipe_version="1",
|
|
now=result.report.validated_at,
|
|
)
|
|
assert state.state == STATE_UNCERTIFIED
|
|
|
|
class Legacy:
|
|
hidden_size = 8
|
|
is_head = False
|
|
is_tail = False
|
|
device = "cpu"
|
|
|
|
@staticmethod
|
|
def forward_bytes(*args, **kwargs):
|
|
return type("Payload", (), {"body": b"x", "shape": [1]})()
|
|
|
|
legacy = validate_loaded_backend(Legacy(), selection, manifest.recipes[0], manifest)
|
|
assert legacy.report.identity is None
|