diff --git a/docs/design/ML_BUNDLE_METADATA.md b/docs/design/ML_BUNDLE_METADATA.md index 094754af..cb2b283a 100644 --- a/docs/design/ML_BUNDLE_METADATA.md +++ b/docs/design/ML_BUNDLE_METADATA.md @@ -72,3 +72,24 @@ truthful description of the supplied values. metadata to three actual small Parquet witnesses and the public analysis-job API. All three window files remain byte-identical to the original producer; only the metadata dictionary changes. + + +## Feature rows and nearest lookup + +Retained feature tables can contain session timestamps in a different order +from their stored rows. MCAP message log order, for example, does not establish +the order of embedded session timestamps. Before nearest-feature lookup, the +loader checks the integer timestamps and stably orders timestamp/value pairs +in memory when it finds an inversion. The original Parquet file and the +feature writer's row order remain intact. + +Already ordered rows follow the same lookup path. Equal-distance choices +continue to select the later timestamp. Equal timestamps retain their original +relative row order: an exact query selects the first equal row, while a query +just after them compares the last preceding equal row. No interpolation, +aggregation, timestamp conversion, validity or target-column rule changes. + +[Feature-order receiving](../evidence/ml-bundle-feature-order-713adaab/README.md) +includes actual Parquet inputs and an MCAP-to-feature-table-to-public-job +witness. This qualification concerns deterministic data alignment; it does not +establish physical clock synchronization or hardware accuracy. diff --git a/docs/design/research/PROGRESS.md b/docs/design/research/PROGRESS.md index 775aaa5c..6cc72282 100644 --- a/docs/design/research/PROGRESS.md +++ b/docs/design/research/PROGRESS.md @@ -1,3 +1,29 @@ +## 2026-10-08 — Preserve nearest feature pairs across retained row orders + +Contributor `chatgpt:/root/production_execution`, issue #86, repaired the +ML-bundle loader's assumption that retained feature timestamps were ordered. +A real private MCAP fixture with different log and embedded timestamp orders +passes through the radar extractor, native feature writer and public Job API; +the original bundle selects energy 4 where the nearest sample has energy 9. + +Only feature ingestion adds an inversion check and stable in-memory ordering +of the timestamp and value arrays together. Ordered inputs, duplicate relative +order and the existing equal-distance choice retain their behavior. Stored +inputs, feature writers, kinematics/evaluation, validity, metadata, schema and +the unrelated internal self-digest convention remain unchanged. + +The same 17 final native Python 3.12.10 receivers record 6 original passes and +11 failures, then 17 candidate passes without errors or skips. A separate 14 +inherited metadata, pose, kinematics, bundle, CLI and actual evaluator cases +pass. Paired file readback verifies all 43 original inputs, six byte-identical +ordered output controls, eleven corrected unordered outputs and identical +non-energy columns. The initial receiver's four schema-invalid 2 ns windows +and their correction remain distinct from the final paired qualification. +[Source and receiving custody](../../evidence/ml-bundle-feature-order-713adaab/README.md) +retains exact files and limitations. Independent review and supported Windows +CI remain separate integration gates; no installed or hardware result is +claimed here. + ## 2026-10-08 — Inspect and compare retained analysis parameters Contributor `chatgpt-ac386303dce2/product_execution`, issue #70, implements diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/README.md b/docs/evidence/ml-bundle-feature-order-713adaab/README.md new file mode 100644 index 00000000..b8f5fe10 --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/README.md @@ -0,0 +1,116 @@ +# ML feature ordering: source and native receiving + +Issue [#86](https://github.com/Jacob-Met/CaptureSuite/issues/86) addresses a +data-pairing defect in the ML-bundle producer on current main +`11cc78297d8d214407aea693548af4de855d61da`. + +The loader previously handed stored row order to `numpy.searchsorted`. +Actual radar features can retain an embedded-session timestamp order different +from MCAP log order. A private MCAP fixture passes through the real radar +extractor, native feature-table writer and public analysis Job API: the final +window originally selected energy 4 instead of the nearest sample's energy 9. + +Only four lines are added to `_load_feature_series`: detect an inversion, +then apply the same stable integer timestamp ordering to both arrays. Ordered +inputs avoid sorting. Duplicate relative order and the existing later-time +equal-distance choice remain unchanged. Feature writers, stored source files, +kinematics, target medians, validity, centers, public arguments, schemas and +the unrelated internal manifest self-digest are unchanged. + +## Exact source + +| Input | SHA-256 | +|---|---| +| Original producer | `38b7161f081ef038e6ce464dd3b82ca2b49f775ad8988010243743274d6fc5e6` | +| Candidate producer | `ed67d94ded834d63599797bbd8efb7b26f125bd216f52bcb7f01febb928922ce` | +| Final paired test | `7a5e226afb9c0f49eadf6d4c25b8bc22575f1fdd04afdac854cf8aa4adee58be` | +| Runtime patch | `3232f15dc5b9c443b04d63aa0f23503b9fc19926cda0f83882a4708fa7b5c35e` | +| Paired artifact readback | `e9f1b94c200261104ce9504b8f568a6738b957b26ee8506e8d317a8f6cb8b355` | + +## Actual native results + +All runs use an isolated Linux Python 3.12.10 environment. The exact standalone +runtime archive identity, declared package pins, installed versions, successful +dependency consistency check and complete installation log are retained. +This environment does not alter an installed application or shared runtime. + +| Run | Passed | Failed | Errors / skips | +|---|---:|---:|---:| +| Initial original-source receiver | 4 | 11 | 0 / 0 | +| Corrected final original-source receiver | 6 | 11 | 0 / 0 | +| Same final receiver on candidate | 17 | 0 | 0 / 0 | +| Separate inherited consumers on candidate | 14 | 0 | 0 / 0 | + +The initial receiver included four 2 ns windows below the existing schema +minimum of 0.1 s. Those four cases stopped at an unexpected schema warning +before their intended alignment assertion. Its original test, source, log, +JUnit, artifacts and correction note remain in `evidence/baseline/` and +`evidence/initial-receiver-correction.json`. No schema or product change was +made to accommodate that receiver error. + +The final tests use valid 0.2 s windows. They cover shuffled and reversed rows, +ordered controls, exact high integer timestamps, adjacent nanoseconds above +2^53, stable duplicates, equal-distance choices, numeric-column mean fallback, +a singleton, and the actual MCAP-to-Job API path. The final same-test baseline +and candidate receipts retain process exits, full source maps and unchanged +source checks. + +The separate inherited run selects the complete metadata and +pose/kinematics/ML test modules plus +`test_real_pose_kinematics_bundle_to_external_eval`. It does not repeat the +17 focused receivers. + +Readback of all 17 retained output Parquets found six ordered controls +byte-identical and eleven unordered outputs corrected. Every non-energy +column remains exact. All 43 original input files in the paired runs match +byte-for-byte. Input and final output inventory assertions also execute inside +the tests. + +## Capsule + +[receiving.tar.gz](receiving.tar.gz), SHA-256 +`d80a4d2b79d4491b66ea8227ff92471ebdbb6edd8fe2fce75327bbe755485097`, +contains 296 regular files, 1,502,844 expanded bytes and 265,323 compressed +bytes. [manifest.json](manifest.json) inventories every member's exact bytes +and SHA-256. Every member was reopened and compared after archive creation. + +The capsule includes original/candidate producer snapshots, identical final +test bytes, the original rejected receiver, exact runtime/documentation +patches, receiving/readback drivers, all three initial/final paired fixture +and output sets, process/log/JUnit/source receipts, and runtime/dependency +provenance. The inherited run's complete logs, process, JUnit, source maps and +artifact-inventory receipt are included; its 309 runtime outputs remain in +native custody at the recorded private path. + +Independent review and the existing full supported Windows workflow are +separate integration gates. These native results establish deterministic +alignment on the declared fixture inputs; they do not establish hardware +synchronization, clinical validity or installed-desktop adoption. + + +## Independent review + +[Peer review](peer-source-review.json), SHA-256 +`3c39e1f3ba00614ed67f68003e44bc184c072380afa965088401f59ace59f60a`, +is copied unchanged from `chatgpt:/root/mac_execution` custody. The reviewer +read the full producer, patch, all 17 receivers and documentation, independently +restored the original producer by removing exactly the four added lines, and +read back all 43 original input pairs and all 17 output identities. It found no +source blocker. Numeric Parquet decoding and runtime receiving remain the +author's separate qualification; the reviewer did not rerun tests or builds. + + +## Current-main composition + +Before publication, current main advanced to +`a2c89957c2cfe6fd5347d4ac317982449d3baa3a` with the source picker and saved-job +parameter comparison. [The composition receipt](current-main-composition.json) +binds the genuine three-way merge to those owner changes. All 1,157 unrelated +main leaves remain exact; the complete current progress document is preserved +after the exact owned addition. All 96 Python library leaves are unchanged +between the originally received parent and this current main. + +The receipt identifies the underlying merged tree before adding this receipt +and paragraph. Runtime and test bytes retain their reviewed identities. +The earlier native results remain bound to their original source maps; +the complete published union receives fresh supported Windows CI. diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/current-main-composition.json b/docs/evidence/ml-bundle-feature-order-713adaab/current-main-composition.json new file mode 100644 index 00000000..53bbf91f --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/current-main-composition.json @@ -0,0 +1,30 @@ +{ + "schema": "capturesuite.nearest_feature_current_main_composition/1", + "base": "11cc78297d8d214407aea693548af4de855d61da", + "qualified_native": "e1128160ae9ddc767d3235867bcd1647ddf047b0", + "current_main": "a2c89957c2cfe6fd5347d4ac317982449d3baa3a", + "tree": "a56d16deacabfdc2d062e76fd49b31c972b6ebb2", + "resolved_path": "docs/design/research/PROGRESS.md", + "resolution": "Prepend the exact owned entry to current main's complete progress bytes.", + "current_main_leaves": 1160, + "preserved_unrelated_main_leaves": 1157, + "owned_paths": [ + "docs/design/ML_BUNDLE_METADATA.md", + "docs/design/research/PROGRESS.md", + "docs/evidence/ml-bundle-feature-order-713adaab/README.md", + "docs/evidence/ml-bundle-feature-order-713adaab/freeze_capsule.py", + "docs/evidence/ml-bundle-feature-order-713adaab/manifest.json", + "docs/evidence/ml-bundle-feature-order-713adaab/peer-source-review.json", + "docs/evidence/ml-bundle-feature-order-713adaab/prepublication-static.json", + "docs/evidence/ml-bundle-feature-order-713adaab/receiving.tar.gz", + "docs/evidence/ml-bundle-feature-order-713adaab/source-verification.json", + "docs/evidence/ml-bundle-feature-order-713adaab/verify_source.py", + "libs/python/capture_analysis/capture_analysis/ml_bundle/job.py", + "tests/analysis/test_ml_bundle_feature_order.py" + ], + "all_other_main_leaves_exact": true, + "python_library_paths_unchanged_between_received_base_and_main": 96, + "producer_sha256": "ed67d94ded834d63599797bbd8efb7b26f125bd216f52bcb7f01febb928922ce", + "test_sha256": "7a5e226afb9c0f49eadf6d4c25b8bc22575f1fdd04afdac854cf8aa4adee58be", + "limits": "Source composition and dependency-byte preservation, not a new runtime execution. Existing native17+14 results retain their original source maps; the complete published composition requires fresh supported Windows CI." +} diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/freeze_capsule.py b/docs/evidence/ml-bundle-feature-order-713adaab/freeze_capsule.py new file mode 100644 index 00000000..7c749fe9 --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/freeze_capsule.py @@ -0,0 +1,66 @@ +# SPDX-License-Identifier: GPL-3.0-only +"""Freeze exact native receiving files into a small verified archive.""" +from pathlib import Path +import gzip +import hashlib +import io +import json +import tarfile + +root = Path(__file__).resolve().parent.parent +evidence = root / "evidence" +destination = root / "source/docs/evidence/ml-bundle-feature-order-713adaab" +destination.mkdir(parents=True, exist_ok=True) +def sha(data): + return hashlib.sha256(data).hexdigest() +members = {} +for name in [ + "receive_feature_order.py", "receive_related.py", "read_paired_artifacts.py", + "baseline-producer.py", "candidate-producer.py", "paired-test.py", + "test_feature_order_initial.py", "initial-receiver-correction.json", + "runtime.patch", "documentation.patch", "paired-artifacts.json", +]: + members["evidence/" + name] = (evidence / name).read_bytes() +for stage in ["baseline", "baseline-final", "candidate", "related"]: + for name in ["receipt.json","process.json","pytest.xml","pytest.log", + "source-before.json","source-after.json"]: + members[f"evidence/{stage}/{name}"] = (evidence/stage/name).read_bytes() + if stage != "related": + for path in sorted((evidence/stage/"pytest-temp").rglob("*")): + if path.is_file() and not path.is_symlink(): + relative = path.relative_to(evidence).as_posix() + members["evidence/" + relative] = path.read_bytes() +for name in ["runtime-receipt.json","dependency-receipt.json", + "requirements-receiver.txt","runtime.sha256","dependencies.log"]: + members["environment/"+name]=(root/"environment"/name).read_bytes() +buffer=io.BytesIO() +with tarfile.open(fileobj=buffer,mode="w") as archive: + for name,data in sorted(members.items()): + info=tarfile.TarInfo(name);info.size=len(data);info.mode=0o644 + archive.addfile(info,io.BytesIO(data)) +packed=gzip.compress(buffer.getvalue(),mtime=0) +target=destination/"receiving.tar.gz" +target.write_bytes(packed) +with tarfile.open(target,"r:gz") as archive: + restored={row.name:archive.extractfile(row).read() for row in archive.getmembers()} +assert restored==members +manifest={ + "schema":"capturesuite.ml_feature_order_capsule/1","issue":86, + "base_commit":"11cc78297d8d214407aea693548af4de855d61da", + "original_producer_sha256":"38b7161f081ef038e6ce464dd3b82ca2b49f775ad8988010243743274d6fc5e6", + "candidate_producer_sha256":"ed67d94ded834d63599797bbd8efb7b26f125bd216f52bcb7f01febb928922ce", + "final_test_sha256":"7a5e226afb9c0f49eadf6d4c25b8bc22575f1fdd04afdac854cf8aa4adee58be", + "archive":{"path":target.name,"bytes":len(packed),"sha256":sha(packed), + "members":len(members),"expanded_file_bytes":sum(map(len,members.values())), + "all_members_reopened_and_verified":True}, + "files":[{"path":name,"bytes":len(data),"sha256":sha(data)} + for name,data in sorted(members.items())], + "limits":["Archive contains the complete initial/final paired test artifacts. Related inherited test outputs remain in native custody; their complete process/log/JUnit/source maps and artifact-inventory receipt are included.", + "Private Linux Python3.12.10 runtime only; no Windows, physical sensor, installed application or scientific-validity qualification.", + "Original mixed negative with four schema-invalid 2ns windows is retained separately from corrected final17 test receiving."], +} +output=destination/"manifest.json" +output.write_text(json.dumps(manifest,indent=2)+"\n") +print(json.dumps({"archive":str(target),"bytes":len(packed),"sha256":sha(packed), +"members":len(members),"expanded_bytes":manifest["archive"]["expanded_file_bytes"], +"manifest_sha256":sha(output.read_bytes())})) diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/manifest.json b/docs/evidence/ml-bundle-feature-order-713adaab/manifest.json new file mode 100644 index 00000000..2ac4fc1e --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/manifest.json @@ -0,0 +1,1503 @@ +{ + "schema": "capturesuite.ml_feature_order_capsule/1", + "issue": 86, + "base_commit": "11cc78297d8d214407aea693548af4de855d61da", + "original_producer_sha256": "38b7161f081ef038e6ce464dd3b82ca2b49f775ad8988010243743274d6fc5e6", + "candidate_producer_sha256": "ed67d94ded834d63599797bbd8efb7b26f125bd216f52bcb7f01febb928922ce", + "final_test_sha256": "7a5e226afb9c0f49eadf6d4c25b8bc22575f1fdd04afdac854cf8aa4adee58be", + "archive": { + "path": "receiving.tar.gz", + "bytes": 265323, + "sha256": "d80a4d2b79d4491b66ea8227ff92471ebdbb6edd8fe2fce75327bbe755485097", + "members": 296, + "expanded_file_bytes": 1502844, + "all_members_reopened_and_verified": true + }, + "files": [ + { + "path": "environment/dependencies.log", + "bytes": 12592, + "sha256": "d390316a82c5760a3507548dab99b8608f5b850d3ce92bd2da175cf15e52ba53" + }, + { + "path": "environment/dependency-receipt.json", + "bytes": 2706, + "sha256": "805dd056a54e43a21219bd81f7b4b32711695d709c02c5cb5b422359f612828a" + }, + { + "path": "environment/requirements-receiver.txt", + "bytes": 166, + "sha256": "d91f2cf8eb6b268aeac73f42887ad1683ba74f14adeedbac3bf74cc82dc089d3" + }, + { + "path": "environment/runtime-receipt.json", + "bytes": 1259, + "sha256": "7cdd2ddfa1b5dd6d59246c05e99b8399340518188d4aac8d692f890a6a954146" + }, + { + "path": "environment/runtime.sha256", + "bytes": 65, + "sha256": "77aa0c0fc9da24274fdc0b57db4e7c8956f070262cc1ca32257c6c2d9f77fbf0" + }, + { + "path": "evidence/baseline-final/process.json", + "bytes": 679, + "sha256": "7dcfc309eaab58cba62fc22688ced633ce3b4605ad65dc8db004b6ac318b2eb6" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_adjacent_nanoseconds_abov0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1780, + "sha256": "23330424871dc9316f210e702e86118bf19d52734b71bec775ccf88580cac467" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_adjacent_nanoseconds_abov0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_adjacent_nanoseconds_abov0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "5bbbda98712f1e58f952f4a89066f53caff88c9992ccdd1fc1dc3ac541ff68ce" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_adjacent_nanoseconds_abov0/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "424f827077d93de02e5d0021554858368c19855695547678952e7f9089f709eb" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_adjacent_nanoseconds_abov1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1782, + "sha256": "5c24ecdd865203f4ac9b7f39555b5401ff3963bee4722673fa71549734e18346" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_adjacent_nanoseconds_abov1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_adjacent_nanoseconds_abov1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "73e44ba09816c6148cf4d49fe3b7cc538d07a770a8b0c8af0f49e8a6abc21766" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_adjacent_nanoseconds_abov1/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "a2602904f0718e3165f01f237b06010010d6e2c03de73455a0be1cf7a0b72fa5" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_duplicate_feature_times_k0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "61f06d82dab093b5e9382f4b2a7e2766f427bc818115d546d8c538fc703613ad" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_duplicate_feature_times_k0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_duplicate_feature_times_k0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "6cf1e567c63cea883d51bce9bf7f5c8d05420ce7ea86162ca99861f066cff75f" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_duplicate_feature_times_k0/result/ml_bundle/windows.parquet", + "bytes": 6236, + "sha256": "64490ea5eee9d9cfb2c250856bae3e41afdd9008481530ebc39de9494ce4eca3" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_duplicate_feature_times_k1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1783, + "sha256": "b1d279dd8d898b5130e100914faae3deaf5d743645f1a70f0b095c0a32708160" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_duplicate_feature_times_k1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_duplicate_feature_times_k1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "16bc41f14bcef85c1aeeea527734e9349e1b0f464f57b7a7dbf35c803197d2c4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_duplicate_feature_times_k1/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "0163c8a6a57e4f4804930d65df44674f7da940a93460b07627bd381c8581798d" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_equal_distance_still_sele0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1766, + "sha256": "76f76f3a43cdd0b3effad0ac303610d24939cdd3d5e0c9570ba2960278e32e84" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_equal_distance_still_sele0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_equal_distance_still_sele0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "980c06de4c2eed2e7b8d35de38bc2a29d3aaa2c6cab5691c8e727b4dbb6554dc" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_equal_distance_still_sele0/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "3a0a7e0aa4131ec5af7a45a5834c8a1f423be6da7307a48bc52f379dea3c8345" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_equal_distance_still_sele1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1766, + "sha256": "19449be39e6c89fecdbca54a586609013f404f437a03a639bd728b5698ecbf3e" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_equal_distance_still_sele1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_equal_distance_still_sele1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "3f221d4e0d43b88d08f26e2ce24f3a6cc747ac43d06d3b95bd48f28fa0e80eee" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_equal_distance_still_sele1/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "8d6b54db24c779d9206c1f6c153862060c42f4ddc8580d4f229087198685196e" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/embedded-session-order.mcap", + "bytes": 918, + "sha256": "6eb07e3fe6f55810222f298b16ef97c587109031b59c2ff59d7570b3e4c13937" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/annotations.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/checkpoints.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/sync_anchors.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/integrity.json", + "bytes": 227, + "sha256": "af5d9bacd3eace7e831d48dee83eb5d9f578f4f4819d92218c4b55b0cb3ed556" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/manifest.json", + "bytes": 235, + "sha256": "c5254d3e4c0bc6a0ecaef124dc12d88117d647928a8e1725b71429097438d380" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/.gitkeep", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/feat/features/radar/radar.fixture/energy.csv", + "bytes": 80, + "sha256": "111705bfdf5731b0e57f3d4096ea36cd89f7f066c3c67d4b7247c134084c4fac" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 2851, + "sha256": "32078db417e918637107157fdc02fbea7d0ae96b458d1430b1340101ce5305d5" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/job_manifest.json", + "bytes": 2865, + "sha256": "71e850871ebc4253408a7479f437838716ea99dda16a6f265c6d2571b72b1618" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/logs/job.log", + "bytes": 260, + "sha256": "8437a8391e58b84740eb706530c7fc2bf1e3846952dd2e32da76ccb94154f244" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "4f69c93836843d4b6b33efe520b894094d113f0e645586544c013a86bb520618" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "c7a898a533222f8d8080121780831547239bddf3093b1c7b7f9dff7fd00a46e3" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/params.json", + "bytes": 368, + "sha256": "bc9c285d98f905a65b93ad46c11e4c0e14cea3b2c184375e729e811aaa5ffdbb" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/reports/qc.html", + "bytes": 2298, + "sha256": "27286ebf2210c177483ce2dce4d600e535d0e6b47a8420d5a89464ad8c325bd7" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/reports/qc.json", + "bytes": 1382, + "sha256": "644a3adddc9f4ca8c9a38f61fe5e95900e02cb519aad40a7bca8bbda865a0c1a" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/health/gaps.jsonl", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/source.json", + "bytes": 112, + "sha256": "4e7626e51bfb804c27f83bf98ee186a47ec9f36fec0cbd7863ea8ecb1ecfbd10" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/streams/sim.emg.main.batch/segments/000000.mcap", + "bytes": 28, + "sha256": "3c4d91b3bf5d48dcf54a598fff5b1b4ee42260b756d6f5df3986da496c6a9649" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/streams/sim.emg.main.batch/stream.json", + "bytes": 216, + "sha256": "8f8c02b89fd93e55643151e5222488e1174dd97a6b7a74f3ae5da8215b4d68e1" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/source.json", + "bytes": 118, + "sha256": "a6198f509edc557c1e1d8583a767a540962977751c80a1b6491e3d594b60c7a8" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/streams/sim.imu.upper.frames/segments/000000.mcap", + "bytes": 28, + "sha256": "3c4d91b3bf5d48dcf54a598fff5b1b4ee42260b756d6f5df3986da496c6a9649" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/streams/sim.imu.upper.frames/stream.json", + "bytes": 219, + "sha256": "ec39026bed1b833d4decb0ef7b0efb94c5557a5647bc50addc060bef3a30d50d" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1775, + "sha256": "8d26061f6565c8302a9f113aed6a461ffd481d749c324b45ea58deaf9dff627d" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "de0805ff3b1632f4e0fa10c9f8c3f625b8e78963336414e6477c51624a5d87a5" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim0/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "d163610f7ff006896e49d8a0ec9f4454b51905796606fc4b890bc9bc685cdb12" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1772, + "sha256": "b8defdd28e341a215369d59dff3244775a4bc8d56a34c40dbaf7ef940734509f" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "2366b03bb673927f23b8b17f78014401c34d847142d1ce7bd9b55c5f73918807" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim1/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "8f75d7ae896982d7e0fd040440e7f25d8e87b516cce26e88ef11ae79a0cd896b" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim2/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "12666bd4825f850046f56290b259ccaae3301f857b3a5472fbb4cf4756c59fb6" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim2/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim2/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "0b5d6b4cea24f67051e005c01d3cad35b0884b89d70a3361585caa2ebc7d356b" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim2/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "8ddd1ca2b2389e85efa7e1b5926bda9c4885ae247f48b3a55881d086dac69afa" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim3/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "2d68a415791091434008c261bda60f199946111d8a17fbdc03d211101a549732" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim3/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim3/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "764fd17a91ea97795db04c019d6c5ce9c5adbdb8dc531eea295e310991c96654" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim3/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "6296e1649c5ae7fd8fcc77194fdc43df702c15a8f5d909d35df2bea3c6650949" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim4/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "c36ec5defaf10cb5efd0d259446cba058b8794f08143137e68f320a892601a58" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim4/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim4/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "beefc4942e7c7f73b612a90095be61f498b7fe94c3e5996da4da94e44ada51e1" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim4/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "71ec0437c5f137691ecd62b5c1a954a26ac8f0cdc3c96dd7a1d840cb1568ceb8" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim5/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1780, + "sha256": "456c73fe5a4ec8a49223cd5975744bb5958c1a2c2ac29b8c0a9b2fbfd83860a3" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim5/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim5/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "0bdc9ce70d103b00c179e43dfaf1dfb4f311b34e0a752fea5ad478f901c0eef1" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim5/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "d103962df0750e8ff746cde9d0eb513fb28498e3a76a231eb67d8374813158ce" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim6/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1780, + "sha256": "f5322aec4f1026104656bd6aaf760c783b1a7adc6a0b54cc1333083ca083345c" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim6/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim6/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "25588a57db23d1a758e8f1c9ddfbfdc32ed37b308f6984d2c154928be79df93b" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim6/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "73a063229f285275aa4541c72f36abbcf02ad2d18457094e6351b8e4169ca5ca" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim7/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1780, + "sha256": "47abb846ce6eb7abdefd88119e7b4fb44487de1cdb34acbfe1b2db934c1b34b5" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim7/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim7/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "6aa019bb82df300907ff770b2d8577943c868d7c0e17239e7f0ce1811e1142df" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_nearest_values_follow_tim7/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "ad033d60bd45242d0c8fe803b7b7b729c31775449c316eec73c087a19c5ad6a0" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_numeric_column_mean_keeps0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 3547, + "sha256": "29bd00504c1e4cd094f4025a80a291818aeb19d8a518950fef0370c74cf5d00c" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_numeric_column_mean_keeps0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_numeric_column_mean_keeps0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "e9de8fea37aae279545b260aacd8bbefed55dd38831e4066bd83cc66dba59b3a" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_numeric_column_mean_keeps0/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "16fc33c955665ba069af20d42613333c7f049cebf2c177bad136fea9aa68ef70" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_single_feature_row_remain0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1750, + "sha256": "85f9f8be1dfe44a360be67a8f09d76ad7da83732348dc68903ceb7a5cc465d47" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_single_feature_row_remain0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_single_feature_row_remain0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "0c9f6fed015d059eb6d000e83c6620132fc8569636ce8347b51342d5abeef9eb" + }, + { + "path": "evidence/baseline-final/pytest-temp/test_single_feature_row_remain0/result/ml_bundle/windows.parquet", + "bytes": 6219, + "sha256": "14f9789481b75a71fcb3541ea5348583db231ae8323603bc806de87c5689dd62" + }, + { + "path": "evidence/baseline-final/pytest.log", + "bytes": 19020, + "sha256": "28b00b49f66c72d1384e996ec9aec08ce895212ba201cc2857796f8a69e2fbf1" + }, + { + "path": "evidence/baseline-final/pytest.xml", + "bytes": 20526, + "sha256": "3e5e24da489ace0b0a62e6cc6c7f67ee07a1e9b3277e58b5ef2ea8d92206337f" + }, + { + "path": "evidence/baseline-final/receipt.json", + "bytes": 23626, + "sha256": "a170cc673be0c202e3fc8676412fa5eb62ef95c7ce875894ef3029bf146fbf41" + }, + { + "path": "evidence/baseline-final/source-after.json", + "bytes": 52002, + "sha256": "d7a69f2e308240679ea95884b8e95ae64ccc6f05a41e222c36c7038adb67457a" + }, + { + "path": "evidence/baseline-final/source-before.json", + "bytes": 52002, + "sha256": "d7a69f2e308240679ea95884b8e95ae64ccc6f05a41e222c36c7038adb67457a" + }, + { + "path": "evidence/baseline-producer.py", + "bytes": 10005, + "sha256": "38b7161f081ef038e6ce464dd3b82ca2b49f775ad8988010243743274d6fc5e6" + }, + { + "path": "evidence/baseline/process.json", + "bytes": 665, + "sha256": "a835c82f765ffccdc0934239bed618117ec686a0c0f665aea9c04175175a557d" + }, + { + "path": "evidence/baseline/pytest-temp/test_duplicate_feature_times_k0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "61f06d82dab093b5e9382f4b2a7e2766f427bc818115d546d8c538fc703613ad" + }, + { + "path": "evidence/baseline/pytest-temp/test_duplicate_feature_times_k0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_duplicate_feature_times_k0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "37c9e3e7318d9cd54d56c39df9914468a2d9954c6a88b329b0cd4e269cca447d" + }, + { + "path": "evidence/baseline/pytest-temp/test_duplicate_feature_times_k0/result/ml_bundle/windows.parquet", + "bytes": 6236, + "sha256": "64490ea5eee9d9cfb2c250856bae3e41afdd9008481530ebc39de9494ce4eca3" + }, + { + "path": "evidence/baseline/pytest-temp/test_duplicate_feature_times_k1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1783, + "sha256": "b1d279dd8d898b5130e100914faae3deaf5d743645f1a70f0b095c0a32708160" + }, + { + "path": "evidence/baseline/pytest-temp/test_duplicate_feature_times_k1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_duplicate_feature_times_k1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "2d0fe34912a1087e9b99d96924cc4b15c29a267adba602e0ed914f011afd1e0e" + }, + { + "path": "evidence/baseline/pytest-temp/test_duplicate_feature_times_k1/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "0163c8a6a57e4f4804930d65df44674f7da940a93460b07627bd381c8581798d" + }, + { + "path": "evidence/baseline/pytest-temp/test_equal_distance_still_sele0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1766, + "sha256": "76f76f3a43cdd0b3effad0ac303610d24939cdd3d5e0c9570ba2960278e32e84" + }, + { + "path": "evidence/baseline/pytest-temp/test_equal_distance_still_sele0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_equal_distance_still_sele0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "6134372bf25bc865e681170fc84648482d1c659902d71f7e788399413427ad10" + }, + { + "path": "evidence/baseline/pytest-temp/test_equal_distance_still_sele0/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "3a0a7e0aa4131ec5af7a45a5834c8a1f423be6da7307a48bc52f379dea3c8345" + }, + { + "path": "evidence/baseline/pytest-temp/test_equal_distance_still_sele1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1766, + "sha256": "19449be39e6c89fecdbca54a586609013f404f437a03a639bd728b5698ecbf3e" + }, + { + "path": "evidence/baseline/pytest-temp/test_equal_distance_still_sele1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_equal_distance_still_sele1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "5cb5337226e0758ebff63d1af301a6b35ed1ab9b3b975129507e95d385928287" + }, + { + "path": "evidence/baseline/pytest-temp/test_equal_distance_still_sele1/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "8d6b54db24c779d9206c1f6c153862060c42f4ddc8580d4f229087198685196e" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/embedded-session-order.mcap", + "bytes": 918, + "sha256": "6eb07e3fe6f55810222f298b16ef97c587109031b59c2ff59d7570b3e4c13937" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/annotations.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/checkpoints.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/sync_anchors.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/integrity.json", + "bytes": 227, + "sha256": "af5d9bacd3eace7e831d48dee83eb5d9f578f4f4819d92218c4b55b0cb3ed556" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/manifest.json", + "bytes": 235, + "sha256": "c5254d3e4c0bc6a0ecaef124dc12d88117d647928a8e1725b71429097438d380" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/.gitkeep", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/feat/features/radar/radar.fixture/energy.csv", + "bytes": 80, + "sha256": "111705bfdf5731b0e57f3d4096ea36cd89f7f066c3c67d4b7247c134084c4fac" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 2851, + "sha256": "32078db417e918637107157fdc02fbea7d0ae96b458d1430b1340101ce5305d5" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/job_manifest.json", + "bytes": 2859, + "sha256": "d914b0ee386f3303938fa56b0f87553754c0cf6608e25eaaf81f743355873802" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/logs/job.log", + "bytes": 254, + "sha256": "1bc8af88af001b898132da2a7e1636d576a5fcde4adf4b837e6c50cb461555ad" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "05872fdae5a7dcef1f788835caa24aabaf85623ebb39c660380473dd5c688aed" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "c7a898a533222f8d8080121780831547239bddf3093b1c7b7f9dff7fd00a46e3" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/params.json", + "bytes": 368, + "sha256": "bc9c285d98f905a65b93ad46c11e4c0e14cea3b2c184375e729e811aaa5ffdbb" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/reports/qc.html", + "bytes": 2292, + "sha256": "4e3d79e628703dc6aa160b8de269079e8e8517eb0c29d80e4e8c83263cb270d0" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/reports/qc.json", + "bytes": 1376, + "sha256": "b3f529412f7c13a734ce175add3400b0f1cda860847368664525d88226b668a8" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/health/gaps.jsonl", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/source.json", + "bytes": 112, + "sha256": "4e7626e51bfb804c27f83bf98ee186a47ec9f36fec0cbd7863ea8ecb1ecfbd10" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/streams/sim.emg.main.batch/segments/000000.mcap", + "bytes": 28, + "sha256": "3c4d91b3bf5d48dcf54a598fff5b1b4ee42260b756d6f5df3986da496c6a9649" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/streams/sim.emg.main.batch/stream.json", + "bytes": 216, + "sha256": "8f8c02b89fd93e55643151e5222488e1174dd97a6b7a74f3ae5da8215b4d68e1" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/source.json", + "bytes": 118, + "sha256": "a6198f509edc557c1e1d8583a767a540962977751c80a1b6491e3d594b60c7a8" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/streams/sim.imu.upper.frames/segments/000000.mcap", + "bytes": 28, + "sha256": "3c4d91b3bf5d48dcf54a598fff5b1b4ee42260b756d6f5df3986da496c6a9649" + }, + { + "path": "evidence/baseline/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/streams/sim.imu.upper.frames/stream.json", + "bytes": 219, + "sha256": "ec39026bed1b833d4decb0ef7b0efb94c5557a5647bc50addc060bef3a30d50d" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1775, + "sha256": "8d26061f6565c8302a9f113aed6a461ffd481d749c324b45ea58deaf9dff627d" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "44e43a39852c5683a4406545e8bf55fba626445875572a3e5f27524a40b25eaf" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim0/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "d163610f7ff006896e49d8a0ec9f4454b51905796606fc4b890bc9bc685cdb12" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1772, + "sha256": "b8defdd28e341a215369d59dff3244775a4bc8d56a34c40dbaf7ef940734509f" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "6339cf56ce68be6e1abc3780bd447f7b23545e3464679b737a0f0b924e491924" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim1/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "8f75d7ae896982d7e0fd040440e7f25d8e87b516cce26e88ef11ae79a0cd896b" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim2/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "12666bd4825f850046f56290b259ccaae3301f857b3a5472fbb4cf4756c59fb6" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim2/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim2/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "56012c2f4064ea592f5713d26d02620d4e8fce6eb5db06dd9d00d78bf35414c7" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim2/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "8ddd1ca2b2389e85efa7e1b5926bda9c4885ae247f48b3a55881d086dac69afa" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim3/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "2d68a415791091434008c261bda60f199946111d8a17fbdc03d211101a549732" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim3/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim3/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "fc4849f73502b420e02411442cbffff17e179a8c32d6c62b32cb3f26c725ddbc" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim3/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "6296e1649c5ae7fd8fcc77194fdc43df702c15a8f5d909d35df2bea3c6650949" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim4/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "55bc7ed03e47ad8ac5ee72388b2300a5882343fd5913cf82954aeaa5c394ae20" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim4/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5123, + "sha256": "cd6c25599f900c67ff66758b2effba3ed4667135c395b9140a0130562cb9ac4e" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim4/result/ml_bundle/manifest.json", + "bytes": 1561, + "sha256": "8222a5bdc89e8c1331b0eac05a5e16b21bb232aef2f899ba0763c22cd711e3a4" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim4/result/ml_bundle/windows.parquet", + "bytes": 6230, + "sha256": "121926e3bb2ca4a60eb9def1744810bb0fb426fad72d2cca30864390098bc203" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim5/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "cab9dd6dd0aab39eac1a01ba2250760ea98bcbfea2763d81b7fd249b2c049597" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim5/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5123, + "sha256": "cd6c25599f900c67ff66758b2effba3ed4667135c395b9140a0130562cb9ac4e" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim5/result/ml_bundle/manifest.json", + "bytes": 1561, + "sha256": "8b37dac22cb9a9e6048a33ebabf653c97766d44d827aa4811ebce699c3a09c39" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim5/result/ml_bundle/windows.parquet", + "bytes": 6225, + "sha256": "0cc18916a9f3cc93d4dfb85147e0dd4985c55d541b4c913ba888c492826b85a1" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim6/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "186289e5148ecdc9d123097df44710a3e243fbbe1752ac5498f2b2cbd671e1a6" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim6/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5123, + "sha256": "cd6c25599f900c67ff66758b2effba3ed4667135c395b9140a0130562cb9ac4e" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim6/result/ml_bundle/manifest.json", + "bytes": 1561, + "sha256": "8175aa9a9c3ffacbcfd9cea56788cb0ac531a2b7c064a4e30fb105890b0bf938" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim6/result/ml_bundle/windows.parquet", + "bytes": 6225, + "sha256": "77ac0c7aa9a6f093a447623f2df3e72f4aed318f4cacdce4e09e255feaa1a7b5" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim7/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "c2f2db13c58bca703b0653b06051e76f2c2a76d90e5e5e46d6a5c48777e73111" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim7/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5123, + "sha256": "cd6c25599f900c67ff66758b2effba3ed4667135c395b9140a0130562cb9ac4e" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim7/result/ml_bundle/manifest.json", + "bytes": 1561, + "sha256": "63229f2cd8df37ad768e4647c98fde51646ca51ef327b2bd4b48c9dc6dc24ea9" + }, + { + "path": "evidence/baseline/pytest-temp/test_nearest_values_follow_tim7/result/ml_bundle/windows.parquet", + "bytes": 6225, + "sha256": "eb0795fee9459dd88eb819cb1e082f08ddcd738f0e6bb704633e6db1349db9ad" + }, + { + "path": "evidence/baseline/pytest-temp/test_numeric_column_mean_keeps0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 3547, + "sha256": "29bd00504c1e4cd094f4025a80a291818aeb19d8a518950fef0370c74cf5d00c" + }, + { + "path": "evidence/baseline/pytest-temp/test_numeric_column_mean_keeps0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_numeric_column_mean_keeps0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "89e58b81283dd6680f9c86cd4e4537eab050bbffbdcb4ad3894134e152d184e1" + }, + { + "path": "evidence/baseline/pytest-temp/test_numeric_column_mean_keeps0/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "16fc33c955665ba069af20d42613333c7f049cebf2c177bad136fea9aa68ef70" + }, + { + "path": "evidence/baseline/pytest-temp/test_single_feature_row_remain0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1750, + "sha256": "85f9f8be1dfe44a360be67a8f09d76ad7da83732348dc68903ceb7a5cc465d47" + }, + { + "path": "evidence/baseline/pytest-temp/test_single_feature_row_remain0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/baseline/pytest-temp/test_single_feature_row_remain0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "46bbc449d9f3c0df3296864aebb460de33c558f85e752789dc1223156927fbeb" + }, + { + "path": "evidence/baseline/pytest-temp/test_single_feature_row_remain0/result/ml_bundle/windows.parquet", + "bytes": 6219, + "sha256": "14f9789481b75a71fcb3541ea5348583db231ae8323603bc806de87c5689dd62" + }, + { + "path": "evidence/baseline/pytest.log", + "bytes": 24145, + "sha256": "86eccb6f02484c90a34662d5b6d9b9e7da68d9a120d9e701098bc5965d2e6e4a" + }, + { + "path": "evidence/baseline/pytest.xml", + "bytes": 26259, + "sha256": "e4df97c67fac8c80b1e5bd25b52b0b1914a279ec8859b2dbad70bae89c7f20be" + }, + { + "path": "evidence/baseline/receipt.json", + "bytes": 22886, + "sha256": "7b69b72dde1ba8f254b9093634cf99708a23e697f89db8a2f71903d727359942" + }, + { + "path": "evidence/baseline/source-after.json", + "bytes": 52001, + "sha256": "10a54486c25b525d1396ac773bb689bf2c2ae943e9ece5a8d924bf86173001c0" + }, + { + "path": "evidence/baseline/source-before.json", + "bytes": 52001, + "sha256": "10a54486c25b525d1396ac773bb689bf2c2ae943e9ece5a8d924bf86173001c0" + }, + { + "path": "evidence/candidate-producer.py", + "bytes": 10233, + "sha256": "ed67d94ded834d63599797bbd8efb7b26f125bd216f52bcb7f01febb928922ce" + }, + { + "path": "evidence/candidate/process.json", + "bytes": 669, + "sha256": "9bae17a14d4ee8ec3ec679bde999f1067442e4da466ce0a5d0f2b42c8b2ab94d" + }, + { + "path": "evidence/candidate/pytest-temp/test_adjacent_nanoseconds_abov0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1780, + "sha256": "23330424871dc9316f210e702e86118bf19d52734b71bec775ccf88580cac467" + }, + { + "path": "evidence/candidate/pytest-temp/test_adjacent_nanoseconds_abov0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/candidate/pytest-temp/test_adjacent_nanoseconds_abov0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "5632dddec1649f249467158ae4f255b03ca65956d6e49bc096df3d0f255ce834" + }, + { + "path": "evidence/candidate/pytest-temp/test_adjacent_nanoseconds_abov0/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "424f827077d93de02e5d0021554858368c19855695547678952e7f9089f709eb" + }, + { + "path": "evidence/candidate/pytest-temp/test_adjacent_nanoseconds_abov1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1782, + "sha256": "5c24ecdd865203f4ac9b7f39555b5401ff3963bee4722673fa71549734e18346" + }, + { + "path": "evidence/candidate/pytest-temp/test_adjacent_nanoseconds_abov1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/candidate/pytest-temp/test_adjacent_nanoseconds_abov1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "3d0054743fc401d0a1e23fdfe7045c11f464f94968534858e15ce2a1cee1c474" + }, + { + "path": "evidence/candidate/pytest-temp/test_adjacent_nanoseconds_abov1/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "424f827077d93de02e5d0021554858368c19855695547678952e7f9089f709eb" + }, + { + "path": "evidence/candidate/pytest-temp/test_duplicate_feature_times_k0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "61f06d82dab093b5e9382f4b2a7e2766f427bc818115d546d8c538fc703613ad" + }, + { + "path": "evidence/candidate/pytest-temp/test_duplicate_feature_times_k0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_duplicate_feature_times_k0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "aeba7a09607dc74e43c5e593ccbe860aa246c86ce5d5a29bcc2c334eb5f21166" + }, + { + "path": "evidence/candidate/pytest-temp/test_duplicate_feature_times_k0/result/ml_bundle/windows.parquet", + "bytes": 6236, + "sha256": "64490ea5eee9d9cfb2c250856bae3e41afdd9008481530ebc39de9494ce4eca3" + }, + { + "path": "evidence/candidate/pytest-temp/test_duplicate_feature_times_k1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1783, + "sha256": "b1d279dd8d898b5130e100914faae3deaf5d743645f1a70f0b095c0a32708160" + }, + { + "path": "evidence/candidate/pytest-temp/test_duplicate_feature_times_k1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_duplicate_feature_times_k1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "aeba7a09607dc74e43c5e593ccbe860aa246c86ce5d5a29bcc2c334eb5f21166" + }, + { + "path": "evidence/candidate/pytest-temp/test_duplicate_feature_times_k1/result/ml_bundle/windows.parquet", + "bytes": 6236, + "sha256": "64490ea5eee9d9cfb2c250856bae3e41afdd9008481530ebc39de9494ce4eca3" + }, + { + "path": "evidence/candidate/pytest-temp/test_equal_distance_still_sele0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1766, + "sha256": "76f76f3a43cdd0b3effad0ac303610d24939cdd3d5e0c9570ba2960278e32e84" + }, + { + "path": "evidence/candidate/pytest-temp/test_equal_distance_still_sele0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_equal_distance_still_sele0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "06de04de27977d25c827f5aff5748cb51df7c6a3b7239e92ef47ecf3eeea73fb" + }, + { + "path": "evidence/candidate/pytest-temp/test_equal_distance_still_sele0/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "3a0a7e0aa4131ec5af7a45a5834c8a1f423be6da7307a48bc52f379dea3c8345" + }, + { + "path": "evidence/candidate/pytest-temp/test_equal_distance_still_sele1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1766, + "sha256": "19449be39e6c89fecdbca54a586609013f404f437a03a639bd728b5698ecbf3e" + }, + { + "path": "evidence/candidate/pytest-temp/test_equal_distance_still_sele1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_equal_distance_still_sele1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "249e6ef33d127aef6c5015f90ab13ba5d41be1cab619d9843d3cdefbc4a0fa4d" + }, + { + "path": "evidence/candidate/pytest-temp/test_equal_distance_still_sele1/result/ml_bundle/windows.parquet", + "bytes": 6227, + "sha256": "3a0a7e0aa4131ec5af7a45a5834c8a1f423be6da7307a48bc52f379dea3c8345" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/embedded-session-order.mcap", + "bytes": 918, + "sha256": "6eb07e3fe6f55810222f298b16ef97c587109031b59c2ff59d7570b3e4c13937" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/annotations.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/checkpoints.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/events/sync_anchors.json", + "bytes": 3, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/integrity.json", + "bytes": 227, + "sha256": "af5d9bacd3eace7e831d48dee83eb5d9f578f4f4819d92218c4b55b0cb3ed556" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/manifest.json", + "bytes": 235, + "sha256": "c5254d3e4c0bc6a0ecaef124dc12d88117d647928a8e1725b71429097438d380" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/.gitkeep", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/feat/features/radar/radar.fixture/energy.csv", + "bytes": 80, + "sha256": "111705bfdf5731b0e57f3d4096ea36cd89f7f066c3c67d4b7247c134084c4fac" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 2851, + "sha256": "32078db417e918637107157fdc02fbea7d0ae96b458d1430b1340101ce5305d5" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/job_manifest.json", + "bytes": 2860, + "sha256": "f55f080a7749bbf7cbbf480de2050565ced5f89e71e53e87497dc4495424f3e3" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/logs/job.log", + "bytes": 255, + "sha256": "4ed1a7060d66235ffbb1cb9ff4150eb1fe7fd65b0b803a81290f725fb3ee78eb" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "ceabbd4f9ee00f9b1bd4914f9002652d3738136d9e233b62a2fdd3ed3ac165b7" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "999482684f13f4066041ace5977893f41d911b05d0fa70e0eb534e1a26c79c55" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/params.json", + "bytes": 368, + "sha256": "bc9c285d98f905a65b93ad46c11e4c0e14cea3b2c184375e729e811aaa5ffdbb" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/reports/qc.html", + "bytes": 2293, + "sha256": "872a26da942ac5bc160bbd9e11ef8254277b8af00db9b9147ec307263a2f310f" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/processing/jobs/ordered-features/reports/qc.json", + "bytes": 1377, + "sha256": "75b8f2c10788cb3ca66785b362673d19427c7cc41b90cc08f5e36b9c5690ba49" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/health/gaps.jsonl", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/source.json", + "bytes": 112, + "sha256": "4e7626e51bfb804c27f83bf98ee186a47ec9f36fec0cbd7863ea8ecb1ecfbd10" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/streams/sim.emg.main.batch/segments/000000.mcap", + "bytes": 28, + "sha256": "3c4d91b3bf5d48dcf54a598fff5b1b4ee42260b756d6f5df3986da496c6a9649" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.emg.main/streams/sim.emg.main.batch/stream.json", + "bytes": 216, + "sha256": "8f8c02b89fd93e55643151e5222488e1174dd97a6b7a74f3ae5da8215b4d68e1" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/source.json", + "bytes": 118, + "sha256": "a6198f509edc557c1e1d8583a767a540962977751c80a1b6491e3d594b60c7a8" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/streams/sim.imu.upper.frames/segments/000000.mcap", + "bytes": 28, + "sha256": "3c4d91b3bf5d48dcf54a598fff5b1b4ee42260b756d6f5df3986da496c6a9649" + }, + { + "path": "evidence/candidate/pytest-temp/test_native_radar_features_rea0/recording.mmsession/sources/sim.imu.upper/streams/sim.imu.upper.frames/stream.json", + "bytes": 219, + "sha256": "ec39026bed1b833d4decb0ef7b0efb94c5557a5647bc50addc060bef3a30d50d" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1775, + "sha256": "8d26061f6565c8302a9f113aed6a461ffd481d749c324b45ea58deaf9dff627d" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "f46290508cdbdfd5d33fc82f65fe56f69d867e37b464a305cfe05accd1ec696f" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim0/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "d163610f7ff006896e49d8a0ec9f4454b51905796606fc4b890bc9bc685cdb12" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim1/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1772, + "sha256": "b8defdd28e341a215369d59dff3244775a4bc8d56a34c40dbaf7ef940734509f" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim1/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim1/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "6fca3bd6507d042e0952650b4b8b235d9c6bc56ee5d0100c6187266317980dfc" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim1/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "d163610f7ff006896e49d8a0ec9f4454b51905796606fc4b890bc9bc685cdb12" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim2/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "12666bd4825f850046f56290b259ccaae3301f857b3a5472fbb4cf4756c59fb6" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim2/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim2/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "6fca3bd6507d042e0952650b4b8b235d9c6bc56ee5d0100c6187266317980dfc" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim2/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "d163610f7ff006896e49d8a0ec9f4454b51905796606fc4b890bc9bc685cdb12" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim3/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "2d68a415791091434008c261bda60f199946111d8a17fbdc03d211101a549732" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim3/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim3/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "7644f3902f4c69886aee9061391cb079334d66b2d3646403406c66ab5e06a64e" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim3/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "d163610f7ff006896e49d8a0ec9f4454b51905796606fc4b890bc9bc685cdb12" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim4/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1779, + "sha256": "c36ec5defaf10cb5efd0d259446cba058b8794f08143137e68f320a892601a58" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim4/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim4/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "b8344b4dfb003d133c22eed576a40e0e63fbfda2cc5105a0cc0f600985facf8d" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim4/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "71ec0437c5f137691ecd62b5c1a954a26ac8f0cdc3c96dd7a1d840cb1568ceb8" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim5/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1780, + "sha256": "456c73fe5a4ec8a49223cd5975744bb5958c1a2c2ac29b8c0a9b2fbfd83860a3" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim5/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim5/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "b8344b4dfb003d133c22eed576a40e0e63fbfda2cc5105a0cc0f600985facf8d" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim5/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "71ec0437c5f137691ecd62b5c1a954a26ac8f0cdc3c96dd7a1d840cb1568ceb8" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim6/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1780, + "sha256": "f5322aec4f1026104656bd6aaf760c783b1a7adc6a0b54cc1333083ca083345c" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim6/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim6/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "b8344b4dfb003d133c22eed576a40e0e63fbfda2cc5105a0cc0f600985facf8d" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim6/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "71ec0437c5f137691ecd62b5c1a954a26ac8f0cdc3c96dd7a1d840cb1568ceb8" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim7/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1780, + "sha256": "47abb846ce6eb7abdefd88119e7b4fb44487de1cdb34acbfe1b2db934c1b34b5" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim7/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5138, + "sha256": "c7c8a79601ee942f31f1be15b557581657f6aadc28c75d6ad47eed6021013174" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim7/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "b8344b4dfb003d133c22eed576a40e0e63fbfda2cc5105a0cc0f600985facf8d" + }, + { + "path": "evidence/candidate/pytest-temp/test_nearest_values_follow_tim7/result/ml_bundle/windows.parquet", + "bytes": 6232, + "sha256": "71ec0437c5f137691ecd62b5c1a954a26ac8f0cdc3c96dd7a1d840cb1568ceb8" + }, + { + "path": "evidence/candidate/pytest-temp/test_numeric_column_mean_keeps0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 3547, + "sha256": "29bd00504c1e4cd094f4025a80a291818aeb19d8a518950fef0370c74cf5d00c" + }, + { + "path": "evidence/candidate/pytest-temp/test_numeric_column_mean_keeps0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_numeric_column_mean_keeps0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "932f0bf688a2f33f4d5698fab698b508624bfb4c4270a2c598d2af3a829e524b" + }, + { + "path": "evidence/candidate/pytest-temp/test_numeric_column_mean_keeps0/result/ml_bundle/windows.parquet", + "bytes": 6230, + "sha256": "961a7522a4af41a0c257fd2ccc1b0d2d41beb4aab4244ba7cc15d14593b1cf18" + }, + { + "path": "evidence/candidate/pytest-temp/test_single_feature_row_remain0/package/processing/jobs/feat/features/radar/radar.fixture/energy.parquet", + "bytes": 1750, + "sha256": "85f9f8be1dfe44a360be67a8f09d76ad7da83732348dc68903ceb7a5cc465d47" + }, + { + "path": "evidence/candidate/pytest-temp/test_single_feature_row_remain0/package/processing/jobs/kin/kinematics/kinematics.parquet", + "bytes": 5133, + "sha256": "3493ee628c4999f66b2e29af4e58e5cfe55c71f27c5743374484763bff820dd4" + }, + { + "path": "evidence/candidate/pytest-temp/test_single_feature_row_remain0/result/ml_bundle/manifest.json", + "bytes": 1557, + "sha256": "c1dd8191b91d5daa2349a443697a9698644d979af819d3b3896a5fe5c811c19e" + }, + { + "path": "evidence/candidate/pytest-temp/test_single_feature_row_remain0/result/ml_bundle/windows.parquet", + "bytes": 6219, + "sha256": "14f9789481b75a71fcb3541ea5348583db231ae8323603bc806de87c5689dd62" + }, + { + "path": "evidence/candidate/pytest.log", + "bytes": 962, + "sha256": "ca8a2b59acf827fb9e1a9fea465ec2dbe871bb00d9294b760a9dd07772c29173" + }, + { + "path": "evidence/candidate/pytest.xml", + "bytes": 3011, + "sha256": "95f641ea92196cb7d680d3f5b08fe303d376c58b84eb99fe41986df89ce0f9b3" + }, + { + "path": "evidence/candidate/receipt.json", + "bytes": 20028, + "sha256": "095b5d940f4c6e849692279de1ba40168c1ba2a690fb705d409de76085e89040" + }, + { + "path": "evidence/candidate/source-after.json", + "bytes": 52153, + "sha256": "284d3c2e71659400ea126a8d3f9d8b971b7688a8f4d8982fc3e82eb6e86087fb" + }, + { + "path": "evidence/candidate/source-before.json", + "bytes": 52153, + "sha256": "284d3c2e71659400ea126a8d3f9d8b971b7688a8f4d8982fc3e82eb6e86087fb" + }, + { + "path": "evidence/documentation.patch", + "bytes": 3630, + "sha256": "f9d5ee8ef65acf3cb6d1d331a0deff4418326e9a2344d4e91db4cfc4ef9d4a58" + }, + { + "path": "evidence/initial-receiver-correction.json", + "bytes": 767, + "sha256": "b778cbcde328073b4cc5b64b2c51a3beda986e5dded25cbad1ab17f32746356f" + }, + { + "path": "evidence/paired-artifacts.json", + "bytes": 22656, + "sha256": "e9f1b94c200261104ce9504b8f568a6738b957b26ee8506e8d317a8f6cb8b355" + }, + { + "path": "evidence/paired-test.py", + "bytes": 10078, + "sha256": "7a5e226afb9c0f49eadf6d4c25b8bc22575f1fdd04afdac854cf8aa4adee58be" + }, + { + "path": "evidence/read_paired_artifacts.py", + "bytes": 3642, + "sha256": "2d5ccbd6a3b07ac47f204b3d9d718506f000a476d072f88b3a23c852e1795104" + }, + { + "path": "evidence/receive_feature_order.py", + "bytes": 4724, + "sha256": "0265180293f33090c44c368f9760c4ecac3a0ab3706f27da6c98e42edd7f1452" + }, + { + "path": "evidence/receive_related.py", + "bytes": 4872, + "sha256": "7fd8437b00f1a2e5931eb83bf667898f40871d94d11af9376725a99c6bacaf26" + }, + { + "path": "evidence/related/process.json", + "bytes": 813, + "sha256": "51009f7433ff47fdaa75e34e5c7e24ea80512e623d74ddc195004f09ccccf74b" + }, + { + "path": "evidence/related/pytest.log", + "bytes": 872, + "sha256": "ede51e6e11ae3b072a32f0799c32630d80946be084bb978720a0d4bf47d5b9ae" + }, + { + "path": "evidence/related/pytest.xml", + "bytes": 2138, + "sha256": "f57258a31434ac6dff0f25be13c8e7cff1378047417f220193ab5e3185860c56" + }, + { + "path": "evidence/related/receipt.json", + "bytes": 65429, + "sha256": "7228ef2f36cc38fe53936fb3c045bb01fe838655b2d85ab2e755f31861edd915" + }, + { + "path": "evidence/related/source-after.json", + "bytes": 52153, + "sha256": "284d3c2e71659400ea126a8d3f9d8b971b7688a8f4d8982fc3e82eb6e86087fb" + }, + { + "path": "evidence/related/source-before.json", + "bytes": 52153, + "sha256": "284d3c2e71659400ea126a8d3f9d8b971b7688a8f4d8982fc3e82eb6e86087fb" + }, + { + "path": "evidence/runtime.patch", + "bytes": 964, + "sha256": "3232f15dc5b9c443b04d63aa0f23503b9fc19926cda0f83882a4708fa7b5c35e" + }, + { + "path": "evidence/test_feature_order_initial.py", + "bytes": 9519, + "sha256": "903ee6f98e1bf67530c9a662eb54a4cebca0a038919ac6a007e3548848b60647" + } + ], + "limits": [ + "Archive contains the complete initial/final paired test artifacts. Related inherited test outputs remain in native custody; their complete process/log/JUnit/source maps and artifact-inventory receipt are included.", + "Private Linux Python3.12.10 runtime only; no Windows, physical sensor, installed application or scientific-validity qualification.", + "Original mixed negative with four schema-invalid 2ns windows is retained separately from corrected final17 test receiving." + ] +} diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/peer-source-review.json b/docs/evidence/ml-bundle-feature-order-713adaab/peer-source-review.json new file mode 100644 index 00000000..e06a65fa --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/peer-source-review.json @@ -0,0 +1,100 @@ +{ + "blockers": [], + "disposition": "approve_source_and_retained_file_readback", + "findings": [ + "The inversion comparison stays on int64 timestamps; the same stable permutation is applied to timestamps and their already-computed feature values, preserving row association without a float conversion.", + "Already ordered series and a single row take the existing path. Stable ordering preserves the original relative order of duplicates; the unchanged searchsorted/strict-distance code retains its exact-match and later-timestamp midpoint rules.", + "Removing exactly the four new lines restores the complete original producer byte-for-byte. Feature-file selection, numeric aggregation, source identifiers, warnings, center generation, targets/validity, metadata and output writing remain unchanged.", + "The receivers use the complete producer and retained Parquet files, including adjacent nanoseconds above binary64 integer precision, duplicate times, equal distance, aggregate numeric features and an actual MCAP ingestion/Job API path.", + "The reported native pipeline correction is energy4 to9 in the final window; the retained paired report and assertions agree. High nanosecond report values were read as decimal strings to preserve exact integers across tool transport.", + "The documentation accurately distinguishes retained row order from embedded timestamp order and does not claim physical synchronization or hardware accuracy." + ], + "independent_checks": { + "all_source_test_hashes_match_frozen_request": true, + "byte_identical_ordered_outputs": 6, + "changed_unordered_outputs": 11, + "input_pairs_read_and_byte_equal": 43, + "output_pairs_read_and_hash_pinned": 17, + "outside_four_added_lines_exact": true, + "restored_baseline_sha256": "38b7161f081ef038e6ce464dd3b82ca2b49f775ad8988010243743274d6fc5e6" + }, + "issue": 86, + "limits": [ + "Reviewer performed source inspection, stdlib hashing and receipt parsing only; no pytest, producer invocation, build, dependency installation or source mutation.", + "All43 input pairs and17 output pairs were independently read as bytes and checked against the retained hashes. Numeric output-column equality was read from the owner's paired report and source assertions; the reviewer did not decode Parquet or recompute outputs.", + "Native owner receiving is Linux Python3.12.10. This review does not replace supported Windows CI or establish hardware/physical-clock receiving.", + "The initial schema-invalid2ns receiver attempt and its corrected final qualification remain separate. The pre-existing internal manifest self-digest convention remains outside this change." + ], + "owner_receiving_read": { + "baseline": { + "errors": 0, + "failed": 11, + "passed": 6, + "skipped": 0 + }, + "candidate": { + "errors": 0, + "failed": 0, + "passed": 17, + "skipped": 0 + }, + "same_final_test_sha256": "7a5e226afb9c0f49eadf6d4c25b8bc22575f1fdd04afdac854cf8aa4adee58be" + }, + "pins": { + "baseline_producer": { + "bytes": 10005, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/evidence/baseline-producer.py", + "sha256": "38b7161f081ef038e6ce464dd3b82ca2b49f775ad8988010243743274d6fc5e6" + }, + "baseline_receipt": { + "bytes": 23626, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/evidence/baseline-final/receipt.json", + "sha256": "a170cc673be0c202e3fc8676412fa5eb62ef95c7ce875894ef3029bf146fbf41" + }, + "candidate_producer": { + "bytes": 10233, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/source/libs/python/capture_analysis/capture_analysis/ml_bundle/job.py", + "sha256": "ed67d94ded834d63599797bbd8efb7b26f125bd216f52bcb7f01febb928922ce" + }, + "candidate_receipt": { + "bytes": 20028, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/evidence/candidate/receipt.json", + "sha256": "095b5d940f4c6e849692279de1ba40168c1ba2a690fb705d409de76085e89040" + }, + "documentation_patch": { + "bytes": 3630, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/evidence/documentation.patch", + "sha256": "f9d5ee8ef65acf3cb6d1d331a0deff4418326e9a2344d4e91db4cfc4ef9d4a58" + }, + "paired_artifacts": { + "bytes": 22656, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/evidence/paired-artifacts.json", + "sha256": "e9f1b94c200261104ce9504b8f568a6738b957b26ee8506e8d317a8f6cb8b355" + }, + "pyproject": { + "bytes": 1233, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/source/pyproject.toml", + "sha256": "0cb8de1ab3dfbfed84ff16b35f3c89c6440180183ee5851d5d80da83622e53d0" + }, + "runtime_patch": { + "bytes": 964, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/evidence/runtime.patch", + "sha256": "3232f15dc5b9c443b04d63aa0f23503b9fc19926cda0f83882a4708fa7b5c35e" + }, + "test": { + "bytes": 10078, + "path": "/srv/hamon-estate/chatgpt-capturesuite-nearest-features-713adaab/source/tests/analysis/test_ml_bundle_feature_order.py", + "sha256": "7a5e226afb9c0f49eadf6d4c25b8bc22575f1fdd04afdac854cf8aa4adee58be" + } + }, + "project": "CaptureSuite", + "reviewed": [ + "Complete four-line runtime patch and full _load_feature_series, _nearest_indices, and run_ml_bundle_job context", + "All17 final parametrized receiver cases, including actual MCAP \u2192 radar extractor \u2192 native feature writer \u2192 public Job API", + "Metadata design note and research PROGRESS documentation patch", + "Final paired baseline/candidate receipts and paired retained-artifact inventory" + ], + "reviewed_at": "2026-10-08T18:58:11.839631+00:00", + "reviewer": "chatgpt:/root/mac_execution", + "schema": "hamon.independent_source_review/1" +} diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/prepublication-static.json b/docs/evidence/ml-bundle-feature-order-713adaab/prepublication-static.json new file mode 100644 index 00000000..8c9edb15 --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/prepublication-static.json @@ -0,0 +1,14 @@ +{ + "schema": "capturesuite.prepublication_static_receiving/1", + "license_enforce_spdx": { + "exit": 0, + "stdout": "license check OK\n", + "stderr": "", + "log_sha256": "7bcb47df08917b40ea6dc57be21749a0311e7197c5d26ca0df66e0d9f516bcba" + }, + "prior_negative": { + "reason": "Sparse receiving checkout omitted workers/stub. The original license check stopped at missing Apache tree before publication; exact existing HEAD subtree then materialized. No inherited file edited.", + "log_sha256": "11b1b278d681305e06cc722a177002793049b947b8689731e607f6380bccf5c5" + }, + "limits": "License check applies to materialized native source; full hosted checkout gate remains separate." +} diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/README.md b/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/README.md new file mode 100644 index 00000000..1d5316bc --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/README.md @@ -0,0 +1,15 @@ +# PR87 Python diagnostic follow-up + +The first supported Windows Python gate at head `33c6fb3409970941521bd37d236ddda4d3bed581` timed out at the existing 300-second deadline. Its process exit, JUnit hash and test counts are null. Quiet output reached 91% plus 12 progress symbols without an assertion failure, which does not establish a passing suite or identify the active test. + +The separate C++ job in the same run passed all 30 CTests and six native integration cases. Current main `a2c89957` separately passed 608 Python tests with six existing missing-daemon skips in 227.34 seconds. The same runner image and dependency versions were installed. That control is context, not qualification of this contribution. + +The successor changes only `tools/run_ci_tests.py` reporting: `-q` becomes `-vv`, with `--durations=20`. It retains the complete selected suite, existing kill-test exclusion, JUnit output, 300-second timeout, source snapshots and all acceptance rules. Product source, all test assertions and the four-line feature-order repair remain unchanged. A timeout remains unaccepted. + +The wrapper changes from SHA-256 `08a9d4786a6e768e0914ac5490d780c64c07f920b790dd16c5e0740bda9c2ac2` to `a35a6bb9b5293db46201857a5590b45ad77243f646a5cf729112f8130710d776`; reversing only the two argument edits restores its exact original bytes. The runtime patch was independently reviewed by the coordinating root. Project-configured Ruff passed. An initial detached-path Ruff invocation selected non-project rules; its five unrelated findings and the corrected invocation are retained without source fixes. + +`first-ci-evidence.tar.gz` preserves complete decoded job logs, API artifact metadata, extracted receipts and both diagnostic sources. `manifest.json` binds all members and the archive; every member was reopened and byte-compared. The first extraction used the Python schema for the native C++ receipt and omitted that receipt; both the original extraction and explicit corrected v2 are retained. Neither alters the raw logs. + +Hosted artifact archives were not downloaded or inspected because the earlier normal-download CDN refusal remains respected. The C++ receipt reports a dirty build checkout that remained unchanged during its tests; the complete source-manifest artifact was not retrieved. + +This packet precedes the successor diagnostic gate and claims no result for it. Native nearest-feature receiving remains separately recorded in the parent packet: the same 17 controls change from 6 passing/11 failing on baseline to 17 passing on the repair, plus 14 inherited cases. No product replay occurred merely to change diagnostic reporting. diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/first-ci-evidence.tar.gz b/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/first-ci-evidence.tar.gz new file mode 100644 index 00000000..ea9d00b0 Binary files /dev/null and b/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/first-ci-evidence.tar.gz differ diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/manifest.json b/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/manifest.json new file mode 100644 index 00000000..d78fa3bf --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/python-ci-diagnostic/manifest.json @@ -0,0 +1,68 @@ +{ + "schema": "capturesuite.pr87_diagnostic_capsule/1", + "first_head": "33c6fb3409970941521bd37d236ddda4d3bed581", + "first_tree": "0426265ad9d834f205bcece47eb6d69c94672905", + "first_run_id": 37829510696, + "archive": { + "path": "first-ci-evidence.tar.gz", + "bytes": 68167, + "sha256": "847566053aae5c9623fb3832b09fa18ad0ab3459e56eb319f2495db90f41b2ec", + "members": 13, + "expanded_bytes": 459778 + }, + "files": { + "first-python-job.log": { + "bytes": 51861, + "sha256": "97fa945196a580be7bf67adecf3ef17ca37ffb2f1b447a574d1b3d1cd4c9785b" + }, + "first-cpp-job.log": { + "bytes": 312288, + "sha256": "29576e3f88b0937dfaed038125c7177be47251b94e86a1f28b7cf28bbebca1ea" + }, + "main-python-control.log": { + "bytes": 53054, + "sha256": "6606c6ee7accbfb7b7afe7d1239d7c0fe4d0a9a39f4d757e68833acdd88c8b5d" + }, + "first-python-receipt.json": { + "bytes": 1246, + "sha256": "1c655bd858c10c4af56dddf3b0af45ba8ba587aac223bf189c9bc769aa324493" + }, + "first-final-jobs.json": { + "bytes": 10635, + "sha256": "1e52d929595237b0eb0968bca2058fba48fecb0c0a97897971dc843090cc5e6e" + }, + "first-api-artifacts.json": { + "bytes": 1830, + "sha256": "a10940d3376353fd929052c8ab22dc688cb16477605a787d8d94701089f06e1f" + }, + "first-gate.json": { + "bytes": 4501, + "sha256": "4a3ccb13d08ca116c6ae91a5da7f071f38c6b464e27a8a11783ee6dd56a2b672" + }, + "first-gate-v2.json": { + "bytes": 7429, + "sha256": "df2d92cfa7fcd7a750f25aad7c29a2324d4b21a70bb134267a458e4100ab5416" + }, + "diagnostic-proposal/run_ci_tests.original.py": { + "bytes": 7416, + "sha256": "08a9d4786a6e768e0914ac5490d780c64c07f920b790dd16c5e0740bda9c2ac2" + }, + "diagnostic-proposal/run_ci_tests.py": { + "bytes": 7443, + "sha256": "a35a6bb9b5293db46201857a5590b45ad77243f646a5cf729112f8130710d776" + }, + "diagnostic-proposal/diagnostic.patch": { + "bytes": 272, + "sha256": "fca694cf321cbb6157f282ae5f330ae400598ee6af0a224f85955bb2699e762f" + }, + "diagnostic-proposal/proposal.json": { + "bytes": 726, + "sha256": "e8cb56e7b0ef1432e17e512a78a81407df1e3852ce0945fd9642c9330e568372" + }, + "diagnostic-proposal/scoped-static.json": { + "bytes": 1077, + "sha256": "42c76d2f67f3f6f11e7970152c6b66dbff157708fd5e54cdcc9e224a569ecb9b" + } + }, + "scope": "Retained original failed quiet Windows Python gate, successful independent C++ gate, earlier main control, and reviewed verbosity-only proposal. All archive members reopened and compared exactly. No artifact ZIP download or new execution." +} diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/receiving.tar.gz b/docs/evidence/ml-bundle-feature-order-713adaab/receiving.tar.gz new file mode 100644 index 00000000..62fcc378 Binary files /dev/null and b/docs/evidence/ml-bundle-feature-order-713adaab/receiving.tar.gz differ diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/source-verification.json b/docs/evidence/ml-bundle-feature-order-713adaab/source-verification.json new file mode 100644 index 00000000..a573c583 --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/source-verification.json @@ -0,0 +1,32 @@ +{ + "source_preservation": true, + "producer_sha256": "ed67d94ded834d63599797bbd8efb7b26f125bd216f52bcb7f01febb928922ce", + "free_bytes": 4749832192, + "prior_wrapper": "One direct read/style tool process exited1 with no captured stdout/stderr. Its reason is unconfirmed; this file-backed check is the recorded authority.", + "checks": [ + { + "args": [ + "-m", + "ruff", + "check", + "libs/python/capture_analysis/capture_analysis/ml_bundle/job.py", + "tests/analysis/test_ml_bundle_feature_order.py" + ], + "exit": 0, + "stdout": "All checks passed!\n", + "stderr": "" + }, + { + "args": [ + "-m", + "ruff", + "format", + "--check", + "tests/analysis/test_ml_bundle_feature_order.py" + ], + "exit": 0, + "stdout": "1 file already formatted\n", + "stderr": "" + } + ] +} diff --git a/docs/evidence/ml-bundle-feature-order-713adaab/verify_source.py b/docs/evidence/ml-bundle-feature-order-713adaab/verify_source.py new file mode 100644 index 00000000..f79a7748 --- /dev/null +++ b/docs/evidence/ml-bundle-feature-order-713adaab/verify_source.py @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-3.0-only +"""Verify the bounded source change and its scoped style gates.""" +from pathlib import Path +import subprocess +import hashlib +import json +import shutil +root=Path(__file__).resolve().parent.parent +source=root/"source" +target=source/"libs/python/capture_analysis/capture_analysis/ml_bundle/job.py" +old=(root/"evidence/baseline-producer.py").read_bytes() +added=b' # Nearest lookup requires timestamp order; keep each value with its row.\n if np.any(t_ns[1:] < t_ns[:-1]):\n order = np.argsort(t_ns, kind="stable")\n t_ns, values = t_ns[order], values[order]\n' +record={"source_preservation":target.read_bytes().replace(added,b"",1)==old, +"producer_sha256":hashlib.sha256(target.read_bytes()).hexdigest(), +"free_bytes":shutil.disk_usage(root).free, +"prior_wrapper":"One direct read/style tool process exited1 with no captured stdout/stderr. Its reason is unconfirmed; this file-backed check is the recorded authority.", +"checks":[]} +for args in [ +["-m","ruff","check","libs/python/capture_analysis/capture_analysis/ml_bundle/job.py","tests/analysis/test_ml_bundle_feature_order.py"], +["-m","ruff","format","--check","tests/analysis/test_ml_bundle_feature_order.py"], +]: + run=subprocess.run([str(root/"environment/venv/bin/python"),*args],cwd=source,capture_output=True,text=True) + record["checks"].append({"args":args,"exit":run.returncode,"stdout":run.stdout,"stderr":run.stderr}) +out=root/"evidence/source-verification.json" +out.write_text(json.dumps(record,indent=2)+"\n") +print(json.dumps(record),flush=True) +assert record["source_preservation"] +assert all(check["exit"]==0 for check in record["checks"]) diff --git a/libs/python/capture_analysis/capture_analysis/ml_bundle/job.py b/libs/python/capture_analysis/capture_analysis/ml_bundle/job.py index 8ff6cf51..ba985766 100644 --- a/libs/python/capture_analysis/capture_analysis/ml_bundle/job.py +++ b/libs/python/capture_analysis/capture_analysis/ml_bundle/job.py @@ -93,6 +93,10 @@ def _load_feature_series(features_job_dir: Path) -> tuple[np.ndarray, np.ndarray continue values = df[numeric].mean(axis=1).to_numpy(dtype=np.float64) t_ns = df[t_col].to_numpy(dtype=np.int64) + # Nearest lookup requires timestamp order; keep each value with its row. + if np.any(t_ns[1:] < t_ns[:-1]): + order = np.argsort(t_ns, kind="stable") + t_ns, values = t_ns[order], values[order] parts = path.relative_to(features_job_dir).parts stream_id = parts[2] if len(parts) >= 3 else path.stem return t_ns, values, stream_id, warnings diff --git a/tests/analysis/test_ml_bundle_feature_order.py b/tests/analysis/test_ml_bundle_feature_order.py new file mode 100644 index 00000000..bf21e27a --- /dev/null +++ b/tests/analysis/test_ml_bundle_feature_order.py @@ -0,0 +1,261 @@ +# SPDX-License-Identifier: GPL-3.0-only +"""Nearest-feature alignment retains real timestamp/value pairs in any row order.""" + +from __future__ import annotations + +import hashlib +import json +import shutil +from pathlib import Path +from types import SimpleNamespace + +import pandas as pd +import pytest +from capture_analysis.ml_bundle.job import DEFAULT_TARGET_COLUMNS, run_ml_bundle_job + +ROOT = Path(__file__).resolve().parents[2] +FEATURE_RELATIVE = "features/radar/radar.fixture/energy.parquet" + + +def _seed_teacher(package: Path, *, base: int = 0, unit: int = 100_000_000) -> Path: + teacher = { + "session_time_ns": [base + index * unit for index in range(11)], + "valid_elbow_L": [index != 3 for index in range(11)], + "valid_elbow_R": [True] * 11, + } + for multiple, column in enumerate(DEFAULT_TARGET_COLUMNS, 1): + teacher[column] = [float(multiple * index * 10) for index in range(11)] + path = package / "processing/jobs/kin/kinematics/kinematics.parquet" + path.parent.mkdir(parents=True) + pd.DataFrame(teacher).to_parquet(path, index=False) + return path + + +def _seed_features(package: Path, data: dict) -> Path: + path = package / "processing/jobs/feat" / FEATURE_RELATIVE + path.parent.mkdir(parents=True) + pd.DataFrame(data).to_parquet(path, index=False) + return path + + +def _read_outputs(work: Path, outputs: list[dict]) -> pd.DataFrame: + for row in outputs: + content = (work / row["relativePath"]).read_bytes() + assert row["bytes"] == len(content) + assert row["sha256"] == hashlib.sha256(content).hexdigest() + manifest = json.loads((work / "ml_bundle/manifest.json").read_bytes()) + windows = work / "ml_bundle/windows.parquet" + assert manifest["sha256"]["windows.parquet"] == hashlib.sha256(windows.read_bytes()).hexdigest() + assert manifest["analysisGrids"][0]["method"] == "nearest_feature_window_median_targets" + assert manifest["normalization"] == {"input": "none", "target": "none"} + return pd.read_parquet(windows) + + +def _run_bundle(tmp_path: Path, data: dict, *, base: int = 0, unit: int = 100_000_000): + package = tmp_path / "package" + inputs = [_seed_teacher(package, base=base, unit=unit), _seed_features(package, data)] + before = {path: path.read_bytes() for path in inputs} + work = tmp_path / "result" + outputs, warnings = [], [] + run_ml_bundle_job( + package, + work, + SimpleNamespace(session_id="feature-order-fixture"), + kinematics_job_id="kin", + features_job_id="feat", + window_sec=2 * unit / 1e9, + hop_sec=2 * unit / 1e9, + outputs=outputs, + warnings=warnings, + ) + assert warnings == [] + assert {path: path.read_bytes() for path in inputs} == before + windows = _read_outputs(work, outputs) + assert windows["session_time_ns"].tolist() == [base + index * unit for index in (1, 3, 5, 7, 9)] + assert windows["theta_elbow_flex_L"].tolist() == [10.0, 30.0, 50.0, 70.0, 90.0] + assert windows["valid_mask"].tolist() == [True, False, True, True, True] + assert windows["feature_stream_id"].tolist() == ["radar.fixture"] * 5 + return windows + + +@pytest.mark.parametrize("order", [(0, 1, 2), (2, 0, 1), (2, 1, 0), (1, 2, 0)]) +@pytest.mark.parametrize(("base", "unit"), [(0, 100_000_000), (2**53 + 1, 100_000_000)]) +def test_nearest_values_follow_timestamp_pairs_in_any_row_order( + tmp_path: Path, + order: tuple[int, ...], + base: int, + unit: int, +) -> None: + times, energy = [base + index * unit for index in (0, 5, 10)], [10.0, 20.0, 30.0] + windows = _run_bundle( + tmp_path, + {"t_ns": [times[i] for i in order], "energy": [energy[i] for i in order]}, + base=base, + unit=unit, + ) + assert windows["motion_energy"].tolist() == [10.0, 20.0, 20.0, 20.0, 30.0] + + +@pytest.mark.parametrize("order", [(0, 1, 2), (2, 0, 1)]) +def test_adjacent_nanoseconds_above_float_precision_keep_exact_pairing( + tmp_path: Path, + order: tuple[int, ...], +) -> None: + base = 2**53 + 1 + center = base + 500_000_000 + times, energy = [center - 1, center, center + 1], [11.0, 22.0, 33.0] + windows = _run_bundle( + tmp_path, + {"t_ns": [times[i] for i in order], "energy": [energy[i] for i in order]}, + base=base, + ) + assert windows["motion_energy"].tolist() == [11.0, 11.0, 22.0, 33.0, 33.0] + + +@pytest.mark.parametrize("order", [(0, 1, 2, 3), (3, 1, 0, 2)]) +def test_duplicate_feature_times_keep_their_relative_order( + tmp_path: Path, + order: tuple[int, ...], +) -> None: + times = [0, 500_000_000, 500_000_000, 1_000_000_000] + energy = [10.0, 21.0, 22.0, 30.0] + windows = _run_bundle( + tmp_path, + {"t_ns": [times[i] for i in order], "energy": [energy[i] for i in order]}, + ) + # Exact matches use the first equal row. A query just after uses the last + # preceding equal row, retaining the existing searchsorted selection rule. + assert windows["motion_energy"].tolist() == [10.0, 21.0, 21.0, 22.0, 30.0] + + +@pytest.mark.parametrize("order", [(0, 1), (1, 0)]) +def test_equal_distance_still_selects_the_later_timestamp( + tmp_path: Path, + order: tuple[int, ...], +) -> None: + times, energy = [0, 1_000_000_000], [10.0, 30.0] + windows = _run_bundle( + tmp_path, + {"t_ns": [times[i] for i in order], "energy": [energy[i] for i in order]}, + ) + assert windows["motion_energy"].tolist() == [10.0, 10.0, 30.0, 30.0, 30.0] + + +def test_numeric_column_mean_keeps_its_timestamp_pair(tmp_path: Path) -> None: + windows = _run_bundle( + tmp_path, + { + "session_time_ns": [1_000_000_000, 0, 500_000_000], + "left": [5.0, 1.0, 3.0], + "right": [7.0, 3.0, 5.0], + "valid": [1, 1, 1], + "valid_fraction": [1.0, 1.0, 1.0], + }, + ) + assert windows["motion_energy"].tolist() == [2.0, 4.0, 4.0, 4.0, 6.0] + + +def test_single_feature_row_remains_usable(tmp_path: Path) -> None: + windows = _run_bundle(tmp_path, {"t_ns": [500_000_000], "energy": [42.0]}) + assert windows["motion_energy"].tolist() == [42.0] * 5 + + +def test_native_radar_features_reach_job_api_with_embedded_times_out_of_order( + tmp_path: Path, +) -> None: + import numpy as np + from capture_analysis import JobParams, hash_sources_tree, run + from capture_analysis.features.io import write_feature_table + from capture_analysis.features.radar_frame import extract_radar_frame_features + from capture_analysis.types import GapMask, StreamRef, TimeWindow + from capture_protocol.generated.capture.v1.data import radar_frame_pb2 + from mcap.writer import CompressionType, Writer + + package = tmp_path / "recording.mmsession" + shutil.copytree(ROOT / "tests/fixtures/mini_session", package) + teacher = _seed_teacher(package) + mcap_path = tmp_path / "embedded-session-order.mcap" + with mcap_path.open("wb") as output: + writer = Writer(output, compression=CompressionType.NONE) + writer.start(profile="protobuf") + schema = writer.register_schema(name="radar.frame/1", encoding="protobuf", data=b"") + channel = writer.register_channel( + topic="radar.fixture", + message_encoding="protobuf", + schema_id=schema, + ) + for index, (timestamp, amplitude) in enumerate( + [(1_000_000_000, 3), (0, 1), (500_000_000, 2)], + ): + frame = radar_frame_pb2.RadarFrame( + num_rx=1, + num_chirps=1, + num_samples=1, + sample_encoding="uint16_le_raw_interleaved", + payload=np.asarray([amplitude], dtype=" int: "-m", "pytest", "tests", - "-q", + "-vv", + "--durations=20", "-ra", "--ignore=tests/kill_tests", f"--junitxml={junit}",