| 2026-10-10 |

Журнал и список задач с телефона: иконка комментария, переключатель «Созданные агентом» (0.94)
...
Набор правок по интерфейсу, в основном про чтение с телефона.
Журнал:
- фильтр по проекту убран: проектов у владельца будут сотни, и селект из них нужный
не находит — разрез по проектам живёт в разделе «Проекты», как и в общем списке
задач (0.73). Со страницы ушла и загрузка активных проектов: справочник имён
по-прежнему собирается из активных и архивных;
- комментарий показывается иконкой и только там, где он есть. Записей без
комментария в журнале большинство, и колонка пустых ячеек съедала половину ширины
таблицы, а текст автора (у закрытия агентом — абзац) в ячейке не влезал и рвался по
строкам. Целиком он открывается модалкой, в ней же вид записи и заголовок задачи:
диалог открывается из строки, под ним остаётся весь журнал, и без этих слов
непонятно, чей это комментарий;
- заголовок колонки — та же иконка: слово «Комментарий» шире колонки, в которой
теперь стоит одна кнопка. Слота заголовка у GnTable нет, но label принимает
готовый узел, поэтому иконке отдан h('i') с aria-label — иначе колонка осталась бы
для скринридера безымянной;
- дата и время разложены на две части: на десктопе читаются как раньше
(«10.10.2026, 22:23»), на телефоне встают в две строки и таблицу не растягивают.
formatDateTime из taskui стал не нужен и удалён;
- телефон (≤767px): отступы ячеек 8px, бейдж события мельче (моноширинный капс 13px
рвал «ДОСТУПНОСТЬ» и задавал таблице нижнюю границу ширины), колонки «Проект» и
«Актор» скрыты. Актор возвращается строкой под бейджем события: своей колонкой он
оставлял половину ширины пустой, а журнал существует ради актора. На 390px таблица
ровно по ширине экрана и не едет по горизонтали.
Список задач:
- «Кто создал» стал переключателем «Созданные агентом» вместо селекта из трёх
пунктов: средний пункт («только мои») ничего не прибавлял к «всем» — своих задач у
владельца подавляющее большинство, — а спрашивалось ровно одно: «показать то, что
завёл агент». Переключатель это и говорит.
Локали: ушли filterProject/filterProjectAll и filterCreated/createdAll/createdMe,
появились showComment и общий common.close — у модалки без своего действия «Отмена»
читалась бы как отказ от чего-то.
Проверено живым прогоном в браузере (временный пользователь, данные засеяны SQL,
XP не начислялся): шапка без фильтра по проекту, кнопка комментария у 5 записей из
10 (3 текста автора и 2 машинных кода, которые интерфейс читает словами), модалка с
полным текстом, «Закрыть» переведена, на 390px нет горизонтальной прокрутки, в списке
три переключателя и created_by_kind=agent в запросе. Стенд вычищен.
ТЗ 0.94: §3.6, §3.20, §7.
root
committed
6 hours ago
|

