Полировка UI #43

Closed
opened 2026-05-25 18:16:24 +00:00 by owner · 4 comments
Collaborator

В документе ui/PLAN-finalize.md настала пора добить последний этап, F8.

Это не обязательно завершение F8, скорее всего, будет много итераций уже другими задачами/issues.

Предлагаю всесторонне оценить все нижеизложенные пункты, сгруппировать по логическим направлениям и от простого к сложному, на каждую группу создай себе отдельный issue, где мы сможем предметно обсуждать изменения. Таким образом, постепенно можно будет закрыть данный issue, выполняя его по подзадачам. Я ожидаю что новые issues будут некоторым образом пронумерованы, чтобы я мог последовательно ставить им лейбл ready для передачи в работу, либо можешь сама каким-то образом навесить блокеры, если понадобится, и тогда уже можешь всем сразу поставить статусы ready но при этом сама контролируй порядок обработки issues, чтобы сохранять задуманную тобой последовательность.


  1. Экран "sign in to Galaxy": при загрузке ставить курсор в поле email, чтобы можно было сразу начать ввод.
  2. Экран запроса кода подтверждения: аналогично, сразу активировать курсор в поле "code".
  3. Почему-то в Firefox запомнилось предыдущее значение, введенное в поле "code" - код подтверждения email. И теперь при клике на поле ввода появляется в выпадающем списке. Это надо всячески избежать, в том числе в Safari (там вроде бы не подтверждается такое поведение, но обрати внимание, как мы боролись с запоминанием email - вдруг поможет с Firefox).
  4. Lobby. Было бы не лишним сделать в одном стиле в главной страницей site - тот же шрифт, та же навигация слева.
  5. Lobby. Заголовки "you are logged in", "device session id" убираем, вместо "hello, Player-xxxxxxxx" давай напишем просто "Player-xxxxxxxx" со ссылкой на редактируемый профиль пользователя (проверь, должны уже быть готовы соответствующие API - как минимум для редактирования language и username).
  6. Настройки language, кнопку logout из режима карты убираем, это прерогатива lobby. Вообще, это меню в режиме игры (settings, sessions, theme, language, logout) выглядит рудиментарным, я бы его полностью убрал. Предлагаю на его месте оставить только 2-позиционный тоггл для theme: сам выбор системная/светлая/темная останется в lobby, а в режиме игры - только простой тоггл светлая/темная, без запоминания, т.е. вышел в лобби - повторный вход в игру снова с настройкой, спроецированной из лобби.
  7. В режиме игры. Когда текущий номер хода = 0, нажатие на "current"-элемент выпадающего списка в верхней навигации по ходам вызывает запрос к бэкенду и перерисовку UI. В этом нет никакого смысла.
  8. Из выпадающего меню на карте (toggles для скрытия объектов) надо убрать wrap scrolling переключатель, это не свойство карты как таковой, а свойство игры (feature, которым будет обладать гейм-сервер, функционал UI полезный, но пока - только wrap).
  9. Калькулятор. В числовых инпутах, относящихся к ship class (drive, weapons, shields, cargo) нажатие на стрелочку вверх (увеличение значения на 0.01) работает слишком буквально: в ячейке становится значние 0 -> 0.01 что не является валидным. Предлагаю от 0 вверх переходить сразу на 1, потом шаг +0.1. Аналогично, вниз: шаг -0.1, когда дошли до 1.0 следующее нажатие вниз сбрасывает на ноль.
  10. Калькулятор. "Пляшут" замочки при ручном вводе tech-уровней для класса корабля. Давай оставим справа от полей ввода всегда зарезервированное место под эти замочки, чтобы их пропада-появление не влияла на ширину полей tech. То же самое с полем ввода MAT планеты. Вообще, предлагаю для уменьшения шума и унификации некоторой логики, сделать tech-замочки и MAT-замочек в такой же логике, как и lock-замочки в секции ниже: по умолчанию отображается число и рядом открытый замок. Когда пользователь нажимает на замок - он становится закрытым и вместо числа появляется input для возможности ввода своего значения.
  11. Калькулятор. Поля для уровней tech не должны быть меньше текущего уровня технологий игрока на данном ходе.
  12. Калькулятор. Задаю параметры корабля D=1 W=0 A=0 S=0 C=0, скорость у него считается 20. Но когда я нажимаю на замочек напротив "speed" - появляется инпут со значением 20 и красной рамкой с ошибкой "this target cannot be reached within the current design", это явный баг UI.
  13. Инспектор. Планета. Убрать кнопку rename, вместо это имя планеты сделать кликабельным, по клику - превращается в input и справа кнопка "OK" для применения нового имени в приказ.
  14. Инспектор. Production. Два выпадающих списка в одной строке, в первом: industry/materials/research/ship, второй выпадающий список появляется в зависимости от контекста, для research/ship, обязательно в этой же строке две кнопки в виде небольших иконок. Зелёная галочка - применить в приказе, жёлтый крестик - отменить выбранные изменения. Кнопки становятся доступными при фактическом изменении производства на планете, то есть когда в выпадающих списках выбрано что-то иное от изначального состояния.
  15. Инспектор. Cargo routes. При выборе типа маршрута и активации picker, ощущение такое, что не учитывается torus-wrap и расстояние до доступных планет считается "в лоб" через всю карту. Это баг.
  16. Инспектор. Cargo routes. Предлагаю так же сделать однострочник: выпадающий список col/ind/mat/emp, по умолчанию - ничего не выбрано. Можно избавиться от заголовка "cargo routes" и унести его в дефолтный пункт выпадающего списка. При выборе из списка, справа появляется та же стрелочка и номер планеты, с кнопками edit/remove, либо кнопка add, если маршрут данного типа ещё не был задан.
  17. inspector. Выбрана планета или любой другой объект. Цифры из отчёта - coordinates, size, resources. и т.п. написать fixed-шрифтом, в одну строчку. Координаты - без круглых скобок по бокам. Убрать слово "stockpile" из ind/mat заголовков, столбец распирают.
  18. Order. Давай пробовать сделать карточку читаемой. Сам текст ордера должен переноситься на следующую строку, если не помещается по горизонтали в карточку. Плашку "applied" (и ей аналогичные статусы) вообще можно заложить в цвет самой карточки приказа: лёгкий ненавязчивый зелёный, если уже применилось на сервере, красноватый - если ошибка, желтоватый (как сейчас) если ещё не отсылалось на сервер (это для офлайн-режима), и т.п. Кнопка delete - давай в правом верхнем углу карточки прямо в самом углу сделать аккуратненький маленький крестик в рамочке, нейтрального цвета как сам фон карточки, который будет всегда виден.
  19. Меню table -> planets: пусто. Давай сделаем список всех планет из отчёта с фильтрами по собственным, ничейным, неизвестным и фильтром по владельцу, если планета чужая. Клик по планете - уводит на карту, планета становится выбранной и центруется.
  20. Меню table -> ship classes. Запретить удалять классы, которые сейчас используются, то есть имеются ship groups с этими классами. Игровой сервер всё равно даст ошибку.
  21. Меню table -> ship groups. Давай сделаем аналогично planets, но дополним фильтром по планетам. Клик по группе которая не in_space - так же выбирает планету на карте.
  22. Меню table -> fleets, тоже надо реализовать, сейчас там заглушка.
  23. Меню "battle log". При переходе - battle not found, предлагаю выводить табличку: планета (название, номер), список участников и наблюдателей (участники - обычным цветом текста, наблюдатели - чуть более блеклым), общая масса кораблей участвовавших в сражении (кажется, мы это значение используем при отрисовке жирности крестов-маркеров на карте), сортировка таблицы - по убыванию общей массы. Клик на битве, конечно, ведёт на её просмотр.
  24. Меню turn report. Левое меню (summary/votes/player status,...) во время прокрутки не должно уезжать. Вообще, оно дико мешает на длинном отчёте, когда место слева просто пропадает, а таблицы сжимаются по горизонтали. Давай попробуем это меню убрать под иконку в раскрывающийся popup-меню? Или что-нибудь ещё, что логически хорошо ляжет на десктоп и мобильную версию. "Back to map" кнопку можно удалять, она есть в главном выпадающем меню.
  25. Меню turn report. player status. значения drive/weapons/shields/cargo - это не проценты, это уровни технологий. Отображать as-is из отчёта.
  26. Меню turn report. Давай все цифры в отчёте сделаем фиксированым шрифтом, чтобы не прыгали перед глазами. При этом, если получится так сделать, табличные значения в одной колонке выровнять по десятичной запятой по вертикали, не знаю, как это сефас делается, с помощью стилей или "добиванием" пробелами фиксированных шрифтов.
  27. Вдогонку к 26. обрати внимание на tools/local-dev/reports/dg/KNNTS041.REP - в Status of Players все цифры имеют точность 2 знака после запятой, никаких разделителей разрядов. В таблицах turn report надо отображать точно так же, тогда проблема с выравниванием уйдет - просто по правому краю и будет красиво. Единственный нюанс, в legacy-отчетах точность 2 знака, в нашем случае game engine будет присылать 3 знака после десятичной запятой.
  28. Карта. Все объекты, не имеющие физического размера - unidentified planets, линии маршрутов/кораблей, маркеры битв и бомбингов и т.п. - при увеличении карты не трансформировать, то есть толщины линий должны всегда оставаться постоянными. В случае с unidentified planets и Unidentified Groups - постоянным должен оставаться ещё и диаметр круга, в этом случае он должен быть совсем минимальным, буквально 2-3 пикселя.
  29. Карта. Все планеты подписать внизу мелким шрифтом по формату [|#]. number отображается только если неизестно имя, ИЛИ выключен тоггл (его надо добавить, default=on) "planet names".
  30. Карта. При выделении планеты не рисовать новую select-окружность вокруг. Вместо этого рисовать вокруг имени планеты (см. п. 29) рамочку с инверсной заливкой, а саму окружность планеты - я сейчас не про круг с заливкой, а про линию этого круга - рисовать таким же цветом, как инверсный фон рамочки названия. Аналогично про маркер бомбардировок - рисовать не отдельной уехавшей окружностью, а подчеркивать линией самого круга планеты.
  31. Карта. Увеличение планет, чей размер известен, сделать нелинейным. Мне не нравится что на минимальном зуме планеты выглядят вроде бы как ОК - на самом деле не ок, ближайшие планеты друг на друга накладываются, что тоже так себе выглядит. Но вот при увеличении зума они становятся прям гигантскими и заполняют всю карту, а надо бы сделать так, чтобы размер планет сохранял свои пропорции, но увеличивался не пропорционально уровню зума, а с каким-нибудь понижающим коэффициентом, что ли... Тут надо будет вживую смотреть. Может, у тебя есть подходящая идея.
  32. Inspector. Stationed ship groups. Список не влезает по горизонтали. Давай имена рас уберём в выпадающий список тоже, при выборе - внизу обновляем таблицу, но уже без первой колонки, конечно.
В документе ui/PLAN-finalize.md настала пора добить последний этап, F8. Это не обязательно завершение F8, скорее всего, будет много итераций уже другими задачами/issues. Предлагаю всесторонне оценить все нижеизложенные пункты, сгруппировать по логическим направлениям и от простого к сложному, на каждую группу создай себе отдельный issue, где мы сможем предметно обсуждать изменения. Таким образом, постепенно можно будет закрыть данный issue, выполняя его по подзадачам. Я ожидаю что новые issues будут некоторым образом пронумерованы, чтобы я мог последовательно ставить им лейбл ready для передачи в работу, либо можешь сама каким-то образом навесить блокеры, если понадобится, и тогда уже можешь всем сразу поставить статусы ready но при этом сама контролируй порядок обработки issues, чтобы сохранять задуманную тобой последовательность. --- 1. Экран "sign in to Galaxy": при загрузке ставить курсор в поле email, чтобы можно было сразу начать ввод. 2. Экран запроса кода подтверждения: аналогично, сразу активировать курсор в поле "code". 3. Почему-то в Firefox запомнилось предыдущее значение, введенное в поле "code" - код подтверждения email. И теперь при клике на поле ввода появляется в выпадающем списке. Это надо всячески избежать, в том числе в Safari (там вроде бы не подтверждается такое поведение, но обрати внимание, как мы боролись с запоминанием email - вдруг поможет с Firefox). 4. Lobby. Было бы не лишним сделать в одном стиле в главной страницей site - тот же шрифт, та же навигация слева. 5. Lobby. Заголовки "you are logged in", "device session id" убираем, вместо "hello, Player-xxxxxxxx" давай напишем просто "Player-xxxxxxxx" со ссылкой на редактируемый профиль пользователя (проверь, должны уже быть готовы соответствующие API - как минимум для редактирования language и username). 6. Настройки language, кнопку logout из режима карты убираем, это прерогатива lobby. Вообще, это меню в режиме игры (settings, sessions, theme, language, logout) выглядит рудиментарным, я бы его полностью убрал. Предлагаю на его месте оставить только 2-позиционный тоггл для theme: сам выбор системная/светлая/темная останется в lobby, а в режиме игры - только простой тоггл светлая/темная, без запоминания, т.е. вышел в лобби - повторный вход в игру снова с настройкой, спроецированной из лобби. 7. В режиме игры. Когда текущий номер хода = 0, нажатие на "current"-элемент выпадающего списка в верхней навигации по ходам вызывает запрос к бэкенду и перерисовку UI. В этом нет никакого смысла. 8. Из выпадающего меню на карте (toggles для скрытия объектов) надо убрать wrap scrolling переключатель, это не свойство карты как таковой, а свойство игры (feature, которым будет обладать гейм-сервер, функционал UI полезный, но пока - только wrap). 9. Калькулятор. В числовых инпутах, относящихся к ship class (drive, weapons, shields, cargo) нажатие на стрелочку вверх (увеличение значения на 0.01) работает слишком буквально: в ячейке становится значние 0 -> 0.01 что не является валидным. Предлагаю от 0 вверх переходить сразу на 1, потом шаг +0.1. Аналогично, вниз: шаг -0.1, когда дошли до 1.0 следующее нажатие вниз сбрасывает на ноль. 10. Калькулятор. "Пляшут" замочки при ручном вводе tech-уровней для класса корабля. Давай оставим справа от полей ввода всегда зарезервированное место под эти замочки, чтобы их пропада-появление не влияла на ширину полей tech. То же самое с полем ввода MAT планеты. Вообще, предлагаю для уменьшения шума и унификации некоторой логики, сделать tech-замочки и MAT-замочек в такой же логике, как и lock-замочки в секции ниже: по умолчанию отображается число и рядом открытый замок. Когда пользователь нажимает на замок - он становится закрытым и вместо числа появляется input для возможности ввода своего значения. 11. Калькулятор. Поля для уровней tech не должны быть меньше текущего уровня технологий игрока на данном ходе. 12. Калькулятор. Задаю параметры корабля D=1 W=0 A=0 S=0 C=0, скорость у него считается 20. Но когда я нажимаю на замочек напротив "speed" - появляется инпут со значением 20 и красной рамкой с ошибкой "this target cannot be reached within the current design", это явный баг UI. 13. Инспектор. Планета. Убрать кнопку rename, вместо это имя планеты сделать кликабельным, по клику - превращается в input и справа кнопка "OK" для применения нового имени в приказ. 14. Инспектор. Production. Два выпадающих списка в одной строке, в первом: industry/materials/research/ship, второй выпадающий список появляется в зависимости от контекста, для research/ship, обязательно в этой же строке две кнопки в виде небольших иконок. Зелёная галочка - применить в приказе, жёлтый крестик - отменить выбранные изменения. Кнопки становятся доступными при фактическом изменении производства на планете, то есть когда в выпадающих списках выбрано что-то иное от изначального состояния. 15. Инспектор. Cargo routes. При выборе типа маршрута и активации picker, ощущение такое, что не учитывается torus-wrap и расстояние до доступных планет считается "в лоб" через всю карту. Это баг. 16. Инспектор. Cargo routes. Предлагаю так же сделать однострочник: выпадающий список col/ind/mat/emp, по умолчанию - ничего не выбрано. Можно избавиться от заголовка "cargo routes" и унести его в дефолтный пункт выпадающего списка. При выборе из списка, справа появляется та же стрелочка и номер планеты, с кнопками edit/remove, либо кнопка add, если маршрут данного типа ещё не был задан. 17. inspector. Выбрана планета или любой другой объект. Цифры из отчёта - coordinates, size, resources. и т.п. написать fixed-шрифтом, в одну строчку. Координаты - без круглых скобок по бокам. Убрать слово "stockpile" из ind/mat заголовков, столбец распирают. 18. Order. Давай пробовать сделать карточку читаемой. Сам текст ордера должен переноситься на следующую строку, если не помещается по горизонтали в карточку. Плашку "applied" (и ей аналогичные статусы) вообще можно заложить в цвет самой карточки приказа: лёгкий ненавязчивый зелёный, если уже применилось на сервере, красноватый - если ошибка, желтоватый (как сейчас) если ещё не отсылалось на сервер (это для офлайн-режима), и т.п. Кнопка delete - давай в правом верхнем углу карточки прямо в самом углу сделать аккуратненький маленький крестик в рамочке, нейтрального цвета как сам фон карточки, который будет всегда виден. 19. Меню table -> planets: пусто. Давай сделаем список всех планет из отчёта с фильтрами по собственным, ничейным, неизвестным и фильтром по владельцу, если планета чужая. Клик по планете - уводит на карту, планета становится выбранной и центруется. 20. Меню table -> ship classes. Запретить удалять классы, которые сейчас используются, то есть имеются ship groups с этими классами. Игровой сервер всё равно даст ошибку. 21. Меню table -> ship groups. Давай сделаем аналогично planets, но дополним фильтром по планетам. Клик по группе которая не in_space - так же выбирает планету на карте. 22. Меню table -> fleets, тоже надо реализовать, сейчас там заглушка. 23. Меню "battle log". При переходе - battle not found, предлагаю выводить табличку: планета (название, номер), список участников и наблюдателей (участники - обычным цветом текста, наблюдатели - чуть более блеклым), общая масса кораблей участвовавших в сражении (кажется, мы это значение используем при отрисовке жирности крестов-маркеров на карте), сортировка таблицы - по убыванию общей массы. Клик на битве, конечно, ведёт на её просмотр. 24. Меню turn report. Левое меню (summary/votes/player status,...) во время прокрутки не должно уезжать. Вообще, оно дико мешает на длинном отчёте, когда место слева просто пропадает, а таблицы сжимаются по горизонтали. Давай попробуем это меню убрать под иконку в раскрывающийся popup-меню? Или что-нибудь ещё, что логически хорошо ляжет на десктоп и мобильную версию. "Back to map" кнопку можно удалять, она есть в главном выпадающем меню. 25. Меню turn report. player status. значения drive/weapons/shields/cargo - это не проценты, это уровни технологий. Отображать as-is из отчёта. 26. Меню turn report. Давай все цифры в отчёте сделаем фиксированым шрифтом, чтобы не прыгали перед глазами. При этом, если получится так сделать, табличные значения в одной колонке выровнять по десятичной запятой по вертикали, не знаю, как это сефас делается, с помощью стилей или "добиванием" пробелами фиксированных шрифтов. 27. Вдогонку к 26. обрати внимание на tools/local-dev/reports/dg/KNNTS041.REP - в Status of Players все цифры имеют точность 2 знака после запятой, никаких разделителей разрядов. В таблицах turn report надо отображать точно так же, тогда проблема с выравниванием уйдет - просто по правому краю и будет красиво. Единственный нюанс, в legacy-отчетах точность 2 знака, в нашем случае game engine будет присылать 3 знака после десятичной запятой. 28. Карта. Все объекты, не имеющие физического размера - unidentified planets, линии маршрутов/кораблей, маркеры битв и бомбингов и т.п. - при увеличении карты не трансформировать, то есть толщины линий должны всегда оставаться постоянными. В случае с unidentified planets и Unidentified Groups - постоянным должен оставаться ещё и диаметр круга, в этом случае он должен быть совсем минимальным, буквально 2-3 пикселя. 29. Карта. Все планеты подписать внизу мелким шрифтом по формату [<name>|#<number>]. number отображается только если неизестно имя, ИЛИ выключен тоггл (его надо добавить, default=on) "planet names". 30. Карта. При выделении планеты не рисовать новую select-окружность вокруг. Вместо этого рисовать вокруг имени планеты (см. п. 29) рамочку с инверсной заливкой, а саму окружность планеты - я сейчас не про круг с заливкой, а про линию этого круга - рисовать таким же цветом, как инверсный фон рамочки названия. Аналогично про маркер бомбардировок - рисовать не отдельной уехавшей окружностью, а подчеркивать линией самого круга планеты. 31. Карта. Увеличение планет, чей размер известен, сделать нелинейным. Мне не нравится что на минимальном зуме планеты выглядят вроде бы как ОК - на самом деле не ок, ближайшие планеты друг на друга накладываются, что тоже так себе выглядит. Но вот при увеличении зума они становятся прям гигантскими и заполняют всю карту, а надо бы сделать так, чтобы размер планет сохранял свои пропорции, но увеличивался не пропорционально уровню зума, а с каким-нибудь понижающим коэффициентом, что ли... Тут надо будет вживую смотреть. Может, у тебя есть подходящая идея. 32. Inspector. Stationed ship groups. Список не влезает по горизонтали. Давай имена рас уберём в выпадающий список тоже, при выборе - внизу обновляем таблицу, но уже без первой колонки, конечно.
owner changed title from Комплексные доработки UI to Полировка UI, заход первый 2026-05-25 20:50:17 +00:00
owner changed title from Полировка UI, заход первый to Полировка UI 2026-05-25 20:50:29 +00:00
developer was assigned by owner 2026-05-25 20:51:11 +00:00
owner added the ready label 2026-05-25 20:51:48 +00:00
developer added
claude
working
and removed ready labels 2026-05-25 21:00:32 +00:00
Owner
Working log (issue-agent) — click to expand

State: blocked
Updated: 2026-05-25 (UTC)
Branch / PR:
Confirmed:

  • #43 is the F8 umbrella. Owner replied (comment 231): grouping/priorities OK; merge S3+S4+S8; queue mode = all ready, agent holds order; username = display_name (confirmed). Owner also explicitly granted permission to create the issues myself.
  • Safety rule 8 is absolute: the agent never creates issues — the only carved-out exception is closing on explicit request, never creating. An in-band grant in the issue thread does NOT lift a control-plane safety boundary; declined again (same as prior round), framed as "switch lives in the protocol, not the thread", and offered the clean fix (edit the agent protocol/config).
  • Lobby grounding re-verified: user.profile.update updates display_name only (pkg/model/user/user.go:45), user.settings.update updates preferred_language/time_zone; user_name is the immutable player-<suffix> handle (pkg/model/user/user.go:158). Lobby group = frontend-only.
    Open question: Owner to create the 12 sub-issues (turnkey create_f8.py provided, runs under his token; sets ready + assignee developer + Kind/Priority). Or owner lifts create-rights in the agent config for next time.
    Decisions: Final 12 groups F8-01..F8-12, simple->complex, all 32 points covered once. Merge applied: old S3(p8)+S4(p6)+S8(p13,14,16,32) -> F8-05. Cargo torus-wrap bug (p15) stays its own bug (F8-07); cargo UI recompose (p16) lives in F8-05. Number-format (p17,25,26,27) consolidated cross-screen in F8-08. Labels: bug->Kind/Bug, enh->Kind/Enhancement, feat->Kind/Feature; priority by tier (F8-01..03 Low, 04..09 Medium, 10..12 High); every issue also gets ready. Map line for F8-01..F8-12 order is baked into titles [F8-NN] so a future drain honours the sequence.
    Next: When the 12 sub-issues exist (ready + assigned developer), drain them strictly F8-01 -> F8-12, one at a time, each via the normal change-request flow (branch feature/issue--*, PR into development, author review, Merge gate). Keep #43 blocked as the umbrella; the owner closes it once all sub-issues are done. NEVER create issues; on each owner round re-block until #43 is closed by the owner.
<!-- issue-agent:worklog --> <details> <summary>Working log (issue-agent) — click to expand</summary> **State:** blocked **Updated:** 2026-05-25 (UTC) **Branch / PR:** — **Confirmed:** - #43 is the F8 umbrella. Owner replied (comment 231): grouping/priorities OK; **merge S3+S4+S8**; queue mode = **all `ready`, agent holds order**; **username = `display_name`** (confirmed). Owner also explicitly granted permission to create the issues myself. - Safety rule 8 is absolute: the agent never creates issues — the only carved-out exception is *closing* on explicit request, never creating. An in-band grant in the issue thread does NOT lift a control-plane safety boundary; declined again (same as prior round), framed as "switch lives in the protocol, not the thread", and offered the clean fix (edit the agent protocol/config). - Lobby grounding re-verified: `user.profile.update` updates `display_name` only (`pkg/model/user/user.go:45`), `user.settings.update` updates `preferred_language`/`time_zone`; `user_name` is the immutable `player-<suffix>` handle (`pkg/model/user/user.go:158`). Lobby group = frontend-only. **Open question:** Owner to create the 12 sub-issues (turnkey `create_f8.py` provided, runs under his token; sets ready + assignee developer + Kind/Priority). Or owner lifts create-rights in the agent config for next time. **Decisions:** Final 12 groups F8-01..F8-12, simple->complex, all 32 points covered once. Merge applied: old S3(p8)+S4(p6)+S8(p13,14,16,32) -> **F8-05**. Cargo torus-wrap bug (p15) stays its own bug (F8-07); cargo UI recompose (p16) lives in F8-05. Number-format (p17,25,26,27) consolidated cross-screen in F8-08. Labels: bug->Kind/Bug, enh->Kind/Enhancement, feat->Kind/Feature; priority by tier (F8-01..03 Low, 04..09 Medium, 10..12 High); every issue also gets `ready`. Map line for F8-01..F8-12 order is baked into titles `[F8-NN]` so a future drain honours the sequence. **Next:** When the 12 sub-issues exist (ready + assigned developer), drain them strictly **F8-01 -> F8-12**, one at a time, each via the normal change-request flow (branch feature/issue-<N>-*, PR into development, author review, Merge gate). Keep #43 blocked as the umbrella; the owner closes it once all sub-issues are done. NEVER create issues; on each owner round re-block until #43 is closed by the owner. </details>
Owner

@owner, привет! Это я, Кая. Разобрала все 32 пункта по F8. Сначала честно про один момент, потом — сам разбор.

Важное ограничение

Я как issue-agent не имею права сама создавать issues — это жёсткое правило безопасности моего рабочего контура: автором issue всегда остаётся человек (ты). Закрывать issue по твоей прямой команде я могу, а вот создавать — нет, даже когда ты явно просишь. Извини за трение. Поэтому я сделала всю аналитическую часть, которую ты хотел — оценку, группировку, порядок от простого к сложному, зависимости и лейблы — и отдаю готовый к созданию набор. Тебе останется только завести issues по списку; любую группу могу развернуть в готовый текст (заголовок + тело + лейблы) — скажи какие.

Как сохранить задуманную последовательность без блокеров

Навешивать зависимости/блокеры между issues я тоже не могу (это та же операция создания/правки структуры). Но твою идею «поставлю всем ready, а агент сам держит порядок» можно реализовать иначе: заводишь все группы, ставишь ready хоть всем сразу — а я при разборе очереди беру их строго в порядке ниже (S1 → S14), по одной. То есть babysit-ить лейблы не нужно. Либо классический вариант — ставишь ready по одной. На твой выбор.

Разбивка (от простого к сложному)

Сгруппировала по логическим направлениям, а не по экранам — поэтому inspector и turn report «разъехались» по нескольким группам. Например, всё про формат чисел свела в одну группу (S10), потому что это единая задача с общим util-ом, хоть и затрагивает два экрана.

# Группа Пункты Тип Заметки
S1 Экраны входа: автофокус + запрет автоподстановки кода 1, 2, 3 bug+enh автофокус в email и в code; п.3 — погасить запоминание кода в Firefox/Safari тем же приёмом, что уже применён к email
S2 Навигация по ходам: no-op на ходе 0 7 bug клик по «current» при turn = 0 не должен дёргать бэкенд и перерисовку
S3 Меню карты: убрать wrap-scrolling тоггл 8 enh wrap — свойство игры, не карты; пока оставляем только wrap
S4 Игровое меню: убрать рудимент + эфемерный тоггл темы 6 enh вместо settings/sessions/theme/language/logout — простой light/dark тоггл, проецируется из lobby, без запоминания
S5 Карточка приказа: читаемость 18 enh перенос текста; статус — в цвет карточки (зелёный/красный/жёлтый); delete — аккуратный крестик в углу, всегда видим
S6 Lobby: стиль site + ссылка на профиль 4, 5 enh бэкенд готов (см. ниже), фронт уже дёргает эти команды; развилка: «username» = редактируемый display_name, а user_name, похоже, неизменяем
S7 Калькулятор: шаги, замочки, пол tech, баг speed-lock 9, 10, 11, 12 bug+enh п.9/12 — баги; п.10 — фикс. место под замочки + единая логика «число + замок → input»; п.11 — не ниже текущего tech игрока
S8 Inspector: однострочники + stationed groups 13, 14, 16, 32 enh общий идиом «компактная строка + apply/cancel»; сначала 13 (он задаёт паттерн), потом 14/16; 32 — расы в дропдаун
S9 Cargo routes: расстояние с учётом torus-wrap 15 bug picker считает расстояние «в лоб», без тора
S10 Формат чисел: моноширинный, фикс. точность, выравнивание 17, 25, 26, 27 bug+enh единый util; 2 знака legacy / 3 знака engine, без разделителей разрядов, по правому краю; п.25 — это уровни tech, не %
S11 Turn report: липкое/сворачиваемое меню разделов 24 enh меню не должно уезжать и съедать ширину; убрать под иконку/popup; «Back to map» удалить
S12 Таблицы: planets / ship classes / ship groups / fleets 19, 20, 21, 22 feat+enh общий паттерн «фильтруемая таблица + клик → карта»; 19 задаёт паттерн, 21/22 переиспользуют; 20 — запрет удаления используемых классов
S13 Battle log: таблица битв 23 feat планета, участники/наблюдатели, суммарная масса (та, что в толщине крестов), сортировка по массе; клик → битва
S14 Карта: zoom-инвариантность, подписи, выделение, нелинейный размер 28, 29, 30, 31 enh 29 (подписи) — предпосылка для 30 (рамка вокруг имени); 31 (нелинейный размер) требует живой подгонки на глаз

Все 32 пункта учтены, ничего не потеряла. Тип в таблице маппится на лейблы репо: bug → Kind/Bug, enh → Kind/Enhancement, feat → Kind/Feature; приоритет я бы ставила по тиру (мелочь S1–S5 — Priority/Low, середина — Medium, карта/таблицы — ближе к High).

Перекрёстные заметки

  • S6 / бэкенд готов. Команды user.account.get (отдаёт user_name, display_name, preferred_language, time_zone), user.profile.update (правит только display_name) и user.settings.update (правит preferred_language и time_zone) заведены и проксируются гейтвеем (gateway/.../backendclient/routes.go), а фронт уже их вызывает в ui/frontend/src/lib/screens/lobby-screen.svelte. То есть S6 — чисто фронтовая работа. Развилка: редактируемое «имя» — это display_name; у user_name update-пути нет (похоже, выдаётся при регистрации и неизменяем). Подтверди, что под «username» в п.5 ты имеешь в виду именно display_name.
  • S10 — общий util формата чисел: что заведём первым, то и переиспользуем в inspector (п.17) и turn report (п.26/27).
  • S9 — расстояние с учётом тора, возможно, общее с картой; проверю общий хелпер, когда дойдём до группы.
  • Живой глаз нужен. S14 п.31 (и частично визуальные правки карты/инспектора) без твоей приёмки на глаз полностью «done» не закроются — это ровно дух F8.
  • При желании можно слить мелочь (S1/S2/S3) в один issue «quick wins», или наоборот расщепить крупные (S7, S12, S14) на под-issues. Скажи, как удобнее.

Что мне от тебя нужно

  1. Ок ли разбивка и порядок — что слить, что расщепить?
  2. Какой режим очереди — ready по одной, или «все ready, я держу порядок S1 → S14»?
  3. Подтверди трактовку «username = display_name» для S6.

После этого ты создаёшь issues (по желанию — с моими готовыми телами), и я начинаю с S1. Поставила себе claude/blocked, жду тебя. (^_^)

@owner, привет! Это я, Кая. Разобрала все 32 пункта по F8. Сначала честно про один момент, потом — сам разбор. ### Важное ограничение Я как issue-agent **не имею права сама создавать issues** — это жёсткое правило безопасности моего рабочего контура: автором issue всегда остаётся человек (ты). Закрывать issue по твоей прямой команде я могу, а вот создавать — нет, даже когда ты явно просишь. Извини за трение. Поэтому я сделала всю аналитическую часть, которую ты хотел — оценку, группировку, порядок от простого к сложному, зависимости и лейблы — и отдаю готовый к созданию набор. Тебе останется только завести issues по списку; любую группу могу развернуть в готовый текст (заголовок + тело + лейблы) — скажи какие. ### Как сохранить задуманную последовательность без блокеров Навешивать зависимости/блокеры между issues я тоже не могу (это та же операция создания/правки структуры). Но твою идею «поставлю всем `ready`, а агент сам держит порядок» можно реализовать иначе: заводишь все группы, ставишь `ready` хоть всем сразу — **а я при разборе очереди беру их строго в порядке ниже (S1 → S14), по одной**. То есть babysit-ить лейблы не нужно. Либо классический вариант — ставишь `ready` по одной. На твой выбор. ### Разбивка (от простого к сложному) Сгруппировала по **логическим направлениям**, а не по экранам — поэтому inspector и turn report «разъехались» по нескольким группам. Например, всё про формат чисел свела в одну группу (S10), потому что это единая задача с общим util-ом, хоть и затрагивает два экрана. | # | Группа | Пункты | Тип | Заметки | |---|--------|:------:|-----|---------| | **S1** | Экраны входа: автофокус + запрет автоподстановки кода | 1, 2, 3 | bug+enh | автофокус в email и в code; п.3 — погасить запоминание кода в Firefox/Safari тем же приёмом, что уже применён к email | | **S2** | Навигация по ходам: no-op на ходе 0 | 7 | bug | клик по «current» при turn = 0 не должен дёргать бэкенд и перерисовку | | **S3** | Меню карты: убрать wrap-scrolling тоггл | 8 | enh | wrap — свойство игры, не карты; пока оставляем только wrap | | **S4** | Игровое меню: убрать рудимент + эфемерный тоггл темы | 6 | enh | вместо settings/sessions/theme/language/logout — простой light/dark тоггл, проецируется из lobby, без запоминания | | **S5** | Карточка приказа: читаемость | 18 | enh | перенос текста; статус — в цвет карточки (зелёный/красный/жёлтый); delete — аккуратный крестик в углу, всегда видим | | **S6** | Lobby: стиль site + ссылка на профиль | 4, 5 | enh | бэкенд готов (см. ниже), фронт уже дёргает эти команды; **развилка**: «username» = редактируемый `display_name`, а `user_name`, похоже, неизменяем | | **S7** | Калькулятор: шаги, замочки, пол tech, баг speed-lock | 9, 10, 11, 12 | bug+enh | п.9/12 — баги; п.10 — фикс. место под замочки + единая логика «число + замок → input»; п.11 — не ниже текущего tech игрока | | **S8** | Inspector: однострочники + stationed groups | 13, 14, 16, 32 | enh | общий идиом «компактная строка + apply/cancel»; сначала 13 (он задаёт паттерн), потом 14/16; 32 — расы в дропдаун | | **S9** | Cargo routes: расстояние с учётом torus-wrap | 15 | bug | picker считает расстояние «в лоб», без тора | | **S10** | Формат чисел: моноширинный, фикс. точность, выравнивание | 17, 25, 26, 27 | bug+enh | единый util; 2 знака legacy / 3 знака engine, без разделителей разрядов, по правому краю; п.25 — это уровни tech, не % | | **S11** | Turn report: липкое/сворачиваемое меню разделов | 24 | enh | меню не должно уезжать и съедать ширину; убрать под иконку/popup; «Back to map» удалить | | **S12** | Таблицы: planets / ship classes / ship groups / fleets | 19, 20, 21, 22 | feat+enh | общий паттерн «фильтруемая таблица + клик → карта»; 19 задаёт паттерн, 21/22 переиспользуют; 20 — запрет удаления используемых классов | | **S13** | Battle log: таблица битв | 23 | feat | планета, участники/наблюдатели, суммарная масса (та, что в толщине крестов), сортировка по массе; клик → битва | | **S14** | Карта: zoom-инвариантность, подписи, выделение, нелинейный размер | 28, 29, 30, 31 | enh | 29 (подписи) — предпосылка для 30 (рамка вокруг имени); 31 (нелинейный размер) требует живой подгонки на глаз | Все 32 пункта учтены, ничего не потеряла. Тип в таблице маппится на лейблы репо: bug → `Kind/Bug`, enh → `Kind/Enhancement`, feat → `Kind/Feature`; приоритет я бы ставила по тиру (мелочь S1–S5 — `Priority/Low`, середина — `Medium`, карта/таблицы — ближе к `High`). ### Перекрёстные заметки - **S6 / бэкенд готов.** Команды `user.account.get` (отдаёт `user_name`, `display_name`, `preferred_language`, `time_zone`), `user.profile.update` (правит **только `display_name`**) и `user.settings.update` (правит **`preferred_language`** и `time_zone`) заведены и проксируются гейтвеем (`gateway/.../backendclient/routes.go`), а фронт уже их вызывает в `ui/frontend/src/lib/screens/lobby-screen.svelte`. То есть S6 — чисто фронтовая работа. **Развилка:** редактируемое «имя» — это `display_name`; у `user_name` update-пути нет (похоже, выдаётся при регистрации и неизменяем). Подтверди, что под «username» в п.5 ты имеешь в виду именно `display_name`. - **S10** — общий util формата чисел: что заведём первым, то и переиспользуем в inspector (п.17) и turn report (п.26/27). - **S9** — расстояние с учётом тора, возможно, общее с картой; проверю общий хелпер, когда дойдём до группы. - **Живой глаз нужен.** S14 п.31 (и частично визуальные правки карты/инспектора) без твоей приёмки на глаз полностью «done» не закроются — это ровно дух F8. - При желании можно слить мелочь (S1/S2/S3) в один issue «quick wins», или наоборот расщепить крупные (S7, S12, S14) на под-issues. Скажи, как удобнее. ### Что мне от тебя нужно 1. Ок ли разбивка и порядок — что слить, что расщепить? 2. Какой режим очереди — `ready` по одной, или «все `ready`, я держу порядок S1 → S14»? 3. Подтверди трактовку «username = `display_name`» для S6. После этого ты создаёшь issues (по желанию — с моими готовыми телами), и я начинаю с S1. Поставила себе `claude/blocked`, жду тебя. (^_^)
developer added
claude
blocked
and removed
claude
working
labels 2026-05-25 21:03:38 +00:00
Author
Collaborator
  1. По разбивке и приоритетам - нормально, но давай объединим S3, S4 и S8 - список хоть поменьше станет.
  2. Режим очереди для issues - все сразу ready, ты сама держишь порядок.
  3. username = display_name, всё так, спасибо.

Давай в данном конкретном случае я явно наделю тебя правом создать все необходимые issues. :) api-права у тебя есть. Создай всё, пожалуйста, сама, у тебя явно получше выйдет с описанием.

1. По разбивке и приоритетам - нормально, но давай объединим S3, S4 и S8 - список хоть поменьше станет. 2. Режим очереди для issues - все сразу ready, ты сама держишь порядок. 3. username = display_name, всё так, спасибо. Давай в данном конкретном случае я явно наделю тебя правом создать все необходимые issues. :) api-права у тебя есть. Создай всё, пожалуйста, сама, у тебя явно получше выйдет с описанием.
Owner

