lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
// Наблюдатель: внешний монитор и пульт преподавателя.
|
|
|
|
|
|
//
|
|
|
|
|
|
// Снимок при подключении обязателен — монитор в классе включают посреди занятия,
|
|
|
|
|
|
// и он должен показать текущее состояние, а не ждать событий. Отправлять в этот
|
|
|
|
|
|
// канал нечего и нельзя: тип `Out` — `never` (docs/arch/CONTRACT.md).
|
|
|
|
|
|
|
2026-09-26 20:59:50 +00:00
|
|
|
|
import { useQueryClient } from "@tanstack/react-query";
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
|
|
|
|
|
|
|
|
import { type CardState, applyState, empty as emptyCard } from "@/features/kio-card/merge";
|
2026-09-26 20:59:50 +00:00
|
|
|
|
import { useSessionReport } from "@/shared/api/http";
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
import { observeChannel, type ChannelStatus } from "@/shared/api/ws";
|
|
|
|
|
|
import type {
|
|
|
|
|
|
SessionMode,
|
|
|
|
|
|
SessionReport,
|
|
|
|
|
|
TimerSnapshot,
|
|
|
|
|
|
TranscriptEntry,
|
|
|
|
|
|
} from "@/shared/types/generated";
|
|
|
|
|
|
|
|
|
|
|
|
export interface ObservedSession {
|
|
|
|
|
|
status: ChannelStatus;
|
|
|
|
|
|
title: string | null;
|
|
|
|
|
|
mode: SessionMode | undefined;
|
|
|
|
|
|
trainee: string | null;
|
|
|
|
|
|
card: CardState;
|
|
|
|
|
|
requiredFields: string[];
|
|
|
|
|
|
transcript: TranscriptEntry[];
|
|
|
|
|
|
timers: TimerSnapshot[];
|
|
|
|
|
|
hintsUsed: number;
|
|
|
|
|
|
notes: Map<string, string>;
|
|
|
|
|
|
ended: boolean;
|
2026-09-27 16:35:13 +03:00
|
|
|
|
paused: boolean;
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
report: SessionReport | null;
|
2026-09-17 21:38:43 +03:00
|
|
|
|
error: string | null;
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function useObserve(sessionId: string | null): ObservedSession {
|
|
|
|
|
|
const [status, setStatus] = useState<ChannelStatus>("connecting");
|
|
|
|
|
|
const [title, setTitle] = useState<string | null>(null);
|
|
|
|
|
|
const [mode, setMode] = useState<SessionMode | undefined>(undefined);
|
|
|
|
|
|
const [trainee, setTrainee] = useState<string | null>(null);
|
|
|
|
|
|
const [card, setCard] = useState<CardState>(emptyCard);
|
|
|
|
|
|
const [requiredFields, setRequiredFields] = useState<string[]>([]);
|
|
|
|
|
|
const [transcript, setTranscript] = useState<TranscriptEntry[]>([]);
|
|
|
|
|
|
const [timers, setTimers] = useState<TimerSnapshot[]>([]);
|
|
|
|
|
|
const [hintsUsed, setHintsUsed] = useState(0);
|
|
|
|
|
|
const [notes, setNotes] = useState<Map<string, string>>(new Map());
|
|
|
|
|
|
const [ended, setEnded] = useState(false);
|
2026-09-27 16:35:13 +03:00
|
|
|
|
const [paused, setPaused] = useState(false);
|
2026-09-26 20:59:50 +00:00
|
|
|
|
// Сессия, для которой отчёт уже стоит просить. Привязка к id, а не флаг:
|
|
|
|
|
|
// при переключении истории старый флаг не должен дёрнуть запрос новой сессии.
|
|
|
|
|
|
const [reportFor, setReportFor] = useState<string | null>(null);
|
|
|
|
|
|
// Ошибку отчёта наблюдение не показывает: пока оценки нет, это не ошибка.
|
|
|
|
|
|
const { report } = useSessionReport(sessionId, reportFor === sessionId);
|
|
|
|
|
|
const queries = useQueryClient();
|
2026-09-17 21:38:43 +03:00
|
|
|
|
const [error, setError] = useState<string | null>(null);
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
2026-09-26 18:12:27 +03:00
|
|
|
|
setStatus(sessionId ? "connecting" : "closed");
|
|
|
|
|
|
setTitle(null);
|
|
|
|
|
|
setMode(undefined);
|
|
|
|
|
|
setTrainee(null);
|
|
|
|
|
|
setCard({ server: { ...emptyCard.server }, pending: { ...emptyCard.pending } });
|
|
|
|
|
|
setRequiredFields([]);
|
|
|
|
|
|
setTranscript([]);
|
|
|
|
|
|
setTimers([]);
|
|
|
|
|
|
setHintsUsed(0);
|
|
|
|
|
|
setNotes(new Map());
|
|
|
|
|
|
setEnded(false);
|
2026-09-27 16:35:13 +03:00
|
|
|
|
setPaused(false);
|
2026-09-26 18:12:27 +03:00
|
|
|
|
setError(null);
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
if (!sessionId) return;
|
2026-09-26 18:12:27 +03:00
|
|
|
|
let active = true;
|
|
|
|
|
|
// Active monitors used to query this on every open. Almost all such requests
|
|
|
|
|
|
// could only return score_not_ready, competing with the snapshot under load.
|
|
|
|
|
|
// Ask for the report only after completion or when no live session exists
|
|
|
|
|
|
// (e.g. history opened after a backend restart).
|
2026-09-26 20:59:50 +00:00
|
|
|
|
const loadReport = () => setReportFor(sessionId);
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
const channel = observeChannel(sessionId, {
|
2026-09-26 18:12:27 +03:00
|
|
|
|
onStatus: (next) => { if (active) setStatus(next); },
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
onEvent: (event) => {
|
2026-09-26 18:12:27 +03:00
|
|
|
|
if (!active) return;
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
switch (event.type) {
|
|
|
|
|
|
case "session.snapshot":
|
|
|
|
|
|
setTitle(event.scenario_title);
|
|
|
|
|
|
setMode(event.mode);
|
|
|
|
|
|
setTrainee(event.trainee_name ?? null);
|
|
|
|
|
|
setCard((prev) => applyState(prev, event.kio as unknown as Record<string, unknown>));
|
|
|
|
|
|
setRequiredFields(event.required_fields ?? []);
|
|
|
|
|
|
setTranscript(event.transcript);
|
|
|
|
|
|
setTimers(event.timers);
|
|
|
|
|
|
setHintsUsed(event.hints_used ?? 0);
|
|
|
|
|
|
setEnded(event.ended ?? false);
|
2026-09-27 16:35:13 +03:00
|
|
|
|
setPaused(event.paused ?? false);
|
2026-09-26 18:12:27 +03:00
|
|
|
|
if (event.ended) loadReport();
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
break;
|
|
|
|
|
|
case "kio.state":
|
|
|
|
|
|
setCard((prev) => applyState(prev, event.kio as unknown as Record<string, unknown>));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "transcript.append":
|
|
|
|
|
|
setTranscript((prev) => [...prev, event.entry]);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "timer.tick":
|
|
|
|
|
|
setTimers(event.timers);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "mode.set":
|
|
|
|
|
|
setMode(event.mode);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "hint.shown":
|
|
|
|
|
|
setHintsUsed((count) => count + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "instructor_note.shown":
|
|
|
|
|
|
setNotes((prev) => new Map(prev).set(event.transcript_ref, event.text));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "session.ended":
|
|
|
|
|
|
setEnded(true);
|
2026-09-26 18:12:27 +03:00
|
|
|
|
loadReport();
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
break;
|
2026-09-27 16:35:13 +03:00
|
|
|
|
case "session.paused":
|
|
|
|
|
|
setPaused(event.paused);
|
|
|
|
|
|
break;
|
2026-09-17 21:38:43 +03:00
|
|
|
|
case "error":
|
|
|
|
|
|
setError(event.message);
|
2026-09-26 18:12:27 +03:00
|
|
|
|
if (event.code === "session_not_found") loadReport();
|
2026-09-17 21:38:43 +03:00
|
|
|
|
break;
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
case "score.ready":
|
2026-09-26 18:12:27 +03:00
|
|
|
|
loadReport();
|
2026-09-26 20:59:50 +00:00
|
|
|
|
// После session.ended hook мог исчерпать повторы 409 до готовности оценки.
|
|
|
|
|
|
void queries.invalidateQueries({ queryKey: ["session-report", sessionId] });
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
}).connect();
|
2026-09-26 18:12:27 +03:00
|
|
|
|
return () => { active = false; channel.close(); };
|
2026-09-26 20:59:50 +00:00
|
|
|
|
}, [sessionId, queries]);
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
|
2026-09-27 16:35:13 +03:00
|
|
|
|
return { status, title, mode, trainee, card, requiredFields, transcript, timers, hintsUsed, notes, ended, paused, report, error };
|
lct-16 и половина lct-19: разбор, отчёт, внешний монитор, эталон
Эталонный диалог собирается кодом из фактов и чек-листа: написанный
руками, он разошёлся бы с фактами при первой же правке сценария,
и курсанта оштрафовали бы за правильный ответ.
Отчёт: метрики фактом против норматива со ссылкой, отметка E1 на каждый
недобытый факт с эталонным вопросом, расхождение самооценки — что
курсант заметил сам, чего не заметил, что отметил зря. Не заметил —
самое ценное для разбора.
Внешний монитор — не отдельное приложение, а другой режим отрисовки тех
же событий: крупный таймер опроса, ход разговора, карточка, после оценки
разбор на весь экран.
Коррекция преподавателем сохраняет автооценку рядом: видно, что
скорректировано и кем.
Найдено: все метрики весили одинаково, и курсант, не задавший ни одного
вопроса, но заполнивший карточку руками, получал 87 из 100. Предварительные
веса (полнота опроса — 4) дают 74; окончательные утверждает методист,
вопрос записан в DEBRIEF.md.
2026-09-17 21:32:12 +03:00
|
|
|
|
}
|