feat(lab): publish E37 R0 acceptance result
This commit is contained in:
@@ -9,6 +9,7 @@ import { E32Result } from "./E32Result";
|
||||
import { E33Result } from "./E33Result";
|
||||
import { E34Result } from "./E34Result";
|
||||
import { E35Result } from "./E35Result";
|
||||
import { E37Result } from "./E37Result";
|
||||
import { RecordedReplayEvidence } from "./RecordedReplayEvidence";
|
||||
|
||||
export type AdvancedLaboratoryWorkId =
|
||||
@@ -16,7 +17,8 @@ export type AdvancedLaboratoryWorkId =
|
||||
| "e32-track-geometry"
|
||||
| "e33-worker-shadow"
|
||||
| "e34-temporal-layer"
|
||||
| "e35-degradation-recovery";
|
||||
| "e35-degradation-recovery"
|
||||
| "e37-ravnoves-acceptance";
|
||||
|
||||
type LaboratoryWorkspaceProps = WorkspaceRendererProps & {
|
||||
SpatialView: ComponentType<WorkspaceRendererProps>;
|
||||
@@ -31,6 +33,7 @@ export function isAdvancedLaboratoryWorkId(
|
||||
|| value === "e33-worker-shadow"
|
||||
|| value === "e34-temporal-layer"
|
||||
|| value === "e35-degradation-recovery"
|
||||
|| value === "e37-ravnoves-acceptance"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -69,6 +72,12 @@ export function advancedLaboratoryWorkOptions(
|
||||
label: "LAB E35 · degradation recovery",
|
||||
});
|
||||
}
|
||||
if (results.e37) {
|
||||
options.push({
|
||||
id: "e37-ravnoves-acceptance",
|
||||
label: "LAB E37 · RAVNOVES00 acceptance R0",
|
||||
});
|
||||
}
|
||||
return options;
|
||||
}
|
||||
|
||||
@@ -106,6 +115,9 @@ export function AdvancedLaboratoryResult({
|
||||
failedSessionId: string | null;
|
||||
replayError: string | null;
|
||||
}) {
|
||||
if (workId === "e37-ravnoves-acceptance" && results.e37) {
|
||||
return <E37Result rigLabel={rigLabel} result={results.e37} />;
|
||||
}
|
||||
if (workId === "e35-degradation-recovery" && results.e35) {
|
||||
return <E35Result rigLabel={rigLabel} result={results.e35} />;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
import {
|
||||
LaboratoryEvidence,
|
||||
LaboratoryResultSummary,
|
||||
LaboratorySummary,
|
||||
LaboratoryWorkTemplate,
|
||||
} from "../../components/laboratory/LaboratoryPresentation";
|
||||
import type { E37AcceptanceContractResult } from "../../core/laboratory/advancedResults";
|
||||
import { formatNumber } from "../../presentation";
|
||||
|
||||
function distribution(
|
||||
values: Readonly<Record<string, number>>,
|
||||
): string {
|
||||
return Object.entries(values)
|
||||
.sort((left, right) => right[1] - left[1])
|
||||
.map(([label, count]) => `${label}: ${formatNumber(count, 0)}`)
|
||||
.join(" · ");
|
||||
}
|
||||
|
||||
function ContractEvidence({
|
||||
result,
|
||||
}: {
|
||||
result: E37AcceptanceContractResult;
|
||||
}) {
|
||||
return (
|
||||
<div className="laboratory-result-metrics">
|
||||
<div>
|
||||
<span>Presence</span>
|
||||
<strong>{Object.keys(result.dimensionDistributions.presence).length} исхода</strong>
|
||||
<small>{distribution(result.dimensionDistributions.presence)}</small>
|
||||
</div>
|
||||
<div>
|
||||
<span>Geometry association</span>
|
||||
<strong>
|
||||
{Object.keys(result.dimensionDistributions.geometryAssociation).length}
|
||||
{" исходов"}
|
||||
</strong>
|
||||
<small>{distribution(result.dimensionDistributions.geometryAssociation)}</small>
|
||||
</div>
|
||||
<div>
|
||||
<span>Freshness</span>
|
||||
<strong>{Object.keys(result.dimensionDistributions.freshness).length} исхода</strong>
|
||||
<small>{distribution(result.dimensionDistributions.freshness)}</small>
|
||||
</div>
|
||||
<div>
|
||||
<span>Критичность</span>
|
||||
<strong>{Object.keys(result.severityDistribution).length} уровня</strong>
|
||||
<small>{distribution(result.severityDistribution)}</small>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function E37Result({
|
||||
rigLabel,
|
||||
result,
|
||||
}: {
|
||||
rigLabel: string;
|
||||
result: E37AcceptanceContractResult;
|
||||
}) {
|
||||
const metrics = result.metrics;
|
||||
const percent = (value: number) => (
|
||||
`${(value * 100).toLocaleString("ru-RU", { maximumFractionDigits: 1 })}%`
|
||||
);
|
||||
return (
|
||||
<LaboratoryWorkTemplate
|
||||
summary={(
|
||||
<LaboratorySummary
|
||||
title="LAB E37 · контракт приёмки RAVNOVES00 R0"
|
||||
description="Зафиксированы неизменяемый набор проверенных кейсов, отдельный validation holdout и три независимые метрики, по которым дальше будет измеряться качество сенсорного контура. Эта работа определяет честные правила измерения, но ещё не объявляет достижение 90%."
|
||||
status="R0-контракт принят"
|
||||
statusTone="success"
|
||||
facts={[
|
||||
{
|
||||
label: "Конфигурация",
|
||||
value: `${rigLabel} · RAVNOVES00`,
|
||||
},
|
||||
{
|
||||
label: "Проверено",
|
||||
value: `${formatNumber(metrics.reviewedItems, 0)} / ${formatNumber(metrics.terminalOutcomes, 0)}`,
|
||||
},
|
||||
{
|
||||
label: "Holdout",
|
||||
value: `${formatNumber(metrics.validationItems, 0)} validation`,
|
||||
},
|
||||
{
|
||||
label: "Исполнение",
|
||||
value: `Worker 006 · ${result.workerNode}`,
|
||||
},
|
||||
]}
|
||||
brief={{
|
||||
question: "На каком неизменяемом наборе и по каким отдельным критериям честно измерять приближение сенсорного контура к 90% на RAVNOVES00?",
|
||||
approach: "Все 486 кейсов E30 сведены в одну онтологию presence, geometry association и freshness. Внутри каждого source stratum и диапазона детерминированно заморожен 30-процентный validation holdout; два спорных кейса заменены сохранёнными решениями пользователя.",
|
||||
principalResult: `Учтены все ${formatNumber(metrics.reviewedItems, 0)} кейсов: ${formatNumber(metrics.developmentItems, 0)} development и ${formatNumber(metrics.validationItems, 0)} validation. Потерь учёта и false-free claims нет.`,
|
||||
limitation: "Разметка инженерная и source-scoped, а не независимый ground truth. Точность presence, geometry и freshness в этой работе не вычислялась.",
|
||||
}}
|
||||
method={{
|
||||
completeness: "complete",
|
||||
executionClass: "deterministic",
|
||||
pipelineId: result.profileId,
|
||||
components: [
|
||||
{
|
||||
kind: "source",
|
||||
name: result.sourceDisplayName,
|
||||
version: `${formatNumber(metrics.reviewedItems, 0)} reviewed E30 items`,
|
||||
role: "неизменяемое camera + LiDAR evidence",
|
||||
identitySha256: null,
|
||||
},
|
||||
{
|
||||
kind: "algorithm",
|
||||
name: "Stratified deterministic holdout",
|
||||
version: `${percent(result.split.validationFraction)} validation`,
|
||||
role: "source-stratum и range-balanced split без ручной перетасовки",
|
||||
identitySha256: null,
|
||||
},
|
||||
{
|
||||
kind: "runtime",
|
||||
name: "Worker 006",
|
||||
version: result.workerNode,
|
||||
role: "изолированная offline-сборка контракта без командных полномочий",
|
||||
identitySha256: null,
|
||||
},
|
||||
],
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
evidence={(
|
||||
<LaboratoryEvidence
|
||||
eyebrow="ЗАМОРОЖЕННЫЙ КОНТРАКТ"
|
||||
title="Онтология, распределение меток и критичность"
|
||||
kind="diagnostic-model"
|
||||
>
|
||||
<ContractEvidence result={result} />
|
||||
</LaboratoryEvidence>
|
||||
)}
|
||||
result={(
|
||||
<LaboratoryResultSummary
|
||||
title="Измерительная база R0 заморожена; quality gate переносится в R1"
|
||||
status="R0 принят"
|
||||
statusTone="success"
|
||||
metrics={[
|
||||
{
|
||||
label: "Полный учёт",
|
||||
value: percent(metrics.accountingFraction),
|
||||
hint: `${formatNumber(metrics.terminalOutcomes, 0)} terminal outcomes`,
|
||||
},
|
||||
{
|
||||
label: "Development / validation",
|
||||
value: `${formatNumber(metrics.developmentItems, 0)} / ${formatNumber(metrics.validationItems, 0)}`,
|
||||
hint: `${percent(result.split.validationFraction)} holdout`,
|
||||
},
|
||||
{
|
||||
label: "Human exceptions",
|
||||
value: formatNumber(metrics.humanExceptionItems, 0),
|
||||
hint: `${formatNumber(metrics.engineeringItems, 0)} engineering-reviewed`,
|
||||
},
|
||||
{
|
||||
label: "False-free claims",
|
||||
value: formatNumber(metrics.falseFreeClaims, 0),
|
||||
hint: "отсутствие точек не считается свободным пространством",
|
||||
},
|
||||
]}
|
||||
conclusion={{
|
||||
proved: "Для RAVNOVES00 зафиксированы воспроизводимый denominator, неизменяемый validation holdout, раздельные метрики presence, geometry association и freshness, полная provenance и 100-процентный terminal accounting.",
|
||||
notProved: "Не доказаны 90-процентная точность ни по одной метрике, независимый ground truth, перенос на другой маршрут или риг, а также пригодность для навигации и safety.",
|
||||
decision: "Принять R0 как единственную измерительную базу RAVNOVES00. Следующая плановая работа R1 должна вычислить baseline на замороженном validation и улучшать development без изменения holdout.",
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -68,6 +68,7 @@ const EMPTY_ADVANCED_RESULTS: AdvancedLaboratoryResults = {
|
||||
e33: null,
|
||||
e34: null,
|
||||
e35: null,
|
||||
e37: null,
|
||||
};
|
||||
|
||||
function digestFromContentId(value: string | null | undefined): string | null {
|
||||
|
||||
Reference in New Issue
Block a user