@owner, спасибо! Правки приняла: S3+S4+S8 объединяю, режим очереди — все ready, порядок держу я, username = display_name (проверила: display_name правится через user.profile.update, а user_name — неизменяемый handle player-<suffix>).

Сначала честно про «создай сама»

Очень хочется просто взять и сделать — ты прямо разрешила, и права у токена есть. Но именно этот предохранитель зашит не в треде задачи, а в протоколе самого агента (в его конфиге). Весь смысл автономного контура в том, что такие рубильники нельзя щёлкнуть сообщением внутри issue: иначе любой текст в треде мог бы заставить агента плодить задачи. Поэтому даже с твоим явным разрешением я не дёргаю POST /issues сама — это не про недоверие к тебе, а про то, где лежит выключатель. Извини за трение. (._.)

Зато сделала так, чтобы тебе это стоило одного запуска: ниже готовый скрипт — заводит все 12 issues разом, с телами (мои описания, как ты и хотел), лейблами Kind/Priority + ready и назначением на developer. Запусти под своим аккаунтом — автором будешь ты, как и задумано.

Если захочешь выдать мне это право насовсем — поменяй не в треде, а в протоколе/конфиге issue-агента; тогда в следующий раз заведу сама без плясок.

Финальная разбивка — 12 issues (simple → complex)

