S1 чёрные нити, S2 пропуски среза, S3 задний предел; P1/P2 точечные; A-09 скрыт из витрины. До/после на 20 сканах.
Исполнитель: CC (Fable 5). База: HEAD recon-pass-1 (c1f6190), артефакты «до» =
прод после recon-регена 12.07 22:28. Ветка polish-pass-2 слита ff в main;
реген всех 20 — 13.07 ~15:40, живой кабинет обновлён.
https://dental.zaslart.website/cabinet/ (basic_auth artur). Артефакты уходят
под версионными URL (?v=<mtime>, проверено: …glb?v=1783957309), кэш не мешает.
A-09 в списке пациентов ОТСУТСТВУЕТ (см. A9-1).
Публичная версия отчёта + галереи скринов (до/после/пары):
https://dental.zaslart.website/reports/polish-pass-2/ (тот же basic_auth,
каждый скрин с кэш-бастом ?v=<mtime>).
Гипотеза приёмки верна: иглообразные треугольники (аспект > 15, сторона > 1.2 мм)
растягивают тёмную текстуру в нить. Перепись продовых GLB «до»: 1189–2142 тёмных
игл на скан (A-02/A-06/A-08 — ровно подтверждённые приёмкой). Происхождение
(пер-стадийная перепись пайплайна):
1. Веерные заплаты десневых дыр (fill_holes: дыра > 6 рёбер закрывалась веером
в центроид). Веер на рваном шраме от sail_trim = сотни игл, центр = среднее
тёмного контура → «вееры тёмных штрихов» на жевательных поверхностях (дыры в
тёмных зонах скана), стыках зуб-десна и нёбе.
2. Сливеры изолиний (_iso_split): точка среза в микронах от вершины меша.
3. Зип-лента основания (стык плотного обода с редким кольцом) — иглы есть, но
основание светлое и монотонное, «нитей» не даёт (оставлены, считаются гардом).
Фиксы (в пайплайне, для всех сканов):
- десневые дыры > 6 рёбер — триангуляция Лиепы (общий кирпич _liepa_patch_ring
с Ярусом-1 recon) вместо веера; в _liepa_refine тощие треугольники не делятся
центроидом (это плодило иглы 29→345 на шраме) + финальные флипы по аспекту;
оба флип-цикла получили гард многообразия (флип, создающий уже существующее
ребро, запрещён — без него 4–391 немногообразных рёбер на скан);
- _iso_split: анти-сливер снап (изолиния не подходит к вершине ближе 0.08 мм);
- гард вырожденной геометрии: close_shell считает иглы на каждом прогоне
(поверхность/основание), qa/v2_closure_check.py держит бюджет тёмных игл
видимой поверхности (порог 100; эра вееров давала 1200–2000).
Итог по 20 сканам: тёмных игл на видимой поверхности — медиана 1, максимум 87
(A-04 upper — контраст собственной тёмной текстуры скана внутри заплат, рендером
проверено: нитей нет). Было 1189–2142 на пострадавших.
keep_palate → _arch_core): рваный язык в ядре дуги
(фронт A-03 upper: θ 60–95°, глубина до 14 мм) не строгался вовсе — предохранитель
срабатывал по своей логике, но защищал кромочный артефакт, а не свод. Фикс:
защита свода теперь структурная — строгание = пилинг от кромки (геодезика по
kill-области от границы меша ≤ 15 мм): свод/дно рта — внутренние области, пасс их
не достаёт по построению и дыр внутри поверхности не делает; кромочные языки
срезаются на обеих челюстях одинаково. Два страхующих гарда: (а) пилинг, чей рез
осиротил бы крупный внутренний кусок (кольцевой рез вокруг свода — A-04 upper),
восстанавливается; (б) грани с зубными вершинами пилинг не снимает никогда.Замер показал: мягкое нёбо/зона к глотке висят внутри дуги (в 2D-проекции между
дистальными концами), опускаясь вниз — вертикальная отсечка «дисталь + отступ» их не
видит (хорда берёт 0–523 вершин). Критерий из двух частей:
- уровень среза перемычки: в беззубом заднем секторе огибающая строгания НЕ
строится по ободу (обод там = занавес мягкого нёба; rolling-минимум нырял за ним до
11–16 мм) — интерполируется между дистальными концами дуги. Это задний предел
глубины: пилинг срезает всё, что свисает ниже уровня среза дистальных концов;
- прямая отсечка distal_trim: всё дальше DISTAL_MARGIN_MM = 3.0 мм дистальнее
самой дистальной зубной точки (по направлению центра заднего разрыва зубного ряда)
— срезается врезанной изолинией (ровная прямая кромка).
Приёмка глазами за Артуром; отступ — один параметр.
Про «флажок A-10 не тронут» из PASS-1: флажок — широкая ткань у последнего
моляра A-10 lower; правила чистки PASS-1 его структурно не брали (его прибрежный
пояс — главный, лавину гасит ширина). Это не та же зона, что «задняя зона A-10
upper» (мягкое нёбо — его убрал уровень перемычки, см. пару S3-a10u-back), но новый
предел действует на оба: distal_trim на A-10 lower срезал 256 вершин дистальнее
хорды — флажок теперь подрезан задним пределом (пара S3-a10l-back).
Механизм: колонка patients.hidden (аддитивная миграция в store.py); /api/patients
не отдаёт скрытых; кейс (/case и страница) отвечает 404. Пруф с публичного URL:
страница пациентов без A-09 (qa/shots/polish2-after/A9-hidden-patients-list.png),
GET …/api/patients/1149436bd44f/case → 404; артефакты целы на диске
(ae7d0dfc2078.glb 616КБ, 1851acfea0d0.glb 1.4МБ, teeth.json на месте), БД/разметка
не тронуты. Возврат: UPDATE patients SET hidden=0 WHERE name='Пациент A-09'.
qa/recon-md5-originals-before.txt, лог qa/recon-invariants.log: PASS).check_invariants на всех 20 в
финальном closure (bitexact 20/20) + громкие гарды в пайплайне. По ходу пойманы и
закрыты два пробоя: plane_cut снимал смешанные грани тела вдоль линии реза
(A-05u, зуб 13: −20 граней) и демоция примыкающего отщепенца флипала стыковые
грани тела — теперь пилинг не трогает грани с зубными вершинами, демоция только
для кусков без общих вершин с телом.synthetic-маска сходится 20/20).qa/shots/polish2-before/ (177),
«после» qa/shots/polish2-after/ (178) — 20 сканов × 8 канонных ракурсов
(front/back/left/right/occl/bottom/3q-l/3q-r, каждая челюсть изолированно) +
точечные углы дефектов. 0 console-errors, версионные URL OK.qa/shots/polish2-pairs/ (17 пар).qa/v2/closure.json): немногообразных 0, несмыканий 0,
непрослеженных рёбер 0, watertight 8/20 (остальные — честные дыры у зуба и
окна смыкания, как в каноне), зубы байт-в-байт 20/20.scratchpad/regen2.log → все 20 прошли пайплайн-гарды
(RuntimeError-гарды не сработали), находки идентичны (present/missing/indeterminate
без изменений, 14 зубов везде). qa/recon-invariants.log: add-only PASS 20/20,
synthetic-слои сходятся, md5 123/123.?v=1783957309), plaque «Доработано» жива.Критерий «соответствует»: гладкая огибающая линия среза по всей дуге (внутренняя и щёчная), без языков/занавесов/уступов/вееров; тёмных игл на поверхности ≈ 0.
| Скан | Вердикт | Комментарий |
|---|---|---|
| A-01 upper | соответствует | 0 игл; ровная линия |
| A-01 lower | соответствует | 1 тёмная игла; линия без уступов (конус floor), заливы у имплантов закрыты гладко; дистальный «крючок»-хвостик у ретромолярной зоны был и «до» (за пределами пунктов приёмки) |
| A-02 upper | соответствует | вееры на моляре/нёбе ушли (Лиепа); 2 окна смыкания — канон; 9 тёмных игл в заплатах |
| A-02 lower | соответствует | провал в центре щёчной сглажен медиан-капом; 6 тёмных игл |
| A-03 upper | соответствует | язык по фронту срезан (пилинг), задний занавес срезан до уровня перемычки |
| A-03 lower | эталон | 0 игл, watertight |
| A-04 upper | отклонение (принятое) | 87 «тёмных» игл = контраст собственной тёмной текстуры скана внутри заплат Лиепы; рендером проверено — нитей/вееров нет. Кольцевой рез свода предотвращён гардом сироты |
| A-04 lower | соответствует | 25 тёмных игл в тёмной текстуре; линия гладкая |
| A-05 upper | соответствует | иглы заплат 12; тело зуба 13 защищено гардом смежности |
| A-05 lower | соответствует | 0 тёмных |
| A-06 upper | соответствует | мягкое нёбо срезано (S3); 3 честные дыры у зуба открыты |
| A-06 lower | соответствует | 0 тёмных; distal 5 вершин (почти нечего резать) |
| A-07 upper | соответствует | distal 523 вершины — самый большой задний хвост; watertight |
| A-07 lower | соответствует | 0 тёмных |
| A-08 upper | отклонение (задача B) | задний занавес и рваная кромка ушли; остаётся сглаженный V-спуск линии по фронту — его держат 93 вершины класса 1 на 5.5–6.4 мм ниже цервикальной (label-bleed/рецессия), резать под ними запрещает инвариант зуба |
| A-08 lower | соответствует | 0 тёмных |
| A-09 upper | вне витрины (A9-1) | метрики зелёные (15 тёмных игл, 10 честных дыр у зуба — рваный waxup) |
| A-09 lower | вне витрины (A9-1) | метрики зелёные |
| A-10 upper | соответствует | 0 игл; мягкое нёбо срезано уровнем перемычки |
| A-10 lower | соответствует | 0 игл; флажок подрезан задним пределом (256 вершин дистальнее хорды) |
Базлайн v2 qa/artifact-freeze-20260713.json снят с устоявшегося состояния после
регена-2 (код 54d7f52); проверка qa/freeze_table.py (exit 0 = нарушений нет):
артефакт не менялся после базлайна (mtime+md5), и ВСЕ скрины скана
(recon-accept ×16 + polish2-after ×8+) сняты ПОЗЖЕ mtime его артефакта.
| Скан | Артефакт (glb) | mtime артефакта | md5 | Скринов | Все сняты после mtime |
|---|---|---|---|---|---|
| Пациент A-01 upper | 5f706d1da931.glb |
2026-07-13 15:41:49 | 2d4a3ef66ddb… |
24 | ✅ |
| Пациент A-01 lower | 102841516c8c.glb |
2026-07-13 15:43:02 | d202156ef143… |
24 | ✅ |
| Пациент A-02 upper | 1d48734f8e98.glb |
2026-07-13 15:45:03 | 5c4bead60a75… |
24 | ✅ |
| Пациент A-02 lower | 6a4f69ddc35e.glb |
2026-07-13 15:46:04 | f19ed1ed9ff4… |
24 | ✅ |
| Пациент A-03 upper | 8ed7f3f5902a.glb |
2026-07-13 15:47:22 | 90f12605db5b… |
24 | ✅ |
| Пациент A-03 lower | cfbd0272c1e2.glb |
2026-07-13 15:48:10 | 08a661256994… |
24 | ✅ |
| Пациент A-04 upper | c652395acbca.glb |
2026-07-13 15:50:50 | 1a5faf84a4af… |
24 | ✅ |
| Пациент A-04 lower | afb3e793cdbc.glb |
2026-07-13 15:53:03 | 287e5e48cb90… |
24 | ✅ |
| Пациент A-05 upper | 70a98dc9d1a7.glb |
2026-07-13 15:54:14 | 172db3d6de87… |
24 | ✅ |
| Пациент A-05 lower | 33d859d72a00.glb |
2026-07-13 15:55:03 | 7b7966bd296e… |
24 | ✅ |
| Пациент A-06 upper | 7c566f81f8b3.glb |
2026-07-13 15:56:23 | 5c9ffc1a4cf0… |
24 | ✅ |
| Пациент A-06 lower | adf259ee2acf.glb |
2026-07-13 15:57:13 | bff39e6d783f… |
24 | ✅ |
| Пациент A-07 upper | 75f24034acc3.glb |
2026-07-13 15:59:48 | d0465dddc5af… |
24 | ✅ |
| Пациент A-07 lower | 96067e05e233.glb |
2026-07-13 16:01:09 | a54acd7319b8… |
24 | ✅ |
| Пациент A-08 upper | 50aefc9080b4.glb |
2026-07-13 16:02:19 | 92e04659cfa1… |
24 | ✅ |
| Пациент A-08 lower | 1ed3c92373e0.glb |
2026-07-13 16:03:08 | 1d30f5ccc616… |
24 | ✅ |
| Пациент A-09 upper | 1851acfea0d0.glb |
2026-07-13 16:05:53 | 4da2a33c45df… |
24 | ✅ |
| Пациент A-09 lower | ae7d0dfc2078.glb |
2026-07-13 16:07:31 | b3eaeb1793c7… |
24 | ✅ |
| Пациент A-10 upper | dbf17cdddf42.glb |
2026-07-13 16:09:24 | 0e8919f26aee… |
24 | ✅ |
| Пациент A-10 lower | 16e713dbb366.glb |
2026-07-13 16:10:42 | 4f5ee8a1965c… |
24 | ✅ |
Хронология честно: моя заморозка 15:15 (chmod 444 + базлайн v1 состояния 14:19) была перекрыта регеном-2 сессии-фиксатора (root игнорирует chmod; реген нёс фикс инварианта A-05u) — базлайн переснят (v2, 16:10), recon-accept пересняты третьим прогоном 17:0X, polish2-after уже были сняты после регена-2 (16:11–16:34).
app/artifacts.bak-cclaude-flap-20260713-154044/ (перед регеном-2;
реген-1 — …-141905/) — вернуть файлы + UPDATE scans SET preview=NULL.git revert коммитов ветки polish-pass-2 (4 шт. после c1f6190).UPDATE patients SET hidden=0 WHERE name='Пациент A-09'.qa/v2_facts.py · qa/v2_closure_check.py · qa/recon_invariants.py ·
qa/e2e_stage1.py · OUT=… qa/polish2_shots_public.py · qa/polish2_pairs.py.

































































































































































































































































































































































