{{ objectName || 'Объект' }}
{{ obj.name }}
+ Новый объект
Потребление токенов {{ globalUsage.scanned_files }} файлов за {{ globalUsage.scan_duration_ms }}мс
Сессия
{{ Math.round(globalUsage.session_5h_percent || 0) }}%
Все
{{ Math.round(globalUsage.weekly_all_percent || 0) }}%
Sonnet
{{ Math.round(sonnetPercent) }}%
Текущая сессия (5ч окно)
Output: {{ formatTokens(globalUsage.session_5h_output_tokens) }} Input: {{ formatTokens(globalUsage.session_5h_input_tokens) }}
Cache read: {{ formatTokens(globalUsage.session_5h_cache_read_tokens) }} Cache create: {{ formatTokens(globalUsage.session_5h_cache_create_tokens) }}
{{ formatTokens(globalUsage.session_5h_total_tokens) }} / {{ formatTokens(globalUsage.session_5h_limit) }} Сброс через {{ globalUsage.session_5h_resets_in_text || '—' }}
Еженедельные лимиты
Все модели: {{ formatTokens(globalUsage.weekly_all_total_tokens) }} / {{ formatTokens(globalUsage.weekly_all_limit) }} Сброс: {{ globalUsage.weekly_resets_at }}
{{ wsConnected ? 'WS' : 'WS' }}

Разделы проекта

{{ code }} {{ disciplineLabel(code) }} {{ items.length }} {{ sectionFindingsCount(code) }} замечаний

{{ sidebarFilterSection }} {{ disciplineLabel(sidebarFilterSection) }} ({{ filteredSectionProjects.length }})

{{ group.name }} {{ group.projects.length }}

{{ p.name }}

{{ versionBadgeFor(p).text }} !
{{ batchProgressText(p.project_id) }}
{{ count }} = {{ p.findings_count }}
·
{{ count }} = {{ p.optimization_count }}
·
Выбрано: {{ selectedCount }}
Выбрано: {{ selectedCount }}
{{ batchActionLabel(batchQueue.action) }} {{ (batchQueue.completed || 0) + (batchQueue.failed || 0) }} / {{ batchQueue.total }}
Текущий: {{ batchQueue.current_project }}
{{ i + 1 }} {{ item.project_id }}

Очередь

🧾 Подготовка данных (Gemma enrichment)

⚠ Сервер был перезапущен — подготовка данных прервана. Незавершённые проекты можно снова поставить в очередь.
{{ prepareQueue.paused ? 'Подготовка на паузе' : 'Подготовка' }} · Блоки {{ prepareQueue.blocks_done_all || 0 }} / {{ prepareQueue.blocks_total_all || '?' }} (осталось {{ Math.max(0, prepareQueue.blocks_total_all - prepareQueue.blocks_done_all) }}) · Проекты {{ prepareQueue.completed + prepareQueue.failed }} / {{ prepareQueue.total }} · {{ prepareQueue.blocks_failed_all }} fail · ⚠ {{ prepareQueue.blocks_truncated_all }} обрезано {{ prepareQueue.current_project.length > 40 ? '...' + prepareQueue.current_project.slice(-37) : prepareQueue.current_project }}
{{ (prepareQueue.completed || 0) + (prepareQueue.failed || 0) }} / {{ prepareQueue.total }}
{{ idx + 1 }} {{ item.project_id }}
Суммарно по проектам: {{ formatEta(prepareQueue.total_elapsed_sec) }}
⚠ Сервер был перезапущен — очередь прервана. Прерванные и ожидавшие проекты показаны ниже.
{{ batchActionLabel(batchQueue.action) }} {{ (batchQueue.completed || 0) + (batchQueue.failed || 0) }} / {{ batchQueue.total }}
{{ batchActionLabel(batchQueue.action) }} — завершено {{ batchQueue.completed || 0 }} ✓   {{ batchQueue.failed || 0 }} ✗   / {{ batchQueue.total }}

Очередь пуста. Выберите проекты и добавьте их в очередь.

{{ idx + 1 }} {{ item.project_id }} {{ batchActionLabel(item.action) }}

Добавить проекты

{{ queueAddSelected.has(p.project_id) ? '\u2713' : '' }} {{ p.name || p.project_id }} {{ p.section }}
Все проекты уже в очереди
GEMMA
Gemma OCR
01
Текст
↓{{ stageTokensFormatted('text_analysis').inp }} ↑{{ stageTokensFormatted('text_analysis').out }}
{{ stageModel('text_analysis') }}
02
Блоки
↓{{ stageTokensFormatted('blocks_analysis').inp }} ↑{{ stageTokensFormatted('blocks_analysis').out }}
{{ stageModel('blocks_analysis') }}
03
Свод
↓{{ stageTokensFormatted('findings').inp }} ↑{{ stageTokensFormatted('findings').out }}
{{ stageModel('findings') }}
CF
Crit/Fix
C: ↓{{ stageTokensFormatted('findings_critic').inp }} F: ↓{{ stageTokensFormatted('findings_corrector').inp }}
04
Нормы
↓{{ stageTokensFormatted('norms_verified').inp }} ↑{{ stageTokensFormatted('norms_verified').out }}
{{ stageModel('norms_verified') }}
OPT
Оптим.
↓{{ stageTokensFormatted('optimization').inp }} ↑{{ stageTokensFormatted('optimization').out }}
{{ stageModel('optimization') }}
CF
Crit/Fix
C: ↓{{ stageTokensFormatted('optimization_critic').inp }} F: ↓{{ stageTokensFormatted('optimization_corrector').inp }}
Аудит {{ activeVersionEntry?.label || activeVersionId }} временно недоступен на текущем legacy runner. Версия и файлы сохранены. Можно запустить контроль ранее согласованных замечаний из предыдущей версии, а полноценный аудит V2 будет доступен после переключения production на version-aware backend.
{{ currentSectionProjectsList.findIndex(p => p.project_id === currentProjectId) + 1 }} / {{ currentSectionProjectsList.length }}
↓{{ formatTokens(currentProjectUsage.total_input_tokens) }} ↑{{ formatTokens(currentProjectUsage.total_output_tokens) }} · Платно {{ formatCost(usagePaidCost(currentProjectUsage)) }} · Бесплатно ${{ usageFreeCost(currentProjectUsage).toFixed(2) }} · {{ currentProjectUsage.total_calls }} calls · {{ pipelineTotalDuration }}
{{ stageLabel(currentProjectLive.stage) }} Выполняется...
ETA: {{ formatETA(getHeartbeatInfo(currentProject.project_id).eta_sec) }}
{{ formatElapsed(currentProjectLive.started_at) }}
Не все блоки скачались. Обновите OCR-результат и перезапустите кроп.
{{ resumeInfo.stage_label }} ({{ resumeInfo.detail }})
Версия {{ activeVersionEntry.label }} создана, но исходные файлы ещё не загружены.
Запустить аудит можно только после загрузки PDF (опционально + Markdown).
Загрузка...
{{ versionUploadError }}

