154 lines
5.0 KiB
Python
154 lines
5.0 KiB
Python
#!/usr/bin/env python
|
|
"""Generate (or verify) the committed DGR-003 fingerprint conformance vectors.
|
|
|
|
The node and the tracker derive artifact, recipe and Shard-binding digests from
|
|
*separate* implementations on purpose: an admission gate that shares code with
|
|
the thing it admits is not an independent check. The cost of that independence
|
|
is drift — two canonicalizers that quietly stop agreeing would not fail, they
|
|
would silently stop forming routes, or worse, silently form wrong ones.
|
|
|
|
``tests/data/recipe_fingerprint_vectors.json`` is what makes drift loud. It is a
|
|
language-neutral artifact — canonical input blocks, expected digests, and the
|
|
serialized DGR-002 ``Fingerprint`` bytes — that the node tests, the tracker tests
|
|
and (later) the native C++ worker all check themselves against.
|
|
|
|
python scripts/gen_recipe_fingerprint_vectors.py --check # CI: no drift
|
|
python scripts/gen_recipe_fingerprint_vectors.py # rewrite vectors
|
|
|
|
Rewriting is a deliberate act: if this changes a digest, it changed the wire
|
|
contract, and every node and tracker in the fleet has to agree at the same time.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import pathlib
|
|
import sys
|
|
|
|
_ROOT = pathlib.Path(__file__).resolve().parent.parent
|
|
sys.path[:0] = [str(_ROOT / "packages" / "node"), str(_ROOT / "packages" / "tracker")]
|
|
|
|
from meshnet_node.runtime_recipe import ( # noqa: E402
|
|
ArtifactIdentity,
|
|
DerivativeBinding,
|
|
RuntimeRecipe,
|
|
ShardIdentity,
|
|
)
|
|
from meshnet_tracker.recipe import parse_identity # noqa: E402
|
|
|
|
VECTORS = _ROOT / "tests" / "data" / "recipe_fingerprint_vectors.json"
|
|
SCHEMA_VERSION = 1
|
|
|
|
_RECIPE = RuntimeRecipe(
|
|
weight_quantization="Q4_K_M",
|
|
activation_dtype="bfloat16",
|
|
compute_dtype="float32",
|
|
kv_dtype="q8_0",
|
|
kv_layout="paged-v1",
|
|
tokenizer_revision="0123456789abcdef",
|
|
architecture_adapter="llama/range-v1",
|
|
backend_id="llama.cpp",
|
|
runtime_version="llama.cpp@deadbeef+meshnet.1",
|
|
recipe_id="example-gguf",
|
|
recipe_version="1",
|
|
catalogue_version="2026.07.1",
|
|
)
|
|
|
|
_SOURCE = "a" * 64
|
|
_SPLIT_BYTES = "c" * 64
|
|
_CONFIG = "b" * 64
|
|
|
|
|
|
def _cases() -> list[tuple[str, str, ShardIdentity]]:
|
|
whole = ShardIdentity(
|
|
ArtifactIdentity(
|
|
"example/model", "0123456789abcdef", _SOURCE, "dense-llama", _CONFIG, 8
|
|
),
|
|
_RECIPE,
|
|
0,
|
|
4,
|
|
)
|
|
# The same recipe on the same source, held as a split: identical route
|
|
# fingerprint, different Shard binding. Both halves of that are contract.
|
|
derivative = ShardIdentity(
|
|
ArtifactIdentity(
|
|
"example/model",
|
|
"0123456789abcdef",
|
|
_SPLIT_BYTES,
|
|
"dense-llama",
|
|
_CONFIG,
|
|
8,
|
|
DerivativeBinding(_SOURCE, 4, 8),
|
|
),
|
|
_RECIPE,
|
|
4,
|
|
8,
|
|
)
|
|
return [
|
|
("example-v1", "An undivided artifact: content digest is the source digest.", whole),
|
|
(
|
|
"example-v1-derivative",
|
|
"A split of the same source: same fingerprint, different Shard binding.",
|
|
derivative,
|
|
),
|
|
]
|
|
|
|
|
|
def build() -> dict:
|
|
vectors = []
|
|
for name, description, identity in _cases():
|
|
block = identity.to_dict()
|
|
presented = parse_identity(block)
|
|
|
|
# The two implementations must already agree before this is committed.
|
|
assert identity.fingerprint.to_dict() == presented.fingerprint_dict(), name
|
|
assert identity.shard_binding_digest == presented.shard_binding_digest, name
|
|
|
|
vectors.append(
|
|
{
|
|
"name": name,
|
|
"description": description,
|
|
"identity": block,
|
|
"fingerprint": identity.fingerprint.to_dict(),
|
|
"shard_binding_digest": identity.shard_binding_digest,
|
|
"fingerprint_proto_hex": identity.fingerprint.to_proto()
|
|
.SerializeToString(deterministic=True)
|
|
.hex(),
|
|
}
|
|
)
|
|
return {"schema_version": SCHEMA_VERSION, "vectors": vectors}
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument(
|
|
"--check",
|
|
action="store_true",
|
|
help="fail if the committed vectors differ from what this code derives",
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
built = json.dumps(build(), indent=2, sort_keys=True) + "\n"
|
|
if not args.check:
|
|
VECTORS.write_text(built, encoding="utf-8")
|
|
print(f"wrote {VECTORS.relative_to(_ROOT)}")
|
|
return 0
|
|
|
|
committed = VECTORS.read_text(encoding="utf-8")
|
|
if committed != built:
|
|
print(
|
|
f"{VECTORS.relative_to(_ROOT)} is stale: the identity implementation no "
|
|
"longer derives the committed digests.\nIf that change was intended, it "
|
|
"is a wire-contract change — rerun without --check and roll out node and "
|
|
"tracker together.",
|
|
file=sys.stderr,
|
|
)
|
|
return 1
|
|
print(f"{VECTORS.relative_to(_ROOT)} matches the identity implementation")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|