fix(m4): retain compact obstacle evidence

This commit is contained in:
DCCONSTRUCTIONS
2026-08-05 22:16:33 +03:00
parent 13ed096f80
commit aacc6dc43b
24 changed files with 981 additions and 410 deletions
+7 -12
View File
@@ -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"
+58 -49
View File
@@ -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)]
+8 -9
View File
@@ -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"])