Разделы проекта
← {{ sidebarFilterSection }} {{ disciplineLabel(sidebarFilterSection) }} ({{ filteredSectionProjects.length }})
{{ p.name }}
Очередь
🧾 Подготовка данных (Gemma enrichment)
Очередь пуста. Выберите проекты и добавьте их в очередь.
Добавить проекты
Версии проекта
| Версия | Статус | Дата создания | Файлы | Готовность | Комментарий | |
|---|---|---|---|---|---|---|
| {{ 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 ? '…' : '' }} | активна |
Контроль замечаний из предыдущей версии
| Исходное замечание | Статус | Связанное замечание V2 | Причина | Действие |
|---|---|---|---|---|
|
{{ item.origin_finding_id || '—' }}
{{ item.origin_version_id || '' }}
{{ item.origin_title }}
|
{{ migratedStatusLabel(item.migration_status) }} | {{ item.linked_finding_id }} {{ item.new_finding_id }} — | {{ (item.note || item.reason || '').slice(0, 80) }} | Проверить вручную — |
Создать новую версию
Новая версия будет создана пустой. После создания загрузите PDF/MD. Старые версии и их результаты остаются нетронутыми.
| ID | Критичность | Лист | Замечание | Норма | Critic v2 эксп. {{ cv2SortDir === 'desc' ? '▼' : (cv2SortDir === 'asc' ? '▲' : '') }} | Рекомендация | Решение | Причина | |
|---|---|---|---|---|---|---|---|---|---|
| {{ f.id }} ×{{ f.sub_findings.length }} {{ findingBlockMap[f.id].length }} | {{ f.severity }} |
{{ sub.sheet || '—' }}
{{ f.sheet }}
стр. PDF {{ Array.isArray(f.page) ? f.page.join(', ') : f.page }}
|
{{ findingExtRegBadge(f).text }}
{{ findingMigratedBadge(f).text }}
{{ idx + 1 }}. {{ cleanSubProblem(sub.problem) }}
{{ f.description || f.problem || f.finding || '' }}
|
{{ f.norm }} |
{{ findingCv2Score(f.id) }}
{{ findingCv2Label(f.id) }}
—
|
{{ f.solution || f.recommendation || '' }} |
|
||
|
стр. {{ b.page }}
{{ te.role || 'текст' }}
стр. {{ te.page }}
|
| ID | Тип | Текущее решение | Предложение | Экономия | Риски | Норма | Решение | Причина | |
|---|---|---|---|---|---|---|---|---|---|
| {{ item.id }} {{ optBlockMap[item.id].length }} | {{ optTypeLabel(item.type) }} |
{{ item.section }}
(стр. PDF {{ Array.isArray(item.page) ? item.page.join(', ') : item.page }})
{{ item.current }}
{{ si }}
|
{{ item.proposed }} |
~{{ item.savings_pct }}%
{{ item.savings_basis }}
|
{{ item.risks }} | {{ item.norm || '—' }} |
|
||
|
стр. {{ b.page }}
|
База знаний
| Норма | Тип | Проектов | Замечаний | Проекты | Впервые | Действие |
|---|---|---|---|---|---|---|
|
{{ 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_reason }} Принято | {{ (entry.expert_date || '').slice(0, 10) }} |
Обнаруженные паттерны
🧾 LM Studio (удалённое управление)
Управление LM Studio через ngrok+Basic Auth (WSS). Используется для Gemma enrichment (этап «Подготовить данные»).
Загружено сейчас
| 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
Замечаний не выявлено ({{ noFindingsBlocksList.length }})
Модель проверила эти блоки, нарушений не обнаружено.
Без значимого содержимого ({{ skippedBlocksList.length }})
Алгоритм не включал эти блоки в анализ — фрагменты без чертёжного содержания (штампы, пустые области, служебные вставки).
Все блоки содержат замечания или разобраны в составе листов.
Блоки не найдены. Запустите аудит для кропинга image-блоков.
| 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 || '' }} |
| ID | Критичность | Лист | Замечание | Норма | Рекомендация | Решение | |
|---|---|---|---|---|---|---|---|
|
{{ item.item_id }}
×{{ item.sub_findings.length }}
{{ findingBlockMap[item.item_id].length }}
{{ discussionStatusIcon(item.discussion_status) }}
|
{{ item.severity }} |
{{ sub.sheet || '—' }}
{{ item.sheet }}
стр. PDF {{ Array.isArray(item.page) ? item.page.join(', ') : item.page }}
|
{{ idx + 1 }}. {{ cleanSubProblem(sub.problem) }}
{{ item.problem }}
|
{{ item.norm }} | {{ item.recommendation }} |
{{ item.discussion_status === 'confirmed' ? 'Принято' : item.discussion_status === 'rejected' ? 'Отклонено' : item.discussion_status === 'revised' ? 'Изменено' : '' }}
{{ item.resolution_summary }}
|
|
|
стр. {{ b.page }}
{{ te.role || 'текст' }}
стр. {{ te.page }}
|
|||||||
| ID | Тип | Текущее решение | Предложение | Экономия | Риски | Норма | |
|---|---|---|---|---|---|---|---|
|
{{ item.item_id }}
{{ optBlockMap[item.item_id].length }}
{{ discussionStatusIcon(item.discussion_status) }}
|
{{ optTypeLabel(item.opt_type) }} |
{{ item.section }}
(стр. PDF {{ Array.isArray(item.page) ? item.page.join(', ') : item.page }})
{{ item.current || item.problem }}
{{ si }}
|
{{ item.proposed }} |
~{{ item.savings_pct }}%
{{ item.savings_basis }}
|
{{ item.risks }} | {{ item.norm || '—' }} | |
|
стр. {{ b.page }}
|
|||||||
Отменённые ({{ rejectedDiscussionItems.length }})
Предложенные изменения:
{{ revisionData.explanation }}
| Поле | Было | Стало |
|---|---|---|
| {{ formatRevisionField(key) }} | {{ formatRevisionValue(revisionData.original?.[key]) }} | {{ formatRevisionValue(revisionData.revised[key]) }} |
Документ — {{ currentProject?.name || documentProjectId }}
Critic v2 — UI Triage Preview
Загрузите файл critic_v2_triage_ui.json, сгенерированный
скриптом backend/scripts/replay_critic_v2_triage_policy.py --ui-export.
Импорт feedback экспертa
Загрузите ранее сохранённый *_feedback.json (или нажмите
«Обновить список», чтобы выбрать из critic v2 test/). После
импорта замечания, помеченные экспертом как preferred_tab=suggested_reject,
появятся во вкладке «Критик рекомендует отклонить».
{{ cv2ImportMessage }}
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 }}
Сводка
Сверка с экспертом
Фильтры
Загрузка 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_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 }})| 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 }} |
Сводка по проекту
Сверка с экспертом
Реестр замечаний СУ-10
Замечания, отправленные заказчику, и их сопоставление с findings'ами на платформе. Принято = мы отправили finding заказчику.
| # | Раздел | Лист/Раздел | Категория | Проблема | Ответ заказчика | Наш finding | Статус |
|---|---|---|---|---|---|---|---|
| {{ idx + 1 }} | {{ e.section_code || '—' }} |
{{ e.sheet_ref }} | {{ e.cat_su10 }} | {{ e.problem }} | {{ e.customer_response }} |
{{ e.match.finding_id }} ({{ Math.round(e.match.confidence*100) }}%){{ e.match.project_id }}
—
|
{{ e.match_status }}
|
Реестр пока пуст. Нажмите «Импортировать реестр», чтобы загрузить markdown СУ-10.
Сравнение стадий
stage_1/stage_2 внутрь
{{ r }}
и нажмите ⟳.
{{ scAutoLoadInfo.session_id }}
История сессий (debug) ({{ scSessions.length }}) — для отладки/восстановления, обычному пользователю не нужна
{{ s.id }}
{{ s.created_at }}
{{ s.pairs_matched }}/{{ s.pairs_total }} пар
Сопоставление PDF второй стадии
{{ scMatchPairTargetPair.left ? scMatchPairTargetPair.left.filename : '—' }}
{{ scMatchPairTargetPair.right ? scMatchPairTargetPair.right.filename : '— (пусто) —' }}
Создать пару PDF вручную
{{ scUnifiedConfig.provider }} ·
model: {{ scUnifiedConfig.model }} ·
enabled: {{ scUnifiedConfig.enabled }}
{{ scUnifiedPairStatus.enrichment.enriched_md_ready ? 'готов' : 'не готов' }}
· символов: {{ scUnifiedPairStatus.enrichment.enriched_md_total_chars || 0 }}{{ scUnifiedPairStatus.comparison.status }}
· расхождений: {{ scUnifiedPairStatus.comparison.changes_count }}{{ (scActivePair.left && scActivePair.left.filename) || scActivePair.id }}
↔ {{ (scActivePair.right && scActivePair.right.filename) || '' }}
⬇ Экспорт в Excel
| № | Тема / значимость | Изменение | Было | Стало | Где найдено | Влияние | Решение | Причина | |
|---|---|---|---|---|---|---|---|---|---|
|
№{{ g._displayNo }}
{{ scGroupedSigLabel(g.significance) }}
|
{{ scGroupedThemeLabel(g.theme) }}
{{ g.semantic_subject }} · {{ g.semantic_action }}
{{ scGroupedDirLabel(g.change_direction) }}
{{ scGroupedCostDirLabel(g.cost_impact_direction) }}
|
формальное
escalated · {{ g.escalation_reason }}
⚑ ручная
по нескольким разделам
{{ g.title || '—' }}
Объединено: {{ g.affected_count }} расхождений
|
несколько вариантов ({{ g.value_variants.length }}) {{ g.old_value || '—' }} | несколько вариантов ({{ g.value_variants.length }}) {{ g.new_value || '—' }} |
PDF-пар: {{ g.affected_pair_ids.length }}
стр. PDF: {{ (g.affected_pages || []).slice(0, 6).join(', ') }}
…
|
{{ g.construction_impact }}
—
Стоимость: {{ g.cost_impact }}
|
смешано
|
||
|
Варианты old → new (всего {{ g.value_variants.length }}):
Evidence ({{ (g.evidence || []).length }}):
review_reason:
{{ g.review_reason }}
|
Дополнительно: фильтры по источнику / типу / категории
| № {{ 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.evidence_left.section }}
Раздел (стало):{{ it.evidence_right.section }}
|
{{ 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 }}
|
|
{{ (scMdEnrichmentSummary[side]||{}).status || 'not_run' }}replacement
{{ (scMdEnrichmentSummary[side]||{}).enriched_md_format_version || 'append_v0' }} (устар.)
· графических блоков заменено:
{{ (scMdEnrichmentSummary[side]||{}).replaced_image_blocks ?? 0 }}/{{ (scMdEnrichmentSummary[side]||{}).original_image_blocks ?? 0 }}
— требуется пересборка enriched MD
{{ 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.status }}
· блок {{ it.current.block_index }}/{{ it.current.total }}
· стр. {{ it.current.page }}
· {{ it.current.last_status }}
· описано {{ it.described }}/{{ it.image_blocks }}
· ошибок {{ it.errors }}
{{ scTextLLMConfig.provider }} · model: {{ scTextLLMConfig.model }}
· enabled: {{ scTextLLMConfig.enabled }}
Текстовый анализ ещё не запускался. Нажмите «Сравнить текст», чтобы проанализировать все PDF-пары сессии.
Сравниваются MD-файлы всех PDF-пар. Image/imagine-блоки исключаются — графические блоки сравниваются отдельно.
Под фильтр ничего не подходит.
| Лист | Тип | Категория | Важность | Суть | Старое | Новое | Цитата A | Цитата B | PDF-пара | Действия |
|---|---|---|---|---|---|---|---|---|---|---|
|
{{ it.sheet }}
{{ it.location_method }}
|
{{ scTextLLMTypeLabel(it.type) }} | {{ scTextLLMCategoryLabel(it.category) }} | {{ scTextLLMSeverityLabel(it.severity) }} ⚑ |
{{ it.title }}
{{ it.summary }}
Влияние на строительство:
{{ it.construction_impact }}
|
{{ it.old_value || '—' }} | {{ it.new_value || '—' }} | {{ (it.evidence_left && it.evidence_left.quote) || '—' }} | {{ (it.evidence_right && it.evidence_right.quote) || '—' }} | {{ it.pair_label }} |
⚠ Устаревшие связи блоков ({{ 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 }} |
Статистика по листам
Только в стадии A
{{ b.id }} · стр. {{ b.page }} · {{ b.type }}
Только в стадии B
{{ b.id }} · стр. {{ b.page }} · {{ b.type }}
Связанные блоки (можно сравнить через 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 }} — |
{{ scGraphicPreview.left_block_id }}{{ scGraphicPreview.right_block_id }}{{ scGraphicPreview.summary }}
| Тип | Заголовок | Стр. | Статус | Важн. | |
|---|---|---|---|---|---|
| {{ scFindingTypeLabel(f.type) }} | {{ (f.title || '').slice(0,80) }} · на этом листе {{ f.children_count }} блоков | {{ f.left?.page || '—' }}/{{ f.right?.page || '—' }} | {{ f.status }} | {{ f.severity }} | |
| {{ scFindingTypeLabel(c.type) }} | ↳ {{ (c.title || '').slice(0,80) }} | {{ c.left?.page || '—' }}/{{ c.right?.page || '—' }} | {{ c.status }} | {{ c.severity }} |
Список расхождений пустой. Нажмите «Пересобрать список расхождений» или измените фильтры.
{{ scActiveFinding.title }}
{{ scActiveFinding.left.text }}
{{ scActiveFinding.right.text }}
{{ scActiveFinding.llm_summary }}
Выберите расхождение в таблице слева, чтобы открыть карточку.
Экспорт отчёта
⚠ Подтвердите платный LLM-запуск
Вы собираетесь выполнить {{ scBatchLLMConfirmCount }} платных LLM-запросов для сравнения графики.
Scope: {{ scBatchLLMScope }}
Модель: {{ scBatchLLMModel }}
Каждый запрос пройдёт через paid_api_guard. Если глобальный kill-switch выключен или превышен дневной лимит — запросы будут заблокированы.
⚠️ Запросы платные. Подтвердите явно.
Сравнение графики через LLM
{{ scBatchLLMLastJob.job_id || scBatchLLMLastJob.id }} ·
статус: {{ scBatchLLMLastJob.status }}