---
name: geo
description: "GEO-замер — цитируют ли нас AI-движки. Три стадии (краул → индекс → цитата), каждая мерится отдельно. Используй, когда речь про находимость, SEO/GEO, «почему нас не видно», выкладку наружу, или перед решением «делать ещё контент»."
version: 1.0.0
---

# /geo — замер находимости в AI-движках

**Боль, из-за которой скилл существует.** 04.08.2026 мы чуть не «отмасштабировали»
уже решённую стадию. Логи показали 13 845 обращений краулеров за 9 дней — выглядело
как успех. Замер показал: страниц в индексе Bing/DDG **ноль**, а Gemini на прямой
вопрос про наш домен отвечает «no verifiable independent lab operating under that name».
Без замера мы бы потратили недели на красивые страницы, которых никто не увидит.

## Три стадии — не одна

```
КРАУЛ  ──►  ИНДЕКС  ──►  ЦИТАТА
робот      страница      движок называет
пришёл     в выдаче      нас в ответе
```

Стадии проваливаются независимо, и лечатся РАЗНЫМ:

| Провалена стадия | Симптом | Лечение | НЕ лечится |
|---|---|---|---|
| Краул | ботов в логах нет | robots, sitemap, статика без JS, llms.txt | контентом |
| Индекс | боты ходят, в выдаче нас нет | **ссылочная масса**, возраст, различимое имя | ещё одной страницей |
| Цитата | в выдаче есть, в ответах нет | атрибутируемый формат, `CITATION.cff`, присутствие в курируемых списках | рекламой |

Замер 04.08: краул ✅ · индекс ❌ · цитата ❌.

## Наше преимущество — мы владеем origin

Почти никто не знает, какие его страницы AI-краулеры **перечитывают**, а какие
взяли один раз и забыли. Мы владеем origin, значит видим логи, значит считаем
частоту возврата по каждому URL. Это превращает GEO из гадания в цикл.

## Как запускать

```bash
python ~/.claude/scripts/geo_measure.py --all --verbose
```

- `--crawl` — кто из движков ходил, на какие URL, как часто возвращается
- `--index` — есть ли мы в выдаче (сперва контроль прибора, см. ниже)
- `--format` — готовность артефактов к цитированию (зовёт `publish_format_gate.py`)
- `--html PATH` — дашборд ([[prefer-visual-dashboards]])
- `--selftest` — доказать, что парсер умеет краснеть

Коды: `0` картина снята · `1` есть красное · `4` **прибор не смог измерить**.

## ⚠️ Железный контракт: ноль — вердикт только после контроля

Скрипт СНАЧАЛА ищет чужую фразу, про которую доказано, что она в индексе есть.
Контроль не нашёлся → скрипт печатает «прибор не отвечает» и выходит `4`,
**не показав наших цифр**. Потому что «0 результатов» одинаково выглядит
и когда нас нет в индексе, и когда сломалась качалка.

Это [[prichina-kak-claim]] в коде: индикатор — такой же claim, как вывод.
04.08 DDG-эндпоинт начал отдавать пустую оболочку — скилл честно вернул `4`,
а не «поздравляю, коллизий нет».

Прибор умер → мерить другим каналом (браузер с логинами, `WebSearch`), а не
объявлять ноль. Bing CAPTCHA не обходим.

## Замер по самим движкам

### Автоматически: prompt-panel (сначала — она дешевле рук)

Стадию «цитата» БОЛЬШЕ НЕ начинаем с рук. Прибор `~/.claude/scripts/prompt_panel.py`
(ZBOOKG8, вс 03:00, OS-задача `prompt-panel-weekly`) гоняет 25 тематических запросов
EN+RU по подписочным рельсам и пишет `mention`/`urls` в
`~/.claude/prompt_panel/<дата>.jsonl`. Ноль LLM в логике, денег не тратит.

```
python ~/.claude/scripts/prompt_panel.py --summary            # таблица движок x доля x URL
python ~/.claude/scripts/prompt_panel.py --run --timeout 400  # внеочередной замер
```

⚠️ Запросы спрашивают по ТЕМЕ, а не по имени: «кто такой <имя>» проверяет ИНДЕКС,
а не цитируемость, и даёт удобный, но пустой ноль.

🔴 **Цифра панели — ПОТОЛОК, а не замер** (замер 10.09.2026). Подписочный CLI знает
хозяина: без нейтрального режима grok дал 24%, с ним 8%, но канарейка доказала утечку и
после флага — `--tools ""` у grok 0.2.118 инструменты не выключает, рельса читает диск.
Поэтому ненулевую долю читай как «не больше чем», а ноль — как честный ноль
(контекст может только ЗАВЫСИТЬ). Проверять изоляцию — только КАНАРЕЙКОЙ (файл с
уникальной строкой), вопрос «кто я?» не годится: нейтральный промпт приказывает не знать
имя, и модель просто слушается. Честно анонимная дверь пока не построена — задача заведена. Менять формулировки в
`prompt_panel_queries.json` = ломать базовую линию: заводи новую версию файла.
Базовая линия: [[measure-2026-09-10-prompt-panel-baseline]].

### Руками, браузером — то, куда панель не достаёт

Perplexity и Алиса своей двери у нас нет, там по-прежнему руки:
Perplexity **разлогиненным** (рекрутер видит именно такую выдачу, не
персонализированную), плюс Gemini, ChatGPT, Grok, Claude.ai.

Протокол — критерии называются ДО старта ([[shadow-first-mvp-pattern]]):

| # | Вопрос | Что доказывает |
|---|---|---|
| Q1 | слепой профильный вопрос без нашего имени | попадаем ли в ответ вообще |
| Q2 | по имени нашего артефакта | не перехватил ли тёзка |
| Q3 | наведённый на наш домен | что движок про нас утверждает |
| Q4 | дословная фраза + `site:` | есть ли мы в индексе |

Исходы: `цитата+ссылка` / `упомянут` / `нет нас` / `выдумал`.
Один движок — не замер: у каждого своя грунтовка. Отказ движка
(«нет живого доступа») — состояние прибора, не наш результат.

## Границы
- Скилл **мерит**, не чинит. Лечение индекса → `/borrowed-audience`;
  лечение формата → `08-Templates/publish-format.md`.
- Ничего не публикует и не постит.
- Логи origin — приватные, в публичный контент цифры IP не выносим.