Версии проекта

Версия Статус Дата создания Файлы Готовность Комментарий
{{ v.label }} текущая {{ v.status }} {{ (v.created_at || '').slice(0, 10) }} PDF: {{ v.pdf_count }}, MD: {{ v.md_count }} — нет файлов — можно запускать нужна загрузка {{ (v.comment || '').slice(0, 40) }}{{ v.comment && v.comment.length > 40 ? '…' : '' }} активна

Контроль замечаний из предыдущей версии

Контроль ранее согласованных замечаний ещё не выполнялся.
{{ migratedFindingsSummary.total }} всего {{ migratedFindingsSummary.stillRelevant }} актуальны {{ migratedFindingsSummary.duplicate }} уже в V2 {{ migratedFindingsSummary.resolved }} устранены {{ migratedFindingsSummary.notVerifiable }} требуют проверки {{ migratedFindingsSummary.sourceMissing }} источник отсутствует Источник: {{ migratedFindingsSummary.sourceVersionId || '—' }} · {{ (migratedFindingsSummary.checkedAt || '').slice(0, 10) }}
{{ migratedFindingsError }}
Исходное замечание Статус Связанное замечание V2 Причина Действие
{{ item.origin_finding_id || '—' }} {{ item.origin_version_id || '' }}
{{ item.origin_title }}
{{ migratedStatusLabel(item.migration_status) }} {{ (item.note || item.reason || '').slice(0, 80) }} Проверить вручную
В текущей версии ещё нет результатов аудита. Сначала выполните полный аудит V2, затем перезапустите контроль, чтобы still_relevant попали в список замечаний.
Замечания
{{ count }} = {{ currentProject.findings_count }}
Оптимизация
{{ count }} = {{ currentProject.optimization_count }}
Статус конвейера
{{ s.label }} {{ formatDurationSec(s.duration_sec) }} {{ s.message }} {{ s.error }}
{{ retryDialog.mode === 'resume' ? 'Запустить с этапа' : 'Перезапуск этапа' }}
{{ retryDialog.stageLabel }}
Этот и все последующие этапы будут выполнены
Critic v2: загрузка… Critic v2: нет данных
{{ sevIcon(sev) }} {{ count }} Всего: {{ findingsData.total }}
ID Критичность Лист Замечание Норма Critic v2 эксп. {{ cv2SortDir === 'desc' ? '▼' : (cv2SortDir === 'asc' ? '▲' : '') }} Рекомендация Решение Причина
{{ findingsPage }} / {{ findingsTotalPages }} ({{ sortedFindings.length }})
Замечания не найдены. Аудит ещё не проводился.
Загрузка...
{{ count }} Всего: {{ optimizationData.total }}
ID Тип Текущее решение Предложение Экономия Риски Норма Решение Причина
{{ optimizationPage }} / {{ optimizationTotalPages }} ({{ sortedOptimization.length }})
Нет предложений для выбранного фильтра.
Анализ оптимизации ещё не проводился. Нажмите «Запустить анализ».

База знаний

Ожидают: {{ missingNormsStats.pending }}  |  Добавлены: {{ missingNormsStats.added }}  |  Не нужны: {{ missingNormsStats.dismissed }}
Загрузка...
{{ missingNormsFilter === 'pending' ? 'Все нормы есть в vault — отлично!' : 'Нет записей' }}
Норма Тип Проектов Замечаний Проекты Впервые Действие
{{ norm.doc_number }}
✓ добавлена {{ (norm.added_to_vault_at || '').slice(0,10) }}
{{ norm.family || '—' }} {{ norm.project_count }} {{ norm.finding_count }} {{ occ.project_id }}, {{ (norm.first_seen_at || '').slice(0,10) }}
Загрузка...
ID Тип Проект Дисц. Критичн. Суть Причина решения Дата Заказчик Снять
{{ entry.item_id }}
{{ entry.id }}
{{ entry.item_type === 'finding' ? 'Замеч.' : 'Оптим.' }} {{ entry.source_project }} {{ entry.section }} {{ entry.severity }} {{ entry.summary }} {{ (entry.expert_date || '').slice(0, 10) }}
Нет записей для выбранной вкладки.

Обнаруженные паттерны

{{ p.pattern_id }} {{ p.frequency }} повторений {{ p.status }}
{{ p.description }}
Предложение: {{ p.suggested_fix }}
Файл: {{ p.target_file }}
Нажмите «Найти паттерны» для анализа отклонённых решений.

🧾 LM Studio (удалённое управление)

Управление LM Studio через ngrok+Basic Auth (WSS). Используется для Gemma enrichment (этап «Подготовить данные»).

ping {{ lmsHealth.health.latency_ms }} ms {{ lmsHealth.health.model }} Проверено {{ formatEta(Math.floor((Date.now() - lmsHealthCheckedAt) / 1000)) }} назад
Активных запросов: {{ lmsHealth.inflight.prepare_running }} идёт, {{ lmsHealth.inflight.prepare_pending }} ожидают
Ошибка: {{ lmsHealth.health.error }}

Загружено сейчас

Нет загруженных моделей.
Identifier Тип Context length
{{ m.identifier }} {{ m.type }} {{ m.context_length.toLocaleString() }}

Скачанные модели ({{ lmsAll ? lmsAll.length : 0 }})

Список пуст.
ID Тип Quant Max ctx Загр. ctx State Загрузка с context
{{ m.id }} {{ m.type }} {{ m.quantization }} {{ m.max_context_length ? m.max_context_length.toLocaleString() : '—' }} {{ m.loaded_context_length.toLocaleString() }} loaded {{ m.state }}

Пресеты context

Применит к выбранным моделям в форме выше
{{ lmsMessage.kind === 'error' ? '✗' : '✓' }} {{ lmsMessage.text }}
Не все блоки скачались: {{ blockCropErrors }} из {{ blockTotalExpected }} — ошибка загрузки (HTTP 404). Обновите OCR-результат в Chandra и перезапустите кроп.
{{ block.block_id }} {{ block.ocr_label }}
{{ blockFindingsCount(block.block_id) }}

Блоки не найдены. Запустите аудит для кропинга image-блоков.

{{ currentBlockIndex + 1 }} / {{ currentBlocksList.length }}

{{ selectedBlock.block_id }} стр. {{ selectedBlock.page }} ● {{ currentBlockHighlights.length }} подсветок

