Задача 009 — gbrain: как отделить базу недвижимости, типы страниц, гео
- Версия gbrain, по которой всё проверено:
0.60.545.0(файлVERSIONпакета). - Корень пакета ниже обозначен
$G=~/.bun/install/global/node_modules/gbrain. - Ничего не запускалось,
~/.gbrain/не читался. Прочитаны только код и доки пакета, плюс два файла настроек вне базы: plist службы и запись MCP в~/.claude.json(без токена). - Непроверенное помечено
🔮 Додумал:.
0. Что стоит на машине сейчас (факты из настроек, не из базы)
- Служба
~/Library/LaunchAgents/com.gbrain.serve.plistзапускает/Users/ws/.gbrain/serve/gbrain-serve.sh,KeepAlive=true. - В
~/.claude.jsonсерверgbrainзаписан на уровне пользователя (top-levelmcpServers), типhttp, адресhttp://127.0.0.1:3131/mcp, с bearer-токеном. - Отсюда следствие: MCP базы cheaptrip видят агенты всех проектов, включая будущий проект недвижимости.
1. Три способа держать базу недвижимости отдельно
Как в gbrain задаётся путь к базе (проверено по коду)
GBRAIN_HOME— это родительская папка,.gbrainдописывается всегда.- Цитата,
$G/src/core/config.ts:1962-1974: «GBRAIN_HOME is a parent dir; we always append '.gbrain' ourselves so setting GBRAIN_HOME=/tmp/x yields configDir() === '/tmp/x/.gbrain'.» — «GBRAIN_HOME — родительская папка;.gbrainдописываем сами». - Путь должен быть абсолютным и без
..(там же, строки 1968-1973).
- Цитата,
- База PGLite по умолчанию —
<home>/.gbrain/brain.pglite:$G/src/commands/init.ts:1092const dbPath = opts.customPath || gbrainPath('brain.pglite');. - Другие рычаги:
database_pathвconfig.jsonиGBRAIN_DATABASE_URLдля Postgres (config.ts:84,config.ts:681). - Выбор базы для одной команды:
--brain <id>→GBRAIN_BRAIN_ID→ файл.gbrain-mount→ совпадение пути mount →host(brains-and-sources.md:200-208). - Выбор источника внутри базы:
--source→GBRAIN_SOURCE→.gbrain-source→ путь источника →sources.default→default(там же).
Ключевая мысль доков
- Цитата,
brains-and-sources.md:63-64: «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.» — «сменился владелец данных — граница базы; владелец тот же, а тема другая — граница источника». - По этому правилу gbrain советует вариант (а). Константин же просит «отдельно, однородно, маленький репозиторий» — это допускает и (а), и (б).
а)
Изолированный источник federated=false в базе
cheaptrip
- Как работает:
- Цитата,
multi-source-brains.md:110-111: «false(default for new sources) — Source only searched when explicitly named via--source <id>or qualified citation.» — «новый источник по умолчанию не участвует в общем поиске; ищется, только если назвать его явно». - Цитата,
brains-and-sources.md:58: «Isolate a topic so it never leaks into personal search |--sourcewithfederated=false» — «изолировать тему, чтобы она не попадала в общий поиск».
- Цитата,
- Что видят агенты других проектов через MCP cheaptrip:
- Токен без гранта читает
defaultи все federated-источники (multi-source-brains.md:120-122: «it reads thedefaultsource plus every federated source»). Изолированный источник ему не виден. - Удалённый агент без гранта не может явно назвать нефедеративный
источник: в таблице
multi-source-brains.md:286для «Remote agent with no source grant» явный--sourceработает только для «A federated source». - 🔮 Додумал: есть ли у текущего токена cheaptrip грант на источники, по коду не узнать — это записано в базе, а её я не читал.
- Токен без гранта читает
- Смешение в поиске:
- Без смешения, пока источник не federated.
- Но язык полнотекстового поиска один на всю базу: он
вшит в триггеры (
multi-language-fts.md:12-16, «Write side — theupdate_page_search_vector... trigger functions»). Сменить язык для недвижимости — значит переиндексировать и cheaptrip (gbrain reindex-search-vector --yes). - Пакет схемы можно задать отдельно на источник: уровень 3 «Per-source
DB config key
schema_pack:source:<id>» (schema-packs.md:156), ключ в коде —schema_pack.source.<id>($G/src/core/schema-pack/entity-types.ts:85). А вотgbrain schema useпишет в общий~/.gbrain/config.jsonи меняет пакет всей базы (schema-packs.md:159).
- Процессы и настройки:
- Новых процессов нет: работает тот же
com.gbrain.serve. - Нужен отдельный токен с грантом только на источник недвижимости,
плюс отдельная запись MCP в
.mcp.jsonпроекта недвижимости. Цитата,multi-source-brains.md:246-247: «The first id is the token's write source» — «первый источник в гранте — тот, куда токен пишет». Без этого агенты недвижимости писали бы вdefaultбазы cheaptrip. - Источник с
--pathобязан быть git-репозиторием с закоммиченными файлами (multi-source-brains.md:482-488).
- Новых процессов нет: работает тот же
- Нужна ли остановка текущего сервера:
- Регистрация источника существует как MCP-операция
sources_addсо scopesources_admin(operation-manifest.generated.ts:4690-4722). Значит, её можно выполнить через живой сервер токеном с правами админа. - Выпуск нового токена на PGLite: цитата,
CLAUDE_CODE.md:132-137: «gbrain auth createopens the database, which fails withlive_servewhile the expose-managed service holds it. Mint the token before the service runs ... or provision through the running server instead —gbrain mcp grant … --admin-token-file ~/.gbrain/serve/admin-tokenor the/admindashboard.» — «CLI-команда упадёт, пока служба держит базу; либо короткая остановка службы, либо выпуск через работающий сервер (mcp grant//admin)». - 🔮 Додумал: делегирует ли CLI
gbrain sources addживому серверу, как это делаетsync, — не проверил. Судя по известномуpglite_busy, CLI-путь, скорее всего, потребует короткой остановки службы.
- Регистрация источника существует как MCP-операция
- Резервные копии:
- Страницы — markdown в git-репозитории недвижимости, и это источник
истины. Цитата,
system-of-record.md:3-5: «Canonical Markdown and frontmatter are the system of record for file-backed knowledge. Their database indexes can be rebuilt from those files.» — «markdown и frontmatter — источник истины, индексы базы перестраиваются из них». - Всё, что живёт только в базе (факты
remember, ревизии, токены), попадает в общий бэкап базы cheaptrip. Отдельно не вынуть.
- Страницы — markdown в git-репозитории недвижимости, и это источник
истины. Цитата,
- Установка: создать git-репозиторий →
sources add <id> --path <repo> --no-federated→sync --source <id>→ токен с грантом → запись MCP в проекте. - Откат:
gbrain sources archive <id>(мягкое удаление, «Prefer this overremove»,multi-source-brains.md:359-360) илиsources remove. Отозвать токен, убрать запись MCP. Репозиторий остаётся. - Минусы под требования Константина: база физически общая с cheaptrip, язык FTS общий, админские действия трогают базу cheaptrip.
б)
Отдельная база gbrain со своим GBRAIN_HOME, своим сервером
и MCP
- Доки прямо описывают несколько баз на одной машине:
- Цитата,
topologies.md:262-272: «GBRAIN_HOMEselects which~/.gbraindirectory is active ... Each worktree'sgbrain serveinstance binds its own port and indexes its own DB. Multiplegbrain serveprocesses coexist fine — they're separate OS processes with separate config and separate connection pools.» — «несколько serve спокойно живут рядом: отдельные процессы, отдельные настройки». - Цитата,
topologies.md:274-277: «Tool names are namespaced asmcp__<alias>__<tool>» — «инструменты разных баз различаются по имени сервера MCP».
- Цитата,
- Что видят агенты других проектов: ничего. Это другая база, а
MCP-операции не умеют выбирать базу. В манифесте операций нет параметра
brain(grep"brain_id"поoperation-manifest.generated.ts→ 0 совпадений). Сервер обслуживает одну базу:$G/src/mcp/dispatch.ts:82«The brain this process serves:serve --brain/ GBRAIN_BRAIN_ID / .gbrain-mount / host.» - Смешение в поиске: нет. Свой язык FTS (например
russian), свой пакет схемы, своя папкаschema-packs/. - Два варианта MCP-подключения:
- stdio, без постоянного процесса. В
.mcp.jsonпроекта недвижимости:gbrain serve --surface starterсenv GBRAIN_HOME=…. Claude Code сам запускает сервер на время сессии (CLAUDE_CODE.md:83-90, «Claude Code spawnsgbrain serveas a stdio subprocess. No server, no tunnel, no token needed.»).- Ограничение, цитата,
CLAUDE_CODE.md:92-98: «PGLite is a single-writer embedded Postgres: the first runninggbrain serveowns the brain's data directory ... A secondserve... — or any CLI command that opens the DB — fails on the lock while that serve is live (gbrain syncis the one exception: it delegates to the live serve).» — «пока открыта одна сессия, вторая сессия и CLI упрутся в замок; исключение —sync». - 🔮 Додумал: точный синтаксис
envв.mcp.jsonClaude Code по докам gbrain не проверял. Для Codex доки называютenv (GBRAIN_HOME, GBRAIN_SOURCE)(docs/guides/setup.md:118).
- Ограничение, цитата,
- HTTP, постоянный процесс на другом порту (например
3132), как сейчас у cheaptrip.
- Важно:
gbrain mcp exposeдля второй базы ставить нельзя — он перезапишет службу cheaptrip. Метка зашита:serve-service.ts:35export const SERVE_LAUNCHD_LABEL = 'com.gbrain.serve';. Путь plist строится отHOME, а не отGBRAIN_HOME:serve-service.ts:49иmcp-expose.ts:215,226(const home = deps.home ?? env.HOME ?? homedir(); … plistPath: … launchdPlistPath(home)). - Значит, второй HTTP-сервер — только свой plist с другой меткой,
написанный вручную (
gbrain serve --http --port 3132сGBRAIN_HOME). - Для сравнения: autopilot умеет отдельные службы на каждую базу,
autopilot-paths.ts:93-96«every other brain gets its own job». Служба serve этого не умеет.
- Важно:
- stdio, без постоянного процесса. В
- Процессы и настройки:
- stdio: 0 постоянных процессов. Одна папка
GBRAIN_HOME, одна запись в.mcp.jsonпроекта. - HTTP: +1 launchd-служба, +1 порт, +1 токен.
- stdio: 0 постоянных процессов. Одна папка
- Нужна ли остановка текущего сервера: нет. Другой datastore — другой
замок. Для mount доки пишут, что каждая PGLite-база делегирует своему
владельцу (
serve-sync-concurrency.md:43). - Резервные копии:
- Markdown в git, как в (а).
- Плюс маленькая отдельная база:
gbrain backup create --output …под этимGBRAIN_HOME(backup.ts, usagecreate). Ограничение: архив держит только раскладку<root>/.gbrain/brain.pgliteдо 8 GiB (troubleshooting.md:104).
- Установка:
- 🔮 Додумал (порядок собран из доков, сам не запускал):
export GBRAIN_HOME=/abs/path→GBRAIN_FTS_LANGUAGE=russian gbrain init --pglite --no-embedding(флаг--no-embeddingупомянут вdocs/guides/setup.md:25) →gbrain sources add realestate --path <repo>→gbrain sync --source realestate→ запись MCP.
- 🔮 Додумал (порядок собран из доков, сам не запускал):
- Откат: убрать запись MCP (и свой plist, если ставили HTTP), удалить
папку
GBRAIN_HOME. База cheaptrip не затронута, репозиторий остаётся.
в)
Отдельная база, подключённая к основной через
gbrain mounts add
- Что такое mount: цитата,
$G/src/commands/mounts.ts:4: «A "mount" is a SEPARATE gbrain DATABASE connected to your host agent.» — «mount — отдельная база, подключённая к основной». - Синтаксис (
mounts.ts:14):gbrain mounts add <id> --path <path> --engine pglite|postgres [--db-url|--db-path].--pathобязателен: «Every mount needs a local clone path» (mounts.ts:123). - Регистрация пишется в
~/.gbrain/mounts.jsonосновной базы (mounts.ts:44-48). Это единственное касание папки cheaptrip, но касание есть. - Ещё не готово (
mounts.ts:18-22):mounts sync,enable/disable,add --mcp-url— «Not yet shipped». - Что видят агенты других проектов: через MCP cheaptrip — ничего.
Сервер обслуживает одну базу, параметра базы у MCP-операций нет (см.
(б)). Для MCP недвижимости всё равно нужен свой процесс
gbrain serve --brain realestate(docs/guides/cli-socket.md:35). - Что даёт mount сверх (б):
- Удобство CLI: внутри папки репозитория команды сами уходят в эту
базу по совпадению пути (
brain-resolver.ts:9-15, правило 4), или явно через--brain realestate. - Ничего больше: «Cross-brain queries are not deterministic. The agent
sees the brain list and re-queries as needed.»
(
brains-and-sources.md:192-194) — «объединённого поиска по базам нет, агент сам решает, куда спрашивать».
- Удобство CLI: внутри папки репозитория команды сами уходят в эту
базу по совпадению пути (
- Ограничения: «mounts get no auto-migrations and keep the host-config
AI gateway» (
docs/architecture/key-files/runtime.md:16). Базу mount сначала создают отдельно, как в (б), а её миграции при обновлении gbrain запускают вручную. - Остановка текущего сервера: не нужна. Его
WorkingDirectory=/Users/wsне попадает внутрь пути mount, так что сервер cheaptrip останется наhost.- 🔮 Додумал: это вывод из правила «longest-prefix mount path match», на живой службе не проверял.
- Бэкап, установка, откат — как в (б), плюс
gbrain mounts add/gbrain mounts remove.
Сравнительная таблица трёх способов
| (а) изолированный источник | (б) отдельная база GBRAIN_HOME |
(в) mount | |
|---|---|---|---|
| Видят ли агенты cheaptrip через свой MCP | Нет, если источник не federated и токен без гранта на него | Нет | Нет |
| Смешение в поиске | Нет; но общий язык FTS и общая база | Нет; свой язык FTS и своя схема | Нет; свой язык FTS и своя схема |
| Постоянные процессы | 0 новых | 0 (stdio) или +1 служба (HTTP, свой plist) | Как в (б) |
| Настройки | Источник, токен с грантом, запись MCP в проекте | Папка GBRAIN_HOME, запись MCP; для HTTP — plist, порт,
токен |
Как в (б) плюс mounts.json в
~/.gbrain |
| Нужно ли трогать текущий сервер | Админ-действия через него; CLI — вероятно, с короткой остановкой (🔮) | Нет | Нет; запись в ~/.gbrain/mounts.json |
| Бэкап | Markdown в git; данные только из базы — внутри бэкапа cheaptrip | Markdown в git плюс маленький свой backup create |
Как в (б) |
| Установка | 4–5 шагов, часть через админку живого сервера | ~4 шага, в своей папке | (б) плюс 1 шаг |
| Откат | sources archive, отозвать токен |
Удалить папку и запись MCP | (б) плюс mounts remove |
| Ограничения | Ошибка в гранте или federate — и данные видны cheaptrip | stdio: одна сессия за раз, CLI блокируется на время сессии | Мало готово (mounts sync/enable не выпущены), миграции
вручную |
2. Типы страниц и связи для «объект / место / человек / компания / событие»
Готовых пакетов для недвижимости нет
- Встроенные пакеты
(
$G/src/core/schema-pack/bundled.ts:10-19):gbrain-base,gbrain-recommended,gbrain-creator,gbrain-investor,gbrain-engineer,gbrain-everything,gbrain-base-v2,company-brain. - Поиск по
real estate|apartment|realtor|landlordвskills/,docs/,recipes/ничего доменного не дал: совпадения только в техническом смысле. - Что подходит из готового:
person(people/, алиасыcontact,partner) — агенты (gbrain-base-v2.yaml:61-74).company(companies/) — агентства, например Ukio.account(accounts/,crm/, алиасcrm): «a customer or CRM record» (gbrain-base-v2.yaml:7-9, 104-112).deal(deals/, primitivetemporal) — сделка или переговоры по объекту (gbrain-base-v2.yaml:265-274).meeting,conversation,event— просмотры, звонки, переписка.place(places/, primitiveentity) иtrip— только вgbrain-recommended.yaml:112-126.
- Своих типов (
property,area) нет. Их добавляют форком пакета:- Цитата-пример CRM,
what-schemas-unlock.md:46-62:gbrain schema fork gbrain-base mine→gbrain schema add-type deal --primitive entity --prefix companies/deals/ --extractable→gbrain schema add-link-type …→gbrain schema sync --apply. - Итог там же, строка 67: «The CRM you've been promising yourself you'll set up next quarter? You just shipped it in 4 commands.» — «CRM — это 4 команды поверх заметок».
- Цитата-пример CRM,
- Неизвестный тип страницу не ломает:
put_pageсохраняет её и возвращает предупреждениеpage_type_undeclared(schema-packs.md:120-123). Начинать можно без своего пакета. - Связи из frontmatter: пакет объявляет
frontmatter_links, например полеamends→ связьamends($G/examples/schema-packs/amends-example/pack.yaml). Так можно сделатьagent:→ связь объект→агент иarea:→ объект→район. Ссылки[[…]]и markdown-ссылки в теле дают связи и без пакета (brains-and-sources.md:286-308).
Хронология переговоров — Compiled truth + Timeline
- Цитата,
compiled-truth.md:5-6: «Every brain page has two zones: compiled truth (current synthesis, rewritten as evidence changes) and timeline (append-only evidence trail, never edited).» — «две зоны: сводка, которую переписывают, и хронология, которую только дополняют». - Разделитель —
<!-- timeline -->. Голый---разделителем не считается (compiled-truth.md:116-128). - Формат строки хронологии:
- **YYYY-MM-DD** | Источник — Суть(GBRAIN_RECOMMENDED_SCHEMA.md, раздел Person, после шаблона). Двоеточие как разделитель не работает. - Инструменты (
operation-manifest.generated.ts):add_timeline_entry— параметрыslug,date(YYYY-MM-DD),summary,detail,source; CLIgbrain timeline-add.get_timeline— с окнамиafter/before.
- Подвох,
compiled-truth.md:130-143: датированные[Source: …, YYYY-MM-DD]выше разделителя тоже создают строки хронологии. «There is no timeline-remove command» — «команды удаления строки хронологии нет». - Успешные и неуспешные переговоры: исход пишем строкой хронологии
плюс полем
statusво frontmatter страницы сделки.statusвыводится какpage_status(entity-records.md:73-77). - Факты: таблица
<!--- gbrain:facts:begin -->. Есть типизированные колонкиclaim_metric/claim_value/claim_unit/claim_period(fence-format.md, «Facts columns»), напримерprice/1450/EUR/monthly. Писать лучше черезremember, а не руками (fence-format.md:15-19). - Мнения («агент жёсткий в торге»): таблица takes с держателем
people/<slug>илиbrain(fence-format.md, «Takes columns»;takes-vs-facts.md). - Открытые вопросы: в шаблонах это раздел
## Open Threads(GBRAIN_RECOMMENDED_SCHEMA.md, Person/Company). Обычный markdown, без модели.questions_pinсюда не подходит: обновление ответа — «a paid model call» (TOOL_CATALOG.md:208).thinkиsynthesizeтоже платные (TOOL_CATALOG.md:158).
- Frontmatter для фильтров не попадает в поиск. Цитата,
GBRAIN_RECOMMENDED_SCHEMA.md(File-Layer Conventions, п. 1): «Frontmatter is metadata for filters and schema-pack rules: it is not written to the fact store, andgbrain search/querydo not index scalar frontmatter values ... If a value must be findable by search, also state it in the body» — «значения frontmatter поиском не ищутся; что должно находиться — дублируй в тексте». - Дата страницы для «время-зависимых» ответов берётся из frontmatter
event_date,dateилиpublished(time-aware-recall.md:23-28).
Пример страницы объекта так, как её ждёт gbrain
---
type: property # свой тип; до форка пакета будет предупреждение page_type_undeclared
title: "Ukio — Carrer de Verdi 12, 2-1, Gràcia"
status: shortlist # → page_status; свои значения: candidate / shortlist / rejected / rented
purpose: rent # rent | buy — для list_pages where
area: gracia # равенство; для фильтра where
agency: companies/ukio
agent: people/maria-ukio-agent
geo: { lat: 41.4036, lng: 2.1565, precision: building }
price_eur: 1450
available_from: 2027-03-01
date: 2026-11-02
tags: [аренда, весна-2027, ukio]
---
## Сводка
Аренда у [Ukio](../companies/ukio.md), район [Gràcia](../areas/gracia.md), 2 спальни, 1450 EUR/мес.
Назначение: аренда весной 2027. Статус: в коротком списке.
## Состояние переговоров
Агент — [Maria](../people/maria-ukio-agent.md). Скидку за 12 месяцев не дают.
## Open Threads
- Можно ли с животными?
- Когда освобождается — 1 или 15 марта?
<!-- timeline -->
## Timeline
- **2026-11-02** | WhatsApp — Maria прислала планировку, цена 1450 без торга.
- **2026-10-28** | Ukio сайт — объявление найдено.- Агент — страница
people/<slug>.mdпо шаблону Person (## State,## Communication Style,## Relationship,## Contact,## Open Threads, хронология). - Агентство —
companies/<slug>.md. - Район —
areas/<slug>.md(илиplaces/при пакетеgbrain-recommended). - 🔮 Додумал: имена полей
purpose,area,geo,price_eur— моё предложение. gbrain их не задаёт.
3. Координаты и гео-фильтр
- В gbrain гео нет. Grep по
$G/srcи$G/docsнаlatitude|longitude|postgis|geography(|st_dwithin|geojson|haversineнашёл одно место,$G/src/core/import-file.ts:1688-1689: EXIF картинки складывается во frontmatter какout.gps = { lat: data.latitude, lon: data.longitude };. Ни поиска по радиусу, ни PostGIS. - Прецедент формы поля:
gps: { lat, lon }на страницах-картинках. Для своих страниц разумно держать координаты похоже, вложенным объектом во frontmatter. - Запрос по frontmatter есть, но только на точное равенство. Цитата,
$G/src/core/search/frontmatter-where.ts:2-6: «Frontmatter equality filter:where: { key: value | [values] }on search, query and list_pages (CLI--where key=value, repeatable). Keys AND; a key's values OR. A value matches a page whose top-level frontmatter field equals it, or whose field is a list containing it.» — «фильтр по равенству верхнеуровневых полей; ключи через И, значения через ИЛИ».- Сценарий «все объекты в аренду в Gràcia»:
list_pages {type: property, where: {purpose: rent, area: gracia}}работает. - Диапазона (
lat > …, цена ≤ …) и вложенных полей (geo.lat) нет. whereуlist_pagesпомеченfullSurfaceOnly(манифест). На поверхностиstarterего нет в схеме, он открывается черезrequest_tools.
- Сценарий «все объекты в аренду в Gràcia»:
list_pagesне отдаёт frontmatter. Возвращаются толькоslug,source_id,type,title,updated_at,updated_at_iso($G/src/core/ops/pages.ts, map в конце обработчикаlist_pages). Координаты придётся читать черезget_pageпо каждой странице.- Как фильтровать по гео снаружи (проще всего):
- Markdown-файлы в git — источник истины. Отдельный скрипт читает frontmatter прямо из файлов репозитория и строит GeoJSON или HTML-карту. gbrain для этого не нужен вовсе.
- Если нужно именно из базы, есть экспорт:
gbrain export [--dir <path>] [--source <id>] [--type <type>] [--slug-prefix <prefix>]($G/src/commands/export.ts:73-80). Пишет markdown с frontmatter.
- Группировка по району: поле
area:плюс связь на страницу района. Тогдаget_backlinks areas/graciaпокажет все объекты района.
4. Гипотеза «G Best» = gstack
- Гипотеза правдоподобна: в gstack есть прямая интеграция с gbrain.
~/.claude/skills/gstack/USING_GBRAIN_WITH_GSTACK.md:5: «GBrain is a persistent knowledge base designed for AI agents.»README.md:215gstack — то же.
- Скилл
setup-gbrain(~/.claude/skills/gstack/setup-gbrain/SKILL.md, ссылка из~/.claude/skills/setup-gbrain/):- Описание: «Set up gbrain for this coding agent: install the CLI, initialize a local PGLite or Supabase brain, register MCP, capture per-remote trust policy.»
- Четыре пути: Supabase по строке подключения, Supabase с автосозданием, PGLite локально, удалённый MCP.
- Регистрирует MCP на уровне пользователя под именем
gbrain(SKILL.md:343, 379-385,claude mcp add --scope user … gbrain). Для второй базы на этой машине это столкнётся с уже записанным серверомgbraincheaptrip. - Поддержки
GBRAIN_HOMEв скилле нет: grep пустой.
- Скилл
sync-gbrain: «Keep gbrain current with this repo's code and refresh agent search guidance in CLAUDE.md.» Индексирует код репозитория и память gstack (планы, ретро), дописывает вCLAUDE.mdблок «GBrain Search Guidance». - Про структуру базы знаний предметной области (CRM, объекты, районы) в gstack ничего нет. Совпадения «knowledge base» есть только в описаниях gbrain.
- Вывод: для задачи 009 скиллы gstack полезны разве что как справка.
Запускать
setup-gbrainдля второй базы рискованно: он рассчитан на одну базу на машину и пишет глобальную запись MCPgbrain.
Короткие выводы
- Самая простая полностью отдельная схема: своя PGLite-база с
GBRAIN_HOME=<папка>и MCP по stdio в.mcp.jsonпроекта недвижимости. Ноль новых служб, текущий сервер cheaptrip не трогаем. - Цена stdio-схемы: PGLite однописательная. Пока открыта сессия с этим
MCP, вторая сессия и CLI (кроме
sync) упрутся в замок. - Для постоянного HTTP-сервера второй базы нужен свой plist с другой
меткой.
gbrain mcp exposeзапускать нельзя: меткаcom.gbrain.serveзашита и перезапишет службу cheaptrip. - Изолированный источник (
federated=false) в базе cheaptrip — это ноль процессов, но общая база, общий язык поиска, админ-действия через живой сервер и отдельный токен с грантом. Для «однородно и отдельно» он хуже. mountsповерх отдельной базы даёт только удобство CLI (--brain, автовыбор по папке) и пишет в~/.gbrain/mounts.json. Для MCP всё равно нужен свой serve, а части команд (mounts sync/enable) ещё нет. Можно не брать.- Готового пакета для недвижимости нет. Берём
person(агенты),company(агентства),deal(переговоры),placeизgbrain-recommendedили своиproperty/area. Страницы строим как сводка +## Open Threads+ хронология после<!-- timeline -->. - Гео в gbrain нет. Координаты кладём во frontmatter
(
geo: {lat, lng}), фильтр по району и назначению — черезwhere(только равенство), карту строит внешний скрипт по markdown-файлам в git. - Резервная копия во всех вариантах — прежде всего git-репозиторий с markdown, источником истины. База — перестраиваемый индекс, кроме данных, которые живут только в ней.