распознавание: большие раздачи размечаются целиком, файлы вне плана видны

- модель адресует файл номером строки нашего списка вместо копии пути: ответ
  на 180 файлов вместо ~15k токенов стоит ~2.5k, усечение сотней снято,
  max_files и max_tokens ушли в [recognition], correction-ретрай больше не
  переприсылает список
- негодный элемент ответа отбрасывается поимённой причиной, обрыв генерации и
  отказ по размеру запроса названы своими причинами, покрытие плана блокирует
  авто только при непокрытом видеофайле
- раскладка показывает все файлы раздачи со строками «не в плане» и полным
  порядком сортировки; снимок списка файлов лёг рядом с планом (миграция 0012)
This commit is contained in:
av
2026-09-02 08:54:58 +03:00
parent 01ac0430a9
commit fc9a3b4066
26 changed files with 1978 additions and 201 deletions
+5
View File
@@ -391,6 +391,11 @@ table.tbl .size{font-family:var(--mono);color:var(--text-dim);white-space:nowrap
.se-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-weak)}
.role-select{font:inherit;font-size:var(--fs-xs);padding:4px 6px;border-radius:var(--r-sm);
border:1px solid var(--border-strong);background:var(--surface);color:var(--text)}
/* Строка о полноте перечня над таблицей раскладки: is-warn — когда список
файлов раздачи неизвестен и полнота не гарантирована. */
.tbl-note{margin:0 0 var(--sp-3);font-size:var(--fs-sm);color:var(--text-dim)}
.tbl-note.is-warn{padding:9px 12px;border-radius:var(--r-sm);color:var(--text);
background:var(--st-wait-bg);border:1px solid color-mix(in srgb,var(--st-wait) 30%,transparent)}
.tbl-actions{display:flex;gap:var(--sp-2);margin-top:var(--sp-3);flex-wrap:wrap;align-items:center}
.validation{font-size:var(--fs-xs);margin-top:var(--sp-2);display:flex;gap:var(--sp-3);flex-wrap:wrap}
.validation .ok{color:var(--st-ok)}
+20 -7
View File
@@ -1,18 +1,31 @@
{{define "layout_widget"}}
{{/* Полнота перечня названа явно: молчаливый показ неполного списка как
полного неотличим от честного «файлов вне плана нет». */}}
{{if .SourceUnknown}}
<p class="tbl-note is-warn">Список файлов раздачи не сохранён — эта загрузка распознана до того,
как система стала его хранить. Строки построены по плану: файлы, которых в плане нет,
здесь не видны, и полнота не гарантирована. Повторное распознавание из ревью вернёт полный список.</p>
{{else if lt .Planned .Total}}
<p class="tbl-note">В план распознавания попало {{.Planned}} файлов из {{.Total}} —
остальные показаны ниже пометкой «не в плане».</p>
{{end}}
<div class="table-wrap">
<table class="tbl">
<thead><tr><th class="cell-num">#</th><th>файл источника → раскладка</th><th>роль</th></tr></thead>
<thead><tr>
<th class="cell-num" title="номер файла в списке распознавания — им же его адресует ответ модели">#</th>
<th>файл источника → раскладка</th><th>роль</th>
</tr></thead>
<tbody>
{{range $i, $f := .}}
<tr class="{{if $f.Ignored}}ignored{{end}}">
<td class="cell-num">{{add $i 1}}</td>
{{range .Rows}}
<tr class="{{if .Ignored}}ignored{{end}}">
<td class="cell-num">{{if .Num}}{{.Num}}{{end}}</td>
<td>
<div class="fname">{{$f.Src}} <span class="arr"></span></div>
<div class="fname">{{.Src}} <span class="arr"></span></div>
<div class="link-to">
{{if $f.Linked}}<span class="src">{{$f.Dst}}</span>{{else}}<span class="no-link">не разложен</span>{{end}}
{{if .Linked}}<span class="src">{{.Dst}}</span>{{else if .Unplanned}}<span class="no-link">модель не разметила этот файл</span>{{else}}<span class="no-link">не разложен</span>{{end}}
</div>
</td>
<td><span class="badge {{if $f.Ignored}}st-cancelled{{else}}st-done{{end}}">{{$f.RoleLabel}}</span></td>
<td><span class="badge {{if .Unplanned}}st-review{{else if .Ignored}}st-cancelled{{else}}st-done{{end}}">{{.RoleLabel}}</span></td>
</tr>
{{end}}
</tbody>