← Задача 009 — все материалы · оригинал на GitHub

Проверка отклонённого отчёта задачи 009


Часть А. Почему агент пошёл не туда

Цель Константина 02.11.2026, дословно по смыслу из LOG-task-009-konstantin-feedback-2026-11-02-wants-scalable-gbrain-system-not-files-workaround.md: подключить gbrain как долгоживущую CRM-базу знаний. Компании и сотрудники в одном месте. Сообщение в WhatsApp и письмо на почту дописывают карточку. Схема — стандартная схема gbrain, в том числе места из рекомендованной схемы и «БС2» (gbrain-base-v2). Русский поиск настройкой языка (лемма, лексема, стемминг). Векторы — когда заметок станет около 500, не на пяти. Истину проверять. Одну и ту же систему потом переносить на другие темы и проекты. Разным агентам давать доступ. Файловый «колхоз» он назвал тем, что умеет сам.

Агент сдал вариант Г: сейчас репозиторий markdown + JSON + HTML без gbrain, базу gbrain «позже, если понадобится». Это ответ на другую задачу — «карта ближе к пляжу на сегодняшних 20 квартирах».

А1. Цель «долгосрок и расширение» прочитана как «карта сейчас, gbrain по сигналу»

А2. «В gbrain нет гео» — неверный объём утверждения. Тип «место» агент сам нашёл и тут же вычеркнул

А3. «Без API пользы нет» — поиск по словам с русским стеммингом смешан с платными векторами

А4. «Одна сессия за раз» подана как свойство gbrain. Док в следующем абзаце даёт общий HTTP-сервер для многих клиентов

А5. Просьба разобрать стандартные схемы заменена своей моделью RESO в файлах

А6. Обогащение карточки из WhatsApp и почты заменено конвейером JSON, где страница — копия

А7. Масштаб «другие проекты» сужен до имени репозитория про квартиры Барселоны и до объёма «grep хватит»

А8. Ссылка на сутки для задачи, которую пользователь только что назвал вечной

Системные причины поведения

Каждая ниже — про то, как агент принимает решения, не про отдельный неверный факт.

С1. Оптимизация под «проще закрыть сегодня»

С2. Узкая проверка, которой удобно подтвердить уже написанный вывод

С3. Чужой вывод перенесён без сборки с просьбой пользователя

С4. Своя догадка подана как проверенный факт в вопросе, на который человек должен ответить

Что в старом отчёте было верным наблюдением

Новый отчёт не имеет права «опровергать» эти пункты. Он обязан отделить их от вывода «базу не строим».


Часть Б. Жёсткий чек-лист нового отчёта

Отчёт, который проверяют этим списком: исследование всех стандартных пакетов gbrain и проект масштабируемой базы. Сейчас предмет — недвижимость Барселоны (агентства, агенты, квартиры на покупку и в аренду, дома, районы, переговоры). Потом — другие темы и проекты. Обогащение из WhatsApp и почты. Проверка истинности. Русский поиск (лемма / лексема / стемминг). Векторы при росте. Доступ разных агентов.

Как пользоваться. Каждый пункт — утверждение про новый отчёт. Ответ только «да» или «нет». «Да» значит: в отчёте есть названное, и сверка с указанным файлом это подтверждает. «Нет» значит пункт провален. Вкус проверяющего не используется: если фразы или пути нет, это «нет», даже если текст «в целом разумный».

Вес:

Проверено по коду gbrain на диске 02.11.2026, пакет в $G. Если строка в пакете съехала, проверяющий ищет тот же символ (name: place, inverse: employs) и пишет новый номер строки. Менять смысл пункта из-за съехавшей строки нельзя.

