285 lines
9.7 KiB
JavaScript
285 lines
9.7 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { access, readFile } from "node:fs/promises";
|
|
import { after, before, test } from "node:test";
|
|
|
|
import { createServer } from "vite";
|
|
|
|
let server;
|
|
let fetchVegetationBenchmarkResult;
|
|
let fetchVegetationShadowResult;
|
|
|
|
before(async () => {
|
|
server = await createServer({
|
|
appType: "custom",
|
|
logLevel: "silent",
|
|
server: { middlewareMode: true },
|
|
});
|
|
({ fetchVegetationBenchmarkResult, fetchVegetationShadowResult } = await server.ssrLoadModule(
|
|
"/src/core/laboratory/vegetationShadow.ts",
|
|
));
|
|
});
|
|
|
|
after(async () => {
|
|
await server?.close();
|
|
});
|
|
|
|
const resultId = `lab-v1-vegetation-shadow-${"a".repeat(64)}`;
|
|
const benchmarkResultId = `lab-v1-vegetation-benchmark-${"d".repeat(64)}`;
|
|
|
|
function candidate(candidateKey, vegetationIou) {
|
|
return {
|
|
loaded_model_name: candidateKey === "ddrnet" ? "ddrnet_39" : "pp_lite_t_seg",
|
|
checkpoint_sha256: (candidateKey === "ddrnet" ? "b" : "c").repeat(64),
|
|
validation_metrics: {
|
|
mean_iou_percent: 44.2,
|
|
published_mean_iou_percent: 46.53,
|
|
vegetation_mean_iou: vegetationIou,
|
|
},
|
|
validation_timing: {
|
|
latency_ms_p95: 22.4,
|
|
throughput_fps_from_mean_inference: 48.1,
|
|
},
|
|
shadow_timing: {
|
|
prewarm_latency_ms: 612.4,
|
|
latency_ms_p95: 21.8,
|
|
throughput_fps_from_mean_inference: 49.2,
|
|
},
|
|
resource: {
|
|
peak_reserved_vram_bytes: 2_000_000_000,
|
|
gpu_name: "NVIDIA GeForce RTX 4090",
|
|
},
|
|
};
|
|
}
|
|
|
|
function visualCase(sourceKind, index) {
|
|
const caseId = `case-${index}`;
|
|
const keys = sourceKind === "goose"
|
|
? ["source", "truth", "ddrnet", "ppliteseg", "ddrnet_error", "ppliteseg_error"]
|
|
: ["source", "ddrnet", "ppliteseg", "urban", "rural", "offroad"];
|
|
return {
|
|
case_id: caseId,
|
|
source_kind: sourceKind,
|
|
width: sourceKind === "goose" ? 512 : 800,
|
|
height: sourceKind === "goose" ? 512 : 600,
|
|
center_crop_xyxy: sourceKind === "goose" ? [0, 0, 512, 512] : [100, 0, 700, 600],
|
|
outside_crop_state: sourceKind === "goose" ? "not-applicable" : "undefined",
|
|
focus: sourceKind === "goose" ? {
|
|
class_name: "high_grass",
|
|
label_id: 51,
|
|
truth_pixels: 16384,
|
|
truth_fraction: 0.0625,
|
|
stratum_rank: index + 1,
|
|
} : null,
|
|
assets: Object.fromEntries(keys.map((key) => [key, {
|
|
path: `visual/${sourceKind}/${caseId}/${key}.png`,
|
|
sha256: "d".repeat(64),
|
|
}])),
|
|
};
|
|
}
|
|
|
|
function routeVideo() {
|
|
return {
|
|
worker_result_id: `lab-v1-ravnoves-video-ddrnet-${"e".repeat(64)}`,
|
|
m47_reference_graph_result_id: `m47-reference-graph-lab-${"f".repeat(64)}`,
|
|
base_m4_result_id: `m4-threat-replay-${"1".repeat(64)}`,
|
|
frame_count: 4489,
|
|
width: 800,
|
|
height: 600,
|
|
center_crop_xyxy: [100, 0, 700, 600],
|
|
outside_crop_state: "undefined",
|
|
sequence_binding: "sequence-0-to-masks/frame-000001.png",
|
|
taxonomy: {
|
|
schema_version: "missioncore.lab-v1-vegetation-taxonomy/v1",
|
|
classes: Array.from({ length: 64 }, (_, classId) => ({
|
|
class_id: classId,
|
|
label: classId === 0 ? "undefined" : `class-${classId}`,
|
|
color_rgb: [classId, classId, classId],
|
|
disposition: classId === 0 ? "undefined" : "prediction",
|
|
})),
|
|
},
|
|
aggregate_prediction_pixels: Array(64).fill(0),
|
|
mask_archive: {
|
|
path: "video/ddrnet-semantic-masks.zip",
|
|
sha256: "9".repeat(64),
|
|
byte_length: 1024,
|
|
},
|
|
};
|
|
}
|
|
|
|
function coarseRouteVideo() {
|
|
return {
|
|
...routeVideo(),
|
|
view_kind: "coarse-material-policy-review",
|
|
linked_tgs_result_id: `m49-tgs-full-shadow-${"2".repeat(64)}`,
|
|
taxonomy: {
|
|
schema_version: "missioncore.lab-v1-terrain-policy-taxonomy/v1",
|
|
classes: Array.from({ length: 10 }, (_, classId) => ({
|
|
class_id: classId,
|
|
label: `policy-${classId}`,
|
|
color_rgb: [classId, classId, classId],
|
|
disposition: classId === 0 ? "ambiguous" : classId === 9 ? "undefined" : "prediction",
|
|
material_class: classId === 0 || classId === 9 ? null : "grass",
|
|
evidence_state: classId === 0 || classId === 9 ? "UNOBSERVED" : "SUPPORTED_GROUND",
|
|
})),
|
|
},
|
|
aggregate_prediction_pixels: Array(10).fill(0),
|
|
mask_archive: {
|
|
path: "video/coarse-material-policy-masks.zip",
|
|
sha256: "8".repeat(64),
|
|
byte_length: 2048,
|
|
},
|
|
valid_fov: {
|
|
mask_path: "video/valid-fov-mask.png",
|
|
mask_sha256: "7".repeat(64),
|
|
outside_valid_fov_class_id: 9,
|
|
},
|
|
policy: {
|
|
presets: {
|
|
urban: { grass: "NO_GO" },
|
|
rural: { grass: "HIGH_COST" },
|
|
offroad: { grass: "HIGH_COST" },
|
|
},
|
|
},
|
|
fusion: {
|
|
mode: "synchronised-multilayer-review",
|
|
pixel_raster_fusion: false,
|
|
camera_semantic_temporal_filter: "none",
|
|
},
|
|
};
|
|
}
|
|
|
|
function labPayload(route = routeVideo()) {
|
|
return {
|
|
schema_version: "missioncore.lab-v1-vegetation-shadow/v1",
|
|
result_id: resultId,
|
|
created_at_utc: "2026-08-27T20:00:00Z",
|
|
status: "visual-shadow-ready-policy-not-authorized",
|
|
ground_truth: false,
|
|
identity: { selected_candidate: "ddrnet" },
|
|
metrics: {
|
|
candidates: {
|
|
ddrnet: candidate("ddrnet", 0.64),
|
|
ppliteseg: candidate("ppliteseg", 0.61),
|
|
},
|
|
},
|
|
decision: {
|
|
selected_candidate: "ddrnet",
|
|
visual_shadow_ready: true,
|
|
mission_policy_ready_for_configuration: true,
|
|
navigation_accepted: false,
|
|
production_accepted: false,
|
|
},
|
|
limitations: ["shadow only"],
|
|
authority: {
|
|
commands_enabled: false,
|
|
navigation_or_safety_accepted: false,
|
|
actuation_accepted: false,
|
|
camera_semantics_can_clear_rigid_geometry: false,
|
|
},
|
|
catalogs: {
|
|
goose: Array.from({ length: 12 }, (_, index) => visualCase("goose", index)),
|
|
ravnoves: [],
|
|
},
|
|
route_video: route,
|
|
access: "read-only",
|
|
};
|
|
}
|
|
|
|
test("vegetation LAB keeps autonomous assets and fail-closed authority", async () => {
|
|
let requestedUrl = "";
|
|
const result = await fetchVegetationShadowResult(resultId, {
|
|
fetcher: async (url) => {
|
|
requestedUrl = String(url);
|
|
return new Response(JSON.stringify(labPayload()), {
|
|
status: 200,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
},
|
|
});
|
|
assert.equal(
|
|
requestedUrl,
|
|
`/api/v1/laboratory/vegetation-shadow/${resultId}`,
|
|
);
|
|
assert.equal(result.selectedCandidate, "ddrnet");
|
|
assert.equal(result.candidates[0].vegetationMeanIouPercent, 64);
|
|
assert.equal(result.routeCases.length, 0);
|
|
assert.equal(result.validationCases.length, 12);
|
|
assert.equal(result.routeVideo.frameCount, 4489);
|
|
assert.equal(result.routeVideo.viewKind, "fine-semantic-prediction");
|
|
assert.equal(result.routeVideo.linkedTgsResultId, null);
|
|
assert.equal(result.routeVideo.taxonomy[0].disposition, "undefined");
|
|
assert.equal(result.validationCases[0].focus.className, "high_grass");
|
|
assert.match(result.validationCases[0].assets.ddrnet_error, /\/assets\/visual\/goose\//);
|
|
assert.deepEqual(result.authority, {
|
|
commandsEnabled: false,
|
|
navigationOrSafetyAccepted: false,
|
|
actuationAccepted: false,
|
|
cameraSemanticsCanClearRigidGeometry: false,
|
|
});
|
|
});
|
|
|
|
test("vegetation LAB parses coarse material policy and sealed TGS binding", async () => {
|
|
const result = await fetchVegetationShadowResult(resultId, {
|
|
fetcher: async () => new Response(JSON.stringify(labPayload(coarseRouteVideo())), {
|
|
status: 200,
|
|
headers: { "Content-Type": "application/json" },
|
|
}),
|
|
});
|
|
assert.equal(result.routeVideo.viewKind, "coarse-material-policy-review");
|
|
assert.match(result.routeVideo.linkedTgsResultId, /^m49-tgs-full-shadow-/);
|
|
assert.equal(result.routeVideo.taxonomy.length, 10);
|
|
assert.equal(result.routeVideo.taxonomy[0].evidenceState, "UNOBSERVED");
|
|
assert.equal(result.routeVideo.policyPresets.urban.grass, "NO_GO");
|
|
assert.equal(result.routeVideo.fusionMode, "synchronised-multilayer-review");
|
|
});
|
|
|
|
test("vegetation GOOSE benchmark opens through its separate archival endpoint", async () => {
|
|
let requestedUrl = "";
|
|
const result = await fetchVegetationBenchmarkResult(benchmarkResultId, {
|
|
fetcher: async (url) => {
|
|
requestedUrl = String(url);
|
|
return new Response(JSON.stringify({
|
|
...labPayload(null),
|
|
result_id: benchmarkResultId,
|
|
}), {
|
|
status: 200,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
},
|
|
});
|
|
assert.equal(
|
|
requestedUrl,
|
|
`/api/v1/laboratory/vegetation-benchmark/${benchmarkResultId}`,
|
|
);
|
|
assert.equal(result.routeVideo, null);
|
|
assert.equal(result.validationCases.length, 12);
|
|
});
|
|
|
|
test("vegetation realtime LAB and archival benchmark use separate admitted instruments", async () => {
|
|
const [resultSource, benchmarkSource] = await Promise.all([
|
|
readFile(
|
|
new URL("../src/workspaces/laboratory/VegetationShadowResult.tsx", import.meta.url),
|
|
"utf8",
|
|
),
|
|
readFile(
|
|
new URL("../src/workspaces/laboratory/VegetationBenchmarkResult.tsx", import.meta.url),
|
|
"utf8",
|
|
),
|
|
]);
|
|
assert.doesNotMatch(resultSource, /M48MaskComparisonVisual/);
|
|
assert.match(resultSource, /M4ReplayThreatVisual/);
|
|
assert.match(resultSource, /M49TgsFullShadowEvidence/);
|
|
assert.match(resultSource, /semanticOverride/);
|
|
assert.match(resultSource, /EoMT CITY \/ DDRNet VEGETATION/);
|
|
assert.equal(resultSource.match(/<LaboratoryEvidence\b/g)?.length, 2);
|
|
assert.match(resultSource, /linkedTgsResultId/);
|
|
assert.match(benchmarkSource, /M48MaskComparisonVisual/);
|
|
assert.doesNotMatch(benchmarkSource, /M49TgsFullShadowEvidence/);
|
|
assert.equal(benchmarkSource.match(/<LaboratoryEvidence\b/g)?.length, 1);
|
|
assert.doesNotMatch(resultSource, /VegetationRouteVisual|urban\/rural\/off-road presets/);
|
|
await assert.rejects(
|
|
access(new URL("../src/workspaces/laboratory/VegetationShadowVisual.tsx", import.meta.url)),
|
|
{ code: "ENOENT" },
|
|
);
|
|
});
|