Автодетализация: теги, приоритет и оценка времени (0.93)
...
ИИ переписывал заголовок и описание — и портил их: контекста задачи у модели нет,
поэтому сжатый текст терял важные детали или менял суть. А карточка предложения
принимает всё или ничего, так что верно угаданные теги приходилось отклонять
из-за кривого описания. Теперь ИИ предлагает только то, где он полезен: теги,
градацию приоритета и оценку длительности.
- теги ДОПОЛНЯЮТ назначенные, а не заменяют их — потому существующие теги задачи
идут в контекст промпта отдельной строкой с правилом «не повторяй» (раньше теги
предлагались, только когда у задачи нет ни одного);
- приоритет просим градацией интерфейса (very_low…urgent), число шкалы 0-10
считаем сами: маленькой модели выбрать слово проще, чем откалибровать число.
Выдуманные ею градации («Very High», «critical», «normal») притягиваются к
ближайшей из пяти, иначе ответ пропадал бы целиком;
- оценка в минутах, границы 5…1440 (как ge=1, le=24*60 в схеме), округление до
5 минут. Она же включает задачу в режим «3 варианта», куда задачи без оценки
попадали лишь фолбэком;
- применение безопасно по определению: теги сливаются, приоритет и оценка пишутся
только в пустое поле. Проверка «пусто» стоит в apply_proposal, а не только в
промпте: владелец мог проставить приоритет, пока модель думала, — перетирать его
нельзя. Заголовок и описание не трогаются вовсе;
- флаг force у detail_task убран: переспрос всё равно ничего не перетирает,
«перепредложить всё» потеряло смысл. «Переспросить ИИ» теперь сбрасывает
предложение и анализирует текущий текст задачи;
- пустой ответ модели («добавить нечего») карточку не показывает — молчим, как и
просил владелец. Сырую задачу в этом случае утверждают из меню шапки (и в стеке
кнопка утверждения остаётся); «Детализация подбирается…» в стеке показывается
только пока ai_proposal === null, то есть пока ИИ думает;
- в интерфейсе из предложения ушли строки заголовка, описания и проекта; сниппет
карточки в списке сводится к тегам («Средний · ≈ 30 мин» текстом задачи не
читается), из промпта внешнего агента описание тоже уходит.
Живой прогон на qwen3.5:2b-q4_K_M (временный пользователь): оценки осмысленны, но
шумны (одна задача давала 15/25/30/45/60 мин от прогона к прогону), приоритет в
основном попадает, но бывает завышен (смазка петель двери → urgent), теги — слабое
место: модель редко переиспользует русский каталог и придумывает английские.
Понижение температуры до 0.1 даёт стабильность, но выравнивает всё (приоритет
почти всегда low, оценка всегда 15), поэтому оставлено как есть.
ТЗ 0.93: §3.2, §3.4, §3.11, §3.22, §5, §7, §8 п.2 (решение 2026-09-22 отменено,
решение 2026-09-19 подтверждено).
root
committed
6 hours ago
|

Регулярные задачи: дата следующего раза, метка в списке, фильтр (0.91)
...
Дата следующего экземпляра считалась и выбрасывалась: закрыв ежедневную
задачу, владелец видел её же снова «к выполнению», без даты и неотличимо от
задачи на сегодня. Теперь дата ложится в существующее `deadline_date` (новых
полей и миграций нет) — при нестрогом периоде не ставится, ТЗ 3.4 запрещает
оба поля разом.
- recurrence: `_copy` получает посчитанную дату, `spawn_next` её не теряет;
- reminders: у регулярной повод один — ритм, дедлайновые правила её не
касаются (иначе в день срока два уведомления об одном деле), сводка тоже;
- reminders: ключ дедупа ритма включает id задачи — без него уникальность
push_deliveries съедала второе «Пора», и за день приходило одно
напоминание на пользователя, сколько бы регулярных ни совпало;
- API: параметр `task_type` у GET /api/tasks;
- список: переключатель «Регулярные» рядом с «Приоритетными»;
- карточка: акцентная полоса по левой кромке и кружок с иконкой повтора
перед названием, подсказка словами о правиле; дата читается как
«след. 12.10.2026»;
- ачивка «Дедлайн-босс» регулярные не считает.
ТЗ 0.91: §3.5, §3.6, §3.21, §5, §7.
root
committed
8 hours ago
|
Интерфейс мандата: бейджи, приёмка, журнал, тосты (0.85)
root
committed
10 hours ago
|