~{{ formatTokens(discussionContextTokens.total_tokens) }} tok {{ formatCostUSD(discussionCost) }}
ID Критичность Лист Замечание Норма Рекомендация
{{ activeDiscussionItem.id || activeDiscussionItem.item_id }} {{ activeDiscussionItem.severity || activeDiscussionItem.type || '' }}
{{ activeDiscussionItem.sheet || '' }}
стр. PDF {{ Array.isArray(activeDiscussionItem.page) ? activeDiscussionItem.page.join(', ') : activeDiscussionItem.page }}
{{ activeDiscussionItem.problem || activeDiscussionItem.finding || activeDiscussionItem.description || activeDiscussionItem.current || '' }} {{ activeDiscussionItem.norm || activeDiscussionItem.norm_reference || '' }} {{ activeDiscussionItem.solution || activeDiscussionItem.recommendation || activeDiscussionItem.proposed || '' }}
{{ b.block_id }}
{{ sevIcon(sev) }} {{ count }} Всего: {{ activeDiscussionItems.length }}
ID Критичность Лист Замечание Норма Рекомендация Решение
{{ optTypeLabel(type) }} {{ count }} Всего: {{ activeDiscussionItems.length }}
ID Тип Текущее решение Предложение Экономия Риски Норма
{{ discussionPage }} / {{ discussionTotalPages }} ({{ activeDiscussionItems.length }})

Отменённые ({{ rejectedDiscussionItems.length }})

{{ item.item_id }} {{ item.problem }}
Нет данных. Сначала выполните аудит проекта.
Загрузка...

Предложенные изменения:

{{ revisionData.explanation }}

ПолеБылоСтало
Прикреплённое фото

Документ — {{ currentProject?.name || documentProjectId }}

{{ documentPages.findIndex(p => p.page_num === documentCurrentPage) + 1 }} / {{ documentPages.length }}
Загрузка документа...
{{ documentPageData.sheet_info }} {{ documentPageData.sheet_label }}
На этой странице нет блоков.
MD-файл не найден для этого проекта.
{{ currentDiscipline.short_name || 'Система' }}
{{ d.short_name }} {{ d.name }}
Загрузка промптов...
{{ p.label }} {{ p.char_count.toLocaleString() }}
{{ (templates[activePromptTab]._editContent || '').length.toLocaleString() }} символов
{{ logEntries.length }} записей
Модель ищет замечания... Критик проверяет обоснованность... Корректор исправляет... Размышление завершено
Загрузка истории логов...
Лог пуст. Запустите аудит для получения событий.
Выполняется... ETA: {{ formatETA(getHeartbeatInfo(logProjectId).eta_sec) }}
EXPERIMENTAL — critic_v2 offline. Production pipeline и legacy critic не заменены. 03_findings_review.json не изменён. Эта вкладка читает offline-артефакт critic_v2_triage_ui.json.

Critic v2 — UI Triage Preview

Загрузите файл critic_v2_triage_ui.json, сгенерированный скриптом backend/scripts/replay_critic_v2_triage_policy.py --ui-export.

{{ cv2LoadError }}

Импорт feedback экспертa

Загрузите ранее сохранённый *_feedback.json (или нажмите «Обновить список», чтобы выбрать из critic v2 test/). После импорта замечания, помеченные экспертом как preferred_tab=suggested_reject, появятся во вкладке «Критик рекомендует отклонить».

{{ cv2ImportMessage }}

Диагностика очередей (raw = тaб из artifact, effective = с учётом expert preferred_tab):
raw_total={{ cv2DebugCounts.raw_total }} · normalized_total={{ cv2DebugCounts.normalized_total }} · feedback_loaded={{ cv2DebugCounts.feedback_entries_loaded }} · expert_overrides={{ cv2DebugCounts.expert_overrides_total }}
by_critic_tab: pri={{ cv2DebugCounts.by_critic_tab.primary }} / ctx={{ cv2DebugCounts.by_critic_tab.needs_context }} / sr={{ cv2DebugCounts.by_critic_tab.suggested_reject }} / hid={{ cv2DebugCounts.by_critic_tab.hidden_by_critic }}
by_effective_tab: pri={{ cv2DebugCounts.by_effective_tab.primary }} / ctx={{ cv2DebugCounts.by_effective_tab.needs_context }} / sr={{ cv2DebugCounts.by_effective_tab.suggested_reject }} / hid={{ cv2DebugCounts.by_effective_tab.hidden_by_critic }}
by_expert_preferred: pri={{ cv2DebugCounts.by_expert_preferred.primary }} / ctx={{ cv2DebugCounts.by_expert_preferred.needs_context }} / sr={{ cv2DebugCounts.by_expert_preferred.suggested_reject }} / hid={{ cv2DebugCounts.by_expert_preferred.hidden_by_critic }}

Сводка

Всего{{ cv2Export.summary.total }}
Основная{{ cv2Export.summary.primary_count }}
Свернуто{{ (cv2Export.summary.needs_context_count || 0) + (cv2Export.summary.suggested_reject_count || 0) + (cv2Export.summary.hidden_by_critic_count || 0) }}
Сокращение очереди{{ cv2Export.summary.primary_queue_reduction_percent }}%
не скрыты из принятых {{ (cv2Export.summary.accepted_not_hidden_recall * 100).toFixed(1) }}%
Профиль{{ cv2Export.summary.profile }}

Сверка с экспертом

Всего с решением эксперта {{ cv2AlignmentSummary.with_decision }}
Совпало {{ cv2AlignmentSummary.aligned }}
Расхождения {{ cv2AlignmentSummary.disagreements }}
Принято, но свёрнуто {{ cv2AlignmentSummary.accepted_collapsed }}
Принято, но в контекст {{ cv2AlignmentSummary.accepted_needs_context }}
Отклонено, но в основной {{ cv2AlignmentSummary.rejected_visible }}
Отклонено, но в контекст {{ cv2AlignmentSummary.rejected_needs_context }}
Отклонено и свёрнуто {{ cv2AlignmentSummary.aligned_hidden }}
Принято, но скрыто {{ cv2AlignmentSummary.hidden_human_accepted }}
Без решения эксперта {{ cv2AlignmentSummary.without_decision }}

Дополнительная ручная корректировка

Используйте только если хотите исправить раскладку critic v2. Основная сверка уже выполнена по expert_review.
Оценено{{ cv2FeedbackSummary.evaluated }}
раскладка верна{{ cv2FeedbackSummary.yes }}
раскладка неверна{{ cv2FeedbackSummary.no }}
не уверен{{ cv2FeedbackSummary.unsure }}
Auto-load: подтягивается с сервера при открытии проекта. Ручной импорт — через блок «Импорт feedback» выше. Изменения через quick-route — только в браузере, экспорт выгружает их в JSON.