Соответствие словам пользователя

  1. Долгосрок назван целью системы, а не этапом «если понадобится».

    • Утверждение: отчёт прямо говорит, что база строится для многолетнего обогащения и смены тем, и не содержит рекомендации «файлы сейчас, gbrain позже, а если не понадобится — не страшно».
    • Как проверить: поиск по отчёту фраз «позже», «если понадобится», «этап 2», «не страшно». Рядом должна быть цель со ссылкой на LOG, сообщение 1 («на долгосрок», «потенциал на расширение … ключевое»). Рекомендации отложить саму базу нет.
    • Вес: блокирующий.
  2. CRM — компании и сотрудники в одном месте, связь «работает в».

    • Утверждение: агентство — тип company, агент — тип person, связь — works_at с обратной employs. Отчёт показывает обе стороны на примере On Urbe или Ukio: страница человека ссылается на компанию, страница компании собирает людей.
    • Как проверить: в отчёте есть оба типа и имя связи. Сверка: gbrain-base-v2.yaml:76-102 (company), :61-74 (person), :419-420 (works_at / employs). Если отчёт пишет, что в v2 связь появляется сама из поля company: во frontmatter, это «нет»: карта полей лежит в gbrain-base.yaml:382-392, в v2 секции frontmatter_links нет.
    • Вес: блокирующий.
  3. Обогащение из WhatsApp и почты дописывает карточку, а не порождает витрину из JSON.

    • Утверждение: отчёт описывает цепочку «сообщение или письмо → страница разговора или письма → факт или строка хронологии на карточке человека, компании, объекта». Типы email и conversation названы и помечены как extractable. Реестр cl-cons-whats/realestate-registry/ упомянут как уже существующий вход, не как вечный второй оригинал тех же полей.
    • Как проверить: найти в отчёте слова WhatsApp и почта. Сверка типов: gbrain-base-v2.yaml:276-284 (email, extractable: true), :311-317 (conversation, extractable: true). Если истина карточки объявлена JSON-копией, а страница — генерируемым видом, пункт «нет».
    • Вес: блокирующий.
  4. Векторы отложены до роста корпуса. Их отсутствие сегодня не аргумент против базы.

    • Утверждение: отчёт пишет порядок «сейчас полнотекст, векторы около 500 страниц или когда пользователь включит». Назван хотя бы один локальный провайдер с нулевой ценой и хотя бы одна фраза, что поиск без провайдера деградирует до слов и это не ошибка. Платный ключ не требуется для старта.
    • Как проверить: в отчёте есть порог и команда вида gbrain init … --embedding-model ollama:… либо явная отсрочка с именем документа. Сверка: embedding-providers.md:35 и :185-188; TOOL_REFERENCE.md, параметр query у recall, фраза search_degraded; GBRAIN_RECOMMENDED_SCHEMA.md:912 (embeddings при 500+ страницах). Фраза «без API gbrain бесполезен» или равносильная — пункт «нет».
    • Вес: блокирующий.
  5. Русский поиск объяснён как лемма, лексема и стемминг, с командой смены языка.

    • Утверждение: отчёт различает три слова. Лексема — то, что попадает в tsvector. Стемминг — snowball выбранного языка. Лемма в этом контуре — словарная форма, к которой стеммер приводит словоформы. Указаны GBRAIN_FTS_LANGUAGE, значение по умолчанию english, команда gbrain reindex-search-vector для смены, и что язык один на базу. Конфигурация russian не объявлена «уже проверенной SELECT-ом», если SELECT не приложен.
    • Как проверить: три термина определены, не списком без смысла. Сверка: fts-language.ts:3-11 и :28; multi-language-fts.md:3-9, :42-54, :103-105, :110.
    • Вес: блокирующий.
  6. Проверка истинности встроена в схему, не только в самодельный скрипт.

    • Утверждение: отчёт называет, чем факт отличается от мнения (takes: fact / take / bet / hunch), где живёт хронология (<!-- timeline -->), и что противоречие и утверждение без источника ловятся правилом рекомендованной схемы. Для переговоров исход и причина отказа привязаны к полю или факту со ссылкой на сообщение, а не к голому списку причин в скрипте.
    • Как проверить: в отчёте есть отсылка к $G/docs/takes-vs-facts.md (различие слоёв) и к GBRAIN_RECOMMENDED_SCHEMA.md:927-937 (противоречия, сироты, источник). Если единственная проверка истинности — «скрипт сверяет JSON», пункт «нет».
    • Вес: блокирующий.
  7. Доступ разных агентов описан как один общий сервер, не как «одна сессия».

    • Утверждение: отчёт пишет, что несколько клиентов ходят в один gbrain serve --http, а второй процесс на ту же PGLite-папку падает. Отдельно: gbrain mcp expose нельзя запускать поверх службы cheaptrip, потому что метка com.gbrain.serve одна. Изоляция темы — источник и грант токена, либо отдельный GBRAIN_HOME со своим plist, и оба варианта разобраны.
    • Как проверить: цитата или пересказ $G/docs/mcp/CLAUDE_CODE.md:92-100 включает строку про ONE shared HTTP, не только про замок. Метка сверена с serve-service.ts:35. Фраза «отдельная база неудобна, потому что одна сессия» без этого абзаца — пункт «нет».
    • Вес: блокирующий.
  8. Та же схема пригодна для следующей темы, не только для квартир Барселоны.

    • Утверждение: отчёт показывает границу «смена владельца = другая база, смена темы при том же владельце = другой источник» и один пример второй темы (не недвижимость), которая садится источником в ту же базу с теми же типами person / company / place / deal. Имя репозитория, если предложено, не выдано за архитектуру.
    • Как проверить: в отчёте есть правило границ и пример второй темы. Сверка формулировки с RESEARCH старого отчёта не нужна: сверка с $G/docs/architecture/brains-and-sources.md около строк 63–64 (агент уже цитировал их в старом RESEARCH, строки 153–155; новый отчёт цитирует док, строки 63–64). Если масштаб обоснован фразой «20 квартир, хватит grep» — пункт «нет».
    • Вес: блокирующий.
  9. Постоянное место отчёта — файл в репозитории. Срок жизни ссылки не предложен как план.

    • Утверждение: отчёт не предлагает here.now, анонимную ссылку на 24 часа и вариант «ничего не делать, страницы исчезнут». Место сдачи названо: файл задачи 009.
    • Как проверить: поиск here.now, «24 час», «сутки». Совпадение есть только если это разбор ошибки LOG, сообщение 3, а не способ публикации нового текста.
    • Вес: блокирующий.

