feat(lab): publish E39 refinement result

This commit is contained in:
DCCONSTRUCTIONS
2026-07-28 10:06:57 +03:00
parent 6e5124bd9c
commit 1f20e0d7d9
9 changed files with 770 additions and 9 deletions
@@ -11,6 +11,7 @@ import { E34Result } from "./E34Result";
import { E35Result } from "./E35Result";
import { E37Result } from "./E37Result";
import { E38Result } from "./E38Result";
import { E39Result } from "./E39Result";
import { RecordedReplayEvidence } from "./RecordedReplayEvidence";
export type AdvancedLaboratoryWorkId =
@@ -20,7 +21,8 @@ export type AdvancedLaboratoryWorkId =
| "e34-temporal-layer"
| "e35-degradation-recovery"
| "e37-ravnoves-acceptance"
| "e38-perception-baseline";
| "e38-perception-baseline"
| "e39-perception-refinement";
type LaboratoryWorkspaceProps = WorkspaceRendererProps & {
SpatialView: ComponentType<WorkspaceRendererProps>;
@@ -37,6 +39,7 @@ export function isAdvancedLaboratoryWorkId(
|| value === "e35-degradation-recovery"
|| value === "e37-ravnoves-acceptance"
|| value === "e38-perception-baseline"
|| value === "e39-perception-refinement"
);
}
@@ -87,6 +90,12 @@ export function advancedLaboratoryWorkOptions(
label: "LAB E38 · perception quality R1",
});
}
if (results.e39) {
options.push({
id: "e39-perception-refinement",
label: "LAB E39 · perception refinement R1",
});
}
return options;
}
@@ -124,6 +133,9 @@ export function AdvancedLaboratoryResult({
failedSessionId: string | null;
replayError: string | null;
}) {
if (workId === "e39-perception-refinement" && results.e39) {
return <E39Result rigLabel={rigLabel} result={results.e39} />;
}
if (workId === "e38-perception-baseline" && results.e38) {
return <E38Result rigLabel={rigLabel} result={results.e38} />;
}
@@ -0,0 +1,176 @@
import {
LaboratoryEvidence,
LaboratoryResultSummary,
LaboratorySummary,
LaboratoryWorkTemplate,
} from "../../components/laboratory/LaboratoryPresentation";
import type {
E39PerceptionRefinementResult,
} from "../../core/laboratory/advancedResults";
import { formatNumber } from "../../presentation";
function percent(value: number): string {
return `${(value * 100).toLocaleString("ru-RU", {
maximumFractionDigits: 1,
})}%`;
}
export function E39Result({
rigLabel,
result,
}: {
rigLabel: string;
result: E39PerceptionRefinementResult;
}) {
const metrics = result.metrics;
const dimensions = metrics.dimensions;
const development = result.developmentCrossValidation.dimensions;
const gateLabel = result.qualityGatePassed
? "R1 gate пройден"
: "R1 gate не пройден";
return (
<LaboratoryWorkTemplate
summary={(
<LaboratorySummary
title="LAB E39 · refinement качества R1"
description="Поверх baseline E38 проверена более богатая source-scoped модель camera + LiDAR. Метод был выбран только по development-кейсам, исполнен на Worker 006 и один раз оценён на неизменяемом validation E37."
status={gateLabel}
statusTone={result.qualityGatePassed ? "success" : "warning"}
facts={[
{
label: "Конфигурация",
value: `${rigLabel} · ${result.sourceDisplayName}`,
},
{
label: "Development",
value: `${formatNumber(metrics.developmentItems, 0)} · 5-fold CV`,
},
{
label: "Validation",
value: `${formatNumber(metrics.validationItems, 0)} · sealed`,
},
{
label: "Исполнение",
value: `Worker 006 · ${result.workerNode}`,
},
]}
brief={{
question: "Закроет ли точная совокупность camera-crop, LiDAR-формы и проекционных признаков разрыв E38 до 90% без обучения на validation?",
approach: "Для каждого case сформированы 262 детерминированных признака. Robust-scaled 3-NN и правила dimension projection были зафиксированы после пятифолдовой проверки только на 340 development-кейсах; validation labels при выборе не использовались.",
principalResult: `Development CV показал presence ${percent(development.presence.accuracy)} и geometry ${percent(development.geometryAssociation.accuracy)}, но sealed validation — по ${percent(dimensions.presence.accuracy)}. Freshness удержан выше порога: ${percent(dimensions.freshness.accuracy)}.`,
limitation: "Модель включает координаты исходного кадра и относится только к RAVNOVES00. Разрыв CV → validation показывает переоценку устойчивости; перенос на другой маршрут, риг или растительную среду не доказан.",
}}
method={{
completeness: "complete",
executionClass: "deterministic",
pipelineId: result.profileId,
components: [
{
kind: "source",
name: "E37 frozen acceptance contract",
version: `${formatNumber(metrics.developmentItems, 0)} development + ${formatNumber(metrics.validationItems, 0)} sealed validation`,
role: "неизменяемый denominator и раздельные reference-метрики",
identitySha256: null,
},
{
kind: "algorithm",
name: "Robust-scaled 3-neighbour refinement",
version: "262 camera + LiDAR features · deterministic 5-fold CV",
role: "source-scoped presence classification без validation-label fit",
identitySha256: null,
},
{
kind: "tool",
name: "Package-bound feature projection",
version: "exact camera crops + LiDAR projection statistics",
role: "воспроизводимый вход Worker без скрытого доступа к исходным данным",
identitySha256: null,
},
{
kind: "runtime",
name: "Worker 006",
version: result.workerNode,
role: "ограниченное исполнение immutable package без командных полномочий",
identitySha256: null,
},
],
}}
/>
)}
evidence={(
<LaboratoryEvidence
eyebrow="DEVELOPMENT → SEALED VALIDATION"
title="Проверка устойчивости refinement"
kind="diagnostic-model"
>
<div className="laboratory-result-metrics">
<div>
<span>Development presence</span>
<strong>{percent(development.presence.accuracy)}</strong>
<small>
{`${formatNumber(development.presence.correct, 0)} / ${formatNumber(development.presence.total, 0)} · 5-fold CV`}
</small>
</div>
<div>
<span>Validation presence</span>
<strong>{percent(dimensions.presence.accuracy)}</strong>
<small>
{`${formatNumber(dimensions.presence.correct, 0)} / ${formatNumber(dimensions.presence.total, 0)} · цель 90%`}
</small>
</div>
<div>
<span>Validation geometry</span>
<strong>{percent(dimensions.geometryAssociation.accuracy)}</strong>
<small>
{`${formatNumber(dimensions.geometryAssociation.correct, 0)} / ${formatNumber(dimensions.geometryAssociation.total, 0)} · цель 90%`}
</small>
</div>
<div>
<span>Validation freshness</span>
<strong>{percent(dimensions.freshness.accuracy)}</strong>
<small>
{`${formatNumber(dimensions.freshness.correct, 0)} / ${formatNumber(dimensions.freshness.total, 0)} · цель 90%`}
</small>
</div>
</div>
</LaboratoryEvidence>
)}
result={(
<LaboratoryResultSummary
title={result.qualityGatePassed
? "Refinement достиг всех source-scoped целей R1"
: "Refinement улучшил baseline, но не закрыл R1"}
status={gateLabel}
statusTone={result.qualityGatePassed ? "success" : "warning"}
metrics={[
{
label: "Presence",
value: percent(dimensions.presence.accuracy),
hint: `${formatNumber(dimensions.presence.incorrect, 0)} ошибок · E38: 82,2%`,
},
{
label: "Geometry association",
value: percent(dimensions.geometryAssociation.accuracy),
hint: `${formatNumber(dimensions.geometryAssociation.incorrect, 0)} ошибок · E38: 81,5%`,
},
{
label: "Freshness",
value: percent(dimensions.freshness.accuracy),
hint: `${formatNumber(dimensions.freshness.incorrect, 0)} ошибок · порог пройден`,
},
{
label: "High severity",
value: formatNumber(metrics.highSeverityFailures, 0),
hint: `E38: 14 · учёт ${percent(metrics.accountingFraction)} · false free ${formatNumber(metrics.falseFreeClaims, 0)}`,
},
]}
conclusion={{
proved: `По сравнению с E38 presence вырос с 82,2% до ${percent(dimensions.presence.accuracy)}, geometry — с 81,5% до ${percent(dimensions.geometryAssociation.accuracy)}, high-severity ошибки сократились с 14 до ${formatNumber(metrics.highSeverityFailures, 0)}. Учёт остался 100%, false-free claims — 0.`,
notProved: `Порог 90% не достигнут по presence и geometry; development CV переоценил sealed validation примерно на 5,4 п.п. Результат не даёт полномочий навигации, команд или safety.`,
decision: "Зафиксировать E39 как измеренное улучшение, но не принимать R1. Следующую итерацию строить на более устойчивом development-only разбиении и более содержательном представлении объекта, не подбирая параметры по sealed validation.",
}}
/>
)}
/>
);
}
@@ -71,6 +71,7 @@ const EMPTY_ADVANCED_RESULTS: AdvancedLaboratoryResults = {
e35: null,
e37: null,
e38: null,
e39: null,
};
function laboratoryWorkOrdinal(value: string): number {