fix(polygon): separate dataset sources from runs
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user