Фактическая точность по коду

  1. Все восемь стандартных пакетов названы, у каждого указан extends.

    • Утверждение: список ровно такой: gbrain-base (extends: null), gbrain-recommended (extends: gbrain-base), gbrain-creator (extends: gbrain-base), gbrain-investor (extends: gbrain-base), gbrain-engineer (extends: gbrain-base), gbrain-everything (extends: gbrain-investor, плюс borrow_from creator и engineer), gbrain-base-v2 (extends: null), company-brain (extends: gbrain-base-v2).
    • Как проверить: восемь имён совпадают с bundled.ts:10-18. extends совпадает с первыми 50 строками каждого yaml в $G/src/core/schema-pack/base/. Пропуск пакета или неверный родитель — «нет».
    • Вес: блокирующий.
  2. Тип place указан там, где он есть, и там, где его нет.

    • Утверждение: place / places/ есть только в gbrain-recommended.yaml:112-118. В gbrain-base-v2 его нет. company-brain и gbrain-everything его не наследуют, потому что не наследуют gbrain-recommended. Проза GBRAIN_RECOMMENDED_SCHEMA.md:151 говорит про household/ и properties; каталога places/ в том дереве нет. Отчёт пишет оба факта.
    • Как проверить: открыть четыре yaml и строки 151 и 990 эссе. Фраза «в gbrain нет гео» или «места есть в БС2» — «нет».
    • Вес: блокирующий.
  3. Свежая база по умолчанию на БС2, а запасной уровень резолвера — старая база.

    • Утверждение: отчёт пишет, что gbrain init ставит schema_pack = gbrain-base-v2 (уровень 6), а уровень 7 по умолчанию — gbrain-base, не v2.
    • Как проверить: schema-packs.md:159 и :161-163.
    • Вес: важный.
  4. Нет пространственного индекса — сказано точно, и из этого не сделан вывод «географии нет».

    • Утверждение: отчёт отдельно говорит: радиуса и PostGIS нет; координаты в импорте есть только как EXIF gps у картинки; район и адрес кладутся тегом, типом place или верхним полем frontmatter; фильтр where не умеет lat > и geo.lat; карту по-прежнему собирает внешний скрипт по markdown, и это не причина отказаться от базы.
    • Как проверить: есть все четыре ограничения со ссылками import-file.ts:1688-1689, frontmatter-where.ts:1-6, pages.ts:662-669. Вывод «поэтому gbrain не используем» — «нет».
    • Вес: блокирующий.
  5. list_pages не объявлен способом прочитать координаты.

    • Утверждение: отчёт говорит, что список страниц не возвращает frontmatter, и для координат нужен get_page или чтение файла. Поля списка: slug, source_id, type, title, updated_at, updated_at_iso.
    • Как проверить: pages.ts:662-669. Если отчёт обещает фильтр карты одним list_pages — «нет».
    • Вес: важный.
  6. Линзы не выданы за CRM недвижимости и не выброшены одной фразой «не пригодится».

    • Утверждение: по каждому из gbrain-creator, gbrain-investor, gbrain-engineer, gbrain-everything есть одно предложение, что пакет добавляет (atom/concept, thesis, learning, склейка трёх линз) и что к квартире, району и агентству это не добавляет типа place. Отвергнуть их без этого предложения нельзя.
    • Как проверить: четыре коротких абзаца. Сверка имён типов: gbrain-creator.yaml (atom), gbrain-investor.yaml (thesis, bet_resolution_log), gbrain-engineer.yaml (learning), шапка gbrain-everything.yaml:1-33.
    • Вес: важный.
  7. company-brain описан как надстройка над v2, с собственными типами.

    • Утверждение: отчёт говорит, что пакет наследует v2 (значит, person, company, account, deal, works_at уже есть) и добавляет свои типы вроде customer, competitor, decision. Типа place он не добавляет.
    • Как проверить: company-brain.yaml:31 (extends: gbrain-base-v2) и список page_types со строки 37. Утверждение «в company-brain нет сотрудников» — «нет», сотрудники приходят из v2.
    • Вес: важный.
  8. Форк и add-type показаны как штатный способ добавить квартиру и район, со ссылкой на учебник.

    • Утверждение: если отчёт вводит тип, которого нет в пакете (apartment, building, area), он даёт команды gbrain schema fork, add-type, add-link-type, schema sync --apply и пишет, что учебник выполняется без API-ключа. Неизвестный тип не назван поломкой: страница сохранится с предупреждением, но это не проект.
    • Как проверить: команды есть. Сверка: what-schemas-unlock.md:46-67, schema-author-tutorial.md:15 и шаги 2–4. Если свои типы объявлены только полями markdown «на будущее» без форка — «нет».
    • Вес: важный.

Полнота предметной модели

  1. Каждая сущность из постановки сопоставлена типу, связи и папке.

    • Утверждение: таблица покрывает все семь: агентство, агент, квартира на покупку, квартира в аренду, дом, район, переговоры. У каждой строки — тип gbrain или явная дырка «в стандартном пакете типа нет, добавляем форком». Покупка и аренда различены (поле, подтип или две связи), а не свалены в один note.
    • Как проверить: семь строк на месте. Район сидит на place (gbrain-recommended) или на добавленном типе, и отчёт говорит, в каком пакете этого типа не было. Пустая строка — «нет».
    • Вес: блокирующий.
  2. Связи между сущностями названы глаголами схемы, не только полями.

    • Утверждение: есть минимум works_at (агент → агентство), связь объекта с районом, связь переговоров с объектом и с человеком. Для каждой сказано, объявлена ли она в выбранном пакете или добавляется add-link-type.
    • Как проверить: три связи найдены в тексте. works_at сверен с gbrain-base-v2.yaml:419-420. Выдуманное имя связи без пометки «добавляем» — «нет».
    • Вес: блокирующий.
  3. Уже существующие реестры cl-cons-whats/realestate-registry/ имеют один исход, без второй правды.

    • Утверждение: отчёт говорит, что делать с тремя JSON (квартиры, контакты, компании): перенос в страницы одним проходом, или чтение как вход обогатителя, который пишет страницу и больше не правит те же поля в двух местах. Вариант «копия при каждой сборке» либо отвергнут с доводом, либо не предложен.
    • Как проверить: назван путь realestate-registry/ и одно правило «поле живёт в одном месте». Два редактируемых хранилища одного и того же контакта — «нет».
    • Вес: блокирующий.
  4. Дом, квартира и объявление не склеены, если отчёт их различает.

    • Утверждение: если отчёт держит физический объект и предложение агентства разными страницами, он пишет, какой тип у какого и какой связью они соединены. Если склеивает в одну страницу place или note — пишет, что теряется (два агентства на одну квартиру) и почему это принято.
    • Как проверить: в отчёте есть явная развилка и последствие. Молчаливая склейка или молчаливое копирование таблицы RESO из старого PROPOSAL без сверки с пакетом — «нет».
    • Вес: важный.

