From 81d7ad1a7746550fdb2df2f4cf9f2cbddbdfbd29 Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Thu, 30 Jul 2026 22:18:46 +0300 Subject: [PATCH] fix(lab): demote E40 to historical evaluation --- .../src/core/laboratory/e40CaseReview.ts | 5 +++ .../laboratory/AdvancedLaboratoryResult.tsx | 5 ++- .../workspaces/laboratory/E40CaseReview.tsx | 42 +++++++++++-------- .../src/workspaces/laboratory/E40Result.tsx | 24 +++++------ .../test/laboratoryProductUi.test.mjs | 18 ++++++-- src/k1link/compute/e40_operator_review.py | 3 ++ src/k1link/web/e40_case_review_api.py | 2 + 7 files changed, 65 insertions(+), 34 deletions(-) diff --git a/apps/control-station/src/core/laboratory/e40CaseReview.ts b/apps/control-station/src/core/laboratory/e40CaseReview.ts index 9889b6a..3308fd6 100644 --- a/apps/control-station/src/core/laboratory/e40CaseReview.ts +++ b/apps/control-station/src/core/laboratory/e40CaseReview.ts @@ -50,6 +50,11 @@ export interface E40CaseCatalog { access: "read-only"; } +/** + * Immutable v1 storage vocabulary. Product UI interprets these legacy values + * only as support/challenge of the E37 engineering label; neither value + * establishes physical ground truth or authorizes an operational model. + */ export type E40OperatorVerdict = "confirmed-error" | "rejected-error"; export interface E40OperatorDecision { diff --git a/apps/control-station/src/workspaces/laboratory/AdvancedLaboratoryResult.tsx b/apps/control-station/src/workspaces/laboratory/AdvancedLaboratoryResult.tsx index db94f79..0264e3e 100644 --- a/apps/control-station/src/workspaces/laboratory/AdvancedLaboratoryResult.tsx +++ b/apps/control-station/src/workspaces/laboratory/AdvancedLaboratoryResult.tsx @@ -40,7 +40,10 @@ export function advancedLaboratoryWorkOptions( { id: "e37-ravnoves-acceptance", label: "LAB E37 · RAVNOVES00 acceptance R0" }, { id: "e38-perception-baseline", label: "LAB E38 · perception quality R1" }, { id: "e39-perception-refinement", label: "LAB E39 · perception refinement R1" }, - { id: "e40-perception-product-gate", label: "LAB E40 · leakage-resistant product gate" }, + { + id: "e40-perception-product-gate", + label: "LAB E40 · historical visible engineering evaluation", + }, ]; return options.filter(({ id }) => available.has(id)); } diff --git a/apps/control-station/src/workspaces/laboratory/E40CaseReview.tsx b/apps/control-station/src/workspaces/laboratory/E40CaseReview.tsx index 8995fdd..eb8a5c6 100644 --- a/apps/control-station/src/workspaces/laboratory/E40CaseReview.tsx +++ b/apps/control-station/src/workspaces/laboratory/E40CaseReview.tsx @@ -112,33 +112,39 @@ function reviewPrompt( if (item.reference.presence === "object-present") { return { - question: `${subject} относится к отдельному видимому объекту?`, + question: ( + `${subject} подтверждает инженерную метку E37 «объект присутствует»?` + ), evidence, confirm: ( - "Да — объект виден; эталон верен, расхождение E40 подтверждается." + "Да — наблюдение поддерживает инженерную метку E37." ), reject: ( - "Нет — это фон или часть среды; предполагаемая ошибка отклоняется." + "Нет — метка E37 оспорена и требует отдельной ревизии." ), }; } if (item.reference.presence === "background-or-noise") { return { - question: `${subject} является фоном или шумом, а не объектом?`, + question: ( + `${subject} подтверждает инженерную метку E37 «фон или шум»?` + ), evidence, confirm: ( - "Да — это фон или шум; эталон верен, расхождение E40 подтверждается." + "Да — наблюдение поддерживает инженерную метку E37." ), reject: ( - "Нет — отдельный объект есть; предполагаемая ошибка отклоняется." + "Нет — метка E37 оспорена и требует отдельной ревизии." ), }; } return { - question: "Проверяемый эталон точнее описывает кадр, чем решение E40?", + question: ( + "Наблюдение поддерживает инженерную метку E37 для этого расхождения?" + ), evidence, - confirm: "Да — эталон верен, расхождение E40 подтверждается.", - reject: "Нет — эталон спорен, предполагаемая ошибка отклоняется.", + confirm: "Да — наблюдение поддерживает инженерную метку E37.", + reject: "Нет — метка E37 оспорена и требует отдельной ревизии.", }; } @@ -174,7 +180,7 @@ export function E40CaseReview({ resultId }: { resultId: string }) { || nextReview.reviewedItemCount > nextCatalog.total ) { throw new Error( - "Операторская проверка E40 не совпадает с каталогом ошибок.", + "Операторская проверка E40 не совпадает с каталогом расхождений.", ); } setCatalog(nextCatalog); @@ -335,7 +341,7 @@ export function E40CaseReview({ resultId }: { resultId: string }) { ) : error || !detail || !selectedCase ? (
- {error ?? "Выберите ошибку для проверки."} + {error ?? "Выберите расхождение для проверки."}
) : (
@@ -436,7 +442,7 @@ export function E40CaseReview({ resultId }: { resultId: string }) {
{DIMENSION_LABELS[dimension]}
- Эталон ·{" "} + Инженерная метка E37 ·{" "} {VALUE_LABELS[ stateValue(selectedCase.reference, dimension) ]} @@ -461,9 +467,9 @@ export function E40CaseReview({ resultId }: { resultId: string }) { {verdictPending ? "Сохраняем…" : selectedDecision?.verdict === "confirmed-error" - ? "Ошибка подтверждена" + ? "Метка E37 поддержана" : selectedDecision?.verdict === "rejected-error" - ? "Расхождение отклонено" + ? "Метка E37 оспорена" : "Решение оператора"}
)} diff --git a/apps/control-station/test/laboratoryProductUi.test.mjs b/apps/control-station/test/laboratoryProductUi.test.mjs index c0e3789..8e7c122 100644 --- a/apps/control-station/test/laboratoryProductUi.test.mjs +++ b/apps/control-station/test/laboratoryProductUi.test.mjs @@ -283,7 +283,7 @@ test("E40 reports historical visible evaluation with bounded camera-LiDAR case r assert.match(e40Source, /Только camera-only использует softmax/); assert.match(e40Source, /