126 lines
4.1 KiB
JavaScript
126 lines
4.1 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { after, before, test } from "node:test";
|
|
|
|
import { createServer } from "vite";
|
|
|
|
let server;
|
|
let fetchVegetationShadowResult;
|
|
|
|
before(async () => {
|
|
server = await createServer({
|
|
appType: "custom",
|
|
logLevel: "silent",
|
|
server: { middlewareMode: true },
|
|
});
|
|
({ fetchVegetationShadowResult } = await server.ssrLoadModule(
|
|
"/src/core/laboratory/vegetationShadow.ts",
|
|
));
|
|
});
|
|
|
|
after(async () => {
|
|
await server?.close();
|
|
});
|
|
|
|
const resultId = `lab-v1-vegetation-shadow-${"a".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"]
|
|
: ["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",
|
|
assets: Object.fromEntries(keys.map((key) => [key, {
|
|
path: `visual/${sourceKind}/${caseId}/${key}.png`,
|
|
sha256: "d".repeat(64),
|
|
}])),
|
|
};
|
|
}
|
|
|
|
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({
|
|
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: Array.from({ length: 12 }, (_, index) => visualCase("ravnoves", index)),
|
|
},
|
|
access: "read-only",
|
|
}), { 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, 12);
|
|
assert.equal(result.validationCases.length, 12);
|
|
assert.match(result.routeCases[0].assets.offroad, /\/assets\/visual\/ravnoves\//);
|
|
assert.deepEqual(result.authority, {
|
|
commandsEnabled: false,
|
|
navigationOrSafetyAccepted: false,
|
|
actuationAccepted: false,
|
|
cameraSemanticsCanClearRigidGeometry: false,
|
|
});
|
|
});
|