Skip to content

[Upstream] Goob UP - #168

Merged
UmbiMax merged 55 commits into
ArcaneSS14:masterfrom
OSAS-corp:Upstreaaam
Aug 4, 2026
Merged

[Upstream] Goob UP#168
UmbiMax merged 55 commits into
ArcaneSS14:masterfrom
OSAS-corp:Upstreaaam

Conversation

@UmbiMax

@UmbiMax UmbiMax commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

Описание PR

Чуть не залил через мастер.

Медиа

Тип PR

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

Лицензионное соглашение

  • Я согласен с лицензионным соглашением Contributor License Agreement, для Arcane SS14 Organization.

Изменения

Super7522 and others added 30 commits July 28, 2026 19:04
* ZED's infection nerf

* okay NOW its working
* merge this without looking

* you heard rouge gg
* patchfix

* patchfix2

* fix-oni

---------

Co-authored-by: shimorio <shimoika@bk.ru>
…lds. (#6669)

port

Co-authored-by: gaiads <gaiads@users.noreply.github.com>
* Were it so easy

* fix checkfail + proper weight

* fix no agent ID
…olorlinks (#6682)

* start

* layering and colorlink

real!!!!!!

* xeno buff

* fix meta

* FUCK

* sigh

* i should probably remove this from my master branch already

* emmmhm

---------

Co-authored-by: Wink <vasilevruslan4152@gmail.com>
* Fix and rebalance mining injectors

* Nerf exosuit drills

* Nerf hierophant club

* Allow ore boxes to dump ore by dragging it

* fix
* fuck you

* Dismember Greytide

* it's growing

* Revert "Dismember Greytide"

This reverts commit f8f22a5c56b52df4f715ed6327d9d59185308107.

* go away bro

* Revert "go away bro"

This reverts commit b930e1db25529044493fa2d69dc72e1a2da75357.

* okay!

* space goldfish

* butterfly

* Revert "butterfly"

This reverts commit 520dca4aaa1fd2e2ecff8729859323a5d8fd88e6.
* hunger and thirst rebalance

* hunger and thirst rebalance
GoobAutomatedBot and others added 3 commits August 2, 2026 15:21
* mpl 2

* Update .github/PULL_REQUEST_TEMPLATE.md

---------

Co-authored-by: madeline-celeste <224184098+madeline-celeste@users.noreply.github.com>

@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

🤖 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.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs`:
- Line 121: Переместите запись LogType.CanisterTankInserted из обработчика
ItemSlotInsertAttemptEvent в уже существующий handler
EntInsertedIntoContainerMessage, чтобы логирование происходило только после
успешной вставки. Передайте в этот handler необходимый контекст вставки и не
логируйте отменённые попытки из ItemSlotInsertAttemptEvent.

In `@Resources/Locale/en-US/_DV/cosmiccult/abilities.ftl`:
- Around line 24-25: Добавьте русскую локализацию для ключа
cosmicability-hibernate-confirm в файле ru-RU/_DV/cosmiccult/abilities.ftl,
сохранив смысл предупреждения и инструкции подтверждения действия из английской
строки.

In `@Resources/Prototypes/_DV/Actions/cosmiccult.yml`:
- Line 239: В конфигурации ActionCosmicColossusSunder не отключайте общую
проверку доступности через checkCanAccess: false. Верните проверку
InRangeUnobstructed и реализуйте отдельное исключение только для окон, сохранив
блокировку выбора координат через стены, двери и прочие препятствия.

In `@Resources/Prototypes/Entities/Objects/Fun/sports.yml`:
- Around line 84-94: В определении TennisBall удалите или замените layer:
MobLayer, вернув объект в стандартный слой обычных предметов; при необходимости
сохраните слой, совместимый с MobMask, например MidImpassable, чтобы
столкновения с мобами действительно работали. Не изменяйте restitution,
friction, TileFrictionModifier или Damageable.

In `@Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml`:
- Line 1584: Добавьте проверку доступа через AccessReaderSystem в
RoboticsConsoleSystem.OnDisable() и OnDestroy() перед отправкой
NET_DISABLE_COMMAND или NET_DESTROY_COMMAND. Используйте настройки AccessReader
с доступом ResearchDirector из RoboticsConsole и блокируйте выполнение команды
при отсутствии доступа; сохраните текущую логику для авторизованных
пользователей.
🪄 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: ceeb6fe9-82be-4577-986f-b24b24e75af5

📥 Commits

Reviewing files that changed from the base of the PR and between a991e28 and 1534351.

⛔ Files ignored due to path filters (5)
  • Resources/Textures/_Goobstation/Objects/Fun/tennis.rsi/equipped-MASK.png is excluded by !**/*.png
  • Resources/Textures/_Goobstation/Objects/Fun/tennis.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_Goobstation/Objects/Fun/tennis.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_Goobstation/Objects/Fun/tennis.rsi/tennis_ball.png is excluded by !**/*.png
  • Resources/Textures/_Goobstation/Objects/Fun/tennis.rsi/tennis_bundle_icon.png is excluded by !**/*.png
📒 Files selected for processing (19)
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Resources/Changelog/GoobChangelog.yml
  • Resources/Locale/en-US/_DV/cosmiccult/abilities.ftl
  • Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml
  • Resources/Prototypes/Entities/Objects/Fun/sports.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Fun/tennis.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Textures/_Goobstation/Objects/Fun/tennis.rsi/meta.json
💤 Files with no reviewable changes (3)
  • Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml
  • Resources/Textures/_Goobstation/Objects/Fun/tennis.rsi/meta.json
  • Resources/Prototypes/_Goobstation/Entities/Objects/Fun/tennis.yml
📜 Review details
⏰ Context from checks skipped due to timeout. (4)
  • GitHub Check: YAML Linter
  • 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/Prototypes/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Locale/en-US/_DV/cosmiccult/abilities.ftl
  • Resources/Prototypes/Entities/Objects/Fun/sports.yml
  • Resources/Changelog/GoobChangelog.yml
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/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Prototypes/Entities/Objects/Fun/sports.yml
  • Resources/Changelog/GoobChangelog.yml
Resources/**/*.{yml,ftl}

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

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Locale/en-US/_DV/cosmiccult/abilities.ftl
  • Resources/Prototypes/Entities/Objects/Fun/sports.yml
  • Resources/Changelog/GoobChangelog.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/Roles/Jobs/Civilian/service_worker.yml
  • Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.cs
  • Resources/Prototypes/Entities/Objects/Fun/sports.yml
  • Resources/Changelog/GoobChangelog.yml
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/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Prototypes/Entities/Objects/Fun/sports.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/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Prototypes/Entities/Objects/Fun/sports.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
{**/_Orion,**/_Goobstation,**/_EinsteinEngines,**/_Shitmed,**/_DV,**/_NF,**/_Mono,**/_RMC14,**/_White}/**/*.cs

📄 CodeRabbit inference engine (AGENTS.md)

For Orion-only behavior, prefer existing _Orion folders when they exist. This repository also contains inherited/vendor-specific trees such as _Goobstation, _EinsteinEngines, _Shitmed, _DV, _NF, _Mono, _RMC14, _White, and others; extend the tree that already owns the feature instead of assuming all fork code belongs under _Orion.

Files:

  • Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.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/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.cs
Resources/**/*.ftl

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

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/en-US/_DV/cosmiccult/abilities.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/_DV/cosmiccult/abilities.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/_DV/cosmiccult/abilities.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/_DV/cosmiccult/abilities.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/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.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/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.cs
🧠 Learnings (12)
📚 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/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Prototypes/Entities/Objects/Fun/sports.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/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Prototypes/Entities/Objects/Fun/sports.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/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Prototypes/Entities/Objects/Fun/sports.yml
  • Resources/Changelog/GoobChangelog.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/Roles/Jobs/Civilian/service_worker.yml
  • Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml
  • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml
  • Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml
  • Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml
  • Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml
  • Resources/Prototypes/_DV/Actions/cosmiccult.yml
  • Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
  • Resources/Prototypes/Entities/Objects/Fun/sports.yml
  • Resources/Changelog/GoobChangelog.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.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/_DV/CosmicCult/Components/CosmicColossusComponent.cs
  • Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.cs
📚 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/Loadouts/Miscellaneous/wrists.yml
📚 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/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs
  • Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.cs
🔇 Additional comments (11)
Resources/Changelog/GoobChangelog.yml (1)

24112-24153: LGTM!

Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml (1)

18-18: LGTM!

Also applies to: 25-25, 33-33, 41-41, 48-48, 347-347, 361-361, 375-375, 387-387, 400-400

Resources/Prototypes/_Orion/Loadouts/Miscellaneous/wrists.yml (1)

25-25: LGTM!

Also applies to: 31-31

Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs (1)

49-49: LGTM!

Content.Server/_EinsteinEngines/TelescopicBaton/KnockdownOnHitSystem.cs (1)

11-20: LGTM!

Also applies to: 52-56

Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml (1)

11-11: LGTM!

Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml (1)

73-74: LGTM!

Also applies to: 99-100

Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml (1)

256-257: LGTM!

Also applies to: 398-398

Resources/Prototypes/_DV/CosmicCult/damage_modifier_sets.yml (1)

8-8: LGTM!

Resources/Prototypes/_Goobstation/Catalog/Cargo/cargo_fun.yml (1)

84-85: 🎯 Functional Correctness

Изменение корректно.

Resources/Prototypes/_DV/Loadouts/Miscellaneous/trinkets.yml (1)

9-9: 🎯 Functional Correctness

Оставьте закомментированным.

groupBy: "ring" находится внутри закомментированных блоков loadout, поэтому текущая правка не меняет загружаемые конфигурации.

			> Likely an incorrect or invalid review comment.

{
args.Cancelled = true;
}
AdminLogger.Add(LogType.CanisterTankInserted, LogImpact.Medium, $"Player {ToPrettyString(args.User):player} inserted tank {ToPrettyString(args.Item):tank} into {ToPrettyString(uid):canister}"); // Goobstation

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.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

rg -n -C 12 \
  'ItemSlotInsertAttemptEvent|EntInsertedIntoContainerMessage|CanisterTankInserted|ISharedAdminLogManager|AdminLogger\.Add' \
  Content.Shared Content.Server Content.Client

Repository: ArcaneSS14/arcane

Length of output: 50374


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

# Inspect the shared canister system and nearby handler logic.
sed -n '1,180p' 'Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs'

# Locate admin log type and exact references without large context.
rg -n -C 3 'CanisterTankInserted|OnCanisterInsertAttempt|SubscribeLocalEvent<.*ItemSlotInsertAttemptEvent|RaiseLocalEvent<.*ItemSlotInsertAttemptEvent|ItemSlotInsertAttemptEvent' \
  Content.Shared/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs \
  Content.Server/Atmos Content.Shared/Atmos \
  --glob '*.cs' | head -n 120

Repository: ArcaneSS14/arcane

Length of output: 11599


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

# Find where ItemSlotInsertAttemptEvent is raised/fulfilled and whether cancellation is checked before mutation.
rg -n -C 16 'RaiseLocalEvent<.*ItemSlotInsertAttemptEvent|RaiseLocalEvent\(|RaisePipelinedEvent<.*ItemSlotInsertAttemptEvent|ItemSlotInsertAttemptEvent|class ItemSlotInsertAttemptEvent' Content Shared Interfaces --glob '*.cs' | head -n 220

# Also inspect the shared item slots handler candidates.
rg -n -C 8 'ItemSlotsSystem|ItemSlotInsertAttemptEvent|On.*Attempt|RaisePipelinedEvent' Content.Shared/Containers/Content.Shared/Atmos --glob '*.cs' | head -n 220 || true

Repository: ArcaneSS14/arcane

Length of output: 313


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

# Find where ItemSlotInsertAttemptEvent is raised/fulfilled and whether cancellation is checked before mutation.
rg -n -C 16 'RaiseLocalEvent<.*ItemSlotInsertAttemptEvent|RaiseLocalEvent\(|RaisePipelinedEvent<.*ItemSlotInsertAttemptEvent|ItemSlotInsertAttemptEvent|class ItemSlotInsertAttemptEvent' . --glob '*.cs' | head -n 260

# Also inspect shared slot handlers that are likely candidates.
rg -n -C 8 'ItemSlotsSystem|ItemSlotInsertAttemptEvent|On.*Attempt|RaisePipelinedEvent' Content.Shared/Containers Content.Shared/Atmos contentshared ContentShared --glob '*.cs' || true

Repository: ArcaneSS14/arcane

Length of output: 50373


Записывайте CanisterTankInserted только после успешной вставки предмета.

ItemSlotInsertAttemptEvent поднимается перед проверкой ev.Cancelled; текущий код ставит args.Cancelled = true для открытого клапана или неверного предмета, но после этого всё равно создаёт запись админ-лога. Используйте уже существующий handler EntInsertedIntoContainerMessage для авторитетной точки аудита и передавайте туда контекст вставки вместо пользовательских попыток вставки.

🤖 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/Atmos/Piping/Unary/Systems/SharedGasCanisterSystem.cs` at line
121, Переместите запись LogType.CanisterTankInserted из обработчика
ItemSlotInsertAttemptEvent в уже существующий handler
EntInsertedIntoContainerMessage, чтобы логирование происходило только после
успешной вставки. Передайте в этот handler необходимый контекст вставки и не
логируйте отменённые попытки из ItemSlotInsertAttemptEvent.

Source: Path instructions

Comment thread Resources/Locale/en-US/_DV/cosmiccult/abilities.ftl Outdated
Comment thread Resources/Prototypes/_DV/Actions/cosmiccult.yml
Comment thread Resources/Prototypes/Entities/Objects/Fun/sports.yml
@UmbiMax

UmbiMax commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Куда провал Амбер? Провал тестов

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
pr="168"

echo "== PR checks =="
gh pr checks "$pr" --repo "$repo" --json name,state,workflow,link,bucket

head_sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
echo "== Failed check runs =="
gh api "repos/$repo/commits/$head_sha/check-runs?per_page=100" \
  --jq '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | {id, name, conclusion, details_url, output: {title: .output.title, summary: .output.summary}}'

echo "== Amber references in failed-job logs =="
gh api "repos/$repo/commits/$head_sha/check-runs?per_page=100" \
  --jq -r '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | .details_url' \
  | while IFS= read -r url; do
      run_id="$(printf '%s\n' "$url" | sed -nE 's#.*actions/runs/([0-9]+).*#\1#p')"
      if [ -n "$run_id" ]; then
        gh run view "$run_id" --repo "$repo" --log-failed 2>&1 \
          | rg -in -C 3 'amber|test.*fail|fail.*test|error|exception' \
          || true
      fi
    done

Length of output: 4108


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"

for job in 91657549737 91656425008; do
  echo "== Failed log for job $job =="
  gh run view --repo "$repo" --job "$job" --log-failed 2>&1 | tee "/tmp/job-$job.log" >/dev/null || true

  echo "-- terminal error context --"
  rg -in -C 8 \
    '##\[error\]|error [A-Z]+[0-9]+:|Unhandled exception|System\.[A-Za-z.]+Exception|Exception:|Build FAILED|Process completed with exit code|failed' \
    "/tmp/job-$job.log" \
    | tail -n 220 || true
done

Length of output: 1090


🏁 Script executed:

#!/bin/bash
set -u

repo="ArcaneSS14/arcane"

for job in 91657549737 91656425008; do
  echo "== Failed log for job $job =="
  gh run view --repo "$repo" --job "$job" --log-failed 2>&1 \
    | rg -in -C 10 \
      '##\[error\]|error [A-Z]+[0-9]+:|Unhandled exception|System\.[A-Za-z.]+Exception|Exception:|Build FAILED|Process completed with exit code|failed' \
    | tail -n 240 \
    || true
done

Length of output: 18763


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== PR changes related to Amber and map pools =="
git diff --name-status 'origin/master...HEAD' \
  | rg -i '(^|/)(default\.yml|amber|maps?)(/|$)' \
  || true

echo "== Current map-pool reference =="
pool="$(fd -a '^default\.yml$' Resources 2>/dev/null | rg '/Prototypes/Maps/Pools/default\.yml$' | head -n 1 || true)"
if [ -n "$pool" ]; then
  nl -ba "$pool" | sed -n '1,40p'
fi

echo "== Current Amber prototype definitions and references =="
rg -n -i -C 4 '(^|[[:space:]-])id:[[:space:]]*Amber([[:space:]#]|$)|mapName:[[:space:]]*Amber([[:space:]#]|$)|Amber' \
  Resources/Prototypes/Maps Resources/Maps 2>/dev/null \
  || true

echo "== Base-to-PR changes containing Amber =="
git diff --find-renames --unified=5 'origin/master...HEAD' -- Resources \
  | rg -n -i -C 5 'Amber|Prototypes/Maps/Pools/default\.yml' \
  || true

Length of output: 1291


🏁 Script executed:

#!/bin/bash
set -u

echo "== Map pool files named default.yml =="
fd -a '^default\.yml$' Resources 2>/dev/null \
  | while IFS= read -r file; do
      case "$file" in
        */Prototypes/Maps/Pools/default.yml)
          echo "-- $file --"
          awk 'NR <= 30 { printf "%4d  %s\n", NR, $0 }' "$file"
          ;;
      esac
    done

echo "== Amber references under Resources =="
rg -n -i -C 3 '\bAmber\b' Resources 2>/dev/null || true

echo "== PR diff paths containing map pool or Amber =="
git diff --name-status 'origin/master...HEAD' \
  | rg -i 'Maps/Pools|Amber' \
  || true

echo "== Diff changes to map-pool references =="
git diff --find-renames --unified=4 'origin/master...HEAD' -- Resources \
  | rg -n -i -C 4 'Amber|Maps/Pools/default\.yml' \
  || true

Length of output: 32451


@UmbiMax, да. Я пропустил фактический провал и неверно указал причину.

  • Провал: YAML Linter.
  • Ошибка: Resources/Prototypes/Maps/Pools/default.yml, Line 8:
    No Content.Shared.Maps.GameMapPrototype found with id Amber.
  • Причина: DefaultMapPool содержит - Amber, но в ресурсах нет GameMapPrototype с ID Amber. Файлы карты содержат только BecomesStation id: Amber; этого недостаточно для map pool.
  • Риск: YAML-проверка блокирует PR. Карта Amber не может выбираться из пула.
  • Связь с #168: diff PR не изменяет default.yml и Amber-related map files. Это существующий дефект ветки, не регрессия изменений #168.
  • Исправление: либо убрать Amber из DefaultMapPool, либо вернуть/добавить GameMapPrototype с ID Amber.

Build & Test Debug также красный, но тестовый job помечен SKIPPED: тесты в нём не запускались после провала build job.

You are interacting with an AI system.

@UmbiMax

UmbiMax commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Прототип карты имеется в _Arcane.
Вот его конфиг, но он старый. Какие роли ещё упустили?

  • type: gameMap
    id: Amber
    mapName: 'Amber'
    mapPath: /Maps/_Goobstation/amber.yml
    minPlayers: 7
    maxPlayers: 50
    stations:
    Amber:
    stationProto: StandardNanotrasenStation
    components:
    - type: StationNameSetup
    mapNameTemplate: '{0} Amber Station {1}'
    nameGenerator:
    !type:NanotrasenNameGenerator
    prefixCreator: '14-SB'
    - type: StationEmergencyShuttle
    emergencyShuttlePath: /Maps/Shuttles/emergency_amber.yml
    - type: StationJobs
    availableJobs:
    #service
    Captain: [ 1, 1 ]
    HeadOfPersonnel: [ 1, 1 ]
    NanotrasenRepresentative: [ 1, 1 ]
    BlueshieldOfficer: [ 1, 1 ]
    Bartender: [ 1, 1 ]
    Botanist: [ 2, 2 ]
    Chef: [ 1, 1 ]
    Janitor: [ 2, 2 ]
    Chaplain: [ 1, 1 ]
    Librarian: [ 1, 1 ]
    ServiceWorker: [ 1, 3 ]
    Reporter: [ 1, 1 ]
    RadioHost: [ 1, 1 ]
    #engineering
    ChiefEngineer: [ 1, 1 ]
    AtmosphericTechnician: [ 2, 2 ]
    StationEngineer: [ 2, 4 ]
    TechnicalAssistant: [ 1, 1 ]
    #medical
    ChiefMedicalOfficer: [ 1, 1 ]
    Chemist: [ 2, 2 ]
    MedicalDoctor: [ 2, 4 ]
    Paramedic: [ 2, 2 ]
    MedicalIntern: [ 1, 2 ]
    Psychologist: [ 1, 1 ]
    #science
    ResearchDirector: [ 1, 1 ]
    Scientist: [ 4, 4 ]
    ResearchAssistant: [ 1, 2 ]
    #security
    HeadOfSecurity: [ 1, 1 ]
    Warden: [ 1, 1 ]
    SecurityOfficer: [ 4, 4 ]
    Detective: [ 1, 1 ]
    SecurityCadet: [ 1, 1 ]
    Lawyer: [ 1, 1 ]
    #supply
    Quartermaster: [ 1, 1 ]
    SalvageSpecialist: [ 3, 3 ]
    ShaftMiner: [ 3, 3 ]
    CargoTechnician: [ 2, 3 ]
    #civilian
    Passenger: [ -1, -1 ]
    Clown: [ 1, 1 ]
    Mime: [ 1, 1 ]
    Musician: [ 1, 1 ]
    #silicon
    StationAi: [ 1, 1 ]
    Borg: [ 2, 2 ]

    Goobstation blob-config-start MEDIUM

      - type: StationBlobConfig
        stageBegin: 40
        stageCritical: 300
        stageTheEnd: 750
      # backmen blob-config-end
    

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Amber gameMap definitions =="
rg -n -i -C 8 '^\s*id:\s*Amber\s*$|^\s*mapName:\s*['\''"]?Amber' Resources/Prototypes 2>/dev/null || true

echo
echo "== YAML files under _Arcane that mention Amber =="
fd -a -e yml -e yaml . Resources/Prototypes/_Arcane 2>/dev/null \
  | while IFS= read -r file; do
      if rg -q -i '\bAmber\b' "$file"; then
        echo "-- $file --"
        rg -n -i -C 5 '\bAmber\b|availableJobs:' "$file"
      fi
    done

echo
echo "== StationJobs role lists from map prototypes =="
fd -a -e yml -e yaml . Resources/Prototypes/Maps Resources/Prototypes/_Arcane 2>/dev/null \
  | while IFS= read -r file; do
      if rg -q '^\s*-\s*type:\s*StationJobs\s*$' "$file"; then
        echo "-- $file --"
        awk '
          /^[[:space:]]*-[[:space:]]*type:[[:space:]]*StationJobs[[:space:]]*$/ { on=1 }
          on { print }
          on && /^[[:space:]]*-[[:space:]]*type:/ && $0 !~ /StationJobs/ { exit }
        ' "$file"
      fi
    done

echo
echo "== Registered job prototype IDs =="
fd -a -e yml -e yaml . Resources/Prototypes/Roles Resources/Prototypes/_Arcane 2>/dev/null \
  | xargs -r rg -n -P '^\s*id:\s*[A-Za-z][A-Za-z0-9]*\s*$' \
  | head -n 1200

Length of output: 159911


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Candidate role definitions =="
for role in Adjutant CommandMaid Roboticist IAA Brigmedic Virologist; do
  echo "-- $role --"
  rg -n -U -P "(?s)- type: job\\R\\s*id:\\s*${role}\\b" Resources/Prototypes 2>/dev/null || true
done

echo
echo "== Candidate role use in map StationJobs =="
for role in Adjutant CommandMaid Roboticist IAA Brigmedic Virologist; do
  printf '%-14s ' "$role"
  rg -l -P "^[[:space:]]*${role}:\\s*\\[" Resources/Prototypes/Maps Resources/Prototypes/_Arcane/Maps 2>/dev/null \
    | wc -l
  rg -n -P "^[[:space:]]*${role}:\\s*\\[" Resources/Prototypes/Maps Resources/Prototypes/_Arcane/Maps 2>/dev/null || true
done

echo
echo "== All role IDs used by standard map prototypes but absent from supplied Amber list =="
python3 - <<'PY'
from pathlib import Path
import re
amber = {
"Captain","HeadOfPersonnel","NanotrasenRepresentative","BlueshieldOfficer",
"Bartender","Botanist","Chef","Janitor","Chaplain","Librarian","ServiceWorker",
"Reporter","RadioHost","ChiefEngineer","AtmosphericTechnician","StationEngineer",
"TechnicalAssistant","ChiefMedicalOfficer","Chemist","MedicalDoctor","Paramedic",
"MedicalIntern","Psychologist","ResearchDirector","Scientist","ResearchAssistant",
"HeadOfSecurity","Warden","SecurityOfficer","Detective","SecurityCadet","Lawyer",
"Quartermaster","SalvageSpecialist","ShaftMiner","CargoTechnician","Passenger",
"Clown","Mime","Musician","StationAi","Borg",
}
counts = {}
for root in ("Resources/Prototypes/Maps", "Resources/Prototypes/_Arcane/Maps"):
    for path in Path(root).rglob("*.yml"):
        text = path.read_text(encoding="utf-8")
        if "type: StationJobs" not in text:
            continue
        for role in re.findall(r"(?m)^\s{12}([A-Za-z][A-Za-z0-9]*):\s*\[", text):
            counts.setdefault(role, set()).add(str(path))
for role in sorted(set(counts) - amber):
    print(f"{role}: {len(counts[role])} map(s): {', '.join(sorted(counts[role]))}")
PY

Length of output: 9913


@UmbiMax, для Amber упущены пять актуальных ролей:

# Command
Adjutant: [ 1, 1 ]
CommandMaid: [ 1, 1 ]

# Science
Roboticist: [ 1, 1 ]

# Security
IAA: [ 1, 1 ]
Brigmedic: [ 1, 1 ]

Adjutant и CommandMaid есть на 14 картах. IAA и Brigmedic есть на 12 картах. Roboticist есть на box, fland, meta и WonderBox.

Virologist также существует как job-прототип, но сейчас он добавлен только в Resources/Prototypes/_Arcane/Maps/WonderBox.yml. Добавляйте его в Amber только если на карте есть корректные спавн-точка и оснащение для вирусолога.

Отдельно: в текущем checkout PR gameMap с ID Amber не найден, включая Resources/Prototypes/_Arcane. Поэтому YAML Linter прав для состояния этой ветки: предоставленный старый конфиг должен быть добавлен или восстановлен в загружаемом YAML-файле.

You are interacting with an AI system.

@UmbiMax

UmbiMax commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Причины провала тестов?

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
pr="168"

echo "== Checks =="
gh pr checks "$pr" --repo "$repo" --json name,state,workflow,link,bucket

sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
echo "== Failed check runs =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | {id, name, conclusion, details_url, output: {title: .output.title, summary: .output.summary}}'

echo "== Failed job log errors =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq -r '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | .details_url' \
  | sed -nE 's#.*actions/runs/([0-9]+).*#\1#p' \
  | sort -u \
  | while IFS= read -r run; do
      echo "-- run $run --"
      gh run view "$run" --repo "$repo" --log-failed 2>&1 \
        | rg -in -C 6 '##\[error\]|Unhandled exception|Exception:|error [A-Z]+[0-9]+:|Build FAILED|Test Run Failed|failed|No .* found with id|duplicate|already exists' \
        | tail -n 240 || true
    done

Length of output: 1336


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
pr="168"

echo "== Checks =="
gh pr checks "$pr" --repo "$repo" --json name,state,workflow,link,bucket

sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
echo "== Failed check runs =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | {id, name, conclusion, details_url, output: {title: .output.title, summary: .output.summary}}'

echo "== Error context from failed runs =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq -r '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | .details_url' \
  | sed -nE 's#.*actions/runs/([0-9]+).*#\1#p' \
  | sort -u \
  | while IFS= read -r run; do
      echo "-- run $run --"
      gh run view "$run" --repo "$repo" --log-failed 2>&1 \
        | rg -in -C 5 '##\[error\]|Unhandled exception|Exception:|error [A-Z]+[0-9]+:|Build FAILED|Test Run Failed|No .* found with id|duplicate|already exists|FAILED' \
        | tail -n 240 || true
    done

Length of output: 1345


@UmbiMax, последняя подтверждённая причина провала:

  • YAML Linter: Resources/Prototypes/Maps/Pools/default.yml, Line 8 содержит Amber, но загрузчик не находит GameMapPrototype с ID Amber.
    Ошибка: No Content.Shared.Maps.GameMapPrototype found with id Amber.

  • Build & Test Debug: job тестов не выполнился, потому что build/check завершился раньше. Это не отдельный провал тестового сценария.

Причина в ветке: конфиг gameMap для Amber находится в _Arcane, но текущая проверяемая конфигурация его не загружает или не содержит в checkout PR. Нужно добавить/восстановить этот YAML в загружаемом пути либо удалить Amber из DefaultMapPool.

Повторная проверка текущих логов не удалась из-за ошибки доступа sandbox к репозиторию, поэтому актуальный статус после последних изменений не подтверждён.

(\_/) ( •_•)

You are interacting with an AI system.

@UmbiMax

UmbiMax commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Снова смотри, а не говори старое. Я пофиксил некоторую часть.

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
pr="168"

sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
echo "== PR head =="
echo "$sha"

echo "== Checks =="
gh pr checks "$pr" --repo "$repo" --json name,state,workflow,link,bucket

echo "== Non-successful check runs =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | {id, name, conclusion, details_url, output: {title: .output.title, summary: .output.summary}}'

echo "== Failed job logs: terminal error context =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq -r '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | .details_url' \
  | sed -nE 's#.*actions/runs/([0-9]+).*#\1#p' \
  | sort -u \
  | while IFS= read -r run; do
      echo "-- run $run --"
      gh run view "$run" --repo "$repo" --log-failed 2>&1 \
        | rg -in -C 8 \
          '##\[error\]|Unhandled exception|System\.[A-Za-z.]+Exception|Exception:|error [A-Z]+[0-9]+:|Build FAILED|Test Run Failed|No .* found with id|FAILED|failed|Assertion|Expected:' \
        | tail -n 280 || true
    done

Length of output: 4117


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
job="91690071067"

echo "== Job metadata =="
gh api "repos/$repo/actions/jobs/$job" \
  --jq '{name, conclusion, started_at, completed_at, html_url, steps: [.steps[] | {number, name, conclusion}]}'

echo "== Failed log =="
gh run view --repo "$repo" --job "$job" --log-failed 2>&1 \
  | tee /tmp/current-debug-build-failure.log

echo "== Error summary =="
rg -in -C 10 \
  '##\[error\]|error [A-Z]+[0-9]+:|Unhandled exception|System\.[A-Za-z.]+Exception|Exception:|Build FAILED|Process completed with exit code|FAILED' \
  /tmp/current-debug-build-failure.log \
  | tail -n 260 || true

Length of output: 2088


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
run="30814868592"
job="91690071067"

echo "== Workflow run =="
gh api "repos/$repo/actions/runs/$run" \
  --jq '{status, conclusion, event, created_at, updated_at, run_started_at, html_url, cancellation_reason: .cancellation_reason}'

echo "== Job log =="
gh run view "$run" --repo "$repo" --job "$job" --log 2>&1 > /tmp/debug-job.log || true
sed -n '1,20p' /tmp/debug-job.log
echo "== Integration-test context =="
rg -in -C 20 \
  'Run Content\.IntegrationTests|Content\.IntegrationTests|cancelled|canceled|timeout|timed out|##\[error\]|Unhandled exception|Exception:|Test Run Failed|FAILED' \
  /tmp/debug-job.log \
  | tail -n 360 || true

Length of output: 87243


@UmbiMax, актуальная причина теперь другая.

  • YAML Linter, проверка схемы карт, Map Renderer и Test Packaging проходят. Проблема Amber устранена.
  • Сборка проходит: 0 Error(s).
  • Content.Tests проходят: 372 passed, 1 skipped.
  • Падает интеграционный тест PostMapInitTest.GameMapsLoadableTest("Box").

Точная ошибка:

There is no spawnpoints for ShaftMiner on Box.

В Box роль ShaftMiner доступна в StationJobs, но на карте нет её спавн-точки. Исправление: добавить spawn point для ShaftMiner в /Maps/_Arcane/box.yml либо убрать ShaftMiner из списка доступных ролей карты Box.

После этого теста job завершился с The operation was canceled., поэтому последующие интеграционные тесты не дали полного результата. Это не ошибка сборки и не регрессия Amber.

You are interacting with an AI system.

@UmbiMax

UmbiMax commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Kевее SpawnPointSalvageSpecialist бы поставить, но какие uid выдать? Думаю сразу вставить в прототип карты спавнер

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Box map candidates =="
fd -a -i '^box\.yml$' Resources/Maps Resources 2>/dev/null || true

echo
echo "== Spawn-point entities in Box map candidates =="
fd -a -i '^box\.yml$' Resources/Maps Resources 2>/dev/null \
  | while IFS= read -r file; do
      echo "-- $file --"
      rg -n -i -C 3 'prototype: SpawnPoint(ShaftMiner|SalvageSpecialist)|uid:|entityId:' "$file" || true
    done

echo
echo "== Existing SpawnPointShaftMiner and SpawnPointSalvageSpecialist map usage =="
rg -n -i -C 2 'prototype:\s*SpawnPoint(ShaftMiner|SalvageSpecialist)' Resources/Maps 2>/dev/null || true

Length of output: 700


@UmbiMax Не могу назвать безопасный UID: checkout PR не клонировался, поэтому UID в box.yml не проверен.

Для исправления текущего теста добавьте именно SpawnPointShaftMiner, а не SpawnPointSalvageSpecialist. UID должен быть уникальным среди entities в /Maps/_Arcane/box.yml. Если вы добавляете оба спавнера, назначьте каждому новый уникальный UID из того же диапазона, что и соседние entity в карте.

Повторите проверку после доступного checkout.

You are interacting with an AI system.

@UmbiMax

UmbiMax commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Сюда бы в виде вставочного кода в прототип карты ввести майнеров. Накинь вариацию в виде suggestion.
К примеру вставить

  • proto: SpawnPointSalvageSpecialist
    entities:
    • uid: 22280
      components:
      • type: Transform
        pos: -37.5,-33.5
        parent: 2
    • uid: 22281
      components:
      • type: Transform
        pos: -37.5,-34.5
        parent: 2
    • uid: 22282
      components:
      • type: Transform
        pos: -37.5,-35.5
        parent: 2

        Но с прото SpawnPointShaftMiner

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@UmbiMax Добавь этот блок в entities прототипа карты Box:

- proto: SpawnPointShaftMiner
  entities:
  - uid: 22280
    components:
    - type: Transform
      pos: -37.5,-33.5
      parent: 2
  - uid: 22281
    components:
    - type: Transform
      pos: -37.5,-34.5
      parent: 2
  - uid: 22282
    components:
    - type: Transform
      pos: -37.5,-35.5
      parent: 2

UID 2228022282 должны быть уникальны в файле карты. Три точки соответствуют лимиту ShaftMiner: [ 3, 3 ].

You are interacting with an AI system.

@UmbiMax

UmbiMax commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Нам бы особые новые uid для данных точек спавна

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Box map candidates =="
fd -a -i '^box\.yml$' Resources 2>/dev/null || true

echo
echo "== UID statistics and highest UIDs =="
fd -a -i '^box\.yml$' Resources 2>/dev/null \
  | while IFS= read -r file; do
      echo "-- $file --"
      awk '
        /^[[:space:]]*- uid:[[:space:]]*[0-9]+[[:space:]]*$/ {
          value = $3 + 0
          if (value > max) max = value
          seen[value]++
        }
        END {
          dupes = 0
          for (id in seen) if (seen[id] > 1) dupes++
          printf "max_uid=%d, unique_uids=%d, duplicate_uid_values=%d\n", max, length(seen), dupes
        }
      ' "$file"
      rg -n -C 3 '^\s*- uid:\s*(222[0-9]{2}|[0-9]{5,})\s*$|prototype:\s*SpawnPoint(ShaftMiner|SalvageSpecialist)' "$file" \
        | tail -n 160 || true
    done

Length of output: 10186


@UmbiMax Используй UID 5770957711 в Resources/Maps/_Arcane/box.yml.

В этом файле максимальный существующий UID — 57708. Дубликатов UID нет.

- proto: SpawnPointShaftMiner
  entities:
  - uid: 57709
    components:
    - type: Transform
      pos: -37.5,-33.5
      parent: 2
  - uid: 57710
    components:
    - type: Transform
      pos: -37.5,-34.5
      parent: 2
  - uid: 57711
    components:
    - type: Transform
      pos: -37.5,-35.5
      parent: 2

Не используй 2228022282: это значения из старого диапазона карты.

You are interacting with an AI system.

@UmbiMax

UmbiMax commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Причины провалов тестов?

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
pr="168"

sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
echo "== PR head =="
printf '%s\n' "$sha"

echo "== Checks =="
gh pr checks "$pr" --repo "$repo" --json name,state,workflow,link,bucket

echo "== Non-successful check runs =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | {id, name, conclusion, details_url, output: {title: .output.title, summary: .output.summary}}'

echo "== Failed-run log context =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq -r '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | .details_url' \
  | sed -nE 's#.*actions/runs/([0-9]+).*#\1#p' \
  | sort -u \
  | while IFS= read -r run; do
      echo "-- run $run --"
      gh run view "$run" --repo "$repo" --log-failed 2>&1 \
        | rg -in -C 12 \
          '##\[error\]|Unhandled exception|System\.[A-Za-z.]+Exception|Exception:|error [A-Z]+[0-9]+:|Build FAILED|Test Run Failed|There is no spawnpoints|No .* found with id|Assertion|Expected:|FAILED|failed|cancelled|canceled|timeout|timed out' \
        | tail -n 360 || true
    done

Length of output: 1492


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
pr="168"

sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
echo "== PR head =="
printf '%s\n' "$sha"

echo "== Checks =="
gh pr checks "$pr" --repo "$repo" --json name,state,workflow,link,bucket

echo "== Non-successful check runs =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | {id, name, conclusion, details_url, output: {title: .output.title, summary: .output.summary}}'

echo "== Failed-run error context =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq -r '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | .details_url' \
  | sed -nE 's#.*actions/runs/([0-9]+).*#\1#p' \
  | sort -u \
  | while IFS= read -r run; do
      echo "-- run $run --"
      gh run view "$run" --repo "$repo" --log-failed 2>&1 \
        | rg -in -C 10 \
          '##\[error\]|Unhandled exception|System\.[A-Za-z.]+Exception|Exception:|error [A-Z]+[0-9]+:|Build FAILED|Test Run Failed|There is no spawnpoints|No .* found with id|Assertion|Expected:|FAILED|failed|cancelled|canceled|timeout|timed out' \
        | tail -n 360 || true
    done

Length of output: 1494


@UmbiMax, не могу подтвердить актуальные причины: оба запроса завершились ошибкой доступа Repository access failed (clone). Второй запрос не требовал checkout, но среда всё равно попыталась клонировать репозиторий.

Старые данные не повторяю, потому что после ваших изменений они могут быть неверны. Повторите запрос после восстановления доступа sandbox к ArcaneSS14/arcane; тогда я возьму текущий SHA и укажу точную ошибку каждого failed check.

You are interacting with an AI system.

@UmbiMax

UmbiMax commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Напиши все причины провала тестов.

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
pr="168"

sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
printf 'HEAD=%s\n' "$sha"

echo "== Checks =="
gh pr checks "$pr" --repo "$repo" --json name,state,workflow,link,bucket

echo "== Non-successful check runs =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | {id, name, conclusion, details_url, output: {title: .output.title, summary: .output.summary}}'

echo "== Failed job logs =="
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" \
  --jq -r '.check_runs[]
    | select(.conclusion == "failure" or .conclusion == "timed_out" or .conclusion == "cancelled" or .conclusion == "action_required")
    | .details_url' \
  | sed -nE 's#.*actions/runs/([0-9]+).*#\1#p' \
  | sort -u \
  | while IFS= read -r run; do
      echo "-- Run $run --"
      gh run view "$run" --repo "$repo" --log-failed 2>&1 \
        | rg -in -C 10 \
          '##\[error\]|Unhandled exception|System\.[A-Za-z.]+Exception|Exception:|error [A-Z]+[0-9]+:|Build FAILED|Test Run Failed|There is no spawnpoints|No .* found with id|Assertion|Expected:|FAILED|failed|cancelled|canceled|timeout|timed out' \
        | tail -n 500 || true
    done

Length of output: 4115


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
run="30836192629"
job="91761842136"

echo "== Failed job metadata =="
gh api "repos/$repo/actions/jobs/$job" \
  --jq '{name, conclusion, started_at, completed_at, html_url, steps: [.steps[] | {number, name, conclusion}]}'

echo "== Failed log context =="
gh run view "$run" --repo "$repo" --log-failed 2>&1 \
  | rg -in -C 12 \
    '##\[error\]|Unhandled exception|System\.[A-Za-z.]+Exception|Exception:|error [A-Z]+[0-9]+:|Build FAILED|Test Run Failed|There is no spawnpoints|No .* found with id|Assertion|Expected:|FAILED|failed|cancelled|canceled|timeout|timed out' \
  | tail -n 500 || true

Length of output: 85590


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ArcaneSS14/arcane"
run="30836192629"

gh run view "$run" --repo "$repo" --log > /tmp/pr168-run.log

echo "== Pair 5 and client termination context =="
rg -in -C 20 \
  'pair 5|TestBaseTurfRecursion|client.*(killed|crash|exit|disconnect)|server.*(killed|crash|exit)|fatal|critical|unhandled|exception|segmentation|out of memory|oom|assert' \
  /tmp/pr168-run.log \
  | sed -n '1,900p'

echo "== Test results in execution order =="
rg -n \
  '^\S+.*(Failed|Passed|Skipped) [A-Za-z0-9_.]+\s*\[' \
  /tmp/pr168-run.log \
  | tail -n 100

Length of output: 169507


@UmbiMax, на текущем HEAD есть две первичные причины провала Build & Test Debug.

  1. ResearchTest.AllTechPrintableTest
    Конфигурация исследований и lathe-рецептов несогласована.

    • Несколько рецептов принадлежат технологии, но не доступны ни на одном lathe. Примеры: Bloodpack, SawElectric, ClothingNeckStethoscope, MedicalBeamGunSyndicate, MedicalRecordsComputerCircuitboard, CrewMonitoringComputerCircuitboard.
    • Несколько динамических рецептов доступны на lathe, но не могут быть открыты исследованием. Примеры: VoiceSensor, BoxFolderClipboardEmpty, TowelColorWhite, MaterialDurathread, JetInjector, BorgModuleInflatable.

    Исправление: для каждого рецепта синхронизировать technology/tech и список доступных lathe. Рецепт с технологией должен печататься хотя бы на одном lathe. Динамический рецепт должен иметь доступную технологию или не быть динамическим.

  2. Tiles.TileStackRecursionTest.TestBaseTurfRecursion
    Во время очистки test pair 5 интеграционный клиент завершился. Ошибка теста:

    CleanReturnAsync: Test killed the client in pair 5
    

    Лог не содержит исключение или crash-report самого клиента. Поэтому источник завершения клиента по этому запуску не установлен. Нужен воспроизводимый запуск с клиентским логом или core dump.

После второго сбоя test pool перестал работать. Поэтому ещё 19 тестов упали каскадно с:

System.InvalidOperationException: Pool manager has not been initialized

Каскадные сбои включают DispenseItemTest, InteractUITest, RepairTest, тесты restock, GunRequiresWieldTest, WeldLocker, TestLayoutInheritance, MicrowaveRecipesFreezeTest, тесты XenoArtifact* и SpawnAndDeleteAllEntitiesOnDifferentMaps. Их не надо исправлять отдельно до устранения остановки клиента.

YAML Linter, Map Renderer, YAML map schema validator и Test Packaging проходят. Проблема Amber устранена.

You are interacting with an AI system.

@UmbiMax
UmbiMax merged commit 7ce69f7 into ArcaneSS14:master Aug 4, 2026
11 of 12 checks passed
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.