Основное (наша работа в этой сессии):
- Переименование «subserver» → «homeserver» по всему проекту: основной ESP32-скетч
(папка shine_subserver_ui → shine_homeserver_ui, .ino, flash-скрипт, режим burn.sh
homeserver-ui), скетч lvgl_nav_minimal_test (ключ homeserver.key:<имя>), spec-доки
reference/*, формат PDA (терминология session_type=100 «Homeserver пользователя»),
константа SESSION_TYPE_HOMESERVER в JS и Rust (значение 100 не менялось, формат не затронут),
pending/future доки, AGENTS.md, DAO-док. Сохранены отдельный lvgl_subserver_touch_test и
историческая пометка о рендейме в DERIVATION.md.
- Новый источник истины по деривации ключей: Dev_Docs/Keys/DERIVATION.md (Argon2id-секрет из
пароля, формула Ed25519(SHA-256(base64(secret)|suffix)), суффиксы root/bch/dev/homeserver.key,
Solana-ключ = dev.key). Уточнены роли root (главный/master) и dev (пополняемый кошелёк) в
Dev_Docs/Keys/README.md.
- UI: убран легаси-путь пустого пароля (derivePasswordSeed и др.), deriveMasterSecretFromPassword
бросает ошибку на пустом пароле, register-view блокирует пустой пароль; экран пополнения
переведён на канонический device-адрес из preGeneratedKeyBundle (удалён расходящийся
deriveWalletFromPassword).
Включены также параллельные правки Solana-аудита №3 (были в рабочем дереве, переплетены в lib.rs):
- shine_users: defense-in-depth «строгий список аккаунтов» (require!(it.next().is_none()))
в init/update economy config и create/update user PDA, плюс описание в doc/programs/shine_users.md;
- Dev_Docs/audit/Solana-audit-3-by-Claude-12июня2026.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
shine_payments + shine_users:
- create_pda_account переведён на «создание поверх предзаполненного»
(allocate+assign+добор ренты), чтобы подсев лампортов на детерминированный
адрес PDA (тикет/логин) не блокировал создание — закрыт LOW из аудита №1;
в shine_payments is_uninitialized_account перестала зависеть от баланса.
shine_payments (HIGH из аудита №2):
- запрещён recipient == inflow_vault в buy_ticket*, manager_add_ticket и
change_ticket_recipient; добавлена защита по умолчанию в transfer_from_vault
(require vault.key != recipient.key). Это убирает алиасинг аккаунта в
step_payout, который навсегда замораживал очередь выплат и средства вольта.
Документация и учёт:
- doc/programs/shine_payments.md §3.4, §10.1; doc/programs/shine_users.md §3.3;
- Dev_Docs/audit: добавлен аудит №2, обе закрытые находки помечены ИСПРАВЛЕНО;
- Dev_Docs/Pending_Features: две записи на ручную e2e-проверку на devnet;
- VERSION.properties: client 1.2.161, server 1.2.150.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Промежуточные итерации линий схлопнуты в один коммит. Убран мёртвый фильтр fg-plasma-turb. Лаборатория (/network-view/lab) и автотесты сохранены. Версия 1.2.158.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Вариант 2 (всё в лаборатории, реальный путь /network-view не трогаем).
- Общие связи: среди друзей человека один помечен как «общий» (он и твой друг тоже) — золотой ободок
+ ★ (CSS .fg-node.is-common). В лаб-генерации addDeepLevels подставляет узнаваемого друга Ивана.
- Доступность: визуально скрытый (sr-only) текстовый список графа .fg-a11y (центр + связи 1-го уровня)
для скринридеров; обновляется в updateA11y при перестроении (role=region, aria-label).
Автопроверки расширены до 19 ассертов (добавлены «общие связи ★» и sr-only список) — прогон 19/19 PASS.
Бамп client.version → 1.2.150.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Всё в лаборатории (вариант 2: реальный путь /network-view не трогаем).
- Поиск + телепорт: строка .fg-search; Enter → graph.findNode(имя) → камера летит к узлу
(dive в «Вселенной», иначе перецентр).
- Хлебные крошки: .fg-breadcrumb «Иван › Нина › Ада» (движок шлёт onDiveChange(path), API getDivePath);
клик по корню — полный сброс, по предку — навигация на его уровень.
- Бейдж числа связей: .fg-node-badge (degreeById → updateBadges; у центра — число связей 1-го уровня).
- Цветовые кластеры: мягкая аура узла по типу связи (CSS is-family/friend/business/contact).
Автопроверки расширены до 17 ассертов (добавлены поиск/крошки/бейдж) — прогон 17/17 PASS.
Фикс: TDZ breadcrumbEl (объявлен до createForceGraph, т.к. onDiveChange вызывается при монтировании).
Бамп client.version → 1.2.149.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Усиления (движок-полиш) с детерминированной самопроверкой:
- Веер детей — полукругом «наружу» (DEEP_FAN, по sibIndex от направления деда→родитель): не перекрывает
нить-крошку и родителя; равномерное распределение.
- LOD с гистерезисом (LOD_ZOOM_UP=1.6 / DOWN=1.4) — точки 3-го уровня ↔ аватарки без «мигания» у порога.
- Двойной тап по пустому фону и сильный pinch-out на минимальном зуме = быстрый выход из погружения.
- Префетч аватарок детей при наведении/нырке (prefetchChildren) — лица в кэше до раскрытия.
Автопроверки (dev-only, ТОЛЬКО при ?fgtest):
- js/pages/network/selftest.js — 14 ассертов: камера-центровка, collision (нет слипания), полукруг,
spotlight (путь 1.0 / фон 0.25 / сброс при переключении / 100% на выходе), LOD, возврат зума.
- Движок: read-only graph.debugState() + graph.pumpForTest() (синхронно докручивает кадры до покоя,
не зависит от троттлинга rAF в фоне). Граф как window.__fg — тоже только при ?fgtest.
- Прогон: 14/14 PASS (offset 0px, мин.дистанция детей 89px, веер ±99°, LOD 4/4).
В обычной работе тест-хелперы не активны. Реальный путь /network-view не затронут. Бамп client → 1.2.148.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>