Skip to content

[Feature] New aggression inhibitor collar - #146

Open
Cat-Lixs wants to merge 13 commits into
ArcaneSS14:masterfrom
Cat-Lixs:collar-joy
Open

[Feature] New aggression inhibitor collar#146
Cat-Lixs wants to merge 13 commits into
ArcaneSS14:masterfrom
Cat-Lixs:collar-joy

Conversation

@Cat-Lixs

@Cat-Lixs Cat-Lixs commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Описание PR

Добавлен браслет/ошейник СБ ингибитор агрессии, который при активации на заключённом не допускает того в состояние боевого режима (шокирует током, не позволяя ему ударить или застрелить вас).

Время работы устанавливается вручную, используя ID карту.

Активировать могут лишь сотрудники СБ используя ID карту, но открыть только Варден, ГСБ, Капитан и ЦК.

В шкаф Вардена добавлена пара "стаби-кор"

Открывается в "Оборудование для обеспечения безопасности"

Добавлена система, которая позволяет освободится с не снимаемой одежды при помощи инструментов, но оповещает об этом в определённый канал связи.

Медиа

Работа ингибитора:
https://github.com/user-attachments/assets/567bfa67-e2d2-4d8a-9726-d216ef2b8292

Система среза:
https://github.com/user-attachments/assets/fe101da9-0d75-4189-a1be-07bdb6ed4d29

Тип PR

  • Feature
  • Fix
  • Tweak
  • Balance
  • Refactor
  • Port
  • Translate
  • Resprite

@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

RSI Diff Bot; head commit 1e3a06b merging into 2314e63
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi

State Old New Status
equipped-HAND Added
equipped-NECK Added
icon Added

Edit: diff updated after 1e3a06b

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5659f221-9cf2-4c6e-b520-8150cce18f75

📥 Commits

Reviewing files that changed from the base of the PR and between 2314e63 and 1e3a06b.

⛔ Files ignored due to path filters (3)
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-HAND.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-NECK.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/icon.png is excluded by !**/*.png
📒 Files selected for processing (21)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/_Shitmed/Recipes/Lathes/medical.yml
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json

Главное изменение

  • Добавлен сетевой ошейник ClothingAggressionInhibitor.
  • После активации ошейник наносит электрический урон и блокирует действия в боевом режиме.
  • Security активирует ошейник через ID-карту.
  • Warden, Head of Security, Captain и Central Command могут разблокировать ошейник.
  • Длительность работы задаётся через ID-карту.
  • После истечения таймера ошейник отключается.
  • Два ошейника добавлены в шкаф Warden.
  • Ошейник добавлен в рецепты, исследование и категорию SecurityEquipment.
  • Добавлена система CuttableItemSystem для снятия защищённой одежды инструментом Sawing.
  • После снятия предмет перемещается рядом с владельцем.
  • Система отправляет уведомление в настроенный радиоканал.

Prediction / networking

  • AggressionInhibitorComponent и CuttableItemComponent реализованы в Shared и синхронизируются по сети.
  • CuttableDoAfterEvent передаётся как сетевое событие.
  • Сервер обрабатывает активацию, таймер, блокировку и принудительное снятие ошейника.
  • Возможен миспредикт состояний активации, блокировки, таймера и снятия. Сервер остаётся источником истины.

Resources / localization

  • Добавлены прототип ошейника, рецепты, исследовательское открытие и наполнение шкафа.
  • Добавлена RSI metadata для ошейника.
  • Добавлены локализации на английском и русском языках для ошейника и снятия одежды.
  • Изменена стоимость CrateVendingMachineRestockClothes с 5300 на 6000.

Validation / risk

  • Тесты и runtime-проверка не указаны.
  • Автор сообщил о неизвестной ошибке тестов Amber. Также сообщалось о массовых сбоях тестов в Arcane, Corvax и upstream.
  • Риск регрессий есть в проверке доступов, таймере, переключении боевого режима, DoAfter и отправке радиосообщений.
  • Breaking prototype IDs и переезды файлов не указаны.
  • Engine-side и широких upstream-изменений нет.

Walkthrough

Добавлены механики CuttableItem и AggressionInhibitor. Реализованы do-after резки, радио-уведомления, таймер ингибитора, проверки доступа, блокировка снятия, прототип одежды, рецепты, выдача из шкафчика и локализация.

Changes

Механики Stabikor и CuttableItem

Layer / File(s) Summary
Контракты и общая логика Stabikor
Content.Shared/_Arcane/AggressionInhibitor/...
Компонент хранит состояние ингибитора, таймер, доступы и звуки. Shared-система обрабатывает боевой режим, осмотр, вербы, антидребезг и запрет снятия.
Серверная блокировка и снятие
Content.Server/_Arcane/AggressionInhibitor/...
Система проверяет ID-карту и доступы, управляет таймером, активирует ингибитор, отключает боевой режим и снимает устройство.
Механика разрезания и уведомления
Content.Shared/_Arcane/CuttableItem/..., Content.Server/_Arcane/CuttableItem/..., Resources/Locale/*/_Arcane/cuttable*
CuttableItemSystem обрабатывает завершение do-after, принудительно снимает предмет и отправляет радио-уведомление. Shared-система проверяет качество инструмента и запускает do-after.
Прототипы, рецепты и локализация
Resources/Prototypes/_Arcane/..., Resources/Prototypes/Recipes/..., Resources/Locale/*/_Arcane/aggression*, Resources/Textures/_Arcane/...
Добавлены прототип одежды, текстурные метаданные, рецепты, исследовательское открытие, выдача из шкафчика, локализация и изменение стоимости пополнения одежды.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Персонаж
  participant SharedAggressionInhibitorSystem
  participant AggressionInhibitorSystem
  participant AggressionInhibitorComponent
  Персонаж->>SharedAggressionInhibitorSystem: Выбирает действие ингибитора
  SharedAggressionInhibitorSystem->>AggressionInhibitorSystem: Передаёт событие
  AggressionInhibitorSystem->>AggressionInhibitorComponent: Проверяет доступ и состояние
  AggressionInhibitorSystem->>AggressionInhibitorComponent: Обновляет таймер и активность
Loading
sequenceDiagram
  participant Инструмент
  participant SharedCuttableItemSystem
  participant CuttableItemSystem
  participant RadioSystem
  Инструмент->>SharedCuttableItemSystem: Запускает do-after резки
  SharedCuttableItemSystem->>CuttableItemSystem: Передаёт завершение
  CuttableItemSystem->>RadioSystem: Отправляет локализованное сообщение
Loading

Possibly related PRs

  • ArcaneSS14/arcane#4 — содержит связанные изменения локализации для CuttableItem и AggressionInhibitor.

Suggested reviewers: puroslavking

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Заголовок точно описывает основное изменение: добавление ошейника, подавляющего агрессию.
Description check ✅ Passed Описание связано с изменениями и охватывает ингибитор агрессии, доступы, рецепты и систему срезания одежды.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs`:
- Around line 213-256: Переименуйте метод IsLocked(EntityUid, StabikorComponent,
EntityUid) в ToggleLock, включая все места его вызова, поскольку метод выполняет
переключение состояния замка, а не проверку. Не изменяйте логику блокировки,
разблокировки или проверки доступа.
- Line 1: Update the server-side StabikorSystem.Update method to mark the
component dirty immediately after decrementing comp.Timer, using Dirty or
appropriately throttled DirtyField so timer changes replicate to clients. Remove
the unconditional Dirty call from SharedStabikorSystem.OnExamine, leaving the
existing examine behavior otherwise unchanged.
- Around line 175-181: Update OpenDialog to validate the held ID card’s access
against comp.LockAccess before allowing timer configuration. Reuse the same
access-checking logic or helper used by the IsLocked handling around the
corresponding LockAccess/UnlockAccess checks, while preserving the existing
item, ID-card, and AccessComponent validation.
- Around line 44-58: В методе Update, в цикле обработки StabikorComponent,
пометь изменённое сетевое поле Timer через DirtyField(uid, comp, ...) или
Dirty(uid, comp) после декремента; ограничь отправку обновлений разумным
троттлингом, например раз в секунду, сохранив корректный серверный отсчёт и
немедленную обработку истечения Timer.
- Around line 40-58: В методе Update замените return после неудачного
RemoveStabikor(uid, comp) на continue, чтобы ошибка обработки одного Stabikor не
прерывала перебор EntityQueryEnumerator и остальные сущности продолжали
обрабатываться в текущем тике.
- Around line 126-161: В обработчике взаимодействия Stabikor добавьте установку
args.Handled = true в обе ветки отказа доступа: else внутри проверки
comp.IsLocked и соответствующую else-ветку для режима блокировки. Сохраните
существующие PopupEntity и воспроизведение DenySound.
- Around line 285-310: Update RemoveStabikor so comp.Timer, comp.IsLocked,
comp.IsActive, and comp.WearingEntity remain unchanged until
TryGetContainingSlot and TryUnequip both succeed. Perform the unequip validation
first, then clear the component state and call Dirty only after successful
removal; preserve the existing false returns and success effects.
- Around line 164-222: Replace the EntityUid.Invalid fallback with nullable
EntityUid handling in both OpenDialog and IsLocked. Derive the containing parent
as EntityUid?, treat presence with a null check, and preserve the existing
targetEntity selection and range-check behavior.
- Around line 60-101: Update the ToggleCombatActionEvent subscription associated
with OnToggleCombatAction to use an explicit processing order, or validate the
current combat state through IsInCombatMode(user) before applying the Stabikor
shock. Ensure the shock logic does not depend on another subscriber having
already changed the combat mode via SetInCombatMode.

In `@Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs`:
- Around line 18-40: Update the CuttableItemComponent fields ToolQualities,
RadioChannel, and AlertMessage to use List<ProtoId<ToolQualityPrototype>>,
ProtoId<RadioChannelPrototype>, and LocId respectively, preserving their
existing defaults and data/network field behavior.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 48-63: Update OnInteractUsing so the DoAfterArgs setup,
_doAfter.TryStartDoAfter call, and cuttable-item-attempt-broken-popup feedback
execute in the shared/predicted path before the client early return. Keep
args.Handled set for both sides, while retaining item removal and radio
notification exclusively in the server-confirmation path.
- Line 60: Вызовите Loc.GetString для cuttable-item-attempt-broken-popup в
SharedCuttableItemSystem без повторной локализации имени пользователя: передайте
результат Name(args.User) напрямую как значение параметра user, удалив вложенный
Loc.GetString.

In `@Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs`:
- Around line 49-53: Rename the StabikorComponent field TimeStan to TimeStun and
update all references to use the corrected symbol consistently.
- Around line 102-111: Rename the Verp field and its constructor parameter in
OpenDialogEvent and ToggleLockEvent to the established target-entity convention,
such as Target or Entity, and update all references to these event fields
accordingly.

In `@Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs`:
- Around line 55-82: Remove the unconditional Dirty call from OnExamine, since
this handler only formats examination text and does not mutate
StabikorComponent. Preserve the existing status, duration, and remaining-timer
display logic; timer synchronization should be handled by the server update path
rather than examination.
- Around line 34-43: Replace the manual _netManager.IsClient gate in
OnBeingUnequippedAttempt with the appropriate predicted popup API, such as
PopupPredicted or PopupClient, while preserving the existing localization key,
target entities, popup type, and args.Cancel behavior.
- Around line 86-93: Исправьте логику в методе, содержащем
TryGetContainingContainer: не выходите немедленно при отсутствии контейнера, а
корректно вычисляйте isInContainer и применяйте проверку
args.CanAccess/args.CanInteract для сущностей, находящихся в контейнере.
Сохраните ранний выход только для случаев, когда доступ или взаимодействие
запрещены, чтобы верб-меню не обходило стандартные проверки.
- Around line 122-140: Replace RaiseNetworkEvent with RaiseLocalEvent in
FlipOpenDialog and FlipToggleLock when invoking ActivationVerb actions. Preserve
the existing cooldown updates and event payloads, ensuring OpenDialogEvent and
ToggleLockEvent reach the local StabikorSystem handlers on both client and
server without network re-dispatch.

In `@Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl`:
- Around line 46-53: Добавьте в локаль-ресурс ключ
stabikor-duration-set-cancel-fallback с русским сообщением для случая пустого
ввода, поддерживающим параметр {$time}; согласуйте формулировку с существующим
stabikor-duration-set-success и вызовом из StabikorSystem.cs.

In `@Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl`:
- Around line 1-5: Добавьте эквивалентные en-US FTL-ключи для
cuttable-item-broken-moment-popup, cuttable-item-attempt-broken-popup,
cuttable-item-examine-header и cuttable-item-alert-activated, сохранив те же
параметры $item и $user и переведя сообщения на английский. Разместите их в
соответствующем en-US файле локализации cuttableItem.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 150f2035-be1c-453d-ab4c-19d0683c516b

📥 Commits

Reviewing files that changed from the base of the PR and between 42bc8aa and 96aff60.

⛔ Files ignored due to path filters (3)
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-HAND.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-NECK.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/icon.png is excluded by !**/*.png
📒 Files selected for processing (16)
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
  • Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: Test Packaging
