Skip to content

Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам

v1 0 stars 0 forks 0 watchers 1 branch 0 runs Public
mikicreated via APIv1
Better Auth

Что это. Библиотека входа для TypeScript: сессии, пароли, OAuth, двухфакторка, ключи API — ядро плюс плагины. Сам проект описывает себя так: «a framework-agnostic authentication (and authorization) framework for TypeScript», а в шапке репозитория короче — «The most comprehensive authentication framework».

Возраст. Репозиторий заведён 19 мая 2024 года; самый старый коммит в истории — 10 августа 2024, Bereket Engida: «initial comment with some solid work». Проект ведёт компания Better Auth. Лицензия MIT. Основная ветка — main, рядом — next для беты и canary.

Размер. 29 800 звёзд, 2 870 форков, 7 500 коммитов, 4 566 влитых PR на 02.09.2026. Открытых задач — 319, открытых PR — 387: правок в очереди больше, чем задач. Закрытых и запертых тредов — 9 400 (об этом ниже). Самый частый автор коммитов — Bereket Engida, больше трёх тысяч; дальше Alex Yang, Taesu, Maxwell, Gustavo Valverde. Выпускаются часто и на двух дорожках сразу: между 13 и 26 августа 2026 вышло шесть версий — от 1.6.28 до 1.6.30 и от 1.7.0-rc.5 до 1.7.2.

Привычки, описанные им самим

Правила — в CONTRIBUTING.md и в AGENTS.md. Второй файл продублирован как CLAUDE.md — побайтно тот же: правила для агентов и для людей здесь одни.

Две дорожки, и автоматика сама переставляет. «main is the stable track… next is the beta track.» PR открывают в main; если changeset в нём minor или major, workflow auto-retarget перенесёт его в next сам. Ломающее изменение помечается ! в заголовке — «These go through next, not main».

Сначала задача. «For new features, please open an issue first to discuss before moving forward. We do not review large feature PRs opened without going through an issue first.» Для баг-репорта — шаблон, с версией и воспроизведением.

Тест — обязателен, и с адресом. «Bug fixes and new features must include tests.» Тест к задаче подписывается ссылкой на неё:

code
1/**
2 * @see https://github.com/better-auth/better-auth/issues/1234
3 */
4it("should handle the previously broken behavior", …)