Список задач, карточки и шторка дропдауна на мобильных (0.68–0.77)
...
- Цвета проектов (0.68–0.72): палитра пересобрана с объективным порогом
различимости — 8 базовых тонов × ступени светлоты + 5 нейтральных = 27
клеток, минимальная попарная ΔE76 в CIELAB 12.5 (приглушённые варианты
сливались, чёрный не виден на тёмной панели). Метка проекта — кружок, у
проекта с сайтом — фавикон внутри метки.
- Список задач (0.70–0.74): фильтр по проекту и табы приоритета убраны,
приоритет — переключателем «Приоритетные» с серверной отсечкой
priority_min (7–10; задача без приоритета в отсечку не попадает). Тег
ищется подстрокой имени (параметр tag, icontains с autoescape) с debounce,
ввод — GnCombobox; статус — табы кита с горизонтальной прокруткой. То же
на странице проекта. Фильтры-поля переехали в слот действий шапки.
- Выравнивание фильтров (0.76): кит держит 8px margin-top у input и 15px
margin-bottom у form-group — внутри flex-обёртки они не схлопываются, и
поле стояло на 3.5px выше центра ряда, а крестик сброса (отсчёт от низа
обёртки) уезжал к нижнему краю поля. Отступы внутри фильтра обнулены:
обёртка стала ровно в коробку поля, центры сходятся до пикселя.
- Карточка задачи (0.75–0.76): кликабельна целиком (клик мимо внутренних
ссылок/кнопок и по невыделенному тексту), бейдж проекта — ссылкой.
Свежесть задачи переехала из ряда бейджей в подвал карточки (слот footer,
черта 1px, прижат к низу — в сетке все карточки на одной линии): height
100% содержимого у кита выталкивало подвал, карточка стала flex-колонкой.
Иконка рядом с текстом — с китовым классом normalize.
- Полосы прокрутки (0.76): тонкие, бегунок акцентом, скругление в пилюлю,
прозрачная дорожка — как у полосы меню-дровера кита. Заданы и
scrollbar-width/color, и ::-webkit-scrollbar-*; у дровера приоритетнее
правило кита.
- Шторка дропдауна на мобильных (0.77): до 767px меню — лист снизу во всю
ширину экрана с затемнением и «ручкой», пункты 44px, выезд снизу 0.22s
вместо китового overlay_reveal. Слой затемнения — div вне #app (index.html)
и body:has(.dropdown.is-open): для китового обработчика клик по нему «вне
меню», поэтому тап по затемнению закрывает меню без JS, а JS-кламп
координат на мобильных выключен. Китовый panel_boot оставляет у шапки
transform (содержащий блок для position:fixed) — на мобильных анимация
шапки снята, правило «меню в шапке прижато вправо» тоже оставлено
десктопу. Задача на перенос в кит оформлена отдельно:
gnexus-ui-kit/docs/tasks/gn-dropdown-mobile-sheet.md.
- Кнопка «назад» над шапкой страницы (0.70): показывается, когда в истории
приложения есть предыдущий экран; возврат на экран входа не предлагается.
ТЗ 0.68–0.77; тесты бэкенда 209, ruff/mypy чисто, сборка фронта зелёная.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
17 hours ago
|
| 2026-10-09 |