⚠️ CI failures not shown inline (2)

GitHub Actions: CRLF Check / 0_CRLF Check.txt: [Add] bracelet stabikor

Conclusion: failure

View job details

##[group]Run Tools/check_crlf.py
 �[36;1mTools/check_crlf.py�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 Traceback (most recent call last):
   File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 40, in <module>
     exit(main())
          ^^^^^^
   File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 13, in main
     if is_file_crlf(file_name):
        ^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 33, in is_file_crlf
     with open(path, "rb") as f:
          ^^^^^^^^^^^^^^^^
 FileNotFoundError: [Errno 2] No such file or directory: '"Resources/Locale/ru-RU/_Arcane/\\321\\201uttableItem/cuttable-Item-component.ftl"'
 ##[error]Process completed with exit code 1.

GitHub Actions: CRLF Check / CRLF Check: [Add] bracelet stabikor

Conclusion: failure

View job details

##[group]Run Tools/check_crlf.py
 �[36;1mTools/check_crlf.py�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 Traceback (most recent call last):
   File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 40, in <module>
     exit(main())
          ^^^^^^
   File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 13, in main
     if is_file_crlf(file_name):
        ^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 33, in is_file_crlf
     with open(path, "rb") as f:
          ^^^^^^^^^^^^^^^^
 FileNotFoundError: [Errno 2] No such file or directory: '"Resources/Locale/ru-RU/_Arcane/\\321\\201uttableItem/cuttable-Item-component.ftl"'
 ##[error]Process completed with exit code 1.
🧰 Additional context used
📓 Path-based instructions (18)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
Resources/**/*.ftl

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl
  • Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl
  • Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl
  • Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl
  • Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
Resources/**/*.json

📄 CodeRabbit inference engine (AGENTS.md)

Keep RSI meta.json ordered as version, license, copyright, size, states with 4-space indentation.

Files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json

⚙️ CodeRabbit configuration file

Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.

Files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
**/*.cs

📄 CodeRabbit inference engine (GEMINI.md)

**/*.cs: Keep components data-only and behavior in systems
Use On... -> Try... -> Can... -> Do... pattern for gameplay actions
Prefer Entity<T?>, ProtoId<T>, EntProtoId, and localized strings for type usage

**/*.cs: When writing or editing C# gameplay code, load skills: ss14-ecs-components, ss14-ecs-entities, ss14-ecs-prototypes, ss14-ecs-systems, ss14-events, and ss14-prediction.
If the C# change is large or the task needs reviewable notes, load skill ss14-documentation-writing.
If the code touches hot paths, Update(), or frequently raised events, load skill ss14-standard-optimizations.
If the task adds or changes player-facing text, load skills ss14-localization-strings and ss14-localization-code when the change also touches Loc.GetString(...), LocId, popup text, or localized component fields.
If the task touches network events, NetEntity, replicated state routing, or shared/server/client message flow, load skill ss14-netcode.
If the task touches Appearance, GenericVisualizer, visual state enums, or sprite-layer toggles, load skill ss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skill ss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skills ss14-prototype-basics, ss14-ecs-basics, and ss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skills ss14-debugging-workflow and ss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skills ss14-common-api-patterns and ss14-audio when the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)

+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

Put main server-only authority and non-predicted server simulation in Content.Server/; use Content.Goobstation.Server/ for features already rooted in that module.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
**/*System.cs

📄 CodeRabbit inference engine (AGENTS.md)

Public entity-system APIs that operate on entities should usually take Entity<T?> or EntityUid first and call Resolve(...) early.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
Content.Server/**/*.cs

⚙️ CodeRabbit configuration file

Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:

  • Server owns authority, persistence, round logic, and non-predicted side effects.
  • If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
  • Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
  • When player-visible behavior changes, check whether matching prototype and locale updates are missing.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
Content.Shared/**

📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)

Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)

{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic in Content.Shared/; use Content.Goobstation.Shared/ only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong in Content.Shared/. Shared predicted components should use NetworkedComponent, AutoGenerateComponentState, and AutoNetworkedField where appropriate.

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
Content.Shared/**/*.cs

⚙️ CodeRabbit configuration file

Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:

  • Shared owns replicated state, shared events, prediction, and data both client and server must understand.
  • Flag client-only or server-only dependencies in Shared.
  • For local-player actions, verify prediction support instead of accepting delayed server-only UX.
  • When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
  • Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
  • Flag EntityUid.Invalid used as a "missing" sentinel.

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
🧠 Learnings (13)
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
  • Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-26T02:48:44.443Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 136
File: Resources/Textures/Clothing/Back/Duffels/captain.rsi/meta.json:4-4
Timestamp: 2026-07-26T02:48:44.443Z
Learning: In `Resources/Textures/**/**/*.rsi/meta.json`, if the PR replaces sprite assets with sources that do not include the previous credit holders (e.g., the new sprites come from another upstream/source), do not keep attribution/author fields for contributors who made no contribution to the current assets. Update the attribution to reflect the actual authors/sources of the sprites currently referenced by the .rsi.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
  • Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
🔇 Additional comments (8)
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs (1)

1-7: LGTM!

Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (1)

9-32: LGTM!

Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml (1)

1-28: 📐 Maintainability & Code Quality

Подтвердите проверку YAML линтером.

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml#L1-L28: проверьте новый прототип.
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml#L82-L82: проверьте изменённый research unlock.

As per coding guidelines, run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt after YAML resource edits.

Source: Coding guidelines

Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json (1)

1-23: LGTM!

Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl (1)

1-2: LGTM!

Resources/Prototypes/Catalog/Fills/Lockers/security.yml (1)

46-49: LGTM!

Resources/Prototypes/Recipes/Lathes/Packs/security.yml (1)

86-86: LGTM!

Resources/Prototypes/Recipes/Lathes/security.yml (1)

65-77: LGTM!

Comment thread Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs Outdated
Comment thread Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs Outdated
Comment thread Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs Outdated
Comment thread Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs Outdated
Comment thread Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs Outdated
Comment thread Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs Outdated
Comment on lines +1 to +5
cuttable-item-broken-moment-popup = { $item } снялся!
cuttable-item-attempt-broken-popup = { $user } пытается снять { $item }!
cuttable-item-examine-header = Кажется, можно освободиться, используя инструмент с качеством:

cuttable-item-alert-activated = Зафиксировано несанкционированное снятие { $item }. Нарушитель: { $user }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Добавьте en-US варианты этих ключей.

Эти сообщения вызываются из shared/server кода, но определены только для ru-RU. Добавьте эквивалентный en-US FTL-файл, иначе на английской локали будут отсутствующие ключи вместо popup и радио-сообщений.

As per coding guidelines, every player-facing string must be localized.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl`
around lines 1 - 5, Добавьте эквивалентные en-US FTL-ключи для
cuttable-item-broken-moment-popup, cuttable-item-attempt-broken-popup,
cuttable-item-examine-header и cuttable-item-alert-activated, сохранив те же
параметры $item и $user и переведя сообщения на английский. Разместите их в
соответствующем en-US файле локализации cuttableItem.

Sources: Coding guidelines, Path instructions

@Cat-Lixs
Cat-Lixs force-pushed the collar-joy branch 2 times, most recently from 3a6e18c to e1dcad4 Compare July 27, 2026 21:11
@Cat-Lixs

Copy link
Copy Markdown
Contributor Author

@coderabbitai Сделай повторное ревью

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

@Cat-Lixs Запускаю повторное полное ревью PR #146 с проверкой текущего diff и ранее отмеченных рисков.

✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 24 minutes.

@Cat-Lixs Cat-Lixs changed the title [Add] bracelet stabikor [Add] bracelet aggression inhibitor Jul 29, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)

53-64: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Проверяйте результат TryStartDoAfter.

SharedDoAfterSystem.TryStartDoAfter(...) возвращает false при сбое запуска do-after. Сейчас args.Handled и popup выставляются до возврата, поэтому отклонённая попытка всё равно выглядит как обработанная и выводит неверное сообщение. Устанавливайте обработанное взаимодействие и выводите UI только после успешной регистрации do-after.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`
around lines 53 - 64, Update the interaction flow around
SharedDoAfterSystem.TryStartDoAfter so it checks the returned success value
before marking args.Handled or invoking _popup.PopupEntity. Only set the
interaction as handled and show the cuttable-item-attempt-broken-popup after the
do-after starts successfully; leave failed attempts unhandled and without UI
feedback.
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (2)

40-59: 🚀 Performance & Scalability | 🔵 Trivial | 🏗️ Heavy lift

Dirty(uid, comp) каждый тик вместо DirtyField.

Update() — хот-путь, тикающий по всем активным ингибиторам каждый кадр. Меняется только Timer, но Dirty(uid, comp) форсит пересылку всего состояния компонента всем наблюдателям в PVS на каждый тик каждого активного устройства. При нескольких активных Stabikor — накопительная сетевая нагрузка без пользы (клиент и так может досчитать таймер локально).

Замените на DirtyField(uid, comp, nameof(comp.Timer)), либо синхронизируйте через EndTime (абсолютное время) и dirty только на активации/снятии.

As per coding guidelines: "Dirty networked state every time authoritative data changes. Use DirtyField(...) when field deltas make sense."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 40 - 59, В методе Update замените вызов Dirty(uid, comp) после
изменения Timer на DirtyField(uid, comp, nameof(comp.Timer)), сохранив текущую
логику активации, истечения таймера и снятия ингибитора.

Source: Coding guidelines


61-102: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Глобальный обход всех ингибиторов на каждый ToggleCombatActionEvent.

Хендлер вызывается для ЛЮБОГО игрока, переключающего боевой режим, а не только для носящих ингибитор. Внутри — полный EntityQueryEnumerator<AggressionInhibitorComponent>() по всем существующим в мире устройствам с проверкой слота на каждой итерации. Масштабируется линейно от количества ингибиторов в раунде, при этом 99% вызовов этого события — от игроков без устройства вовсе.

Проще и дешевле искать напрямую в инвентаре user (например, через слоты _inventorySystem) либо фильтровать query по уже сохранённому comp.WearingEntity == user, вместо реверс-поиска владельца по всем ингибиторам.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 61 - 102, Замените глобальный
EntityQueryEnumerator<AggressionInhibitorComponent> в OnToggleCombatAction
прямым поиском предметов в инвентарных слотах user либо используйте связь
владельца AggressionInhibitorComponent.WearingEntity, чтобы сразу найти
ингибитор пользователя. Сохраните последующие проверки активного состояния и
обработки боевого режима, исключив полный обход всех ингибиторов мира на каждый
вызов события.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Line 171: Update the public OpenDialog and ToggleLock methods to accept a
single Entity<AggressionInhibitorComponent> parameter instead of separate
EntityUid and AggressionInhibitorComponent parameters. Adjust
OnOpenDialogReceived and OnToggleLockReceived call sites and method internals to
access the entity and component through the new wrapper while preserving
existing behavior.
- Around line 252-254: Обновите ветку отказа после вызова RemoveInhibitor в
системе AggressionInhibitorSystem: при неудачном снятии воспроизводите DenySound
и показывайте пользователю попап, аналогично обработке отказа в OnInteractUsing.
Сохраните немедленный возврат после предоставления обратной связи.
- Around line 319-341: В методе RemoveInhibitor передавайте отображаемое имя
пользователя напрямую в параметр "user", не оборачивая результат Name(user) в
Loc.GetString. Сохраните существующий ключ stabikor-moment-shutdown и остальные
параметры PopupEntity без изменений.

---

Outside diff comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 40-59: В методе Update замените вызов Dirty(uid, comp) после
изменения Timer на DirtyField(uid, comp, nameof(comp.Timer)), сохранив текущую
логику активации, истечения таймера и снятия ингибитора.
- Around line 61-102: Замените глобальный
EntityQueryEnumerator<AggressionInhibitorComponent> в OnToggleCombatAction
прямым поиском предметов в инвентарных слотах user либо используйте связь
владельца AggressionInhibitorComponent.WearingEntity, чтобы сразу найти
ингибитор пользователя. Сохраните последующие проверки активного состояния и
обработки боевого режима, исключив полный обход всех ингибиторов мира на каждый
вызов события.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 53-64: Update the interaction flow around
SharedDoAfterSystem.TryStartDoAfter so it checks the returned success value
before marking args.Handled or invoking _popup.PopupEntity. Only set the
interaction as handled and show the cuttable-item-attempt-broken-popup after the
do-after starts successfully; leave failed attempts unhandled and without UI
feedback.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e5bd9206-a510-4f48-b5a9-6bed93823bbb

📥 Commits

Reviewing files that changed from the base of the PR and between 96aff60 and e1c9bae.

📒 Files selected for processing (12)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: YAML Linter
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
🧰 Additional context used
📓 Path-based instructions (18)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.ftl

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.json

📄 CodeRabbit inference engine (AGENTS.md)

Keep RSI meta.json ordered as version, license, copyright, size, states with 4-space indentation.

Files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json

⚙️ CodeRabbit configuration file

Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.

Files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
**/*.cs

📄 CodeRabbit inference engine (GEMINI.md)

**/*.cs: Keep components data-only and behavior in systems
Use On... -> Try... -> Can... -> Do... pattern for gameplay actions
Prefer Entity<T?>, ProtoId<T>, EntProtoId, and localized strings for type usage

**/*.cs: When writing or editing C# gameplay code, load skills: ss14-ecs-components, ss14-ecs-entities, ss14-ecs-prototypes, ss14-ecs-systems, ss14-events, and ss14-prediction.
If the C# change is large or the task needs reviewable notes, load skill ss14-documentation-writing.
If the code touches hot paths, Update(), or frequently raised events, load skill ss14-standard-optimizations.
If the task adds or changes player-facing text, load skills ss14-localization-strings and ss14-localization-code when the change also touches Loc.GetString(...), LocId, popup text, or localized component fields.
If the task touches network events, NetEntity, replicated state routing, or shared/server/client message flow, load skill ss14-netcode.
If the task touches Appearance, GenericVisualizer, visual state enums, or sprite-layer toggles, load skill ss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skill ss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skills ss14-prototype-basics, ss14-ecs-basics, and ss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skills ss14-debugging-workflow and ss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skills ss14-common-api-patterns and ss14-audio when the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**

📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)

Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)

+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)

{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic in Content.Shared/; use Content.Goobstation.Shared/ only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong in Content.Shared/. Shared predicted components should use NetworkedComponent, AutoGenerateComponentState, and AutoNetworkedField where appropriate.

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
Content.Shared/**/*.cs

⚙️ CodeRabbit configuration file

Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:

  • Shared owns replicated state, shared events, prediction, and data both client and server must understand.
  • Flag client-only or server-only dependencies in Shared.
  • For local-player actions, verify prediction support instead of accepting delayed server-only UX.
  • When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
  • Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
  • Flag EntityUid.Invalid used as a "missing" sentinel.

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
**/*System.cs

📄 CodeRabbit inference engine (AGENTS.md)

Public entity-system APIs that operate on entities should usually take Entity<T?> or EntityUid first and call Resolve(...) early.

Files:

  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

Put main server-only authority and non-predicted server simulation in Content.Server/; use Content.Goobstation.Server/ for features already rooted in that module.

Files:

  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs

⚙️ CodeRabbit configuration file

Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:

  • Server owns authority, persistence, round logic, and non-predicted side effects.
  • If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
  • Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
  • When player-visible behavior changes, check whether matching prototype and locale updates are missing.

Files:

  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (15)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-28T15:44:38.498Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 152
File: Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml:69-72
Timestamp: 2026-07-28T15:44:38.498Z
Learning: В ArcaneSS14/arcane не выполняйте форматирующие перестановки полей (в т.ч. изменение порядка полей) в upstream-файлах: делайте это только если правка добавляет Arcane-специфичную сущность или напрямую требуется для функциональности. Иначе сохраняйте upstream-порядок полей, даже если он противоречит локальным рекомендациям, чтобы не создавать лишние diff и конфликты при upstream-синхронизации. Исключение: допустимо переупорядочивание/форматирование в `Resources/Prototypes/_Arcane` (и только там).

Applied to files:

  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-26T02:48:44.443Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 136
File: Resources/Textures/Clothing/Back/Duffels/captain.rsi/meta.json:4-4
Timestamp: 2026-07-26T02:48:44.443Z
Learning: In `Resources/Textures/**/**/*.rsi/meta.json`, if the PR replaces sprite assets with sources that do not include the previous credit holders (e.g., the new sprites come from another upstream/source), do not keep attribution/author fields for contributors who made no contribution to the current assets. Update the attribution to reflect the actual authors/sources of the sprites currently referenced by the .rsi.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.

Applied to files:

  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🔇 Additional comments (12)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)

37-38: Prediction для старта разрезания по-прежнему отсутствует.

_netManager.IsClient проверяется до args.Handled, TryStartDoAfter и стартового popup. Клиент не запускает и не показывает действие немедленно. Перенесите предсказуемые части в shared-путь, оставив снятие предмета и radio-уведомление серверу.

Согласно инструкциям для Content.Shared, локальные действия должны поддерживать prediction.

Source: Path instructions

Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs (1)

3-4: LGTM!

Also applies to: 17-38

Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl (1)

1-5: LGTM!

Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl (1)

1-5: LGTM!

Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs (1)

1-108: LGTM!

Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (1)

1-137: LGTM!

Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)

104-169: LGTM!

Also applies to: 278-315, 343-352

Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml (1)

1-35: LGTM!

Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json (1)

4-4: LGTM!

Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl (1)

1-2: LGTM!

Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl (1)

1-55: LGTM!

Resources/Prototypes/Catalog/Cargo/cargo_vending.yml (1)

36-36: 🎯 Functional Correctness

Не очевидна связь изменения cost с фичей Stabikor.

CrateVendingMachineRestockClothes цена поднята 5300→6000 с маркером # Arcane-Edit, но PR — про Security-браслет; ассортимент "Clothes"-вендинга к нему не относится (Warden locker описан в отдельном, не входящем в этот батч файле). Стоит подтвердить, что новая цена всё ещё превышает сумму стоимости содержимого (см. комментарий в шапке файла про тест NoCargoOrderArbitrage) и что изменение действительно относится к этому PR, а не случайно затянуто из другой ветки.

}
}

public void OpenDialog(EntityUid uid, AggressionInhibitorComponent comp, EntityUid user)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

OpenDialog/ToggleLock: используйте Entity<AggressionInhibitorComponent> вместо раздельных uid+comp.

Оба публичных метода вызываются из OnOpenDialogReceived/OnToggleLockReceived, где пара uid+comp уже приходит вместе — по гайдлайну стоит свернуть в Entity<AggressionInhibitorComponent>.

As per coding guidelines: "Prefer Entity<T?> over parallel (EntityUid uid, T component) parameters when the call site already has the pair."

Also applies to: 231-231

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
at line 171, Update the public OpenDialog and ToggleLock methods to accept a
single Entity<AggressionInhibitorComponent> parameter instead of separate
EntityUid and AggressionInhibitorComponent parameters. Adjust
OnOpenDialogReceived and OnToggleLockReceived call sites and method internals to
access the entity and component through the new wrapper while preserving
existing behavior.

Source: Coding guidelines

Comment on lines +252 to +254
if (!RemoveInhibitor(uid, comp))
return;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Молчаливый отказ при неудачном RemoveInhibitor.

Если доступ есть, но сам RemoveInhibitor не сработал (например, TryUnequip не удался), пользователь не получает никакого фидбека — ни попапа, ни звука. Тот же паттерн в OnInteractUsing (line 135), где Handled всё равно ставится в true при провале снятия. Стоит проиграть DenySound/попап и в этой ветке отказа, а не только в ветке недостатка прав.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 252 - 254, Обновите ветку отказа после вызова RemoveInhibitor в
системе AggressionInhibitorSystem: при неудачном снятии воспроизводите DenySound
и показывайте пользователю попап, аналогично обработке отказа в OnInteractUsing.
Сохраните немедленный возврат после предоставления обратной связи.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (2)

208-212: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Синхронизируйте сброс длительности.

Пустой ввод меняет comp.Duration, но выходит без Dirty(uid, comp). Клиенты сохранят прежнее сетевое значение до следующего unrelated обновления.

Предлагаемое исправление
             if (string.IsNullOrEmpty(input))
             {
                 comp.Duration = 60f;
+                Dirty(uid, comp);
                 _popup.PopupEntity(Loc.GetString("stabikor-duration-set-cancel-fallback", ("time", 1)), uid, user);
                 return;
             }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 208 - 212, В ветке пустого ввода метода, обрабатывающего изменение
длительности AggressionInhibitor, после присваивания значения comp.Duration
вызовите Dirty(uid, comp) до PopupEntity и return, чтобы сброс длительности был
синхронизирован с клиентами.

Source: Coding guidelines


203-227: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Повторно проверяйте доступ в callback диалога.

После открытия диалога игрок может уйти, передать ID-карту или потерять доступ, но callback проверяет только блокировку и существование сущности. Перед изменением Duration заново проверьте расстояние, активную карту и LockAccess.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 203 - 227, В callback, перед изменением Duration в обработчике
_quickDialog.OpenDialog, повторно проверьте доступ пользователя: допустимое
расстояние до uid, наличие активной ID-карты и LockAccess. При потере любого
условия немедленно завершайте callback, сохраняя текущие проверки comp.IsLocked
и EntityManager.EntityExists.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 294-300: После успешной активации ингибитора в обработчике, где
обновляются comp.Timer, comp.IsLocked и comp.WearingEntity, принудительно
отключите уже активный combat mode у wearerUid. Выполните сброс сразу после
подтверждения предмета через TryGetSlotEntity и сохраните существующую логику
Dirty(uid, comp).
- Line 35: Перенесите предиктивную проверку активного ингибитора из серверного
обработчика в shared-систему, чтобы клиент блокировал включение combat mode до
отправки события. Сохраните серверный обработчик как авторитетную проверку с
электрошоком, а подписку и логику `OnToggleCombatAction` разделите так, чтобы
предиктивная блокировка работала на обеих сторонах.
- Around line 135-136: Remove the redundant UnlockSound playback from the
inhibitor activation flow: update the condition around RemoveInhibitor in
ActivateInhibitor, including the corresponding occurrence noted at the second
location, so it no longer calls _audio.PlayPvs after RemoveInhibitor. Preserve
RemoveInhibitor’s existing sound handling and the LockSound playback in
ActivateInhibitor.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 37-38: Remove the _netManager.IsClient condition from the early
return in the relevant cuttable-item handler, leaving only args.Handled as the
guard. Keep do-after initiation and popup feedback on the shared predicted path
using the predicted feedback API, while restricting item removal and radio
notifications to the server-only branch.

In
`@Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl`:
- Line 2: Исправьте орфографическую ошибку в свойстве .desc: замените
«виднеится» на «виднеется», сохранив остальной текст описания без изменений.

---

Outside diff comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 208-212: В ветке пустого ввода метода, обрабатывающего изменение
длительности AggressionInhibitor, после присваивания значения comp.Duration
вызовите Dirty(uid, comp) до PopupEntity и return, чтобы сброс длительности был
синхронизирован с клиентами.
- Around line 203-227: В callback, перед изменением Duration в обработчике
_quickDialog.OpenDialog, повторно проверьте доступ пользователя: допустимое
расстояние до uid, наличие активной ID-карты и LockAccess. При потере любого
условия немедленно завершайте callback, сохраняя текущие проверки comp.IsLocked
и EntityManager.EntityExists.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: bf354a60-a4c4-4404-9028-10e5cda21759

📥 Commits

Reviewing files that changed from the base of the PR and between e1c9bae and 3a34395.

📒 Files selected for processing (16)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: YAML Linter
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
🧰 Additional context used
📓 Path-based instructions (18)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.ftl

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.json

📄 CodeRabbit inference engine (AGENTS.md)

Keep RSI meta.json ordered as version, license, copyright, size, states with 4-space indentation.

Files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json

⚙️ CodeRabbit configuration file

Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.

Files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
**/*.cs

📄 CodeRabbit inference engine (GEMINI.md)

**/*.cs: Keep components data-only and behavior in systems
Use On... -> Try... -> Can... -> Do... pattern for gameplay actions
Prefer Entity<T?>, ProtoId<T>, EntProtoId, and localized strings for type usage

**/*.cs: When writing or editing C# gameplay code, load skills: ss14-ecs-components, ss14-ecs-entities, ss14-ecs-prototypes, ss14-ecs-systems, ss14-events, and ss14-prediction.
If the C# change is large or the task needs reviewable notes, load skill ss14-documentation-writing.
If the code touches hot paths, Update(), or frequently raised events, load skill ss14-standard-optimizations.
If the task adds or changes player-facing text, load skills ss14-localization-strings and ss14-localization-code when the change also touches Loc.GetString(...), LocId, popup text, or localized component fields.
If the task touches network events, NetEntity, replicated state routing, or shared/server/client message flow, load skill ss14-netcode.
If the task touches Appearance, GenericVisualizer, visual state enums, or sprite-layer toggles, load skill ss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skill ss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skills ss14-prototype-basics, ss14-ecs-basics, and ss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skills ss14-debugging-workflow and ss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skills ss14-common-api-patterns and ss14-audio when the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**

📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)

Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)