Фильтры

{{ tab.title }} замечаний: {{ tab.count }} по умолчанию открыта: {{ tab.default_open ? 'да' : 'нет' }} очереди: {{ tab.queues.map(q => cv2Label('queue', q)).join(', ') }}
Замечание не удалено. Оно только вынесено из основной очереди.
Нет замечаний по фильтрам.
⚠ {{ cv2AssistedStatusByFid[item.finding_id].expert_correction_label }}
{{ item.finding_id }} {{ item.section }} {{ cv2Label('queue', item.queue) }} evidence: {{ cv2Label('evidence', item.evidence_quality) }} балл: {{ item.score }} эксперт: {{ cv2Label('human', item.human_decision) }} можно вернуть {{ cv2Label('alignment', cv2AlignmentOf(item)) }}
{{ item.title }}
{{ item.description }}
Рекомендация: {{ item.recommendation }}
почему: {{ cv2Label('reason', item.reason) }} уверенность: {{ item.confidence }} источник: {{ cv2Label('source', item.source_dependency) }} таксономия: {{ cv2Label('taxonomy', item.taxonomy_reason) }} риск: {{ cv2Label('risk', item.risk_level) }}
{{ cv2HumanizeExplanation(item.explanation) }}
Решение эксперта: {{ cv2Label('human', item.human_decision) }}
Комментарий эксперта: {{ item.human_reason }}
Оценка critic v2: {{ cv2Label('tab', item.tab) }} ({{ cv2Label('queue', item.queue) }})
Статус сверки: {{ cv2Label('alignment', cv2AlignmentOf(item)) }}
Оценка раскладки
Опционально. Используйте, если автоматическая сверка не отражает ситуацию.
EXPERIMENTAL — Critic v2 — Расхождения с экспертом. Замечания не удалены, это только раскладка по очередям. Production pipeline и legacy critic не заменены. Legacy critic остаётся основным. LLM не запускается. 03_findings_review.json не изменён.
Расхождений с экспертом не найдено. Можно открыть все замечания проекта.

Загрузка project-scoped Critic v2 export…

Critic v2 — данных нет

{{ cv2ProjLoadError }}

Сформировать UI export можно командой: {{ cv2ProjHint }}

Feedback экспертa

Auto-loaded: {{ cv2AutoLoadedFeedbackFile }} — {{ cv2AutoLoadedFeedbackMeta.entries }} entries, {{ cv2AutoLoadedFeedbackMeta.suggested_reject_count }} preferred_tab=suggested_reject, match={{ cv2AutoLoadedFeedbackMeta.match_quality }}

{{ cv2AutoLoadMessage }}

{{ cv2AutoLoadMessage }}

Диагностика очередей (raw = тaб из artifact, effective = с учётом expert preferred_tab):
raw_total={{ cv2DebugCounts.raw_total }} · normalized_total={{ cv2DebugCounts.normalized_total }} · feedback_loaded={{ cv2DebugCounts.feedback_entries_loaded }} · expert_overrides={{ cv2DebugCounts.expert_overrides_total }}
by_critic_tab: pri={{ cv2DebugCounts.by_critic_tab.primary }} / ctx={{ cv2DebugCounts.by_critic_tab.needs_context }} / sr={{ cv2DebugCounts.by_critic_tab.suggested_reject }} / hid={{ cv2DebugCounts.by_critic_tab.hidden_by_critic }}
by_effective_tab: pri={{ cv2DebugCounts.by_effective_tab.primary }} / ctx={{ cv2DebugCounts.by_effective_tab.needs_context }} / sr={{ cv2DebugCounts.by_effective_tab.suggested_reject }} / hid={{ cv2DebugCounts.by_effective_tab.hidden_by_critic }}
by_expert_preferred: pri={{ cv2DebugCounts.by_expert_preferred.primary }} / ctx={{ cv2DebugCounts.by_expert_preferred.needs_context }} / sr={{ cv2DebugCounts.by_expert_preferred.suggested_reject }} / hid={{ cv2DebugCounts.by_expert_preferred.hidden_by_critic }}

Проверочные карточки assisted_round1

({{ cv2AssistedReport.items_for_project }} по этому проекту из {{ cv2AssistedReport.items_total_all_projects }} всего; risky={{ cv2AssistedReport.by_group.risky_accepted_22 }}, sample={{ cv2AssistedReport.by_group.sample_60 }})
found_in_artifact={{ cv2AssistedReport.found_in_artifact }} · missing_in_artifact={{ cv2AssistedReport.missing_in_artifact }} · в suggested_reject={{ cv2AssistedReport.in_suggested_reject }} · не в очереди={{ cv2AssistedReport.not_in_suggested_reject }} (pri={{ cv2AssistedReport.in_other_tab.primary }} / ctx={{ cv2AssistedReport.in_other_tab.needs_context }} / hid={{ cv2AssistedReport.in_other_tab.hidden_by_critic }})
finding_id group причина назначение critic expert сейчас статус
{{ row.finding_id }} {{ row.group === 'risky_accepted_22' ? 'risky' : 'sample' }} {{ row.reason_group || '—' }} {{ row.assignment_tab || '—' }} {{ row.critic_tab || '—' }} {{ row.expert_preferred_tab || '—' }} {{ row.effective_tab || '—' }} {{ row.status_label }} {{ row.status_label }} {{ row.status_label }}
assisted_round1 review-package: для этого проекта нет проверочных карточек. Всего в review-package: {{ cv2AssistedAllTotal }} карточек, на этот проект не попало ни одной.

Сводка по проекту

Проект: {{ cv2Export.scope.project_name || cv2Export.scope.project_id }} matched_by: {{ cv2Export.scope.matched_by || '—' }}
{{ cv2Export.warning }}
Всего{{ cv2Export.summary.total }}
Основная{{ cv2Export.summary.primary_count }}
Смежники{{ cv2Export.summary.needs_context_count }}
К отклонению{{ cv2Export.summary.suggested_reject_count }}
Скрыто{{ cv2Export.summary.hidden_by_critic_count }}
Сокращение очереди{{ cv2Export.summary.primary_queue_reduction_percent }}%
Профиль{{ cv2Export.summary.profile }}

Сверка с экспертом

