feat(lab): publish E37 R0 acceptance result

This commit is contained in:
DCCONSTRUCTIONS
2026-07-28 02:37:38 +03:00
parent a2fcaa7b39
commit 6db5ac05ef
9 changed files with 801 additions and 9 deletions
@@ -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 {