feat(perception): audit E36 second-source eligibility
This commit is contained in:
@@ -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 E32–E35 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 E32–E35 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())
|
||||
Reference in New Issue
Block a user