# AGENTS.md ## Проектные договоренности ### Публичное API библиотек - Предпочтителен `non-null` подход. - Там, где значение живет в Gradle Provider API, возвращается `Provider` (не `null`). - Там, где lookup синхронный, возвращается `Optional` (не `null`). - `find*` рассматривается как синоним legacy `get*` (поиск без `fail-fast`). - `require*` это `find*` + `fail-fast` с понятной ошибкой в месте вызова. - Для нового API предпочтительны формы `find/require`; новые `get*` по возможности не добавлять. ## Identity-first modeling Prefer an **identity-first** split between: - **identity objects** used for discovery and selection - **stateful/materialized objects** obtained through separate API calls ### Rules - Objects intended for replayable observation (`all(...)`, similar collection APIs) should be **identity objects**. - Identity objects must be: - cheap to create - effectively immutable - limited to identity and cheap selection metadata - Heavy, computed, provider-based, or runtime-bound state must be resolved separately. - Aggregate content should be accessed through dedicated lookup/materialization APIs. - Eager observation of identity is acceptable. - Eager observation of computed state is not. ### Do not - Do not store heavy computed state inside identity objects. - Do not store runtime references to foreign domains inside identity objects. - Do not use custom events when replayable identity registries plus on-demand lookup are sufficient. ### Rule of thumb **Identity objects contain selection metadata. Aggregate content is obtained separately, on demand.**