База знаний по недвижимости на стандартной схеме gbrain
- Постоянная ссылка на этот отчёт: https://cons-realestate-gbrain-knowledge-base-research.pages.dev (открыть) — Cloudflare Pages, без срока жизни.
- Статус: предложение структуры. В базу gbrain ничего не загружено — по правилу проекта структуру сначала согласует Константин.
- Версия gbrain: 0.60.545.0.
G/=/Users/ws/.bun/install/global/node_modules/gbrain/. - Как проверено:
- код и документация gbrain прочитаны напрямую;
- русский стемминг проверен на временной базе PGLite в памяти; рабочую базу не открывали. Скрипт пробы — SCRIPT-task-009-pglite-russian-snowball-stemming-probe-names-and-nouns.mjs, его можно перезапустить;
- список OAuth-клиентов базы взят у живого сервера командой
gbrain mcp admin clients, она базу не открывает.
- Догадки помечены
🔮. - Как сделан отчёт:
- версия 1 прошла две независимые критики: Claude Opus и Cursor Grok 4.7 через Orca. Обе её не приняли;
- версия 2 исправляет их замечания; повторная проверка Claude Opus нашла ещё 10 правок, они внесены — REVIEW … claude-opus-recheck. Критики:
- их чек-листы:
- Что заменяет: PROPOSAL-task-009-… с рекомендацией «сейчас файлы без gbrain». Константин её отверг, отзыв дословно — LOG-task-009-konstantin-feedback-….
Решения Константина 02.11.2026 (после версии 2) — главнее текста ниже
- Структура в целом — согласен: общая база с cheaptrip, источники недвижимости, русский поиск, имена из вопроса 3а; выдержки из чатов с Ириной — в источник карточек.
- Торг — 1а: отдельных страниц торга и объявлений
нет. Цена и наши предложения — числовые факты
(
claim_metric:asking_price,our_offer,monthly_rent,deposit;claim_value;claim_unit: EUR; дата) на карточке квартиры. Наблюдения о торге — на карточке агента. Страница стандартного типаdealзаводится, только если торг охватывает несколько квартир сразу.- Пакет поэтому — только
placeиproperty(раздел 4.2, проверен загрузчиком: 25 типов, 18 связей). - Места ниже, где говорится о подтипах
listing/negotiation, поляхoutcome/lost_reasonи страницахdeals/…(4.1, 4.3, 4.6, 5.4), — прежний вариант 2б, он заменён этим решением.
- Пакет поэтому — только
- Почта — отложена. Подключать позже только ящик с
уведомлениями Idealista (
konstantinp255@gmail.com), способом Константина. Будущая задача: замечать уведомления «вам ответили» на его сообщения в Idealista. - Лемматизация через LLM: сейчас — формы имён пишет в
алиасы и текст агент, который раскладывает заметки; расширение запроса
моделью (
expansion_model) включится вместе с векторами (G/docs/guides/search-modes.md:70-72).
0. Как понял задачу
Одиннадцать требований Константина его словами (сообщения 02.11.2026):
- Долгосрочность. «Я хочу на долгосрок. Именно поэтому я использую базу знаний».
- Рост на другие темы и проекты. «сейчас по недвижимости такой вопрос, потом по какой-то еще теме», «на разные проекты, на разные задачи». Это главное: «потенциал на расширение, потенциал на развитие. И это ключевое».
- CRM: компания и сотрудники в одном месте. «есть компании. Есть сотрудники этой компании. И все в одном месте».
- Обогащение из WhatsApp. «я по WhatsApp упишу, а ну хуяка обогащается. Я знаю, что этого… зовут Франку… а вот это Адрес».
- Обогащение из почты. «мне на почту что-то написали, и это все добавилось к карточке».
- Разные агенты. «базу знания… которые могут использовать мои разные агенты».
- Стандартная схема gbrain. «хочу стандартную схему базы данных [gbrain] использовать… какие там еще у них схемы есть?», «сейчас у них БС2. А до этого была рекомендованная схема».
- Места и гео. «там были схемы, где есть места… География… по сути, теги могут быть».
- Проверка истинности. «Масштабируемая… система, четкая, с поверкой истинности».
- Русский поиск. «не знаешь, что такое Лемма… лексема… по умолчанию английский язык… на настройках на русских поставить можно».
- Векторы при росте. «Я подключу API, но не на 5… заметках… Будет 500 заметок. Подключу вектор».
Роль агента (уточнение Константина 02.11.2026, после версии 2):
- агент — секретарь базы знаний. Когда Константин общается с агентами недвижимости (WhatsApp) или нашёл объект и обсуждает его в чате Telegram, агент чётко структурирует его замечания, заметки и наблюдения и заносит в базу — с источником и датой;
- квартиры агент не ищет, критерии не предлагает, задачи и вопросы по старым сообщениям не придумывает: «я не просил твоих предложений по квартирам. у тебя вообще другая роль»;
- прописка (empadronamiento) при аренде не нужна — такого критерия не было;
- описание задачи с критериями готовности — отдельный шаг до внедрения, ждёт «ок» Константина.
Ещё два условия к работе:
- нужна система, а не «колхоз и костыли»: практичная и обновляемая;
- результат публикуется постоянно: «На Cloudflare опубликуй новый ресерч»; ссылка на сутки «для временной задачи», а здесь нужна «вечная ссылка».
1. Что в прошлом отчёте было неверно
| Что писали | Как на самом деле | Где проверить |
|---|---|---|
| «гео в gbrain нет вовсе» | Тип place (places/) есть в стандартном
пакете gbrain-recommended. Район — страница-место, квартиры
ссылаются на неё. Фильтр where находит значение и в
поле-списке (теги). Нет только пространственного индекса (радиус,
PostGIS); расстояние до пляжа считает скрипт по данным базы |
G/src/core/schema-pack/base/gbrain-recommended.yaml:112-118;
G/src/core/search/frontmatter-where.ts:1-7 |
| «отдельная база пускает одну сессию за раз» | У базы PGLite один процесс-владелец. Решение в той же документации —
один общий gbrain serve --http, к нему подключаются все
агенты; у вас он уже работает службой на 127.0.0.1:3131.
Цена ограничения в разделе 10: при живой службе команды CLI, которые
открывают базу, падают, кроме sync и
sweep --once |
G/docs/mcp/CLAUDE_CODE.md:92-100;
G/docs/guides/remote-mcp.md:427-436 |
| «без ключей с оплатой пользы мало» | Без платных ключей работают поиск по словам, извлечение фактов через
подписку (claude-cli) и «открытые петли» по почте. Векторы
— бесплатно через Ollama или за копейки через API, когда заметок станет
~500 |
G/src/core/ai/recipes/ollama.ts:53;
G/src/core/embedding-pricing.ts:38-87 |
| «русский нельзя включить без переиндексации cheaptrip» — как довод против | Язык один на всю базу, это правда. Но cheaptrip тоже русский: переиндексация полезна обоим | G/docs/guides/multi-language-fts.md:103-105 |
своя модель RESO/EspoCRM с типами agent,
agency |
В стандарте уже есть person, company и
связь works_at ↔︎ employs. Поле
company: у страницы человека создаёт связь само, при любом
пакете |
G/src/core/link-extraction.ts:1607-1610,2009-2014;
G/src/core/schema-pack/base/gbrain-base-v2.yaml:419-420 |
| страницы — «копия JSON, руками не правится» | При такой схеме обогащение невозможно: следующая сборка сотрёт факт, который дописал агент. В gbrain страницы ведёт агент | G/docs/GBRAIN_RECOMMENDED_SCHEMA.md:80 |
| ссылка here.now на 24 часа | Постоянная публикация на Cloudflare Pages, ссылка — первая строка этого отчёта | — |
2. Термины
- Пакет схемы (schema pack) — YAML-файл с правилами
базы:
- какие бывают типы страниц (
page_types) и в каких папках они живут (path_prefixes); - какие бывают связи (
link_types); - какие поля шапки превращаются в связи
(
frontmatter_links); - какие типы обогащаются (
enrichable_types). - Активен один пакет на базу или на источник. Наследование —
extends, заимствование типов —borrow_from. Поляphasesиmapping_rulesобъявляет только сам пакет (G/src/core/schema-pack/merge.ts:8-21).
- какие бывают типы страниц (
- primitive — базовый вид типа, задаёт значения по
умолчанию (
G/src/core/schema-pack/primitives.ts:36-74):entity— человек, компания, место. Связиworks_at,founded,invested_in,advises,attended,mentions; поляaliases,email,location,role; по умолчанию извлекаемый и с экспертным поиском;temporal— событие с датой: встреча, сделка, переписка; поляdate,attendees,duration,location;concept— понятие, проект, заметка; полеtags;media— документ, статья;annotation— служебная пометка с уверенностью и источником.
- Источник (source) — отдельный git-репозиторий с
markdown внутри одной базы. Ключ страницы — пара
(source_id, slug). - База (brain) — отдельная база данных со своими
бэкапами, правами и языком поиска.
- Правило gbrain: «if the data owner changes, it's a brain boundary.
If the data owner stays the same but the topic/repo changes, it's a
source boundary»
(
G/docs/architecture/brains-and-sources.md:63-64). - Перевод: сменился владелец данных — нужна отдельная база; владелец тот же, а меняется тема — отдельный источник.
- Правило gbrain: «if the data owner changes, it's a brain boundary.
If the data owner stays the same but the topic/repo changes, it's a
source boundary»
(
- Compiled truth + Timeline — устройство карточки
(
G/docs/guides/compiled-truth.md:116-128):- сверху сводка «как сейчас», переписывается целиком;
- снизу хронология, только дописывается;
- граница — строка
<!-- timeline -->. Так пишет страницы сам gbrain. Голый---перед## Timeline— запасной путь для старых файлов.
- Факт (fact) — проверяемое утверждение о сущности:
цена, дата, кто где работает. Хранится в таблице
factsс источником, датой, уверенностью и уровнем доверия. - Мнение (take) — кто во что верит: вид
take(мнение),bet(прогноз),hunch(интуиция),fact. У мнения есть держатель (people/…,brain,world) и вес (G/docs/takes-vs-facts.md:1-20).- Пример: «Franco жёстко торгуется» — мнение, держатель
people/konstantin. «Цена 176 000 €» — факт.
- Пример: «Franco жёстко торгуется» — мнение, держатель
- Уровень доверия (trust tier) — метка у каждого
факта, мнения и страницы
(
G/docs/guides/memory-trust.md:11-21):user_confirmed— подтверждено вами;operator_curated— «your notes»: синхронизация ваших источников;agent_written— записал агент;external_untrusted— переписка и коннекторы.
- Лексема — элемент
tsvectorв Postgres: нормализованная форма слова с позициями. Запрос совпадает с текстом, когда совпадают лексемы. - Лемма — словарная форма слова: «Михаилу» → «Михаил». Её даёт словарь морфологии (ispell или hunspell), а не алгоритм.
- Стемминг (Snowball) — алгоритм отрезает окончания
по правилам и слов не знает. Русский словарь
russian_stem— это стемминг. - Эмбеддинг (вектор) — числовой отпечаток смысла фрагмента текста. Находит «квартиру у моря», даже когда на странице написано «пляж в двух минутах».
3. Стандартные схемы gbrain — все восемь пакетов
Пакеты лежат в G/src/core/schema-pack/base/.
| Пакет | Наследует (extends) |
Назначение | Что важно для нас |
|---|---|---|---|
gbrain-base 1.0.0 |
— | прежнее «зашитое» поведение (gbrain-base.yaml:1-5); 28
типов страниц, page_types, строки 56–324 |
person, company, deal,
meeting, conversation, email;
frontmatter_links: company →
works_at; обогащение person,
company, deal (:381-423). Типа
place нет |
gbrain-base-v2 1.5.0 («БС2») |
— (самостоятельный) | в шапке — «15 канонических типов + note»; в
page_types сейчас 23 имени (строки 61–392) |
person, company (подтипы company / product
/ org), account (алиас crm,
«a customer or CRM record», :7-9,104-112),
deal, email, conversation,
meeting, project, note. Связи с
обратными: works_at ↔︎
employs, owes_to,
awaiting_reply_from, supersedes
(:400-442). Типа place нет.
Правило-«ловушка»: при чистке типов необъявленный тип становится
note (:649-657) |
gbrain-recommended 1.0.0 |
gbrain-base (v1) |
пакетная версия документа GBRAIN_RECOMMENDED_SCHEMA.md
(gbrain-recommended.yaml:1-10) |
place (entity, places/)
(:112-118), trip
(:120-126), deal, meeting,
project (entity), daily,
personal. Своих связей не объявляет, берёт из v1 |
company-brain 0.2.0 |
gbrain-base-v2
(company-brain.yaml:31) |
мозг компании: клиенты, конкуренты, поставщики, решения
(:36-128) |
готовый образец «свой пакет поверх v2»: свои связи
с inference.target_type, frontmatter_links
(поле owner → owned_by),
enrichable_types (:130-208) |
gbrain-creator 1.0.0 |
gbrain-base |
линза автора: атомы контента, фазы extract_atoms,
synthesize_concepts
(gbrain-creator.yaml:67-69) |
для CRM не нужна; пригодится, если база станет источником текстов |
gbrain-engineer 1.0.0 |
gbrain-base |
линза разработчика: тип learning
(learnings/) |
уроки агентов, не CRM |
gbrain-investor 1.0.0 |
gbrain-base |
линза инвестора: thesis, журнал ставок |
ставки вида «цена на Барселонете упадёт к весне» — 🔮 пригодится для решения о покупке |
gbrain-everything 1.0.0 |
gbrain-investor |
склейка трёх линз, чтобы обойти правило «один активный пакет»
(gbrain-everything.yaml:4-16) |
типов для недвижимости не добавляет |
Какой пакет у вас активен
~/.gbrain/config.json→"schema_pack": "gbrain-base-v2". Это уровень 6 из 7 по порядку выбора пакета (G/docs/architecture/schema-packs.md:150-165). Его записалgbrain init.- Уровень 7, запасной, —
gbrain-base, а не v2 (schema-packs.md:161-163). - 🔮 Уровни 3–4 (ключи в самой базе) не проверял.
- Под живой службой это делается через MCP
get_active_schema_pack— он только читает. gbrain schema activeоткрывает базу и при живой службе падает.
- Под живой службой это делается через MCP
Что говорит документ рекомендованной схемы о недвижимости
- В эссе
GBRAIN_RECOMMENDED_SCHEMA.mdпапкиplaces/нет. Недвижимость там упомянута одной строкой:household/ — domestic operations, properties, logistics(:151, правило выбора папки:990). - Тип
placeобъявлен только в пакетеgbrain-recommended.yaml:112-118. household/— папка для собственного хозяйства, то есть для ваших квартир, а не для рынка с сотней объявлений. 🔮 Квартиру, купленную на Барселонете, логично вести там.
Что из этого следует для выбора
- На «БС2» уже работают
person,company,works_at↔︎employs,deal,conversation,email. Это и есть CRM «компания ↔︎ сотрудники». - Места (
place) есть только вgbrain-recommended. Но он построен на старом v1: переход на него — откат, пропадутaccountи обратные связи v2. - Штатный способ получить и то и другое — свой пакет
extends: gbrain-base-v2с типомplaceи типами недвижимости. Так устроен поставляемыйcompany-brain. Как писать свой пакет —G/docs/schema-author-tutorial.md:15-174. Ключ API для этого не нужен (:15). - Правило-«ловушка» v2 в свой пакет не наследуется:
mapping_rulesобъявляет только сам пакет (merge.ts:19-20).
Два варианта, которые я разобрал и не предлагаю
- Включить
gbrain-recommendedцеликом.- Пример: карточка района
places/la-barcelonetaпоявится одной командойgbrain schema use gbrain-recommended. - Польза: ничего не писать самим.
- Цена: откат на v1 для всей базы, cheaptrip тоже теряет
accountи обратные связи; квартиры всё равно без своего типа. - Моё мнение: не брать. Свой пакет поверх v2 даёт
placeбез отката.
- Пример: карточка района
- Взять
company-brainкак пакет недвижимости.- Пример: агентство On Urbe —
supplier, мы — заказчик. - Польза: готовые связи
owned_by,champion, решенияdecision. - Цена: в нём нет ни мест, ни квартир; «клиент / конкурент / поставщик» — модель бизнеса, а не поиска жилья.
- Моё мнение: не брать как есть, но использовать как образец синтаксиса своего пакета.
- Пример: агентство On Urbe —
4. Модель недвижимости на стандартной схеме
Предлагаемый пакет —
cons-gbrain-base-v2-plus-places-and-properties
(extends: gbrain-base-v2). Добавляем только то, чего в
стандарте нет. Ниже — рекомендуемый вариант (вопрос 2, вариант 2б):
меньше всего новых типов.
4.1. Сущность → тип → папка
| Сущность | Тип | Откуда тип | Папка источника | Почему этот тип |
|---|---|---|---|---|
| Агентство (On Urbe Grup Barceloneta) | company |
v2 | companies/ |
стандартный тип CRM; участвует в whoknows |
| Агент (Franco, Fernando, Victor) | person |
v2 | people/ |
стандартный; поле company: даёт works_at,
обратная связь — employs |
| Общий аккаунт офиса в WhatsApp | account |
v2 | accounts/ |
v2 прямо определяет его как «CRM record». Это не человек: пишут разные сотрудники |
| Район, пляж, улица | place, подтипы district,
beach, street |
из gbrain-recommended |
places/ |
стандартный тип «место» |
| Дом (Sant Miquel 116) | place, подтип building |
то же | places/buildings/ |
дом — тоже место, у него есть адрес и координаты. Отдельный тип по правилу учебника пока рано (ниже) |
| Квартира (первая на Pescadors) | property |
единственный новый тип | properties/ |
в стандарте нет. Квартира существует и без объявления и торга |
| Объявление (Ukio ANFA 907 на весну 2027, Idealista) | deal, подтип listing |
v2 | deals/listings/ |
gbrain: «A financial transaction with terms… → deals/»
(GBRAIN_RECOMMENDED_SCHEMA.md:980). У объявления есть
условия: цена, даты, депозит |
| Переговоры, торг (пакет из двух квартир Pescadors) | deal, подтип negotiation |
v2 | deals/negotiations/ |
то же: условия плюс решение. Итог — поля outcome,
lost_by, lost_reason (4.6) |
| Просмотр квартиры (05.08.2026, Keller Williams) | meeting |
v2 | meetings/ |
поле attendees: даёт связь attended |
| Переписка WhatsApp | conversation |
v2 | conversations/whatsapp/ в отдельном
источнике |
с этого типа извлекаются факты
(G/src/core/facts/conversation-types.ts:30-37); пониженное
доверие (раздел 7) |
| Письмо | email |
v2 | emails/ |
то же |
| Поиск «купить у пляжа», «аренда весна 2027» — критерии записывает только Константин | project |
v2 | projects/ |
цель с критериями и сроком; к ней привязаны объявления и торги |
Почему так мало новых типов — правило учебника
gbrain (G/docs/schema-author-tutorial.md:212):
- меньше 20 страниц — новый тип не заводить;
- 20–100 — псевдоним или подтип;
- больше 100 — отдельный тип.
Сейчас квартир 20
(realestate-registry/REGISTRY-realestate-properties-apartments.json),
объявлений Ukio 5, домов единицы. Поэтому:
- дом — подтип
place, объявление — подтипdeal; property— тип, потому что стандартного типа, к которому квартиру можно привязать псевдонимом, нет:noteтеряет связи,place— не объект сделки.- 🔮 За годы поиска объявлений станет больше сотни. Тогда подтип
listingвыносится в свой тип правиломmapping_rules: retypeв том же пакете — штатный путь роста схемы, без переделки страниц.
4.2.
Пакет целиком — файл
~/.gbrain/schema-packs/cons-gbrain-base-v2-plus-places-and-properties/pack.yaml
- Путь — по
G/src/core/schema-pack/load-active.ts:114-125. Синтаксис — по образцуcompany-brain.yaml:36-208. - Файл тот же, что EXAMPLE-task-009-gbrain-schema-pack-cons-base-v2-plus-places-and-properties.yaml.
- Проверен загрузчиком gbrain — скрипт SCRIPT-task-009-validate-gbrain-schema-pack-file-and-merge-with-base-v2.ts,
он только читает файлы. Результат:
manifest OK … extends gbrain-base-v2;- после слияния с v2 — 25 типов, 21 связь: 23 из v2 плюс
placeиproperty; - у
dealподтипыlistingиnegotiation; - связи
works_at,located_in,negotiated_withна месте; mapping_rulesне унаследованы — 0.
- Первая версия была записана в стиле
{ … }, и загрузчик её отверг:INVALID_SHAPE, парсер YAML в gbrain фигурные скобки для объектов не принимает. Пишем блочным стилем, как в поставляемых пакетах.
api_version: gbrain-schema-pack-v1
name: cons-gbrain-base-v2-plus-places-and-properties
version: 0.1.0
gbrain_min_version: 0.42.0
extends: gbrain-base-v2
description: |
gbrain-base-v2 + места (place, как в gbrain-recommended) + квартиры (property).
Цена и торг — числовыми фактами на карточке квартиры (решение Константина 02.11.2026, 1а).
Один пакет на все источники базы.
page_types:
- name: place
primitive: entity
path_prefixes:
- places/
subtypes:
- name: building
when:
path_pattern: "^places/buildings/"
- name: beach
when:
frontmatter_field: place_kind
frontmatter_value: beach
- name: street
when:
frontmatter_field: place_kind
frontmatter_value: street
- name: district
when:
frontmatter_field: place_kind
frontmatter_value: district
aliases:
- location
- area
- district
- building
extractable: false
expert_routing: false
- name: property
primitive: entity
path_prefixes:
- properties/
subtypes:
- name: for-sale
when:
frontmatter_field: purpose
frontmatter_value: buy
- name: for-rent
when:
frontmatter_field: purpose
frontmatter_value: rent
aliases:
- apartment
- flat
- piso
extractable: false
expert_routing: false
link_types:
- name: located_in
inverse: location_of
inference:
page_type: property
target_type: place
frontmatter_links:
- page_type: property
fields: [place, building]
link_type: located_in
- page_type: place
fields: [within]
link_type: located_in
- page_type: company
fields: [place]
link_type: located_in
enrichable_types:
- type: property
filing_rules:
- kind: place
directory: places/
description: Одна страница на район, пляж, улицу; дома — places/buildings/
- kind: property
directory: properties/
description: Одна страница на квартиру (объект), независимо от объявленийОговорки:
- Поля
company,attendees,key_peopleвfrontmatter_linksпакета не объявлять. Иначе пакет вытеснит встроенную карту по этим полям (link-extraction.ts:2010-2013), и сломается автоматическая связьworks_at. enrichable_typesсейчас только метка: обогащение в коде по-прежнему зашито наperson,companyиdeal(G/src/core/schema-pack/enrichable.ts:12-26).
4.3. Связи
| Связь | От → к | Как создаётся | Где объявлена |
|---|---|---|---|
works_at ↔︎ employs |
person → company |
поле company: companies/on-urbe-grup-barceloneta у
человека |
встроенная карта link-extraction.ts:1607-1610 при любом
пакете; обратная — gbrain-base-v2.yaml:419-420 |
attended |
person → meeting |
поле attendees: у встречи |
link-extraction.ts:1620-1621 |
located_in ↔︎ location_of |
property, company, place →
place |
поля place:, building:,
within: |
пакет, раздел 4.2 |
about_property |
deal → property |
поле properties: (список) |
пакет |
counterparty |
deal → company |
поле counterparties: |
пакет |
negotiated_with |
deal → person |
поле agents: |
пакет |
relates_to, mentions |
любые | ссылка [[…]] в тексте |
v2 |
owes_to, awaiting_reply_from |
тред → человек | движок «открытых петель» по почте | v2; G/docs/guides/open-loops.md:83 |
4.4. Гео: что есть и чего нет
- Есть:
- тип
place— район, пляж, улица, дом; - связь
located_in: квартира ведёт на страницу района, а на странице района видны все объекты рядом (обратные ссылкиlocation_of); - поля
lat,lng,geo_precisionв шапке квартиры и места; - фильтр
where:place=places/la-barceloneta,tags=у-пляжа— по равенству или по элементу списка (frontmatter-where.ts:1-7).
- тип
- Нет:
- пространственного индекса (радиус, PostGIS). В коде координаты
встречаются только в EXIF картинок
(
G/src/core/import-file.ts:1688-1689); - фильтра «цена < 300 000»:
whereсравнивает только на равенство (G/src/core/ops/where-param.ts:10).
- пространственного индекса (радиус, PostGIS). В коде координаты
встречаются только в EXIF картинок
(
- Решение:
- генератор карты считает расстояние до пляжа и фильтрует по цене;
- он читает файлы репозитория источника — это и есть страницы базы, второй истины нет. Координаты лежат в одном месте, в шапке страницы;
gbrain export --source … --type property(G/src/commands/export.ts:73-74) открывает базу, при живой службе не годится.
- Ловушки:
list_pagesне отдаёт поля шапки: толькоslug,source_id,type,title,updated_at(G/src/core/ops/pages.ts:662-669);- параметр
whereвиден агентам только на полной поверхности MCP:fullSurfaceOnly: true(where-param.ts:10). Клиенту на поверхностиstarterнуженrequest_toolsили--surface full; - поиск не индексирует значения из шапки: «
gbrain search/querydo not index scalar frontmatter values… also state it in the body» (GBRAIN_RECOMMENDED_SCHEMA.md:109). Район, цену и адрес дублируем в тексте сводки.
4.5. Тип по пути — проверка на cheaptrip
- Тип страницы определяется по префиксу папки, найденному в
любом месте пути; первое совпадение побеждает
(
G/src/core/markdown.ts:1114-1133). - Проверено: в
cl-cheap-seoиcl-cheap-gbrain-pagesнет ни одного.mdв папкахplaces/,properties/,buildings/,listings/(git ls-files— 0). - Страницы cheaptrip новые типы не перетипизируют.
4.6. Итог переговоров — закрытый список
- Поля сделки:
outcome:open·won·lost;lost_by:me(отказали мы) ·them(отказали они) ·silence(никто не ответил);lost_reason— список из прошлого предложения, раздел 2:price-too-high;sold-or-rented-to-other;bad-condition;noise-or-street;floor-or-no-lift;location-outside-search-zone;agent-unresponsive;owner-refused-offer;we-chose-other;documents-problem;- плюс комментарий.
- Правило: итог — поле в шапке плюс факт на карточке
сделки со ссылкой на сообщение, в котором он виден.
lostбезlost_reasonне записывается.
5. Пилот на реальных объектах
Данные — из реестров cl-cons-whats/realestate-registry/
и переписки. Телефоны в отчёте замаскированы. В базе, по совету gbrain,
они лежат в поле phones: в формате E.164 — это точный ключ
для склейки, а не псевдоним
(GBRAIN_RECOMMENDED_SCHEMA.md:187).
5.1.
companies/on-urbe-grup-barceloneta.md
---
type: company
title: "On Urbe Grup Barceloneta"
aliases: [On Urbe, OnUrbe Grup, On Urbe Grup]
website: https://onurbegrup.com
place: places/la-barceloneta
key_people: [people/franco-on-urbe, people/fernando-on-urbe, people/victor-on-urbe]
tags: [агентство, барселонета, покупка]
---
# On Urbe Grup Barceloneta
Агентство недвижимости на Барселонете (район la Barceloneta), с нами — только покупка.
Отвечают за минуты, пишут по-испански; цену хозяевам несут только с официальным
предложением и задатком 1 %.
<!-- timeline -->
- **2026-08-05** | WhatsApp офис On Urbe — начался торг за две квартиры на Carrer dels Pescadors пакетом
- **2026-10-27** | WhatsApp офис On Urbe — сами прислали новую квартиру- «Кто работает в On Urbe и кто торгуется?» → MCP
get_page companies/on-urbe-grup-barcelonetaи связиemploys. - «Какие агентства есть на Барселонете?» →
list_pagesсtype: companyиwhere: {place: places/la-barceloneta}(полная поверхность MCP).
5.2.
people/franco-on-urbe.md — тот самый «Франку»
---
type: person
title: "Franco (On Urbe Grup)"
aliases: [Franco, Франко, Франку]
company: companies/on-urbe-grup-barceloneta
role: real_estate_agent
languages: [es]
tags: [агент, покупка]
---
# Franco — агент On Urbe Grup Barceloneta
Пишет с общего аккаунта офиса. На вопрос о цене отвечает встречным
«¿Tu que numero tienes en mente?» — «какую сумму держишь в голове?».
<!--- gbrain:takes:begin -->
| # | claim | kind | who | weight | since | source |
|---|---|---|---|---|---|---|
| 1 | Franco торгуется встречным вопросом и цифру первым не называет | take | people/konstantin | 0.7 | 2026-08 | WhatsApp офис On Urbe, 27.08.2026 |
<!--- gbrain:takes:end -->
<!-- timeline -->
- **2026-08-27** | WhatsApp офис On Urbe — «el piso ya se ha rebajado de 185.000€»: цена снижена с 185 000 €
- **2026-08-31** | WhatsApp офис On Urbe — подтвердил, что квартиры юридически раздельные- Поле
company:само создаётworks_at→ On Urbe и обратную связьemploys(link-extraction.ts:1609). - Блок мнений — по формату
G/docs/guides/fence-format.md:32,90-106. Записывать его лучше командойtakes_add, а не руками (fence-format.md:17-18). - «Как зовут агента On Urbe, который торговался?» →
search "Франку". Алиас находит карточку, если запрос целиком совпадает с алиасом (G/src/core/search/alias-hop.ts:20-29).
5.3.
properties/carrer-dels-pescadors-on-urbe-first-flat.md
---
type: property
title: "Квартира на Carrer dels Pescadors (первая из пары On Urbe)"
purpose: buy
place: places/la-barceloneta
lat: 41.379 # 🔮 точность — улица, не дом
lng: 2.190
geo_precision: street
tags: [у-пляжа, покупка]
---
# Квартира на Carrer dels Pescadors
Барселонета, улица Pescadors. Продаётся вместе со второй квартирой,
пакет 352 000 €; цена одной снижена с 185 000 до 176 000 €.- Цена сознательно лежит в объявлении и в факте, а не в шапке квартиры: у одной квартиры может быть несколько объявлений.
5.4. Успешный и неуспешный торг
deals/negotiations/pescadors-two-flats-package-on-urbe-2026.md
— торг открыт:
---
type: deal
title: "Торг за две квартиры на Pescadors пакетом (On Urbe, 2026)"
properties: [properties/carrer-dels-pescadors-on-urbe-first-flat, properties/carrer-dels-pescadors-on-urbe-second-flat]
counterparties: [companies/on-urbe-grup-barceloneta]
agents: [people/franco-on-urbe]
project: projects/buy-apartment-near-beach-barceloneta
outcome: open # итог ждёт ответа Константина (старый вопрос 9, раздел 14)
---
# Торг за две квартиры на Pescadors пакетом
Цена 352 000 € за обе. Наши предложения: 290 000 € (05.08), 280 000 € (27.08).
31.08 агент позвал подать твёрдое предложение; дальше в переписке пусто.
<!-- timeline -->
- **2026-08-05** | WhatsApp офис On Urbe — предложили 290 000 €
- **2026-08-27** | WhatsApp офис On Urbe — предложили 280 000 €
- **2026-08-31** | WhatsApp офис On Urbe — зовут оформить официальное предложение с задатком 1 %deals/negotiations/housfy-calle-safareigs.md — торг не
состоялся:
---
type: deal
title: "Квартира Housfy на Calle Safareigs — отказ"
properties: [properties/calle-safareigs-08003-housfy]
counterparties: [companies/housfy]
outcome: lost
lost_by: me
lost_reason: location-outside-search-zone
---- Данные взяты из
EXAMPLE-task-009-negotiations-successful-and-unsuccessful-examples.md, строка 61; в реестре квартир отметкаrejected_by_me. - «Почему не купили у Housfy?» → поле
lost_reasonи факт со ссылкой на сообщение. - «Какие торги открыты?» →
list_pagesсtype: dealиwhere: {outcome: open}.
5.5.
places/la-barceloneta.md
type: place,place_kind: district, координаты центра района, ссылка на открытые данные Барселоны (barrila Barceloneta).- Обратные ссылки
location_ofдают список квартир, домов и агентств района.
6. Обогащение карточек
6.1. Из WhatsApp — цепочка на настоящем сообщении
Исходное сообщение —
CHAT-whatsapp-<номер>-on-urbe-grup.jsonl, запись:
timestamp: 2026-08-27T13:36:06Z;sender_name: On Urbe Grup;- текст «Mira, el piso ya se ha rebajado de 185.000€, ¿Tu que numero tienes en mente?» — «Смотри, квартира уже подешевела с 185 000 €, какую сумму держишь в голове?».
- Выгрузка — только чтение. Её уже делают скрипты
задач 002–008 через
wacli --read-only(правилоcl-cons-whats/CLAUDE.md: к WhatsApp агенты не обращаются, команды записи запускает только Константин). - Переписка становится страницей
conversation.- Конвертер:
cl-cons-whats/whatsapp-export-scripts/SCRIPT-whatsapp-chat-jsonl-to-gbrain-conversation-pages.py(пишется на шаге 9 порядка внедрения). - Вход:
CHAT-*.jsonl. - Выход:
conversations/whatsapp/<contact-slug>/<YYYY-MM>.mdв репозитории отдельного источникаrealestate-barcelona-whatsapp. Один файл — контакт и месяц. - Строка — формат WhatsApp «Export chat», который gbrain разбирает сам
(
whatsapp-iso,G/src/core/conversation-parser/builtins.ts:644-672):[27/08/26, 13:36:06] On Urbe Grup: Mira, el piso ya se ha rebajado de 185.000€, ¿Tu que numero tienes en mente? - Время в строке — UTC: у этого формата
timezone_policy: 'inline_utc'(builtins.ts:660). Поэтому конвертер переводит время не в Мадрид, а в UTC. - Текст сообщений — недоверенные данные. Источник получает уровень
external_untrusted(раздел 7).
- Конвертер:
- Синхронизация —
gbrain sync. Под живой службой команда сама передаётся вserve(remote-mcp.md:431-432). - Извлечение фактов по подписке.
- Модель —
gbrain config set facts.extraction_model claude-cli:claude-haiku-5-5. Модель — полным именем: короткий алиасhaikuведёт на старуюclaude-haiku-4-5-20251001(G/src/core/ai/recipes/claude-cli.ts:132-137). - Та же ловушка уже есть у вас: в
~/.gbrain/config.jsonстоитchat_model: claude-cli:sonnet, а алиасsonnetведёт наclaude-sonnet-4-6. В окне обслуживания заменить на полное имя актуальной модели. - Доступность модели проверяется функцией
isAvailable('chat', модель)(G/src/core/facts/extraction-availability.ts:23-28), аclaude-cliотвечает наchat(G/docs/ai-providers/claude-cli.md:7-13). 🔮 Подтвердить на одной переписке до массового прогона. - Пакетно —
gbrain extract-conversation-facts(G/src/commands/extract-conversation-facts.ts:1-25) в окне обслуживания. - Без окна — MCP
extract_factsсentity_hints: [people/franco-on-urbe],valid_from: 2026-08-27T13:36:06Z,source_slug= страница переписки (G/src/core/ops/facts.ts:60-80).
- Модель —
- Факт ложится на карточку.
- Строка в таблице
factsсentity_slug,source,valid_from,confidence; - зеркало в markdown — блок
gbrain:facts(fence-format.md:32-56); - пример факта: «цена квартиры Pescadors снижена с 185 000 €».
- Строка в таблице
- Сводка и хронология. Скилл
enrichпереписывает сводку и дописывает строку хронологии черезput_pageиadd_timeline_entry(G/skills/enrich/SKILL.md:1-25).
- Куда пишется факт.
extract_factsпишет в источник токена, по умолчаниюdefault(G/src/core/ops/facts.ts:111). Поэтому у агента, который извлекает факты недвижимости, первым в гранте должен стоятьrealestate-barcelona(шаг 6), иначе факты о квартирах уйдут в cheaptrip.
Итог: вопрос «как зовут агента On Urbe и что он предлагал» отвечается одной карточкой — с датой, ссылкой на сообщение и страницей переписки, у которой метка «external, untrusted».
6.2. Из почты
- Штатный путь gbrain: тип источника
google, каждый ящик — свой источник (G/recipes/email-to-brain.md;G/docs/guides/google-connect.md:96-100). - Без OAuth gbrain:
gbrain sources add gmail-cons --kind google --account <почта> --access command --token-command "<команда, печатающая access token>"(google-connect.md:436-472).- 🔮 Может ли
gwsпечатать access token для каждого ящика, не проверено.
- 🔮 Может ли
- Ящики — шесть, по файлу
/Users/ws/uno-cl/cl-cons-google-cli/HOWTO-gws-какие-почты-подключены-и-как-их-проверить-агентом.md:constantinbcnofficial@gmail.com— документы, банк, юристы, «сейчас»;konstantinp255@gmail.com— всё российское;all.whiteshadow@gmail.com— покупки, магазины;bcnclubcultureresearch@gmail.com;dobrostok.space@gmail.com;ppmetst@gmail.com.
- Что запускается на письмах
(
google-connect.md:319-353):- ссылки на людей;
- хронология;
- «открытые петли»: «мне написали, я не ответил 24 часа», «я спросил,
мне не ответили 72 часа» (
open-loops.md:16-28). Они пишутся в таблицуopen_loopsи связиowes_to/awaiting_reply_fromк странице человека (open-loops.md:83). Команда —gbrain waiting.
- Какие ящики подключать — вопрос 6.
7. Проверка истинности
- Происхождение у каждого факта.
rememberне принимает факт безprovenance(G/docs/protocol/MEMORY_VERBS_v1.md:272-274);- у факта есть
source,confidence0..1,valid_from/valid_until,superseded_by.
- Уровни доверия — по источникам
(
memory-trust.md:11-21):- карточки (
realestate-barcelona) синхронизируются из вашего репозитория и получаютoperator_curated— «your notes»; - переписка лежит в отдельном источнике
realestate-barcelona-whatsapp, ему ставитсяgbrain sources set-trust realestate-barcelona-whatsapp external_untrusted. Команда умеет только понижать доверие, работает только из локального CLI и действует на следующую синхронизацию (G/src/commands/sources-trust.ts:1-9); - без этого слова агентов попали бы в контекст как «ваши заметки». Это ломает и проверку истинности, и защиту от инструкций в чужом тексте;
- пакет у обоих источников один, иначе общее чтение откажет
(
G/src/core/schema-pack/op-trust-gate.ts:93-113).
- карточки (
- Подтверждение человеком: «Nothing ever becomes
"confirmed by you" without you typing a confirmation token at a terminal
on the brain host.
--yesnever confirms» (memory-trust.md:36-37). Команда —gbrain trust confirm. - Факты отдельно от мнений
(
G/docs/takes-vs-facts.md:1-20):- «176 000 €» — факт;
- «Franco торгуется встречным вопросом» — мнение с держателем
people/konstantinи весом; - мнения читаются командами
gbrain takes listиgbrain takes search.
- Замена устаревшего:
- вручную:
rememberсreplaces— новая цена заменяет старую, старая остаётся в истории; - автоматическая замена по сходству работает только с векторами
(
MEMORY_VERBS_v1.md:300-310).
- вручную:
- Противоречия:
gbrain eval suspected-contradictions— LLM-судья с порогом уверенности ≥ 0,7. Он предлагает команду исправления и сам базу не меняет (G/docs/contradictions.md:1-60,107-150). - Еженедельная чистка по рекомендованной схеме
(
GBRAIN_RECOMMENDED_SCHEMA.md:925-937):- дубликаты (Franco в двух карточках);
- противоречия;
- устаревшие сводки;
- сироты без входящих ссылок;
- утверждения без источника;
- новые варианты имён для
aliases.
- Правило, когда WhatsApp и почта расходятся:
- записываются оба факта, каждый со своим источником и датой;
- в сводке — более поздний, в хронологии — оба;
- пометка «расходится» — пока Константин не подтвердит одно
trust confirm.
- Не путать:
G/docs/GBRAIN_VERIFY.md— проверка установки, а не истинности фактов.
8. Русский поиск
- Сейчас: язык
englishпо умолчанию (G/src/core/fts-language.ts:45-75).- Кириллица ищется только по точной форме: «квартиру» не найдёт
«квартира». Проба:
to_tsvector('english','Михаил Михаилу квартиру')→'квартиру' 'михаил' 'михаилу'. - В
~/Library/LaunchAgents/com.gbrain.serve.plistи~/.gbrain/serve/gbrain-serve.shпеременнойGBRAIN_FTS_LANGUAGEнет. ~/.gbrain/.envне читал: файл с секретами.
- Кириллица ищется только по точной форме: «квартиру» не найдёт
«квартира». Проба:
- Включить русский:
- Строка
GBRAIN_FTS_LANGUAGE=russianв~/.gbrain/.env. Его читают и CLI (G/src/core/cli-preflight.ts:586), иgbrain serve(G/src/core/config.ts:720). Это файл с секретами, поэтому строку вписывает Константин или агент с его разрешения. - Почему переменная нужна каждому писателю:
- каждый
initSchema(), в том числеgbrain init --migrate-only, возвращает триггеры кenglish(fts-language.ts:86-100); - писатель без переменной индексирует новые строки по-английски
(
multi-language-fts.md:106-108).
- каждый
- В окне обслуживания:
gbrain reindex-search-vector --dry-run, затем--yes. Команда переписывает все страницы и фрагменты и после прерывания продолжает с контрольной точки (multi-language-fts.md:46-54,114-121).
- Строка
- Что даёт Snowball — проба, скрипт приложен:
квартира / квартиры / квартиру / квартирой→ одна лексемаквартир;агентство / агентства / агентству→агентств;переговоры / переговорах→переговор;- имена хуже:
Михаил Михаила→миха,Михаилу Михаилом→михаил. Snowball принимает «-ил» за глагольное окончание, как в «ходил». Запрос «Михаилу квартиру» по тексту «Михаил показал квартиры» —false.
- Лемматизация (словарь hunspell ru_RU и синонимы
перед стеммером) работает только на настоящем Postgres: «custom
configurations require a real Postgres instance»
(
multi-language-fts.md:96-99).- Проба на PGLite:
could not open dictionary file "/pglite/share/postgresql/tsearch_data/russian.dict"иextension "unaccent" is not available.
- Проба на PGLite:
- Как закрыть имена сейчас, на PGLite:
- алиасы в шапке (
Франку,Франко) — для запроса одним словом; - формы имени в тексте сводки — «Михаил (Михаила, Михаилу)»: тогда в векторе обе лексемы;
- при росте — векторы (раздел 9): они от языка не зависят
(
multi-language-fts.md:104-105); - на Postgres — hunspell и словарь синонимов имён.
- алиасы в шапке (
- Ограничение: один язык на всю базу. cheaptrip тоже русский, переключение полезно обоим.
9. Векторы
- Сейчас выключены:
embedding_disabled: trueв~/.gbrain/config.json.- Без провайдера эмбеддингов работает только поиск по словам
(
G/docs/ENGINES.md:544). claude-cliэмбеддингов не делает (claude-cli.md:20-24).
- Без провайдера эмбеддингов работает только поиск по словам
(
- Порог — слова Константина: около 500 заметок, ключ API он подключит сам. Агент ключ не задаёт.
- Что включится вместе с векторами:
- векторная часть гибридного поиска (слияние RRF,
G/src/core/search/hybrid.ts:1-9,57); - расширение запроса;
- автоматическая дедупликация и замена фактов;
- смысловой поиск по мнениям
(
takes search --semantic).
- векторная часть гибридного поиска (слияние RRF,
- Варианты:
| Провайдер | Цена за 1 млн токенов | ~500 заметок | Русский и испанский | Что нужно |
|---|---|---|---|---|
Ollama bge-m3 |
0 (ollama.ts:53), размерность 1024
(:49) |
0 | 🔮 многоязычная модель, по общим знаниям сильна для русского; в коде gbrain не проверяется | установить Ollama — только с согласия Константина; модель работает на этом Mac |
OpenAI text-embedding-3-small |
$0,02 (embedding-pricing.ts:38-87) |
≈ $0,02 | 🔮 многоязычная | ключ API — подключает Константин |
| Voyage-4 | $0,06 | ≈ $0,06 | 🔮 многоязычная | ключ API |
- Как включить без переделки:
gbrain migrate embeddings --to <provider:model> --dim N --dry-run, затем--max-cost-usd <предел> --yes(G/docs/embedding-migrations.md:3-13). Страницы и шапки менять не нужно. - Тонкость: пересчёт идёт по всей базе сразу,
--sourceего не сужает. - Мнение: выбор провайдера — когда будет 500 заметок.
Тогда сравнить
bge-m3и OpenAI на 20 своих запросах («агент, который торговался», «квартира у моря») — по ответам базы, а не по рекламе.
10. Доступ разных агентов
10.1. Один общий сервер — и его настоящая цена
- У вас уже работает служба
com.gbrain.serve→gbrain serve --http --port 3131. - Документация: «run ONE shared
gbrain serve --httpand point every client at it» (CLAUDE_CODE.md:97-100;G/docs/mcp/CODEX.md:273-283). - Цена — не узкая: «host-side commands that open the
database (
gbrain doctor,gbrain import,gbrain auth create, a secondgbrain serve) fail fast withlive_serve…gbrain syncandgbrain sweep --onceare the exceptions» (remote-mcp.md:429-432).- Список в цитате — примеры, а не полный перечень. Падает любая
команда, которая открывает базу:
schema active,sources add,reindex-search-vector,extract-conversation-facts,migrate embeddings,auth list,export.
- Список в цитате — примеры, а не полный перечень. Падает любая
команда, которая открывает базу:
- Как с этим работать — три пути:
- Окно обслуживания:
launchctl bootout gui/$(id -u)/com.gbrain.serve→ команды →launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.gbrain.serve.plist. Агенты в это время базу не видят. - Через живой сервер:
gbrain mcp admin … --admin-token-file ~/.gbrain/serve/admin-token,gbrain mcp grant …(remote-mcp.md:432-446) и инструменты MCP (extract_facts,get_active_schema_pack). - Postgres: «Concurrency: Single process | Connection
pooling» (
ENGINES.md:575). Переезд —gbrain migrate --to postgres(G/docs/guides/move-to-postgres.md:1-12).
- Окно обслуживания:
- Когда Postgres. Порог из документации — «PGLite:
Good for < 1,000 files; Postgres: Production-proven at 10K+»
(
ENGINES.md:572).- Сейчас: cheaptrip 231 файл; недвижимость — 25 + 36 + 20 карточек плюс переписка по месяцам.
- 🔮 Около 800 файлов — пора планировать переезд. Он же откроет лемматизацию и Hermes по stdio.
10.2. Агенты
| Агент | Подключение | Ограничение | Пишет в (первый источник гранта) | Что делать |
|---|---|---|---|---|
| Claude Code (эта машина) | MCP HTTP 127.0.0.1:3131 |
токен без грантов читает только default и
federated-источники — источники с --no-federated он не
увидит (G/docs/guides/multi-source-brains.md:119-123) |
realestate-barcelona для сессий по недвижимости |
грант на realestate-barcelona,
realestate-barcelona-whatsapp, default. 🔮
Лучше отдельный токен «агент недвижимости», чтобы факты cheaptrip
по-прежнему писались в default |
| Cursor | только HTTP (G/docs/guides/harness-adapters.md:19) |
— | по задаче: свой токен на тему | токен с грантом на нужные источники |
| Codex | local-cli, stdio, http (harness-adapters.md:11) |
stdio запустит второй serve и упрётся в замок |
по задаче | только HTTP, свой токен |
| Hermes | только stdio (harness-adapters.md:18;
G/docs/mcp/HERMES.md:8: «Hermes spawns
gbrain serve as a local stdio subprocess») |
при живой HTTP-службе на PGLite второй serve падает на
замке (CLAUDE_CODE.md:92-97) |
— | до переезда на Postgres не подключать. 🔮 Если Hermes сам умеет MCP по HTTP, проверить это отдельно — в документации gbrain такого пути нет |
| Grok Bot (клиент базы cheaptrip) | local-cli / thin-cli (harness-adapters.md:15) |
должен видеть только cheaptrip | источники cheaptrip | см. 10.3 |
10.3. Права и кто сейчас подключён
- OAuth-клиентов в базе ноль:
gbrain mcp admin clients --url http://127.0.0.1:3131 --admin-token-file ~/.gbrain/serve/admin-token --json→{"clients":[]}. Проверено 02.11.2026. - Токены (по ним, вероятно, подключены Claude Code и
Grok Bot) показывает
gbrain auth list(G/src/commands/auth.ts:1456). Команда открывает базу, поэтому запускается в окне обслуживания. - Сузить грант:
gbrain auth rescope --token <имя> --sources <id,…>. Первый id — источник, куда пишет токен (G/docs/guides/multi-source-brains.md:230-247). - Чего не запускать:
gbrain mcp expose— перезапишет службуcom.gbrain.serve(G/src/core/serve-service.ts:35);- скилл
setup-gbrain— он прописывает MCPgbrainчерезclaude mcp add --scope user(~/.claude/skills/setup-gbrain/SKILL.md:343,379-385) поверх нынешнего подключения.
11. Масштабирование: источник в общей базе или отдельная база
Четыре варианта. Решает Константин (вопрос 1).
11.1. Вариант А — источники в общей базе, один свой пакет на все
- Что это: в той же базе, где cheaptrip, добавляются
два источника:
realestate-barcelona— карточки;realestate-barcelona-whatsapp— переписка, с пониженным доверием.- Оба добавляются с
--no-federated. Пакетcons-gbrain-base-v2-plus-places-and-propertiesактивируется на всю базу.
- Пример пользы: следующая тема — ВНЖ или поездки — это ещё один источник с тем же пакетом. Агент с грантом на оба источника отвечает на вопрос «что у меня по Барселоне» сразу по квартирам и по документам.
- Плюсы:
- это правило самого gbrain: владелец тот же, тема другая → источник
(
brains-and-sources.md:63-64); - один пакет — общие запросы работают; при разных пакетах gbrain
отказывает (
op-trust-gate.ts:93-113); - одна служба, одна копия, один язык (русский нужен обоим);
- типы только добавляются, страницы cheaptrip тип не меняют (4.5).
- это правило самого gbrain: владелец тот же, тема другая → источник
(
- Цена и риск:
- личная недвижимость и клиентский проект в одной базе. Изоляция держится на грантах токенов — их проверяют в окне обслуживания до загрузки личных данных (шаг 6 порядка внедрения);
- один человек в двух источниках — две страницы, пока их не связать
через
entity_identity_link(brains-and-sources.md:261-285). Константин есть и в cheaptrip (cl-cheap-gbrain-pages/people/konstantin.md); - правило: общие люди связываются одной командой сразу после переноса 36 контактов, на шаге 8.
11.2.
Вариант Б — отдельная база ~/.gbrain-realestate со своей
службой
- Что это: вторая база PGLite и вторая служба на порту 3132.
- Пример пользы: клиентскому проекту cheaptrip физически не видна личная недвижимость. Можно поставить свой язык и свою модель векторов.
- Плюсы: полная изоляция; свой пакет без влияния на cheaptrip.
- Цена и риск:
- второй процесс, вторая служба launchd и второе окно обслуживания.
gbrain mcp exposeдля неё не запускать (10.3), службу пишем руками; - для каждой новой темы — новая база или выбор «к какой базе»;
- против правила gbrain «владелец тот же → источник».
- второй процесс, вторая служба launchd и второе окно обслуживания.
- Пример на Franco: карточку обогащает та же
переписка WhatsApp, но агент спрашивает вторую базу по адресу
127.0.0.1:3132. Вопрос «что у меня по Барселоне» про квартиры и документы ВНЖ одновременно уже не задать одним запросом. - Откат: остановить и удалить вторую службу launchd,
удалить
~/.gbrain-realestate; база cheaptrip не затронута.
11.3.
Вариант В — подключённая база (gbrain mounts add)
- Что это: то же, что Б, плюс основная база знает о
второй. CLI спрашивает её флагом
gbrain query "…" --brain realestate, а внутри её папки срабатывает сам по файлу.gbrain-mount(brains-and-sources.md:130-142;G/src/commands/mounts.ts). - Пример пользы: из папки репозитория недвижимости агент по CLI сразу попадает в нужную базу.
- Цена:
- для агентов по MCP это всё равно отдельный
serveи отдельный адрес; - запросы без
--brainидут только в основную базу (brains-and-sources.md:138-140).
- для агентов по MCP это всё равно отдельный
- Мнение: имеет смысл только вместе с Б. Для «база на много тем» даёт меньше, чем А.
11.4. Вариант Г — источник в общей базе со своим пакетом
- Что это: пакет на источник, ключ
schema_pack:source:realestate-barcelona(schema-packs.md:156). - Польза: пакет cheaptrip не трогается вовсе.
- Цена: любой запрос сразу по cheaptrip и
недвижимости падает с
permission_denied(op-trust-gate.ts:108-113). Документация называет это «remains future work» (schema-packs.md:412-416). - Мнение: для базы на много тем это тупик.
11.5. Моё предложение — А
- Довод 1, польза. Рост на другие темы при А — это «новый источник с тем же пакетом». Б и В превращают каждую тему в отдельную базу со службой, Г ломает общие запросы.
- Довод 2, стандарт. А — правило из документации gbrain. Б оправдан, только если меняется владелец данных, а владелец — Константин.
- Довод 3, цена и риск. При А — одна служба и одна
копия, русский поиск включается один раз для всех. Риск — гранты
токенов. Он закрывается в окне обслуживания до загрузки личных данных:
gbrain auth list, затемrescope.
12.
Нынешние реестры cl-cons-whats/realestate-registry/
| Файл | Записей | Во что превращается | Ключи |
|---|---|---|---|
REGISTRY-realestate-companies-and-agencies.json |
25 | companies/<company_id>.md |
slug = company_id |
REGISTRY-realestate-contacts-people-and-company-accounts.json |
36 | people/… (агенты, хозяева) и accounts/…
(общие аккаунты офисов) |
slug — по имени и агентству. Старый contact_id — в поле
registry_ids, кроме тех, где в id есть номер
телефона (idealista-advertiser-346…): у них slug
без номера, номер — в phones: |
REGISTRY-realestate-properties-apartments.json |
20 | properties/<property_id>.md, плюс
deals/listings/… там, где есть объявление с ценой и датой,
и deals/negotiations/… там, где был торг или отказ
(rejected_by_me, rejected_by_them →
outcome: lost) |
slug = property_id |
HISTORY-realestate-unclear-cases-and-decisions-with-reasoning.jsonl |
40 | строки хронологии и факты с источником «решение Константина» на карточках | номер строки — в поле source факта |
- Конвертер:
cl-cons-whats/whatsapp-export-scripts/SCRIPT-realestate-registry-json-to-gbrain-pages.py.- Пишет в репозиторий источника
realestate-barcelona. - Каждое поле JSON — в поле шапки или в раздел сводки. Цена, район и адрес — и в шапку, и в текст (4.4).
- Запуск повторный: страницу, которую уже правил агент, не перезаписывает, а показывает разницу.
- Пишет в репозиторий источника
- Одна истина после переноса — страницы базы. Агенты дописывают их через MCP, правки сохраняются в файлы репозитория.
- JSON-реестры замораживаются как архив с пометкой «перенесено, дата».
- Скрипты задач 003–008 переделываются из «пишу JSON»
в «пишу страницы
conversationи черновики карточек». - Почему не наоборот (JSON — истина, страницы собираются из него): так обогащение невозможно. Факт, который агент дописал в карточку Franco после письма, следующая сборка стёрла бы. Это была ошибка прошлого отчёта.
- Шапка страниц:
- как в
cl-cheap-gbrain-pages/people/stepan-kozlov.md: полеtypeпо схеме gbrain плюс поля OKF (title,description,resource,tags,generated,status); - ловушка: поля
source:иsources:gbrain превращает в связиsourceиdiscussed_in(link-extraction.ts:1623-1624). Список источников в стиле OKF на страницах базы не используем — источник пишется в хронологии и фактах.
- как в
13. Порядок внедрения
- Все шаги — после «ок» Константина на структуру (вопросы 1–3).
- Шаги 1–7 — одно окно обслуживания: служба остановлена, агенты базу не видят. 🔮 Окно займёт 15–30 минут, большую часть — переиндексация.
- Шаги 8–13 — при живой службе.
Подготовка — без базы, служба работает
| № | Шаг | Команда | Что увидеть |
|---|---|---|---|
| 0.1 | Файл пакета | скопировать файл из 4.2 в
~/.gbrain/schema-packs/cons-gbrain-base-v2-plus-places-and-properties/pack.yaml;
gbrain schema validate cons-gbrain-base-v2-plus-places-and-properties;
gbrain schema diff gbrain-base-v2 cons-… |
validate без ошибок; diff — только добавления. Обе команды читают
только файлы (G/src/commands/schema.ts:330-350,705-720),
при живой службе работают |
| 0.2 | Два репозитория источников | git-репозитории страниц (имя — вопрос 3) с первым коммитом:
--path must be a git repo with committed files
(G/src/commands/sources.ts:1976-1978) |
репозитории есть |
| 0.3 | Конвертеры | два скрипта из 6.1 и 12; прогон на копии — 5 страниц пилота | страницы раздела 5 в репозитории |
Окно
обслуживания —
launchctl bootout gui/$(id -u)/com.gbrain.serve
| № | Шаг | Команда | Что увидеть | Трогает cheaptrip | Откат |
|---|---|---|---|---|---|
| 1 | Резервная копия | cp -R ~/.gbrain/brain.pglite <папка копии>;
gbrain backup create --output <абсолютный путь>.gbrain-backup
(G/src/commands/backup.ts:39-40) |
обе копии на месте | читает | — |
| 2 | Пакет | gbrain schema use cons-gbrain-base-v2-plus-places-and-properties;
gbrain schema active |
активен новый пакет | да: пакет общий, но типы cheaptrip не меняются (4.5) | gbrain schema use gbrain-base-v2. Откат не
нейтральный, если страницы place и
property уже загружены: v2 их не знает, при чистке типов
они станут note (gbrain-base-v2.yaml:649-657).
Откатывать до шага 8 |
| 3 | Русский поиск | строка в ~/.gbrain/.env (раздел 8);
gbrain reindex-search-vector --dry-run, затем
--yes |
gbrain doctor без
fts_reindex_incomplete |
да: вся база | вернуть english, ещё одна переиндексация того же
объёма |
| 4 | Модель фактов | gbrain config set facts.extraction_model claude-cli:claude-haiku-5-5;
chat_model — полным именем вместо алиаса
sonnet |
gbrain doctor не жалуется на модель фактов |
да: общая настройка | gbrain config set facts.extraction_model "" 🔮 |
| 5 | Источники | gbrain sources add realestate-barcelona --path … --no-federated;
gbrain sources add realestate-barcelona-whatsapp --path … --no-federated;
gbrain sources set-trust realestate-barcelona-whatsapp external_untrusted |
gbrain sources list показывает оба |
нет | gbrain sources archive <id> или
remove … --dry-run, затем
--confirm-destructive |
| 6 | Права | gbrain auth list; токену Grok Bot —
gbrain auth rescope --token <имя> --sources <источники cheaptrip>;
агенту недвижимости (новый токен Claude Code) —
gbrain auth rescope --token <имя> --sources realestate-barcelona,realestate-barcelona-whatsapp,default,
первый id — куда пишутся факты (facts.ts:111,
multi-source-brains.md:230-247); новые токены Cursor и
Codex — gbrain auth create … --scopes read,write, затем
rescope |
Grok Bot не видит источники недвижимости | права | вернуть прежний грант из вывода auth list |
| 7 | Проверка | gbrain doctor |
без ошибок | читает | — |
gbrain schema sync --apply не нужен: он перетипизирует
уже загруженные страницы по префиксам
(G/docs/schema-author-tutorial.md:128-131), а страниц
places/ и properties/ в базе ещё нет (4.5).
Если пакет будут менять после переноса — запускать его в окне.
После окна —
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.gbrain.serve.plist.
Затем MCP get_active_schema_pack должен показать новый
пакет.
При живой службе
| № | Шаг | Команда | Что увидеть | Откат |
|---|---|---|---|---|
| 8 | Пилот и перенос | коммит 5 страниц пилота → gbrain sync; затем все 25 +
36 + 20; entity_identity_link для Константина |
вопросы раздела 5 отвечаются через MCP; связи works_at
на месте |
убрать страницы коммитом и sync |
| 9 | Переписка | конвертер WhatsApp → gbrain sync; извлечение —
extract-conversation-facts по источнику переписки в
следующем окне или MCP extract_facts |
страницы переписки — external_untrusted (уровень
источника, sources-trust.ts:1-9); факты на карточках с
источником и датой. 🔮 Уровень доверия самих фактов: при MCP — вероятно
agent_written (memory-trust.md:20); проверить
на пилоте |
forget по фактам |
| 10 | Карта | генератор читает файлы репозитория
realestate-barcelona, считает расстояние до пляжа, собирает
HTML; публикация на Cloudflare Pages |
карта по постоянной ссылке | — |
| 11 | Почта | поиск писем агентов по шести ящикам; в окне —
gbrain sources add gmail-<ящик> --kind google --access command … |
письма агентов — страницы email; петли —
gbrain waiting |
убрать источник |
| 12 | Чистка | раз в неделю — проверки из раздела 7;
gbrain eval suspected-contradictions |
список находок | — |
| 13 | Векторы | при ~500 страниц; ключ подключает Константин; в окне —
gbrain migrate embeddings --dry-run, затем
--yes |
«у моря» находит «у пляжа» | migrate embeddings назад |
Флаги add-type / add-link-type не нужны:
пакет пишется файлом целиком (4.2). Это проверяемее, чем десяток
команд.
14. Вопросы к Константину
❓ Вопрос 1. Где жить базе недвижимости?
- Контекст. Общая база — та, где сейчас cheaptrip:
файл
~/.gbrain/brain.pglite, службаcom.gbrain.serveна127.0.0.1:3131, источники cheaptrip (сведения на 02.11.2026). Подробно варианты — раздел 11. - 1а — два источника
(
realestate-barcelonaиrealestate-barcelona-whatsapp) в общей базе, один свой пакет на все. - 1б — отдельная база со своей службой на порту 3132.
- 1в — отдельная база и подключение через
gbrain mounts add. - 1г — источник в общей базе со своим пакетом.
- Моё предложение: 1а.
- Следующая тема — один источник и одна команда. При 1б и 1в это новая база и служба; при 1г ломаются общие запросы.
- Это правило самого gbrain: «владелец тот же, тема другая → источник».
- Риск — клиентский проект в той же базе. Закрывается проверкой токенов (шаг 6) до загрузки личных данных. Клиентов OAuth сейчас ноль, проверено.
❓ Вопрос 2. Набор типов
- Контекст. Правило проекта: структуру базы gbrain
согласует Константин до загрузки. Все варианты берут из стандарта
company,person,account,deal,meeting,conversation,email,project;place— из рекомендованной схемы. Разница — как оформить дом, квартиру и объявление. - 2а — четыре своих типа:
place,building,property,listing. - 2б — минимум:
placeс подтипами (в том числеbuilding), один новый типproperty, объявление и торг — подтипы стандартногоdeal. Пакет целиком — раздел 4.2. - 2в — только
place; квартиры —noteс тегами. - Моё предложение: 2б.
- Это правило учебника gbrain: при 20–100 страницах — подтип, а не
тип. Квартир 20, объявлений 5, домов единицы. При росте подтип выносится
в тип правилом
retypeв том же пакете, страницы не переделываются. - Стандартный
dealуже означает «условия плюс решение» — это и объявление Ukio (цена, даты, депозит), и торг On Urbe. - 2а даёт четыре типа на поддержку при данных, которых пока мало. 2в
теряет связи и
whoknowsу квартир. Цена 2б — один файл пакета на ~60 строк.
- Это правило учебника gbrain: при 20–100 страницах — подтип, а не
тип. Квартир 20, объявлений 5, домов единицы. При росте подтип выносится
в тип правилом
❓ Вопрос 3. Имена репозиториев и пакета
- Контекст. Страницы источника живут в
git-репозитории — как
cl-cheap-gbrain-pagesу cheaptrip. Пакет общий на всю базу, поэтому в его имени нет слова «недвижимость». - 3а — репозитории
cl-cons-realestate-gbrain-pagesиcl-cons-realestate-gbrain-pages-whatsapp-conversations; пакетcons-gbrain-base-v2-plus-places-and-properties. - 3б — один репозиторий
cl-cons-realestate-gbrain-pagesс двумя папками-источниками; пакетcons-gbrain-personal-and-projects. - Моё предложение: 3а.
- Польза на примере: Константин открывает GitHub и по имени видит, что
это страницы базы gbrain и про какую тему — как
cl-cheap-gbrain-pages. - Отдельный репозиторий переписки можно не давать тому, кому даёте карточки: в ней телефоны и чужие слова.
- Имя пакета говорит, что он добавляет к v2; «personal-and-projects» при 3б этого не говорит.
- Цена и риск 3а: два репозитория вместо одного, правило имён — по
справочнику
cl-cons-conventions-folder-names. Риск 3б:sources addтребует отдельный git-репозиторий на источник (sources.ts:1976-1978), папки одного репозитория 🔮 потребуют--force.
- Польза на примере: Константин открывает GitHub и по имени видит, что
это страницы базы gbrain и про какую тему — как
❓ Вопрос 4. Включить русский поиск на всю базу, вместе с cheaptrip?
- Контекст. Тот же вопрос был 16-м по cheaptrip
(предложение было 16а). Язык один на всю базу
(
multi-language-fts.md:103-105). База cheaptrip — 231 файл. - 4а — да, в окне обслуживания, шаг 3.
- 4б — после пилота недвижимости.
- Моё предложение: 4а.
- Обе базы русские. Сегодня «Давида» не находит «Давид», а «квартиру» — «квартира».
- При 4б пилот проверяется на английском поиске и даст ложное «поиск плохой».
- Риск — писатель без переменной индексирует новые строки по-английски
(
multi-language-fts.md:106-108), аinitSchemaвозвращает триггеры кenglish(fts-language.ts:86-100). Закрывается строкой в~/.gbrain/.env, который читают и CLI, и служба.
❓ Вопрос 5. Переписку WhatsApp загружать целиком или только факты?
- Контекст. Переписка по недвижимости уже хранится в
git репозитория
cl-cons-whats— ваше решение 29.10.2026 «Давай добавлять ее все-таки». gbrain извлекает факты со страницconversationи в ответе показывает исходный разговор целиком (G/docs/evidence-delivery.md:20-32). - 5а — страницы
conversationцеликом плюс факты, в отдельном источнике с уровнемexternal_untrusted. - 5б — только факты, без текста переписки.
- Моё предложение: 5а.
- Через полгода на вопрос «что именно сказал Franco про задаток» база покажет само сообщение, а не пересказ.
- 5б даёт меньше данных, но факт без исходника не перепроверить, а это требование «проверка истинности».
- Риск — чужой текст в базе. Он закрыт отдельным источником с пониженным доверием (раздел 7).
❓ Вопрос 6. Какие почтовые ящики подключать?
- Контекст. К gws подключены шесть ящиков (6.2). Где письма агентов недвижимости, по почте ещё не искал.
- 6а — сначала поискать письма агентов во всех шести и подключить только те ящики, где они есть.
- 6б — сразу
constantinbcnofficial@gmail.com. - Моё предложение: 6а.
- Поиск по шести ящикам — одна команда скилла
cons-gmail-accounts-searching, около 10 минут. - Подключение «на глаз» может пропустить ящик, куда пишет Ukio.
- Лишний ящик в базе — лишние письма магазинов и банков в поиске агента.
- Поиск по шести ящикам — одна команда скилла
Вопросы 7–12 версии 2 сняты
- Это были вопросы по старой переписке: прописка, черновик критериев аренды, квартира Давида на карте, старая аренда, Sant Miquel 116, итог торга On Urbe.
- Константин 02.11.2026: «Тебя никто не просил… вот эти старые… сообщения… что-то там думать… Ты еще критерии придумываешь». Агент их снял.
- Решение по одному из них: прописка не нужна.
- Критерии поиска знает и ведёт Константин. В базе критерии появляются, только если он сам их запишет или продиктует.
🔑 Если согласны со всеми моими предложениями: «1а 2б 3а 4а 5а 6а». Иначе — ваши буквы по номерам.