+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)

{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic in Content.Shared/; use Content.Goobstation.Shared/ only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong in Content.Shared/. Shared predicted components should use NetworkedComponent, AutoGenerateComponentState, and AutoNetworkedField where appropriate.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*System.cs

📄 CodeRabbit inference engine (AGENTS.md)

Public entity-system APIs that operate on entities should usually take Entity<T?> or EntityUid first and call Resolve(...) early.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**/*.cs

⚙️ CodeRabbit configuration file

Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:

  • Shared owns replicated state, shared events, prediction, and data both client and server must understand.
  • Flag client-only or server-only dependencies in Shared.
  • For local-player actions, verify prediction support instead of accepting delayed server-only UX.
  • When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
  • Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
  • Flag EntityUid.Invalid used as a "missing" sentinel.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

Put main server-only authority and non-predicted server simulation in Content.Server/; use Content.Goobstation.Server/ for features already rooted in that module.

Files:

  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs

⚙️ CodeRabbit configuration file

Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:

  • Server owns authority, persistence, round logic, and non-predicted side effects.
  • If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
  • Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
  • When player-visible behavior changes, check whether matching prototype and locale updates are missing.

Files:

  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (16)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-29T08:12:37.068Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 153
File: Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml:137-137
Timestamp: 2026-07-29T08:12:37.068Z
Learning: In ArcaneSS14 prototype YAMLs, the YAML field that disables synchronization for `Content.Shared.Power.Components.BatteryComponent` is spelled exactly `netsync` (all lowercase), not `netSync`. For prototypes derived from `PowerNetworkBattery` (including `BaseAPC`, `CoreSubstation`, `BaseSMES`, `TeslaCoil`), set `netsync: false`; otherwise `Content.Server.Power.EntitySystems.BatterySystem.OnStartup` can throw `DebugAssertException` for a predicted battery connected to a power net. For `Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml`, ensure `EnergyDomeWiredTest` uses `netsync: false`.

Applied to files:

  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-28T15:44:38.498Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 152
File: Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml:69-72
Timestamp: 2026-07-28T15:44:38.498Z
Learning: В ArcaneSS14/arcane не выполняйте форматирующие перестановки полей (в т.ч. изменение порядка полей) в upstream-файлах: делайте это только если правка добавляет Arcane-специфичную сущность или напрямую требуется для функциональности. Иначе сохраняйте upstream-порядок полей, даже если он противоречит локальным рекомендациям, чтобы не создавать лишние diff и конфликты при upstream-синхронизации. Исключение: допустимо переупорядочивание/форматирование в `Resources/Prototypes/_Arcane` (и только там).

Applied to files:

  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-26T02:48:44.443Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 136
File: Resources/Textures/Clothing/Back/Duffels/captain.rsi/meta.json:4-4
Timestamp: 2026-07-26T02:48:44.443Z
Learning: In `Resources/Textures/**/**/*.rsi/meta.json`, if the PR replaces sprite assets with sources that do not include the previous credit holders (e.g., the new sprites come from another upstream/source), do not keep attribution/author fields for contributors who made no contribution to the current assets. Update the attribution to reflect the actual authors/sources of the sprites currently referenced by the .rsi.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
🔇 Additional comments (4)
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs (1)

3-38: LGTM!

Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)

40-48: LGTM!

Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl (1)

1-5: LGTM!

Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl (1)

1-5: LGTM!

{
base.Initialize();

SubscribeLocalEvent<ToggleCombatActionEvent>(OnToggleCombatAction, before: [typeof(SharedCombatModeSystem)]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Добавьте предиктивную блокировку combat mode.

Обработчик существует только в Content.Server, поэтому клиент успевает локально включить combat mode и получает откат лишь после ответа сервера. Перенесите предиктивную проверку активного ингибитора в shared-систему; серверу оставьте авторитетный электрошок.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
at line 35, Перенесите предиктивную проверку активного ингибитора из серверного
обработчика в shared-систему, чтобы клиент блокировал включение combat mode до
отправки события. Сохраните серверный обработчик как авторитетную проверку с
электрошоком, а подписку и логику `OnToggleCombatAction` разделите так, чтобы
предиктивная блокировка работала на обеих сторонах.

Sources: Coding guidelines, Path instructions

Comment thread Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs Outdated
Comment on lines +294 to +300
if (_inventorySystem.TryGetSlotEntity(wearerUid, slotDef.Name, out var slotItem) && slotItem == uid)
{
comp.Timer = comp.Duration;
comp.IsLocked = true;
comp.IsActive = true;
comp.WearingEntity = wearerUid;
Dirty(uid, comp);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Сбрасывайте уже включенный combat mode при активации.

Ингибитор перехватывает только будущие попытки включения. Заключённый, у которого combat mode уже включён в момент блокировки, может продолжать атаковать. После успешной активации принудительно выключайте режим у wearerUid.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 294 - 300, После успешной активации ингибитора в обработчике, где
обновляются comp.Timer, comp.IsLocked и comp.WearingEntity, принудительно
отключите уже активный combat mode у wearerUid. Выполните сброс сразу после
подтверждения предмета через TryGetSlotEntity и сохраните существующую логику
Dirty(uid, comp).

Comment thread Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)

299-305: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Сбрасывайте combat mode у носителя ингибитора.

В этом потоке user — сотрудник с ID-картой, а wearerUid — владелец надетого устройства. Сейчас combat mode отключается у сотрудника, поэтому заключённый может остаться в боевом режиме.

Предлагаемый фикс
-                _combatMode.SetInCombatMode(user, false);
+                _combatMode.SetInCombatMode(wearerUid, false);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 299 - 305, В обработчике успешной активации ингибитора замените
аргумент user в вызове _combatMode.SetInCombatMode на wearerUid, чтобы combat
mode отключался у владельца устройства, а не у сотрудника с ID-картой. Остальную
последовательность обработки, включая Dirty, звук и уведомление, не изменяйте.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Line 227: В обработчике изменения длительности перенесите вызов Dirty(uid,
comp) из ветки корректного ввода в общий путь после присвоения fallback-значения
60f, чтобы он выполнялся и при пустом вводе. Проверьте связанное сетевое поле
Duration и сохраните синхронизацию компонента через существующий механизм Dirty.

---

Duplicate comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 299-305: В обработчике успешной активации ингибитора замените
аргумент user в вызове _combatMode.SetInCombatMode на wearerUid, чтобы combat
mode отключался у владельца устройства, а не у сотрудника с ID-картой. Остальную
последовательность обработки, включая Dirty, звук и уведомление, не изменяйте.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f2c46284-465b-4eef-a430-6cb360cb6939

📥 Commits

Reviewing files that changed from the base of the PR and between 3a34395 and d1b4511.

📒 Files selected for processing (7)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
💤 Files with no reviewable changes (1)
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: YAML Linter
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
🧰 Additional context used
📓 Path-based instructions (17)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.ftl

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.cs

📄 CodeRabbit inference engine (GEMINI.md)

**/*.cs: Keep components data-only and behavior in systems
Use On... -> Try... -> Can... -> Do... pattern for gameplay actions
Prefer Entity<T?>, ProtoId<T>, EntProtoId, and localized strings for type usage

**/*.cs: When writing or editing C# gameplay code, load skills: ss14-ecs-components, ss14-ecs-entities, ss14-ecs-prototypes, ss14-ecs-systems, ss14-events, and ss14-prediction.
If the C# change is large or the task needs reviewable notes, load skill ss14-documentation-writing.
If the code touches hot paths, Update(), or frequently raised events, load skill ss14-standard-optimizations.
If the task adds or changes player-facing text, load skills ss14-localization-strings and ss14-localization-code when the change also touches Loc.GetString(...), LocId, popup text, or localized component fields.
If the task touches network events, NetEntity, replicated state routing, or shared/server/client message flow, load skill ss14-netcode.
If the task touches Appearance, GenericVisualizer, visual state enums, or sprite-layer toggles, load skill ss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skill ss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skills ss14-prototype-basics, ss14-ecs-basics, and ss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skills ss14-debugging-workflow and ss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skills ss14-common-api-patterns and ss14-audio when the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**

📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)

Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)

+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)

{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic in Content.Shared/; use Content.Goobstation.Shared/ only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong in Content.Shared/. Shared predicted components should use NetworkedComponent, AutoGenerateComponentState, and AutoNetworkedField where appropriate.

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
Content.Shared/**/*.cs

⚙️ CodeRabbit configuration file

Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:

  • Shared owns replicated state, shared events, prediction, and data both client and server must understand.
  • Flag client-only or server-only dependencies in Shared.
  • For local-player actions, verify prediction support instead of accepting delayed server-only UX.
  • When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
  • Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
  • Flag EntityUid.Invalid used as a "missing" sentinel.

Files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
**/*System.cs

📄 CodeRabbit inference engine (AGENTS.md)

Public entity-system APIs that operate on entities should usually take Entity<T?> or EntityUid first and call Resolve(...) early.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

Put main server-only authority and non-predicted server simulation in Content.Server/; use Content.Goobstation.Server/ for features already rooted in that module.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs

⚙️ CodeRabbit configuration file

Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:

  • Server owns authority, persistence, round logic, and non-predicted side effects.
  • If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
  • Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
  • When player-visible behavior changes, check whether matching prototype and locale updates are missing.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (14)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-29T08:12:37.068Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 153
File: Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml:137-137
Timestamp: 2026-07-29T08:12:37.068Z
Learning: In ArcaneSS14 prototype YAMLs, the YAML field that disables synchronization for `Content.Shared.Power.Components.BatteryComponent` is spelled exactly `netsync` (all lowercase), not `netSync`. For prototypes derived from `PowerNetworkBattery` (including `BaseAPC`, `CoreSubstation`, `BaseSMES`, `TeslaCoil`), set `netsync: false`; otherwise `Content.Server.Power.EntitySystems.BatterySystem.OnStartup` can throw `DebugAssertException` for a predicted battery connected to a power net. For `Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml`, ensure `EnergyDomeWiredTest` uses `netsync: false`.

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-28T15:44:38.498Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 152
File: Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml:69-72
Timestamp: 2026-07-28T15:44:38.498Z
Learning: В ArcaneSS14/arcane не выполняйте форматирующие перестановки полей (в т.ч. изменение порядка полей) в upstream-файлах: делайте это только если правка добавляет Arcane-специфичную сущность или напрямую требуется для функциональности. Иначе сохраняйте upstream-порядок полей, даже если он противоречит локальным рекомендациям, чтобы не создавать лишние diff и конфликты при upstream-синхронизации. Исключение: допустимо переупорядочивание/форматирование в `Resources/Prototypes/_Arcane` (и только там).

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🔇 Additional comments (5)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (3)

98-101: Предиктивная блокировка combat mode всё ещё отсутствует.

Этот обработчик находится только в Content.Server: клиент может локально включить combat mode и получить откат после ответа сервера. SetInCombatMode и args.Handled нужно продублировать в shared-системе, оставив электрошок серверным.

Это уже отмечалось в предыдущем ревью.

Source: Path instructions


139-139: LGTM!

Also applies to: 157-157


323-331: LGTM!

Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml (1)

12-12: LGTM!

Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl (1)

2-2: LGTM!

Comment on lines +17 to +29
public sealed partial class AggressionInhibitorSystem : EntitySystem
{
[Dependency] private readonly InventorySystem _inventorySystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly ElectrocutionSystem _electrocution = default!;
[Dependency] private readonly IdCardSystem _idCard = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private readonly QuickDialogSystem _quickDialog = default!;
[Dependency] private readonly SharedCombatModeSystem _combatMode = default!;
[Dependency] private SharedContainerSystem _containerSystem = default!;
[Dependency] private IPlayerManager _playerManager = default!;

This comment was marked as resolved.

Comment on lines +11 to +17
public sealed class CuttableItemSystem : EntitySystem
{
[Dependency] private readonly RadioSystem _radio = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

public sealed partial class

И ридонли вырезать. Ы

Comment on lines +16 to +23
public sealed class SharedAggressionInhibitorSystem : EntitySystem
{
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedIdCardSystem _idCard = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private SharedContainerSystem _containerSystem = default!;
[Dependency] private IGameTiming _gameTiming = default!;
[Dependency] private readonly INetManager _netManager = default!;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Также как и выше...

Comment on lines +14 to +20
public sealed class SharedCuttableItemSystem : EntitySystem
{
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] private readonly SharedToolSystem _toolSystem = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly INetManager _netManager = default!;
[Dependency] private IPrototypeManager _prototypeManager = default!;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Также как и выше... ы...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это ничего не заденет?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Заденет OnCutCompleted серверной CuttableItemSystem

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)

32-59: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Не отключайте shared prediction для разрезания.

_netManager.IsClient завершает обработчик до args.Handled, TryStartDoAfter и feedback, поэтому локальный игрок видит начало действия только после ответа сервера. Уберите клиентский early return, запускайте do-after и predicted popup в shared-пути, а снятие предмета и радио-уведомление оставьте серверному подтверждению. Зависимость INetManager после этого также не понадобится.

Это уже отмечалось в предыдущем ревью; текущий код всё ещё содержит ту же проблему.

Исправление
-[Dependency] private INetManager _netManager = default!;
-
-        if (args.Handled || _netManager.IsClient)
+        if (args.Handled)
             return;
...
-        _popup.PopupEntity(message, uid);
+        _popup.PopupPredicted(message, uid);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`
around lines 32 - 59, Remove the _netManager.IsClient early return from the
cuttable interaction handler so args.Handled, TryStartDoAfter, and the attempt
popup execute through the shared predicted path. Keep item removal and radio
notification server-authoritative, and remove the now-unused INetManager
dependency and related field or constructor wiring.

Sources: Coding guidelines, Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 209-210: В обработчике изменения состояния сначала присвойте
`comp.Duration = 60f`, а затем вызовите `Dirty(uid, comp)`. Сохраните
существующее значение fallback и убедитесь, что `Dirty` синхронизирует компонент
уже с обновлённой длительностью.

In `@Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl`:
- Around line 14-22: Обновите локализованное форматирование в выражениях выбора
$hours и $minutes: добавьте ветку [0] для минут без вывода текста, а «и» и
пробел формируйте только когда присутствуют оба ненулевых компонента. Сохраните
корректные русские формы для ненулевых часов и минут, чтобы длительности вроде
60 и 5 минут не содержали «0 минут» или лишний пробел.

---

Duplicate comments:
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 32-59: Remove the _netManager.IsClient early return from the
cuttable interaction handler so args.Handled, TryStartDoAfter, and the attempt
popup execute through the shared predicted path. Keep item removal and radio
notification server-authoritative, and remove the now-unused INetManager
dependency and related field or constructor wiring.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 04060188-2a1a-4c5d-8e33-e330421bf085

📥 Commits

Reviewing files that changed from the base of the PR and between d1b4511 and 1277ee4.

📒 Files selected for processing (5)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: YAML Linter
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
🧰 Additional context used
📓 Path-based instructions (15)
**/*.cs

📄 CodeRabbit inference engine (GEMINI.md)

**/*.cs: Keep components data-only and behavior in systems
Use On... -> Try... -> Can... -> Do... pattern for gameplay actions
Prefer Entity<T?>, ProtoId<T>, EntProtoId, and localized strings for type usage

**/*.cs: When writing or editing C# gameplay code, load skills: ss14-ecs-components, ss14-ecs-entities, ss14-ecs-prototypes, ss14-ecs-systems, ss14-events, and ss14-prediction.
If the C# change is large or the task needs reviewable notes, load skill ss14-documentation-writing.
If the code touches hot paths, Update(), or frequently raised events, load skill ss14-standard-optimizations.
If the task adds or changes player-facing text, load skills ss14-localization-strings and ss14-localization-code when the change also touches Loc.GetString(...), LocId, popup text, or localized component fields.
If the task touches network events, NetEntity, replicated state routing, or shared/server/client message flow, load skill ss14-netcode.
If the task touches Appearance, GenericVisualizer, visual state enums, or sprite-layer toggles, load skill ss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skill ss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skills ss14-prototype-basics, ss14-ecs-basics, and ss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skills ss14-debugging-workflow and ss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skills ss14-common-api-patterns and ss14-audio when the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**

📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)

Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)