Всего с решением эксперта {{ cv2AlignmentSummary.with_decision }}
Совпало{{ cv2AlignmentSummary.aligned }}
Расхождения{{ cv2AlignmentSummary.disagreements }}
Принято, но свёрнуто{{ cv2AlignmentSummary.accepted_collapsed }}
Принято, но в контекст{{ cv2AlignmentSummary.accepted_needs_context }}
Отклонено, но в основной{{ cv2AlignmentSummary.rejected_visible }}
Отклонено, но в контекст{{ cv2AlignmentSummary.rejected_needs_context }}
Отклонено и свёрнуто{{ cv2AlignmentSummary.aligned_hidden }}
Принято, но скрыто{{ cv2AlignmentSummary.hidden_human_accepted }}
Без решения эксперта{{ cv2AlignmentSummary.without_decision }}

Дополнительная ручная корректировка

Используйте только если хотите исправить раскладку critic v2. Основная сверка уже выполнена по expert_review.
Оценено{{ cv2FeedbackSummary.evaluated }}
раскладка верна{{ cv2FeedbackSummary.yes }}
раскладка неверна{{ cv2FeedbackSummary.no }}
не уверен{{ cv2FeedbackSummary.unsure }}
Auto-load: подтягивается с сервера при открытии проекта. Ручной импорт — через блок «Импорт feedback» выше. Изменения через quick-route — только в браузере, экспорт выгружает их в JSON.
{{ tab.title }} замечаний: {{ tab.count }} по умолчанию открыта: {{ tab.default_open ? 'да' : 'нет' }} очереди: {{ tab.queues.map(q => cv2Label('queue', q)).join(', ') }}
Замечание не удалено. Оно только вынесено из основной очереди.
Нет замечаний в этой очереди.
⚠ {{ cv2AssistedStatusByFid[item.finding_id].expert_correction_label }}
{{ item.finding_id }} {{ item.section }} {{ cv2Label('queue', item.queue) }} evidence: {{ cv2Label('evidence', item.evidence_quality) }} балл: {{ item.score }} эксперт: {{ cv2Label('human', item.human_decision) }} можно вернуть {{ cv2Label('alignment', cv2AlignmentOf(item)) }}
{{ item.title }}
{{ item.description }}
Рекомендация: {{ item.recommendation }}
почему: {{ cv2Label('reason', item.reason) }} уверенность: {{ item.confidence }} источник: {{ cv2Label('source', item.source_dependency) }} таксономия: {{ cv2Label('taxonomy', item.taxonomy_reason) }} риск: {{ cv2Label('risk', item.risk_level) }}
{{ cv2HumanizeExplanation(item.explanation) }}
Решение эксперта: {{ cv2Label('human', item.human_decision) }}
Комментарий эксперта: {{ item.human_reason }}
Оценка critic v2: {{ cv2Label('tab', item.tab) }} ({{ cv2Label('queue', item.queue) }})
Статус сверки: {{ cv2Label('alignment', cv2AlignmentOf(item)) }}
Оценка раскладки
Опционально. Используйте, если автоматическая сверка не отражает ситуацию.
{{ extRegError }}
{{ extRegCoverage.matched }} / {{ extRegCoverage.total }} принято ⚠️ {{ extRegCoverage.needs_review }} на проверку {{ extRegCoverage.unmatched }} не принято
# Раздел Лист/Раздел Категория Проблема Ответ заказчика Наш finding Статус
{{ idx + 1 }} {{ e.section_code || '—' }} {{ e.sheet_ref }} {{ e.cat_su10 }} {{ e.problem }} {{ e.customer_response }} {{ e.match_status }}

Реестр пока пуст. Нажмите «Импортировать реестр», чтобы загрузить markdown СУ-10.

