fix(m4): retain compact obstacle evidence
This commit is contained in:
@@ -8,7 +8,7 @@ REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
|
||||
RESULT_ROOT = (
|
||||
REPOSITORY_ROOT
|
||||
/ ".runtime/perception-m4/geometry-results"
|
||||
/ "m4-geometry-replay-8daf3109e3cf30b960b4b376032ff3b5ec58ca42a1e5899b841cf29fbcf14ad8"
|
||||
/ "m4-geometry-replay-b7d72e9e411fd576243d10ab39717e90daa10703b67c6e32ab284f6bd78d344a"
|
||||
)
|
||||
|
||||
|
||||
@@ -28,8 +28,8 @@ def test_full_source_geometry_result_closes_m4_4_contract() -> None:
|
||||
assert proposals["with_range"] == 5341
|
||||
assert proposals["eligible_for_range"] == 13298
|
||||
assert proposals["ownership_collision"] == 146
|
||||
assert result.metrics["geometry_only_observations"] == 21958
|
||||
assert result.metrics["published_source_point_rows"] == 2164767
|
||||
assert result.metrics["geometry_only_observations"] == 22740
|
||||
assert result.metrics["published_source_point_rows"] == 2173778
|
||||
|
||||
|
||||
def test_geometry_result_binds_the_accepted_m4_3_e32_and_e53_evidence() -> None:
|
||||
@@ -38,26 +38,21 @@ def test_geometry_result_binds_the_accepted_m4_3_e32_and_e53_evidence() -> None:
|
||||
assert isinstance(identity, dict)
|
||||
|
||||
assert identity["detector_result_id"] == (
|
||||
"m4-detector-replay-"
|
||||
"11f83f2e0b81758ac2a5a5fc54e9d293b501678df5f6ef97b5c6069ba08605c5"
|
||||
"m4-detector-replay-11f83f2e0b81758ac2a5a5fc54e9d293b501678df5f6ef97b5c6069ba08605c5"
|
||||
)
|
||||
assert identity["geometry_profile_sha256"] == (
|
||||
"420d989aab5918e0f98e3439cadb8b7251332d51b48f4f2c25d77a385bea49f8"
|
||||
"cc666c9389a5e221957faddec89584709b66918d14abaf646f1832e001421999"
|
||||
)
|
||||
assert identity["historical_references"] == {
|
||||
"e32": {
|
||||
"manifest_sha256": (
|
||||
"f4b57c9f7619c43414adf1d10488b05df466226a523a0c001671102ced0e9ab8"
|
||||
),
|
||||
"manifest_sha256": ("f4b57c9f7619c43414adf1d10488b05df466226a523a0c001671102ced0e9ab8"),
|
||||
"result_id": (
|
||||
"e32-track-geometry-"
|
||||
"a14ca0e7fb3850ca0dfa3c41634e1b490a2d58ab74d101afc6d6921fbdb0e6fd"
|
||||
),
|
||||
},
|
||||
"e53": {
|
||||
"manifest_sha256": (
|
||||
"fc5b4ae69aae0098b7075c539d25b563dff1bbb09209a49030edda6cba9ee544"
|
||||
),
|
||||
"manifest_sha256": ("fc5b4ae69aae0098b7075c539d25b563dff1bbb09209a49030edda6cba9ee544"),
|
||||
"result_id": (
|
||||
"e53-camera-first-shadow-"
|
||||
"e6f03cf8bfb15db86100239b060e13f914532618b7b99e811866e4e6a555186c"
|
||||
|
||||
@@ -5,15 +5,19 @@ from pathlib import Path
|
||||
from fastapi.routing import APIRoute
|
||||
|
||||
from k1link.perception.threat_replay import read_threat_replay_result
|
||||
from k1link.sessions import RecordedCameraFrame
|
||||
from k1link.web.m4_threat_replay_api import build_m4_threat_replay_router
|
||||
|
||||
REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
|
||||
RESULT_ID = "m4-threat-replay-ef521b23eee704dee99856b6e93d5047a9b358e21ffda3ea9cacc2ef768164d9"
|
||||
RESULT_ID = "m4-threat-replay-2a953c5f27f2a5b1dddc5c658c1de2c323d7796084a099c024987a1da03aa324"
|
||||
RESULTS_ROOT = REPOSITORY_ROOT / ".runtime/compute-experiments/m4/replay-threat"
|
||||
|
||||
|
||||
def _endpoint(path: str):
|
||||
router = build_m4_threat_replay_router(root_provider=lambda: RESULTS_ROOT)
|
||||
def _endpoint(path: str, *, camera_frame_provider=None):
|
||||
router = build_m4_threat_replay_router(
|
||||
root_provider=lambda: RESULTS_ROOT,
|
||||
camera_frame_provider=camera_frame_provider,
|
||||
)
|
||||
return next(
|
||||
route.endpoint
|
||||
for route in router.routes
|
||||
@@ -28,14 +32,14 @@ def test_full_source_threat_result_closes_m4_6_contract() -> None:
|
||||
assert result.metrics["frames"] == {"total": 4489, "failed": 0}
|
||||
assert result.metrics["evidence"] == {
|
||||
"camera-only": 10158,
|
||||
"current-metric": 27299,
|
||||
"rolling-map-retained": 69855,
|
||||
"stale-or-held": 37995,
|
||||
"current-metric": 28081,
|
||||
"rolling-map-retained": 70989,
|
||||
"stale-or-held": 38025,
|
||||
}
|
||||
assert result.metrics["decisions"] == {
|
||||
"not-threat": 10700,
|
||||
"threat": 6626,
|
||||
"unknown": 127981,
|
||||
"not-threat": 10769,
|
||||
"threat": 7606,
|
||||
"unknown": 128878,
|
||||
}
|
||||
assert result.metrics["fixtures"] == {
|
||||
"critical": 5,
|
||||
@@ -51,10 +55,10 @@ def test_threat_result_is_content_bound_and_visual_evidence_is_complete() -> Non
|
||||
assert isinstance(identity, dict)
|
||||
|
||||
assert identity["frames_sha256"] == (
|
||||
"57219acd7dfe1cf04b12d4a415d1819e0a4947bc3173333bb56eea8fd2bd47b9"
|
||||
"b57be1839f5915e3b80b54355b694e0bd8c9ac318d0cbe6de2bff713082cfa4e"
|
||||
)
|
||||
assert identity["visuals_sha256"] == (
|
||||
"bda54e144a1b4c878ba645a8dafedcdc0332e16a1489b62b7100670e8eae6f25"
|
||||
"14b9679b1df4d50aaceeb3e018e46398a92b47727aa83339179395db4dfcd005"
|
||||
)
|
||||
visual = result.metrics["visual_evidence"]
|
||||
assert isinstance(visual, dict)
|
||||
@@ -70,44 +74,23 @@ def test_threat_result_is_content_bound_and_visual_evidence_is_complete() -> Non
|
||||
"qualified_base_footprint_available",
|
||||
)
|
||||
)
|
||||
assert visual["geometry_regression_sequences"] == [138, 274, 1880]
|
||||
assert visual["frame_1880_regression"] == {
|
||||
"camera_visible_hemispheres_independent_truth": False,
|
||||
"engineering_anchors": [
|
||||
{
|
||||
"anchor_id": "near-concrete-hemisphere",
|
||||
"bounds_body_xyz_m": [[0.3, 1.2], [-0.8, 0.2], [-0.1, 0.9]],
|
||||
"centroid_body_xyz_m": [
|
||||
0.7594228459267565,
|
||||
-0.2681278641873485,
|
||||
0.3753253937774115,
|
||||
],
|
||||
"component_id": "rolling-5329b5d2ef498e6250c931ff",
|
||||
"decision": "threat",
|
||||
"matched": True,
|
||||
"must_assert_threat": True,
|
||||
},
|
||||
{
|
||||
"anchor_id": "far-concrete-hemisphere",
|
||||
"bounds_body_xyz_m": [[1.5, 2.7], [0.6, 1.7], [-0.1, 0.9]],
|
||||
"centroid_body_xyz_m": [
|
||||
2.058019871618555,
|
||||
1.1276051922616088,
|
||||
0.2553253937774115,
|
||||
],
|
||||
"component_id": "rolling-7ba116b07683abeca7c8005b",
|
||||
"decision": "threat",
|
||||
"matched": True,
|
||||
"must_assert_threat": False,
|
||||
},
|
||||
],
|
||||
"gate": "two-visible-hemisphere-regression",
|
||||
"matched_anchor_count": 2,
|
||||
"required_threats_passed": True,
|
||||
"retained_components": 10,
|
||||
"retained_threat_components": 2,
|
||||
"sequence": 1880,
|
||||
}
|
||||
assert visual["geometry_regression_sequences"] == [138, 274, 1880, 2584]
|
||||
frame_1880 = visual["frame_1880_regression"]
|
||||
assert frame_1880["matched_anchor_count"] == 2
|
||||
assert frame_1880["required_threats_passed"] is True
|
||||
assert frame_1880["camera_visible_hemispheres_independent_truth"] is False
|
||||
frame_2584 = visual["frame_2584_regression"]
|
||||
assert frame_2584["matched_anchor_count"] == 2
|
||||
assert frame_2584["required_threats_passed"] is True
|
||||
assert frame_2584["matching_basis"] == (
|
||||
"produced-occupied-cell-inside-camera-reviewed-body-window"
|
||||
)
|
||||
near, far = frame_2584["engineering_anchors"]
|
||||
assert near["anchor_id"] == "near-compact-concrete-hemisphere"
|
||||
assert near["component_state"] == "retained"
|
||||
assert near["decision"] == "threat"
|
||||
assert far["anchor_id"] == "far-concrete-hemisphere-occupancy"
|
||||
assert far["matched"] is True
|
||||
body_frame = result.metrics["body_frame"]
|
||||
assert body_frame["qualified"] == 3861
|
||||
assert body_frame["rejected"] == 67
|
||||
@@ -129,6 +112,7 @@ def test_m4_6_lab_api_projects_report_and_exact_visual_frame() -> None:
|
||||
assert frame["schema_version"] == "missioncore.perception-threat-visual-frame/v2"
|
||||
assert frame["point_cloud_layer"] == "current-increment"
|
||||
assert frame["point_cloud_sample_count"] > 0
|
||||
assert frame["camera_url"].endswith(f"/{RESULT_ID}/visuals/1/camera")
|
||||
assert frame["rig"] == {
|
||||
"length_m": 1.0,
|
||||
"nominal_sensor_height_m": 1.25,
|
||||
@@ -146,3 +130,28 @@ def test_m4_6_video_overlay_covers_the_exact_recorded_camera_timeline() -> None:
|
||||
assert overlay["frames"][0]["frame_index"] == 0
|
||||
assert overlay["frames"][-1]["frame_index"] == 4488
|
||||
assert overlay["authority"] == "replay-simulated"
|
||||
|
||||
|
||||
def test_m4_6_exact_camera_endpoint_is_bound_to_selected_visual_sequence() -> None:
|
||||
calls: list[tuple[str, int]] = []
|
||||
|
||||
def provide(session_id: str, frame_index: int) -> RecordedCameraFrame:
|
||||
calls.append((session_id, frame_index))
|
||||
return RecordedCameraFrame(
|
||||
payload=b"sealed-jpeg",
|
||||
media_type="image/jpeg",
|
||||
width=800,
|
||||
height=600,
|
||||
sha256="a" * 64,
|
||||
)
|
||||
|
||||
endpoint = _endpoint(
|
||||
"/api/v1/laboratory/m4-threat/results/{result_id}/visuals/{ordinal}/camera",
|
||||
camera_frame_provider=provide,
|
||||
)
|
||||
response = endpoint(RESULT_ID, 19)
|
||||
|
||||
assert response.body == b"sealed-jpeg"
|
||||
assert response.media_type == "image/jpeg"
|
||||
assert response.headers["etag"] == f'"{"a" * 64}"'
|
||||
assert calls == [("20260720T065719Z_viewer_live", 2584)]
|
||||
|
||||
@@ -19,7 +19,7 @@ RESULT_ROOT = (
|
||||
ROLLING_RESULT_ROOT = (
|
||||
REPOSITORY_ROOT
|
||||
/ ".runtime/perception-m4/temporal-results"
|
||||
/ "m4-temporal-replay-b8611526dfcd2b9be9049560d751bbd23a9ad54b7dda8e9dc48a17374d46266e"
|
||||
/ "m4-temporal-replay-81e13d5654ac8d1219f6937dd425f7dbcdbacd5748d23fe653297134f0de6c22"
|
||||
)
|
||||
|
||||
|
||||
@@ -77,8 +77,7 @@ def test_temporal_result_is_digest_bound_to_m4_4_e34_e51_and_e46b(
|
||||
identity = result.manifest["identity"]
|
||||
assert isinstance(identity, dict)
|
||||
assert identity["geometry_result_id"] == (
|
||||
"m4-geometry-replay-"
|
||||
"8daf3109e3cf30b960b4b376032ff3b5ec58ca42a1e5899b841cf29fbcf14ad8"
|
||||
"m4-geometry-replay-8daf3109e3cf30b960b4b376032ff3b5ec58ca42a1e5899b841cf29fbcf14ad8"
|
||||
)
|
||||
assert identity["frames_sha256"] == (
|
||||
"1bf1365bdb3f20214443d3f8b87a0fa88f9848af8ca0456b7ca364d37631c3fc"
|
||||
@@ -97,18 +96,18 @@ def test_rolling_temporal_result_separates_increment_from_retained_map() -> None
|
||||
assert result.metrics["rolling_map"] == {
|
||||
"active_cells_at_end": 587,
|
||||
"capacity_evicted_cells": 0,
|
||||
"current_increment_cells": 848868,
|
||||
"current_increment_cells": 849650,
|
||||
"input_frames": 4489,
|
||||
"local_radius_m": 12.0,
|
||||
"maximum_cells": 65536,
|
||||
"maximum_retained_age_ns": 3000000000,
|
||||
"peak_active_cells": 907,
|
||||
"peak_retained_components": 35,
|
||||
"radius_evicted_cells": 6512,
|
||||
"retained_cell_publications": 1776145,
|
||||
"retained_component_publications": 69855,
|
||||
"radius_evicted_cells": 6513,
|
||||
"retained_cell_publications": 1779135,
|
||||
"retained_component_publications": 70989,
|
||||
"retention_ns": 3000000000,
|
||||
"time_evicted_cells": 29620,
|
||||
"time_evicted_cells": 29720,
|
||||
"voxel_size_m": 0.45,
|
||||
}
|
||||
frames = result.result_root / "frames.jsonl"
|
||||
@@ -120,5 +119,5 @@ def test_rolling_temporal_result_separates_increment_from_retained_map() -> None
|
||||
else: # pragma: no cover - immutable artifact guarantees this branch is unreachable
|
||||
raise AssertionError("frame 1880 missing")
|
||||
assert frame["schema_version"] == "missioncore.perception-temporal-replay-frame/v2"
|
||||
assert len(frame["rolling_retained"]) == 10
|
||||
assert len(frame["rolling_retained"]) == 12
|
||||
assert all(item["state"] == "retained" for item in frame["rolling_retained"])
|
||||
|
||||
Reference in New Issue
Block a user