+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)

{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic in Content.Shared/; use Content.Goobstation.Shared/ only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong in Content.Shared/. Shared predicted components should use NetworkedComponent, AutoGenerateComponentState, and AutoNetworkedField where appropriate.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*System.cs

📄 CodeRabbit inference engine (AGENTS.md)

Public entity-system APIs that operate on entities should usually take Entity<T?> or EntityUid first and call Resolve(...) early.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**/*.cs

⚙️ CodeRabbit configuration file

Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:

  • Shared owns replicated state, shared events, prediction, and data both client and server must understand.
  • Flag client-only or server-only dependencies in Shared.
  • For local-player actions, verify prediction support instead of accepting delayed server-only UX.
  • When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
  • Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
  • Flag EntityUid.Invalid used as a "missing" sentinel.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.ftl

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
{Content.Server,Content.Goobstation.Server}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

Put main server-only authority and non-predicted server simulation in Content.Server/; use Content.Goobstation.Server/ for features already rooted in that module.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs

⚙️ CodeRabbit configuration file

Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:

  • Server owns authority, persistence, round logic, and non-predicted side effects.
  • If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
  • Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
  • When player-visible behavior changes, check whether matching prototype and locale updates are missing.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (8)
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
🔇 Additional comments (4)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)

62-79: LGTM!

Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (1)

13-25: LGTM!

Also applies to: 27-62, 64-75

Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (1)

18-23: LGTM!

Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)

19-27: LGTM!

Comment thread Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs Outdated
Comment thread Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl Outdated
@UmbiMax UmbiMax changed the title [Add] bracelet aggression inhibitor [Feature] New aggression inhibitor collar Jul 30, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl (1)

1-89: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Отсутствует en-US-версия локали для компонента ингибитора.

Ключи внутри файла (stabikor-examine-*, stabikor-verb-*, stabikor-dialog-* и другие) используются корректно и совпадают с вызовами Loc.GetString в SharedAggressionInhibitorSystem.cs/AggressionInhibitorSystem.cs. Но парный en-US файл в PR отсутствует. Английские клиенты увидят сырые ключи локали вместо текста осмотра, верб и диалога.

Как per coding guidelines: "Add or update FTL entries under Resources/Locale/, starting with en-US."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl`
around lines 1 - 89, Add the missing en-US localization file for the aggression
inhibitor component, mirroring every key defined in the Russian file, including
stabikor-examine-*, stabikor-verb-*, stabikor-dialog-*, status, activation,
permission, timer, and unequip messages. Provide English translations while
preserving each key name and Fluent variable/select syntax so English clients
receive resolved text instead of raw localization keys.

Source: Coding guidelines

♻️ Duplicate comments (1)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)

278-315: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

SetInCombatMode сбрасывает боевой режим не у заключённого, а у держателя карты.

В ActivateInhibitor параметр user — это тот, кто прикладывает ID-карту (например, глава службы безопасности), а wearerUid — тот, кто носит устройство (заключённый). На линии 300 вызывается _combatMode.SetInCombatMode(user, false). Это отключает боевой режим у охранника, а не у заключённого.

Если заключённый уже включил боевой режим до блокировки устройства, он продолжит атаковать после активации ингибитора. Основная функция устройства — предотвратить агрессию — не работает в этом сценарии.

Сравните с popup на строке 306, где корректно используется Name(wearerUid), а не Name(user) — это подтверждает, что параметр user подставлен по ошибке.

🐛 Предлагаемый фикс
                 comp.WearingEntity = wearerUid;
-                _combatMode.SetInCombatMode(user, false);
+                _combatMode.SetInCombatMode(wearerUid, false);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 278 - 315, В методе ActivateInhibitor замените передачу user в
_combatMode.SetInCombatMode на wearerUid, чтобы при активации ингибитора боевой
режим отключался у носителя устройства, а не у пользователя, приложившего карту.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 61-105: Замените полный EntityQueryEnumerator в
OnToggleCombatAction прямой проверкой слотов пользователя через
_inventorySystem.TryGetSlotEntity для слотов neck и gloves, затем получите
компонент через TryComp<AggressionInhibitorComponent>. Сохраните существующую
проверку активности и обработку ингибитора, исключив сканирование устройств у
других сущностей; перед изменением загрузите навык ss14-standard-optimizations.
- Around line 65-70: Добавьте using-директивы для
Content.Shared.Mobs.Components.MobStateComponent и Content.Shared.Mobs.MobState,
затем обновите проверку в системе AggressionInhibitorSystem, используя короткие
имена MobStateComponent и MobState; сохраните текущую проверку состояний
Critical и Dead без добавления отдельных проверок SoftCritical или HardCritical.
- Around line 132-168: В обработчике OnInteractUsing привяжите args.Handled к
результату успешной операции, а не к наличию звука: после RemoveInhibitor и
ActivateInhibitor устанавливайте его при успешном выполнении независимо от
UnlockSound или LockSound. Для неуспешной операции при валидном доступе добавьте
соответствующий пользовательский фидбек по существующему паттерну системы,
сохранив текущую обработку отказа в доступе.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 50-55: Update the DoAfterArgs construction in the shared
cuttable-item system to convert CuttableItemComponent.Delay from float seconds
into a TimeSpan using TimeSpan.FromSeconds before passing it as the delay
argument; leave the remaining DoAfterArgs configuration unchanged.

In
`@Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl`:
- Around line 1-2: Добавьте en-US FTL-запись для ent-ClothingAggressionInhibitor
с именем и описанием сущности, сохранив ru-RU запись как парную локализацию.
Разместите английскую локаль в соответствующем слое Resources/Locale и
используйте существующий формат ключей ent-ClothingAggressionInhibitor и .desc.

In `@Resources/Prototypes/Catalog/Cargo/cargo_vending.yml`:
- Line 36: Верните значение cost для cargo-крейта одежды с 6000 на 5300,
сохранив остальное содержимое и настройки без изменений.

---

Outside diff comments:
In `@Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl`:
- Around line 1-89: Add the missing en-US localization file for the aggression
inhibitor component, mirroring every key defined in the Russian file, including
stabikor-examine-*, stabikor-verb-*, stabikor-dialog-*, status, activation,
permission, timer, and unequip messages. Provide English translations while
preserving each key name and Fluent variable/select syntax so English clients
receive resolved text instead of raw localization keys.

---

Duplicate comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 278-315: В методе ActivateInhibitor замените передачу user в
_combatMode.SetInCombatMode на wearerUid, чтобы при активации ингибитора боевой
режим отключался у носителя устройства, а не у пользователя, приложившего карту.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 739c5399-d69e-49b1-8251-b29a2b3d9182

📥 Commits

Reviewing files that changed from the base of the PR and between 1277ee4 and 1bc2227.

⛔ Files ignored due to path filters (3)
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-HAND.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-NECK.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/icon.png is excluded by !**/*.png
📒 Files selected for processing (18)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
🧰 Additional context used
📓 Path-based instructions (18)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.json

📄 CodeRabbit inference engine (AGENTS.md)

Keep RSI meta.json ordered as version, license, copyright, size, states with 4-space indentation.

Files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json

⚙️ CodeRabbit configuration file

Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.

Files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
Resources/**/*.ftl

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
**/*.cs

📄 CodeRabbit inference engine (GEMINI.md)

**/*.cs: Keep components data-only and behavior in systems
Use On... -> Try... -> Can... -> Do... pattern for gameplay actions
Prefer Entity<T?>, ProtoId<T>, EntProtoId, and localized strings for type usage

**/*.cs: When writing or editing C# gameplay code, load skills: ss14-ecs-components, ss14-ecs-entities, ss14-ecs-prototypes, ss14-ecs-systems, ss14-events, and ss14-prediction.
If the C# change is large or the task needs reviewable notes, load skill ss14-documentation-writing.
If the code touches hot paths, Update(), or frequently raised events, load skill ss14-standard-optimizations.
If the task adds or changes player-facing text, load skills ss14-localization-strings and ss14-localization-code when the change also touches Loc.GetString(...), LocId, popup text, or localized component fields.
If the task touches network events, NetEntity, replicated state routing, or shared/server/client message flow, load skill ss14-netcode.
If the task touches Appearance, GenericVisualizer, visual state enums, or sprite-layer toggles, load skill ss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skill ss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skills ss14-prototype-basics, ss14-ecs-basics, and ss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skills ss14-debugging-workflow and ss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skills ss14-common-api-patterns and ss14-audio when the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**

📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)

Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)

+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)

{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic in Content.Shared/; use Content.Goobstation.Shared/ only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong in Content.Shared/. Shared predicted components should use NetworkedComponent, AutoGenerateComponentState, and AutoNetworkedField where appropriate.

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Shared/**/*.cs

⚙️ CodeRabbit configuration file

Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:

  • Shared owns replicated state, shared events, prediction, and data both client and server must understand.
  • Flag client-only or server-only dependencies in Shared.
  • For local-player actions, verify prediction support instead of accepting delayed server-only UX.
  • When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
  • Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
  • Flag EntityUid.Invalid used as a "missing" sentinel.

Files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

Put main server-only authority and non-predicted server simulation in Content.Server/; use Content.Goobstation.Server/ for features already rooted in that module.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
**/*System.cs

📄 CodeRabbit inference engine (AGENTS.md)

Public entity-system APIs that operate on entities should usually take Entity<T?> or EntityUid first and call Resolve(...) early.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs

⚙️ CodeRabbit configuration file

Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:

  • Server owns authority, persistence, round logic, and non-predicted side effects.
  • If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
  • Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
  • When player-visible behavior changes, check whether matching prototype and locale updates are missing.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (16)
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-29T08:12:37.068Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 153
File: Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml:137-137
Timestamp: 2026-07-29T08:12:37.068Z
Learning: In ArcaneSS14 prototype YAMLs, the YAML field that disables synchronization for `Content.Shared.Power.Components.BatteryComponent` is spelled exactly `netsync` (all lowercase), not `netSync`. For prototypes derived from `PowerNetworkBattery` (including `BaseAPC`, `CoreSubstation`, `BaseSMES`, `TeslaCoil`), set `netsync: false`; otherwise `Content.Server.Power.EntitySystems.BatterySystem.OnStartup` can throw `DebugAssertException` for a predicted battery connected to a power net. For `Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml`, ensure `EnergyDomeWiredTest` uses `netsync: false`.

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-28T15:44:38.498Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 152
File: Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml:69-72
Timestamp: 2026-07-28T15:44:38.498Z
Learning: В ArcaneSS14/arcane не выполняйте форматирующие перестановки полей (в т.ч. изменение порядка полей) в upstream-файлах: делайте это только если правка добавляет Arcane-специфичную сущность или напрямую требуется для функциональности. Иначе сохраняйте upstream-порядок полей, даже если он противоречит локальным рекомендациям, чтобы не создавать лишние diff и конфликты при upstream-синхронизации. Исключение: допустимо переупорядочивание/форматирование в `Resources/Prototypes/_Arcane` (и только там).

Applied to files:

  • Resources/Prototypes/_Orion/Research/Nodes/security.yml
  • Resources/Prototypes/Catalog/Cargo/cargo_vending.yml
  • Resources/Prototypes/Recipes/Lathes/security.yml
  • Resources/Prototypes/Recipes/Lathes/Packs/security.yml
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-26T02:48:44.443Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 136
File: Resources/Textures/Clothing/Back/Duffels/captain.rsi/meta.json:4-4
Timestamp: 2026-07-26T02:48:44.443Z
Learning: In `Resources/Textures/**/**/*.rsi/meta.json`, if the PR replaces sprite assets with sources that do not include the previous credit holders (e.g., the new sprites come from another upstream/source), do not keep attribution/author fields for contributors who made no contribution to the current assets. Update the attribution to reflect the actual authors/sources of the sprites currently referenced by the .rsi.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
  • Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
  • Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs
  • Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
🔇 Additional comments (18)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (2)

32-59: Не отключайте prediction на клиенте.

_netManager.IsClient завершает обработчик до TryStartDoAfter и popup. Локальный игрок видит начало действия только после ответа сервера. Перенесите запуск do-after и predicted feedback в shared/predicted путь. Оставьте снятие предмета и радио-уведомление на сервере.


62-79: LGTM!

Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs (1)

11-43: LGTM!

Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs (1)

6-7: LGTM!

Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (1)

27-75: LGTM!

Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl (1)

1-5: LGTM!

Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl (1)

1-5: LGTM!

Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml (1)

1-34: LGTM!

Resources/Prototypes/_Orion/Research/Nodes/security.yml (1)

82-82: LGTM!

Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json (1)

1-22: LGTM!

Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (3)

35-35: Предиктивная блокировка боевого режима до сих пор не добавлена (дубль).

Обработчик OnToggleCombatAction есть только в Content.Server. Клиент включает боевой режим локально до ответа сервера и получает откат постфактум. Это уже отмечалось ранее без пометки "Addressed".


249-262: Тихий отказ при неудачном RemoveInhibitor в ToggleLock (дубль, не устранён).

При наличии доступа, но провале RemoveInhibitor, метод молча возвращается без popup/sound. Это уже отмечалось ранее без пометки "Addressed".


170-170: OpenDialog/ToggleLock: Entity<AggressionInhibitorComponent> вместо раздельных параметров (дубль, не устранён).

Оба метода вызываются из OnOpenDialogReceived/OnToggleLockReceived, где пара uid+comp уже приходит вместе. Это уже отмечалось ранее без пометки "Addressed".

Also applies to: 232-232

Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs (1)

1-109: LGTM!

Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (1)

1-137: LGTM!

Resources/Prototypes/Catalog/Fills/Lockers/security.yml (1)

46-49: LGTM!

Resources/Prototypes/Recipes/Lathes/Packs/security.yml (1)

86-86: LGTM!

Resources/Prototypes/Recipes/Lathes/security.yml (1)

65-77: LGTM!

Comment thread Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs Outdated
Comment on lines +65 to +70
if (TryComp<Shared.Mobs.Components.MobStateComponent>(user, out var mobState))
{
if (mobState.CurrentState == Shared.Mobs.MobState.Critical ||
mobState.CurrentState == Shared.Mobs.MobState.Dead)
return;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
fd -a 'MobState\.cs$'
rg -n "enum MobState" -A 15 Content.Shared/Mobs/MobState.cs 2>/dev/null || rg -n "enum MobState" -A 15 -g '*.cs'

Repository: ArcaneSS14/arcane

Length of output: 915


Добавьте using-директивы для MobStateComponent и MobState.

MobState.Critical покрывает SoftCritical, поэтому отдельная проверка SoftCritical/HardCritical не нужна; главное в этом фрагменте — упростить обращения к Content.Shared.Mobs.Components.MobStateComponent и Content.Shared.Mobs.MobState через using.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 65 - 70, Добавьте using-директивы для
Content.Shared.Mobs.Components.MobStateComponent и Content.Shared.Mobs.MobState,
затем обновите проверку в системе AggressionInhibitorSystem, используя короткие
имена MobStateComponent и MobState; сохраните текущую проверку состояний
Critical и Dead без добавления отдельных проверок SoftCritical или HardCritical.

Comment thread Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs Outdated
Comment on lines +1 to +2
ent-ClothingAggressionInhibitor = ингибитор агрессии
.desc = Стабилизирует поведение ассистентов с помощью силы тока! На корпусе виднеется считыватель ID-карт.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Отсутствует en-US-версия локали для ClothingAggressionInhibitor.

В этом слое PR присутствует только ru-RU файл для этой сущности. Гайдлайн требует, чтобы FTL-строки добавлялись «starting with en-US», а ru-RU — как парная запись. Английские клиенты увидят сырой ключ ent-ClothingAggressionInhibitor вместо текста.

Как per coding guidelines: "Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl`
around lines 1 - 2, Добавьте en-US FTL-запись для
ent-ClothingAggressionInhibitor с именем и описанием сущности, сохранив ru-RU
запись как парную локализацию. Разместите английскую локаль в соответствующем
слое Resources/Locale и используйте существующий формат ключей
ent-ClothingAggressionInhibitor и .desc.

Source: Coding guidelines

Comment thread Resources/Prototypes/Catalog/Cargo/cargo_vending.yml

namespace Content.Server._Arcane.CuttableItem.Systems;

public sealed class CuttableItemSystem : EntitySystem

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

public sealed partial class


namespace Content.Shared._Arcane.AggressionInhibitor.Systems;

public sealed class SharedAggressionInhibitorSystem : EntitySystem

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

public sealed partial class


namespace Content.Shared._Arcane.CuttableItem.Systems;

public sealed class SharedCuttableItemSystem : EntitySystem

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

public sealed partial class

Comment thread Resources/Prototypes/Catalog/Cargo/cargo_vending.yml

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут кролик накидал очень много полезных комментариев.

Из важного:
Перенести проверку боевоего режима в shared, а тут оставить всё остальное.

При отказе в доступе нету попапа или какой либо причины в отказе.

Ну и ещё исправления.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)

134-160: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Повторно проверьте состояние в callback диалога.

Проверки дистанции, ID-карты, доступа и comp.IsLocked выполняются до открытия асинхронного диалога. До отправки ответа другой сотрудник может активировать ингибитор. Callback затем изменит Duration у уже заблокированного устройства через сохранённый comp.

В callback заново получите компонент и повторите проверки перед изменением Duration. Лучше вынесите проверки в общий метод для открытия и подтверждения диалога.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 134 - 160, Повторно проверьте состояние ингибитора в callback,
получив актуальный компонент вместо использования сохранённого comp, и перед
изменением Duration заново выполните проверки существования сущности, дистанции,
ID-карты, доступа и IsLocked. Вынесите общие проверки из обработчика открытия
диалога и callback в единый метод, сохранив текущие сообщения об отказе и
изменяя Duration только при успешной проверке.
♻️ Duplicate comments (1)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)

30-59: ⚠️ Potential issue | 🟠 Major

Не отключайте shared prediction на клиенте.

Условие _netManager.IsClient завершает обработчик до args.Handled, TryStartDoAfter и popup. Клиент не запускает резку сразу. Действие начинается только после ответа сервера.

Оставьте ранний выход только для args.Handled. Запускайте DoAfter в shared/predicted пути. Для popup используйте predicted API. Снятие предмета и radio-уведомление оставьте в server-only обработчике.

As per path instructions, Content.Shared должен владеть prediction-aware логикой локальных действий. As per coding guidelines, используйте predicted APIs для player-facing feedback.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`
around lines 30 - 59, Remove the _netManager.IsClient early return from
OnInteractUsing, leaving only the args.Handled guard so the shared handler
starts the predicted DoAfter immediately. Use the predicted popup API for the
player-facing cut attempt feedback, and keep item removal and radio notification
in the server-only handler.

Sources: Coding guidelines, Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 65-70: В обработчике OnInteractUsing после воспроизведения
comp.DenySound для неэкипированного предмета немедленно завершите выполнение
через return; сохраните установку args.Handled = true перед выходом, чтобы
последующая проверка ID-карты и операция доступа не выполнялись.
- Line 88: Замените только воспроизведение DenySound в AggressionInhibitorSystem
на локализованный PopupEntity с причиной отказа в проверках доступа. Примените
это при разблокировке и активации по путям
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs:88-88
и 100-100, а также в соответствующих verb-путях на 188-188 и 197-197; сообщение
должно явно указывать, что ID-карта не имеет требуемого доступа.

---

Outside diff comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 134-160: Повторно проверьте состояние ингибитора в callback,
получив актуальный компонент вместо использования сохранённого comp, и перед
изменением Duration заново выполните проверки существования сущности, дистанции,
ID-карты, доступа и IsLocked. Вынесите общие проверки из обработчика открытия
диалога и callback в единый метод, сохранив текущие сообщения об отказе и
изменяя Duration только при успешной проверке.

---

Duplicate comments:
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 30-59: Remove the _netManager.IsClient early return from
OnInteractUsing, leaving only the args.Handled guard so the shared handler
starts the predicted DoAfter immediately. Use the predicted popup API for the
player-facing cut attempt feedback, and keep item removal and radio notification
in the server-only handler.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5f28b093-c89e-41ce-8b91-67708e656eda

📥 Commits

Reviewing files that changed from the base of the PR and between 1bc2227 and 4ad7881.

📒 Files selected for processing (7)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
💤 Files with no reviewable changes (1)
  • Resources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: Test Packaging
  • GitHub Check: YAML Linter
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML map schema validator
🧰 Additional context used
📓 Path-based instructions (15)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
Resources/**/*.ftl

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
**/*.cs

📄 CodeRabbit inference engine (GEMINI.md)

**/*.cs: Keep components data-only and behavior in systems
Use On... -> Try... -> Can... -> Do... pattern for gameplay actions
Prefer Entity<T?>, ProtoId<T>, EntProtoId, and localized strings for type usage

**/*.cs: When writing or editing C# gameplay code, load skills: ss14-ecs-components, ss14-ecs-entities, ss14-ecs-prototypes, ss14-ecs-systems, ss14-events, and ss14-prediction.
If the C# change is large or the task needs reviewable notes, load skill ss14-documentation-writing.
If the code touches hot paths, Update(), or frequently raised events, load skill ss14-standard-optimizations.
If the task adds or changes player-facing text, load skills ss14-localization-strings and ss14-localization-code when the change also touches Loc.GetString(...), LocId, popup text, or localized component fields.
If the task touches network events, NetEntity, replicated state routing, or shared/server/client message flow, load skill ss14-netcode.
If the task touches Appearance, GenericVisualizer, visual state enums, or sprite-layer toggles, load skill ss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skill ss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skills ss14-prototype-basics, ss14-ecs-basics, and ss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skills ss14-debugging-workflow and ss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skills ss14-common-api-patterns and ss14-audio when the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)

+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

Put main server-only authority and non-predicted server simulation in Content.Server/; use Content.Goobstation.Server/ for features already rooted in that module.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
**/*System.cs

📄 CodeRabbit inference engine (AGENTS.md)

Public entity-system APIs that operate on entities should usually take Entity<T?> or EntityUid first and call Resolve(...) early.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Server/**/*.cs

⚙️ CodeRabbit configuration file

Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:

  • Server owns authority, persistence, round logic, and non-predicted side effects.
  • If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
  • Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
  • When player-visible behavior changes, check whether matching prototype and locale updates are missing.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**

📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)

Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)

