[QA-trace][#221 5/7] Верификация image-captions: ФИЧА РАБОТАЕТ (0 багов) + процесс-фидбэк (verifier недо-сэмплил) #239

Closed
opened 2026-06-27 16:20:58 +03:00 by Ghost · 0 comments

Прогон 5/7 · верификация фичи PR #233 (#221 image captions) · web-test-orchestrator · 19 наблюдений → 19 verified / 0 ложных.
Вердикт фичи: РАБОТАЕТ — фича image-captions (PR #221) подтверждена end-to-end: вставка, рендер, persist через reload, редактирование, очистка, public-share read-view, markdown export/import round-trip. Сломанных путей не найдено; ни одного реального бага, ни одного фолс-позитива.
Процесс-отчёт (для отладки скилла). Без кода.

Process-trace отчёт по верификации PR #221 — image-captions (gitmost/Docmost)

Фокус: отладка СКИЛЛА web-test-orchestrator. Разбираем ПРОЦЕСС (как тестировали и проверяли), а не код фичи.

1. Сводка

Главный вопрос верификации — работает ли фича подписей к изображениям — ответ: ДА, работает.

  • Подтверждено наблюдений/находок: 19 (все с confidence=verified).
  • Реальных багов фичи: 0.
  • Фолс-позитивов: 0.
  • Из 19 находок 17 — позитивные подтверждения работы фичи и отсутствия регрессий, 2 — заметки об окружении/тулинге (не дефекты приложения): мисматч встроенного браузера Playwright и контаминация общего стенда параллельным агентом.

Скилл прошёл полный фазовый цикл (recon → caption-core → round-trip/read-view → editor-regression → independent verifier). Independent-verifier пасс был выполнен, но узко — переподтвердил из чистого состояния лишь 1 находку из 19 (наличие кнопки Caption в bubble-menu). Это главная процессная слабость данного прогона: основной массив «feature-works» остался без независимой перепроверки (см. §5).

2. Агенты и инструменты — кто что покрыл и как себя проявил

Все агенты работали через Playwright (python, headless chromium-1148 с pinned executable_path + --no-sandbox), реальный UI, со слушателями console(type=error)/pageerror/HTTP>=400 на каждом прогоне. Это общий и сильный паттерн — объективные сигналы собирались всегда.

  • recon — картирование поверхности фичи. Действия: новый note → slash /imageexpect_file_chooser().set_files() (in-memory PNG) → img.click(force=True)eval_on_selector_all('button[aria-label]'). Нашёл: кнопка Caption присутствует между Alt text и Download (count=1); путь вставки картинки через OS file-chooser актуатируем headless; нулевые load-time ошибки на авторизованном редакторе; задокументировал тулинг-пиннинг браузера. Кросс-сверка с image-menu.tsx / use-caption-control.tsx. Проявил себя как аккуратная разведка с привязкой DOM-наблюдений к исходнику.

  • caption-core — ядро функциональности. Метод вставки: реальный upload через slash /image + expect_file_chooser().set_files(test.png) (genuine /api/files/ upload, не фейковый src). DOM-оракулы: page.evaluate над .ProseMirror figure/img/figcaption — textContent + computed display + offsetHeight; reload(networkidle) для persist. Покрыл полный жизненный цикл (insert/render/persist/edit/clear), XSS/спецсимволы (a & b " c < d > e — byte-identical после reload, не интерпретируется как HTML), и тонкость DOM-гигиены: пустой <figcaption> в resizable node-view не удаляется, а скрывается display:none (косметика, не user-visible). Сильнейший агент прогона по глубине.

  • caption-roundtrip-readview — персистентность и форматный round-trip. Инструменты шире: реальный clipboard write + trusted Ctrl+V, slash /image upload реального 2x2 PNG, navigator.clipboard.readText() как markdown-export-оракул, и curl против API :3000 (login, pages/import, pages/info, shares/create). Покрыл: рендер подписи в public-share read-view из cookie-less контекста (важно — независимая непривилегированная сессия), persist через reload (Yjs/server), Copy-as-Markdown сохраняет data-caption, import через /api/pages/import восстанавливает attrs.caption, caption-less остаётся чистым, и честно зафиксировал trade-off: markdown несёт подпись только как невидимый data-caption (внешние рендереры её не покажут). Самый разноинструментальный агент — UI + API + clipboard.

  • editor-regression — проверка отсутствия регрессий от нового figure/figcaption-обёртки. Драйв через реальный UI: create page, slash, filechooser upload, bubble-menu клики, mouse drag для resize, Ctrl+C/V. Покрыл: базовый редактор (текст, h1, bullet, /table) выживает reload; resize-handles + align + float по-прежнему работают (ширина 400→250px persist); bubble-menu цел; copy/paste дублирует figure+figcaption с атрибутом caption; нулевые ошибки. Также поймал контаминацию стенда параллельным агентом и корректно обошёл её уникальным маркером (ZQX9REGRESS) + проверкой в пределах одной сессии — правильная реакция на known-condition, а не ложное обвинение приложения.

  • verifier (independent) — переподтвердил из нуля только «наличие кнопки Caption». Ценное процессное наблюдение verifier'а: тайтл и тело — разные ProseMirror-инстансы, и /image, набранный в nth(0), ошибочно создаёт страницу с заголовком «/image»; правильный путь — фокус в body (.ProseMirror nth(1)). Это полезный анти-грабли для скилла. Но сам verifier явно отметил, что проверил только presence, не функциональность/round-trip.

3. Что нашли — по классам, кем и на каком этапе

  • feature-surface-present (recon): кнопка Caption на месте, в правильной позиции меню. → подтверждено и verifier'ом.
  • insertion-path (recon): вставка картинки только через OS file-chooser, image-by-URL нет; headless актуатируется через expect_file_chooser. Закрыло риск «headless не сможет вставить картинку».
  • render/persist/edit/clear (caption-core, roundtrip): полный цикл работает; persist через reload и через Yjs/server.
  • injection/encoding (caption-core): спецсимволы lossless и не инъецируются — XSS-safe.
  • DOM-hygiene (caption-core): пустой figcaption скрывается, а не удаляется в node-view — косметика, end-user корректен.
  • read-view/public-share (roundtrip): подпись видна в непривилегированном share-view (display:block).
  • export/import/format-fidelity (roundtrip): markdown round-trip lossless внутри приложения; явный trade-off для внешних рендереров.
  • регрессии редактора (editor-regression): текст/heading/list/table, resize/align/float, copy/paste, нулевые ошибки — всё цело.
  • env/tooling (recon, editor-regression): пиннинг chromium-1148; контаминация стенда параллельным агентом — оба корректно отнесены к окружению, не к дефектам фичи.

4. Фолс-позитивы

Ноль. Ни один из агентов не выдал ложного бага. Более того, потенциально «подозрительные» наблюдения (пустой figcaption в DOM; невидимый data-caption в markdown) были сразу квалифицированы как cosmetic / заявленный trade-off, а не как дефекты — это правильная дисциплина оракула и discnfirm-by-default. Контаминация чужим контентом не была свалена на приложение. То есть классическая проблема ~85% success-hallucination здесь не сработала: claims подкреплены DOM/HTTP/clipboard-evidence.

5. Где скилл сработал, а где провалился именно на верификации фичи

Сработал:

  • Снял главный риск headless-вставки картинки: вместо отговорки «нельзя без OS-диалога» агенты реально задействовали expect_file_chooser().set_files() и грузили genuine /files/ ассеты — фича проверена на настоящем изображении, а не на подделке src.
  • Объективные сигналы (console error / pageerror / HTTP>=400) на КАЖДОМ прогоне — сильный, дешёвый, постоянный оракул.
  • Многоракурсная проверка round-trip: UI-DOM + reload + cookie-less read-view + API import/export + clipboard markdown. Read-view проверен из независимого неавторизованного контекста — это правильный «другой наблюдатель».
  • Корректная атрибуция шума окружения (пиннинг браузера, параллельный агент) к тулингу, а не к приложению.

Провалился / слабые места процесса:

  • Independent-verifier охватил 1 из 19 находок и только presence кнопки. Ядро (insert/persist/edit/clear, XSS, round-trip, регрессии) НЕ прошло независимую перепроверку из чистого состояния. При фиче, где все находки «feature-works», именно doer-verifier-расхождение и должно ловить success-hallucination — а здесь оно фактически выключено. Это самый важный пункт для отладки скилла.
  • Изоляция тестов на общем стенде не обеспечена процессно — её чинили реактивно (уникальный маркер) уже после контаминации, а не превентивно (отдельное пространство/уникальные тайтлы с самого начала). Скилл должен закладывать изоляцию в charter, а не в патч по факту.
  • Внешний markdown-рендерер (data-caption невидим в GitHub и т.п.) проверен только чтением источника/clipboard, без фактического прогона через сторонний рендерер — оракул здесь «по коду», а не «по наблюдению». Для format-fidelity это допустимо, но стоит пометить как слабый оракул.
  • Грабли «title vs body — разные ProseMirror» всплыли только у verifier'а; recon-агенты, похоже, не натыкались/не задокументировали это как риск раньше — знание получено поздно.

6. Предложения по скиллу

  1. Сделать verifier-пасс репрезентативным, а не символическим. При вердикте «всё работает» обязательно независимо переподтверждать ядро и хотя бы по одной находке каждого bugClass (persist, round-trip export/import, XSS, регрессия), а не только presence. Ввести правило: доля независимо перепроверенных находок не ниже порога, иначе вердикт = «не верифицировано».
  2. Изоляция теста — в charter, до выполнения. Уникальный namespace/префикс страниц и маркеры с самого старта на любом общем/collab-стенде; детектор контаминации (сверка innerHTML с ожидаемым маркером) как стандартный pre-check каждого прогона.
  3. Кодифицировать известные грабли стенда в SKILL.md/oracles.md: (а) title и body — отдельные ProseMirror, slash-команды только в body nth(1); (б) пиннинг chromium-1148 executable_path + --no-sandbox; (в) pre-auth 401 на /users/me и /auth/collab-token — ожидаемы, не баг.
  4. Различать оракулы «по наблюдению» и «по коду». Для format-fidelity (внешний markdown-рендер) либо реально прогнать сторонний рендерер, либо явно маркировать находку как «source-only, не наблюдалось вживую», чтобы не путать с поведенческим доказательством.
  5. Стандартизовать набор captions-оракулов для подобных фич: computed display + offsetHeight (видимость), textContent byte-compare (lossless/XSS), reload-persist, cookie-less read-view, API import/export round-trip — оформить как переиспользуемый чек-лист «editable-attr-on-node».
  6. Фиксировать «подозрительное, но не баг» отдельной категорией (cosmetic/trade-off) уже в charterе, чтобы дисциплина discnfirm была явной, а не зависела от добросовестности конкретного агента.

📌 Процесс-вывод: на all-pass верификации (фича работает) independent-verifier перепроверил лишь 1 из 19 находок — именно тут doer-verifier и должен ловить success-hallucination, а вышел почти выключен. Скилл-фидбэк: для verification-прогонов verifier должен сэмплировать репрезентативно (особенно «feature-works»-находки), а не только дешёвый presence-чек. Плюс: агенты реально грузили картинку через expect_file_chooser (не отговорились headless), объективные сигналы на каждом прогоне, read-view проверен из cookie-less контекста — 0 фолс-позитивов.

🤖 web-test-orchestrator (process-trace, feature-verify)

> **Прогон 5/7** · верификация фичи **PR #233 (#221 image captions)** · web-test-orchestrator · 19 наблюдений → 19 verified / 0 ложных. > **Вердикт фичи:** РАБОТАЕТ — фича image-captions (PR #221) подтверждена end-to-end: вставка, рендер, persist через reload, редактирование, очистка, public-share read-view, markdown export/import round-trip. Сломанных путей не найдено; ни одного реального бага, ни одного фолс-позитива. > Процесс-отчёт (для отладки скилла). Без кода. # Process-trace отчёт по верификации PR #221 — image-captions (gitmost/Docmost) _Фокус: отладка СКИЛЛА web-test-orchestrator. Разбираем ПРОЦЕСС (как тестировали и проверяли), а не код фичи._ ## 1. Сводка **Главный вопрос верификации — работает ли фича подписей к изображениям — ответ: ДА, работает.** - Подтверждено наблюдений/находок: **19** (все с confidence=verified). - Реальных багов фичи: **0**. - Фолс-позитивов: **0**. - Из 19 находок 17 — позитивные подтверждения работы фичи и отсутствия регрессий, 2 — заметки об окружении/тулинге (не дефекты приложения): мисматч встроенного браузера Playwright и контаминация общего стенда параллельным агентом. Скилл прошёл полный фазовый цикл (recon → caption-core → round-trip/read-view → editor-regression → independent verifier). Independent-verifier пасс был выполнен, но **узко** — переподтвердил из чистого состояния лишь 1 находку из 19 (наличие кнопки Caption в bubble-menu). Это главная процессная слабость данного прогона: основной массив «feature-works» остался без независимой перепроверки (см. §5). ## 2. Агенты и инструменты — кто что покрыл и как себя проявил Все агенты работали через **Playwright (python, headless chromium-1148 с pinned executable_path + `--no-sandbox`)**, реальный UI, со слушателями console(type=error)/pageerror/HTTP>=400 на каждом прогоне. Это общий и сильный паттерн — объективные сигналы собирались всегда. - **recon** — картирование поверхности фичи. Действия: новый note → slash `/image` → `expect_file_chooser().set_files()` (in-memory PNG) → `img.click(force=True)` → `eval_on_selector_all('button[aria-label]')`. Нашёл: кнопка Caption присутствует между Alt text и Download (count=1); путь вставки картинки через OS file-chooser **актуатируем headless**; нулевые load-time ошибки на авторизованном редакторе; задокументировал тулинг-пиннинг браузера. Кросс-сверка с image-menu.tsx / use-caption-control.tsx. Проявил себя как аккуратная разведка с привязкой DOM-наблюдений к исходнику. - **caption-core** — ядро функциональности. Метод вставки: реальный upload через slash `/image` + `expect_file_chooser().set_files(test.png)` (genuine `/api/files/` upload, не фейковый src). DOM-оракулы: `page.evaluate` над `.ProseMirror figure/img/figcaption` — textContent + computed `display` + `offsetHeight`; reload(networkidle) для persist. Покрыл полный жизненный цикл (insert/render/persist/edit/clear), XSS/спецсимволы (`a & b " c < d > e` — byte-identical после reload, не интерпретируется как HTML), и тонкость DOM-гигиены: пустой `<figcaption>` в resizable node-view не удаляется, а скрывается `display:none` (косметика, не user-visible). Сильнейший агент прогона по глубине. - **caption-roundtrip-readview** — персистентность и форматный round-trip. Инструменты шире: реальный clipboard write + trusted Ctrl+V, slash `/image` upload реального 2x2 PNG, `navigator.clipboard.readText()` как **markdown-export-оракул**, и `curl` против API :3000 (login, pages/import, pages/info, shares/create). Покрыл: рендер подписи в public-share read-view из **cookie-less контекста** (важно — независимая непривилегированная сессия), persist через reload (Yjs/server), Copy-as-Markdown сохраняет `data-caption`, import через `/api/pages/import` восстанавливает `attrs.caption`, caption-less остаётся чистым, и честно зафиксировал trade-off: markdown несёт подпись только как невидимый `data-caption` (внешние рендереры её не покажут). Самый разноинструментальный агент — UI + API + clipboard. - **editor-regression** — проверка отсутствия регрессий от нового figure/figcaption-обёртки. Драйв через реальный UI: create page, slash, filechooser upload, bubble-menu клики, mouse drag для resize, Ctrl+C/V. Покрыл: базовый редактор (текст, h1, bullet, /table) выживает reload; resize-handles + align + float по-прежнему работают (ширина 400→250px persist); bubble-menu цел; copy/paste дублирует figure+figcaption с атрибутом caption; нулевые ошибки. Также поймал **контаминацию стенда параллельным агентом** и корректно обошёл её уникальным маркером (ZQX9REGRESS) + проверкой в пределах одной сессии — правильная реакция на known-condition, а не ложное обвинение приложения. - **verifier (independent)** — переподтвердил из нуля только «наличие кнопки Caption». Ценное процессное наблюдение verifier'а: тайтл и тело — **разные ProseMirror-инстансы**, и `/image`, набранный в nth(0), ошибочно создаёт страницу с заголовком «/image»; правильный путь — фокус в body (`.ProseMirror nth(1)`). Это полезный анти-грабли для скилла. Но сам verifier явно отметил, что проверил только presence, не функциональность/round-trip. ## 3. Что нашли — по классам, кем и на каком этапе - **feature-surface-present** (recon): кнопка Caption на месте, в правильной позиции меню. → подтверждено и verifier'ом. - **insertion-path** (recon): вставка картинки только через OS file-chooser, image-by-URL нет; headless актуатируется через `expect_file_chooser`. Закрыло риск «headless не сможет вставить картинку». - **render/persist/edit/clear** (caption-core, roundtrip): полный цикл работает; persist через reload и через Yjs/server. - **injection/encoding** (caption-core): спецсимволы lossless и не инъецируются — XSS-safe. - **DOM-hygiene** (caption-core): пустой figcaption скрывается, а не удаляется в node-view — косметика, end-user корректен. - **read-view/public-share** (roundtrip): подпись видна в непривилегированном share-view (`display:block`). - **export/import/format-fidelity** (roundtrip): markdown round-trip lossless внутри приложения; явный trade-off для внешних рендереров. - **регрессии редактора** (editor-regression): текст/heading/list/table, resize/align/float, copy/paste, нулевые ошибки — всё цело. - **env/tooling** (recon, editor-regression): пиннинг chromium-1148; контаминация стенда параллельным агентом — оба корректно отнесены к окружению, не к дефектам фичи. ## 4. Фолс-позитивы **Ноль.** Ни один из агентов не выдал ложного бага. Более того, потенциально «подозрительные» наблюдения (пустой figcaption в DOM; невидимый `data-caption` в markdown) были сразу квалифицированы как cosmetic / заявленный trade-off, а не как дефекты — это правильная дисциплина оракула и discnfirm-by-default. Контаминация чужим контентом не была свалена на приложение. То есть классическая проблема ~85% success-hallucination здесь не сработала: claims подкреплены DOM/HTTP/clipboard-evidence. ## 5. Где скилл сработал, а где провалился именно на верификации фичи **Сработал:** - Снял главный риск headless-вставки картинки: вместо отговорки «нельзя без OS-диалога» агенты реально задействовали `expect_file_chooser().set_files()` и грузили genuine `/files/` ассеты — фича проверена на настоящем изображении, а не на подделке src. - Объективные сигналы (console error / pageerror / HTTP>=400) на КАЖДОМ прогоне — сильный, дешёвый, постоянный оракул. - Многоракурсная проверка round-trip: UI-DOM + reload + cookie-less read-view + API import/export + clipboard markdown. Read-view проверен из независимого неавторизованного контекста — это правильный «другой наблюдатель». - Корректная атрибуция шума окружения (пиннинг браузера, параллельный агент) к тулингу, а не к приложению. **Провалился / слабые места процесса:** - **Independent-verifier охватил 1 из 19** находок и только presence кнопки. Ядро (insert/persist/edit/clear, XSS, round-trip, регрессии) НЕ прошло независимую перепроверку из чистого состояния. При фиче, где все находки «feature-works», именно doer-verifier-расхождение и должно ловить success-hallucination — а здесь оно фактически выключено. Это самый важный пункт для отладки скилла. - **Изоляция тестов на общем стенде** не обеспечена процессно — её чинили реактивно (уникальный маркер) уже после контаминации, а не превентивно (отдельное пространство/уникальные тайтлы с самого начала). Скилл должен закладывать изоляцию в charter, а не в патч по факту. - **Внешний markdown-рендерер** (data-caption невидим в GitHub и т.п.) проверен только чтением источника/clipboard, без фактического прогона через сторонний рендерер — оракул здесь «по коду», а не «по наблюдению». Для format-fidelity это допустимо, но стоит пометить как слабый оракул. - Грабли «title vs body — разные ProseMirror» всплыли только у verifier'а; recon-агенты, похоже, не натыкались/не задокументировали это как риск раньше — знание получено поздно. ## 6. Предложения по скиллу 1. **Сделать verifier-пасс репрезентативным, а не символическим.** При вердикте «всё работает» обязательно независимо переподтверждать ядро и хотя бы по одной находке каждого bugClass (persist, round-trip export/import, XSS, регрессия), а не только presence. Ввести правило: доля независимо перепроверенных находок не ниже порога, иначе вердикт = «не верифицировано». 2. **Изоляция теста — в charter, до выполнения.** Уникальный namespace/префикс страниц и маркеры с самого старта на любом общем/collab-стенде; детектор контаминации (сверка innerHTML с ожидаемым маркером) как стандартный pre-check каждого прогона. 3. **Кодифицировать известные грабли стенда** в SKILL.md/oracles.md: (а) title и body — отдельные ProseMirror, slash-команды только в body nth(1); (б) пиннинг chromium-1148 executable_path + `--no-sandbox`; (в) pre-auth 401 на /users/me и /auth/collab-token — ожидаемы, не баг. 4. **Различать оракулы «по наблюдению» и «по коду».** Для format-fidelity (внешний markdown-рендер) либо реально прогнать сторонний рендерер, либо явно маркировать находку как «source-only, не наблюдалось вживую», чтобы не путать с поведенческим доказательством. 5. **Стандартизовать набор captions-оракулов** для подобных фич: computed `display` + `offsetHeight` (видимость), textContent byte-compare (lossless/XSS), reload-persist, cookie-less read-view, API import/export round-trip — оформить как переиспользуемый чек-лист «editable-attr-on-node». 6. **Фиксировать «подозрительное, но не баг» отдельной категорией** (cosmetic/trade-off) уже в charterе, чтобы дисциплина discnfirm была явной, а не зависела от добросовестности конкретного агента. --- 📌 **Процесс-вывод:** на all-pass верификации (фича работает) independent-verifier перепроверил лишь 1 из 19 находок — именно тут doer-verifier и должен ловить success-hallucination, а вышел почти выключен. **Скилл-фидбэк:** для verification-прогонов verifier должен сэмплировать репрезентативно (особенно «feature-works»-находки), а не только дешёвый presence-чек. Плюс: агенты реально грузили картинку через `expect_file_chooser` (не отговорились headless), объективные сигналы на каждом прогоне, read-view проверен из cookie-less контекста — 0 фолс-позитивов. 🤖 web-test-orchestrator (process-trace, feature-verify)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#239