Источник: аудит 2026-07-10, находка A-6
Контекст
Backend покрыт (1000+ тестов), фронтенд (app.js, ~1121 строка, 41
использование innerHTML) не тестируется вообще. esc() централизован
(issue #214), но каждое из 41 мест гарантируется только ревью. В DOM попадает
управляемый решением текст (stdout/stderr).
Проблема
Нет автоматической защиты от регрессии XSS/вёрстки во фронтенд-слое; изменения
в app.js проходят только визуальным ревью.
Предлагаемое решение
- Опциональная dev-группа
e2e в [project.optional-dependencies]
(playwright>=1.40) — согласовать с запретом CLAUDE.md на новые
зависимости: это dev-extra, в runtime не попадает; зафиксировать решение
в тексте PR.
- 4 journey: (1) режим 2 — грейдинг папки, таблица и detail-вкладка;
(2) режим 1 — пикер файла, редактирование, сохранение, запуск;
(3) глоссарий — поиск и карточка; (4) command palette открывается и
исполняет команду.
- XSS-регрессия: решение с
print('``<img src=x onerror=window.__xss=1>``') →
после рендера window.__xss === undefined и в detail-вкладке текст, не
элемент img.
- CI: отдельный job (Linux only), не в общую матрицу, допустимо
continue-on-error: false, кэш браузера. Внимание: правка workflow —
только в рамках этого issue как явной задачи (снимает запрет CLAUDE.md).
Acceptance criteria
Затронутые файлы
pyproject.toml, .github/workflows/ci.yml (явно в рамках этого issue),
новая директория tests/e2e/, README.md, CONTRIBUTING.md.
Тесты
Сами 4 journey + XSS-регрессия — это и есть предмет issue.
Документация
README/CONTRIBUTING — инструкция по запуску e2e.
Зависимости
Независим; после #262 (A-5) добавить journey для runs (отдельным PR).
Источник: аудит 2026-07-10, находка A-6
Контекст
Backend покрыт (1000+ тестов), фронтенд (
app.js, ~1121 строка, 41использование
innerHTML) не тестируется вообще.esc()централизован(issue #214), но каждое из 41 мест гарантируется только ревью. В DOM попадает
управляемый решением текст (stdout/stderr).
Проблема
Нет автоматической защиты от регрессии XSS/вёрстки во фронтенд-слое; изменения
в
app.jsпроходят только визуальным ревью.Предлагаемое решение
e2eв[project.optional-dependencies](
playwright>=1.40) — согласовать с запретом CLAUDE.md на новыезависимости: это dev-extra, в runtime не попадает; зафиксировать решение
в тексте PR.
(2) режим 1 — пикер файла, редактирование, сохранение, запуск;
(3) глоссарий — поиск и карточка; (4) command palette открывается и
исполняет команду.
print('``<img src=x onerror=window.__xss=1>``')→после рендера
window.__xss === undefinedи в detail-вкладке текст, неэлемент
img.continue-on-error: false, кэш браузера. Внимание: правка workflow —только в рамках этого issue как явной задачи (снимает запрет CLAUDE.md).
Acceptance criteria
pip install -e ".[e2e]",playwright install chromium, команда запуска).Затронутые файлы
pyproject.toml,.github/workflows/ci.yml(явно в рамках этого issue),новая директория
tests/e2e/,README.md,CONTRIBUTING.md.Тесты
Сами 4 journey + XSS-регрессия — это и есть предмет issue.
Документация
README/CONTRIBUTING — инструкция по запуску e2e.
Зависимости
Независим; после #262 (A-5) добавить journey для runs (отдельным PR).