{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic in Content.Shared/; use Content.Goobstation.Shared/ only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong in Content.Shared/. Shared predicted components should use NetworkedComponent, AutoGenerateComponentState, and AutoNetworkedField where appropriate.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Shared/**/*.cs

⚙️ CodeRabbit configuration file

Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:

  • Shared owns replicated state, shared events, prediction, and data both client and server must understand.
  • Flag client-only or server-only dependencies in Shared.
  • For local-player actions, verify prediction support instead of accepting delayed server-only UX.
  • When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
  • Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
  • Flag EntityUid.Invalid used as a "missing" sentinel.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
🧠 Learnings (8)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.

Applied to files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
🔇 Additional comments (5)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)

62-80: LGTM!

Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (1)

11-76: LGTM!

Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (1)

42-45: Сохраните предиктивную блокировку combat mode.

_netManager.IsClient отключает обработчик на клиенте. Поэтому клиент локально включает combat mode до серверного отката. Оставьте поиск активного ингибитора и args.Handled на обеих сторонах. Электрошок оставьте только на сервере.

As per path instructions: “For local-player actions, verify prediction support instead of accepting delayed server-only UX.”

Sources: Coding guidelines, Path instructions

Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl (1)

1-80: LGTM!

Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl (1)

1-2: LGTM!

return;
args.Handled = true;
}
else _audio.PlayPvs(comp.DenySound, uid);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Покажите причину отказа во всех ветках проверки доступа.

