Известные неожиданности
Этот файл фиксирует специфичные для репозитория места, которые приводили к ошибкам агентов.
Критерии добавления записи
Добавляйте запись, только если верно всё перечисленное:
- Это специфично именно для данного репозитория (а не общий совет).
- Это, скорее всего, повторится у будущих агентов.
- Есть конкретное решение, которому можно следовать.
Если есть сомнения, спросите разработчика перед добавлением записи.
Шаблон записи
### [Short title]
- **Date:** YYYY-MM-DD
- **Observed by:** agent name or contributor
- **Context:** where/when it happened
- **What was surprising:** concrete unexpected behavior
- **Impact:** what went wrong or could go wrong
- **Mitigation:** exact step future agents should take
- **Status:** confirmed | superseded
Записи
Продакшен-домены приложений на Vercel могут снова переключиться на деплои из ветки Git master
- Дата: 2026-04-28
- Кем замечено: Tommaso + Codex
- Контекст: Проверка зеркал приложений Seedit и 5chan в каталоге приложений Bitsocial Web.
- Что удивило: У проектов Vercel
seeditи5chanбыло выставленоgitProviderOptions.createDeployments = "enabled", поэтому пуши в веткуmasterна GitHub продвигались на продакшен-домены, хотя политика репозитория предполагает, что продакшен-зеркала приложений отдают только релизные артефакты. - Последствия: Значки проверенных зеркал в каталоге приложений могут стать недостоверными, потому что продакшен-домены отдают последний коммит разработки вместо релизного ZIP с GitHub, хеш
index.htmlкоторого записан вabout/src/lib/apps-data.ts. - Решение: Перед добавлением или обновлением метаданных проверки зеркал изучите проект Vercel командой
vercel api /v9/projects/<project-id>и убедитесь, чтоgitProviderOptions.createDeployments = "disabled". Разворачивайте содержимое релизного ZIP черезvercel deploy --prebuilt --prod, а для деплоев разработки используйтеseedit-omega.vercel.appили5chan-omega.vercel.app. - Статус: подтверждено
Portless 0.11 переиспользует старое состояние прокси, если лаунчер не форсирует HTTPS
- Дата: 2026-04-28
- Кем замечено: Tommaso + Codex
- Контекст: Перевод обычного потока
yarn startсо старого адреса проксиhttp://bitsocial.localhost:1355наhttps://bitsocial.localhost. - Что удивило: Даже с установленным
portless@0.11.1Portless переиспользовал существующий HTTP-прокси~/.portless/proxy.port = 1355и печатал старый адрес с:1355. - Последствия: Обновить версии пакетов и документацию недостаточно;
yarn startвсё ещё может объявлять и использовать старый адрес, если у участника осталось работающее старое состояние Portless. - Решение: Стартовые скрипты должны явно поднимать HTTPS-прокси Portless на порту
443до регистрации маршрутов приложений, чтобы рантайм уходил от сохранённого состояния1355, а не наследовал его. - Статус: подтверждено
Portless меняет канонический локальный URL приложения
- Дата: 2026-03-18
- Кем замечено: Codex
- Контекст: Проверки в браузере и smoke-прогоны
- Что удивило: Локальный адрес по умолчанию — не обычный порт Vite. Репозиторий ожидает
https://bitsocial.localhostчерез Portless, поэтому проверкаlocalhost:3000илиlocalhost:5173может попасть не в то приложение или вообще никуда. - Последствия: Браузерные проверки могут падать или подтверждать не ту цель, даже когда дев-сервер полностью исправен.
- Решение: Сначала используйте
https://bitsocial.localhostи обходите его черезPORTLESS=0 corepack yarn startтолько тогда, когда вам действительно нужен прямой порт Vite. - Статус: подтверждено
Хуки Commitizen блокируют неинтерактивные коммиты
- Дата: 2026-03-18
- Кем замечено: Codex
- Контекст: Процессы коммитов, выполняемые агентами
- Что удивило:
git commitчерез Husky запускает Commitizen, который ждёт интерактивного ввода в TTY, из-за чего неинтерактивные оболочки агентов зависают. - Последствия: Агент может зависнуть на неопределённое время там, где ожидался обычный коммит.
- Решение: Для коммитов, создаваемых агентами, используйте
git commit --no-verify -m "message". Люди по-прежнему могут пользоватьсяcorepack yarn commitилиcorepack yarn exec cz. - Статус: подтверждено
Corepack обязателен, чтобы не попасть на Yarn classic
- Дата: 2026-03-19
- Кем замечено: Codex
- Контекст: Переход менеджера пакетов на Yarn 4
- Что удивило: На машине всё ещё есть глобальная установка Yarn classic в
PATH, поэтому запуск простоyarnможет разрешиться в v1 вместо закреплённой версии Yarn 4. - Последствия: Разработчики могут случайно обойти закрепление менеджера пакетов и получить другое поведение установки или другой результат в lock-файле.
- Решение: Используйте в командах оболочки
corepack yarn ...либо сначала выполнитеcorepack enable, чтобы простоyarnразрешался в закреплённую версию Yarn 4. - Статус: подтверждено
Фиксированные имена приложений Portless конфликтуют между worktree Bitsocial Web
- Дата: 2026-03-30
- Кем замечено: Codex
- Контекст: Запуск
yarn startв одном worktree Bitsocial Web, когда другой worktree уже раздавался через Portless - Что удивило: Использование буквального имени приложения Portless
bitsocialв каждом worktree приводит к конфликту самого маршрута, даже если базовые порты различаются, поэтому второй процесс падает: имяbitsocial.localhostуже зарегистрировано. - Последствия: Параллельные ветки Bitsocial Web могут блокировать друг друга, хотя Portless задуман как раз для того, чтобы они безопасно сосуществовали.
- Решение: Оставляйте запуск Portless за
scripts/start-dev.mjs, который вне канонического случая использует привязанный к ветке маршрут*.bitsocial.localhostи переключается на такой маршрут, когда голое имяbitsocial.localhostуже занято. - Статус: подтверждено
Предпросмотр документации раньше жёстко использовал порт 3001
- Дата: 2026-03-30
- Кем замечено: Codex
- Контекст: Запуск
yarn startпараллельно с другими локальными репозиториями и агентами - Что удивило: Корневая dev-команда запускала workspace документации через
docusaurus start --port 3001, поэтому вся дев-сессия падала, если порт3001уже был занят другим процессом, хотя основное приложение уже работало через Portless. - Последствия:
yarn startмог убить веб-процесс сразу после его запуска, прерывая посторонние локальные задачи из-за конфликта порта документации. - Решение: Оставляйте запуск документации за
yarn start:docs, который теперь использует Portless вместе сscripts/start-docs.mjs, чтобы учитывать переданный свободный порт или брать следующий доступный при прямом запуске. - Статус: подтверждено
Имя хоста Portless для документации было жёстко зашито
- Дата: 2026-04-03
- Кем замечено: Codex
- Контекст: Запуск
yarn startво вторичном worktree Bitsocial Web, когда другой worktree уже раздавал документацию через Portless - Что удивило:
start:docsвсё ещё регистрировал буквальное имя хостаdocs.bitsocial.localhost, поэтомуyarn startмог падать, хотя about-приложение уже умело избегать конфликтов маршрутов Portless для собственного имени хоста. - Последствия: Параллельные worktree не могли надёжно пользоваться корневой dev-командой, потому что процесс документации завершался первым, а затем
concurrentlyубивал остаток сессии. - Решение: Оставляйте запуск документации за
scripts/start-docs.mjs, который теперь выводит то же привязанное к ветке имя хоста Portless, что и about-приложение, и передаёт этот общий публичный URL в цель dev-прокси/docs. - Статус: подтверждено
Оболочки worktree могут не увидеть закреплённую в репозитории версию Node
- Дата: 2026-04-03
- Кем замечено: Codex
- Контекст: Запуск
yarn startв Git-worktree, например в.claude/worktrees/*или в соседних чекаутах worktree - Что удивило: Некоторые оболочки worktree разрешали
nodeиyarn nodeв Homebrew Node25.2.1, хотя репозиторий закрепляет22.12.0в.nvmrc, поэтомуyarn startмог незаметно запускать dev-лаунчеры под неверным рантаймом. - Последствия: Поведение дев-сервера может расходиться между основным чекаутом и worktree, из-за чего баги трудно воспроизвести, и это нарушает ожидаемую в репозитории цепочку инструментов Node 22.
- Решение: Оставляйте dev-лаунчеры за
scripts/start-dev.mjsиscripts/start-docs.mjs, которые теперь перезапускают себя под бинарником Node из.nvmrc, если текущая оболочка использует не ту версию. При настройке оболочки всё равно предпочтительнееnvm use. - Статус: подтверждено
Остатки docs-site/ могут скрыть отсутствие исходников документации после рефакторинга
- Дата: 2026-04-01
- Кем замечено: Codex
- Контекст: Уборка монорепозитория после переноса проекта Docusaurus из
docs-site/вdocs/ - Что удивило: Старая папка
docs-site/может остаться на диске с устаревшими, но важными файлами вродеi18n/, даже после того как отслеживаемый репозиторий переехал вdocs/. Из-за этого рефакторинг локально выглядит продублированным и может скрыть тот факт, что отслеживаемые переводы документации на самом деле не были перенесены вdocs/. - Последствия: Агенты могут удалить старую папку как «мусор» и случайно потерять единственную локальную копию переводов документации либо продолжать править скрипты, которые всё ещё указывают на мёртвый путь
docs-site/. - Решение: Считайте
docs/единственным каноническим проектом документации. Прежде чем удалять локальные остаткиdocs-site/, восстановите отслеживаемые исходники вродеdocs/i18n/и обновите скрипты и хуки, чтобы они перестали ссылаться наdocs-site. - Статус: подтверждено
Мультиязычный предпросмотр документации может резко поднять расход RAM во время проверки
- Дата: 2026-04-01
- Кем замечено: Codex
- Контекст: Исправление i18n документации, маршрутизации локалей и поведения Pagefind с помощью
yarn start:docsи Playwright - Что удивило: Режим предпросмотра документации по умолчанию теперь перед раздачей выполняет полную мультиязычную сборку документации и индексацию Pagefind, и удержание этого процесса вместе с несколькими сессиями Playwright или Chrome может потреблять заметно больше RAM, чем обычный цикл Vite или одноязычный dev-режим Docusaurus.
- Последствия: Машине может не хватить памяти, браузерные сессии могут падать, а прерванные прогоны могут оставить после себя устаревшие серверы документации или headless-браузеры, которые продолжают есть память.
- Решение: Для работы с документацией, где не нужны проверки маршрутов локалей или Pagefind, предпочитайте
DOCS_START_MODE=live yarn start:docs. Используйте мультиязычный предпросмотр по умолчанию только тогда, когда нужно проверить переведённые маршруты или Pagefind. Держите одну сессию Playwright, закрывайте старые браузерные сессии перед открытием новых и останавливайте сервер документации после проверки, если он больше не нужен. - Статус: подтверждено
translate-docs.py может оставить локали документации переведёнными наполовину или со сломанными целями ссылок
- Дата: 2026-04-06
- Кем замечено: Codex
- Контекст: Исправление локализованных маршрутов и контента документации после того, как
yarn start:docsотдавал английские страницы деталей или не собирал вывод для локали - Что удивило: У конвейера перевода документации оказалось сразу два специфичных для репозитория режима отказа:
scripts/translate-docs.pyизвлекал лишь небольшую часть сообщенийDocsHome, когда вызовыtr(...)использовали формы, которые он не разбирал, а переведённый markdown подdocs/i18n/**мог содержать машинно-переведённые слаги или артефактыZXQPLACEHOLDERвнутри целей ссылок. - Последствия: Локализованные главные страницы могут молча откатываться на английский, локализованные страницы деталей могут выглядеть непереведёнными, а полная
yarn docs:buildможет падать на сломанных ссылках локалей, хотя исходная документация корректна. - Решение: После изменения переводов документации или регенерации файлов локалей всегда запускайте
yarn docs:buildиз корня репозитория, проверяйте markdown вdocs/i18n/**наZXQPLACEHOLDERи убеждайтесь, что переведённые ссылки по-прежнему указывают на канонические слаги документации вроде/apps/5chan/, а не на переведённые URL-пути. Если текстDocsHomeизменился, убедитесь, чтоscripts/translate-docs.pyвсё ещё извлекает все сообщенияdocs.home.*. - Статус: подтверждено
Проверки about-сайта без JS должны идти через маршрут Portless, а не через отдельный SSR-предпросмотр
- Дата: 2026-04-12
- Кем замечено: Codex
- Контекст: Проверка поддержки работы без JS для сайта
about/из worktree с веткой - Что удивило: Отдельный SSR-предпросмотр может выглядеть здоровым, пока реальный привязанный к ветке маршрут Portless всё ещё отдаёт не ту оболочку приложения или более старый процесс. В этом репозитории настоящий локальный контракт — это имя хоста Portless из
yarn start, а не самодельный сервер предпросмотра. - Последствия: Агенты могут ошибочно заявить, что работа без JS в порядке, или пропустить регрессии, которые проявляются только на
*.bitsocial.localhost. - Решение: Для браузерной проверки
about/всегда поднимайте настоящий локальный сервер черезyarn startилиyarn start:aboutи сначала тестируйте привязанный к ветке URL Portless. Если имя хоста Portless выглядит устаревшим, найдите и остановите старый процесс перед повторной проверкой. - Статус: подтверждено
chain/ был невидим для yarn build:verify и yarn doctor
- Дата: 2026-07-05
- Кем замечено: Codex
- Контекст: Проверка диффа, затрагивающего только chain/, после того как в монорепозиторий добавили workspace
chain/(отдельное приложение Vite дляchain.bitsocial.net). - Что удивило:
scripts/verify-build.mjsраспознавал только префиксы путейabout/,docs/иstats/, поэтому дифф только по chain/ печатал «No targeted build checks matched the current diff» и вообще не запускал сборку, хотяbuild:chainуже был в корневомpackage.json. Отдельно от этогоyarn doctorбыл жёстко зашит наreact-doctor about -y, поэтому изменения React вchain/srcне получали никакого покрытия React Doctor. - Последствия: Агентам, проверяющим изменения chain, приходилось знать, что нужно вызывать
yarn build:chainнапрямую, вместо того чтобы доверятьyarn build:verify, а проблемы React вchain/src(эффекты, хуки, мёртвый код) оставались незамеченными дляyarn doctor. - Решение: В
scripts/verify-build.mjsтеперь есть ветка дляchain/, зеркалящая ветку дляabout/, аdoctorиdoctor:verboseтеперь запускаютreact-doctor --project about,chain -yодним вызовом.doctor:scoreостаётся только дляabout, потому что--scoreмолча ничего не печатает в сочетании с--projectбольше чем для одного проекта; если нужна оценка для chain, используйтеyarn react-doctor --project about,chain --verbose -y(или--json). - Статус: подтверждено
Браузерный P2P работает поверх защищённых WebSockets; pkc-js по умолчанию запрещает WebRTC и WebTransport
- Дата: 2026-08-02
- Кем замечено: Claude
- Контекст: Написание текстов лендинга и документации о том, как работает браузерный P2P в Bitsocial
- Что удивило:
@pkcprotocol/pkc-jsпоставляется с гейтером соединений по умолчанию, который отклоняет исходящие подключения по WebRTC и WebTransport в браузере —dist/browser/helia/dial-transport-filter.jsэкспортируетDENIED_DIAL_TRANSPORTS_BY_DEFAULT = ["webrtc", "webrtc-direct", "webtransport"]. Комментарий в исходнике объясняет причину: в браузере эти транспорты добавляют долгие и часто неудачные пути установления соединения (STUN/ICE, ротация certhash), которые замедляют загрузку, тогда как WebSocket работает напрямую и надёжно. У каждого живого пира на панели статуса P2P в блоге показано «Secure WebSocket». Гейтер живёт вnode_modules, поэтому ничто в репозитории на него не намекает. - Последствия: Очень легко написать технически правдоподобный, но ложный публичный текст — например приписать выходу WebTransport в браузерный Baseline в марте 2026 года заслугу того, что браузерный P2P в Bitsocial стал возможен. Это утверждение успело попасть на лендинг, в сравнительную таблицу и на две страницы документации, прежде чем разработчик его заметил. Неверные утверждения об архитектуре на публичных страницах проверяет ровно та аудитория разработчиков, на которую нацелен сайт.
- Решение: Никогда не выводите используемые Bitsocial транспорты из того, что в принципе поддерживают libp2p или платформа браузера. Посмотрите текущий список запретов в
node_modules/@pkcprotocol/pkc-js/dist/browser/helia/dial-transport-filter.js, убедитесь, что подabout/src/нет переопределенияconnectionGater, и прочитайте живые метки транспортов на панели «P2P status» в блоге, прежде чем делать любое публичное заявление. Апстрим-изменением, которое действительно разблокировало публикацию из браузера, было исправление монотонного seqno в gossipsub в@libp2p/gossipsub15.0.21 (май 2026); pkc-js сейчас поставляет 16.0.4. - Статус: подтверждено
Относительные ссылки ./page.md со страницы документации без перевода ломают сборку каждой локали
- Дата: 2026-08-02
- Кем замечено: Claude
- Контекст: Добавление новой страницы только на английском,
docs/browser-p2p.md, которая ссылалась на существующую документацию через./peer-to-peer-protocol.mdи./apps/5chan.md - Что удивило: Каждая локаль под
docs/i18n/<lang>/docusaurus-plugin-content-docs/current/зеркалит дерево документации. Новая страница, отсутствующая в этих зеркалах, всё равно отображается во всех локалях через откат на английский, но её относительные markdown-ссылки перестают разрешаться: Docusaurus выдаёт/ar/browser-p2p/peer-to-peer-protocol.md/и валит сборку с «Docusaurus found broken links!». Важно, чтоyarn build:verifyиyarn docs:build:verifyсобирают толькоenи проходят чисто; проблему показывает лишь полнаяyarn docs:build, и она прерывается на первой локали по алфавиту (ar). - Последствия: Изменение документации может пройти все быстрые локальные проверки и всё равно сломать продакшен-сборку со всеми локалями. Отказ к тому же выглядит не связанным с изменением, поскольку в ошибке фигурирует путь локали, которую автор не трогал.
- Решение: На любой странице документации, не зеркалированной в
docs/i18n/**, используйте ссылки от корня (/peer-to-peer-protocol/,/apps/5chan/) вместо относительных.md-ссылок; Docusaurus сам подставит к ним префикс локали. Готовый пример —docs/build-your-own-client.md. Прогоняйте полнуюyarn docs:build, а не толькоbuild:verify, прежде чем передавать любое изменение, которое добавляет страницу документации или ссылку на неё. - Статус: подтверждено
update-translations.js нужно запускать из about/, а параллельные запуски молча теряют ключи
- Дата: 2026-08-02
- Кем замечено: Claude
- Контекст: Применение 26 переведённых ключей i18next во всех 36 локалях с помощью навыка
translate - Что удивило: Две отдельные ловушки в одном скрипте. Во-первых,
scripts/update-translations.jsвычисляет свою цель какpath.join(process.cwd(), "public", "translations"), но этот репозиторий хранит переводы вabout/public/translations. Запуск задокументированной команды из корня репозитория падает при каждом вызове с «Translations directory not found»: вdocs/agent-playbooks/translations.mdпоказаноnode scripts/update-translations.js ..., что читается как команда из корня репозитория. Во-вторых, каждый вызов — это чтение-изменение-запись по всем 36 файлам локалей, поэтому два одновременных вызова затирают друг друга и один ключ пропадает без единой ошибки. Навыкtranslateпрямо предписывает запускать до 4 субагентов параллельно, и каждый из них вызвал бы этот скрипт. - Последствия: Форма из корня репозитория падает шумно и тратит целый проход. А вот проблема параллелизма проявляется молча: ключи пропадают из произвольных локалей, а дифф всё равно выглядит правдоподобно.
- Решение: Запускайте так:
cd about && node ../scripts/update-translations.js --key <key> --map <abs-path> --write. Никогда не позволяйте субагентам-переводчикам писать файлы локалей параллельно — пусть они выдают только JSON-словари, а затем применяйте каждый ключ последовательно из родительского агента. После применения программно проверьте, что каждый ключ присутствует во всех 35 неанглийских локалях и что ни одно значение не совпадает побайтово с английским исходником. - Статус: подтверждено