173 lines
5.5 KiB
JavaScript
173 lines
5.5 KiB
JavaScript
import assert from "node:assert/strict";
|
||
import { after, before, test } from "node:test";
|
||
import { readFile } from "node:fs/promises";
|
||
import { createServer } from "vite";
|
||
|
||
let server;
|
||
let fetchM48TRiskQualityResult;
|
||
|
||
const resultId = `m48q-native-risk-quality-lab-${"a".repeat(64)}`;
|
||
|
||
before(async () => {
|
||
server = await createServer({
|
||
appType: "custom",
|
||
logLevel: "silent",
|
||
server: { middlewareMode: true },
|
||
});
|
||
({ fetchM48TRiskQualityResult } = await server.ssrLoadModule(
|
||
"/src/core/laboratory/m48tRiskQuality.ts",
|
||
));
|
||
});
|
||
|
||
after(async () => server?.close());
|
||
|
||
function response(value) {
|
||
return { ok: true, status: 200, json: async () => value };
|
||
}
|
||
|
||
function payload() {
|
||
return {
|
||
schema_version: "missioncore.m48q-native-risk-quality-view/v1",
|
||
variant: "native-risk-review",
|
||
result_id: resultId,
|
||
created_at_utc: "2026-08-26T10:00:00Z",
|
||
status: "complete-review-ready-quality-not-adjudicated",
|
||
access: "read-only",
|
||
ground_truth: false,
|
||
source: {
|
||
source_id: "RAVNOVES00",
|
||
frame_count: 4489,
|
||
raster_width: 800,
|
||
raster_height: 600,
|
||
geometric_resampling: false,
|
||
rectification: false,
|
||
warp: false,
|
||
},
|
||
configuration: {
|
||
candidate: {
|
||
provider_id: "triton-rf-detr-large-coco-native-kb4-risk-fp16-shadow/v0",
|
||
model_id: "rf_detr_large_native_kb4:1",
|
||
preprocess_id: "raw-kb4-uint8-fused-mask-rgb-pad8-imagenet-trt/v0",
|
||
minimum_score: 0.25,
|
||
},
|
||
},
|
||
method: {
|
||
schema_version: "missioncore.laboratory-method/v1",
|
||
completeness: "complete",
|
||
execution_class: "hybrid",
|
||
pipeline_id: "m48q-native-raw-fisheye-risk-case-review/v1",
|
||
components: [{
|
||
kind: "model",
|
||
name: "RF-DETR-L native KB4 TensorRT",
|
||
version: "rf_detr_large_native_kb4:1",
|
||
role: "risk proposals",
|
||
identity_sha256: "b".repeat(64),
|
||
}],
|
||
},
|
||
execution: {
|
||
effective_world_state_fps: 11.84338,
|
||
world_state_completion_p95_ms: 47.940779,
|
||
detector_total_p95_ms: 21.19895,
|
||
gpu_utilization_p95_percent: 53,
|
||
gpu_memory_used_maximum_mib: 9718,
|
||
additional_inference_passes: 0,
|
||
},
|
||
metrics: {
|
||
selection: {
|
||
case_count: 24,
|
||
minimum_sequence_separation: 12,
|
||
selected_bucket_coverage: { person: 22, animal: 3 },
|
||
selected_class_counts: { person: 44, dog: 3 },
|
||
},
|
||
runtime: {
|
||
delivery_ratio: 1,
|
||
integrated_runtime_gate_passed: true,
|
||
operating_target_gate_passed: true,
|
||
},
|
||
native_tensor_parity: {
|
||
risk_detection_precision: 0.9887,
|
||
risk_detection_recall: 0.9831,
|
||
matched_mean_iou: 0.9882,
|
||
},
|
||
},
|
||
acceptance: {
|
||
review_ready: true,
|
||
integrated_runtime_gate_passed: true,
|
||
independent_quality_evaluated: false,
|
||
semantic_candidate_accepted: false,
|
||
},
|
||
review: {
|
||
source_raster: { width: 800, height: 600 },
|
||
overlay: { client_rendered: true, toggleable: true },
|
||
cases: Array.from({ length: 24 }, (_, index) => {
|
||
const caseId = String(index * 20 + 12).padStart(6, "0");
|
||
return {
|
||
case_id: caseId,
|
||
sequence: Number(caseId),
|
||
frame_id: `frame-${caseId}`,
|
||
evidence_time_ns: 35_000_000_000 + index * 1_000_000,
|
||
image_url: `/review/${caseId}.jpg`,
|
||
media_type: "image/jpeg",
|
||
width: 800,
|
||
height: 600,
|
||
byte_length: 1000 + index,
|
||
sha256: String(index.toString(16)).padStart(64, "0"),
|
||
geometric_resampling: false,
|
||
selection_buckets: [index % 2 ? "person" : "animal"],
|
||
comparison: {
|
||
native_detection_count: 1,
|
||
legacy_704_detection_count: 1,
|
||
matched_detection_count_iou_at_least_0_5: 1,
|
||
},
|
||
proposals: [{
|
||
proposal_id: `proposal-${index}-0`,
|
||
class_name: index % 2 ? "person" : "dog",
|
||
risk_family: index % 2 ? "person" : "animal",
|
||
score: 0.75,
|
||
box_xyxy: [10, 20, 100, 200],
|
||
}],
|
||
};
|
||
}),
|
||
},
|
||
limitations: ["No independent route truth."],
|
||
};
|
||
}
|
||
|
||
test("M4.8Q parser accepts only the native 800x600 no-resampling review contract", async () => {
|
||
const result = await fetchM48TRiskQualityResult(resultId, {
|
||
fetcher: async () => response(payload()),
|
||
});
|
||
|
||
assert.equal(result.variant, "native-risk-review");
|
||
assert.equal(result.review.cases.length, 24);
|
||
assert.equal(result.review.cases[0].width, 800);
|
||
assert.equal(result.review.cases[0].proposals[0].className, "dog");
|
||
assert.equal(result.execution.additionalInferencePasses, 0);
|
||
assert.equal(result.acceptance.independentQualityEvaluated, false);
|
||
});
|
||
|
||
test("M4.8Q parser fails closed if raw-fisheye geometry is resampled", async () => {
|
||
const invalid = payload();
|
||
invalid.source.geometric_resampling = true;
|
||
|
||
await assert.rejects(
|
||
fetchM48TRiskQualityResult(resultId, {
|
||
fetcher: async () => response(invalid),
|
||
}),
|
||
/source resampling/,
|
||
);
|
||
});
|
||
|
||
test("M4.8Q reuses the canonical image scene and viewer overlay toggle", async () => {
|
||
const source = await readFile(
|
||
new URL("../src/workspaces/laboratory/M48TRiskQualityVisual.tsx", import.meta.url),
|
||
"utf8",
|
||
);
|
||
|
||
assert.match(source, /<LaboratoryEvidenceViewer/);
|
||
assert.match(source, /<RecordedEvidenceImageScene/);
|
||
assert.match(source, /name=\{boxesVisible \? "eye-off" : "eye"\}/);
|
||
assert.match(source, /raw KB4 800×600 · resampling NO/);
|
||
assert.doesNotMatch(source, /<canvas/);
|
||
});
|