repository is now a presentation-ready development prototype
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
const SCHEMA_VERSION = "dashboard_data_v1";
|
||||
const APPROVED_PARTITIONS = Object.freeze(["train", "tune", "calibrate"]);
|
||||
const APPROVED_TARGET = "first-attempt next-episode binary non-pass rate";
|
||||
const REQUIRED_CALIBRATION_MODELS = Object.freeze([
|
||||
"hist_gradient_boosting_platt",
|
||||
"logistic_platt",
|
||||
]);
|
||||
const ENVELOPE_KEYS = Object.freeze([
|
||||
"development_preview",
|
||||
"population_estimate_allowed",
|
||||
@@ -20,15 +25,22 @@ export const REQUIRED_ASSETS = Object.freeze({
|
||||
const SENSITIVE_KEY_PARTS = new Set([
|
||||
"address",
|
||||
"certificate",
|
||||
"credential",
|
||||
"email",
|
||||
"inspector",
|
||||
"internal",
|
||||
"ip",
|
||||
"owner",
|
||||
"password",
|
||||
"pid",
|
||||
"plate",
|
||||
"prediction",
|
||||
"probability",
|
||||
"raw",
|
||||
"secret",
|
||||
"session",
|
||||
"station",
|
||||
"technician",
|
||||
"token",
|
||||
"user",
|
||||
"vin",
|
||||
@@ -337,6 +349,11 @@ export function validateAssetSet(rawAssets) {
|
||||
requireExactKeys(rawAssets, Object.keys(REQUIRED_ASSETS), "asset set");
|
||||
const manifest = rawAssets.manifest;
|
||||
validateEnvelope(manifest, "data_manifest");
|
||||
if (!manifest.development_preview || manifest.population_estimate_allowed) {
|
||||
throw new DataContractError(
|
||||
"The dashboard accepts development-sample, non-population assets only.",
|
||||
);
|
||||
}
|
||||
requireExactKeys(
|
||||
manifest,
|
||||
[
|
||||
@@ -427,6 +444,9 @@ export function validateAssetSet(rawAssets) {
|
||||
requireInteger(manifest.definitions[key], `data_manifest.definitions.${key}`, { min: 1 });
|
||||
}
|
||||
requireString(manifest.definitions.target, "data_manifest.definitions.target");
|
||||
if (manifest.definitions.target !== APPROVED_TARGET) {
|
||||
throw new DataContractError("data_manifest.definitions.target is outside the approved scope.");
|
||||
}
|
||||
if (!Array.isArray(manifest.assets)) {
|
||||
throw new DataContractError("data_manifest.assets must be an array.");
|
||||
}
|
||||
@@ -463,6 +483,16 @@ export function validateAssetSet(rawAssets) {
|
||||
throw new DataContractError(`model_diagnostics.rows[${index}].model is not cataloged.`);
|
||||
}
|
||||
}
|
||||
for (const model of REQUIRED_CALIBRATION_MODELS) {
|
||||
const matches = validated.diagnostics.rows.filter(
|
||||
(row) => row.model === model && row.partition === "calibrate",
|
||||
);
|
||||
if (matches.length !== 1) {
|
||||
throw new DataContractError(
|
||||
`model_diagnostics must contain exactly one approved calibration row for ${model}.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
const minimumSupport = manifest.definitions.suppression_min_support;
|
||||
const supportRounding = manifest.definitions.support_rounding;
|
||||
for (const name of ["overview", "ageRisk", "scorecards", "coverage"]) {
|
||||
|
||||
Reference in New Issue
Block a user