Один DenySound не сообщает пользователю, что ID-карта не имеет нужного доступа. Добавьте локализованный PopupEntity и используйте его во всех ветках.

  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L88-L88: покажите причину отказа при попытке разблокировки.
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L100-L100: покажите причину отказа при попытке активации.
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L188-L188: покажите причину отказа для verb разблокировки.
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L197-L197: покажите причину отказа для verb активации.
📍 Affects 1 file
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L88-L88 (this comment)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L100-L100
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L188-L188
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L197-L197
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
at line 88, Замените только воспроизведение DenySound в
AggressionInhibitorSystem на локализованный PopupEntity с причиной отказа в
проверках доступа. Примените это при разблокировке и активации по путям
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs:88-88
и 100-100, а также в соответствующих verb-путях на 188-188 и 197-197; сообщение
должно явно указывать, что ID-карта не имеет требуемого доступа.

@Cat-Lixs

Cat-Lixs commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

Я не знаю почему тест падает. Говорит что Amber втыкает

@ReWAFFlution

Copy link
Copy Markdown
Contributor

Я не знаю почему тест падает. Говорит что Amber втыкает

В целом везде тесты откисли, что у нас на аркейне, что на корваксгуб, что у самих губов, так что пока на них внимание не обращай.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)

109-166: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Повторно проверяйте блокировку и доступ в callback диалога.