Проекты: цвет, сайт, фавикон, закрепление, README из репозитория (0.63–0.67)
...
- Цвет-метка проекта (0.63): у проекта может быть цвет-кружок. Селектор
цвета — сырым блоком в стиле кита (в ките компонента нет); кружок рисует
общий компонент ProjectColorDot.
- Сайт проекта (0.63): отдельное поле site_url. Иконку сайта тянет
бэкенд-прокси с кэшем (GET /api/projects/{id}/favicon, том favicons) —
сторонние favicon-сервисы не используются, данные не покидают VPS. В 0.65
иконка встала в метку проекта (кружок + фавикон), а ссылка на сайт —
чипом в шапке страницы проекта.
- Карточка списка кликабельна целиком (0.63; кнопка «Открыть» дублировала
ссылку), тайтл крупнее (0.65), клетки прогресса — поверх полосы кита
(0.64): сегментированной полосы в ките нет.
- Закрепление проектов (0.66): поле pinned, закреплённые — секцией сверху,
сортировка списка по свежести активности, подвал карточки — отсчёт до
ближайшего дедлайна.
- Место булавки переставлено (0.67): на карточке — правый верхний угол
рядом с бейджем актуальности и видна всегда (была приглушена в подвале),
на странице проекта — кнопка-булавка рядом с именем (искали строкой
«Закреплён» в параметрах).
- Репозиторий проекта (0.67): ссылка на git-репозиторий — отдельное поле
repository_url, отдельно от заметки и сайта. README из репозитория
показывается вторым описанием — карточкой «README из репозитория» под
заметкой, со ссылкой на репозиторий и сворачиванием длинного текста;
тянет такой же бэкенд-прокси с кэшем (GET /api/projects/{id}/readme),
не нашли — «README не найден». Распознавание ссылки на репозиторий в
заметке проекта снято (у задачи README-вместо-описания остаётся),
данные в БД не мигрировались.
- Фантомный отступ перед именем у проекта без цвета и фавикона (0.67):
ProjectMark рисовал пустой спан в ряду с gap.
- ТЗ 0.63–0.67; MCP зеркалит поля проекта (color, site_url,
repository_url, pinned). Тесты: 207.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
| 2026-09-22 |
Линки маркдауна — в новой вкладке (PWA не ловит навигацию)
...
renderMarkdown добавляет <a target="_blank" rel="noopener">: описание
задачи, заметка проекта, README и превью MdEditor — все ссылки
открываются во внешность, standalone-PWA окно не уводят.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
ИИ-детализация: только оформление (заголовок/описание/теги EN), суммаризация проектов (ТЗ 0.40)
...
- Убрано ИИ-планирование с 0% попадания: LLM больше не предлагает
проект, приоритет и оценку времени — их заполняет пользователь
- Заполненные пользователем поля не угадываются при первичном анализе;
«Переспросить ИИ» (force) — полный анализ
- Ответ LLM — на языке исходного текста; новые теги — только английские
- Улучшено сжатие заголовка: лаконичное название + описание с шагами
- Суммаризация заметок проектов (projects.summary, миграция
a9b8c7d6e5f4): контекст LLM вместо полных заметок; перегенерация
при правке заметки
- Фикс \u-эскейпов в JSON-колонках (ensure_ascii=False): MCP-агенты
видят кириллицу, а не «u0432»
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 days ago
|
| 2026-09-21 |