{{ scObjectsError }}
Объектов не найдено. Положите папки stage_1/stage_2 внутрь {{ r }} и нажмите ⟳.
Источник: {{ scObjectsRoots.join(', ') }}
Подгружаю сохранённое сопоставление…
{{ scError }}
{{ scSavedConfigMsg }}
Подгружено сохранённое сопоставление от {{ scAutoLoadInfo.created_at }}: {{ scAutoLoadInfo.pairs_matched }}/{{ scAutoLoadInfo.pairs_total }} пар сопоставлено. {{ scAutoLoadInfo.session_id }}
⚠️ {{ w }}
★ Каноничная конфигурация открыта обновлена {{ scCanonicalConfig.updated_at }} · пар: {{ (scCanonicalConfig.pairs || []).length }} ⚠ Конфигурация изменилась — результаты анализа могут быть устаревшими {{ scCanonicalConfig.canonical_session_id }}
Каноничная конфигурация ещё не сохранена. После сопоставления пар нажмите «★ Сохранить как каноничную».
История сессий (debug) ({{ scSessions.length }}) — для отладки/восстановления, обычному пользователю не нужна
{{ s.id }} {{ s.created_at }} {{ s.pairs_matched }}/{{ s.pairs_total }} пар
Сессия {{ scSession.id }} · пар: {{ scPairs.length }} сопоставлено: {{ scPairsCounts.matched }}, возможно: {{ scPairsCounts.maybe }}, не найдено: {{ scPairsCounts.unmatched }} {{ scConfirmAllError }}
Подготовка графики (Qwen) image/imagine-блоки описываются локальной VLM, последовательно по парам. Внешние API не используются.
{{ scRecogError }}
Распознавание было прервано. {{ scRecogJob.error || 'Backend перезапустился во время выполнения, воркер был потерян.' }} Готовые стороны сохранены в кеше — нажмите «▶ Продолжить (пропустить готовые)», чтобы дописать остальные.
всего пар: {{ scRecogJob.aggregate.total_pairs }}
готово: {{ scRecogJob.aggregate.done_pairs }}
готово (salvage): {{ scRecogJob.aggregate.done_with_salvage_pairs }}
частично: {{ scRecogJob.aggregate.partial_pairs }}
ошибок: {{ scRecogJob.aggregate.error_pairs }}
ещё не запускалось: {{ scRecogJob.aggregate.not_run_pairs }}
cache hits: {{ scRecogJob.aggregate.cache_hits }}
elapsed: {{ scRecogElapsedLabel() }}
image/imagine-блоки {{ scRecogJob.aggregate.done_image_blocks }} / {{ scRecogJob.aggregate.total_image_blocks }} · failed {{ scRecogJob.aggregate.failed_image_blocks }}
Идёт обработка пара {{ scRecogPairProgress().current }} / {{ scRecogPairProgress().total }} ETA ≈ {{ scFormatDuration(scRecogJob.aggregate.eta_sec) }}
{{ scRecogJob.aggregate.current_pair_label || scRecogJob.aggregate.current_pair_id }} · сторона: {{ scRecogJob.aggregate.current_side }} · стр. {{ scRecogJob.aggregate.current_page }} · {{ scRecogJob.aggregate.current_status_message }}
блок {{ scRecogJob.aggregate.current_block_index }} / {{ scRecogJob.aggregate.current_total_blocks }}
подсчитываю блоки текущей пары…
Проблемные пары:
Последний прогон: {{ scRecogJob.id }} · status: {{ scRecogJob.status }} · создан: {{ scRecogJob.created_at }}
Сравнение было прервано. {{ scOpusJob.error || 'Backend перезапустился во время выполнения, воркер был потерян.' }} Готовые пары сохранены — нажмите «▶ Продолжить (пропустить готовые)», чтобы доделать остальные.
Сначала дождитесь завершения распознавания графики.
Не готово к сравнению: {{ scOpusPreflight.skip_not_ready }} пар без enriched MD. Будут пропущены.
Слишком большие пары: {{ scOpusPreflight.skip_too_large }}. Превышают лимит enriched MD; будут пропущены. Рассмотрите section split или compact compare.
Текущая сессия не каноничная. Если вы меняли связи блоков / порядок / disabled — сохраните как каноничную, иначе результат может быть устаревшим.
{{ scOpusError }}
всего пар: {{ scOpusPreflight.total_pairs }}
будет запущено: {{ scOpusPreflight.will_run }}
уже готово: {{ scOpusPreflight.skip_done }}
не готовы: {{ scOpusPreflight.skip_not_ready }}
too_large: {{ scOpusPreflight.skip_too_large }}
всего пар: {{ scOpusJob.aggregate.total_pairs }}
готово: {{ scOpusJob.aggregate.done }}
обрабатывается: {{ scOpusJob.aggregate.running }}
в очереди: {{ scOpusJob.aggregate.queued }}
ошибок: {{ scOpusJob.aggregate.failed }}
пропущено: {{ scOpusJob.aggregate.skipped }} (too_large: {{ scOpusJob.aggregate.skipped_too_large }}, not_ready: {{ scOpusJob.aggregate.skipped_not_ready }})
расхождений: {{ scOpusJob.aggregate.total_changes }}
elapsed: {{ scOpusElapsedLabel() }}
ETA: {{ scFormatDuration(scOpusJob.aggregate.eta_sec) }}
Идёт сравнение пара {{ scOpusJob.aggregate.current_pair_index }} / {{ scOpusJob.aggregate.total_pairs }} status: {{ scOpusJob.aggregate.current_pair_status }}
{{ scOpusCurrentPairLabel() }}
Последний прогон: {{ scOpusJob.id }} · status: {{ scOpusJob.status }} · создан: {{ scOpusJob.created_at }}
Статус PDF слева PDF справа MD L MD R result.json L result.json R Графика Похожесть
⋮⋮ {{ idx + 1 }} {{ scStatusLabel(p.status) }} {{ p.left ? p.left.filename : '—' }} {{ p.right ? p.right.filename : '— нажмите чтобы назначить —' }}
— отвязать —
текущий → {{ opt.filename }}
нет несопоставленных файлов
{{ scInlineMatchError }}
{{ p.left && p.left.has_md ? '✓' : '—' }} {{ p.right && p.right.has_md ? '✓' : '—' }} {{ p.left && p.left.has_result_json ? '✓' : '—' }} {{ p.right && p.right.has_result_json ? '✓' : '—' }} {{ scRecogPairBadge(p.id).label }} {{ p.match_score ? (p.match_score*100).toFixed(0) + '%' : '—' }}
Сохраняю новый порядок…
{{ scPairOrderError }}
Режим: концептуальное сравнение без связей блоков Сравнивается весь документ целиком. Связи блоков не используются.
Режим: со связями блоков Сравнивается весь документ целиком. Связанные блоки используются как ориентиры с повышенным вниманием, но изменения ищутся и вне них.
Масштаб: {{ Math.round(scZoom*100) }}% ⌨ Ctrl+колесо · 🖐 ЛКМ
Slots: {{ scAlignmentItems.length }} · Связей: {{ scPairData && scPairData.links ? scPairData.links.length : 0 }} · Выбрано: {{ scSelectedLeft ? 'L' : '' }}{{ scSelectedLeft && scSelectedRight ? '+' : '' }}{{ scSelectedRight ? 'R' : '' }}
✅ {{ scTemplateLastSaveMsg }}
{{ scTemplateError }}
{{ side==='left' ? 'Левая стадия' : 'Правая стадия' }} · slot {{ scCurrentSlotForSide(side) || '—' }} {{ scAlignmentActionError }}
slot {{ slot.slot }} {{ slot.left_page ? ('Лист ' + slot.left_page) : 'Пусто' }} {{ slot.right_page ? ('Лист ' + slot.right_page) : 'Пусто' }} {{ slot.mode === 'manual' ? '✎' : slot.mode === 'blank' ? '∅' : '' }}
Лист загрузится при прокрутке

Сопоставление PDF второй стадии

Левая стадия: {{ scMatchPairTargetPair.left ? scMatchPairTargetPair.left.filename : '—' }}
Текущая правая: {{ scMatchPairTargetPair.right ? scMatchPairTargetPair.right.filename : '— (пусто) —' }}
{{ scMatchPairError }}

Создать пару PDF вручную