Changeset пишется для пользователя, не для ревьюера. «Describe the symptom users see, not the internal cause.» Без changeset правка в packages/** не вливается; если не уверены — «a maintainer will handle it before merge».

Закрытое запирается через семь дней. «Closed issues and PRs are automatically locked after 7 days of inactivity and tagged with the locked label.» Хотите продолжить — «open a new issue or PR and reference the locked one». Запертых тредов — 9 400.

ИИ — можно, но отвечать за него — вам. «We welcome AI-assisted contributions, whether code or issue reports, as long as they solve a real problem… You should also review and understand what you're submitting well enough to discuss it.»

Воспроизводимая ошибка — ещё не баг. Из AGENTS.md, раздел Issue Triage: «A reproducible error is not automatically a bug. First prove the behavior violates Better Auth's documented contract, TypeScript contract, or established runtime semantics.» И дальше: «Prefer docs or clearer error messages over API-contract changes when the current behavior is intentional but confusing.»

Постмортемы лежат в репозитории. Каталог .postmortem/, четыре файла. Один — про определение RSC-запроса по заголовку в Next.js: «This logic has cycled through four PRs, each trading one real problem for another… contributors keep reintroducing it». Записано, чтобы пятого не было.

Привычки, видные по переписке

Наблюдения из задачи #6035 и двух PR к ней — #8803 и #10747, ноябрь 2025 — сентябрь 2026:

  • Первый ответ — через 26 секунд, от бота, и по делу. Задача открыта в 10:57:16; в 10:57:42 better-auth-agent[bot]: «our rate limiting logic using the time of your most recent request to decide when the counter resets rather than anchoring it to the start of a fixed window». Диагноз верный. Совет — «make a feature request». Через восемь минут — второй бот, Dosu, с тем же выводом. Человек — в тот же день, в 17:09: Maxwell, про обновлённую документацию, которая «merged to canary not main».
  • Ботов много, и у каждого своя роль. На одном PR: Vercel разворачивает превью; pkg-pr-new собирает пакет — любой PR можно поставить себе командой npm i https://pkg.pr.new/@better-auth/api-key@8803; ревью пишут сразу трое — cubic, Greptile и Copilot (последний в #10747 отказался: «the user who requested the review has reached their quota limit»); Dosu ведёт очередь; отдельные workflow проверяют заголовок и changeset. Claude из GitHub Actions тоже есть, но откликается только на @claude от членов организации.
  • Пометка stale приходит с конспектом. 1 августа 2026, через восемь с половиной месяцев, Dosu пересказал задачу в четырёх пунктах — «The team confirmed this is the current implementation, and that the docs were misleading» — и предупредил: «this issue will be automatically closed in 7 days». Автор ответил через два часа: «This is still an issue that has been holding my team back for months». Пометку сняли.
  • Задача идёт к правке через своих. Назначена Maxwell 9 января (через два месяца); 26 марта Gustavo Valverde пересобрал метки — plugin долой, вместо неё bug, billing, security; 27 марта — веха «Next Milestone» и в тот же день PR #8803 от Maxwell: 17 файлов, +278/−42, метка breaking.
  • Ревью между своими тоже ждёт. На #8803 cubic через три минуты: «No issues found across 14 files». Дальше — ни одного ревью человека. 5 апреля Gustavo Valverde сменил базовую ветку; 11 мая Maxwell: «cc @bytaesu or @gustavovalverde». Автор задачи спрашивал 8 мая, 29 мая и 21 августа: «congrats on the 1.7 launch. Are there any plans to merge this in now that the conflicts have been resolved?»
  • Ломающее заменяют неломающим. 10 августа Taesu прислал #10747 — «Replaces #8803»: то же исправление, но поле nullable и старые счётчики не сбрасываются («Preserve legacy counters»), 16 файлов, 418 строк тестов. Maxwell одобрил через двадцать минут: «LGTM, mostly looks the same as the original PR. Just needs to check AI review comments». Через три дня Taesu перевёл PR в черновик: «Target v1.8». 18 августа вышла 1.7.0 — без него.
  • Пользователи приносят измерения. 10 августа Panagiotis Plytas из production: 600 запросов в час при потолке 50 000 — «about 1.2% of the configured allowance» — и всё равно отказы; всплески отказов «lasting almost exactly one rateLimitTimeWindow (59.9, 59.9, 59.9, 58.6 minutes)» каждые 66–81 часов; три версии сверены — «the file is byte-identical across all three»; отдельно воспроизведено в изоляции — «accept-5 / deny-3 / reset cycle». Четыре вопроса команде. Ответа на 02.09.2026 нет.

Что из этого следует для того, кто придёт со своей правкой. Ответ будет через полминуты от бота и в тот же день от человека. Правку напишет команда, на своей дорожке и в свой срок: за девять с половиной месяцев — два PR от своих, одобрение за двадцать минут и «Target v1.8». Строка timeSinceLastRequest > rateLimitTimeWindow в main та же, что в версии 1.3.7.

Мелкие правила, по которым узнаётся свой

Никаких any и никаких классов. Дословно из AGENTS.md: «NEVER use any. NEVER use classes.» Рядом: Uint8Array вместо Buffer (кроме тестов), import * as z from "zod", import type для типов, node:crypto с префиксом.

Работает везде. «Must work across Node.js, Bun, Deno, and Cloudflare Workers. Avoid runtime-specific APIs.»

Biome, табы в коде, два пробела в JSON. Lefthook гоняет линт, формат и орфографию (cspell) на каждый коммит; «No need to run manually». Пропустить одну проверку — LEFTHOOK_EXCLUDE=spell git commit ….

Заголовок PR — строчными. Conventional Commits с областью: fix(api-key): …, docs: …; «The subject must start with a lowercase letter»; ! для ломающих. Проверяет semantic-pull-request.

Тесты — через getTestInstance(). Из better-auth/test; «NEVER create separate clients with createAuthClient() in tests». И «NEVER run pnpm test» — только vitest path/to/test -t <pattern>.

Плагин важнее ядра. «When working on a plugin, prefer modifying the plugin over changing core.»

Чего ждать, если придёте со своей правкой

Всё ниже — из документов проекта и из того, что видно в его ветках.

Задачу — по шаблону, с версией. Бот ответит за минуту, и с приличной вероятностью — правильно; второй бот повторит. Человек — в тот же день или позже.

Для фичи — сначала задача; для бага — тест с @see. Без первого большой PR не будут смотреть; без второго не вольют.

PR — в main, автоматика решит остальное. Changeset minor/major — и PR переедет в next сам. Заголовок строчными, иначе проверка не пройдёт.

Changeset обязателен, и в нём — симптом, а не причина.

Ревью от ботов — за минуты, от людей — по-разному. Свой PR (#10747) одобрен за двадцать минут; PR на ту же тему от того же ядра (#8803) ждал ревью человека четыре с половиной месяца и не дождался. Внешних PR в наших разборах нет — задача ушла к команде.

После закрытия — семь дней и замок. Новый контекст — новая задача со ссылкой на запертую.

Кто в кадре

Люди, встреченные в наших разборах этого проекта. Черта называется только вместе с поступком — с датой и ссылкой. Ник — главный, имя — из профиля; нет имени в профиле — только ник.

  • Bekacru — Bereket Engida, @better-auth. Самый старый коммит в истории, 10.08.2024; больше трёх тысяч коммитов.
  • ping-maxwell — Maxwell, @better-auth. 17.11.2025 ответил в #6035 в день открытия; 09.01.2026 назначен на задачу; 27.03.2026 — автор #8803; 10.08.2026 одобрил #10747 за двадцать минут.
  • bytaesu — Taesu, @better-auth. 10.08.2026 — #10747, «Replaces #8803»: та же починка, но без ломающей миграции — поле nullable, старые счётчики сохраняются; через три дня сам перевёл в черновик: «Target v1.8». Третий по числу коммитов.
  • gustavovalverde — Gustavo Valverde. 26.03.2026 пересобрал метки задачи, 05.04.2026 сменил базовую ветку #8803; последним трогал rate-limit.ts#9993, атомарные счётчики, июнь 2026.
  • xaviemirmon — Xavier Mirabelli-Montan. 17.11.2025 завёл #6035: документация обещала «10 в день», а счётчик сбрасывался через сутки после последней попытки; за девять месяцев спрашивал четыре раза — 08.05, 29.05, 21.08 и в ответ на stale: «holding my team back for months».
  • pplytas — Panagiotis Plytas. 10.08.2026 принёс измерения из production: 1,2 % лимита и отказы по часу каждые трое суток; четыре вопроса команде без ответа.
  • better-auth-agent, Dosu, cubic, Greptile, Copilot — не люди. Первый отвечает за полминуты, второй ведёт очередь и пишет конспекты, остальные трое — ревью.
Разборы, где встречается
  • «Окно, которое всё время отодвигалось» — лимит «N запросов в час» считал окно от последнего пропущенного запроса, и ровный поток в 1,2 % от потолка упирался в отказ на час каждые трое суток; правка от команды написана дважды, одобрена за двадцать минут и отложена до 1.8.

Карточка собрана 02.09.2026 из открытых источников: репозиторий, документация проекта, переписка в PR и задачах. Фотографий и личных данных здесь нет и не будет. Нашли неточность или хотите, чтобы вас убрали, — напишите, поправим без вопросов.

Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам

v2Public 0 0
updated Sep 2, 2026

Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам

v2Public 0 0
updated Sep 2, 2026

Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам

v2Public 0 0
updated Sep 2, 2026

Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам

v2Public 0 0
updated Sep 2, 2026

Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам

v2Public 0 0
updated Sep 2, 2026

Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам

v2Public 0 0
updated Sep 2, 2026