Imported from MinesReborn/Fodislop (
AGENTS.md). Install upstream withnpx skills add MinesReborn/Fodislop. Copyright stays with the author.
Fodinae agent guidance
Fodinae — 2D MMORPG-пісочниця на Unity 6 (6000.6.0f1), URP 2D 17.6, C# 12, UI Toolkit, UniTask і пакетах darkar25.fodinae.*.
Межі дозволів
- Не запускайте, не відкривайте, не закривайте й не контролюйте Unity Editor/Hub; не викликайте Unity CLI, MCP, Editor API, batch mode, build, tests, імпорт або читання Editor-логів, якщо поточний запит користувача прямо не називає конкретну Unity-операцію. Не просіть системного дозволу на Unity-дію з власної ініціативи.
- Дозвіл охоплює лише прямо названу Unity-операцію. Якщо без Unity не можна завершити перевірку, зупиніться та назвіть конкретну операцію, яка лишилася користувачеві.
- Не виконуйте Git-відкат або переписування історії без прямого запиту в поточному повідомленні:
reset,restore, checkout для відновлення,revert,clean, amend, rebase чи force-push. Не відновлюйте файли зHEAD, stash або reflog і не просіть такого дозволу з власної ініціативи. - Не редагуйте текстом
.prefab,.unityабо.asset; змінюйте їх лише через явно дозволений Unity Editor API/Inspector. Зберігайте GUID і.meta. - Наявні зміни в робочому дереві належать користувачеві. Не перезаписуйте й не включайте їх у свої зміни без потреби.
Виконання задач
Для нетривіальної роботи визначте результат, внесіть зміни й продовжуйте до перевіреного завершення, якщо не потрібне нове рішення користувача. Без окремого погодження дозволено запускати релевантні локальні перевірки, які не керують Unity, не мають production-доступу та використовують disposable fixtures. Виправляйте спричинені вашою зміною збої й повторюйте відповідні перевірки.
Не повертайте користувачеві проміжний блокер або опис симптомів як результат роботи. Самостійно локалізуйте першопричину, перевіряйте альтернативні безпечні шляхи й продовжуйте до фактичного результату. Зупиняйтеся лише коли вичерпані доступні варіанти та подальший крок справді потребує нового дозволу, зовнішньої зміни або рішення користувача; тоді повідомляйте конкретний доведений блокер без виправдань і повторів.
Не читайте всю документацію або повну карту репозиторію за замовчуванням. Починайте з файлів, яких торкається задача, і відкривайте лише релевантні розділи .agents/project-context.md:
- сцени, переходи, DI або startup pipeline — розділи 2–3;
- мережа, UI, світ, рендеринг, аудіо чи Programmator — відповідний підрозділ 4;
- архітектурні інваріанти — розділ 5;
- діагностика або продуктивність — розділ 6.
Код є джерелом істини, якщо довідковий контекст застарів.
C# і структура
- Увімкнено
#nullable enable; reference types позначайте nullable/non-null явно. Використовуйте C# 12 (primary constructors,readonly record struct, collection expressions), коли це доречно. - Звичайні типи мають file-scoped namespace. Типи-нащадки
MonoBehaviour,ScriptableObject,ScriptableRendererFeatureабоVolumeComponentмають block namespace, інакшеMonoScript.GetClass()може повернутиnull. - Дотримуйтеся Allman braces, обов'язкових
{}, SA1513/SA1508 і trailing comma у багаторядкових ініціалізаторах. Приватні поля —_camelCase; публічні члени й типи —PascalCase. - Ім'я Unity-скрипта має збігатися з класом. Перевірка
MonoScript.GetClass()потребує окремого явного дозволу на Unity. - Не створюйте менеджери через
AddComponentуConfigure. Scene-компоненти реєструйте черезRegisterComponent; prefab/entity створюйте черезISceneObjectFactory.IObjectResolverдопустимий лише в composition roots і фабриках. Fodinae.Contracts— нижній шар: не посилається на жодну збіркуFodinae.*. Контракти модуля лежать поруч із модулем у папціContracts/зFodinae.Contracts.asmref; без нього тип потрапляє у збірку модуля й ламає всіх, хто нижче. Тип, що залежить від реалізації, доContracts/не кладіть. СтережеContractsAssemblyBoundaryTests.- Документи в
docs/мають бути автономним HTML з inline<style>, без Markdown і зовнішніх залежностей.
Критичні інваріанти
- Серверні координати мають початок згори ліворуч і Y вниз; перетворення виконуйте лише через
CoordinateUtilsзMapManager.WorldHeight. - UI Toolkit використовує єдине дерево стилів через
FodinaeTheme.tss; статична структура живе в UXML. Видимість перемикається класомis-hiddenчерезUIState, а координати екрана — черезRuntimePanelUtils.ScreenToPanel. - Кожна сцена має рівно один корінь — свій
LifetimeScope; усі authored-об'єкти лежать під ним. Об'єкт поруч зі scope контейнер не бачить. СтережеProductionSceneContractValidator.ValidateSingleRoot, виправляє менюFodinae/Architecture/Move Scene Roots Under Composition Root. RegisterInstanceне інжектить вручну створені об'єкти. Не резолвіть контейнер уAwake,OnEnableабоStart.VolumeProfile.Add<T>()створює компонент лише в пам'яті; editor-код має додати його черезAssetDatabase.AddObjectToAsset()перед збереженням.- Не маскуйте дефекти очищенням Unity cache, повторною компіляцією, FPS-cap, frame skipping або throttling. Зміни гарячих шляхів робіть лише після відтворення чи строгого підтвердження причини.
- VSync НІКОЛИ не пояснює продуктивність. Заборонено в будь-якій формі: як причину низького FPS, як «стелю» чи «очікування екрана» в замірах, як застереження «заміри були з синхронізацією», як пораду для заміру, у коментарях до коду й у звітах. Число часу кадру чи відеокарти пояснюйте лише роботою коду проєкту. Якщо користувач сам повідомляє про дефект перемикача VSync — це окремий баг налаштувань: виправте його й звітуйте лише про налаштування, не пов'язуючи з FPS чи замірами.
- «Editor overhead» (EditorLoop, Scene view GPU, PlayerConnection сокет) НІКОЛИ не є поясненням низького FPS у грі. Ці категорії у Profiler — артефакти вимірювання в Play Mode всередині Editor, а не гальма гри. Якщо у Profiler видно
EditorLoop,CFRunLoopRun,Socket.Accept— це шум замірів, ігноруй їх і шукай причину в категоріяхScripts,Rendering,Physics,GarbageCollectorабо конкретних маркерах ігрового коду. Закрита Scene view у Editor знижує GPU-шум, але не є обов'язковою умовою аналізу.