{{ scCreatePairError }}
Unified-анализ (Opus) выключен в окружении. Claude Code provider недоступен на сервере. · {{ scUnifiedConfig.reason }}
Provider: {{ scUnifiedConfig.provider }} · model: {{ scUnifiedConfig.model }} · enabled: {{ scUnifiedConfig.enabled }}
Статус по текущей PDF-паре {{ scUnifiedPairStatus.pair_label }}
Enrichment (Qwen)
enriched MD: {{ scUnifiedPairStatus.enrichment.enriched_md_ready ? 'готов' : 'не готов' }} · символов: {{ scUnifiedPairStatus.enrichment.enriched_md_total_chars || 0 }}
image/imagine-блоков L/R: {{ scUnifiedPairStatus.enrichment.left?.image_blocks ?? 0 }}/{{ scUnifiedPairStatus.enrichment.right?.image_blocks ?? 0 }} · cache hits L/R: {{ scUnifiedPairStatus.enrichment.left?.from_cache ?? 0 }}/{{ scUnifiedPairStatus.enrichment.right?.from_cache ?? 0 }}
Comparison (Opus)
status: {{ scUnifiedPairStatus.comparison.status }} · расхождений: {{ scUnifiedPairStatus.comparison.changes_count }}
обновлено: {{ scUnifiedPairStatus.comparison.updated_at }}
ошибка: {{ scUnifiedPairStatus.comparison.error }}
Unified-анализ сессии {{ scUnifiedJob.status }} {{ scUnifiedJob.progress.done }}/{{ scUnifiedJob.progress.total }} готово · {{ scUnifiedJob.progress.skipped }} пропущено · {{ scUnifiedJob.progress.failed }} с ошибкой
Unified-анализ завершён
{{ scUnifiedError }}
Вид: {{ scUnifiedGrouped.summary.raw_findings_count }} raw → {{ scUnifiedGrouped.summary.grouped_findings_count }} сгруппировано → скрыто формальных: {{ scUnifiedGrouped.summary.hidden_formal_count }}
Загрузка списка расхождений…
Загрузка сгруппированных расхождений…
Сгруппированные расхождения пока не сформированы или произошла ошибка: {{ scUnifiedGroupedError }}
Показаны все PDF-пары сессии Показана текущая PDF-пара {{ (scActivePair.left && scActivePair.left.filename) || scActivePair.id }}{{ (scActivePair.right && scActivePair.right.filename) || '' }}
⬇ Экспорт в Excel
Сравнивается весь документ целиком. Связи блоков не используются — анализ опирается только на enriched MD. Связанные блоки используются как ориентиры с повышенным вниманием, но изменения находятся и вне их.
Для выбранной PDF-пары анализ ещё не запускался. Перейдите на этап «1. Загрузка документации» и нажмите «🔍 Проанализировать и сравнить» — будут обработаны все готовые пары сессии.
PDF-пары: {{ scUnifiedFlat.summary.total_pairs }} (готовых: {{ scUnifiedFlat.summary.done_pairs }})
Расхождений: {{ scUnifiedFlat.summary.total_changes }}
Важность: high {{ scUnifiedFlat.summary.by_severity?.high ?? 0 }} / med {{ scUnifiedFlat.summary.by_severity?.medium ?? 0 }} / low {{ scUnifiedFlat.summary.by_severity?.low ?? 0 }}
На ручную проверку: {{ scUnifiedFlat.summary.requires_human_review }}
По источникам: Текст {{ scUnifiedFlat.summary.by_source?.text ?? 0 }} · Описание изобр. {{ scUnifiedFlat.summary.by_source?.image_enrichment ?? 0 }} · Схема {{ scUnifiedFlat.summary.by_source?.scheme_analysis ?? 0 }} · Таблица {{ scUnifiedFlat.summary.by_source?.table ?? 0 }} · Штамп {{ scUnifiedFlat.summary.by_source?.stamp ?? 0 }} · Текст + изобр. {{ scUnifiedFlat.summary.by_source?.mixed ?? 0 }}
Дополнительно: фильтры по источнику / типу / категории
Расхождений пока нет. Перейдите на этап «1. Загрузка документации» и запустите «🔍 Проанализировать и сравнить» по всей сессии.
{{ scUnifiedSortIndicator('no') }} Место {{ scUnifiedSortIndicator('sheet') }} Изменение Было Стало Влияние {{ scUnifiedSortIndicator('impact') }} Решение Причина
№{{ it._displayNo }}
{{ it.severity || '—' }}
Лист: {{ it.sheet }}
стр. PDF: {{ Array.isArray(it.page) ? it.page.join(', ') : it.page }}
{{ it.pair_label }}
⚑ ручная {{ scUnifiedSourceLabel(it.source_layer) }} без связей
{{ it.title || '—' }}
{{ it.summary }}
Технические детали
Тип:{{ it.type || '—' }} Категория:{{ it.category || '—' }}
{{ it.old_value || (it.evidence_left && it.evidence_left.quote) || '—' }} {{ it.new_value || (it.evidence_right && it.evidence_right.quote) || '—' }}
{{ it.construction_impact }}
Стоимость: {{ it.cost_impact }}

Unified-анализ PDF-пары всей сессии

Подсчёт оценки…
{{ scUnifiedPreflightError }}
Перейдите на этап «1. Загрузка документации» и нажмите «Распознать графику», чтобы Qwen сформировал enriched MD по всей сессии.
{{ scMdEnrichmentError }}
Qwen job: {{ scMdEnrichmentJob.id }} · status: {{ scMdEnrichmentJob.status }} · сторон: {{ (scMdEnrichmentJob.progress||{}).total ?? 0 }} · done: {{ (scMdEnrichmentJob.progress||{}).done ?? 0 }} · failed: {{ (scMdEnrichmentJob.progress||{}).failed ?? 0 }} · skipped: {{ (scMdEnrichmentJob.progress||{}).skipped ?? 0 }}
{{ it.side === 'left' ? 'Левая' : 'Правая' }} · {{ it.status }} · блок {{ it.current.block_index }}/{{ it.current.total }} · стр. {{ it.current.page }} · {{ it.current.last_status }} · описано {{ it.described }}/{{ it.image_blocks }} · ошибок {{ it.errors }}
{{ it.error }}

Запустить локальный Qwen?

Будет вызвана локальная VLM-модель через LM Studio + ngrok. Внешние платные API не используются.
  • Левая сторона: image/imagine-блоков ≈ {{ (scMdEnrichmentSummary?.left||{}).image_blocks ?? '—' }}
  • Правая сторона: image/imagine-блоков ≈ {{ (scMdEnrichmentSummary?.right||{}).image_blocks ?? '—' }}
  • Источник: оригинальный MD не изменяется.
LLM-анализ текста выключен в окружении. Claude Code provider недоступен на сервере. · {{ scTextLLMConfig.reason }}
Provider: {{ scTextLLMConfig.provider }} · model: {{ scTextLLMConfig.model }} · enabled: {{ scTextLLMConfig.enabled }}
Текстовый анализ сессии {{ scTextLLMBatchJob.status }} {{ scTextLLMBatchJob.progress.done }}/{{ scTextLLMBatchJob.progress.total }} готово · {{ scTextLLMBatchJob.progress.skipped }} пропущено · {{ scTextLLMBatchJob.progress.failed }} с ошибкой текущая пара: {{ scTextLLMBatchJob.current_pair_id }}
Текстовый анализ завершён

Полный текстовый анализ сессии

Подсчёт оценки…
{{ scTextLLMBatchError }}
Загрузка списка изменений…

Текстовый анализ ещё не запускался. Нажмите «Сравнить текст», чтобы проанализировать все PDF-пары сессии.

Сравниваются MD-файлы всех PDF-пар. Image/imagine-блоки исключаются — графические блоки сравниваются отдельно.

Блоков: {{ scGraphicSummary.left_blocks_total }} / {{ scGraphicSummary.right_blocks_total }} · Связано авто/вручную: {{ scGraphicSummary.auto_links.length }} / {{ scGraphicSummary.manual_links.length }} · Только слева/справа: {{ scGraphicSummary.left_only.length }} / {{ scGraphicSummary.right_only.length }} · Stale: {{ scGraphicSummary.stale_links.length }}

