feat: DGR-017 - Lock the GLM-5.2 Max target and alpha contract
This commit is contained in:
851
tests/test_glm_alpha_target.py
Normal file
851
tests/test_glm_alpha_target.py
Normal file
@@ -0,0 +1,851 @@
|
||||
"""DGR-017 — the locked GLM-5.2 Max target, resource plan, and alpha contract.
|
||||
|
||||
These tests are deterministic, offline, GPU-free, and download-free. They assert
|
||||
against the *pinned* manifest, so they fail if a later agent swaps the artifact,
|
||||
loosens the memory accounting, or moves a threshold after seeing a result.
|
||||
|
||||
The planner tests are written as a reproduction of the roadmap's published tables.
|
||||
That is the point: if the arithmetic here ever stops reproducing them, either the
|
||||
roadmap or the planner is lying, and the test says which numbers changed.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import copy
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from meshnet_node.glm_alpha import (
|
||||
AGGREGATE_HARD_FIT_FLOOR_GIB,
|
||||
ALPHA_CONTRACT_ID,
|
||||
ALPHA_QUANTIZATION,
|
||||
ALPHA_SHARD_COUNT,
|
||||
MIN_LINK_RATE_GBPS,
|
||||
RECOMMENDED_LINK_RATE_GBPS,
|
||||
RESERVE_FLOOR_GIB,
|
||||
AlphaContractError,
|
||||
GlmTargetError,
|
||||
NodeMemory,
|
||||
ResourcePlanError,
|
||||
compute_contract_digest,
|
||||
kv_bytes,
|
||||
load_alpha_contract,
|
||||
load_architecture_snapshot,
|
||||
load_locked_target,
|
||||
load_target_manifest,
|
||||
parse_alpha_contract,
|
||||
parse_architecture_snapshot,
|
||||
parse_target_manifest,
|
||||
plan_route,
|
||||
plan_seams,
|
||||
plan_topology,
|
||||
require_contract_target,
|
||||
require_pinned_target,
|
||||
seal_contract,
|
||||
)
|
||||
from meshnet_node.glm_alpha.manifest import GIB
|
||||
|
||||
# The revisions observed and pinned by DGR-017 on 2026-07-13.
|
||||
SOURCE_REVISION = "b4734de4facf877f85769a911abafc5283eab3d9"
|
||||
GGUF_REVISION = "abc55e72527792c6e77069c99b4cb7de16fa9f23"
|
||||
TOTAL_BYTES = 216_715_360_960
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def manifest():
|
||||
return load_target_manifest()
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def snapshot():
|
||||
return load_architecture_snapshot()
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def contract():
|
||||
return load_alpha_contract()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def manifest_doc(manifest):
|
||||
return copy.deepcopy(dict(manifest.raw))
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def snapshot_doc(snapshot):
|
||||
return copy.deepcopy(dict(snapshot.raw))
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def contract_doc(contract):
|
||||
return copy.deepcopy(dict(contract.raw))
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Identity: the exact artifact, pinned
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_manifest_pins_both_repositories_by_exact_revision(manifest):
|
||||
assert manifest.source_repo_id == "zai-org/GLM-5.2"
|
||||
assert manifest.source_revision == SOURCE_REVISION
|
||||
assert manifest.gguf_repo_id == "unsloth/GLM-5.2-GGUF"
|
||||
assert manifest.gguf_revision == GGUF_REVISION
|
||||
assert manifest.quantization == ALPHA_QUANTIZATION == "UD-IQ1_S"
|
||||
assert manifest.source_license == "mit"
|
||||
assert manifest.gguf_license == "mit"
|
||||
|
||||
|
||||
def test_manifest_resolves_all_six_shards_with_sizes_hashes_and_urls(manifest):
|
||||
assert len(manifest.shards) == ALPHA_SHARD_COUNT == 6
|
||||
assert [shard.index for shard in manifest.shards] == [1, 2, 3, 4, 5, 6]
|
||||
|
||||
for shard in manifest.shards:
|
||||
assert shard.size_bytes > 0
|
||||
assert len(shard.sha256) == 64
|
||||
assert shard.url.startswith(f"https://huggingface.co/{manifest.gguf_repo_id}/resolve/")
|
||||
assert GGUF_REVISION in shard.url, "a shard URL must resolve at the pinned revision"
|
||||
|
||||
digests = {shard.sha256 for shard in manifest.shards}
|
||||
assert len(digests) == 6, "six distinct shards must have six distinct content digests"
|
||||
|
||||
|
||||
def test_manifest_aggregate_bytes_are_exact_and_self_consistent(manifest):
|
||||
assert manifest.total_bytes == TOTAL_BYTES
|
||||
assert sum(shard.size_bytes for shard in manifest.shards) == TOTAL_BYTES
|
||||
assert round(manifest.total_gib, 3) == 201.832
|
||||
assert round(manifest.total_gb, 3) == 216.715
|
||||
|
||||
|
||||
def test_manifest_records_the_iq1_m_diagnostic_fallback_without_promoting_it(manifest):
|
||||
fallback = manifest.raw["diagnostic_fallback"]
|
||||
assert fallback["quantization"] == "UD-IQ1_M"
|
||||
assert fallback["total_bytes"] == 228_492_966_624
|
||||
assert fallback["total_bytes"] > manifest.total_bytes
|
||||
assert "does not satisfy" in fallback["policy"]
|
||||
|
||||
|
||||
def test_manifest_forbids_home_storage(manifest):
|
||||
assert manifest.raw["storage"]["mounted_storage_only"] is True
|
||||
assert "/home" in manifest.raw["storage"]["forbidden_path_prefixes"]
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Identity: what the manifest must reject
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_a_changed_source_revision_is_rejected(manifest, snapshot, manifest_doc):
|
||||
manifest_doc["source_model"]["revision"] = "0" * 40
|
||||
swapped = parse_target_manifest(manifest_doc)
|
||||
|
||||
with pytest.raises(GlmTargetError, match="does not match the locked alpha revision"):
|
||||
require_pinned_target(
|
||||
swapped,
|
||||
snapshot,
|
||||
expected_source_revision=SOURCE_REVISION,
|
||||
expected_gguf_revision=GGUF_REVISION,
|
||||
)
|
||||
|
||||
|
||||
def test_a_changed_gguf_revision_is_rejected(manifest, snapshot, manifest_doc):
|
||||
manifest_doc["gguf_artifact"]["revision"] = "1" * 40
|
||||
swapped = parse_target_manifest(manifest_doc)
|
||||
|
||||
with pytest.raises(GlmTargetError, match="does not match the locked alpha revision"):
|
||||
require_pinned_target(
|
||||
swapped,
|
||||
snapshot,
|
||||
expected_source_revision=SOURCE_REVISION,
|
||||
expected_gguf_revision=GGUF_REVISION,
|
||||
)
|
||||
|
||||
|
||||
def test_the_pinned_target_passes_its_own_revision_check(manifest, snapshot):
|
||||
require_pinned_target(
|
||||
manifest,
|
||||
snapshot,
|
||||
expected_source_revision=SOURCE_REVISION,
|
||||
expected_gguf_revision=GGUF_REVISION,
|
||||
)
|
||||
|
||||
|
||||
def test_config_metadata_from_a_different_revision_than_the_weights_is_rejected(
|
||||
manifest, snapshot_doc
|
||||
):
|
||||
snapshot_doc["source_revision"] = "2" * 40
|
||||
drifted = parse_architecture_snapshot(snapshot_doc)
|
||||
|
||||
with pytest.raises(GlmTargetError, match="must come from one revision"):
|
||||
require_pinned_target(
|
||||
manifest,
|
||||
drifted,
|
||||
expected_source_revision=SOURCE_REVISION,
|
||||
expected_gguf_revision=GGUF_REVISION,
|
||||
)
|
||||
|
||||
|
||||
def test_a_branch_name_is_not_an_acceptable_revision_pin(manifest_doc):
|
||||
manifest_doc["gguf_artifact"]["revision"] = "main"
|
||||
|
||||
with pytest.raises(GlmTargetError, match="not an immutable pin"):
|
||||
parse_target_manifest(manifest_doc)
|
||||
|
||||
|
||||
def test_a_missing_shard_is_rejected(manifest_doc):
|
||||
manifest_doc["gguf_artifact"]["shards"].pop()
|
||||
|
||||
with pytest.raises(GlmTargetError, match="exactly 6 shards"):
|
||||
parse_target_manifest(manifest_doc)
|
||||
|
||||
|
||||
def test_a_shard_replaced_by_a_duplicate_of_another_is_rejected(manifest_doc):
|
||||
shards = manifest_doc["gguf_artifact"]["shards"]
|
||||
# Keep the count at six and the byte total consistent, but drop shard 6's
|
||||
# identity — the shape a lazy "just re-download it" repair takes.
|
||||
shards[5]["index"] = 5
|
||||
|
||||
with pytest.raises(GlmTargetError, match="duplicate shard index"):
|
||||
parse_target_manifest(manifest_doc)
|
||||
|
||||
|
||||
def test_two_shards_claiming_the_same_content_digest_are_rejected(manifest_doc):
|
||||
shards = manifest_doc["gguf_artifact"]["shards"]
|
||||
shards[5]["sha256"] = shards[4]["sha256"]
|
||||
|
||||
with pytest.raises(GlmTargetError, match="same content digest"):
|
||||
parse_target_manifest(manifest_doc)
|
||||
|
||||
|
||||
def test_an_inconsistent_aggregate_byte_total_is_rejected(manifest_doc):
|
||||
manifest_doc["gguf_artifact"]["total_bytes"] = TOTAL_BYTES - 1
|
||||
|
||||
with pytest.raises(GlmTargetError, match="not self-consistent"):
|
||||
parse_target_manifest(manifest_doc)
|
||||
|
||||
|
||||
def test_a_shard_size_edited_to_make_the_model_look_smaller_is_rejected(manifest_doc):
|
||||
# The aggregate is now internally inconsistent, which is exactly the tell.
|
||||
manifest_doc["gguf_artifact"]["shards"][2]["size_bytes"] = 1_000_000
|
||||
|
||||
with pytest.raises(GlmTargetError, match="not self-consistent"):
|
||||
parse_target_manifest(manifest_doc)
|
||||
|
||||
|
||||
def test_swapping_in_a_different_quantization_is_rejected(manifest_doc):
|
||||
manifest_doc["alpha_quantization"] = "UD-IQ1_M"
|
||||
|
||||
with pytest.raises(GlmTargetError, match="requires a human contract change"):
|
||||
parse_target_manifest(manifest_doc)
|
||||
|
||||
|
||||
def test_a_truncated_sha256_is_rejected(manifest_doc):
|
||||
manifest_doc["gguf_artifact"]["shards"][0]["sha256"] = "abc123"
|
||||
|
||||
with pytest.raises(GlmTargetError, match="64-character hex SHA-256"):
|
||||
parse_target_manifest(manifest_doc)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Architecture snapshot
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_snapshot_captures_the_architecture_critical_metadata(snapshot):
|
||||
assert snapshot["model_type"] == "glm_moe_dsa"
|
||||
assert snapshot["num_hidden_layers"] == 78
|
||||
assert snapshot["num_nextn_predict_layers"] == 1
|
||||
assert snapshot["total_artifact_layers"] == 79
|
||||
assert snapshot["dense_layers"] == 3
|
||||
assert snapshot["sparse_moe_layers"] == 75
|
||||
assert snapshot["hidden_size"] == 6144
|
||||
assert snapshot["n_routed_experts"] == 256
|
||||
assert snapshot["num_experts_per_tok"] == 8
|
||||
assert snapshot["n_shared_experts"] == 1
|
||||
assert snapshot["index_topk"] == 2048
|
||||
assert snapshot["index_head_dim"] == 128
|
||||
assert snapshot["max_position_embeddings"] == 1_048_576
|
||||
assert snapshot["vocab_size"] == 154_880
|
||||
|
||||
|
||||
def test_snapshot_records_indexshare_roles_for_every_layer(snapshot):
|
||||
assert snapshot["indexer_full_layers"] == 21
|
||||
assert snapshot["indexer_shared_layers"] == 57
|
||||
assert snapshot["indexer_full_layers"] + snapshot["indexer_shared_layers"] == 78
|
||||
|
||||
|
||||
def test_mla_cache_width_is_derived_not_asserted(snapshot):
|
||||
assert snapshot["kv_lora_rank"] == 512
|
||||
assert snapshot["qk_rope_head_dim"] == 64
|
||||
assert snapshot["mla_cached_values_per_token_per_layer"] == 576
|
||||
|
||||
|
||||
def test_snapshot_hashes_the_config_and_chat_template_bytes(snapshot):
|
||||
assert len(snapshot.file_sha256("config.json")) == 64
|
||||
assert len(snapshot.file_sha256("chat_template.jinja")) == 64
|
||||
assert len(snapshot.file_sha256("tokenizer_config.json")) == 64
|
||||
assert len(snapshot["indexer_types_sha256"]) == 64
|
||||
assert len(snapshot.digest) == 64
|
||||
|
||||
|
||||
def test_reasoning_effort_max_is_locked_as_an_observable_rendered_marker(snapshot):
|
||||
reasoning = snapshot.reasoning_effort
|
||||
assert reasoning["alpha_mode"] == "max"
|
||||
assert reasoning["rendered_marker"] == "<|system|>Reasoning Effort: Max"
|
||||
# The template's only non-max level is 'high'; everything else renders Max. So
|
||||
# "the request carried reasoning_effort=max" proves nothing on its own.
|
||||
assert reasoning["default_is_max"] is True
|
||||
|
||||
|
||||
def test_folding_the_nextn_layer_into_the_backbone_is_rejected(snapshot_doc):
|
||||
snapshot_doc["architecture"]["total_artifact_layers"] = 78
|
||||
|
||||
with pytest.raises(GlmTargetError, match="NextN layer must be counted"):
|
||||
parse_architecture_snapshot(snapshot_doc)
|
||||
|
||||
|
||||
def test_indexshare_roles_that_do_not_cover_every_layer_are_rejected(snapshot_doc):
|
||||
snapshot_doc["architecture"]["indexer_full_layers"] = 20
|
||||
|
||||
with pytest.raises(GlmTargetError, match="exactly one IndexShare role"):
|
||||
parse_architecture_snapshot(snapshot_doc)
|
||||
|
||||
|
||||
def test_a_route_with_no_full_indexer_producer_is_rejected(snapshot_doc):
|
||||
snapshot_doc["architecture"]["indexer_full_layers"] = 0
|
||||
snapshot_doc["architecture"]["indexer_shared_layers"] = 78
|
||||
|
||||
with pytest.raises(GlmTargetError, match="no index for its Shared consumers"):
|
||||
parse_architecture_snapshot(snapshot_doc)
|
||||
|
||||
|
||||
def test_a_contradictory_mla_width_is_rejected(snapshot_doc):
|
||||
snapshot_doc["architecture"]["mla_cached_values_per_token_per_layer"] = 512
|
||||
|
||||
with pytest.raises(GlmTargetError, match="kv_lora_rank"):
|
||||
parse_architecture_snapshot(snapshot_doc)
|
||||
|
||||
|
||||
def test_a_snapshot_missing_an_architecture_critical_field_is_rejected(snapshot_doc):
|
||||
del snapshot_doc["architecture"]["n_routed_experts"]
|
||||
|
||||
with pytest.raises(GlmTargetError, match="architecture-critical field"):
|
||||
parse_architecture_snapshot(snapshot_doc)
|
||||
|
||||
|
||||
def test_a_snapshot_that_drops_reasoning_effort_max_is_rejected(snapshot_doc):
|
||||
snapshot_doc["reasoning_effort"]["alpha_mode"] = "high"
|
||||
|
||||
with pytest.raises(GlmTargetError, match="does not lock reasoning_effort=max"):
|
||||
parse_architecture_snapshot(snapshot_doc)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# KV planning
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("context", "mla_only", "optimized", "conservative", "conservative_f16"),
|
||||
[
|
||||
(16_384, 0.73, 0.77, 0.89, 1.68),
|
||||
(131_072, 5.83, 6.18, 7.12, 13.41),
|
||||
(1_048_576, 46.62, 49.41, 56.98, 107.25),
|
||||
],
|
||||
)
|
||||
def test_kv_planner_reproduces_the_published_roadmap_table(
|
||||
snapshot, context, mla_only, optimized, conservative, conservative_f16
|
||||
):
|
||||
def gib(**kwargs):
|
||||
return kv_bytes(snapshot, context_tokens=context, concurrency=1, **kwargs) / GIB
|
||||
|
||||
assert round(gib(include_indexer=False), 2) == mla_only
|
||||
assert round(gib(indexer_layout="optimized"), 2) == optimized
|
||||
assert round(gib(indexer_layout="conservative"), 2) == conservative
|
||||
assert round(gib(indexer_layout="conservative", dtype="F16"), 2) == conservative_f16
|
||||
|
||||
|
||||
def test_alpha_budgets_the_conservative_indexer_layout(snapshot):
|
||||
"""Alpha must budget the implementation it may actually get, not the ideal one."""
|
||||
optimized = kv_bytes(snapshot, indexer_layout="optimized")
|
||||
conservative = kv_bytes(snapshot, indexer_layout="conservative")
|
||||
|
||||
assert conservative > optimized
|
||||
assert kv_bytes(snapshot) == conservative, "the default must be the conservative layout"
|
||||
|
||||
|
||||
def test_kv_scales_with_concurrency(snapshot):
|
||||
assert kv_bytes(snapshot, concurrency=2) == 2 * kv_bytes(snapshot, concurrency=1)
|
||||
|
||||
|
||||
def test_an_unlocked_kv_dtype_is_rejected(snapshot):
|
||||
with pytest.raises(ResourcePlanError, match="alpha locks Q8_0"):
|
||||
kv_bytes(snapshot, dtype="Q4_0")
|
||||
|
||||
|
||||
@pytest.mark.parametrize("bad", [0, -1, True, 1.5])
|
||||
def test_kv_rejects_non_positive_or_non_integer_dimensions(snapshot, bad):
|
||||
with pytest.raises(ResourcePlanError, match="positive integers"):
|
||||
kv_bytes(snapshot, context_tokens=bad)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Memory accounting: unified memory is one pool
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_unified_memory_is_counted_once():
|
||||
node = NodeMemory.from_host("strix-halo", system_ram_gib=128.0, unified=True)
|
||||
|
||||
assert node.physical_usable_gib == 128.0, "integrated-GPU memory is not extra memory"
|
||||
|
||||
|
||||
def test_adding_integrated_gpu_memory_to_system_ram_is_rejected():
|
||||
with pytest.raises(ResourcePlanError, match="double-counts one pool"):
|
||||
NodeMemory.from_host(
|
||||
"strix-halo",
|
||||
system_ram_gib=128.0,
|
||||
gpu_memory_gib=96.0,
|
||||
unified=True,
|
||||
)
|
||||
|
||||
|
||||
def test_a_discrete_gpu_does_add_its_own_memory():
|
||||
node = NodeMemory.from_host(
|
||||
"workstation", system_ram_gib=64.0, gpu_memory_gib=24.0, unified=False
|
||||
)
|
||||
|
||||
assert node.physical_usable_gib == 88.0
|
||||
|
||||
|
||||
def test_the_same_machine_counted_twice_in_a_route_is_rejected(manifest, snapshot):
|
||||
twin = [
|
||||
NodeMemory.from_host("box-a", system_ram_gib=128.0, unified=True),
|
||||
NodeMemory.from_host("box-a", system_ram_gib=128.0, unified=True),
|
||||
]
|
||||
|
||||
with pytest.raises(ResourcePlanError, match="counted twice"):
|
||||
plan_route(manifest, snapshot, twin)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("bad", [float("nan"), float("inf"), -1.0, True])
|
||||
def test_node_memory_rejects_non_finite_or_invalid_capacity(bad):
|
||||
with pytest.raises(ResourcePlanError, match="finite positive"):
|
||||
NodeMemory(name="bad-host", physical_usable_gib=bad, unified=True)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Reserve and topology
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_the_reserve_floor_binds_on_small_nodes():
|
||||
small = NodeMemory(name="32", physical_usable_gib=32.0, unified=True)
|
||||
|
||||
assert small.reserve_gib == RESERVE_FLOOR_GIB == 8.0 # 20% of 32 is only 6.4
|
||||
assert small.placement_budget_gib == 24.0
|
||||
|
||||
|
||||
def test_the_reserve_fraction_binds_on_large_nodes():
|
||||
large = NodeMemory(name="128", physical_usable_gib=128.0, unified=True)
|
||||
|
||||
assert large.reserve_gib == 25.6 # 20% of 128 clears the 8 GiB floor
|
||||
assert large.placement_budget_gib == 102.4
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("tier", "reserve", "budget", "arithmetic_minimum", "recommended"),
|
||||
[
|
||||
(32.0, 8.0, 24.0, 9, 10),
|
||||
(48.0, 9.6, 38.4, 6, 6),
|
||||
(64.0, 12.8, 51.2, 4, 5),
|
||||
(96.0, 19.2, 76.8, 3, 3),
|
||||
(128.0, 25.6, 102.4, 2, 3),
|
||||
],
|
||||
)
|
||||
def test_topology_planner_reproduces_the_published_tier_table(
|
||||
manifest, snapshot, tier, reserve, budget, arithmetic_minimum, recommended
|
||||
):
|
||||
plan = plan_topology(manifest, snapshot, physical_usable_gib=tier)
|
||||
|
||||
assert round(plan.reserve_gib, 2) == reserve
|
||||
assert round(plan.placement_budget_gib, 2) == budget
|
||||
assert plan.arithmetic_minimum_nodes == arithmetic_minimum
|
||||
assert plan.recommended_nodes == recommended
|
||||
assert round(plan.weight_gib, 3) == 201.832
|
||||
assert round(plan.kv_gib, 2) == 0.89 # 16K, concurrency 1, Q8_0, conservative DSA
|
||||
|
||||
|
||||
def test_the_recommended_topologies_are_five_by_64_or_three_by_96_or_128(manifest, snapshot):
|
||||
assert plan_topology(manifest, snapshot, physical_usable_gib=64.0).recommended_nodes == 5
|
||||
assert plan_topology(manifest, snapshot, physical_usable_gib=96.0).recommended_nodes == 3
|
||||
assert plan_topology(manifest, snapshot, physical_usable_gib=128.0).recommended_nodes == 3
|
||||
|
||||
|
||||
def test_two_by_128_is_an_arithmetic_minimum_not_a_recommendation(manifest, snapshot):
|
||||
plan = plan_topology(manifest, snapshot, physical_usable_gib=128.0)
|
||||
|
||||
assert plan.arithmetic_minimum_nodes == 2
|
||||
assert plan.recommended_nodes == 3
|
||||
assert not plan.is_arithmetic_minimum_topology, (
|
||||
"2x128 GiB leaves no room for endpoint/tensor imbalance; it is a fit probe that "
|
||||
"requires measured placement evidence, not the alpha recommendation"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("bad", [0.9, float("nan"), float("inf"), True])
|
||||
def test_an_invalid_placement_imbalance_is_rejected(manifest, snapshot, bad):
|
||||
with pytest.raises(ResourcePlanError, match="less than an equal share"):
|
||||
plan_topology(manifest, snapshot, physical_usable_gib=64.0, imbalance_factor=bad)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Route fit
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_the_recommended_five_by_64_route_fits(manifest, snapshot):
|
||||
nodes = [
|
||||
NodeMemory.from_host(f"node-{i}", system_ram_gib=64.0, unified=True) for i in range(5)
|
||||
]
|
||||
|
||||
fit = plan_route(manifest, snapshot, nodes)
|
||||
|
||||
assert fit.fits
|
||||
assert fit.meets_hard_fit_floor
|
||||
assert fit.no_single_node_can_admit_target
|
||||
assert fit.reasons == ()
|
||||
|
||||
|
||||
def test_224_gib_aggregate_is_a_hard_fit_floor_not_an_operational_envelope(manifest, snapshot):
|
||||
"""Exactly 224 GiB of aggregate memory clears the floor and still does not fit.
|
||||
|
||||
This is the whole reason the roadmap calls 224 GiB an *experimental hard-fit
|
||||
floor*. It is the number you get by ignoring the per-node reserve — and once
|
||||
the reserve is applied, the weights alone no longer have anywhere to go.
|
||||
"""
|
||||
nodes = [
|
||||
NodeMemory.from_host(f"node-{i}", system_ram_gib=112.0, unified=True) for i in range(2)
|
||||
]
|
||||
|
||||
fit = plan_route(manifest, snapshot, nodes)
|
||||
|
||||
assert fit.aggregate_usable_gib == AGGREGATE_HARD_FIT_FLOOR_GIB == 224.0
|
||||
assert fit.meets_hard_fit_floor
|
||||
assert not fit.fits, "224 GiB aggregate does not fit the target once reserves are honoured"
|
||||
assert any("below the" in reason for reason in fit.reasons)
|
||||
|
||||
|
||||
def test_a_route_too_small_for_the_target_does_not_fit(manifest, snapshot):
|
||||
nodes = [
|
||||
NodeMemory.from_host(f"node-{i}", system_ram_gib=64.0, unified=True) for i in range(3)
|
||||
]
|
||||
|
||||
fit = plan_route(manifest, snapshot, nodes)
|
||||
|
||||
assert not fit.fits
|
||||
assert not fit.meets_hard_fit_floor
|
||||
|
||||
|
||||
def test_a_route_where_one_node_could_hold_everything_is_not_distributed_alpha(
|
||||
manifest, snapshot
|
||||
):
|
||||
nodes = [
|
||||
NodeMemory.from_host(f"node-{i}", system_ram_gib=512.0, unified=True) for i in range(2)
|
||||
]
|
||||
|
||||
fit = plan_route(manifest, snapshot, nodes)
|
||||
|
||||
assert fit.fits
|
||||
assert not fit.no_single_node_can_admit_target
|
||||
assert any("single-host run" in reason for reason in fit.reasons)
|
||||
|
||||
|
||||
def test_a_single_node_is_not_a_route(manifest, snapshot):
|
||||
with pytest.raises(ResourcePlanError, match="at least two physical nodes"):
|
||||
plan_route(
|
||||
manifest,
|
||||
snapshot,
|
||||
[NodeMemory.from_host("solo", system_ram_gib=512.0, unified=True)],
|
||||
)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Seams and network
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_seam_bytes_match_the_published_activation_arithmetic(snapshot):
|
||||
plan = plan_seams(snapshot, node_count=4, context_tokens=16_384)
|
||||
|
||||
assert plan.seam_count == 3, "four nodes imply three serial seams"
|
||||
assert plan.bytes_per_token_per_seam == 12_288 # 6144 x bf16
|
||||
assert plan.prefill_bytes_per_seam == 192 * 1024**2 # 192 MiB
|
||||
assert plan.decode_bytes_per_seam_per_token == 12 * 1024 # 12 KiB
|
||||
assert plan.dsa_sideband_bytes_per_query == 8 * 1024 # 2048 int32 = 8 KiB
|
||||
|
||||
|
||||
def test_2_5_gbe_is_the_alpha_minimum_and_10_gbe_is_recommended(snapshot):
|
||||
gigabit = plan_seams(snapshot, node_count=3, link_rate_gbps=1.0)
|
||||
minimum = plan_seams(snapshot, node_count=3, link_rate_gbps=MIN_LINK_RATE_GBPS)
|
||||
recommended = plan_seams(snapshot, node_count=3, link_rate_gbps=RECOMMENDED_LINK_RATE_GBPS)
|
||||
|
||||
assert not gigabit.meets_alpha_minimum, "1 GbE is fit-only evidence, not an alpha route"
|
||||
assert minimum.meets_alpha_minimum
|
||||
assert not minimum.is_recommended_link
|
||||
assert recommended.meets_alpha_minimum
|
||||
assert recommended.is_recommended_link
|
||||
|
||||
|
||||
def test_serial_seam_latency_is_modelled_separately_from_bandwidth(snapshot):
|
||||
"""Decode moves 12 KiB a token. What it pays is hops, not bytes."""
|
||||
fast_link = plan_seams(snapshot, node_count=5, link_rate_gbps=10.0, per_hop_latency_ms=2.0)
|
||||
slow_link = plan_seams(snapshot, node_count=5, link_rate_gbps=2.5, per_hop_latency_ms=2.0)
|
||||
|
||||
# Quadrupling the link rate barely touches decode: the payload is tiny.
|
||||
assert fast_link.decode_bandwidth_share_ms_per_token < 0.05
|
||||
assert slow_link.decode_bandwidth_share_ms_per_token < 0.2
|
||||
|
||||
# Latency is unchanged by link rate and scales with the number of serial seams.
|
||||
assert fast_link.decode_latency_ms_per_token == slow_link.decode_latency_ms_per_token == 8.0
|
||||
|
||||
# A 10 GbE claim cannot buy back a hop.
|
||||
assert fast_link.decode_latency_ms_per_token > fast_link.decode_bandwidth_share_ms_per_token
|
||||
|
||||
|
||||
def test_adding_a_node_adds_a_serial_seam_to_every_decoded_token(snapshot):
|
||||
three = plan_seams(snapshot, node_count=3, per_hop_latency_ms=1.0)
|
||||
five = plan_seams(snapshot, node_count=5, per_hop_latency_ms=1.0)
|
||||
|
||||
assert three.decode_latency_ms_per_token == 2.0
|
||||
assert five.decode_latency_ms_per_token == 4.0
|
||||
|
||||
|
||||
@pytest.mark.parametrize("bad", [float("nan"), float("inf"), 0.0, True])
|
||||
def test_seam_planner_rejects_invalid_link_telemetry(snapshot, bad):
|
||||
with pytest.raises(ResourcePlanError, match="finite and positive"):
|
||||
plan_seams(snapshot, node_count=3, link_rate_gbps=bad)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# The immutable alpha contract
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_the_packaged_contract_is_sealed_and_verifies(contract):
|
||||
assert contract.contract_id == ALPHA_CONTRACT_ID
|
||||
assert contract.contract_version == 1
|
||||
assert contract.locked_by == "DGR-017"
|
||||
assert contract.raw["locked_before_target_execution"] is True
|
||||
assert contract.digest == compute_contract_digest(contract.raw)
|
||||
|
||||
|
||||
def test_the_contract_locks_the_same_target_as_the_manifest(contract, manifest, snapshot):
|
||||
assert contract.target["source_revision"] == manifest.source_revision
|
||||
assert contract.target["gguf_revision"] == manifest.gguf_revision
|
||||
assert contract.target["quantization"] == manifest.quantization
|
||||
assert contract.target["total_bytes"] == manifest.total_bytes
|
||||
assert contract.target["target_manifest_sha256"] == manifest.digest
|
||||
assert contract.target["architecture_snapshot_sha256"] == snapshot.digest
|
||||
assert contract.target["reasoning_effort"] == "max"
|
||||
|
||||
|
||||
def test_the_packaged_target_documents_are_cross_bound_to_the_contract():
|
||||
contract, manifest, snapshot = load_locked_target()
|
||||
assert contract.target["target_manifest_sha256"] == manifest.digest
|
||||
assert contract.target["architecture_snapshot_sha256"] == snapshot.digest
|
||||
|
||||
|
||||
def test_coordinated_shard_hash_substitution_is_rejected_by_contract(
|
||||
contract, manifest_doc, snapshot
|
||||
):
|
||||
manifest_doc["gguf_artifact"]["shards"][0]["sha256"] = "0" * 64
|
||||
substituted = parse_target_manifest(manifest_doc)
|
||||
|
||||
with pytest.raises(AlphaContractError, match="target_manifest_sha256"):
|
||||
require_contract_target(contract, substituted, snapshot)
|
||||
|
||||
|
||||
def test_internally_consistent_architecture_substitution_is_rejected_by_contract(
|
||||
contract, manifest, snapshot_doc
|
||||
):
|
||||
snapshot_doc["architecture"]["hidden_size"] = 8192
|
||||
substituted = parse_architecture_snapshot(snapshot_doc)
|
||||
|
||||
with pytest.raises(AlphaContractError, match="architecture_snapshot_sha256"):
|
||||
require_contract_target(contract, manifest, substituted)
|
||||
|
||||
|
||||
def test_contract_id_cannot_be_changed_even_when_resealed(contract_doc):
|
||||
contract_doc["contract_id"] = "glm-5.2-max-alpha/v2"
|
||||
contract_doc = seal_contract(contract_doc)
|
||||
|
||||
with pytest.raises(AlphaContractError, match="contract_id"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_max_reasoning_mode_cannot_be_changed_even_when_resealed(contract_doc):
|
||||
contract_doc["target"]["reasoning_effort"] = "high"
|
||||
contract_doc = seal_contract(contract_doc)
|
||||
|
||||
with pytest.raises(AlphaContractError, match="reasoning_effort='max'"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("field", ["schema_version", "contract_version"])
|
||||
def test_boolean_contract_versions_are_rejected_even_when_resealed(contract_doc, field):
|
||||
contract_doc[field] = True
|
||||
contract_doc = seal_contract(contract_doc)
|
||||
|
||||
with pytest.raises(AlphaContractError, match="version"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_wheel_metadata_includes_nested_glm_alpha_json_resources():
|
||||
pyproject = Path(__file__).parents[1] / "packages/node/pyproject.toml"
|
||||
text = pyproject.read_text(encoding="utf-8")
|
||||
assert '"meshnet_node.glm_alpha" = ["data/*.json"]' in text
|
||||
|
||||
|
||||
def test_the_contract_locks_every_roadmap_acceptance_section(contract):
|
||||
for section in (
|
||||
"identity_and_fit",
|
||||
"semantic_correctness",
|
||||
"target_run",
|
||||
"performance",
|
||||
"reliability",
|
||||
"storage",
|
||||
):
|
||||
assert contract.section(section)
|
||||
|
||||
|
||||
def test_the_contract_locks_the_roadmap_thresholds(contract):
|
||||
assert contract.threshold("identity_and_fit", "min_node_reserve_fraction") == 0.20
|
||||
assert contract.threshold("identity_and_fit", "min_node_reserve_gib") == 8.0
|
||||
assert contract.threshold("identity_and_fit", "aggregate_hard_fit_floor_gib") == 224.0
|
||||
assert (
|
||||
contract.threshold("identity_and_fit", "aggregate_floor_class")
|
||||
== "experimental_hard_fit_floor"
|
||||
)
|
||||
assert contract.threshold("identity_and_fit", "forbid_double_counted_unified_memory") is True
|
||||
|
||||
assert contract.threshold("semantic_correctness", "min_greedy_token_agreement") == 0.90
|
||||
assert contract.threshold("semantic_correctness", "min_mean_state_cosine_similarity") == 0.999
|
||||
assert contract.threshold("semantic_correctness", "dense_attention_fallback_satisfies_alpha") is False
|
||||
|
||||
assert contract.threshold("target_run", "context_tokens") == 16_384
|
||||
assert contract.threshold("target_run", "kv_dtype") == "Q8_0"
|
||||
assert contract.threshold("target_run", "min_link_rate_gbps") == MIN_LINK_RATE_GBPS
|
||||
assert contract.threshold("target_run", "recommended_link_rate_gbps") == RECOMMENDED_LINK_RATE_GBPS
|
||||
assert contract.threshold("target_run", "min_output_tokens") == 512
|
||||
|
||||
assert contract.threshold("performance", "min_median_decode_tokens_per_second") == 0.5
|
||||
assert contract.threshold("performance", "max_ttft_seconds_at_4096_prompt") == 600
|
||||
assert contract.threshold("performance", "quality_pass_with_speed_fail_verdict") == "stop"
|
||||
|
||||
assert contract.threshold("reliability", "synthetic_workers_satisfy_alpha") is False
|
||||
assert contract.threshold("storage", "forbidden_path_prefixes") == ["/home"]
|
||||
|
||||
|
||||
def test_the_contract_offers_only_alpha_or_stop(contract):
|
||||
assert sorted(contract.verdicts) == ["alpha", "stop"]
|
||||
|
||||
|
||||
def test_lowering_the_speed_floor_after_seeing_a_result_is_rejected(contract_doc):
|
||||
"""The exact move the contract exists to prevent."""
|
||||
contract_doc["performance"]["min_median_decode_tokens_per_second"] = 0.05
|
||||
|
||||
with pytest.raises(AlphaContractError, match="modified since it was locked"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_relabelling_a_speed_failure_as_a_pass_is_rejected(contract_doc):
|
||||
contract_doc["performance"]["quality_pass_with_speed_fail_verdict"] = "alpha"
|
||||
|
||||
with pytest.raises(AlphaContractError, match="modified since it was locked"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_admitting_the_dense_attention_fallback_after_the_fact_is_rejected(contract_doc):
|
||||
contract_doc["semantic_correctness"]["dense_attention_fallback_satisfies_alpha"] = True
|
||||
|
||||
with pytest.raises(AlphaContractError, match="modified since it was locked"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_relaxing_the_per_node_reserve_after_the_fact_is_rejected(contract_doc):
|
||||
contract_doc["identity_and_fit"]["min_node_reserve_gib"] = 1.0
|
||||
|
||||
with pytest.raises(AlphaContractError, match="modified since it was locked"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_re_pointing_the_contract_at_a_different_artifact_is_rejected(contract_doc):
|
||||
contract_doc["target"]["gguf_revision"] = "9" * 40
|
||||
|
||||
with pytest.raises(AlphaContractError, match="modified since it was locked"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_an_unsealed_contract_is_rejected(contract_doc):
|
||||
del contract_doc["contract_sha256"]
|
||||
|
||||
with pytest.raises(AlphaContractError, match="cannot prove it predates"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_a_contract_not_locked_before_execution_is_rejected(contract_doc):
|
||||
contract_doc["locked_before_target_execution"] = False
|
||||
contract_doc = seal_contract(contract_doc)
|
||||
|
||||
with pytest.raises(AlphaContractError, match="not a contract"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_a_third_verdict_is_rejected(contract_doc):
|
||||
contract_doc["verdicts"] = ["alpha", "stop", "partial"]
|
||||
contract_doc = seal_contract(contract_doc)
|
||||
|
||||
with pytest.raises(AlphaContractError, match="third outcome"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_a_dropped_acceptance_section_is_rejected(contract_doc):
|
||||
del contract_doc["reliability"]
|
||||
contract_doc = seal_contract(contract_doc)
|
||||
|
||||
with pytest.raises(AlphaContractError, match="missing locked acceptance section"):
|
||||
parse_alpha_contract(contract_doc)
|
||||
|
||||
|
||||
def test_resealing_a_mutated_contract_changes_its_digest(contract, contract_doc):
|
||||
"""Tamper-evidence, not tamper-proofing: a rewrite is legal but never silent."""
|
||||
contract_doc["performance"]["min_median_decode_tokens_per_second"] = 0.05
|
||||
resealed = seal_contract(contract_doc)
|
||||
|
||||
# It parses — nothing in-repo can stop a determined rewrite of file plus digest.
|
||||
reparsed = parse_alpha_contract(resealed)
|
||||
|
||||
# But the digest moved, so the change is a visible diff on a file whose entire
|
||||
# purpose is to not change, and the contract_id still claims to be v1.
|
||||
assert reparsed.digest != contract.digest
|
||||
|
||||
|
||||
def test_an_unknown_threshold_cannot_be_invented_at_read_time(contract):
|
||||
with pytest.raises(AlphaContractError, match="is not locked"):
|
||||
contract.threshold("performance", "min_decode_tokens_per_second_v2")
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# The tests themselves stay offline
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_the_packaged_data_files_are_valid_json_and_load_offline(manifest, snapshot, contract):
|
||||
"""No network, no model, no GPU: the whole target contract is reviewable offline."""
|
||||
assert json.dumps(manifest.to_dict())
|
||||
assert json.dumps(snapshot.to_dict())
|
||||
assert json.dumps(contract.to_dict())
|
||||
assert len(manifest.digest) == 64
|
||||
Reference in New Issue
Block a user