Проверки выполняются только до открытия диалога. В callback проверяется только EntityExists. Если устройство заблокируют, пользователь уйдёт из радиуса или сменит ID-карту, callback всё равно изменит Duration. Перед изменением повторно проверьте блокировку, дистанцию и доступ карты.

Минимальное исправление блокировки
-            if (!EntityManager.EntityExists(uid))
+            if (!EntityManager.EntityExists(uid) || comp.IsLocked)
                 return;

Контекст изменения подтверждает, что проверку unlocked удалили из callback.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 109 - 166, В callback, перед изменением comp.Duration в OpenDialog,
повторно проверьте существование устройства, что comp.IsLocked ложно, что
пользователь остаётся в радиусе 2f от targetEntity, и что у него всё ещё есть
активная ID-карта с требуемым доступом через _handsSystem, _idCard и
AccessComponent. При провале любой проверки немедленно завершайте callback без
изменения состояния.
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)

48-59: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Проверяйте результат _doAfter.TryStartDoAfter.

TryStartDoAfter(DoAfterArgs args) возвращает bool. При false код в CuttableItemUse всё равно оставляет args.Handled = true и показывает popup, хотя действие не запустилось. Проверяйте результат до установки args.Handled и показа popup.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`
around lines 48 - 59, Update CuttableItemUse around _doAfter.TryStartDoAfter to
check its boolean result before setting args.Handled and showing the
cuttable-item-attempt-broken-popup notification. Only mark the use handled and
display the popup when the do-after starts successfully; preserve the existing
behavior when it fails by returning without those side effects.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 109-166: В callback, перед изменением comp.Duration в OpenDialog,
повторно проверьте существование устройства, что comp.IsLocked ложно, что
пользователь остаётся в радиусе 2f от targetEntity, и что у него всё ещё есть
активная ID-карта с требуемым доступом через _handsSystem, _idCard и
AccessComponent. При провале любой проверки немедленно завершайте callback без
изменения состояния.

In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 48-59: Update CuttableItemUse around _doAfter.TryStartDoAfter to
check its boolean result before setting args.Handled and showing the
cuttable-item-attempt-broken-popup notification. Only mark the use handled and
display the popup when the do-after starts successfully; preserve the existing
behavior when it fails by returning without those side effects.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d4ceb01f-664d-4ab0-a48d-ed0e8fd64193

📥 Commits

Reviewing files that changed from the base of the PR and between 4ad7881 and 27c89e2.

📒 Files selected for processing (7)
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
  • Resources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
💤 Files with no reviewable changes (1)
  • Resources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
📜 Review details
⏰ Context from checks skipped due to timeout. (7)
  • GitHub Check: YAML Linter
  • GitHub Check: Validate RSIs
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML map schema validator
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Diff
🧰 Additional context used
📓 Path-based instructions (15)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/**/*.ftl

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
**/*.cs

📄 CodeRabbit inference engine (GEMINI.md)

**/*.cs: Keep components data-only and behavior in systems
Use On... -> Try... -> Can... -> Do... pattern for gameplay actions
Prefer Entity<T?>, ProtoId<T>, EntProtoId, and localized strings for type usage

**/*.cs: When writing or editing C# gameplay code, load skills: ss14-ecs-components, ss14-ecs-entities, ss14-ecs-prototypes, ss14-ecs-systems, ss14-events, and ss14-prediction.
If the C# change is large or the task needs reviewable notes, load skill ss14-documentation-writing.
If the code touches hot paths, Update(), or frequently raised events, load skill ss14-standard-optimizations.
If the task adds or changes player-facing text, load skills ss14-localization-strings and ss14-localization-code when the change also touches Loc.GetString(...), LocId, popup text, or localized component fields.
If the task touches network events, NetEntity, replicated state routing, or shared/server/client message flow, load skill ss14-netcode.
If the task touches Appearance, GenericVisualizer, visual state enums, or sprite-layer toggles, load skill ss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skill ss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skills ss14-prototype-basics, ss14-ecs-basics, and ss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skills ss14-debugging-workflow and ss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skills ss14-common-api-patterns and ss14-audio when the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Shared/**

📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)

Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)

+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs

📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)

{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic in Content.Shared/; use Content.Goobstation.Shared/ only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong in Content.Shared/. Shared predicted components should use NetworkedComponent, AutoGenerateComponentState, and AutoNetworkedField where appropriate.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*System.cs

📄 CodeRabbit inference engine (AGENTS.md)

Public entity-system APIs that operate on entities should usually take Entity<T?> or EntityUid first and call Resolve(...) early.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Shared/**/*.cs

⚙️ CodeRabbit configuration file

Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:

  • Shared owns replicated state, shared events, prediction, and data both client and server must understand.
  • Flag client-only or server-only dependencies in Shared.
  • For local-player actions, verify prediction support instead of accepting delayed server-only UX.
  • When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
  • Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
  • Flag EntityUid.Invalid used as a "missing" sentinel.

Files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

Put main server-only authority and non-predicted server simulation in Content.Server/; use Content.Goobstation.Server/ for features already rooted in that module.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs

⚙️ CodeRabbit configuration file

Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:

  • Server owns authority, persistence, round logic, and non-predicted side effects.
  • If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
  • Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
  • When player-visible behavior changes, check whether matching prototype and locale updates are missing.

Files:

  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (8)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
  • Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.

Applied to files:

  • Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
  • Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs
  • Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
  • Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
🔇 Additional comments (13)
Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (2)

42-95: Восстановите клиентскую предиктивную блокировку combat mode.

_netManager.IsClient завершает OnToggleCombatAction до поиска активного ингибитора. Клиент локально включает combat mode, пока сервер не вернёт авторитетное состояние. На клиенте помечайте событие обработанным при активном ингибиторе. Электрошок и серверный popup оставьте в серверной ветви.

Согласно coding guidelines и path instructions, локальное действие игрока должно иметь prediction.

Sources: Coding guidelines, Path instructions


13-40: LGTM!

Also applies to: 145-199

Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (3)

109-110: Передавайте пару entity/component одним Entity<T?>.

OpenDialog и ToggleLock получают uid и comp отдельно. Их обработчики уже получают эту пару вместе. Используйте Entity<AggressionInhibitorComponent> и вызовите Resolve(...) в начале метода.

Согласно coding guidelines: “Prefer Entity<T?> over parallel (EntityUid uid, T component) parameters”.

Also applies to: 169-170

Source: Coding guidelines


206-230: Отключайте combat mode у носителя устройства.

wearerUid — заключённый с ингибитором. user — сотрудник, который активирует устройство. Текущий вызов отключает combat mode у сотрудника и оставляет включённый combat mode у заключённого.

-                _combatMode.SetInCombatMode(user, false);
+                _combatMode.SetInCombatMode(wearerUid, false);

37-56: LGTM!

Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl (1)

1-79: LGTM!

Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl (1)

1-2: LGTM!

Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (3)

30-33: Не отключайте prediction в Content.Shared.

Условие _netManager.IsClient завершает обработчик до запуска DoAfter и feedback. Локальный игрок видит действие только после server round-trip. Уберите клиентский ранний выход. Запускайте DoAfter и feedback через shared/predicted путь. Снятие предмета и radio-уведомление оставьте в Content.Server.

Это повторяет ранее отмеченное замечание.

As per path instructions, в Content.Shared должна находиться prediction-aware логика локальных действий. As per coding guidelines, используйте predicted API для feedback.

Also applies to: 57-59

Sources: Coding guidelines, Path instructions


14-28: LGTM!


62-79: LGTM!

Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (3)

11-25: LGTM!


27-62: LGTM!


64-76: LGTM!

@coderabbitai coderabbitai Bot mentioned this pull request Aug 3, 2026
15 tasks
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants