Skip to content

fix(task-trackers): счётчик на рейле доски = число карточек, а не приложенных интентов#243

Merged
gently-whitesnow merged 2 commits into
masterfrom
fix/board-rail-card-counter
Jul 10, 2026
Merged

fix(task-trackers): счётчик на рейле доски = число карточек, а не приложенных интентов#243
gently-whitesnow merged 2 commits into
masterfrom
fix/board-rail-card-counter

Conversation

@gently-whitesnow

Copy link
Copy Markdown
Owner

Проблема

В сайдбаре у строки доски таск-трекера всегда стоит 0, хотя браузер, который открывается по клику, показывает реальное число карточек (например, 2). Пользователь читает «IDP Kanban 0» так же, как «#throne 4», и ждёт совпадения с браузером — вместо этого видит устаревшую цифру.

Технически счётчик считался как distinct-интенты с attachment'ом на (tracker, board) (ADR-0052 §6). Эта семантика имела смысл, пока выбор доски фильтровал список интентов, но после PR #241 клик по доске открывает read-only card browser, а не фильтр по интентам — счётчик перестал согласовываться с тем, что видит оператор.

Что поменялось

  • BoardRow теперь несёт tracker / boardId и count: number | null.
  • Виджет intent-context-rail подхватывает счётчик через useQueries(fetchBoardCards) — та же react-query ячейка, что и у BoardCardBrowser, кэш общий: тёплый визит рейла переиспользует fetch браузера и наоборот.
  • staleTime = 5 минут, чтобы не долбить трекер на каждый рендер рейла; ретраев нет — офлайн-трекер аккуратно оставляет счётчик пустым, а не «нулевым».
  • RailRow.count расширен до number | null и бейдж прячется, пока данных нет, чтобы «0» не путался с «пустой доской».

Что осознанно НЕ сделано

  • Считать в GetContextCountsAsync на бэке — тянуло бы N трекер-вызовов внутрь дешёвого intent-scoped запроса, ломая SLA и graceful degradation.
  • Добавить card count в TaskTrackerSpaceTopology — Kaiten не отдаёт дешёвого count, ходил бы тем же полным list-ом, эквивалентно первому.

Ограничения

  • N параллельных tracker-запросов на первый рендер рейла (по числу подключённых досок). staleTime 5 мин смягчает, но при большом числе досок стоит вводить batch-эндпоинт.
  • IntentBoardCount.count из бэка сейчас фронтом игнорируется — оставлен в контракте на случай будущего возврата ADR-0052 §6 семантики.

Как проверить

  • SPA не крашится: pnpm typecheck && pnpm lint && pnpm test && pnpm architecture — зелено.
  • Ручной прогон: в Settings → «Таск-трекеры» подключите Kaiten, выберите доски, откройте раздел Intents — цифра рядом с доской в сайдбаре совпадает с цифрой в header'е браузера.
  • Без подключения к трекеру рейл не показывает досок — регресс на пустом THRONE_HOME исключён.

liapota added 2 commits July 10, 2026 13:49
…женные интенты

Решения:
- Board rail counter теперь показывает число карточек доски — то же, что
  header браузера, который открывается по клику на строку. Считаем через
  useQueries(useBoardCardsQuery) на sidebar с общим react-query кешем — тёплый
  визит переиспользует fetch браузера и наоборот.
- staleTime 5 минут, чтобы не долбить трекер на каждый рендер рейла.
- RailRow принимает count number|null и прячет бейдж, пока данных нет,
  вместо визуально валидного «0» — не сбивает про пустую доску.

Отброшено:
- Считать на бэке в GetContextCountsAsync: попадали бы N трекер-вызовов внутрь
  дешёвого intent-scoped запроса, ломая SLA и graceful degradation при офлайне.
- Добавить card count в TaskTrackerSpaceTopology: провайдер не отдаёт дешёвого
  count-эндпоинта (Kaiten считает через полный list), эквивалентно первому.

Ограничения:
- N параллельных tracker-вызовов на первый рендер рейла (по числу подключённых
  досок). staleTime 5 минут смягчает, но при большом числе досок стоит вводить
  batch-эндпоинт.
- ADR-0052 §6 (board-facet = distinct-интенты с attachment) остаётся в
  контракте IntentBoardCount.count на будущее — фронт его сейчас игнорирует.
@gently-whitesnow
gently-whitesnow merged commit 2cc39db into master Jul 10, 2026
1 check passed
@gently-whitesnow
gently-whitesnow deleted the fix/board-rail-card-counter branch July 10, 2026 11:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants