---
name: edge
description: >
  Показывает границу базы знаний — фронтирные страницы, у которых много исходящих
  связей и мало входящих, и предлагает для каждой связанные темы, которых ещё нет
  в базе. Read-only: только выводит статистику, не запускает поиск или
  заполнение. Решение, что углубить, принимает пользователь — обычно через
  /study. Триггеры: /edge, "edge", "границы базы", "что изучить дальше",
  "edge of vault", "purpose of vault", "куда расти".
allowed-tools: Read Glob Bash
---

# edge: статистика границы базы знаний

Граница базы — это страницы, которые упираются в неосвоенный контекст: ссылаются на много концепций, но мало кто ссылается на них в ответ. Скилл выводит такие страницы и предлагает для каждой родственные темы, которых в базе ещё нет.

**Read-only.** Скилл ничего не создаёт, не правит, не запускает другие скиллы. Решение «изучить дальше» принимает пользователь — обычно вызывая `/study <тема>` после анализа вывода.

---

## Команда и флаги

| Команда | Поведение |
|---|---|
| `/edge` | Top-10 фронтирных страниц + LLM-предложения по каждой |
| `/edge --top N` | Top-N (вместо 10) |
| `/edge --page <страница>` | Подробный разбор окрестности одной страницы |
| `/edge --raw` | Только статистика без LLM-предложений (быстрый режим) |

---

## Workflow

### Шаг 1. Запустить детерминированную статистику

```bash
python3 bin/edge.py --json --top 10
```

Возвращает JSON со списком фронтирных страниц. Для каждой:
- `name`, `path`, `type`, `domain[]`
- `out_degree`, `in_degree`, `out_targets[]` — список существующих wikilink-соседей
- `age_days`, `recency_weight`, `score`

`out_targets` критичен для шага 3: это уже занятые направления, которые в предложениях упоминать не нужно.

Для одной страницы:

```bash
python3 bin/edge.py --json --page "<имя или путь>"
```

Если эмиттер вернул `EXIT_USAGE` (страница не найдена) — сообщи пользователю, какие имена существуют (`ls wiki/ideas/ wiki/entities/ wiki/questions/ wiki/minds/`).

Если top-список пуст (вся база интегрирована или базы пока нет) — так и скажи: «фронтир пуст, база цельная».

### Шаг 2. Прочитать каждую фронтирную страницу

Для каждой страницы из top-N прочитай её содержимое (`Read` по `path` из JSON). Цель — понять, о чём страница, чтобы шаг 3 предлагал именно родственные темы, а не общие слова.

### Шаг 3. Сгенерировать предложения

Для каждой фронтирной страницы предложи **3–5 родственных тем, которых нет в базе**.

**Источник предложений:** training knowledge LLM. Это уже не детерминированная часть — здесь скилл переключается на собственное знание модели.

**Жёсткие ограничения:**

1. **Не предлагать темы, которые уже есть в базе.** Список `out_targets` из JSON плюс полный `wiki/index.md` — игнорируемые имена. Если предложение совпадает с существующей страницей по смыслу (даже под другим именем) — не предлагай.
2. **Темы должны быть конкретными.** Не «расширить тему», а «Eligibility Traces» или «Out-of-Bag Error».
3. **Темы должны быть смежными по содержанию.** Если страница про GAE — предлагай вещи из RL/policy gradient, не общую философию ML.
4. **Каждое предложение — одна строка с пояснением 5–15 слов.** Зачем эта тема рядом с этой страницей.

Не нужно отсекать «слишком очевидные» темы. Если в базе есть [[GAE]] и нет [[Eligibility Traces]] — это **главный** кандидат, а не «слишком очевидный».

### Шаг 4. Сформировать вывод

Формат — таблица top-N со скором + развёрнутое описание окрестности и предложения для каждой страницы.

```
=== Граница базы знаний ===

Всего страниц в базе: N
Из ранжирования исключены типы: domain, meta

| # | score | out | in | age | type | страница |
|---|---|---|---|---|---|---|
| 1 | ... | ... | ... | ... | ... | [[Имя]] |
...

──────────────────────────────────────────────
[1] [[Имя страницы]]
    boundary: <score> (out=<o>, in=<i>, обновлено <d> дн. назад)
    domain: [[Domain1]], [[Domain2]]    # из frontmatter, если есть

    Что в базе уже есть из окрестности:
      [[Сосед1]], [[Сосед2]], [[Сосед3]]
      (это out_targets из bin/edge.py)

    Связанные темы вне базы:
      • Тема A — пояснение, зачем рядом
      • Тема B — пояснение
      • Тема C — пояснение

──────────────────────────────────────────────
[2] ...

Подсказка: `/study <тема>` для углубления одной из предложенных.
```

При `--raw` — только таблица без блоков «Что есть» и «Связанные темы вне базы».

При `--page <X>` — раздел для одной страницы, без таблицы топа.

---

## Ограничения

- **Никаких файлов на запись.** Скилл только читает: `wiki/**/*.md`, `wiki/index.md`. Не вызывает `bin/embed.py update`, не пишет в `log.md`, не трогает `cache.md`.
- **Не вызывает другие скиллы.** Если в выводе уместно «можно изучить через /study» — это текст-подсказка, не автоматическое делегирование.
- **Не предлагает создать страницы напрямую.** Если пользователь хочет создать страницу-стаб без изучения — это `/save` или ручной `Write`, не `/edge`.

---

## Почему домены и meta исключены

Domain-страницы — навигационные хабы (MOC). По устройству они ссылаются на каждую страницу домена и почти ни на что не ссылаются — у них всегда высокий out-degree и низкий in-degree. Если их не исключить, top фронтира забивается ими и теряет смысл.

Meta — это инфраструктура (cache, index, dashboard, отчёты lint), не содержательное знание.

Mind, idea, entity, question — все ранжируются.

---

## Связь с /lint и /study

| Скилл | Что делает | Когда использовать |
|---|---|---|
| `/lint` | находит **нарушения** консистентности (dead-link, orphan, contradiction) | проверка целостности уже накопленного |
| `/edge` | находит **направления роста** на границе интеграции | обзор, куда расширяться |
| `/study` | **расширяет** vault интерактивным изучением темы | заполнение пробелов |

`/edge` — диагностический скилл; `/study` — операционный. Между ними — выбор пользователя.
