feat(perception): audit E36 second-source eligibility

This commit is contained in:
DCCONSTRUCTIONS
2026-07-27 18:27:40 +03:00
parent b894945344
commit fa20079c9e
9 changed files with 1213 additions and 1 deletions
@@ -0,0 +1,108 @@
# E36 source catalog admission audit
Date: 2026-07-27
Status: blocked — no eligible second mounted real source
Immutable audit:
`e36-source-catalog-audit-c5a7b259f043c0a4f3be38f869af1e675dfaa43743e45fd4f43fac166d07f849`
This is an engineering admission result, not a LAB E36 run. No transfer replay,
LAB catalog entry or interface was published.
## Question
Does the current Mission Core source catalog contain a second real K1 capture
on which the accepted E32E35 pipeline can run unchanged?
The gate freezes:
- E31 source qualification
`e31-source-qualification-b2460a5eb143688c7eea6821b2277e13aea79868abe81d83f7e78548c119159a`;
- E32 TrackGeometry
`e32-track-geometry-a14ca0e7fb3850ca0dfa3c41634e1b490a2d58ab74d101afc6d6921fbdb0e6fd`;
- E33 worker shadow
`e33-worker-shadow-05cc0bb264410fd49536df90e94067ac39731aff0322a8873700d40008a8bb3a`;
- E34 temporal occupied layer
`e34-temporal-occupied-8d9abb3f2cc072cfdbb16cc4e55798e05c35a0abe0b8f691096770e091573a73`;
- E35 degradation recovery
`e35-degradation-recovery-82bdbd5c5bfde6d932737f077153c3a8472c993c343fcbe8a207c39bfa2a6288`.
Retuning is forbidden.
## Admission rules
A candidate must have all of the following:
1. a distinct ready K1 source session;
2. camera, point-cloud and trajectory modalities;
3. at least 60 seconds of contiguous camera evidence;
4. an exact host-time identity;
5. a hashed physical device identity;
6. a calibration identity bound to that `source_session_id`;
7. a physical mount identity bound to that `source_session_id`.
Missing evidence fails closed. A later calibration snapshot or assumed mount
cannot be silently transferred to an earlier capture.
## Catalog result
Eleven physical source rows were audited.
| Source | Camera/LiDAR/pose/time | Longest camera window | Calibration bound | Mount bound | Decision |
| --- | --- | ---: | --- | --- | --- |
| RAVNOVES00 | yes | 448.8 s | qualified through E31 | unavailable | baseline, not a candidate |
| TEST007 | yes | 206.073 s | no | no | closest candidate; blocked |
| CAM_REC_TEST | yes | 22.884 s | no | no | blocked |
| TEST009 | no camera | — | no | no | blocked |
| Seven legacy sources | no accepted camera package | — | no | no | blocked |
TEST007 is a substantive candidate, not an empty recording. Its accepted source
package contains a sealed 2,061-frame camera epoch plus synchronous point-cloud,
pose and host-time evidence. Device-status evidence hashes to the same physical
K1 identity as RAVNOVES00. That proves the device identity, but it does not
prove which calibration and physical mount applied when TEST007 was recorded.
The two later factory-calibration snapshots have the same device identity and
calibration content, but neither manifest names TEST007 as its source session.
No source-bound mount profile, body transform or mount identity was found.
## Decision
`eligible_source_count = 0`.
E36 replay is not authorized. The exact remaining blockers for TEST007 are:
- `calibration-bound-to-source-session`;
- `mount-bound-to-source-session`.
The audit explicitly keeps these actions false:
- empty LAB publication;
- profile retuning;
- public-dataset substitution;
- automatic new capture;
- command, navigation or safety authority.
## Reproduction
```bash
PYTHONPATH=src .venv/bin/python \
experiments/perception/run_e36_source_catalog_audit.py \
--profile experiments/perception/e36_second_source_eligibility_profile.json \
--inventory experiments/perception/e36_source_catalog_inventory_2026-07-27.json \
--output-root .runtime/compute-experiments/e36/source-audits
```
Exit code `3` means the audited catalog is valid but the transfer gate is
blocked. Invalid profile, inventory or artifact integrity fails separately.
## Next admissible step
Search only primary evidence for a source-scoped TEST007 calibration and mount
binding. If both can be proven, publish those bindings as immutable provenance,
rerun this admission audit and then package E32E35 unchanged for transfer.
If they cannot be proven, A9 remains blocked until an operator separately
authorizes a new capture with calibration and mount identities recorded at
acquisition time.
@@ -0,0 +1,34 @@
{
"authority": {
"commands_enabled": false,
"navigation_or_safety_accepted": false,
"transfer_replay_authorized": false
},
"baseline": {
"frozen_upstream": {
"e31": "e31-source-qualification-b2460a5eb143688c7eea6821b2277e13aea79868abe81d83f7e78548c119159a",
"e32": "e32-track-geometry-a14ca0e7fb3850ca0dfa3c41634e1b490a2d58ab74d101afc6d6921fbdb0e6fd",
"e33": "e33-worker-shadow-05cc0bb264410fd49536df90e94067ac39731aff0322a8873700d40008a8bb3a",
"e34": "e34-temporal-occupied-8d9abb3f2cc072cfdbb16cc4e55798e05c35a0abe0b8f691096770e091573a73",
"e35": "e35-degradation-recovery-82bdbd5c5bfde6d932737f077153c3a8472c993c343fcbe8a207c39bfa2a6288"
},
"source_session_id": "20260720T065719Z_viewer_live"
},
"eligibility": {
"minimum_contiguous_camera_seconds": 60.0,
"require_device_identity": true,
"require_host_time_identity": true,
"require_session_bound_calibration": true,
"require_session_bound_mount": true,
"required_modalities": [
"point-cloud",
"trajectory",
"video"
],
"required_origin": "xgrids-k1.viewer-live.evidence",
"required_status": "ready",
"retuning_allowed": false
},
"profile_id": "e36-second-mounted-real-source/v1",
"schema_version": "missioncore.e36-source-eligibility-profile/v1"
}
@@ -0,0 +1,217 @@
{
"catalog_audited_at_utc": "2026-07-27T15:20:47Z",
"schema_version": "missioncore.e36-source-catalog-inventory/v1",
"sources": [
{
"calibration_binding": null,
"camera": null,
"device_identity": null,
"display_name": "20260715T192051Z_viewer_live",
"duration_seconds": 1915.012314,
"host_time_identity_sha256": null,
"modalities": [
"point-cloud",
"trajectory"
],
"mount_binding": null,
"origin": "legacy-viewer-live",
"raw_transport_sha256": "ace976ddfc6dd5059531167fa7b31705d62641d21dd7cc5ce145ceb49a8c51a4",
"session_id": "20260715T192051Z_viewer_live",
"status": "interrupted"
},
{
"calibration_binding": null,
"camera": null,
"device_identity": null,
"display_name": "20260715T222341Z_viewer_live",
"duration_seconds": null,
"host_time_identity_sha256": null,
"modalities": [],
"mount_binding": null,
"origin": "legacy-viewer-live",
"raw_transport_sha256": null,
"session_id": "20260715T222341Z_viewer_live",
"status": "failed"
},
{
"calibration_binding": null,
"camera": null,
"device_identity": null,
"display_name": "20260716T075132Z_viewer_live",
"duration_seconds": 860.643795,
"host_time_identity_sha256": null,
"modalities": [
"point-cloud",
"trajectory"
],
"mount_binding": null,
"origin": "legacy-viewer-live",
"raw_transport_sha256": "467cbfaf815e7fc73ac737cf102fa4a1a6e0be189ed12be847b98a8e0ed0b35f",
"session_id": "20260716T075132Z_viewer_live",
"status": "interrupted"
},
{
"calibration_binding": null,
"camera": null,
"device_identity": null,
"display_name": "20260716T144355Z_viewer_live",
"duration_seconds": 218.737673,
"host_time_identity_sha256": null,
"modalities": [
"point-cloud",
"trajectory"
],
"mount_binding": null,
"origin": "legacy-viewer-live",
"raw_transport_sha256": "abb2513fb0307e67815ce2a58d23d4327961844b1c811154a4eba54cc6939602",
"session_id": "20260716T144355Z_viewer_live",
"status": "ready"
},
{
"calibration_binding": null,
"camera": null,
"device_identity": null,
"display_name": "20260716T182745Z_viewer_live",
"duration_seconds": 2404.214195,
"host_time_identity_sha256": null,
"modalities": [
"point-cloud",
"trajectory"
],
"mount_binding": null,
"origin": "legacy-viewer-live",
"raw_transport_sha256": "654586831029228398fc9c082a88e3f2bdc49096a40049d3ebde3e3527d30329",
"session_id": "20260716T182745Z_viewer_live",
"status": "ready"
},
{
"calibration_binding": null,
"camera": null,
"device_identity": null,
"display_name": "20260716T191025Z_viewer_live",
"duration_seconds": 699.248385,
"host_time_identity_sha256": null,
"modalities": [
"point-cloud",
"trajectory"
],
"mount_binding": null,
"origin": "legacy-viewer-live",
"raw_transport_sha256": "85e0d1ce0820a1c74b8771aea7fcedd6cce39301d7d17bf404c848552133ef2d",
"session_id": "20260716T191025Z_viewer_live",
"status": "ready"
},
{
"calibration_binding": null,
"camera": null,
"device_identity": null,
"display_name": "20260716T205632Z_viewer_live",
"duration_seconds": 1450.282194,
"host_time_identity_sha256": null,
"modalities": [
"point-cloud",
"trajectory"
],
"mount_binding": null,
"origin": "legacy-viewer-live",
"raw_transport_sha256": "8f82e722ac252018e30139200f4122a6b2621f73594260ebfd4da22f96751d2d",
"session_id": "20260716T205632Z_viewer_live",
"status": "ready"
},
{
"calibration_binding": null,
"camera": {
"frame_count": 230,
"longest_contiguous_seconds": 22.884,
"source_id": "sensor.camera.right",
"status": "complete"
},
"device_identity": {
"device_serial_sha256": "74de39837b34d6db90c3dc583e4c58391fb4cb20a8b77ef8ca8f095471ab1c3a",
"vendor_device_id_sha256": "d9044906a5e5a0501d3db64869397a0307037cce163da72ad55c9b86d7f83fcd"
},
"display_name": "CAM_REC_TEST",
"duration_seconds": 96.918679,
"host_time_identity_sha256": "8722563749941e39cfc999bbc7d5faa85caddab6c381edf5ac76cc1963ea2e83",
"modalities": [
"point-cloud",
"trajectory",
"video"
],
"mount_binding": null,
"origin": "xgrids-k1.viewer-live.evidence",
"raw_transport_sha256": "97c10258c34abeec71d8214a051fb50a46e871ef361e52bb070eeeaf75fab583",
"session_id": "20260718T071709Z_viewer_live",
"status": "ready"
},
{
"calibration_binding": null,
"camera": {
"frame_count": 2061,
"longest_contiguous_seconds": 206.073,
"source_id": "sensor.camera.left",
"status": "sealed-interrupted-source-end"
},
"device_identity": {
"device_serial_sha256": "74de39837b34d6db90c3dc583e4c58391fb4cb20a8b77ef8ca8f095471ab1c3a",
"vendor_device_id_sha256": "d9044906a5e5a0501d3db64869397a0307037cce163da72ad55c9b86d7f83fcd"
},
"display_name": "TEST007",
"duration_seconds": 302.677438,
"host_time_identity_sha256": "0903dad5c7c5901722c91c014042e9aa71a2bd5a2d54a88f947415408449bb2f",
"modalities": [
"point-cloud",
"trajectory",
"video"
],
"mount_binding": null,
"origin": "xgrids-k1.viewer-live.evidence",
"raw_transport_sha256": "e7f60bf589b2885c68ae18b4bf78d5f79a0a7e95c18bca5f9c52d1d960636ed0",
"session_id": "20260718T201659Z_viewer_live",
"status": "ready"
},
{
"calibration_binding": null,
"camera": null,
"device_identity": null,
"display_name": "TEST009",
"duration_seconds": 90.63152,
"host_time_identity_sha256": "8c5c84ddaa742ee358df58d196bfc2bccb8878f5e56070711a6b60e8fc5f9bb0",
"modalities": [
"point-cloud",
"trajectory"
],
"mount_binding": null,
"origin": "xgrids-k1.viewer-live.evidence",
"raw_transport_sha256": "29f68cecfda38339146277914ab8a4db94f9c0a5f43a6018aa4871fafc2f9062",
"session_id": "20260719T220917Z_viewer_live",
"status": "interrupted"
},
{
"calibration_binding": null,
"camera": {
"frame_count": 4489,
"longest_contiguous_seconds": 448.8,
"source_id": "sensor.camera.right",
"status": "complete"
},
"device_identity": {
"device_serial_sha256": "74de39837b34d6db90c3dc583e4c58391fb4cb20a8b77ef8ca8f095471ab1c3a",
"vendor_device_id_sha256": "d9044906a5e5a0501d3db64869397a0307037cce163da72ad55c9b86d7f83fcd"
},
"display_name": "RAVNOVES00",
"duration_seconds": 535.71762,
"host_time_identity_sha256": "582d52b144fc8f72d11787692e44349cf8cfc36c14d0cca37e9c1344b75319c4",
"modalities": [
"point-cloud",
"trajectory",
"video"
],
"mount_binding": null,
"origin": "xgrids-k1.viewer-live.evidence",
"raw_transport_sha256": "70da0edad5cbf0e89b6e2355c0aac294f8c36a67249cd33b8918353fd88c83af",
"session_id": "20260720T065719Z_viewer_live",
"status": "ready"
}
]
}
@@ -0,0 +1,47 @@
#!/usr/bin/env python3
"""Build the immutable E36 second-source catalog audit."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from k1link.compute.e36_source_catalog_audit import (
build_e36_source_catalog_audit,
)
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--profile", type=Path, required=True)
parser.add_argument("--inventory", type=Path, required=True)
parser.add_argument(
"--output-root",
type=Path,
default=Path(".runtime/compute-experiments/e36/source-audits"),
)
args = parser.parse_args()
result = build_e36_source_catalog_audit(
profile_path=args.profile,
inventory_path=args.inventory,
output_root=args.output_root,
)
print(
json.dumps(
{
"result_id": result.result_id,
"result_root": str(result.result_root),
"status": result.report["status"],
"eligible_source_ids": list(result.eligible_source_ids),
"next_gate": result.report["next_gate"],
},
ensure_ascii=False,
sort_keys=True,
)
)
return 0 if result.eligible_source_ids else 3
if __name__ == "__main__":
raise SystemExit(main())