test(observatory): isolate legacy contracts from installed package pins

Freeze configuration-only legacy fixtures from 7025e17, update current installed-image assertions, and explicitly reject the prior agent image. Production admission and digest validation are unchanged.
This commit is contained in:
DCCONSTRUCTIONS
2026-09-02 01:02:38 +03:00
parent ffd6be5606
commit 05c99efb68
5 changed files with 493 additions and 15 deletions
+13
View File
@@ -0,0 +1,13 @@
# Legacy LAB V1 contract fixtures
Configuration-only snapshots from commit
`7025e173a3370a1b70afaad8579db20903436157`:
- `definitions.json`: `config/observatory-portable-run-definitions.json`.
- `release.json`: `experiments/perception/worker/observatory_portable/lab-v1-eomt-ddrnet-executor-candidate.json`.
The legacy orchestration/blocked-release tests must not read the mutable current
installed-package manifest: its asset vocabulary and executable contract differ.
Current installed-package tests continue to read current repository manifests.
These fixtures contain configuration references and digests, not raw recordings,
model weights, credentials, or evidence of current Worker readiness.
@@ -0,0 +1,241 @@
{
"schema_version": "missioncore.observatory-portable-run-definition-registry/v2",
"definitions": [
{
"setup_id": "lab-v1-eomt-ddrnet-portable-v1",
"definition_id": "lab-v1-eomt-ddrnet-portable",
"version": 2,
"definition_sha256": "3692d41cec3949f348a36eb60a501fb2cd483fed1645679b0ec58061a2fc6dc2",
"source_requirements": {
"plugin_id": "nodedc.device.xgrids-lixelkity-k1",
"archive_id": "xgrids-k1.viewer-live.evidence",
"required_modalities": [
"point-cloud",
"trajectory",
"video"
],
"camera_source_id": "sensor.camera.right",
"camera_semantic_channel_id": "camera.video.recorded",
"recorded_media_type": "video/mp4; codecs=\"avc1.641028\"",
"recorded_media_init_sha256": "e2279963e16d84c91d68e7dbb1f7efed840533387dfeb844b7398bff45fbde38",
"camera_width": 800,
"camera_height": 600,
"calibration_slot": "camera_1",
"calibration_identity_sha256": "05f3ad9b38b3a4fc95388a8ec83da83c745e217709e51787b3d5aad0969f6fa9",
"exactly_one_media_epoch": true,
"seekable": true
},
"source_adapter": {
"adapter_id": "xgrids-k1-recorded-observatory-v2",
"version": 2,
"contract_sha256": "4e12be6d2503e2e237eddb290b28d6a7d16cf983855b6d8e6b4e3b65d2feb0de"
},
"components": [
{
"component_id": "ddrnet-portable-runtime-config-v2",
"kind": "configuration",
"sha256": "c0ff657dadc86607d77d232e84d041fbf2d8b63e86d02319e9cd607220d00f21"
},
{
"component_id": "eomt-recorded-dependency-set-v1",
"kind": "dependency-set",
"sha256": "4eb1f8d33236806e74f9e5bb96b7dce2ac37623dc39b2184be2aa8d7d00e983e"
},
{
"component_id": "eomt-recorded-orchestrator-v1",
"kind": "orchestrator",
"sha256": "d3e9435939444ab35b27a744ac314e289ebd66a13fa56e3d59f121e088d22774"
},
{
"component_id": "eomt-recorded-profile-v1",
"kind": "profile",
"sha256": "ea583966bc3409f5cf563cbf4fad05e366907e67187082eb692aff53d9f5d875"
},
{
"component_id": "eomt-recorded-runner-v1",
"kind": "runner",
"sha256": "651e8e06c3912dffb036b7fd08f2c0623f7563d8306cc7aee05db562798518f4"
},
{
"component_id": "k1-camera-1-calibration-v1",
"kind": "calibration",
"sha256": "05f3ad9b38b3a4fc95388a8ec83da83c745e217709e51787b3d5aad0969f6fa9"
},
{
"component_id": "k1-valid-fov-identity-v1",
"kind": "valid-fov-identity",
"sha256": "b4dd8ddf2b87c1d520ee8a0868c4fea062d7c14d1bae73ccabd3abe1f3acbac2"
},
{
"component_id": "k1-valid-fov-mask-v1",
"kind": "valid-fov-mask",
"sha256": "a40cee06b7c6f69b6a09a11563dcfd237f3de833b1ccd31459e66692e528ba63"
},
{
"component_id": "vegetation-mission-policy-v1",
"kind": "policy",
"sha256": "b75c4ac841d7b4bcc57f7a9c8417ca2317d8ecfa499e72a9af8a8591a2ec0d35"
},
{
"component_id": "vegetation-provider-label-map-v1",
"kind": "provider-map",
"sha256": "f2b69046b6a740fd9532d2d88e7fabae7c20fb662f783c9502adc9026406f352"
}
],
"models": [
{
"release_id": "eomt-cityscapes-large-1024-v1",
"model_id": "tue-mps/cityscapes_semantic_eomt_large_1024",
"revision": "8d6b6d1a3f7b50d441afd7d247c2ed10db186e8f",
"architecture": "EomtForUniversalSegmentation",
"artifacts": [
{
"role": "config-json",
"byte_length": 1575,
"sha256": "7f4aa94fa4e43c0dbd79a5420edb511120aef62bd82bfbcbcece79948286a650"
},
{
"role": "model-weights",
"byte_length": 1276175488,
"sha256": "c265da9a74f58f5c3f4826d23ca4ca78beac0b106cca5842beca61580de5b782"
},
{
"role": "preprocessor-config",
"byte_length": 666,
"sha256": "97e2fbf7f0bdba2cfc90251c5133bae9c27ddc9c4410509f40670be2332854e7"
}
]
},
{
"release_id": "lab-v1-ddrnet-39-goose-fine-64-v1",
"model_id": "goose-ddrnet-class-512",
"revision": null,
"architecture": "ddrnet_39",
"artifacts": [
{
"role": "checkpoint",
"byte_length": 259419077,
"sha256": "b99c2838051bcd7b092fd3970aa62a77d5c0bbb809c9b9afb2ff4b0ebdaa4ee6"
}
]
}
],
"resource_profile": {
"schema_version": "missioncore.observatory-portable-resource-profile/v2",
"profile_id": "worker006-single-gpu-sequential-ai-v1",
"contour_id": "worker-006",
"accelerator_id": "nvidia-rtx-4090",
"concurrency": 1,
"checkpoint_policy": "non-checkpointable",
"allowed_checkpoints": [],
"profile_sha256": "7468138cad115210eda18e7a3350e3423d3d39ac0aae650b3266cdc2bc63fd5d"
},
"result_contract": {
"schema_version": "missioncore.observatory-portable-result-contract/v2",
"contract_id": "recorded-eomt-ddrnet-review-v2",
"version": 2,
"result_schema": "missioncore.recorded-eomt-ddrnet-review/v2",
"result_kind": "recorded-perception-qualification",
"publication": "observatory",
"contract_sha256": "b3dfaa8e20a0f22fc510d062ac469f010a3281c650059d9ea134f0b3ccb38d9a"
},
"executor": {
"contour_id": "worker-006",
"state": "not-installed",
"release_id": null,
"release_sha256": null,
"image_sha256": null,
"reason_code": "lab-v1-portable-v2-uninstalled",
"reason": "Portable LAB V1 v2 is not sealed or installed; a commit-bound combined image and Worker 006 receipt are required."
},
"authority": {
"commands_enabled": false,
"actuation_allowed": false,
"navigation_or_safety_accepted": false,
"production_accepted": false
}
},
{
"setup_id": "m49-tgs-portable-v2",
"definition_id": "m49-tgs-portable",
"version": 3,
"definition_sha256": "f56d6321bd794ccdfb7d2e3b05d044b11f616ffb81ee29517386cc253046d4eb",
"source_requirements": {
"plugin_id": "nodedc.device.xgrids-lixelkity-k1",
"archive_id": "xgrids-k1.viewer-live.evidence",
"required_modalities": [
"point-cloud",
"trajectory",
"video"
],
"camera_source_id": "sensor.camera.right",
"camera_semantic_channel_id": "camera.video.recorded",
"recorded_media_type": "video/mp4; codecs=\"avc1.641028\"",
"recorded_media_init_sha256": "e2279963e16d84c91d68e7dbb1f7efed840533387dfeb844b7398bff45fbde38",
"camera_width": 800,
"camera_height": 600,
"calibration_slot": "camera_1",
"calibration_identity_sha256": "05f3ad9b38b3a4fc95388a8ec83da83c745e217709e51787b3d5aad0969f6fa9",
"exactly_one_media_epoch": true,
"seekable": true
},
"source_adapter": {
"adapter_id": "xgrids-k1-recorded-observatory-v2",
"version": 2,
"contract_sha256": "4e12be6d2503e2e237eddb290b28d6a7d16cf983855b6d8e6b4e3b65d2feb0de"
},
"components": [
{
"component_id": "k1-camera-1-calibration-v1",
"kind": "calibration",
"sha256": "05f3ad9b38b3a4fc95388a8ec83da83c745e217709e51787b3d5aad0969f6fa9"
},
{
"component_id": "m49-tgs-portable-profile-v2",
"kind": "configuration",
"sha256": "6128d6af7e6137f9a9473db045e3b155e2105319159f17c32f344b4aedf823a9"
},
{
"component_id": "m49-tgs-portable-runner-v1",
"kind": "runner",
"sha256": "e3bb2e91c70712eff74e8e69718075a407e042fb494616d65984500da42b21a9"
}
],
"models": [],
"resource_profile": {
"schema_version": "missioncore.observatory-portable-resource-profile/v2",
"profile_id": "worker006-cpu-single-run-portable-v2",
"contour_id": "worker-006",
"accelerator_id": "cpu-only",
"concurrency": 1,
"checkpoint_policy": "non-checkpointable",
"allowed_checkpoints": [],
"profile_sha256": "49e373f1cbf314e7fab2d176db295f3d3d9ddbbcbd724bbde988ef60ad767dee"
},
"result_contract": {
"schema_version": "missioncore.observatory-portable-result-contract/v2",
"contract_id": "m49-tgs-portable-review-v2",
"version": 2,
"result_schema": "missioncore.recorded-tgs-costmap-review/v2",
"result_kind": "recorded-perception-qualification",
"publication": "observatory",
"contract_sha256": "9dd80c8e2504559d2156fca933de6eb27901e35305e6853aeb84707e1cb13892"
},
"executor": {
"contour_id": "worker-006",
"state": "ready",
"release_id": "m49-tgs-portable-executor-v1",
"release_sha256": "c5b0670d943fe0452ef4bbfbc144ab2439a1a674f9ef164798ad9f8b1ecc29fa",
"image_sha256": "f9278ab21aa65045be993dd19bffc25f49955e19598893ac78cc4761ca63ecf3",
"reason_code": null,
"reason": null
},
"authority": {
"commands_enabled": false,
"actuation_allowed": false,
"navigation_or_safety_accepted": false,
"production_accepted": false
}
}
]
}
+218
View File
@@ -0,0 +1,218 @@
{
"assets": [
{
"asset_id": "ddrnet-checkpoint",
"byte_length": 259419077,
"kind": "model-artifact",
"repository_path": null,
"sha256": "b99c2838051bcd7b092fd3970aa62a77d5c0bbb809c9b9afb2ff4b0ebdaa4ee6"
},
{
"asset_id": "ddrnet-goose-image",
"byte_length": null,
"kind": "container-image",
"repository_path": null,
"sha256": "591cb382c099eeb05e7ec16e2371e0b2da54d2bb5c49ec0f4ac88dbf72b0f0cd"
},
{
"asset_id": "ddrnet-goose-mapping",
"byte_length": null,
"kind": "runtime-artifact",
"repository_path": null,
"sha256": "88ae319ba5a3877dd3ae0773f693a6a5fdc283934140de9dfaff029108aefd7f"
},
{
"asset_id": "ddrnet-goose-runner",
"byte_length": 32877,
"kind": "repository-file",
"repository_path": "experiments/perception/worker/lab_v1_vegetation_goose/run_goose_vegetation_benchmark.py",
"sha256": "b18ad60f277eea69a240a28f290611b94627fb9707faf1bb3e6e22102dad67c1"
},
{
"asset_id": "ddrnet-image-dockerfile",
"byte_length": 1793,
"kind": "repository-file",
"repository_path": "experiments/perception/worker/lab_v1_vegetation_goose/Dockerfile",
"sha256": "8203fd01e05d8f5bcce11c328dd39dbb6b97df54ca5d9690706536bafe3d3bad"
},
{
"asset_id": "ddrnet-portable-config",
"byte_length": 4324,
"kind": "repository-file",
"repository_path": "config/perception/lab-v1-eomt-ddrnet-portable-v2.json",
"sha256": "c0ff657dadc86607d77d232e84d041fbf2d8b63e86d02319e9cd607220d00f21"
},
{
"asset_id": "eomt-config-json",
"byte_length": 1575,
"kind": "model-artifact",
"repository_path": null,
"sha256": "7f4aa94fa4e43c0dbd79a5420edb511120aef62bd82bfbcbcece79948286a650"
},
{
"asset_id": "eomt-dependency-set",
"byte_length": null,
"kind": "definition-component",
"repository_path": null,
"sha256": "4eb1f8d33236806e74f9e5bb96b7dce2ac37623dc39b2184be2aa8d7d00e983e"
},
{
"asset_id": "eomt-evaluation-helper",
"byte_length": 28915,
"kind": "repository-file",
"repository_path": "experiments/perception/worker/run_evaluation_prelabels.py",
"sha256": "25baf30c0df564734e08f38ace88cc4bc147cacf240c761622279511e361daa4"
},
{
"asset_id": "eomt-image",
"byte_length": null,
"kind": "container-image",
"repository_path": null,
"sha256": "58df7489c3f2276f9591d500a012dee03e23d35543ce3c390b4c001e6bf90794"
},
{
"asset_id": "eomt-model-weights",
"byte_length": 1276175488,
"kind": "model-artifact",
"repository_path": null,
"sha256": "c265da9a74f58f5c3f4826d23ca4ca78beac0b106cca5842beca61580de5b782"
},
{
"asset_id": "eomt-orchestrator",
"byte_length": 21489,
"kind": "repository-file",
"repository_path": "experiments/perception/worker/Invoke-E4FullSessionSegmentation.ps1",
"sha256": "d3e9435939444ab35b27a744ac314e289ebd66a13fa56e3d59f121e088d22774"
},
{
"asset_id": "eomt-preprocessor-config",
"byte_length": 666,
"kind": "model-artifact",
"repository_path": null,
"sha256": "97e2fbf7f0bdba2cfc90251c5133bae9c27ddc9c4410509f40670be2332854e7"
},
{
"asset_id": "eomt-profile",
"byte_length": 3805,
"kind": "repository-file",
"repository_path": "experiments/perception/worker/e3_k1_camera1_profile.json",
"sha256": "ea583966bc3409f5cf563cbf4fad05e366907e67187082eb692aff53d9f5d875"
},
{
"asset_id": "eomt-profile-runtime",
"byte_length": 45789,
"kind": "repository-file",
"repository_path": "experiments/perception/worker/run_e3_rectified_segmentation.py",
"sha256": "01881862d4eaa218955f776a948124bf19c34be2b5ec282115daeacb15c53ae6"
},
{
"asset_id": "eomt-recorded-runtime",
"byte_length": 34899,
"kind": "repository-file",
"repository_path": "experiments/perception/worker/run_recorded_perception_epoch.py",
"sha256": "4dcc4fc8bdf33702651a199be69d0dd4fadb243d2e65aee1c3d1ae7a58fdf675"
},
{
"asset_id": "eomt-runner",
"byte_length": 30720,
"kind": "repository-file",
"repository_path": "experiments/perception/worker/run_e4_full_session_segmentation.py",
"sha256": "651e8e06c3912dffb036b7fd08f2c0623f7563d8306cc7aee05db562798518f4"
},
{
"asset_id": "k1-calibration",
"byte_length": null,
"kind": "definition-component",
"repository_path": null,
"sha256": "05f3ad9b38b3a4fc95388a8ec83da83c745e217709e51787b3d5aad0969f6fa9"
},
{
"asset_id": "k1-valid-fov-identity",
"byte_length": null,
"kind": "definition-component",
"repository_path": null,
"sha256": "b4dd8ddf2b87c1d520ee8a0868c4fea062d7c14d1bae73ccabd3abe1f3acbac2"
},
{
"asset_id": "k1-valid-fov-mask",
"byte_length": null,
"kind": "definition-component",
"repository_path": null,
"sha256": "a40cee06b7c6f69b6a09a11563dcfd237f3de833b1ccd31459e66692e528ba63"
},
{
"asset_id": "lab-v1-portable-contracts",
"byte_length": 115196,
"kind": "repository-file",
"repository_path": "src/k1link/observatory/portable_lab_v1_executor.py",
"sha256": "2a18fe862f0934c78e86156708d8b80a3c31644a68829c8e673a0f48538f3473"
},
{
"asset_id": "lab-v1-portable-worker",
"byte_length": 47392,
"kind": "repository-file",
"repository_path": "src/k1link/observatory/portable_lab_v1_worker.py",
"sha256": "56aa40390b8413fdf7f7293329e89420305914abd478821c08bfe8b0a2ec3df8"
},
{
"asset_id": "portable-result-contracts",
"byte_length": 22008,
"kind": "repository-file",
"repository_path": "src/k1link/observatory/portable_result_contract.py",
"sha256": "936d6f20789c26e9bed1c9e34ee51259368eb95bc7e3aa549821d1f7de79030c"
},
{
"asset_id": "portable-worker-runtime",
"byte_length": 39120,
"kind": "repository-file",
"repository_path": "src/k1link/observatory/portable_worker_runtime.py",
"sha256": "205d32116f1ba75d5257d15cc79b5146574d93acd52028a5950f6fca4d8129cb"
},
{
"asset_id": "vegetation-policy",
"byte_length": 3022,
"kind": "repository-file",
"repository_path": "config/perception/lab-v1-vegetation-mission-policy-v1.json",
"sha256": "b75c4ac841d7b4bcc57f7a9c8417ca2317d8ecfa499e72a9af8a8591a2ec0d35"
},
{
"asset_id": "vegetation-provider-map",
"byte_length": 2756,
"kind": "repository-file",
"repository_path": "config/perception/lab-v1-vegetation-provider-label-map-v1.json",
"sha256": "f2b69046b6a740fd9532d2d88e7fabae7c20fb662f783c9502adc9026406f352"
}
],
"authority": {
"actuation_allowed": false,
"commands_enabled": false,
"navigation_or_safety_accepted": false,
"production_accepted": false
},
"candidate_sha256": "9d40369e393aea4b1a09a5784336442a082b1b6126afaac379f1ecece39b54f9",
"declared_blockers": [
"combined-executor-entrypoint-uninstalled",
"combined-executor-image-unsealed",
"commit-bound-source-unavailable",
"ddrnet-component-port-uninstalled",
"eomt-component-port-uninstalled",
"fixture-smoke-unaccepted",
"worker-installation-receipt-unavailable"
],
"definition_id": "lab-v1-eomt-ddrnet-portable",
"definition_contract_sha256": "504e197db72e8bad258a2e4ec117d6d8247297847bd651470f8d43601e2e1fc7",
"definition_version": 2,
"executor_image_sha256": null,
"phases": [
"source-materialization",
"eomt-full-session",
"ddrnet-full-session",
"result-v2-assembly",
"result-v2-validation",
"portable-result-packaging"
],
"release_id": "lab-v1-eomt-ddrnet-worker006-candidate-v2",
"result_contract_sha256": "b3dfaa8e20a0f22fc510d062ac469f010a3281c650059d9ea134f0b3ccb38d9a",
"schema_version": "missioncore.observatory-portable-lab-v1-executor-candidate/v2",
"setup_id": "lab-v1-eomt-ddrnet-portable-v1"
}
@@ -63,15 +63,9 @@ from k1link.observatory.worker_agent import (
)
REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
DEFINITIONS_PATH = REPOSITORY_ROOT / "config" / "observatory-portable-run-definitions.json"
RELEASE_PATH = (
REPOSITORY_ROOT
/ "experiments"
/ "perception"
/ "worker"
/ "observatory_portable"
/ "lab-v1-eomt-ddrnet-executor-candidate.json"
)
LEGACY_FIXTURES = REPOSITORY_ROOT / "tests/fixtures/observatory/legacy-lab-v1"
DEFINITIONS_PATH = LEGACY_FIXTURES / "definitions.json"
RELEASE_PATH = LEGACY_FIXTURES / "release.json"
PORTABLE_DDRNET_CONFIG = (
REPOSITORY_ROOT
/ "config"
@@ -94,10 +94,10 @@ def test_production_candidates_bind_exact_definitions_and_both_are_ready() -> No
assert lab_v1.blockers == ()
assert all(phase.state == "implemented" for phase in lab_v1.phases)
assert lab_v1.executor_identity().release_sha256 == (
"4788005a24ae3e1664aa7aaaf728fb816243bfde8555c80a608f40d1061925b3"
"667858623962cd6d9849a8985b803f59e429916b5c56f76a6fc6c80c0c54526b"
)
assert lab_v1.executor_identity().image_sha256 == (
"840175ccac731b16b7f2815eaebc6e4ef426c49b57daf1911064ff5b7945a8fd"
"5ad7d95baac63af13812cb693d492add4e806a333aba8e60edb2ea1aba754373"
)
m49 = by_setup["m49-tgs-portable-v2"]
@@ -207,12 +207,12 @@ def test_m49_portable_runner_source_release_is_content_addressed() -> None:
def test_ready_lab_candidate_still_requires_complete_local_asset_admission() -> None:
candidate = _runtime().resolve(
"lab-v1-eomt-ddrnet-portable-v1",
"11460f0fa03f713b4f64c8742bc30cc31eac66321931e1edd035553f5c72974a",
"269d71a24b4e63cff54e01273f9d4b35fc6cdd72bc6fadec206169ae0777e6ac",
)
bindings = {
"agent-image": PortableWorkerLocalAssetBinding(
asset_id="agent-image",
image_sha256=("840175ccac731b16b7f2815eaebc6e4ef426c49b57daf1911064ff5b7945a8fd"),
image_sha256=("5ad7d95baac63af13812cb693d492add4e806a333aba8e60edb2ea1aba754373"),
),
"ddrnet-goose-runner": PortableWorkerLocalAssetBinding(
asset_id="ddrnet-goose-runner",
@@ -236,11 +236,11 @@ def test_ready_lab_candidate_still_requires_complete_local_asset_admission() ->
),
"ddrnet-step-image": PortableWorkerLocalAssetBinding(
asset_id="ddrnet-step-image",
image_sha256=("759eeac66145221b3c64f226b9ba9220363af36e4fda9353ef8169551587901c"),
image_sha256=("e6c986100613ec804f0e0076ca8695abf43ff88ef9d5d85f6857e0b41db74051"),
),
"eomt-step-image": PortableWorkerLocalAssetBinding(
asset_id="eomt-step-image",
image_sha256=("29a7e8caef51e1809f11b66498ef8bf3f9b2c5d3de40acdab2968cdd34b9623b"),
image_sha256=("adba3dc8c97b161ba261ec44fca9ebe1680f117d1bcb1481440172cc3331a174"),
),
"vegetation-policy": PortableWorkerLocalAssetBinding(
asset_id="vegetation-policy",
@@ -276,6 +276,18 @@ def test_ready_lab_candidate_still_requires_complete_local_asset_admission() ->
assert "asset-ddrnet-checkpoint-missing" in admission.blockers
assert "asset-eomt-model-cache-missing" in admission.blockers
# A previously admitted image must not pass the current package's digest fence.
old_bindings = {
**bindings,
"agent-image": replace(
bindings["agent-image"],
image_sha256="840175ccac731b16b7f2815eaebc6e4ef426c49b57daf1911064ff5b7945a8fd",
),
}
old_admission = inspect_runtime_candidate(candidate, old_bindings)
assert "asset-agent-image-mismatched" in old_admission.blockers
assert old_admission.ready is False
def test_local_asset_tampering_is_reported_without_execution(tmp_path: Path) -> None:
candidate = _runtime().resolve(