Перейти к основному содержимому

Вселенная (Knowledge Universe)

Что это

«Вселенная» показывает один проверенный срез знаний, работы, агентов, доказательств и кода. Sigma/WebGL рисует интерактивную карту, а режим «Список» остаётся клавиатурно доступной альтернативой с теми же линзой, поиском, фильтрами, выбором узла и Инспектором.

Линза отвечает на вопрос «какие данные показать?», а раскладка — «как их разместить?». Поэтому линза «Вся вселенная» и раскладка «Орбита» — разные переключатели.

Линзы

  • Вся вселенная — общий срез всех плоскостей.
  • Знания — поколения, утверждения, сущности, доказательства и источники.
  • Работа — поколения задач, задачи, запуски, агенты и навыки.
  • Агенты — пакеты, агенты, навыки, инструкции и адаптеры.
  • Доказательства — цепочки от утверждения к фрагменту и источнику.
  • Код — репозитории, файлы, модули, классы, функции, тесты, зависимости, сообщества, пути и области влияния.

Легенда перестраивается под активную линзу. Цвет показывает тип, а форма взаимодействия, подпись, размер, выделение и Инспектор дублируют смысл — цвет не является единственным носителем информации.

Три раскладки

Кнопки раскладок подписаны, имеют tooltip и состояние aria-pressed.

Орбита

Детерминированный обзор слоёв и типов. Координаты приходят из проверенного серверного snapshot. Физика не запускается: это стабильная карта для ориентации. На плотных срезах узлы, подписи и второстепенные рёбра уменьшаются по LOD, поэтому важные workspace, repository, god и bridge nodes остаются видимыми, но не превращаются в фоновый диск.

Тёмная тема: детерминированная раскладка «Орбита»

Связи

Собственный force-directed режим raytsystem для изучения реальных отношений. ForceAtlas2 в отдельном worker разводит слабо связанные компоненты и собирает плотные сообщества в различимые кластеры. Это не копия Obsidian, а отдельная раскладка raytsystem на текущем Sigma/Graphology-стеке.

Тёмная тема: глобальный force-directed граф с различимыми кластерами

Структура

Линейное/слоистое представление: узлы группируются по семантическим слоям. Оно полезно, когда важнее читать уровни и иерархию, чем форму сообществ. Физика здесь тоже не запускается.

Как работает «Связи»

Активный подграф

Физика считает только те узлы и рёбра, которые реально участвуют в текущей линзе, фильтрах и результате graph query. Скрытые фильтрами узлы не остаются внутри layout-графа, а все рёбра ссылаются на присутствующие узлы. После изменения фильтра подграф заменяется с короткой задержкой, чтобы не создавать новый worker на каждый символ поиска.

Если текущий фильтр скрывает выбранный узел, Инспектор не закрывается молча: интерфейс объясняет, что узел скрыт, и предлагает «Показать выбранный». Исходный snapshot и его отпечаток не меняются.

Начальные координаты и worker

Раскладка не начинается со случайного шума. Стабильный hash node_id разносит сообщества по разным центрам, даёт узлам внутри кластера небольшой детерминированный разброс, а изоляты выносит на периферию. Один snapshot с одними фильтрами даёт одни и те же стартовые координаты.

Затем ForceAtlas2 работает в web worker. Контроллер владеет ровно одним worker для текущего неизменяемого по топологии подграфа. Он останавливает его после трёх стабильных выборок или по жёсткому лимиту времени. При изменении snapshot, линзы, фильтров или раскладки, а также при уходе со страницы, старый worker уничтожается до создания нового.

Последние позиции и закрепления хранятся только в ограниченном ephemeral-кеше текущей браузерной сессии. Они не записываются в canonical knowledge, ledger или code graph.

Статус и управление

Панель «Связи» показывает число активных узлов, связей и закреплений, а также одно из состояний:

  • «Обновляем активный подграф…» — идёт отложенная замена после фильтра.
  • «Раскладываем граф…» — worker получил подграф и начал итерации.
  • «Физика активна» — координаты ещё меняются.
  • «Раскладка стабилизирована» — worker остановлен, а текущие координаты сохранены в сессии.
  • «Физика приостановлена» — движение остановлено пользователем.

Кнопка play/pause включает или приостанавливает физику. «Переразложить» очищает кеш этого подграфа, снимает все закрепления, восстанавливает детерминированный seed и заново запускает короткую симуляцию.

