[QA-trace][#119 2/7] Процесс-отчёт прогона web-test-orchestrator (git-sync) — стабильность vs прогон 1 #236
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Process-trace QA отчёт — PR #119 «native two-way git-sync» (gitmost / Docmost fork)
Фокус отчёта — НЕ конкретный баговый код, а ПРОЦЕСС работы skill
web-test-orchestrator: какие агенты/инструменты отработали, какой КЛАСС бага каждый нашёл, КАК и на каком ЭТАПЕ он всплыл, и КТО системно фолс-позитивит. Это материал для отладки самого скилла.1. Сводка прогона
Стадии (как шёл конвейер):
recon → mapping → charters (6 слайсов-персон) → execution (Whittaker-туры) → oracle-eval (FEW HICCUPPS + дешёвые объективные сигналы: console-errors, HTTP 4xx/5xx, failed-requests, пустые тела, git-clone ground-truth) → independent Doer-Verifier pass → report.
Агентов: 8 ролей —
recon+ 6 слайс-агентов (editor-content QA/note-taker,tree-nav QA/organizer,share-search-settings QA/power-user,ai-chat-ui QA,git-roundtrip-tester,dual-edit-tester) +verifier.Воронка находок:
Тяжесть подтверждённого: 2×HIGH (callout-strip data-loss; same-line dual-edit wedge всей синхры), несколько medium (callout-type flatten, body-duplication, AI-chat misleading error), остальное low (console-noise, render-stale).
2. Какие агенты/инструменты отработали
recon — карта приложения + базовые оракулы.
Инструменты: Playwright (python sync_api, headless chromium через явный
executable_pathна chromium-1148), Bash+git для smart-HTTP clone волта, Read скриншотов/исходников, grep/find для маппинга кода.Проявил себя: первый же скрипт упал на запуске (нашёл tooling-mismatch), затем поймал login-race и зафиксировал правило «гейтиться на post-login URL/cookie, а не на networkidle» — это правило спасло остальные слайсы. Подтвердил console.error-флуд на cold-mount редактора. Чистый, без продуктовых FP.
editor-content QA (note-taker) — содержимое страниц, редактор, round-trip в git.
Инструменты: Playwright (console+network+pageerror listeners; eval_on_selector структурные/innerHTML снимки; TIMED innerText sampling t+0.3/1/2/3/5/8/9s; полностраничные скриншоты), Bash
git cloneволта как out-of-band ground truth + idle re-clone monitor (3×20s), API cookie-login через http.cookiejar (обход login-429).Проявил: его TIMED-сэмплинг — единственный способ поймать «нода исчезает на холостом ходу между t+3 и t+5s». Сильный по data-loss/duplication, но дал 1 FP на input-shortcut-классе (см. §4).
tree-nav QA (organizer) — дерево навигации, move/trash/restore, DnD.
Инструменты: Playwright (create page/subpage, chevron collapse/expand, node-menu move-to-trash, restore+confirm-modal, native-DnD mouse down/move/up →
/pages/move200, reloads, свежие контексты), in-pagefetch()с credentials к бэкенду (/pages/sidebar-pages,/pages/trash,/pages/tree,/pages/breadcrumbs) как out-of-band оракул, git clone волта, console/pageerror/HTTP≥400 на каждой странице, чтение исходников дерева.Проявил: образцовая дисциплина — дважды поймал СОБСТВЕННЫЙ would-be high-sev FP (виртуализованное дерево; пропущенный клик confirm-modal) и сам их дисконфёрмил триангуляцией с бэкендом. Реальный баг отдал только один (atomFamily deprecation).
share-search-settings QA (power-user) — публичный share, spotlight-поиск, SSR/crawler.
Инструменты: Playwright (storage_state reuse; console/pageerror/requestfailed + HTTP≥400; frame-by-frame DOM poll ~12ms input.value vs results), curl + urllib/http.client для прямых API и SSR-пути на :3000 (302/404, Googlebot UA), grep+Read исходников share/search.
Проявил: микро-поллинг кадров поймал stale-render, который verifier потом подтвердил и даже повысил (speculative→verified). 0 FP.
ai-chat-ui QA — AI-чат UI/стрим.
Инструменты: Playwright (инжект authToken cookie для обхода 429; console/response/requestfailed/pageerror; клик floating-кнопки, send via Enter; проверка badge/composer/disabled; скриншоты), curl (POST
/api/ai-chat/streamнапрямую, 3× тайминги ~0.11s), Postgres через docker-exec psql (workspaces.settings→ai, ai_chats, ai_chat_messages), серверный лог через/proc/<pid>/fd, noderequire.resolve/ESM-probe для подтверждения mcp build-mismatch, чтение клиент+сервер исходников.Проявил: самая глубокая триангуляция (тайминг → DB → исходники → build-probe). Все 3 находки реальны, 0 FP. Эталон по «докопаться до root-cause, а не до симптома».
git-roundtrip-tester — двусторонний git↔docmost round-trip.
Инструменты: Playwright (chromium-1148 via executable_path+--no-sandbox; cookie state.json), Bash git (clone/edit .md/commit/fetch+rebase/push/reset --hard pulls волта), curl для API-токена (обход login rate-limit), console+response(4xx/5xx), websocket(:3001/collab) readiness, скриншоты, reload-still-present после каждого save.
Проявил: классический git-export-оракул (автор .md → push → wait → fetch/reset → diff). Поймал fidelity-loss и contention-503. 0 FP, одна находка повышена verifier'ом.
dual-edit-tester — конкурентные правки одной строки с двух сторон.
Инструменты: Playwright (живой collab-редактор, постановка курсора по тексту, body vs title editor, наблюдение git→editor live-апдейтов), REST API
/api/pages/info,/api/spaces/info, Bash git + SERVER-VAULT forensics (git -C <vault> status --porcelain,ls-files -u,.git/MERGE_HEAD,git show <branch>:file,git log), инспекция серверных логов двух инстансов, чтение cycle.ts/pull.ts/yjs-body-merge.ts.Проявил: нашёл флагманский HIGH (wedge всей синхры) благодаря серверной форензике волта — то, чего никакой UI-оракул не увидит. Но он же — главный фолс-позитивщик (§4): второй финдинг verifier дисконфёрмил.
verifier (independent Doer-Verifier pass) — анти-галлюцинация.
Инструменты: повторял находки независимо — Playwright clean-context reloads, контрольные документы (table-doc vs plain-doc; top-level fence vs list fence), свежий git clone +
git log/git showпо ревизиям sync-коммитов, psql, curl, frame-poll, чтение исходников.Проявил: убил 2 FP, повысил 2 speculative, переписал механизм у 2 подтверждённых (premise неверен — артефакт реален). Ключевой элемент, без него прошли бы 2 ложных high/medium-звучащих финдинга.
3. Найденные баги — по КЛАССУ
DATA-LOSS (silent)
AVAILABILITY / SILENT-WEDGE (отдельный класс — самый опасный)
IDEMPOTENCY / ДУБЛИРОВАНИЕ
git log0→1→2 по последовательным sync-коммитам и поправил premise («в редакторе одна копия» — на деле тоже две).ROUNDTRIP-FIDELITY
[!tip]/[!note]/[!important]/[!caution]/[!question]после импорта/ре-сериализации схлопываются в[!info]; выживают только info/warning/danger/success. Найден: git-roundtrip-tester — авторский .md с 9 типами → push → wait ~20s → fetch/reset →grep -oдал 1:1 маппинг; verifier воспроизвёл независимо.SILENT-FAILURE / MISLEADING-ERROR / DIAGNOSABILITY
{"error":"Internal server error"}) + трассировка post-hijack в исходниках; verifier подтвердил по отсутствию; charset=utf-8на 500 (отпечаток raw-socket write).CONTENTION / TRANSIENT
RENDERING / CONSOLE-NOISE
ORACLE-CONTAMINATION (процессная находка, не баг продукта)
/pages/sidebar-pages(360 root pages) + grep useVirtualizer. Записан как урок для скилла.ENV / TOOLING
3b. Кто что нашёл (finding → агент → класс → вердикт)
4. ФОЛС-ПОЗИТИВЫ — кто и насколько (ключевой раздел)
Считаем по продуктовым находкам, прошедшим через verifier (env-ограничения и self-caught FP-hazard не штрафуем — это корректная классификация).
Системно фолс-позитивят:
js; list-причина опровергнута grep'ом по волту). Класс ошибки: conflation двух феноменов + причинно-следственная гипотеза без контроля. При этом его data-loss/duplication находки безупречны.Надёжные агенты:
Важно про verifier: он не только убивает FP (2), но и СПАСАЕТ недооценённое (fast-close и share-stale подняты speculative→verified) и ЧИНИТ механизм у верных находок (body-dup, share-stale-атрибуция). То есть verifier работает в обе стороны — и анти-галлюцинация, и анти-недооценка.
5. Где скилл сработал/провалился
Сработал именно ПРОЦЕСС (а не везение):
Чуть не упустил / провалился:
6. Предложения по улучшению скилла
Оракулы:
Charters / дисциплина агентов:
5. Кодифицировать «tree-nav discipline» во все charters: прежде чем репортить loss/ghost — доказать, что мутация реально дошла до бэкенда (проверить API), а наблюдение сделано НЕ в idle-окне под нагрузкой sync.
6. Для git-sync charters явно предупредить: «remote main двигается сам каждые 1-2s из-за автокоммитов docmost;
fetch first-rejection — НОРМА, а не маскировка». Это убрало бы 50% FP dual-edit-тестера.7. Запретить conflation: одна находка = один воспроизводимый феномен; если два симптома, развести их и дать каждому свой контроль (кейс fence).
Verifier-гейты:
8. Любой финдинг с severity≥medium, у которого корень = «сломан сервер/масштабное состояние», обязан пройти повторение под нагрузкой (а не в idle-окне) — именно это развалило dual-edit FP.
9. Verifier должен явно проверять premise/механизм, а не только наличие артефакта — у 3 находок артефакт верен, объяснение нет; в отчёт должен идти исправленный механизм.
10. Verifier должен уметь повышать (speculative→verified), а не только убивать — иначе fast-close и share-stale ушли бы недооценёнными.
Окружение / дедуп:
11. Решить login-429 централизованно один раз на прогон (общий curl-минтинг authToken + reuse storage_state), а не заставлять каждый слайс изобретать обход — экономия времени и снятие риска ложного «приложение не аутентифицирует».
12. Дедуп console-noise: flushSync (cold-mount + table) и atomFamily всплыли у трёх агентов независимо — добавить общий «known-console-noise» реестр, чтобы агенты не репортили одно и то же трижды как новое.
13. Зафиксировать в окружении executable_path к chromium-1148 как дефолт, чтобы recon не падал на старте каждого прогона.
✅ Мета-фидбэк: этот прогон НЕ завис — добавленный per-agent timeout (9 мин) + timebox в verify сработали (в прогоне 1 один verifier висел 5.5ч). Рекомендация в скилл подтверждена практикой.
🤖 web-test-orchestrator (process-trace)