feat(laboratory): publish repeated M48S load envelope
This commit is contained in:
@@ -38,7 +38,7 @@ def test_m48s_lab_seals_visual_comparison_and_load_evidence(tmp_path: Path) -> N
|
||||
assert manifest["result_id"] == result.result_id
|
||||
assert result.result_id.endswith(identity_digest)
|
||||
assert manifest["identity_sha256"] == identity_digest
|
||||
assert len(manifest["artifacts"]) == 39
|
||||
assert len(manifest["artifacts"]) == 45
|
||||
assert manifest["method"]["completeness"] == "complete"
|
||||
assert manifest["bounded_question_accepted"] is True
|
||||
assert manifest["ground_truth"] is False
|
||||
@@ -50,10 +50,10 @@ def test_m48s_lab_seals_visual_comparison_and_load_evidence(tmp_path: Path) -> N
|
||||
"integrated_world_state_gate_passed": True,
|
||||
"full_replay_visual_published": True,
|
||||
"load_envelope_evaluated": True,
|
||||
"production_rate_repeatability_passed": False,
|
||||
"production_rate_repeatability_passed": True,
|
||||
"reserve_12_fps_passed": True,
|
||||
"limit_15_fps_passed": True,
|
||||
"load_envelope_accepted": False,
|
||||
"load_envelope_accepted": True,
|
||||
"detector_replacement_authorized": False,
|
||||
"production_accepted": False,
|
||||
}
|
||||
@@ -86,22 +86,31 @@ def test_m48s_lab_seals_visual_comparison_and_load_evidence(tmp_path: Path) -> N
|
||||
assert hardening["startup"]["prewarm_duration_ms"] == 420.721918
|
||||
assert hardening["startup"]["validation_frames"] == 1_000
|
||||
envelope = manifest["metrics"]["load_envelope"]
|
||||
assert envelope["schema_version"] == "missioncore.m48s-load-envelope-comparison/v1"
|
||||
assert envelope["production_rate_repeatability_passed"] is False
|
||||
assert envelope["schema_version"] == "missioncore.m48s-load-envelope-comparison/v2"
|
||||
assert envelope["repeat_count_per_rate"] == 3
|
||||
assert envelope["production_rate_repeatability_passed"] is True
|
||||
assert envelope["reserve_12_fps_passed"] is True
|
||||
assert envelope["limit_15_fps_passed"] is True
|
||||
assert envelope["load_envelope_accepted"] is False
|
||||
assert envelope["load_envelope_accepted"] is True
|
||||
assert envelope["compute_capacity_at_least_fps"] == 15.0
|
||||
production, reserve, limit = envelope["scenarios"]
|
||||
assert production["delivered_world_states"] == 4_483
|
||||
assert production["superseded_frames"] == 6
|
||||
assert production["operating_target_gate_passed"] is False
|
||||
assert reserve["delivered_world_states"] == 4_477
|
||||
assert reserve["superseded_frames"] == 12
|
||||
assert production["delivered_world_states"] >= 4_485
|
||||
assert production["superseded_frames"] <= 5
|
||||
assert production["operating_target_gate_passed"] is True
|
||||
assert reserve["delivered_world_states"] >= 4_467
|
||||
assert reserve["superseded_frames"] <= 22
|
||||
assert reserve["operating_target_gate_passed"] is True
|
||||
assert limit["delivered_world_states"] == 4_488
|
||||
assert limit["superseded_frames"] == 1
|
||||
assert limit["operating_target_gate_passed"] is True
|
||||
assert all(item["repeat_count"] == 3 for item in envelope["scenarios"])
|
||||
assert all(len(item["repetitions"]) == 3 for item in envelope["scenarios"])
|
||||
assert all(item["all_repetitions_passed"] is True for item in envelope["scenarios"])
|
||||
assert all(item["hot_loop_decode_p95_ms"] < 30 for item in envelope["scenarios"])
|
||||
assert all(
|
||||
item["source_prefetch_preparation_maximum_ms"] > 3_000
|
||||
for item in envelope["scenarios"]
|
||||
)
|
||||
assert all(item["additional_inference_passes"] == 0 for item in envelope["scenarios"])
|
||||
|
||||
catalog = json.loads((result.result_root / "catalog.json").read_text("utf-8"))
|
||||
@@ -122,7 +131,7 @@ def test_m48s_lab_seals_visual_comparison_and_load_evidence(tmp_path: Path) -> N
|
||||
)
|
||||
proof = verify_laboratory_evidence_result(definition, result.result_root)
|
||||
assert proof["result_id"] == result.result_id
|
||||
assert proof["artifact_count"] == 39
|
||||
assert proof["artifact_count"] == 45
|
||||
|
||||
with pytest.raises(M48SFixedClassDetectorLabError, match="already exists"):
|
||||
build_m48s_fixed_class_detector_lab(
|
||||
|
||||
@@ -52,9 +52,11 @@ def test_m48s_lab_api_projects_verified_result_frame_and_camera(tmp_path: Path)
|
||||
assert hardening["hardened"]["delivered_world_states"] == 4_488
|
||||
assert hardening["startup"]["prewarmed"]["world_state_ms"] == 60.516957
|
||||
envelope = result.json()["metrics"]["load_envelope"]
|
||||
assert envelope["production_rate_repeatability_passed"] is False
|
||||
assert envelope["production_rate_repeatability_passed"] is True
|
||||
assert envelope["reserve_12_fps_passed"] is True
|
||||
assert envelope["limit_15_fps_passed"] is True
|
||||
assert envelope["load_envelope_accepted"] is True
|
||||
assert envelope["repeat_count_per_rate"] == 3
|
||||
assert [item["requested_source_rate_hz"] for item in envelope["scenarios"]] == [
|
||||
10.0,
|
||||
12.0,
|
||||
|
||||
@@ -6,7 +6,7 @@ from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
from k1link.perception.detector import DetectorFrameTiming
|
||||
from k1link.perception.recorded_source import DecodedFrameTiming
|
||||
from k1link.perception.recorded_source import DecodedFrameTiming, SourcePacingTiming
|
||||
|
||||
REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
|
||||
RUNNER_PATH = REPOSITORY_ROOT / "experiments/perception/run_m48s_reference_graph_shadow_worker.py"
|
||||
@@ -19,6 +19,14 @@ SPEC.loader.exec_module(RUNNER)
|
||||
def test_frame_timing_store_closes_provider_and_unattributed_time() -> None:
|
||||
store = RUNNER.FrameTimingStore()
|
||||
store.observe_decode(DecodedFrameTiming(sequence=7, duration_ns=5))
|
||||
store.observe_pacing(
|
||||
SourcePacingTiming(
|
||||
sequence=7,
|
||||
scheduled_monotonic_ns=80,
|
||||
emitted_monotonic_ns=90,
|
||||
lateness_ns=10,
|
||||
)
|
||||
)
|
||||
store.observe_detector(
|
||||
DetectorFrameTiming(
|
||||
sequence=7,
|
||||
@@ -50,6 +58,14 @@ def test_frame_timing_store_closes_provider_and_unattributed_time() -> None:
|
||||
def test_pipeline_timing_metrics_preserve_single_pass_stage_breakdown() -> None:
|
||||
store = RUNNER.FrameTimingStore()
|
||||
store.observe_decode(DecodedFrameTiming(sequence=3, duration_ns=1_000_000))
|
||||
store.observe_pacing(
|
||||
SourcePacingTiming(
|
||||
sequence=3,
|
||||
scheduled_monotonic_ns=0,
|
||||
emitted_monotonic_ns=1_000_000,
|
||||
lateness_ns=1_000_000,
|
||||
)
|
||||
)
|
||||
store.observe_detector(
|
||||
DetectorFrameTiming(
|
||||
sequence=3,
|
||||
@@ -79,6 +95,7 @@ def test_pipeline_timing_metrics_preserve_single_pass_stage_breakdown() -> None:
|
||||
assert metrics["detector_ms"]["inference_transport"]["maximum"] == 3.0
|
||||
assert metrics["provider_ms"]["threat"]["maximum"] == 5.0
|
||||
assert metrics["graph_unattributed_ms"]["maximum"] == 6.0
|
||||
assert metrics["delivered_source_pacing_lateness_ms"]["maximum"] == 1.0
|
||||
assert metrics["maximum_graph_sequence"] == 3
|
||||
assert metrics["additional_inference_passes"] == 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user