feat(lab): measure RAVNOVES00 R1 quality baseline

This commit is contained in:
DCCONSTRUCTIONS
2026-07-28 03:42:32 +03:00
parent e35f81ac34
commit c018f2b074
20 changed files with 2401 additions and 11 deletions
@@ -132,6 +132,53 @@ export interface E37AcceptanceContractResult {
access: "read-only";
}
export interface E38DimensionMetric {
correct: number;
incorrect: number;
total: number;
accuracy: number;
target: number;
passed: boolean;
byStratum: Readonly<Record<string, {
correct: number;
incorrect: number;
total: number;
accuracy: number;
}>>;
confusion: readonly {
reference: string;
prediction: string;
count: number;
}[];
}
export interface E38PerceptionBaselineResult {
resultId: string;
createdAtUtc: string | null;
sourceSessionId: string;
sourceDisplayName: string;
status: "measured-r1-source-scoped-baseline";
profileId: string;
workerNode: string;
qualityGatePassed: boolean;
metrics: {
developmentItems: number;
validationItems: number;
terminalOutcomes: number;
accountingFraction: number;
falseFreeClaims: number;
highSeverityFailures: number;
dimensions: {
presence: E38DimensionMetric;
geometryAssociation: E38DimensionMetric;
freshness: E38DimensionMetric;
};
};
blockingChecks: readonly string[];
limitations: readonly string[];
access: "read-only";
}
export interface AdvancedLaboratoryResults {
e31: E31LaboratoryResult | null;
e32: E32LaboratoryResult | null;
@@ -139,6 +186,7 @@ export interface AdvancedLaboratoryResults {
e34: E34TemporalLayerResult | null;
e35: E35DegradationRecoveryResult | null;
e37: E37AcceptanceContractResult | null;
e38: E38PerceptionBaselineResult | null;
}
export class AdvancedLaboratoryContractError extends Error {
@@ -539,6 +587,147 @@ function parseE37(value: unknown): E37AcceptanceContractResult {
};
}
function parseE38Dimension(
value: unknown,
label: string,
): E38DimensionMetric {
const source = record(value, label);
const byStratumSource = record(source.by_stratum, `${label}.by_stratum`);
if (!Array.isArray(source.confusion)) {
throw new AdvancedLaboratoryContractError(
`${label}.confusion: ожидался массив.`,
);
}
return {
correct: integerValue(source.correct, `${label}.correct`),
incorrect: integerValue(source.incorrect, `${label}.incorrect`),
total: integerValue(source.total, `${label}.total`),
accuracy: numberValue(source.accuracy, `${label}.accuracy`),
target: numberValue(source.target, `${label}.target`),
passed: booleanValue(source.passed, `${label}.passed`),
byStratum: Object.fromEntries(
Object.entries(byStratumSource).map(([stratum, value]) => {
const metric = record(value, `${label}.by_stratum.${stratum}`);
return [
stratum,
{
correct: integerValue(
metric.correct,
`${label}.by_stratum.${stratum}.correct`,
),
incorrect: integerValue(
metric.incorrect,
`${label}.by_stratum.${stratum}.incorrect`,
),
total: integerValue(
metric.total,
`${label}.by_stratum.${stratum}.total`,
),
accuracy: numberValue(
metric.accuracy,
`${label}.by_stratum.${stratum}.accuracy`,
),
},
];
}),
),
confusion: source.confusion.map((value, index) => {
const row = record(value, `${label}.confusion[${index}]`);
return {
reference: stringValue(
row.reference,
`${label}.confusion[${index}].reference`,
),
prediction: stringValue(
row.prediction,
`${label}.confusion[${index}].prediction`,
),
count: integerValue(
row.count,
`${label}.confusion[${index}].count`,
),
};
}),
};
}
function parseE38(value: unknown): E38PerceptionBaselineResult {
const item = record(value, "E38");
const metrics = record(item.metrics, "E38.metrics");
const dimensions = record(metrics.dimensions, "E38.metrics.dimensions");
diagnosticAuthority(item.authority, "E38.authority");
return {
resultId: contentId(
item.result_id,
"e38-perception-baseline",
"E38.result_id",
),
createdAtUtc: optionalString(item.created_at_utc, "E38.created_at_utc"),
sourceSessionId: stringValue(
item.source_session_id,
"E38.source_session_id",
),
sourceDisplayName: stringValue(
item.source_display_name,
"E38.source_display_name",
),
status: exactString(
item.status,
"measured-r1-source-scoped-baseline",
"E38.status",
),
profileId: stringValue(item.profile_id, "E38.profile_id"),
workerNode: stringValue(item.worker_node, "E38.worker_node"),
qualityGatePassed: booleanValue(
item.quality_gate_passed,
"E38.quality_gate_passed",
),
metrics: {
developmentItems: integerValue(
metrics.development_items,
"E38.metrics.development_items",
),
validationItems: integerValue(
metrics.validation_items,
"E38.metrics.validation_items",
),
terminalOutcomes: integerValue(
metrics.terminal_outcomes,
"E38.metrics.terminal_outcomes",
),
accountingFraction: numberValue(
metrics.accounting_fraction,
"E38.metrics.accounting_fraction",
),
falseFreeClaims: integerValue(
metrics.false_free_claims,
"E38.metrics.false_free_claims",
),
highSeverityFailures: integerValue(
metrics.high_severity_failures,
"E38.metrics.high_severity_failures",
),
dimensions: {
presence: parseE38Dimension(
dimensions.presence,
"E38.metrics.dimensions.presence",
),
geometryAssociation: parseE38Dimension(
dimensions.geometry_association,
"E38.metrics.dimensions.geometry_association",
),
freshness: parseE38Dimension(
dimensions.freshness,
"E38.metrics.dimensions.freshness",
),
},
},
blockingChecks: strings(item.blocking_checks, "E38.blocking_checks"),
limitations: strings(item.limitations, "E38.limitations"),
access: exactString(item.access, "read-only", "E38.access"),
};
}
async function fetchOne<T>(
path: string,
parser: (value: unknown) => T,
@@ -563,15 +752,16 @@ export async function fetchAdvancedLaboratoryResults({
fetcher?: LaboratoryFetch;
signal?: AbortSignal;
} = {}): Promise<AdvancedLaboratoryResults> {
const [e31, e32, e33, e34, e35, e37] = await Promise.all([
const [e31, e32, e33, e34, e35, e37, e38] = await Promise.all([
fetchOne("/api/v1/laboratory/e31/results?limit=1", parseE31, fetcher, signal),
fetchOne("/api/v1/laboratory/e32/results?limit=1", parseE32, fetcher, signal),
fetchOne("/api/v1/laboratory/e33/results?limit=1", parseE33, fetcher, signal),
fetchE34TemporalLayerResult({ fetcher, signal }),
fetchE35DegradationRecoveryResult({ fetcher, signal }),
fetchOne("/api/v1/laboratory/e37/results?limit=1", parseE37, fetcher, signal),
fetchOne("/api/v1/laboratory/e38/results?limit=1", parseE38, fetcher, signal),
]);
return { e31, e32, e33, e34, e35, e37 };
return { e31, e32, e33, e34, e35, e37, e38 };
}
import {
fetchE34TemporalLayerResult,