Пачка 3 ревью: гонки наград и остатки фронтенда
...
- Гонка дейли: уникальный частичный индекс (source, day) + колонка
coin_events.day; параллельные POST /api/xp/daily отдают granted=False
вместо 500 (IntegrityError ловится молча).
- Гонка ensure_garden (параллельные GET /api/garden): работа в savepoint,
при нарушении уникальности (uq_coin_level, kind+ref_id) — откат и выход;
дубли бонусов уровня и растений исключены.
- Параллельное закрытие: PATCH и MCP update_task берут задачу с FOR UPDATE
OF tasks (Postgres; SQLite игнорирует) — двойных наград/спавнов нет.
- redetail утверждённой задачи — no-op: ai_proposal больше не стирается,
фоновая LLM не будится (worker и так работает только с raw).
- Фронт: ProjectView подписан на SSE (task/project changed/deleted);
SSE-refetch на странице задачи не затирает начатый ввод тега;
просрочка дедлайна считается по локальной дате, а не UTC; бросок
предмета мимо сада игнорируется (не прилипает к краю); пауза refetch'а
сада держится до конца своего move-запроса, а не фиксированные 300 мс.
- Тест: redetail no-op для approved. 110 passed.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days ago
|
Чекбоксы списков задач в описании кликабельны и сохраняются (ТЗ 0.26)
...
Клик по чекбоксу в отображаемом описании переключает соответствующий
- [ ] / - [x] в сыром markdown (маркеры - * + и нумерованные списки)
и сохраняет PATCH'ем описания. marked рендерит чекбоксы с disabled —
атрибут снимается во view-режиме, иначе клики не всплывают вовсе;
повторный клик до ответа блокируется до перерендера.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days ago
|
ИИ-детализация: короткий тайтл, шаги в описании, контекст проектов, валидация (ТЗ 0.25)
...
- LLM предлагает короткий заголовок для перегруженных тайтлов и описание
с нумерованными шагами, если они очевидны
- в контекст добавлены открытые проекты с описаниями — назначение по смыслу
- теги: разрешены новые (1-2 при отсутствии подходящих), до 3, не обязательно один
- валидация ответа: заглушки «NULL»/пробелы отбрасываются, дубли схлопываются,
new_project без валидного имени не протекает; несуществующие теги создаются
при утверждении
- фронт: строки «Новый заголовок»/«Описание с шагами» в карточке предложения
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days ago
|
Пачка UI + Ollama + SSE-реактивность (ТЗ 3.14)
...
- Бейдж приоритета с иконкой (PriorityBadge) во всех видах
- Фильтры страницы проекта запоминаются в localStorage (глубокий watch)
- DurationInput (ч/мин, шаг 5), ConfirmDialog, пагинация, иконки удаления
- Диалоги: «В архив» warning, кнопки поменяны местами
- Автодетализация на Ollama 192.168.1.130 (qwen3.5:2b, think:false)
- SSE /api/events: шина realtime, публикации после коммита, coarse-события + refetch
- Фронт: realtime.ts, удаление поллинга StackView, refetch по видам,
подавление во время drag сада, дедуп XP-тостов
- Тесты 93 passed, e2e двух вкладок; ТЗ 0.24
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
19 days ago
|
| 2026-09-20 |
feat(frontend): переименование в GNexus Tasks, тайтлы страниц
...
- Сервис «gntodo» → «GNexus Tasks»: brand топбара, kicker шапок видов,
subtitle навигации (ru/en/uk), index.html, PWA-манифест (short_name Tasks)
- taskui: APP_NAME + setPageTitle(); тайтлы через meta.title роутов
(afterEach в main.ts) — «{страница} — GNexus Tasks»
- TaskView/ProjectView уточняют тайтл после загрузки (watchEffect):
заголовок задачи / имя проекта
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
| 2026-09-19 |
Иконки во всех бейджах; approve — success; quick-add вертикально
...
- TaskBadges: иконки у всех меток — статус (квадрат/полукруг/галка/
крест/пауза), приоритет (флаг), оценка (таймер), бюджет (монеты),
теги (ярлык); предложение ИИ на стеке — бейджи с иконками
(proposalItems возвращает {icon, label})
- «Да, всё верно» на стеке — success вместо accent
- quick-add: вертикальная компоновка, текстовое поле на всю ширину
(снят max-width:600px у .form-group кита)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
Задача и проект: UX-пачка из 7 правок
...
- Действия задачи (статусы/правка/переспрос/подзадача/удаление) —
в дропдаун-меню «Действия» в шапке вместо тулбара
- Карточка «Статус» в сайдбаре: бейдж статуса + явная кнопка
«Изменить статус»
- Понятная шкала приоритета: 5 градаций с цветом (очень низкий/
низкий/средний/высокий/срочно) вместо P0–P10 — в карточках,
на страницах задачи и проекта, в формах
- Быстрое добавление тега прямо в карточке «Теги» (GnTagInput,
новое имя создаёт тег в каталоге)
- «Добавить подзадачу» создаёт полноценную задачу с parent_id
(тост-подтверждение; подзадача сразу видна в дереве)
- Фильтры страницы проекта переоформлены: подписанные селекты
со сбросом
- Список/дерево проекта — переключатель вида (GnTabs) вместо
двух секций подряд
Шкала приоритета: grade в UI, число 0–10 в БД; ProjectsView —
drawer переведён на градации.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
feat(frontend): страницы задачи и проекта, карточки, наглядное дерево
...
- /tasks/:id — полная страница задачи: просмотр/редактирование (TaskForm),
статусы, предложение ИИ, описание md + вложения, параметры, подзадачи
- /projects/:id — страница проекта: заметка, прогресс, задачи с фильтрами,
дерево проекта, создание задачи в проект (create + PATCH project_id)
- общие компоненты: TaskForm (вынесена из drawer'а стека), TaskCard
(заголовок-ссылка, сниппет, меню), TaskTree (шевроны, линии связей,
прогресс поддерева)
- стек: drawer на TaskForm, quick-add — многострочное поле (Enter — закинуть)
- .app-content 1200px, ключи i18n task.*/projectPage.*, ru/en/uk
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
i18n: ru/en/uk, язык из gnexus auth + переопределение в настройках
...
- vue-i18n v11 (legacy:false, fallback ru); локали src/locales/{ru,en,uk}.ts,
en/uk типизированы как typeof ru — полнота проверяется vue-tsc
- резолюция: settings.language (override, ''=auto) → SSO profile.locale → ru
- backend: /auth/callback прокидывает profile.locale в сессию; /api/settings
получил поле language, PUT стал частичным (model_fields_set)
- taskui.ts и все views переведены на t(); дни недели и даты через Intl
- в Настройках — карточка «Язык интерфейса», переключение мгновенное
- тесты: test_settings.py (частичный PUT, 422), AUTH_USER += locale
- ТЗ 0.5: новый пункт 3.11 «Мультиязычность»
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
Дедлайны и регулярные задачи (ТЗ 3.4, 3.5)
...
- дедлайны двух видов: строгий (deadline_date) и нестрогий
(deadline_period: день/неделя/месяц/год); бейджи в дереве и списке,
просроченные — красным
- регулярные задачи: три правила (интервал N дней, дни недели, день месяца),
якорь — фиксированный календарь от даты выполнения; при завершении
автоматически рождается следующий экземпляр (API и MCP)
- «3 варианта»: срочность дедлайнов влияет на отбор (просроченные и близкие
строгие — первыми, затем нестрогие периоды)
- ТЗ 0.4: вопросы 8.1–8.3 помечены решёнными (правила повторения, прогноз,
валюта)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
Правки по обратной связи: прогноз = LLM, валюта в настройках, «3 варианта» +50%
...
- прогноз длительности: убрана медиана истории и эндпоинт /predict —
оценка приходит только из LLM-детализации (или вручную)
- валюта бюджетов — глобальная настройка (app_settings): UAH/USD/EUR/GBP/PLN,
выбирается один раз и применяется всюду; UI — страница «Настройки»,
суммы через formatMoney (символ по настройке)
- «3 варианта»: допуск нестрогий — оценка может превышать доступное время
до +50%, короткие задачи подходят всегда; задачи без оценки — фолбэк
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
M4: прогноз времени, бюджет, режим «3 варианта»
...
- Прогноз: LLM оценивает длительность в предложении детализации
(estimated_minutes в prompt/propose/apply); пересчёт по истории
похожих завершённых задач (медиана по проекту/тегам) — эндпоинт
POST /api/tasks/{id}/predict
- Бюджет: budget_money и cost_estimate_money (целые рубли) на задаче;
в дереве/списке — чип «бюджет / оценка» рядом
- «3 варианта»: POST /api/tasks/suggest — до трёх задач под доступное
время (активные проекты, не более одной на проект, сначала строго
укладывающиеся); вью OptionsView — выбор и переход к выполнению
- Миграция 09f0fefd5d6a (4 колонки tasks), 36 тестов зелёные
- Фронт: чипы оценок ≈ в дереве/списке, кнопка пересчёта прогноза,
поля бюджета и оценки в редакторе стека
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|
M3: дерево подзадач, список с фильтрами, проекты с заметками
...
- Подзадачи: parent_task_id в create/patch, защита от циклов и
самородительства; relationships parent/children; фильтры списка
parent_id и tag_id
- Проекты: GET /api/projects/{id}, PATCH заметки и актуальности
- Фронт: TreeView — настоящее дерево с раскрытием ветвей и сменой
статуса; ListView — фильтры (статус/проект/тег); ProjectsView —
актуальность, приоритет, Markdown-заметка с предпросмотром
- Общие помощники статусов и Markdown в src/taskui.ts; GnPageHeader
переведён на слоты #meta/#actions (пропсы meta у кита нет)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 days ago
|