web-app-followups: 46 отложенных пунктов веб-приложения (#29) #33

Merged
aep merged 19 commits from feat/29-web-app-followups into main 2026-10-15 09:22:27 +03:00
Owner

Закрывает #29 (Follow-ups from #21) — все 46 пунктов одним change web-app-followups.

Спека: openspec/changes/web-app-followups/ (дельты web-app — 6 MODIFIED, hub-api — MODIFIED «Раздача веб-приложения»).
План: docs/superpowers/plans/2026-10-15-web-app-followups.md (8 задач, SDD).

Что меняется для пользователя

  • Доска: после перехода в карточку задачи (ⓘ) и возврата — по ссылке «Доска» или кнопкой «Назад» браузера — прокрутка остаётся на месте.
  • Строка «пакет #N выполняется» больше не пропадает после «Перечитать» и после загрузки файла. При показанном снимке из файла недоступный хаб даёт строку «хаб не отвечает — на доске снимок из файла». Подхватывается только пакет обновления из Jira.
  • Вход: если хаб отверг проверку токена (4xx), виден текст хаба, а не «хаб не отвечает». Запоздавший 401 на старый токен после входа с новым не выбрасывает на экран входа.
  • Задачи: значение фильтра из адреса, которого нет среди вариантов, видно в списке с пометкой «(нет на доске)». Ссылки в карточке задачи — цветом темы. При пустом списке команд — текст «команд по задаче не было».
  • Шрифты IBM Plex входят в сборку, обращений в интернет нет. source-map-js поднят до 1.2.2 через overrides.
  • Хаб: путь /app/assets/… с нулевым байтом — 404, а не 500.
  • Хаб работает на Python 3.13 от uv вместо miniconda (O-14, R-11). В SQLite 3.51.1 из miniconda есть взаимная блокировка, от которой хаб намертво зависал под параллельными запросами. Это касается и живого хаба (см. «После merge»).

Таблица 46 пунктов #29

Маркер Что Статус
#29/T1.1 404 на NUL в пути /app/assets fixed 2024a66
#29/T1.4 тест Content-Type для svg/png/ico/woff2/map fixed 2024a66
#29/T16.1 дубль import urllib.* fixed 2024a66
#29/T3.2 4xx на входе — текст ошибки хаба fixed ab3b050
#29/T3.3 тест 401, тесты queryClient/queries fixed ab3b050, bb3ddd1 (queries, M-7)
#29/T3.4 token.test проверяет removeItem при закрытом хранилище fixed ab3b050
#29/T3.5 токен в AuthError, запоздавший 401 игнорируется fixed ab3b050
#29/T3.6 интеграционный тест AuthError → экран входа fixed ab3b050
#29/T10.1 без лишнего GET /batches после своего пакета fixed 841ce4e
#29/T10.3 строка пакета не стирается «Перечитать»/файлом fixed 841ce4e
#29/T10.4 «хаб не отвечает — на доске снимок из файла» fixed 841ce4e, bb3ddd1 (I-2)
#29/T10.5 тест «поздний ответ хаба после файла» fixed 841ce4e
#29/T10.6 подхват только пакета refresh fixed 841ce4e
#29/M-3 прокрутка доски после возврата fixed 960a71d, d545967; хране��ие снимка/события между страницами — rejected (решение владельца)
#29/T11.1 memo карточек срабатывает (сравнение box по значению) fixed 960a71d
#29/T11.2 отмена requestAnimationFrame в DatesBar fixed 960a71d
#29/T11.3 тест перетаскивания дорожки fixed 960a71d
#29/T11.4 точные проверки в тестах I-2/I-3 fixed 960a71d (ширина в jsdom слабая, полная проверка — e2e geometry)
#29/T12.1 onOpen() вне updater setOpen fixed 960a71d
#29/T12.2 writeFlag/writeHidden вне updater fixed 960a71d
#29/T12.3 зависимости эффекта шапки, сброс --head-h fixed 960a71d
#29/T12.4 MultiSelect: role="group" вместо listbox без option fixed 960a71d
#29/T13.1 значение фильтра вне вариантов fixed 6940da5
#29/O-10 ссылки карточки задачи цветом темы fixed 6940da5, a002812
#29/O-11 «команд по задаче не было» fixed 6940da5
#29/T14.2 waitFor вместо пауз 20 мс fixed 6940da5
#29/T14.3 уникальный id datalist (useId) fixed 6940da5
#29/T2.1 canon.ts без локали fixed dd95e85
#29/T5.1 сценарий saved-short для обрезки заголовков fixed dd95e85
#29/T6.3 прямые тесты util.ts fixed dd95e85
#29/T7.1 initialWho считает whoItems один раз fixed dd95e85, тест bb3ddd1 (M-6)
#29/T9.1 colWidths() пропускает только конечные числа fixed dd95e85
#29/T9.3 тесты хранилища (дорожки, сброс, имя файла, mode=all, закрытое хранилище) fixed dd95e85
#29/T9.4 порядок импортов fromJson.ts fixed dd95e85
#29/T2.2 шрифты из @fontsource fixed 4160dd8
#29/O-1 overrides source-map-js 1.2.2 fixed 4160dd8
#29/T4.1 e2e «Задачи и обратно» fixed 4160dd8
#29/T4.2 тест ссылок страницы «не найдено» fixed 4160dd8
#29/T4.3 убран App.Layout fixed 4160dd8
#29/T4.4 один импорт @testing-library/react fixed 4160dd8
#29/T4.5 очистка атрибутов в theme.test fixed 4160dd8
#29/T15.1 высота карточек в geometry не по формуле fixed 4160dd8 (ослаблено, R-9)
#29/T15.2 растяжка через expect.poll без литерала 240 fixed 4160dd8
#29/T15.4 порт e2e — одна константа fixed 4160dd8
#29/T15.6 проверка свободного порта в test-hub.sh fixed 4160dd8
#29/M-5 сборка приложения в wheel rejected: хаб запускается из checkout (uv run --project), wheel не используется (R-7)

Новые находки этого change

Маркер Что Статус
T1.1 опечатка форматирования в test_api.py fixed 091acda
T1.2 трейлер Haiku у 2024a66 rejected (R-8)
T1.3 тест типов не покрывает .js/.css/fallback rejected: покрыто соседними тестами
T2.1 report() в useBoardSource без теста 401 fixed 841ce4e
T2.2 ApiError без detail показывает сырой error rejected: допустимо
T2.3 комментарий queryClient.ts неточен fixed bb3ddd1 (M-4)
T3.1 подхват берёт первый queued/running пакет, кандидатов не перебирает deferred (= M-10)
T3.2 skipPickup может израсходовать параллельный reload rejected: безвредно, подхватится при следующей загрузке
T3.3 тест возврата не считает GET /batches/7 deferred
T3.4 стиль тестов fixed bb3ddd1 (M-11)
T4.1 toggle/toggleHidden считают из замыкания prefs (два клика в одном батче) deferred (= M-15)
T4.2 прокрутка не привязана к составу выборки rejected: R-1, браузер сам ужимает
T4F.1 w && при w === null отключает защиту rejected: недостижимо (= M-14)
T4F.2 потеря последнего кадра scroll rejected: неосуществимо
T5.1, T5.4 класс ветки 404, подпись фильтра fixed a002812
T5.2, T5.3 waitFor в тестах IssuePage rejected: надёжнее пауз, не регресс
T5.5 waitFor после resolve проходит сразу fixed bb3ddd1 (M-5)
T6.1 часть тестов без строгого RED rejected: покрытие существующего поведения
T6.2 нет теста T7.1 именно на initialWho fixed bb3ddd1 (M-6)
T6.3 canon общий для записи и сравнения rejected: информационно
T7.1 дефолт PORT в test-hub.sh дублирует HUB_PORT fixed bb3ddd1 (M-16, комментарий)
T7.2 ожидание двух кадров в e2e M-3 rejected: тест переписан на реальный щелчок (d545967)
T7.3 нет диагностики зависания хаба fixed bb3ddd1 (stdout/stderr pipe)
T7.4 some(h !== 120) слабо rejected (R-9)
C — нет
I-1 серия e2e на финальном HEAD fixed 447d878 (причина зависаний — O-14)
I-2 fromFile при «Обновить из Jira» из файла fixed bb3ddd1
M-1…M-8, M-11 (дешёвая часть), M-13, M-16, M-17, M-18 тесты, комментарии, спека fixed bb3ddd1
M-9 пакет завершился, пока пользователь был в карточке, — снимок не перечитывается deferred
M-10 = T3.1 deferred
M-11 (часть) вынести хелпер deferred в src/test deferred
M-12 мёртвый экспорт Opt deferred
M-14 = T4F.1 rejected: недостижимо
M-15 = T4.1 deferred
O-12 трейлер Haiku у Task 1 rejected (R-8)
O-13 исполнители T2/T4/T7 не вызывали codegraph rejected: без последствий (M-17)
O-14 зависание тестового хаба :8791 в e2e fixed 447d878 (R-11)
O-15 e2e M-3 падал на dd95e85 fixed d545967 (тест-артефакт, R-10)
O-16 после перезагрузки страницы подхваченный пакет теряет пометку «агент офлайн» (было и до #29) deferred
O-17 финальный отчёт контроллера без построчной таблицы 46 пунктов fixed: таблица в этом описании

Rulings I made

Все записаны в openspec/changes/web-app-followups/design.md, раздел «Decisions made without discussion».

  • R-1…R-7 — рулинги спеки (прокрутка в памяти модуля, тип пакета через GET /batches/{id}, игнор запоздавшего 401, пометка «(нет на доске)», overrides, сценарий saved-short, M-5 rejected).
  • R-8: коммит 2024a66 с трейлером Haiku не переписывается, он уже запушен. Цена: одно имя модели в истории не то; при желании — rebase перед merge.
  • R-9: T15.1 закрыт через some(h !== 120), потому что на hub-basic все карточки по 152px. Цена: e2e не поймает одинаковую, но не 120px, высоту.
  • R-10: провал ручной проверки прокрутки — артефакт сценария: locator.click() по карточке под шапкой или вне окна сам прокручивает страницу. В продукте добавлена защита isConnected, e2e переписан на клик по видимой карточке. Я перепроверил вручную обычным щелчком мыши: возврат по «Доска» и «Назад» браузера — прокрутка 400 → 400.
  • R-11: O-14 — взаимная блокировка SQLite 3.51.1 (miniconda), а не дефект приложения. Хаб переведён на Python 3.13 от uv (SQLite 3.50.4): .python-version, [tool.uv] python-preference = "only-managed", тест-сторож на версию SQLite. На старом окружении хаб зависал на 3-м и 5-м прогонах, на новом — 20 прогонов подряд без зависаний. Python 3.14 не взят: в нём меняется поведение Path.is_dir() при отказе доступа (падает тест реле).

Deferred → follow-up issue после merge

  • T3.1 / M-10 — подхват не перебирает пакеты-кандидаты.
  • T3.3 — тест возврата не считает GET /batches/{id}.
  • T4.1 / M-15 — toggle в useBoardPrefs из замыкания (два клика в одном батче).
  • M-9 — пакет завершился, пока пользователь был в карточке задачи, — снимок не перечитывается.
  • M-11 (часть) — хелпер deferred в src/test.
  • M-12 — мёртвый экспорт Opt.
  • O-16 — подхваченный после перезагрузки пакет теряет «агент офлайн».

Проверки

  • make check: pytest 258, vitest 175 — зелёные.
  • e2e: 10 прогонов подряд на 447d878 — 10 из 10 зелёные (13 тестов, ~10 с прогон).
  • openspec validate web-app-followups --strict — valid.
  • Ручной проход в Playwright на тестовом хабе :8791: шрифты из сборки (внешних запросов 0), прокрутка после ⓘ → «Доска» и «Назад», строка пакета после «Перечитать» и перезагрузки, фильтр «(нет на доске)», ссылки цветом темы, «команд по задаче не было», NUL в пути → 404.

После merge (владелец)

  1. В основном checkout: git pull --ff-only, make web.
  2. launchctl kickstart -k gui/$(id -u)/ru.aepif.jira-hub — при первом запуске uv run сам скачает Python 3.13 от uv и пересоздаст .venv (нужен интернет, около минуты).
  3. Проверить: /app/board открывается.

🤖 Generated with Claude Code

Закрывает #29 (Follow-ups from #21) — все 46 пунктов одним change `web-app-followups`. Спека: `openspec/changes/web-app-followups/` (дельты `web-app` — 6 MODIFIED, `hub-api` — MODIFIED «Раздача веб-приложения»). План: `docs/superpowers/plans/2026-10-15-web-app-followups.md` (8 задач, SDD). ## Что меняется для пользователя - Доска: после перехода в карточку задачи (ⓘ) и возврата — по ссылке «Доска» или кнопкой «Назад» браузера — прокрутка остаётся на месте. - Строка «пакет #N выполняется» больше не пропадает после «Перечитать» и после загрузки файла. При показанном снимке из файла недоступный хаб даёт строку «хаб не отвечает — на доске снимок из файла». Подхватывается только пакет обновления из Jira. - Вход: если хаб отверг проверку токена (4xx), виден текст хаба, а не «хаб не отвечает». Запоздавший 401 на старый токен после входа с новым не выбрасывает на экран входа. - Задачи: значение фильтра из адреса, которого нет среди вариантов, видно в списке с пометкой «(нет на доске)». Ссылки в карточке задачи — цветом темы. При пустом списке команд — текст «команд по задаче не было». - Шрифты IBM Plex входят в сборку, обращений в интернет нет. `source-map-js` поднят до 1.2.2 через `overrides`. - Хаб: путь `/app/assets/…` с нулевым байтом — 404, а не 500. - **Хаб работает на Python 3.13 от uv вместо miniconda (O-14, R-11).** В SQLite 3.51.1 из miniconda есть взаимная блокировка, от которой хаб намертво зависал под параллельными запросами. Это касается и живого хаба (см. «После merge»). ## Таблица 46 пунктов #29 | Маркер | Что | Статус | |---|---|---| | #29/T1.1 | 404 на NUL в пути `/app/assets` | fixed 2024a66 | | #29/T1.4 | тест Content-Type для svg/png/ico/woff2/map | fixed 2024a66 | | #29/T16.1 | дубль `import urllib.*` | fixed 2024a66 | | #29/T3.2 | 4xx на входе — текст ошибки хаба | fixed ab3b050 | | #29/T3.3 | тест 401, тесты `queryClient`/`queries` | fixed ab3b050, bb3ddd1 (queries, M-7) | | #29/T3.4 | `token.test` проверяет `removeItem` при закрытом хранилище | fixed ab3b050 | | #29/T3.5 | токен в `AuthError`, запоздавший 401 игнорируется | fixed ab3b050 | | #29/T3.6 | интеграционный тест AuthError → экран входа | fixed ab3b050 | | #29/T10.1 | без лишнего `GET /batches` после своего пакета | fixed 841ce4e | | #29/T10.3 | строка пакета не стирается «Перечитать»/файлом | fixed 841ce4e | | #29/T10.4 | «хаб не отвечает — на доске снимок из файла» | fixed 841ce4e, bb3ddd1 (I-2) | | #29/T10.5 | тест «поздний ответ хаба после файла» | fixed 841ce4e | | #29/T10.6 | подхват только пакета `refresh` | fixed 841ce4e | | #29/M-3 | прокрутка доски после возврата | fixed 960a71d, d545967; хране��ие снимка/события между страницами — rejected (решение владельца) | | #29/T11.1 | `memo` карточек срабатывает (сравнение box по значению) | fixed 960a71d | | #29/T11.2 | отмена `requestAnimationFrame` в `DatesBar` | fixed 960a71d | | #29/T11.3 | тест перетаскивания дорожки | fixed 960a71d | | #29/T11.4 | точные проверки в тестах I-2/I-3 | fixed 960a71d (ширина в jsdom слабая, полная проверка — e2e geometry) | | #29/T12.1 | `onOpen()` вне updater `setOpen` | fixed 960a71d | | #29/T12.2 | `writeFlag`/`writeHidden` вне updater | fixed 960a71d | | #29/T12.3 | зависимости эффекта шапки, сброс `--head-h` | fixed 960a71d | | #29/T12.4 | MultiSelect: `role="group"` вместо `listbox` без `option` | fixed 960a71d | | #29/T13.1 | значение фильтра вне вариантов | fixed 6940da5 | | #29/O-10 | ссылки карточки задачи цветом темы | fixed 6940da5, a002812 | | #29/O-11 | «команд по задаче не было» | fixed 6940da5 | | #29/T14.2 | `waitFor` вместо пауз 20 мс | fixed 6940da5 | | #29/T14.3 | уникальный id `datalist` (`useId`) | fixed 6940da5 | | #29/T2.1 | `canon.ts` без локали | fixed dd95e85 | | #29/T5.1 | сценарий `saved-short` для обрезки заголовков | fixed dd95e85 | | #29/T6.3 | прямые тесты `util.ts` | fixed dd95e85 | | #29/T7.1 | `initialWho` считает `whoItems` один раз | fixed dd95e85, тест bb3ddd1 (M-6) | | #29/T9.1 | `colWidths()` пропускает только конечные числа | fixed dd95e85 | | #29/T9.3 | тесты хранилища (дорожки, сброс, имя файла, `mode=all`, закрытое хранилище) | fixed dd95e85 | | #29/T9.4 | порядок импортов `fromJson.ts` | fixed dd95e85 | | #29/T2.2 | шрифты из `@fontsource` | fixed 4160dd8 | | #29/O-1 | `overrides` source-map-js 1.2.2 | fixed 4160dd8 | | #29/T4.1 | e2e «Задачи и обратно» | fixed 4160dd8 | | #29/T4.2 | тест ссылок страницы «не найдено» | fixed 4160dd8 | | #29/T4.3 | убран `App.Layout` | fixed 4160dd8 | | #29/T4.4 | один импорт `@testing-library/react` | fixed 4160dd8 | | #29/T4.5 | очистка атрибутов в `theme.test` | fixed 4160dd8 | | #29/T15.1 | высота карточек в geometry не по формуле | fixed 4160dd8 (ослаблено, R-9) | | #29/T15.2 | растяжка через `expect.poll` без литерала 240 | fixed 4160dd8 | | #29/T15.4 | порт e2e — одна константа | fixed 4160dd8 | | #29/T15.6 | проверка свободного порта в `test-hub.sh` | fixed 4160dd8 | | #29/M-5 | сборка приложения в wheel | rejected: хаб запускается из checkout (`uv run --project`), wheel не используется (R-7) | ## Новые находки этого change | Маркер | Что | Статус | |---|---|---| | T1.1 | опечатка форматирования в test_api.py | fixed 091acda | | T1.2 | трейлер Haiku у 2024a66 | rejected (R-8) | | T1.3 | тест типов не покрывает .js/.css/fallback | rejected: покрыто соседними тестами | | T2.1 | `report()` в useBoardSource без теста 401 | fixed 841ce4e | | T2.2 | ApiError без detail показывает сырой `error` | rejected: допустимо | | T2.3 | комментарий queryClient.ts неточен | fixed bb3ddd1 (M-4) | | T3.1 | подхват берёт первый queued/running пакет, кандидатов не перебирает | deferred (= M-10) | | T3.2 | skipPickup может израсходовать параллельный reload | rejected: безвредно, подхватится при следующей загрузке | | T3.3 | тест возврата не считает `GET /batches/7` | deferred | | T3.4 | стиль тестов | fixed bb3ddd1 (M-11) | | T4.1 | toggle/toggleHidden считают из замыкания `prefs` (два клика в одном батче) | deferred (= M-15) | | T4.2 | прокрутка не привязана к составу выборки | rejected: R-1, браузер сам ужимает | | T4F.1 | `w &&` при `w === null` отключает защиту | rejected: недостижимо (= M-14) | | T4F.2 | потеря последнего кадра scroll | rejected: неосуществимо | | T5.1, T5.4 | класс ветки 404, подпись фильтра | fixed a002812 | | T5.2, T5.3 | `waitFor` в тестах IssuePage | rejected: надёжнее пауз, не регресс | | T5.5 | `waitFor` после resolve проходит сразу | fixed bb3ddd1 (M-5) | | T6.1 | часть тестов без строгого RED | rejected: покрытие существующего поведения | | T6.2 | нет теста T7.1 именно на `initialWho` | fixed bb3ddd1 (M-6) | | T6.3 | canon общий для записи и сравнения | rejected: информационно | | T7.1 | дефолт PORT в test-hub.sh дублирует HUB_PORT | fixed bb3ddd1 (M-16, комментарий) | | T7.2 | ожидание двух кадров в e2e M-3 | rejected: тест переписан на реальный щелчок (d545967) | | T7.3 | нет диагностики зависания хаба | fixed bb3ddd1 (stdout/stderr pipe) | | T7.4 | `some(h !== 120)` слабо | rejected (R-9) | | C | — | нет | | I-1 | серия e2e на финальном HEAD | fixed 447d878 (причина зависаний — O-14) | | I-2 | `fromFile` при «Обновить из Jira» из файла | fixed bb3ddd1 | | M-1…M-8, M-11 (дешёвая часть), M-13, M-16, M-17, M-18 | тесты, комментарии, спека | fixed bb3ddd1 | | M-9 | пакет завершился, пока пользователь был в карточке, — снимок не перечитывается | deferred | | M-10 | = T3.1 | deferred | | M-11 (часть) | вынести хелпер `deferred` в `src/test` | deferred | | M-12 | мёртвый экспорт `Opt` | deferred | | M-14 | = T4F.1 | rejected: недостижимо | | M-15 | = T4.1 | deferred | | O-12 | трейлер Haiku у Task 1 | rejected (R-8) | | O-13 | исполнители T2/T4/T7 не вызывали codegraph | rejected: без последствий (M-17) | | O-14 | зависание тестового хаба :8791 в e2e | fixed 447d878 (R-11) | | O-15 | e2e M-3 падал на dd95e85 | fixed d545967 (тест-артефакт, R-10) | | O-16 | после перезагрузки страницы подхваченный пакет теряет пометку «агент офлайн» (было и до #29) | deferred | | O-17 | финальный отчёт контроллера без построчной таблицы 46 пунктов | fixed: таблица в этом описании | ## Rulings I made Все записаны в `openspec/changes/web-app-followups/design.md`, раздел «Decisions made without discussion». - **R-1…R-7** — рулинги спеки (прокрутка в памяти модуля, тип пакета через `GET /batches/{id}`, игнор запоздавшего 401, пометка «(нет на доске)», `overrides`, сценарий `saved-short`, M-5 rejected). - **R-8:** коммит 2024a66 с трейлером Haiku не переписывается, он уже запушен. Цена: одно имя модели в истории не то; при желании — rebase перед merge. - **R-9:** T15.1 закрыт через `some(h !== 120)`, потому что на hub-basic все карточки по 152px. Цена: e2e не поймает одинаковую, но не 120px, высоту. - **R-10:** провал ручной проверки прокрутки — артефакт сценария: `locator.click()` по карточке под шапкой или вне окна сам прокручивает страницу. В продукте добавлена защита `isConnected`, e2e переписан на клик по видимой карточке. Я перепроверил вручную обычным щелчком мыши: возврат по «Доска» и «Назад» браузера — прокрутка 400 → 400. - **R-11:** O-14 — взаимная блокировка SQLite 3.51.1 (miniconda), а не дефект приложения. Хаб переведён на Python 3.13 от uv (SQLite 3.50.4): `.python-version`, `[tool.uv] python-preference = "only-managed"`, тест-сторож на версию SQLite. На старом окружении хаб зависал на 3-м и 5-м прогонах, на новом — 20 прогонов подряд без зависаний. Python 3.14 не взят: в нём меняется поведение `Path.is_dir()` при отказе доступа (падает тест реле). ## Deferred → follow-up issue после merge - T3.1 / M-10 — подхват не перебирает пакеты-кандидаты. - T3.3 — тест возврата не считает `GET /batches/{id}`. - T4.1 / M-15 — toggle в useBoardPrefs из замыкания (два клика в одном батче). - M-9 — пакет завершился, пока пользователь был в карточке задачи, — снимок не перечитывается. - M-11 (часть) — хелпер `deferred` в `src/test`. - M-12 — мёртвый экспорт `Opt`. - O-16 — подхваченный после перезагрузки пакет теряет «агент офлайн». ## Проверки - `make check`: pytest 258, vitest 175 — зелёные. - e2e: 10 прогонов подряд на 447d878 — 10 из 10 зелёные (13 тестов, ~10 с прогон). - `openspec validate web-app-followups --strict` — valid. - Ручной проход в Playwright на тестовом хабе :8791: шрифты из сборки (внешних запросов 0), прокрутка после ⓘ → «Доска» и «Назад», строка пакета после «Перечитать» и перезагрузки, фильтр «(нет на доске)», ссылки цветом темы, «команд по задаче не было», NUL в пути → 404. ## После merge (владелец) 1. В основном checkout: `git pull --ff-only`, `make web`. 2. `launchctl kickstart -k gui/$(id -u)/ru.aepif.jira-hub` — при первом запуске `uv run` сам скачает Python 3.13 от uv и пересоздаст `.venv` (нужен интернет, около минуты). 3. Проверить: `/app/board` открывается. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 19 commits 2026-10-15 02:31:28 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CLAUDE.md: текущий change — openspec/changes/web-app-followups/.
README: шрифты IBM Plex входят в сборку, приложение работает без интернета.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
I-2, M-4..M-8, M-11, M-13, M-16, M-18, T7.3, M-1..M-3, M-17.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Конфликт CLAUDE.md: оставлена строка ветки без пути к конкретному change (M-1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Стеки зависшего тестового хаба: потоки запросов ждут мьютексы unix-VFS SQLite в sqlite3.connect
(findReusableFd) и close (sqlite3WalClose -> unixLock). Ошибка SQLite 3.51.0–3.51.1, исправлена в 3.51.2.
.python-version = 3.13 и tool.uv.python-preference = only-managed: uv берёт свой CPython 3.13.12 (SQLite 3.50.4)
и сам пересоздаёт .venv. Тест не даёт вернуться на SQLite 3.51.0–3.51.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep added 2 commits 2026-10-15 02:31:28 +03:00
Конфликт CLAUDE.md: оставлена строка ветки без пути к конкретному change (M-1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Стеки зависшего тестового хаба: потоки запросов ждут мьютексы unix-VFS SQLite в sqlite3.connect
(findReusableFd) и close (sqlite3WalClose -> unixLock). Ошибка SQLite 3.51.0–3.51.1, исправлена в 3.51.2.
.python-version = 3.13 и tool.uv.python-preference = only-managed: uv берёт свой CPython 3.13.12 (SQLite 3.50.4)
и сам пересоздаёт .venv. Тест не даёт вернуться на SQLite 3.51.0–3.51.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 835199d3ac into main 2026-10-15 09:22:27 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/sdlc-hub#33
No description provided.