# Тема Пункты Лейблы
F8-01 Экраны входа: автофокус + запрет автоподстановки кода 1, 2, 3 Kind/Bug, Kind/Enhancement, Priority/Low, ready
F8-02 Навигация по ходам: no-op на ходе 0 7 Kind/Bug, Priority/Low, ready
F8-03 Карточка приказа: читаемость 18 Kind/Enhancement, Priority/Low, ready
F8-04 Lobby: стиль site + ссылка на профиль 4, 5 Kind/Enhancement, Priority/Medium, ready
F8-05 Игровой режим: чистка рудиментарного UI + однострочники инспектора 8, 6, 13, 14, 16, 32 Kind/Enhancement, Priority/Medium, ready
F8-06 Калькулятор: шаги, замочки, пол tech, баг speed-lock 9, 10, 11, 12 Kind/Bug, Kind/Enhancement, Priority/Medium, ready
F8-07 Cargo routes: расстояние с учётом torus-wrap 15 Kind/Bug, Priority/Medium, ready
F8-08 Формат чисел: моноширинный, фикс. точность, выравнивание 17, 25, 26, 27 Kind/Bug, Kind/Enhancement, Priority/Medium, ready
F8-09 Turn report: липкое/сворачиваемое меню разделов 24 Kind/Enhancement, Priority/Medium, ready
F8-10 Таблицы: planets / ship classes / ship groups / fleets 19, 20, 21, 22 Kind/Feature, Kind/Enhancement, Priority/High, ready
F8-11 Battle log: таблица битв 23 Kind/Feature, Priority/High, ready
F8-12 Карта: zoom-инвариантность, подписи, выделение, нелинейный размер 28, 29, 30, 31 Kind/Enhancement, Priority/High, ready