Перетаскивание и закрепление

  1. Нажмите на узел и переместите его. Камера на время drag блокируется.
  2. После реального перемещения узел закрепляется, а физика снова «разогревается».
  3. Кнопка с иконкой pin снимает или возвращает закрепление выбранного узла; Shift + click делает то же. Отдельная кнопка снимает все закрепления.

Обычный click по-прежнему выбирает узел и открывает Инспектор. Система завершает drag и возвращает управление камере при pointer cancel, потере pointer capture, смене вкладки, уходе курсора с canvas и смене раскладки.

Локальный фокус

Выберите узел и нажмите «Сфокусироваться» или сделайте двойной click. Камера плавно перейдёт к выбранному узлу и его соседям первого уровня; остальная карта будет приглушена. Кнопка «2 уровня» раскрывает ещё один переход, а «Весь граф» возвращает глобальный обзор. Фокус и его глубина — только состояние представления.

Локальный фокус: выбранный узел, его соседи и приглушённый остальной граф

Progressive disclosure и лимиты

В глобальном обзоре узлы малы, рёбра тонкие, а подписи остаются только у структурно важных узлов. Hover показывает узел, его ближайших соседей, входящие и исходящие рёбра; выбор добавляет устойчивое выделение, а сильное приближение раскрывает больше подписей. Длинные подписи сокращаются на canvas, полное значение остаётся в hover/Инспекторе.

Первый performance budget:

  • серверный snapshot ограничен 10 000 узлов и 50 000 рёбер;
  • режим «Связи» запускает worker для активного подграфа вплоть до этого предела — порог 500 больше не отключает физику;
  • до 100 узлов тайм-бюджет физики составляет 3 с, до 750 — 6 с, до 3 000 — 10 с, выше — 14 с;
  • после порога 5 000 активных узлов панель явно показывает «экономный уровень детализации»: все узлы по-прежнему участвуют в worker, но canvas удерживает минимальные подписи и тонкие рёбра;
  • worker может остановиться раньше тайм-бюджета, если координаты стабильны.

Эти лимиты означают, что карта из 10 000 узлов предназначена для поиска кластеров и мостов, а не для одновременного чтения каждой подписи. Для деталей используйте фильтры, локальный фокус, zoom или «Список».

Светлая тема: глобальный force-directed граф

Reduced motion

Если в системе включено prefers-reduced-motion: reduce, раскладка «Связи» не показывает непрерывное движение. Worker выполняет один ограниченный проход длительностью от 1 до 3,5 с, пока движется — canvas скрыт, а затем показывает конечные координаты. Переходы камеры тоже становятся мгновенными.

Линза «Код»

Линза «Код» добавляет статус свежести, метрики, графовый запрос, поиск пути, область влияния и фильтры по типу узла, типу связи, confidence, сообществу, роли и изменённым путям. Все три раскладки работают и в этой линзе.

Кнопки «Проверить», «Обновить изменённое», «Построить граф» и «Пересобрать» обслуживают только локальную производную проекцию графа кода. Canonical knowledge они не меняют. Обход и graph query доступны только для свежего code graph.

Частые ошибки

  • «Связи» выглядят неподвижно. Проверьте статус. «Раскладка стабилизирована» означает штатную остановку; нажмите play или «Переразложить». При reduced motion движение намеренно не показывается.
  • Граф пуст. Сбросьте поиск и фильтры или перейдите в «Список». Пустой и не имеющий рёбер подграф не запускает worker и не считается ошибкой.
  • Выбранный узел исчез. Прочитайте уведомление над графом и нажмите «Показать выбранный»; если snapshot сменился, Инспектор сохранит предыдущий контекст и объяснит ситуацию.
  • На большом графе мало подписей. Это не потеря данных, а LOD. Наведите курсор, выберите узел, приблизьте камеру, включите локальный фокус или откройте «Список».
  • Граф кода отсутствует или устарел. Нажмите «Построить граф» или «Пересобрать» и дождитесь состояния «Актуально». См. устранение этой ошибки.

Связанные страницы

Источники истины

  • web/src/features/Universe.tsx
  • web/src/features/graphLayout.ts
  • web/src/features/forceLayout.ts
  • src/raytsystem/universe.py