⚠ Устаревшие связи блоков ({{ scGraphicSummary.stale_links.length }})

После изменения карты листов эти связи больше не соответствуют текущему выравниванию. Их можно удалить или пересоздать.
Метод L стр. R стр. Причина L block R block
{{ l.method }} {{ l.left_page != null ? l.left_page : '—' }} {{ l.right_page != null ? l.right_page : '—' }} {{ l.stale_reason || '—' }} {{ l.left_block_id }} {{ l.right_block_id }}

Статистика по листам

Сопоставлено: {{ scGraphicSummary.page_stats.matched_pages }}
Новых во второй стадии: {{ scGraphicSummary.page_stats.new_right_pages }}
Удалено из первой: {{ scGraphicSummary.page_stats.removed_left_pages }}
С изменённым порядком: {{ scGraphicSummary.page_stats.reordered_pages }}
Новые листы во второй стадии:
нет
Slot {{ p.slot }}: справа лист {{ p.right_page }}, слева пусто.
Удалённые листы из первой:
нет
Slot {{ p.slot }}: слева лист {{ p.left_page }}, справа пусто.
Изменён порядок:
нет
Slot {{ p.slot }}: слева {{ p.left_page }}, справа {{ p.right_page }}.

Только в стадии A

нет
{{ b.id }} · стр. {{ b.page }} · {{ b.type }}

Только в стадии B

нет
{{ b.id }} · стр. {{ b.page }} · {{ b.type }}

Связанные блоки (можно сравнить через LLM)

Платный LLM-вызов запускается только после клика «Сравнить через LLM».
Метод Slot L стр. R стр. L block R block Результат LLM Действия
{{ l.method }} {{ l.alignment_slot != null ? l.alignment_slot : '—' }} {{ l.left_page != null ? l.left_page : '—' }} {{ l.right_page != null ? l.right_page : '—' }} {{ l.left_block_id }} {{ l.right_block_id }} ⚠ {{ scFindGraphicDiff(l).error }} ✗ {{ scFindGraphicDiff(l).status }}
Стадия A · {{ scGraphicPreview.left_block_id }}
Стадия B · {{ scGraphicPreview.right_block_id }}
Результат LLM:
{{ scGraphicPreview.summary }}
cost: ${{ scGraphicPreview.cost_usd.toFixed(6) }} · model: {{ scGraphicPreview.model }}
{{ scGraphicPreview.note }}
⚠ Предупреждения сессии ({{ scWarningsItems.length }}) high: {{ scWarningsSummary.high || 0 }} · medium: {{ scWarningsSummary.medium || 0 }} · low: {{ scWarningsSummary.low || 0 }}
[{{ w.severity || 'low' }}]
{{ w.title }} — {{ w.details }} · pair {{ w.pair_id }}
Всего расхождений: {{ scFindingsSummary && scFindingsSummary.total_all || 0 }} · видимых {{ scFindingsSummary.total_visible }}, сгруппировано {{ scFindingsSummary.children_total }}
new: {{ scFindingsSummary.by_status?.new || 0 }} · needs_review: {{ scFindingsSummary.by_status?.needs_review || 0 }} · accepted: {{ scFindingsSummary.by_status?.accepted || 0 }} · rejected: {{ scFindingsSummary.by_status?.rejected || 0 }}
text: {{ scFindingsSummary.by_category?.text || 0 }} · graphic: {{ scFindingsSummary.by_category?.graphic || 0 }} · page: {{ scFindingsSummary.by_category?.page || 0 }} · link: {{ scFindingsSummary.by_category?.link || 0 }}
high: {{ scFindingsSummary.by_severity?.high || 0 }} · medium: {{ scFindingsSummary.by_severity?.medium || 0 }} · low: {{ scFindingsSummary.by_severity?.low || 0 }}
⚠️ {{ scFindingsError }}
Bulk ({{ scFindingsSelectedIds.size }}):
Тип Заголовок Стр. Статус Важн.

Список расхождений пустой. Нажмите «Пересобрать список расхождений» или измените фильтры.

{{ scFindingTypeLabel(scActiveFinding.type) }} {{ scActiveFinding.status }} {{ scActiveFinding.severity }} {{ scTextLLMCategoryLabel(scActiveFinding.source.text_llm_category) }} $ {{ scActiveFinding.source.cost_impact }} Требует проверки conf: {{ Math.round((scActiveFinding.source.confidence || 0) * 100) }}%

{{ scActiveFinding.title }}

{{ scActiveFinding.summary }}
Влияние на строительство:
{{ scActiveFinding.source.construction_impact }}
Стадия A · стр. {{ scActiveFinding.left?.page || '—' }}
{{ scActiveFinding.left.text }}
Стадия B · стр. {{ scActiveFinding.right?.page || '—' }}
{{ scActiveFinding.right.text }}
LLM-описание:
{{ scActiveFinding.llm_summary }}

Выберите расхождение в таблице слева, чтобы открыть карточку.

Экспорт отчёта

✓ Отчёт создан: {{ scLastReport.report_id }} ({{ scLastReport.format }}, {{ scLastReport.size_bytes }} bytes, {{ scLastReport.findings_included }} расхождений)
История ({{ scReportsList.length }}):
{{ r.created_at }} {{ r.format }} {{ r.filename || r.report_id }} ({{ r.size_bytes }}b) · findings: {{ r.findings_count }} · без картинок · grouped

⚠ Подтвердите платный LLM-запуск

Вы собираетесь выполнить {{ scBatchLLMConfirmCount }} платных LLM-запросов для сравнения графики.

Scope: {{ scBatchLLMScope }}
Модель: {{ scBatchLLMModel }}
Каждый запрос пройдёт через paid_api_guard. Если глобальный kill-switch выключен или превышен дневной лимит — запросы будут заблокированы.

⚠️ Запросы платные. Подтвердите явно.

{{ scBatchLLMError }}

Сравнение графики через LLM

Job: {{ scBatchLLMLastJob.job_id || scBatchLLMLastJob.id }} · статус: {{ scBatchLLMLastJob.status }}
Всего: {{ scBatchLLMLastJob.progress?.total || 0 }}
Выполнено: {{ scBatchLLMLastJob.progress?.done || 0 }}
Пропущено (уже сравнивалось): {{ scBatchLLMLastJob.progress?.skipped || 0 }}
Ошибок: {{ scBatchLLMLastJob.progress?.failed || 0 }}
✓ Сравнение завершено.
⚠ Job остановлен (вероятно paid_api_blocked или критическая ошибка).
Отменён пользователем. Уже выполненные items сохранены.
Прерван (вероятно, был рестарт сервера). Можно запустить новый job.
{{ scBatchLLMError }}