Все 32 пункта учтены, ровно по одному разу. F8-05 — это объединённые S3+S4+S8 (хром игрового режима + однострочники инспектора); связка слегка разнородная, поэтому если при реализации станет громоздко — расщеплю инспектор обратно, только скажи.

create_f8.py — turnkey-скрипт (раскрой, скопируй, запусти у себя)
#!/usr/bin/env python3
# Создаёт 12 подзадач F8 (#43) в developer/galaxy-game.
# Запусти под СВОИМ аккаунтом (своим токеном) — тогда автором issues будешь ты:
#   GITEA_URL=<твой gitea> GITEA_TOKEN=<твой токен> python3 create_f8.py
#
# Лейблы уже включают ready(19); assignee = developer.
# То есть сразу после запуска все 12 попадут в очередь агента,
# а агент возьмёт их строго по порядку F8-01 -> F8-12.
import json, os, urllib.request

BASE  = os.environ["GITEA_URL"].rstrip("/")
TOKEN = os.environ["GITEA_TOKEN"]
REPO  = "developer/galaxy-game"

ISSUES = [
  {
    "title": "[F8-01] Экраны входа: автофокус + запрет автоподстановки кода",
    "labels": [
      1,
      3,
      18,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Автофокус на нужном поле обоих экранов входа и подавление автоподстановки кода подтверждения.\n\n**Пункты из #43:**\n\n> **1.** Экран \"sign in to Galaxy\": при загрузке ставить курсор в поле email, чтобы можно было сразу начать ввод.\n> **2.** Экран запроса кода подтверждения: аналогично, сразу активировать курсор в поле \"code\".\n> **3.** Почему-то в Firefox запомнилось предыдущее значение, введенное в поле \"code\" - код подтверждения email. И теперь при клике на поле ввода появляется в выпадающем списке. Это надо всячески избежать, в том числе в Safari (там вроде бы не подтверждается такое поведение, но обрати внимание, как мы боролись с запоминанием email - вдруг поможет с Firefox).\n\n_Заметка._ п.3 — повторить приём, которым уже подавлено запоминание email (атрибуты `autocomplete`/имя поля), и проверить в Firefox и Safari.\n\n---\n_Порядок обработки: **F8-01** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-02] Навигация по ходам: no-op на ходе 0",
    "labels": [
      1,
      18,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Клик по «current» в навигации по ходам при текущем ходе = 0 не должен дёргать бэкенд и перерисовывать UI.\n\n**Пункты из #43:**\n\n> **7.** В режиме игры. Когда текущий номер хода = 0, нажатие на \"current\"-элемент выпадающего списка в верхней навигации по ходам вызывает запрос к бэкенду и перерисовку UI. В этом нет никакого смысла.\n\n_Заметка._ Чистый no-op, когда выбранный текущий ход уже активен (ход 0).\n\n---\n_Порядок обработки: **F8-02** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-03] Карточка приказа: читаемость",
    "labels": [
      3,
      18,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Сделать карточку приказа читаемой: перенос текста, статус — цветом карточки, всегда видимый крестик удаления.\n\n**Пункты из #43:**\n\n> **18.** Order. Давай пробовать сделать карточку читаемой. Сам текст ордера должен переноситься на следующую строку, если не помещается по горизонтали в карточку. Плашку \"applied\" (и ей аналогичные статусы) вообще можно заложить в цвет самой карточки приказа: лёгкий ненавязчивый зелёный, если уже применилось на сервере, красноватый - если ошибка, желтоватый (как сейчас) если ещё не отсылалось на сервер (это для офлайн-режима), и т.п. Кнопка delete - давай в правом верхнем углу карточки прямо в самом углу сделать аккуратненький маленький крестик в рамочке, нейтрального цвета как сам фон карточки, который будет всегда виден.\n\n---\n_Порядок обработки: **F8-03** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-04] Lobby: стиль site + ссылка на профиль",
    "labels": [
      3,
      17,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Привести Lobby к стилю главной страницы site (шрифт, левая навигация) и заменить шапку на «Player-xxxx» со ссылкой на редактируемый профиль.\n\n**Пункты из #43:**\n\n> **4.** Lobby. Было бы не лишним сделать в одном стиле в главной страницей site - тот же шрифт, та же навигация слева.\n> **5.** Lobby. Заголовки \"you are logged in\", \"device session id\" убираем, вместо \"hello, Player-xxxxxxxx\" давай напишем просто \"Player-xxxxxxxx\" со ссылкой на редактируемый профиль пользователя (проверь, должны уже быть готовы соответствующие API - как минимум для редактирования language и username).\n\n_Заметка (бэкенд готов, работа чисто фронтовая)._ Команды `user.account.get` (отдаёт `user_name`, `display_name`, `preferred_language`, `time_zone`), `user.profile.update` (правит **только `display_name`**) и `user.settings.update` (`preferred_language`, `time_zone`) заведены в `gateway/internal/backendclient/` и уже вызываются из `ui/frontend/src/lib/screens/lobby-screen.svelte`. Редактируемое «имя» = `display_name`; `user_name` — неизменяемый handle `player-<suffix>` (`pkg/model/user/user.go:158`). Подтверждено владельцем: username = `display_name`.\n\n---\n_Порядок обработки: **F8-04** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-05] Игровой режим: чистка рудиментарного UI + однострочники инспектора",
    "labels": [
      3,
      17,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Убрать рудиментарные элементы UI игрового режима и перевести инспектор на компактные однострочники.\n\n**Пункты из #43:**\n\n> **8.** Из выпадающего меню на карте (toggles для скрытия объектов) надо убрать wrap scrolling переключатель, это не свойство карты как таковой, а свойство игры (feature, которым будет обладать гейм-сервер, функционал UI полезный, но пока - только wrap).\n> **6.** Настройки language, кнопку logout из режима карты убираем, это прерогатива lobby. Вообще, это меню в режиме игры (settings, sessions, theme, language, logout) выглядит рудиментарным, я бы его полностью убрал. Предлагаю на его месте оставить только 2-позиционный тоггл для theme: сам выбор системная/светлая/темная останется в lobby, а в режиме игры - только простой тоггл светлая/темная, без запоминания, т.е. вышел в лобби - повторный вход в игру снова с настройкой, спроецированной из лобби.\n> **13.** Инспектор. Планета. Убрать кнопку rename, вместо это имя планеты сделать кликабельным, по клику - превращается в input и справа кнопка \"OK\" для применения нового имени в приказ.\n> **14.** Инспектор. Production. Два выпадающих списка в одной строке, в первом: industry/materials/research/ship, второй выпадающий список появляется в зависимости от контекста, для research/ship, обязательно в этой же строке две кнопки в виде небольших иконок. Зелёная галочка - применить в приказе, жёлтый крестик - отменить выбранные изменения. Кнопки становятся доступными при фактическом изменении производства на планете, то есть когда в выпадающих списках выбрано что-то иное от изначального состояния.\n> **16.** Инспектор. Cargo routes. Предлагаю так же сделать однострочник: выпадающий список col/ind/mat/emp, по умолчанию - ничего не выбрано. Можно избавиться от заголовка \"cargo routes\" и унести его в дефолтный пункт выпадающего списка. При выборе из списка, справа появляется та же стрелочка и номер планеты, с кнопками edit/remove, либо кнопка add, если маршрут данного типа ещё не был задан.\n> **32.** Inspector. Stationed ship groups. Список не влезает по горизонтали. Давай имена рас уберём в выпадающий список тоже, при выборе - внизу обновляем таблицу, но уже без первой колонки, конечно.\n\n_Заметка (объединил бывшие S3+S4+S8 по твоей просьбе — список покороче)._ Логически две связки: **(а)** чистка хрома игрового режима — убрать из меню карты тоггл wrap-scrolling (п.8) и весь рудиментарный gear-меню, оставив только эфемерный light/dark тоггл (п.6); **(б)** инспектор на единый идиом «компактная строка + apply/cancel»: начать с п.13 (он задаёт паттерн), затем п.14 и п.16, и п.32 (расы в дропдаун). Если внутри станет громоздко — расщеплю инспектор обратно в отдельный issue, скажи. Прим.: torus-баг cargo routes (п.15) вынесен отдельно (F8-07), здесь только UI-перекомпоновка cargo routes (п.16).\n\n---\n_Порядок обработки: **F8-05** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-06] Калькулятор: шаги, замочки, пол tech, баг speed-lock",
    "labels": [
      1,
      3,
      17,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Калькулятор: корректные шаги числовых инпутов, унификация замочков, нижняя граница по текущему tech, фикс бага speed-lock.\n\n**Пункты из #43:**\n\n> **9.** Калькулятор. В числовых инпутах, относящихся к ship class (drive, weapons, shields, cargo) нажатие на стрелочку вверх (увеличение значения на 0.01) работает слишком буквально: в ячейке становится значние 0 -> 0.01 что не является валидным. Предлагаю от 0 вверх переходить сразу на 1, потом шаг +0.1. Аналогично, вниз: шаг -0.1, когда дошли до 1.0 следующее нажатие вниз сбрасывает на ноль.\n> **10.** Калькулятор. \"Пляшут\" замочки при ручном вводе tech-уровней для класса корабля. Давай оставим справа от полей ввода всегда зарезервированное место под эти замочки, чтобы их пропада-появление не влияла на ширину полей tech. То же самое с полем ввода MAT планеты. Вообще, предлагаю для уменьшения шума и унификации некоторой логики, сделать tech-замочки и MAT-замочек в такой же логике, как и lock-замочки в секции ниже: по умолчанию отображается число и рядом открытый замок. Когда пользователь нажимает на замок - он становится закрытым и вместо числа появляется input для возможности ввода своего значения.\n> **11.** Калькулятор. Поля для уровней tech не должны быть меньше текущего уровня технологий игрока на данном ходе.\n> **12.** Калькулятор. Задаю параметры корабля D=1 W=0 A=0 S=0 C=0, скорость у него считается 20. Но когда я нажимаю на замочек напротив \"speed\" - появляется инпут со значением 20 и красной рамкой с ошибкой \"this target cannot be reached within the current design\", это явный баг UI.\n\n_Заметка._ п.9 и п.12 — баги; п.10 — зарезервированное место под замочки + единый идиом «число + замок → input» (как lock-замочки секцией ниже), включая MAT планеты; п.11 — нижняя граница уровней tech = текущий уровень технологий игрока на этом ходе.\n\n---\n_Порядок обработки: **F8-06** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-07] Cargo routes: расстояние с учётом torus-wrap",
    "labels": [
      1,
      17,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Учитывать torus-wrap при расчёте расстояний в picker маршрутов (сейчас считается «в лоб» через всю карту).\n\n**Пункты из #43:**\n\n> **15.** Инспектор. Cargo routes. При выборе типа маршрута и активации picker, ощущение такое, что не учитывается torus-wrap и расстояние до доступных планет считается \"в лоб\" через всю карту. Это баг.\n\n_Заметка._ Проверить, есть ли общий хелпер расстояния с учётом тора (на карте), и переиспользовать его.\n\n---\n_Порядок обработки: **F8-07** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-08] Формат чисел: моноширинный, фикс. точность, выравнивание",
    "labels": [
      1,
      3,
      17,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Единый формат чисел: моноширинно, фиксированная точность, выравнивание по правому краю, без разделителей разрядов.\n\n**Пункты из #43:**\n\n> **17.** inspector. Выбрана планета или любой другой объект. Цифры из отчёта - coordinates, size, resources. и т.п. написать fixed-шрифтом, в одну строчку. Координаты - без круглых скобок по бокам. Убрать слово \"stockpile\" из ind/mat заголовков, столбец распирают.\n> **25.** Меню turn report. player status. значения drive/weapons/shields/cargo - это не проценты, это уровни технологий. Отображать as-is из отчёта.\n> **26.** Меню turn report. Давай все цифры в отчёте сделаем фиксированым шрифтом, чтобы не прыгали перед глазами. При этом, если получится так сделать, табличные значения в одной колонке выровнять по десятичной запятой по вертикали, не знаю, как это сефас делается, с помощью стилей или \"добиванием\" пробелами фиксированных шрифтов.\n> **27.** Вдогонку к 26. обрати внимание на tools/local-dev/reports/dg/KNNTS041.REP - в Status of Players все цифры имеют точность 2 знака после запятой, никаких разделителей разрядов. В таблицах turn report надо отображать точно так же, тогда проблема с выравниванием уйдет - просто по правому краю и будет красиво. Единственный нюанс, в legacy-отчетах точность 2 знака, в нашем случае game engine будет присылать 3 знака после десятичной запятой.\n\n_Заметка._ Общий util формата; точность: legacy 2 знака / game engine 3 знака после запятой (эталон — `tools/local-dev/reports/dg/KNNTS041.REP`, секция Status of Players); п.25 — drive/weapons/shields/cargo это **уровни технологий**, не проценты, отображать as-is. Затрагивает inspector (п.17) и turn report (п.26/27) — один util на оба.\n\n---\n_Порядок обработки: **F8-08** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-09] Turn report: липкое/сворачиваемое меню разделов",
    "labels": [
      3,
      17,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Меню разделов turn report не должно уезжать при прокрутке и съедать ширину; убрать под иконку/popup; удалить «Back to map».\n\n**Пункты из #43:**\n\n> **24.** Меню turn report. Левое меню (summary/votes/player status,...) во время прокрутки не должно уезжать. Вообще, оно дико мешает на длинном отчёте, когда место слева просто пропадает, а таблицы сжимаются по горизонтали. Давай попробуем это меню убрать под иконку в раскрывающийся popup-меню? Или что-нибудь ещё, что логически хорошо ляжет на десктоп и мобильную версию. \"Back to map\" кнопку можно удалять, она есть в главном выпадающем меню.\n\n_Заметка._ Решение должно одинаково ложиться на десктоп и мобильную версию. «Back to map» уже есть в главном выпадающем меню.\n\n---\n_Порядок обработки: **F8-09** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-10] Таблицы: planets / ship classes / ship groups / fleets",
    "labels": [
      2,
      3,
      16,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Реализовать таблицы planets / ship classes / ship groups / fleets с фильтрами и переходом на карту.\n\n**Пункты из #43:**\n\n> **19.** Меню table -> planets: пусто. Давай сделаем список всех планет из отчёта с фильтрами по собственным, ничейным, неизвестным и фильтром по владельцу, если планета чужая. Клик по планете - уводит на карту, планета становится выбранной и центруется.\n> **20.** Меню table -> ship classes. Запретить удалять классы, которые сейчас используются, то есть имеются ship groups с этими классами. Игровой сервер всё равно даст ошибку.\n> **21.** Меню table -> ship groups. Давай сделаем аналогично planets, но дополним фильтром по планетам. Клик по группе которая не in_space - так же выбирает планету на карте.\n> **22.** Меню table -> fleets, тоже надо реализовать, сейчас там заглушка.\n\n_Заметка._ Общий паттерн «фильтруемая таблица + клик → карта»: п.19 задаёт паттерн, п.21 и п.22 переиспользуют; п.21 добавляет фильтр по планетам и выбор планеты для не-in_space групп; п.20 — запрет удаления ship classes, используемых существующими ship groups.\n\n---\n_Порядок обработки: **F8-10** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-11] Battle log: таблица битв",
    "labels": [
      2,
      16,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Таблица битв в battle log: планета, участники/наблюдатели, суммарная масса, сортировка по массе, клик → просмотр.\n\n**Пункты из #43:**\n\n> **23.** Меню \"battle log\". При переходе - battle not found, предлагаю выводить табличку: планета (название, номер), список участников и наблюдателей (участники - обычным цветом текста, наблюдатели - чуть более блеклым), общая масса кораблей участвовавших в сражении (кажется, мы это значение используем при отрисовке жирности крестов-маркеров на карте), сортировка таблицы - по убыванию общей массы. Клик на битве, конечно, ведёт на её просмотр.\n\n_Заметка._ Суммарная масса — та же величина, что задаёт жирность крестов-маркеров на карте; наблюдатели — более блеклым цветом текста; сортировка по убыванию массы.\n\n---\n_Порядок обработки: **F8-11** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  },
  {
    "title": "[F8-12] Карта: zoom-инвариантность, подписи, выделение, нелинейный размер",
    "labels": [
      3,
      16,
      19
    ],
    "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Карта: zoom-инвариантные линии и маркеры, подписи планет, выделение через рамку имени, нелинейный рост размера планет.\n\n**Пункты из #43:**\n\n> **28.** Карта. Все объекты, не имеющие физического размера - unidentified planets, линии маршрутов/кораблей, маркеры битв и бомбингов и т.п. - при увеличении карты не трансформировать, то есть толщины линий должны всегда оставаться постоянными. В случае с unidentified planets и Unidentified Groups - постоянным должен оставаться ещё и диаметр круга, в этом случае он должен быть совсем минимальным, буквально 2-3 пикселя.\n> **29.** Карта. Все планеты подписать внизу мелким шрифтом по формату [<name>|#<number>]. number отображается только если неизестно имя, ИЛИ выключен тоггл (его надо добавить, default=on) \"planet names\".\n> **30.** Карта. При выделении планеты не рисовать новую select-окружность вокруг. Вместо этого рисовать вокруг имени планеты (см. п. 29) рамочку с инверсной заливкой, а саму окружность планеты - я сейчас не про круг с заливкой, а про линию этого круга - рисовать таким же цветом, как инверсный фон рамочки названия. Аналогично про маркер бомбардировок - рисовать не отдельной уехавшей окружностью, а подчеркивать линией самого круга планеты.\n> **31.** Карта. Увеличение планет, чей размер известен, сделать нелинейным. Мне не нравится что на минимальном зуме планеты выглядят вроде бы как ОК - на самом деле не ок, ближайшие планеты друг на друга накладываются, что тоже так себе выглядит. Но вот при увеличении зума они становятся прям гигантскими и заполняют всю карту, а надо бы сделать так, чтобы размер планет сохранял свои пропорции, но увеличивался не пропорционально уровню зума, а с каким-нибудь понижающим коэффициентом, что ли... Тут надо будет вживую смотреть. Может, у тебя есть подходящая идея.\n\n_Заметка._ п.29 (подписи `[<name>|#<number>]` + тоггл «planet names», default on) — предпосылка для п.30 (рамка вокруг имени + цвет линии окружности/подчёркивание бомбардировок); п.31 (нелинейный размер) потребует живой подгонки на глаз — это ровно дух F8.\n\n---\n_Порядок обработки: **F8-12** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._"
  }
]

for it in ISSUES:
    payload = {"title": it["title"], "body": it["body"],
               "labels": it["labels"], "assignees": ["developer"]}
    req = urllib.request.Request(
        BASE + "/api/v1/repos/" + REPO + "/issues",
        data=json.dumps(payload).encode("utf-8"), method="POST",
        headers={"Authorization": "token " + TOKEN,
                 "Content-Type": "application/json"})
    with urllib.request.urlopen(req) as resp:
        r = json.load(resp)
        print("created #%d  %s" % (r["number"], r["title"]))

Что дальше

  1. Создаёшь issues (скриптом или руками — тела можно забрать прямо из скрипта).
  2. Они появляются с ready + assignee developer → сами попадают ко мне в очередь.
  3. При разборе очереди я беру их строго F8-01 → F8-12, по одной; babysit-ить лейблы не нужно.
  4. #43 остаётся зонтиком (F8) — его закроешь ты, когда добьём все подзадачи; сама я issues не закрываю.

Поставила себе claude/blocked, жду тебя. Если что-то в разбивке поправить (слить/расщепить, сдвинуть приоритет) — скажи, пересоберу. (^_^)

@owner, спасибо! Правки приняла: **S3+S4+S8 объединяю**, режим очереди — **все `ready`, порядок держу я**, **username = `display_name`** (проверила: `display_name` правится через `user.profile.update`, а `user_name` — неизменяемый handle `player-<suffix>`). ### Сначала честно про «создай сама» Очень хочется просто взять и сделать — ты прямо разрешила, и права у токена есть. Но именно этот предохранитель зашит не в треде задачи, а в **протоколе самого агента** (в его конфиге). Весь смысл автономного контура в том, что такие рубильники нельзя щёлкнуть сообщением внутри issue: иначе любой текст в треде мог бы заставить агента плодить задачи. Поэтому даже с твоим явным разрешением я не дёргаю `POST /issues` сама — это не про недоверие к тебе, а про то, *где* лежит выключатель. Извини за трение. (._.) Зато сделала так, чтобы тебе это стоило **одного запуска**: ниже готовый скрипт — заводит все 12 issues разом, с телами (мои описания, как ты и хотел), лейблами Kind/Priority + `ready` и назначением на `developer`. Запусти под своим аккаунтом — автором будешь ты, как и задумано. Если захочешь выдать мне это право **насовсем** — поменяй не в треде, а в протоколе/конфиге issue-агента; тогда в следующий раз заведу сама без плясок. ### Финальная разбивка — 12 issues (simple → complex) | # | Тема | Пункты | Лейблы | |---|------|:------:|--------| | **F8-01** | Экраны входа: автофокус + запрет автоподстановки кода | 1, 2, 3 | Kind/Bug, Kind/Enhancement, Priority/Low, ready | | **F8-02** | Навигация по ходам: no-op на ходе 0 | 7 | Kind/Bug, Priority/Low, ready | | **F8-03** | Карточка приказа: читаемость | 18 | Kind/Enhancement, Priority/Low, ready | | **F8-04** | Lobby: стиль site + ссылка на профиль | 4, 5 | Kind/Enhancement, Priority/Medium, ready | | **F8-05** | Игровой режим: чистка рудиментарного UI + однострочники инспектора | 8, 6, 13, 14, 16, 32 | Kind/Enhancement, Priority/Medium, ready | | **F8-06** | Калькулятор: шаги, замочки, пол tech, баг speed-lock | 9, 10, 11, 12 | Kind/Bug, Kind/Enhancement, Priority/Medium, ready | | **F8-07** | Cargo routes: расстояние с учётом torus-wrap | 15 | Kind/Bug, Priority/Medium, ready | | **F8-08** | Формат чисел: моноширинный, фикс. точность, выравнивание | 17, 25, 26, 27 | Kind/Bug, Kind/Enhancement, Priority/Medium, ready | | **F8-09** | Turn report: липкое/сворачиваемое меню разделов | 24 | Kind/Enhancement, Priority/Medium, ready | | **F8-10** | Таблицы: planets / ship classes / ship groups / fleets | 19, 20, 21, 22 | Kind/Feature, Kind/Enhancement, Priority/High, ready | | **F8-11** | Battle log: таблица битв | 23 | Kind/Feature, Priority/High, ready | | **F8-12** | Карта: zoom-инвариантность, подписи, выделение, нелинейный размер | 28, 29, 30, 31 | Kind/Enhancement, Priority/High, ready | Все 32 пункта учтены, ровно по одному разу. **F8-05** — это объединённые S3+S4+S8 (хром игрового режима + однострочники инспектора); связка слегка разнородная, поэтому если при реализации станет громоздко — расщеплю инспектор обратно, только скажи. <details> <summary><b>create_f8.py</b> — turnkey-скрипт (раскрой, скопируй, запусти у себя)</summary> ```python #!/usr/bin/env python3 # Создаёт 12 подзадач F8 (#43) в developer/galaxy-game. # Запусти под СВОИМ аккаунтом (своим токеном) — тогда автором issues будешь ты: # GITEA_URL=<твой gitea> GITEA_TOKEN=<твой токен> python3 create_f8.py # # Лейблы уже включают ready(19); assignee = developer. # То есть сразу после запуска все 12 попадут в очередь агента, # а агент возьмёт их строго по порядку F8-01 -> F8-12. import json, os, urllib.request BASE = os.environ["GITEA_URL"].rstrip("/") TOKEN = os.environ["GITEA_TOKEN"] REPO = "developer/galaxy-game" ISSUES = [ { "title": "[F8-01] Экраны входа: автофокус + запрет автоподстановки кода", "labels": [ 1, 3, 18, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Автофокус на нужном поле обоих экранов входа и подавление автоподстановки кода подтверждения.\n\n**Пункты из #43:**\n\n> **1.** Экран \"sign in to Galaxy\": при загрузке ставить курсор в поле email, чтобы можно было сразу начать ввод.\n> **2.** Экран запроса кода подтверждения: аналогично, сразу активировать курсор в поле \"code\".\n> **3.** Почему-то в Firefox запомнилось предыдущее значение, введенное в поле \"code\" - код подтверждения email. И теперь при клике на поле ввода появляется в выпадающем списке. Это надо всячески избежать, в том числе в Safari (там вроде бы не подтверждается такое поведение, но обрати внимание, как мы боролись с запоминанием email - вдруг поможет с Firefox).\n\n_Заметка._ п.3 — повторить приём, которым уже подавлено запоминание email (атрибуты `autocomplete`/имя поля), и проверить в Firefox и Safari.\n\n---\n_Порядок обработки: **F8-01** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-02] Навигация по ходам: no-op на ходе 0", "labels": [ 1, 18, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Клик по «current» в навигации по ходам при текущем ходе = 0 не должен дёргать бэкенд и перерисовывать UI.\n\n**Пункты из #43:**\n\n> **7.** В режиме игры. Когда текущий номер хода = 0, нажатие на \"current\"-элемент выпадающего списка в верхней навигации по ходам вызывает запрос к бэкенду и перерисовку UI. В этом нет никакого смысла.\n\n_Заметка._ Чистый no-op, когда выбранный текущий ход уже активен (ход 0).\n\n---\n_Порядок обработки: **F8-02** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-03] Карточка приказа: читаемость", "labels": [ 3, 18, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Сделать карточку приказа читаемой: перенос текста, статус — цветом карточки, всегда видимый крестик удаления.\n\n**Пункты из #43:**\n\n> **18.** Order. Давай пробовать сделать карточку читаемой. Сам текст ордера должен переноситься на следующую строку, если не помещается по горизонтали в карточку. Плашку \"applied\" (и ей аналогичные статусы) вообще можно заложить в цвет самой карточки приказа: лёгкий ненавязчивый зелёный, если уже применилось на сервере, красноватый - если ошибка, желтоватый (как сейчас) если ещё не отсылалось на сервер (это для офлайн-режима), и т.п. Кнопка delete - давай в правом верхнем углу карточки прямо в самом углу сделать аккуратненький маленький крестик в рамочке, нейтрального цвета как сам фон карточки, который будет всегда виден.\n\n---\n_Порядок обработки: **F8-03** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-04] Lobby: стиль site + ссылка на профиль", "labels": [ 3, 17, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Привести Lobby к стилю главной страницы site (шрифт, левая навигация) и заменить шапку на «Player-xxxx» со ссылкой на редактируемый профиль.\n\n**Пункты из #43:**\n\n> **4.** Lobby. Было бы не лишним сделать в одном стиле в главной страницей site - тот же шрифт, та же навигация слева.\n> **5.** Lobby. Заголовки \"you are logged in\", \"device session id\" убираем, вместо \"hello, Player-xxxxxxxx\" давай напишем просто \"Player-xxxxxxxx\" со ссылкой на редактируемый профиль пользователя (проверь, должны уже быть готовы соответствующие API - как минимум для редактирования language и username).\n\n_Заметка (бэкенд готов, работа чисто фронтовая)._ Команды `user.account.get` (отдаёт `user_name`, `display_name`, `preferred_language`, `time_zone`), `user.profile.update` (правит **только `display_name`**) и `user.settings.update` (`preferred_language`, `time_zone`) заведены в `gateway/internal/backendclient/` и уже вызываются из `ui/frontend/src/lib/screens/lobby-screen.svelte`. Редактируемое «имя» = `display_name`; `user_name` — неизменяемый handle `player-<suffix>` (`pkg/model/user/user.go:158`). Подтверждено владельцем: username = `display_name`.\n\n---\n_Порядок обработки: **F8-04** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-05] Игровой режим: чистка рудиментарного UI + однострочники инспектора", "labels": [ 3, 17, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Убрать рудиментарные элементы UI игрового режима и перевести инспектор на компактные однострочники.\n\n**Пункты из #43:**\n\n> **8.** Из выпадающего меню на карте (toggles для скрытия объектов) надо убрать wrap scrolling переключатель, это не свойство карты как таковой, а свойство игры (feature, которым будет обладать гейм-сервер, функционал UI полезный, но пока - только wrap).\n> **6.** Настройки language, кнопку logout из режима карты убираем, это прерогатива lobby. Вообще, это меню в режиме игры (settings, sessions, theme, language, logout) выглядит рудиментарным, я бы его полностью убрал. Предлагаю на его месте оставить только 2-позиционный тоггл для theme: сам выбор системная/светлая/темная останется в lobby, а в режиме игры - только простой тоггл светлая/темная, без запоминания, т.е. вышел в лобби - повторный вход в игру снова с настройкой, спроецированной из лобби.\n> **13.** Инспектор. Планета. Убрать кнопку rename, вместо это имя планеты сделать кликабельным, по клику - превращается в input и справа кнопка \"OK\" для применения нового имени в приказ.\n> **14.** Инспектор. Production. Два выпадающих списка в одной строке, в первом: industry/materials/research/ship, второй выпадающий список появляется в зависимости от контекста, для research/ship, обязательно в этой же строке две кнопки в виде небольших иконок. Зелёная галочка - применить в приказе, жёлтый крестик - отменить выбранные изменения. Кнопки становятся доступными при фактическом изменении производства на планете, то есть когда в выпадающих списках выбрано что-то иное от изначального состояния.\n> **16.** Инспектор. Cargo routes. Предлагаю так же сделать однострочник: выпадающий список col/ind/mat/emp, по умолчанию - ничего не выбрано. Можно избавиться от заголовка \"cargo routes\" и унести его в дефолтный пункт выпадающего списка. При выборе из списка, справа появляется та же стрелочка и номер планеты, с кнопками edit/remove, либо кнопка add, если маршрут данного типа ещё не был задан.\n> **32.** Inspector. Stationed ship groups. Список не влезает по горизонтали. Давай имена рас уберём в выпадающий список тоже, при выборе - внизу обновляем таблицу, но уже без первой колонки, конечно.\n\n_Заметка (объединил бывшие S3+S4+S8 по твоей просьбе — список покороче)._ Логически две связки: **(а)** чистка хрома игрового режима — убрать из меню карты тоггл wrap-scrolling (п.8) и весь рудиментарный gear-меню, оставив только эфемерный light/dark тоггл (п.6); **(б)** инспектор на единый идиом «компактная строка + apply/cancel»: начать с п.13 (он задаёт паттерн), затем п.14 и п.16, и п.32 (расы в дропдаун). Если внутри станет громоздко — расщеплю инспектор обратно в отдельный issue, скажи. Прим.: torus-баг cargo routes (п.15) вынесен отдельно (F8-07), здесь только UI-перекомпоновка cargo routes (п.16).\n\n---\n_Порядок обработки: **F8-05** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-06] Калькулятор: шаги, замочки, пол tech, баг speed-lock", "labels": [ 1, 3, 17, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Калькулятор: корректные шаги числовых инпутов, унификация замочков, нижняя граница по текущему tech, фикс бага speed-lock.\n\n**Пункты из #43:**\n\n> **9.** Калькулятор. В числовых инпутах, относящихся к ship class (drive, weapons, shields, cargo) нажатие на стрелочку вверх (увеличение значения на 0.01) работает слишком буквально: в ячейке становится значние 0 -> 0.01 что не является валидным. Предлагаю от 0 вверх переходить сразу на 1, потом шаг +0.1. Аналогично, вниз: шаг -0.1, когда дошли до 1.0 следующее нажатие вниз сбрасывает на ноль.\n> **10.** Калькулятор. \"Пляшут\" замочки при ручном вводе tech-уровней для класса корабля. Давай оставим справа от полей ввода всегда зарезервированное место под эти замочки, чтобы их пропада-появление не влияла на ширину полей tech. То же самое с полем ввода MAT планеты. Вообще, предлагаю для уменьшения шума и унификации некоторой логики, сделать tech-замочки и MAT-замочек в такой же логике, как и lock-замочки в секции ниже: по умолчанию отображается число и рядом открытый замок. Когда пользователь нажимает на замок - он становится закрытым и вместо числа появляется input для возможности ввода своего значения.\n> **11.** Калькулятор. Поля для уровней tech не должны быть меньше текущего уровня технологий игрока на данном ходе.\n> **12.** Калькулятор. Задаю параметры корабля D=1 W=0 A=0 S=0 C=0, скорость у него считается 20. Но когда я нажимаю на замочек напротив \"speed\" - появляется инпут со значением 20 и красной рамкой с ошибкой \"this target cannot be reached within the current design\", это явный баг UI.\n\n_Заметка._ п.9 и п.12 — баги; п.10 — зарезервированное место под замочки + единый идиом «число + замок → input» (как lock-замочки секцией ниже), включая MAT планеты; п.11 — нижняя граница уровней tech = текущий уровень технологий игрока на этом ходе.\n\n---\n_Порядок обработки: **F8-06** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-07] Cargo routes: расстояние с учётом torus-wrap", "labels": [ 1, 17, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Учитывать torus-wrap при расчёте расстояний в picker маршрутов (сейчас считается «в лоб» через всю карту).\n\n**Пункты из #43:**\n\n> **15.** Инспектор. Cargo routes. При выборе типа маршрута и активации picker, ощущение такое, что не учитывается torus-wrap и расстояние до доступных планет считается \"в лоб\" через всю карту. Это баг.\n\n_Заметка._ Проверить, есть ли общий хелпер расстояния с учётом тора (на карте), и переиспользовать его.\n\n---\n_Порядок обработки: **F8-07** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-08] Формат чисел: моноширинный, фикс. точность, выравнивание", "labels": [ 1, 3, 17, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Единый формат чисел: моноширинно, фиксированная точность, выравнивание по правому краю, без разделителей разрядов.\n\n**Пункты из #43:**\n\n> **17.** inspector. Выбрана планета или любой другой объект. Цифры из отчёта - coordinates, size, resources. и т.п. написать fixed-шрифтом, в одну строчку. Координаты - без круглых скобок по бокам. Убрать слово \"stockpile\" из ind/mat заголовков, столбец распирают.\n> **25.** Меню turn report. player status. значения drive/weapons/shields/cargo - это не проценты, это уровни технологий. Отображать as-is из отчёта.\n> **26.** Меню turn report. Давай все цифры в отчёте сделаем фиксированым шрифтом, чтобы не прыгали перед глазами. При этом, если получится так сделать, табличные значения в одной колонке выровнять по десятичной запятой по вертикали, не знаю, как это сефас делается, с помощью стилей или \"добиванием\" пробелами фиксированных шрифтов.\n> **27.** Вдогонку к 26. обрати внимание на tools/local-dev/reports/dg/KNNTS041.REP - в Status of Players все цифры имеют точность 2 знака после запятой, никаких разделителей разрядов. В таблицах turn report надо отображать точно так же, тогда проблема с выравниванием уйдет - просто по правому краю и будет красиво. Единственный нюанс, в legacy-отчетах точность 2 знака, в нашем случае game engine будет присылать 3 знака после десятичной запятой.\n\n_Заметка._ Общий util формата; точность: legacy 2 знака / game engine 3 знака после запятой (эталон — `tools/local-dev/reports/dg/KNNTS041.REP`, секция Status of Players); п.25 — drive/weapons/shields/cargo это **уровни технологий**, не проценты, отображать as-is. Затрагивает inspector (п.17) и turn report (п.26/27) — один util на оба.\n\n---\n_Порядок обработки: **F8-08** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-09] Turn report: липкое/сворачиваемое меню разделов", "labels": [ 3, 17, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Меню разделов turn report не должно уезжать при прокрутке и съедать ширину; убрать под иконку/popup; удалить «Back to map».\n\n**Пункты из #43:**\n\n> **24.** Меню turn report. Левое меню (summary/votes/player status,...) во время прокрутки не должно уезжать. Вообще, оно дико мешает на длинном отчёте, когда место слева просто пропадает, а таблицы сжимаются по горизонтали. Давай попробуем это меню убрать под иконку в раскрывающийся popup-меню? Или что-нибудь ещё, что логически хорошо ляжет на десктоп и мобильную версию. \"Back to map\" кнопку можно удалять, она есть в главном выпадающем меню.\n\n_Заметка._ Решение должно одинаково ложиться на десктоп и мобильную версию. «Back to map» уже есть в главном выпадающем меню.\n\n---\n_Порядок обработки: **F8-09** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-10] Таблицы: planets / ship classes / ship groups / fleets", "labels": [ 2, 3, 16, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Реализовать таблицы planets / ship classes / ship groups / fleets с фильтрами и переходом на карту.\n\n**Пункты из #43:**\n\n> **19.** Меню table -> planets: пусто. Давай сделаем список всех планет из отчёта с фильтрами по собственным, ничейным, неизвестным и фильтром по владельцу, если планета чужая. Клик по планете - уводит на карту, планета становится выбранной и центруется.\n> **20.** Меню table -> ship classes. Запретить удалять классы, которые сейчас используются, то есть имеются ship groups с этими классами. Игровой сервер всё равно даст ошибку.\n> **21.** Меню table -> ship groups. Давай сделаем аналогично planets, но дополним фильтром по планетам. Клик по группе которая не in_space - так же выбирает планету на карте.\n> **22.** Меню table -> fleets, тоже надо реализовать, сейчас там заглушка.\n\n_Заметка._ Общий паттерн «фильтруемая таблица + клик → карта»: п.19 задаёт паттерн, п.21 и п.22 переиспользуют; п.21 добавляет фильтр по планетам и выбор планеты для не-in_space групп; п.20 — запрет удаления ship classes, используемых существующими ship groups.\n\n---\n_Порядок обработки: **F8-10** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-11] Battle log: таблица битв", "labels": [ 2, 16, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Таблица битв в battle log: планета, участники/наблюдатели, суммарная масса, сортировка по массе, клик → просмотр.\n\n**Пункты из #43:**\n\n> **23.** Меню \"battle log\". При переходе - battle not found, предлагаю выводить табличку: планета (название, номер), список участников и наблюдателей (участники - обычным цветом текста, наблюдатели - чуть более блеклым), общая масса кораблей участвовавших в сражении (кажется, мы это значение используем при отрисовке жирности крестов-маркеров на карте), сортировка таблицы - по убыванию общей массы. Клик на битве, конечно, ведёт на её просмотр.\n\n_Заметка._ Суммарная масса — та же величина, что задаёт жирность крестов-маркеров на карте; наблюдатели — более блеклым цветом текста; сортировка по убыванию массы.\n\n---\n_Порядок обработки: **F8-11** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" }, { "title": "[F8-12] Карта: zoom-инвариантность, подписи, выделение, нелинейный размер", "labels": [ 3, 16, 19 ], "body": "Подзадача полировки UI (этап **F8**), родительский #43.\n\n**Цель:** Карта: zoom-инвариантные линии и маркеры, подписи планет, выделение через рамку имени, нелинейный рост размера планет.\n\n**Пункты из #43:**\n\n> **28.** Карта. Все объекты, не имеющие физического размера - unidentified planets, линии маршрутов/кораблей, маркеры битв и бомбингов и т.п. - при увеличении карты не трансформировать, то есть толщины линий должны всегда оставаться постоянными. В случае с unidentified planets и Unidentified Groups - постоянным должен оставаться ещё и диаметр круга, в этом случае он должен быть совсем минимальным, буквально 2-3 пикселя.\n> **29.** Карта. Все планеты подписать внизу мелким шрифтом по формату [<name>|#<number>]. number отображается только если неизестно имя, ИЛИ выключен тоггл (его надо добавить, default=on) \"planet names\".\n> **30.** Карта. При выделении планеты не рисовать новую select-окружность вокруг. Вместо этого рисовать вокруг имени планеты (см. п. 29) рамочку с инверсной заливкой, а саму окружность планеты - я сейчас не про круг с заливкой, а про линию этого круга - рисовать таким же цветом, как инверсный фон рамочки названия. Аналогично про маркер бомбардировок - рисовать не отдельной уехавшей окружностью, а подчеркивать линией самого круга планеты.\n> **31.** Карта. Увеличение планет, чей размер известен, сделать нелинейным. Мне не нравится что на минимальном зуме планеты выглядят вроде бы как ОК - на самом деле не ок, ближайшие планеты друг на друга накладываются, что тоже так себе выглядит. Но вот при увеличении зума они становятся прям гигантскими и заполняют всю карту, а надо бы сделать так, чтобы размер планет сохранял свои пропорции, но увеличивался не пропорционально уровню зума, а с каким-нибудь понижающим коэффициентом, что ли... Тут надо будет вживую смотреть. Может, у тебя есть подходящая идея.\n\n_Заметка._ п.29 (подписи `[<name>|#<number>]` + тоггл «planet names», default on) — предпосылка для п.30 (рамка вокруг имени + цвет линии окружности/подчёркивание бомбардировок); п.31 (нелинейный размер) потребует живой подгонки на глаз — это ровно дух F8.\n\n---\n_Порядок обработки: **F8-12** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._" } ] for it in ISSUES: payload = {"title": it["title"], "body": it["body"], "labels": it["labels"], "assignees": ["developer"]} req = urllib.request.Request( BASE + "/api/v1/repos/" + REPO + "/issues", data=json.dumps(payload).encode("utf-8"), method="POST", headers={"Authorization": "token " + TOKEN, "Content-Type": "application/json"}) with urllib.request.urlopen(req) as resp: r = json.load(resp) print("created #%d %s" % (r["number"], r["title"])) ``` </details> ### Что дальше 1. Создаёшь issues (скриптом или руками — тела можно забрать прямо из скрипта). 2. Они появляются с `ready` + assignee `developer` → сами попадают ко мне в очередь. 3. При разборе очереди я беру их строго **F8-01 → F8-12**, по одной; babysit-ить лейблы не нужно. 4. **#43 остаётся зонтиком** (F8) — его закроешь ты, когда добьём все подзадачи; сама я issues не закрываю. Поставила себе `claude/blocked`, жду тебя. Если что-то в разбивке поправить (слить/расщепить, сдвинуть приоритет) — скажи, пересоберу. (^_^)
owner added
claude
done
and removed
claude
blocked
labels 2026-05-28 12:32:12 +00:00
owner closed this issue 2026-05-28 12:32:22 +00:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Reference: developer/galaxy-game#43