fix(polygon): separate dataset sources from runs

This commit is contained in:
DCCONSTRUCTIONS
2026-07-25 18:40:56 +03:00
parent 2e5c4ba1c5
commit e97573e221
13 changed files with 1036 additions and 658 deletions
+34 -11
View File
@@ -44,7 +44,7 @@ GROUND_REPORT_ARTIFACT_KIND: Final = "goose-ground-qualification-report"
GROUND_FAILURE_ARTIFACT_KIND: Final = "goose-ground-qualification-failure-preview"
GROUND_REPORT_SCHEMA: Final = "missioncore.goose-ground-qualification-report/v1"
GROUND_FAILURE_SCHEMA: Final = "missioncore.goose-ground-qualification-failure-preview/v1"
GROUND_REVIEW_SCHEMA: Final = "missioncore.polygon-ground-review/v1"
GROUND_REVIEW_SCHEMA: Final = "missioncore.polygon-ground-review/v2"
GROUND_REVIEW_FRAME_SCHEMA: Final = "missioncore.polygon-ground-review-frame/v1"
GOOSE_REVIEW_PACK_SCHEMA: Final = "missioncore.goose-ground-review-pack/v1"
GOOSE_REVIEW_FRAME_SCHEMA: Final = "missioncore.goose-ground-review-frame/v1"
@@ -54,6 +54,11 @@ MAX_REVIEW_FRAME_BYTES: Final = 2 * 1024**2
MAX_REVIEW_FRAMES: Final = 2_000
MAX_REVIEW_POINTS: Final = 20_000
COMMIT_PATTERN: Final = re.compile(r"^[a-f0-9]{40}$")
GOOSE_FRAME_ID_PATTERN: Final = re.compile(
r"^(?P<dataset_sequence_id>[A-Za-z0-9][A-Za-z0-9_-]{0,95})"
r"__(?P<dataset_frame_number>[0-9]{4})"
r"_(?P<sensor_timestamp_ns>[0-9]{16,20})$"
)
READ_ONLY_LIMITATIONS: Final[tuple[str, ...]] = (
"Архивный UI-0 публикует только квалификационные доказательства; "
"содержимое команд и mutation-маршруты в архиве отсутствуют.",
@@ -288,16 +293,19 @@ def build_polygon_router(
"preview_points": manifest["preview_points"],
"frames": [
{
key: frame[key]
for key in (
"sequence",
"frame_id",
"source_point_count",
"point_count",
"current",
"patchworkpp",
"ground_iou_delta",
)
**{
key: frame[key]
for key in (
"sequence",
"frame_id",
"source_point_count",
"point_count",
"current",
"patchworkpp",
"ground_iou_delta",
)
},
**_goose_frame_identity(frame["frame_id"]),
}
for frame in manifest["frames"]
],
@@ -717,6 +725,21 @@ def _read_ground_review_manifest(
return pack_root, manifest
def _goose_frame_identity(frame_id: str) -> dict[str, str | int]:
match = GOOSE_FRAME_ID_PATTERN.fullmatch(frame_id)
if match is None:
raise HTTPException(
status_code=500,
detail="Идентичность GOOSE-кадра нарушает контракт.",
)
return {
"dataset_sequence_id": match.group("dataset_sequence_id"),
"dataset_frame_number": int(match.group("dataset_frame_number")),
# Nanosecond Unix time exceeds JavaScript's safe integer range.
"sensor_timestamp_ns": match.group("sensor_timestamp_ns"),
}
def _valid_review_metrics(value: object) -> bool:
if not isinstance(value, dict):
return False