Практичность и масштабирование

  1. Порядок внедрения — команды по шагам, без обещания, что проверяющий их уже выполнил.

    • Утверждение: есть последовательность: выбрать GBRAIN_HOME или источник в существующей базе; GBRAIN_FTS_LANGUAGE до init; init без платного ключа; schema use или schema fork; источник на git-путь; sync; один HTTP для нескольких агентов; карта отдельно. У каждого шага сказано, чью базу он трогает (cheaptrip или новая папка).
    • Как проверить: шаги пронумерованы, у шага есть команда или явный отказ от команды с причиной. Шаг «запустить gbrain mcp expose для второй базы» — «нет» (serve-service.ts:35).
    • Вес: блокирующий.
  2. Оба устройства «отдельная база» и «источник в текущей базе» разобраны до конца, выбор оставлен пользователю.

    • Утверждение: по каждому устройству есть польза на примере (карточка агента On Urbe, которую дописывает WhatsApp), цена, риск для базы cheaptrip, откат. Отчёт может назвать предпочтение только после довода против каждого другого. Фразы «нам это ни к чему» без такого довода нет.
    • Как проверить: два раздела и абзац предпочтения. Предпочтение без сравнения — «нет». Скрытое предпочтение «файлы без gbrain» как основной план — «нет».
    • Вес: блокирующий.
  3. Карта и расстояние до пляжа стоят рядом с базой, не вместо неё.

    • Утверждение: отчёт говорит, кто считает расстояние (скрипт по координатам в frontmatter или в реестре гео) и кто хранит карточку (gbrain). Оба нужны. Скрипт не назван заменой схемы.
    • Как проверить: есть оба контура и одна фраза, что вопрос «какие Ukio ближе к пляжу» скрипт отвечает, а вопрос «кто в On Urbe и чем кончился торг» отвечает карточка.
    • Вес: важный.
  4. Чужой проект cheaptrip не становится заложником языка и схемы недвижимости.

    • Утверждение: если предложен источник внутри базы cheaptrip, отчёт пишет, что смена GBRAIN_FTS_LANGUAGE переиндексирует всю базу (multi-language-fts.md:103-108) и что gbrain schema use пишет общий конфиг. Рядом — как этого избежать (отдельный GBRAIN_HOME или явный отказ от смены языка cheaptrip).
    • Как проверить: риск назван со ссылкой на док. Утверждение «изолированный источник имеет свой язык полнотекста» — «нет».
    • Вес: важный.
  5. Порог векторов и порог «grep хватит» не подменяют друг друга.

    • Утверждение: отчёт не использует текущие 20 квартир как причину не заводить схему. Маленький объём может быть причиной не включать ollama сегодня. Это два разных решения, записанных отдельно.
    • Как проверить: два предложения. Одно число на оба решения — «нет».
    • Вес: важный.

Подача

  1. У каждого предложения есть довод на примере этой работы.

    • Утверждение: каждое «предлагаю N» содержит четыре вещи: польза на конкретном объекте (агент, квартира, район, письмо или чат), чем вариант лучше каждого названного соседнего, цена, риск. Объект назван (On Urbe, Ukio, Барселонета, реестр), не «в общем случае удобнее».
    • Как проверить: выборочно три предложения в отчёте. Хотя бы у одного нет примера или нет сравнения — «нет».
    • Вес: блокирующий.
  2. У каждого вопроса есть контекст, без которого ответить нельзя.

    • Утверждение: вопрос называет, кто решает (Константин), откуда сведения (файл, дата), что изменится в базе после ответа. Варианты не отрезаны молча: отброшенный вариант либо отсутствует потому, что его нет в доке, либо разобран в пункте 23.
    • Как проверить: три вопроса. Вопрос вида «какой вариант?» без файла-источника и без последствия — «нет».
    • Вес: блокирующий.
  3. Догадка отделена от сверки с файлом.

    • Утверждение: всё, что не открыто в $G или в файле задачи, помечено как догадка (например 🔮 или слово «не проверял»). Под эту пометку попадают: наличие конфигурации russian в живом pg_ts_config (SELECT не запускался), поведение here.now сверх того, что записано в LOG, любой объём «сколько часов займёт». Утверждение со ссылкой путь:строка пометки догадки не имеет, и строка существует.
    • Как проверить: пять ссылок путь:строка открываются и содержат заявленный символ. Одна битая ссылка или одна непомеченная догадка — «нет».
    • Вес: важный.
  4. Старый вывод не повторён под новым заголовком.

    • Утверждение: в новом отчёте нет рекомендации «сейчас отдельный репозиторий без gbrain, базу подключить позже, если понадобится» и нет опоры на ложный контекст «гео в gbrain нет вовсе» / «без API пользы нет» / «одна сессия, поэтому не делаем». Узкие истинные ограничения из конца части А этого файла перечислены как ограничения, не как отказ от системы.
    • Как проверить: поиск по новому отчёту «нет гео», «пользы», «одна сессия», «вариант Г». Совпадение допустимо только в разделе «что было неверно в задаче 009» с цитатой старого файла и со ссылкой на пункт А2, А3 или А4 этого чек-листа.
    • Вес: блокирующий.

Как считать приёмку по чек-листу