Skip to content

Beta checkpoint: стабилизация vault, UX и backlog - #1

Merged
chudodey merged 12 commits into
mainfrom
codex/beta-stabilization
Aug 1, 2026
Merged

chudodey merged 12 commits into
mainfrom
codex/beta-stabilization

Conversation

@chudodey

@chudodey chudodey commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Что изменилось

  • оформлена первая beta-контрольная точка после месяца разработки;
  • добавлены канбан Плана, недельная рефлексия и вкладка Дзен из локальной истории;
  • legacy-сфера life безопасно заменена аналитическими/служебными сферами;
  • done/session сохраняют заметку-провенанс;
  • дерево получило Focus Mode и сохранение раскрытия веток;
  • добавлены changelog и единый машиночитаемый backlog с генератором Markdown;
  • версия пакета поднята до 0.1.0b1.

Зачем

Реальный месячный UX-аудит показал, что продукт уже перерос исходный MVP. Эта ветка сохраняет текущий рабочий результат перед следующей фазой: локальная Ollama, классификация свободного дампа и очистка Плана.

Влияние

  • существующий vault мигрирует автоматически без потери задач;
  • личный data/ не входит в Git;
  • приложение продолжает работать без ИИ;
  • backlog теперь имеет YAML-источник истины, схему и проверяемое Markdown-представление.

Проверки

  • ruff check src tests main.py scripts
  • pytest -q — 95 passed, 1 skipped
  • python scripts/backlog.py --check
  • node --check web/static/app.js
  • editable package metadata: 0.1.0b1

Beta-тег v0.1.0-beta.1 следует поставить после слияния PR.

chudodey and others added 12 commits July 14, 2026 12:22
Плоский список топ-5+кандидаты подталкивал держать в плане задачи,
которые не хочется делать сегодня, и не давал способа их убрать без
архивации. Теперь три колонки:

- Кандидаты — пул по алгоритму §7.4 фиксируется на день (system/day_plan.yaml),
  видно 5 из N; «→ пропустить» тут же подставляет следующего из пула,
  skip_count задачи копится на всю жизнь задачи
- Колода на сегодня — осознанный выбор, жёсткий лимит 5 (WIP) + мягкое
  предупреждение при превышении дневной квоты часов
- Сделано сегодня — как было, источник истины остаётся day_log

Кнопки ✓/🗄 убраны из строк колонок — только в боковой панели задачи,
чтобы список кандидатов не подталкивал закрывать задачу раньше времени.

Рефлексия: system/plan_history.yaml — идемпотентный дневной снимок
пула/колоды/пропусков (тот же паттерн, что wheel_history). Банер раз
в ~7 дней, /api/plan/reflection считает pick-rate, completion-rate,
кто систематически откладывается (skip_count), что идёт «как по маслу».

Карточки задач получили счётчики артефактов (блоки заметок) и сессий —
не только время, как и просили.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Реальный причина: у #panel z-index:60, у #cmdBar — 70, а у .modal
было 50 — боковая панель и командная строка визуально и по hit-testing
перекрывали модалку. Крестик/кнопка «выглядели» кликабельными (модалка
рисовалась поверх по DOM-порядку в некоторых раскладках), но реальный
клик мыши попадал в элемент под ней (.pmeta панели) — подтверждено
через elementFromPoint в точке кнопки. JS .click() в моих собственных
тестах эту проблему маскировал: синтетический клик не проходит через
hit-testing и всегда «работает», в отличие от настоящего клика мышью.

Поднял .modal до z-index:200 (выше всех слоёв интерфейса) + добавил
запасные пути закрытия: клик по тёмному фону, Esc, и reflAck закрывает
модалку в finally даже при сетевой ошибке — чтобы не залипала молча.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ctrl+F5 не помогало пользователю увидеть свежую вёрстку — десктоп-
приложение живёт в одной вкладке браузера неделями, диск-кэш ОС
не всегда честно ревалидирует статику даже при жёстком обновлении.

/ теперь отдаётся не через StaticFiles напрямую, а маленьким роутом,
который подставляет ?v=<mtime style.css/app.js> в href/src — версия
меняется сама с каждой правкой файла, руками ничего обновлять не надо.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Раньше ярлык всегда пытался забиндить 8765 и блокировал консоль на
foreground-процессе — повторный клик при уже запущенном сервере падал
с «порт занят», а закрытие окна лаунчера убивало сервер.

Теперь три ветки:
- сервер уже поднят и отвечает на /api/state -> просто открыть браузер
- порт занят, но не отвечает (завис/чужой процесс) -> освободить и поднять заново
- порт свободен -> обычный холодный старт (venv/зависимости при первом разе)

Сервер стартует отдельным (свёрнутым) процессом через Start-Process,
не в этом же окне — лаунчер дожидается готовности (опрос /api/state
до 20 секунд) и завершается, сервер живёт своей жизнью независимо от
окна лаунчера.

Проверено вручную: холодный старт, тёплый повторный клик (без дублей
процесса), восстановление после зависшего процесса на порту.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…стные формулировки

Корневая причина (глубже прошлого z-index фикса): .modal{display:flex}
в обычном (не !important) правиле побеждает браузерный UA-стиль
[hidden]{display:none} той же специфичности — авторские правила всегда
берут верх над UA-стилями независимо от специфичности. Значит .hidden
в JS честно становился true, а элемент фактически НИКОГДА не скрывался
(display оставался flex) — крестик и зелёная кнопка были не «мёртвыми»,
модалка просто не могла закрыться в принципе, что бы ни нажималось.
Исправлено: display:none по умолчанию, flex — только через
.modal:not([hidden]), без завязки на выигрыш в каскаде.

Заодно устранена путаница из вопроса пользователя «что вообще делать
с этим окном»: раньше «не сейчас» и крестик ничего не запоминали —
баннер вылезал заново при каждом действии, а единственный работающий
выход (зелёная кнопка) назывался «Разобрал(-a)», намекая на обязательную
работу. Теперь любой способ уйти (крестик/фон/Esc/«не сейчас»/кнопка)
равнозначен и тихо откладывает на неделю; текст explicitly говорит:
это необязательная витрина цифр, а не форма для заполнения.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Освобождать WIP после done, дедлайн ≤3д, hard absence, sanitize id, path-safe restore и регрессионные тесты.

Co-authored-by: Cursor <cursoragent@cursor.com>
Убрать запуск бота из main, вынести python-telegram-bot в optional, пометить канал в roadmap. Лаунчер предпочитает pwsh.

Co-authored-by: Cursor <cursoragent@cursor.com>
Подхватывать правки params.yaml без рестарта, писать файлы через temp+replace, резать k_history, ловить циклы depends_on и 3-й возврат в inbox.

Co-authored-by: Cursor <cursoragent@cursor.com>
Редактируемый заголовок, строка ввода, Inbox/сфера, счётчик «в уме» в state, подсказки похожих живых задач.

Co-authored-by: Cursor <cursoragent@cursor.com>
@chudodey
chudodey marked this pull request as ready for review August 1, 2026 10:39
@chudodey
chudodey merged commit 17c4509 into main Aug 1, 2026
2 checks passed
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.

1 participant