Files
board-viewer/.tasks/STATUS.md
vitya 768167e376 tasks: + [board-viewer-whitelist-auto-discovery] round2 candidate (zero-maintenance namespaces)
User: «у меня видны задачи всего из 4 проектов, нет твоих, .common, stostayer.new и пр.»

Long-term solution — namespace-list в auth.toml + auto-discovery через
/api/v1/orgs/<org>/repos с .tasks/STATUS.md filter. При добавлении нового
репо в namespace — виден без edit'а auth.toml.

Quick-win (ручное расширение whitelist) — параллельная таска в
.admin/[board-viewer-expand-whitelist], ship'ается сегодня без code-change.

Design-first — 6 open Q's (schema merge, filter HEAD-probe, API fallback,
pagination, error handling, exclusions defer). Не блокер round1 review umbrella —
round2 candidate.
2026-05-22 18:43:08 +03:00

158 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Task Board
_Updated: 2026-05-22_
## 🟢 [board-viewer-pointers] — pre-impl: fill Domain conventions with design-context pointers
**Status:** done
**Where I stopped:** pointer-блок вставлен в `.wiki/CLAUDE.md` Domain conventions; коммит готов, ждёт push.
**Next action:** push после approval; затем разблокировать `board-viewer-gitea-reader`.
**Branch:** master
---
## 🟢 [board-viewer-gitea-reader] — Gitea API reader → normalized task structure
**Status:** done
**Where I stopped:** TaskRecord контракт реализован (parser+gitea+reader+config); 25 тестов; typecheck clean. Тесты используют 3 реальных STATUS.md fixture'а.
**Next action:** разблокировать html-render — потребляет `readBoard(client, repos) → TaskRecord[]`.
**Branch:** master
---
## 🟢 [board-viewer-html-render] — render 5-col kanban from normalized structure
**Status:** done
**Where I stopped:** render+cli+static готовы; 17 render тестов; smoke-verified против real Gitea (78 records, 4 repos), both toggle modes работают, drawer lazy-fetch'ит markdown.
**Next action:** разблокировать cron-deploy — артефакт `dist/index.html + dist/static/` готов для systemd+traefik.
**Branch:** master
---
## 🟢 [board-viewer-cron-deploy] — docker-compose stack on VDS (board.kzntsv.site)
**Status:** done (code-complete; ops-ownership transferred)
**Where I stopped:** deploy/ полностью написан (compose + Dockerfile.build + nginx.conf + auth.toml.example + .env.example + README). Compose syntax валидируется. Изменён mechanism: docker stack вместо systemd timer (user choice).
**Next action:**
**Branch:** master
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-05-22 / note: code-complete по acceptance dev-задачи (артефакты deploy/ написаны, compose валидирован, smoke-rendered против real Gitea). Ops-handoff (DNS / build+push / VDS bootstrap / smoke на board.kzntsv.site) перенесён в .admin/.tasks/[board-viewer-vds-deploy] per workshop CLAUDE.md §5. Per-task file оставлен — decisions log сохраняется в источнике. -->
---
## 🟢 [board-viewer-review] — review checkpoint (umbrella)
**Status:** done
**Where I stopped:** independent review выполнен subagent'ом (clean context, не имплементер). 43/43 тестов pass, secret hygiene clean, TDD-immutability чисто. 2 Major + 6 minor/nitpick findings зафайлены как follow-up таски ниже.
**Next action:** взять одну из ⚪ fix-тасок (readme-emoji или card-meta).
**Branch:** master
---
## 🟢 [board-viewer-readme-emoji-fix] — fix stale emoji legend in README.md
**Status:** done
**Where I stopped:** README обновлён: правильный emoji-словарь + Quick start заполнен + добавлены Deploy/Architecture секции.
**Next action:**
**Branch:** master
---
## 🟢 [board-viewer-card-meta-fix] — add owner pill + last-commit-marker to cards
**Status:** done
**Where I stopped:** owner pill + short ISO date (`YYYY-MM-DD` + tooltip с full ISO) рендерятся в обеих ветках (`render.ts` + `board.js`). 4 новых TDD-теста; smoke-verified.
**Next action:**
**Branch:** master
---
## 🟢 [board-viewer-polish] — bundle of 6 minor/nitpick findings from review
**Status:** done
**Where I stopped:** все 6 items закрыты в одной сессии. 49 тестов pass (+2 от polish: M2 future-ts, M4 status-filter markup). Smoke-verified: status pill click фильтрует cards.
**Next action:**
**Branch:** master
---
## ⚪ [board-viewer-drawer-bundle-md] — fix `Failed to fetch` в drawer: bundle md-content в build-time
**Status:** ready (critical bug)
**Where I stopped:** (not started — diagnose grounded: приватные репо + `fetch(rawUrl, {credentials:'omit'})` без auth → Gitea 401/302→login → TypeError. Решение — bundle per-task .md в build-time в JSON/inline script, drawer читает локально.)
**Next action:** см. `board-viewer-drawer-bundle-md.md`. TDD mode. Сначала reader test: `TaskRecord.md_content?: string`. Затем render embeds JSON-bundle. Затем `static/board.js openDrawer` читает local instead of fetch. E2E smoke в browser-driver: 0 запросов на git.kzntsv.site/raw при клике.
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: user-ux-feedback-round1 -->
---
## ⚪ [board-viewer-ux-show-slug] — показать slug на карточке (сейчас только в data-attr)
**Status:** ready
**Where I stopped:** (not started)
**Next action:** TDD mode. Failing test в `tests/render.test.ts`: ожидать `<code class="card-slug">...</code>` в output. Impl в `src/render.ts` + CSS в `static/board.css`. Smoke: slug читается на каждой карточке.
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: user-ux-feedback-round1 -->
---
## ⚪ [board-viewer-ux-full-datetime] — дата + время в явном формате (не только дата)
**Status:** ready
**Where I stopped:** (not started — 3 design questions: TZ МСК/UTC, format readable/ISO, оставить ли relative «7h». Recommendations внутри `board-viewer-ux-full-datetime.md`.)
**Next action:** TDD mode. Resolve 3 design-вопроса (или принять recommendations: МСК с явным суффиксом, `YYYY-MM-DD HH:MM МСК`, relative сохранить тоненькой строкой). Затем failing test + impl в `src/render.ts`.
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: user-ux-feedback-round1 -->
---
## ⚪ [board-viewer-ux-owner-conditional] — скрывать owner-pill когда все таски одного owner'а
**Status:** ready
**Where I stopped:** (not started — текущий VDS whitelist single-owner `OpeItcLoc03/*` → pill дублируется visual noise. Рендерить условно: single-owner → шапка «Owner: X (N repos)», без pill; multi-owner → pill на карточках.)
**Next action:** TDD mode. Два теста (single/multi owner fixtures). Impl в `src/render.ts`. Связанный ops-audit в `.admin/[board-viewer-redeploy-ux-round1]`: verify `auth.toml board_viewer_repos` (по memory `books` = `victor/books`, не `OpeItcLoc03/books`).
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: user-ux-feedback-round1 -->
---
## ⚪ [board-viewer-ux-task-numbers] — shorthand numbering (BV-12) на карточке
**Status:** ready (design-first)
**Where I stopped:** (not started — 4 design-вопроса: scope per-repo/global, source-of-truth `<!-- num: ... -->` в STATUS.md vs auto-derive, format BV-12 vs T-001, ретроактивно или нет. Recommendations в `board-viewer-ux-task-numbers.md`.)
**Next action:** Resolve 4 design-вопроса (single user-session). Если рекомендации принимаются — TDD impl: parser извлекает `num` из block-comment, render показывает badge. Ретроспективно — отдельный proход «chore: number existing tasks». Если возникает дилемма — `.workshop/.brainstorm/board-viewer-task-numbers.md`.
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: user-ux-feedback-round1 -->
---
## ⚪ [board-viewer-ux-done-cutoff] — фильтр / cutoff длинного done-tail
**Status:** ready (design-first)
**Where I stopped:** (not started — 4 design-вопроса: что считать «archive-нужно» (все 🟢 или N дней+), source неизменен (recommend) vs физический archive, default hide vs show-all, тип cutoff (last-N / date / combined). Recommendations в `board-viewer-ux-done-cutoff.md`.)
**Next action:** Resolve design (single user-session или brainstorm). Recommendations: source-неизменен, render-side cutoff = «hide done by default + toggle + last-10 fallback при show». TDD impl: render с N done>cutoff показывает только N + «N more» expander. Если дилемма — `.workshop/.brainstorm/board-viewer-done-cutoff.md`.
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: user-ux-feedback-round1 -->
---
## ⚪ [board-viewer-whitelist-auto-discovery] — auto-discover репо из namespace-list (zero-maintenance whitelist)
**Status:** ready (design-first, round2 candidate — не блокер round1 review)
**Where I stopped:** (not started — 6 design-вопроса: schema mergeable namespaces+repos, filter `.tasks/STATUS.md` HEAD-probe, API endpoint org-vs-user fallback, pagination, error handling, exclusions defer'нуть. Recommendations внутри `board-viewer-whitelist-auto-discovery.md`.)
**Next action:** Quick-win параллельно — `~/projects/.admin/.tasks/board-viewer-expand-whitelist.md` (ручное расширение auth.toml на VDS, no code-change). Эта код-таска — long-term для zero-maintenance. Resolve 6 design-вопросов (single user-session) → TDD impl `gitea.ts listOrgRepos/hasStatusMd` + `config.ts namespaces+repos merge` + `reader.ts pre-resolve repo-list`. Если дилемма — `.workshop/.brainstorm/board-viewer-whitelist-auto-discovery.md`.
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: user-ux-feedback-round1-followup -->
---
## 🔵 [board-viewer-ux-round1-review] — review umbrella для 6 UX-fixes round1
**Status:** blocked
**Blocker:** board-viewer-drawer-bundle-md, board-viewer-ux-show-slug, board-viewer-ux-full-datetime, board-viewer-ux-owner-conditional, board-viewer-ux-task-numbers, board-viewer-ux-done-cutoff
**Where I stopped:** (not started — открывать когда все 6 импл-таск 🟢)
**Next action:** Independent review subagent'ом (clean context, не имплементер) — TDD-immutability (тесты не переписаны под impl), output-correctness (smoke на live board.kzntsv.site после redeploy), regression check (49 существующих тестов остаются pass).
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: workshop-CLAUDE.md §4 mandatory review umbrella -->
---
<!--
Status legend:
🔴 Active — only one at a time
🟡 Paused — in progress, resumable
⚪ Ready — defined, not started
🟢 Done — kept until merged
🔵 Blocked — waiting on external input
-->