Skip to content

Manager of Assistants - Part 2 & ID card computer QOL - #5546

Merged
walksanatora merged 11 commits into
ss14Starlight:starlight-devfrom
bynddark8:assistant-manager
Aug 18, 2026
Merged

Manager of Assistants - Part 2 & ID card computer QOL#5546
walksanatora merged 11 commits into
ss14Starlight:starlight-devfrom
bynddark8:assistant-manager

Conversation

@bynddark8

@bynddark8 bynddark8 commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Short description

Part 2 of #5528, as requested in #4183.

This PR purely implements the Assistant Manager's task master digi-board and the code required to make it work. The job configuration, clothing sprites, and loadout are all in part 1.

This PR does (4) things to provide implementation for the Assistant Manager:

  • Repurposes the Agent ID UI to allow for the changing an ID card's HUD icon without changing the appearance or access of that ID card. This functionality is utilized in IdCardConsoleSystem and the newly created JobIdentityConsoleSystem.
  • Introduces JobIdentityConsoleSystem, which is effectively an ID card computer that can change an ID card's job title and HUD icon without reading or writing access tags. This interface is accessible through a new item: the task master digi-board, which allows Assistant Managers to set the job titles and HUD icons of their subordinates for more effective task delegation.
  • Creates 8 new "job" icons the Assistant manager can assign through their digi-board. The digiboard also has a new sprite based off the HOP's own bureaucratic digiboard.
  • Introduces the ability to "tag" job icons in job.yml. Consoles will listen for icons that have a tag that matches that console's designated faction. This functionality is used to limit the HUD icons available to both the Assistant Manager and anyone with access to the ID card computer. Naturally, emagging an ID card computer will now allow its user to access every icon. The universal ID card computer bypasses this functionality and will display every job icon by default.

Why we need to add this

Brief summary, reasoning explained more in depth in the original issue.
Highpop/Alpha consistently struggles with shittery and idleness with a regular population of 50+ assistants as a result of limited job slots. This kind of behavior among assistants places additional strain on command/security players alongside the administrative team to maintain adequate levels of roleplay standards. By placing trusted (whitelisted) players in a position to organize and coordinate this population, assistants will hopefully actually assist the crew and contribute more meaningfully to roleplay and create less friction in the course of a round.

Media (Video/Screenshots)

image

fig 1. task master digi-board sprites

Screenshot 2026-08-06 152301

fig 2. Assistant "Job" icons (from left to right): shopkeeper, delivery boy, gardener, cook assistant, handyman, clerical assistant, religious assistant, medical assistant.

image

fig 3. the task master digi-board

Screenshot 2026-08-06 130642

fig 4. the ID card computer

Screenshot 2026-08-06 154250

fig 5. an emagged ID card computer

Checks

  • I do not require assistance to complete the PR.
  • Before posting/requesting review of a PR, I have verified that the changes work.
  • I have added screenshots/videos of the changes, or this PR does not change in-game mechanics.
  • I affirm that my changes are licensed under the MIT License and grant permission for use in this repository under its conditions.

Changelog

🆑 bynddark8

  • add: Introduces the Assistant Manager's task master digi-board, which allows them to change the job titles and HUD icons of their yellow gloved underlings.
  • tweak: Adds the task master digi-board to the Assistant Manager's loadout.
  • add: Adds 8 new sprites for informal "job" icons that can be assigned by the Assistant Manager.
  • add: Introduces the ability to the HUD icon associated with an ID card without changing its access on an ID card computer.
  • add: Emagging an ID card computer will allow its user to set their HUD icons to non-corporate approved imagery.

@bynddark8
bynddark8 requested a review from a team August 6, 2026 22:24
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 39b74a8e-84fe-4549-a1bc-3d032045eaaa

📥 Commits

Reviewing files that changed from the base of the PR and between 99f5789 and 9fff426.

⛔ Files ignored due to path filters (16)
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/ClericalAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/CookAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/DeliveryAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/GardenerAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/HandymanAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/MedicalAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/ReligiousAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/ShopkeeperAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/am_clipboard.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/am_clipboard_over.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/hop_clipboard_paper.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/hop_clipboard_pen.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/hop_clipboard_priv_id.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/hop_clipboard_target_id.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/inhand-hopboard-left.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/inhand-hopboard-right.png is excluded by !**/*.png
📒 Files selected for processing (21)
  • Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs
  • Content.Client/Access/UI/IdCardConsoleWindow.xaml
  • Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleBoundUserInterface.cs
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleWindow.xaml
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleWindow.xaml.cs
  • Content.Server/Access/Systems/IdCardConsoleSystem.cs
  • Content.Server/_Starlight/Access/Systems/JobIdentityConsoleSystem.cs
  • Content.Shared/Access/Components/IdCardConsoleComponent.cs
  • Content.Shared/Access/Systems/SharedIdCardConsoleSystem.cs
  • Content.Shared/StatusIcon/StatusIconPrototype.cs
  • Content.Shared/_Starlight/Access/Components/JobIdentityConsoleComponent.cs
  • Content.Shared/_Starlight/Access/Systems/SharedJobIdentityConsoleSystem.cs
  • Resources/Locale/en-US/_Starlight/job/job-names.ftl
  • Resources/Prototypes/StatusIcon/job.yml
  • Resources/Prototypes/_Starlight/Entities/Objects/Misc/folders.yml
  • Resources/Prototypes/_Starlight/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_Starlight/StatusIcon/job.yml
  • Resources/Prototypes/_Starlight/tags.yml
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/meta.json
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/meta.json
🚧 Files skipped from review as they are similar to previous changes (18)
  • Content.Client/Access/UI/IdCardConsoleWindow.xaml
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/meta.json
  • Content.Shared/StatusIcon/StatusIconPrototype.cs
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/meta.json
  • Content.Shared/Access/Systems/SharedIdCardConsoleSystem.cs
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleWindow.xaml
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleBoundUserInterface.cs
  • Resources/Prototypes/_Starlight/tags.yml
  • Resources/Prototypes/_Starlight/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Locale/en-US/_Starlight/job/job-names.ftl
  • Content.Server/Access/Systems/IdCardConsoleSystem.cs
  • Resources/Prototypes/_Starlight/Entities/Objects/Misc/folders.yml
  • Content.Shared/_Starlight/Access/Components/JobIdentityConsoleComponent.cs
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleWindow.xaml.cs
  • Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs
  • Resources/Prototypes/StatusIcon/job.yml
  • Content.Server/_Starlight/Access/Systems/JobIdentityConsoleSystem.cs
  • Content.Shared/Access/Components/IdCardConsoleComponent.cs

Included review availability: Your plan includes up to 2 reviews per rolling hour; 1 remains after this review.


📝 Walkthrough

Summary

Adds Assistant Manager tools for changing assistant job titles and HUD icons.

User impact

Assistant Managers can assign assistant job titles and HUD icons without changing ID card access. ID card computers filter icons by console tags. Emagged consoles unlock all icons. Universal consoles show all icons.

Notable upstream changes

  • Adds JobIdentityConsoleSystem and its client UI.
  • Extends ID card consoles with job-icon selection and state handling.
  • Adds authorization and server-side validation for privileged IDs, target IDs, job titles, and job icons.
  • Adds job-icon tags to restrict icons by faction and console type.
  • Adds the Assistant Manager clipboard with restricted job-identity controls.
  • Adds eight assistant job icons, sprites, and localized job names.
  • Configures universal ID card computers to unlock all job icons.

Risk areas

  • Server authorization must prevent unauthorized ID-card changes.
  • Client icon filtering must match server-side tag validation.
  • Emagged and universal console access expands the available icon set by design.
  • Explicit icon selection must remain consistent with job presets and station records.
  • New UI slot handling and job-icon state require regression coverage.

Guideline gaps

  • The PR body does not state the rationale for Shared versus Starlight file placement.
  • The PR body does not identify Starlight ownership comments for the new systems and prototypes.
  • The PR body does not describe the breaking impact of the updated public method and message signatures.
  • The PR body does not explain the design impact of repurposing Agent ID functionality or adding the Assistant Manager clipboard.

Walkthrough

The PR adds selectable job icons to ID card consoles with tag filtering and EMAG unlocking. It adds a privileged job identity console for changing titles and icons. It adds Assistant Manager job icons, localization, prototypes, and clipboard assets.

Changes

Job identity and icon management

Layer / File(s) Summary
Shared job-icon and console contracts
Content.Shared/Access/..., Content.Shared/StatusIcon/..., Content.Shared/_Starlight/Access/...
Shared messages and UI state now carry selected icons and unlock status. Job icons support classification tags.
ID card console icon selection and persistence
Content.Client/Access/UI/..., Content.Server/Access/Systems/IdCardConsoleSystem.cs
The ID card console displays filtered icons. The server validates and persists explicit icons, with EMAG-based unlock support.
Authorized job identity console
Content.Client/_Starlight/Access/UI/..., Content.Server/_Starlight/Access/Systems/..., Resources/Prototypes/_Starlight/Entities/Objects/Misc/folders.yml
A dual-ID console validates privileged access and required tags before updating a target ID card’s title and icon.
Icon catalog and Assistant Manager assets
Resources/Prototypes/..., Resources/Locale/..., Resources/Textures/...
Job-icon tags, assistant job prototypes, localization, clipboard configuration, and texture metadata are added. The universal ID console unlocks all icons.

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

Merge Risk: ⚪ Minimal · up to 9fff4

This change adds Assistant Manager ID-card tooling and related job icons; no actionable merge-blocking risk remains beyond normal checks and review.

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant JobIdentityConsoleWindow
  participant JobIdentityConsoleBoundUserInterface
  participant JobIdentityConsoleSystem
  participant TargetIdCard
  Operator->>JobIdentityConsoleWindow: Select title and job icon
  JobIdentityConsoleWindow->>JobIdentityConsoleBoundUserInterface: Submit console request
  JobIdentityConsoleBoundUserInterface->>JobIdentityConsoleSystem: WriteJobIdentityMessage
  JobIdentityConsoleSystem->>TargetIdCard: Apply validated title and icon
  JobIdentityConsoleSystem-->>JobIdentityConsoleWindow: Publish updated identity state
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.08% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Title check ✅ Passed The title clearly identifies the Assistant Manager feature set and the related ID card computer improvements.
Description check ✅ Passed The description directly explains the task master digi-board, job icons, ID card changes, access restrictions, and intended gameplay purpose.

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.

@Conflee Conflee 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.

Sprites approved.

@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: 7

🧹 Nitpick comments (4)
Content.Shared/_Starlight/Access/Components/JobIdentityConsoleComponent.cs (1)

28-31: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Correct the RequiredTags documentation and use an XML doc comment.

The comment names JobIconPrototype.AllowSelection and allIconsUnlocked. Neither applies to this component: the filter here is newJobIcon.Tags.Overlaps(component.RequiredTags) in Content.Server/_Starlight/Access/Systems/JobIdentityConsoleSystem.cs Lines 62-63, and there is no unlock override on JobIdentityConsoleComponent. Also state the fail-closed behavior, because an empty set rejects every icon.

📝 Proposed doc
-    /// Through "JobIconPrototype.AllowSelection" a console will only display icons that match the tag set in job.yml with the tag on the console, unless overided by allIconsUnlocked
-
+    /// <summary>
+    ///     Icons are selectable on this console only if <see cref="JobIconPrototype.Tags"/> overlaps this set.
+    ///     An empty set rejects every icon.
+    /// </summary>
     [DataField, AutoNetworkedField]
     public HashSet<ProtoId<TagPrototype>> RequiredTags = new();

As per path instructions: "Add accurate XML documentation to public/reusable methods, component fields, and parameters when it materially helps callers."

🤖 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/_Starlight/Access/Components/JobIdentityConsoleComponent.cs`
around lines 28 - 31, Replace the existing documentation above
JobIdentityConsoleComponent.RequiredTags with an accurate XML doc comment.
Describe that icons are accepted when newJobIcon.Tags overlaps the required
tags, and explicitly state that an empty RequiredTags set rejects every icon;
remove references to JobIconPrototype.AllowSelection and allIconsUnlocked.

Source: Path instructions

Content.Shared/_Starlight/Access/Systems/SharedJobIdentityConsoleSystem.cs (1)

12-12: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the unused Sawmill constant.

Nothing resolves a sawmill from this name. The system has no ISawmill field, and JobIdentityConsoleSystem logs only through _adminLogger.

🧹 Proposed removal
-    public const string Sawmill = "jobidentityconsole";
-

As per path instructions: "Flag ... dead code, stale test code, unused dependencies".

🤖 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/_Starlight/Access/Systems/SharedJobIdentityConsoleSystem.cs`
at line 12, Remove the unused Sawmill constant from the job identity console
system; no replacement is needed because logging uses _adminLogger and no
ISawmill resolves this name.

Source: Path instructions

Content.Shared/Access/Systems/SharedIdCardConsoleSystem.cs (1)

21-23: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider a per-console tag list instead of one hardcoded tag.

CrewJobIconTag hardcodes JobIconCrew for every IdCardConsoleComponent. The new JobIdentityConsoleComponent.RequiredTags (Content.Shared/_Starlight/Access/Components/JobIdentityConsoleComponent.cs Lines 30-31) already models the same concept as a configurable HashSet<ProtoId<TagPrototype>>. Two divergent mechanisms for one rule will drift, and department-restricted ID consoles cannot be expressed with the constant.

Reusing a single requiredTags data field on both components keeps the filter behavior in one place.

🤖 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/Access/Systems/SharedIdCardConsoleSystem.cs` around lines 21 -
23, Replace the hardcoded CrewJobIconTag usage in SharedIdCardConsoleSystem with
a configurable requiredTags collection shared by IdCardConsoleComponent and
JobIdentityConsoleComponent. Reuse the existing RequiredTags field pattern so
each console can define allowed icon tags, including department-specific
restrictions, while keeping the filtering behavior centralized.
Content.Shared/Access/Components/IdCardConsoleComponent.cs (1)

86-88: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Fix the malformed doc comment on AllIconsUnlocked.

Line 87 contains a stray < and a missing space ("IdCardConsoleComponent.AllIconsUnlocked"is). The two lines also duplicate the "True if" phrasing.

📝 Proposed comment cleanup
-        // True if every job icon (not just those tagged for that console) are unlocked for selection.
-        // True if <"IdCardConsoleComponent.AllIconsUnlocked"is set or the console has been emagged.
+        // True if every job icon is selectable, not only the icons tagged for this console.
+        // Set when IdCardConsoleComponent.AllIconsUnlocked is true or the console has been emagged.
         public readonly bool AllIconsUnlocked;
🤖 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/Access/Components/IdCardConsoleComponent.cs` around lines 86 -
88, Clean up the documentation comment for
IdCardConsoleComponent.AllIconsUnlocked by removing the stray “<”, adding the
missing space before “is”, and consolidating the duplicated “True if” wording
into a clear description of the field’s two conditions.
🤖 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.Client/Access/UI/IdCardConsoleWindow.xaml.cs`:
- Around line 239-243: The icon selection state retains the previous target’s
icon when the new target has none. In
Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs lines 239-243, reset
_currentJobIcon when TargetIdJobIcon is null and prevent submission until the
current target has an explicit selection; in
Content.Client/_Starlight/Access/UI/JobIdentityConsoleWindow.xaml.cs lines
83-87, apply the same reset and no-selection behavior, updating the message
contract if needed to represent no icon selected.

In `@Content.Server/Access/Systems/IdCardConsoleSystem.cs`:
- Around line 70-84: Update OnGotEmagged and the related UpdateUserInterface
flow so unlocked job icons are computed with the interaction emag state already
applied, even before the standard completion flow stores the flag. Use an
explicit unlock override or adjust the emag check in UpdateUserInterface, while
preserving the existing UI refresh and logging behavior.
- Around line 269-287: Update the default-icon fallback in the job icon
selection logic around IconAllowed and JobPrototype.Icon so IconAllowed is
applied only to the explicitly selected icon. Resolve and use job?.Icon without
the access check, preserving the existing restriction for newJobIcon and
ensuring the resulting jobIcon is passed to TryChangeJobIcon and
UpdateStationRecord.

In `@Content.Shared/_Starlight/Access/Components/JobIdentityConsoleComponent.cs`:
- Around line 33-44: Update WriteJobIdentityMessage so JobIcon uses nullable
ProtoId<JobIconPrototype>?, allowing title-only updates to omit an icon. Ensure
the server handling this message treats null as “keep the current icon” while
still applying JobTitle, matching IdCardConsoleComponent.WriteToTargetIdMessage
behavior.

In `@Resources/Prototypes/_Starlight/Entities/Objects/Misc/folders.yml`:
- Around line 298-303: Update the assistant manager board entity’s StealTarget
configuration to use a distinct stealGroup from HoPBoardSteal, while preserving
the existing HoPBoardSteal assignment for BoxFolderHoPClipboard. Review the
board’s inheritance and tags alongside BaseGrandTheftContraband and confirm the
intended contraband tier, adding or removing the parent as needed for
consistency.
- Around line 238-240: Update the JobIdentityConsole prototype using the
JobIconAssistantManager required tag: add JobIconAssistantManager to the Tags
collection of an existing jobIcon prototype, or define a matching jobIcon
prototype, so JobIdentityConsoleSystem can resolve a valid assistant manager
icon.

In `@Resources/Prototypes/StatusIcon/job.yml`:
- Around line 17-18: Replace each inline “# Starlight-edit” marker on the added
JobIconCrew tag blocks with # Starlight-start before the multi-line tags block
and # Starlight-end after it, applying this consistently to every listed
occurrence in the file.

---

Nitpick comments:
In `@Content.Shared/_Starlight/Access/Components/JobIdentityConsoleComponent.cs`:
- Around line 28-31: Replace the existing documentation above
JobIdentityConsoleComponent.RequiredTags with an accurate XML doc comment.
Describe that icons are accepted when newJobIcon.Tags overlaps the required
tags, and explicitly state that an empty RequiredTags set rejects every icon;
remove references to JobIconPrototype.AllowSelection and allIconsUnlocked.

In `@Content.Shared/_Starlight/Access/Systems/SharedJobIdentityConsoleSystem.cs`:
- Line 12: Remove the unused Sawmill constant from the job identity console
system; no replacement is needed because logging uses _adminLogger and no
ISawmill resolves this name.

In `@Content.Shared/Access/Components/IdCardConsoleComponent.cs`:
- Around line 86-88: Clean up the documentation comment for
IdCardConsoleComponent.AllIconsUnlocked by removing the stray “<”, adding the
missing space before “is”, and consolidating the duplicated “True if” wording
into a clear description of the field’s two conditions.

In `@Content.Shared/Access/Systems/SharedIdCardConsoleSystem.cs`:
- Around line 21-23: Replace the hardcoded CrewJobIconTag usage in
SharedIdCardConsoleSystem with a configurable requiredTags collection shared by
IdCardConsoleComponent and JobIdentityConsoleComponent. Reuse the existing
RequiredTags field pattern so each console can define allowed icon tags,
including department-specific restrictions, while keeping the filtering behavior
centralized.
🪄 Autofix

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: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ce75c999-0368-4f00-909b-fe66fbd953a3

📥 Commits

Reviewing files that changed from the base of the PR and between 05eb5d7 and 496181a.

⛔ Files ignored due to path filters (16)
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/ClericalAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/CookAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/DeliveryAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/GardenerAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/HandymanAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/MedicalAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/ReligiousAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/ShopkeeperAssistant.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/am_clipboard.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/am_clipboard_over.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/hop_clipboard_paper.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/hop_clipboard_pen.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/hop_clipboard_priv_id.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/hop_clipboard_target_id.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/inhand-hopboard-left.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/inhand-hopboard-right.png is excluded by !**/*.png
📒 Files selected for processing (21)
  • Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs
  • Content.Client/Access/UI/IdCardConsoleWindow.xaml
  • Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleBoundUserInterface.cs
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleWindow.xaml
  • Content.Client/_Starlight/Access/UI/JobIdentityConsoleWindow.xaml.cs
  • Content.Server/Access/Systems/IdCardConsoleSystem.cs
  • Content.Server/_Starlight/Access/Systems/JobIdentityConsoleSystem.cs
  • Content.Shared/Access/Components/IdCardConsoleComponent.cs
  • Content.Shared/Access/Systems/SharedIdCardConsoleSystem.cs
  • Content.Shared/StatusIcon/StatusIconPrototype.cs
  • Content.Shared/_Starlight/Access/Components/JobIdentityConsoleComponent.cs
  • Content.Shared/_Starlight/Access/Systems/SharedJobIdentityConsoleSystem.cs
  • Resources/Locale/en-US/_Starlight/job/job-names.ftl
  • Resources/Prototypes/StatusIcon/job.yml
  • Resources/Prototypes/_Starlight/Entities/Objects/Misc/folders.yml
  • Resources/Prototypes/_Starlight/Entities/Structures/Machines/Computers/computers.yml
  • Resources/Prototypes/_Starlight/StatusIcon/job.yml
  • Resources/Prototypes/_Starlight/tags.yml
  • Resources/Textures/_Starlight/Interface/Misc/job_icons.rsi/meta.json
  • Resources/Textures/_Starlight/Objects/Misc/assistantmanager_clipboard.rsi/meta.json

Comment thread Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs
Comment thread Content.Server/Access/Systems/IdCardConsoleSystem.cs
Comment thread Content.Server/Access/Systems/IdCardConsoleSystem.cs
Comment thread Resources/Prototypes/_Starlight/Entities/Objects/Misc/folders.yml
Comment thread Resources/Prototypes/_Starlight/Entities/Objects/Misc/folders.yml Outdated
Comment thread Resources/Prototypes/StatusIcon/job.yml
@github-actions github-actions Bot added S: Untriaged Status: Indicates an item has not been triaged and doesn't have appropriate labels. Changes: UI Changes: Sprites Changes: C# S: Needs Review Status: Requires additional reviews before being fully accepted. Not to be replaced by S: Approved. Changes: Prototypes size/L labels Aug 6, 2026
@bynddark8

bynddark8 commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

The bot talked about getting rid of hardcoding tags from consoles, which is probably a good idea. Going to figure out how I want to do that and then this should be in a serviceable state.

@Forrestgod718

Copy link
Copy Markdown
Contributor

Please tell me you removed all the syndicate job icons and stuff

@bynddark8

bynddark8 commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

Please tell me you removed all the syndicate job icons and stuff

Yes, that's what the tagging does - see the screenshots.

@wonderfulnewworld

Copy link
Copy Markdown
Contributor

@bynddark8 the other PR got merged, can you update this one to make sure Assistant Managers spawn with the board?

@wonderfulnewworld

Copy link
Copy Markdown
Contributor

probably just in their pocket slot

@coderabbitai

coderabbitai Bot commented Aug 17, 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.

@bynddark8

Copy link
Copy Markdown
Contributor Author

@bynddark8 the other PR got merged, can you update this one to make sure Assistant Managers spawn with the board?

done, added to the loadout in the belt slot

@github-actions

Copy link
Copy Markdown
Contributor

Content + Integration Test Results

Failed Tests

Failed Tests
❌ TestGridApcLoad(/Maps/_Starlight/Shuttles/SecureTerminal/ERT-Small-Med.yml)
Multiple failures or warnings in test:
  1) System.Collections.Generic.KeyNotFoundException : The given key 'ConeSingle' was not present in the dictionary.
     at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at Content.Server._Starlight.Shadekin.ShadekinSystem.GetLightExposure(EntityUid uid) in /home/runner/work/space-station-14/space-station-14/Content.Server/_Starlight/Shadekin/ShadekinSystem.cs:line 174
   at Content.Server._Starlight.Shadekin.ShadekinSystem.Update(Single frameTime) in /home/runner/work/space-station-14/space-station-14/Content.Server/_Starlight/Shadekin/ShadekinSystem.cs:line 380
   at Robust.Shared.GameObjects.EntitySystemManager.TickUpdate(Single frameTime, Boolean noPredictions) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntitySystemManager.cs:line 343
   at Robust.Shared.GameObjects.EntityManager.TickUpdate(Single frameTime, Boolean noPredictions, Histogram histogram) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntityManager.cs:line 271
   at Robust.Server.GameObjects.ServerEntityManager.TickUpdate(Single frameTime, Boolean noPredictions, Histogram histogram) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Server/GameObjects/ServerEntityManager.cs:line 174
   at Robust.Server.BaseServer.Update(FrameEventArgs frameEventArgs) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Server/BaseServer.cs:line 731
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.SingleThreadRunUntilEmpty() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1250
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.Run() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1237
   at Robust.UnitTesting.RobustIntegrationTest.ServerIntegrationInstance._serverMain() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 773
--- End of stack trace from previous location ---
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationInstance.WaitIdleImplAsync(Boolean throwOnUnhandled, CancellationToken cancellationToken) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 566
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationInstance.WaitRunTicks(Int32 ticks) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 653
   at Robust.UnitTesting.Pool.TestPair`2.RunTicksSync(Int32 ticks) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Helpers.cs:line 184
   at Robust.UnitTesting.Pool.TestPair`2.RunSeconds(Single seconds) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Helpers.cs:line 202
   at Content.IntegrationTests.Tests._Starlight.Power.GridPowerTests.TestGridApcLoad(ResPath gridFilePath) in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Tests/_Starlight/Power/GridPowerTests.cs:line 158
   at NUnit.Framework.Internal.TaskAwaitAdapter.GenericAdapter`1.BlockUntilCompleted()
   at NUnit.Framework.Internal.MessagePumpStrategy.NoMessagePumpStrategy.WaitForCompletion(AwaitAdapter awaiter)
   at NUnit.Framework.Internal.AsyncToSyncAdapter.Await[TResult](TestExecutionContext context, Func`1 invoke)
   at NUnit.Framework.Internal.AsyncToSyncAdapter.Await(TestExecutionContext context, Func`1 invoke)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.RunTestMethod(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.Execute(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.BeforeAndAfterTestCommand.<>c__DisplayClass1_0.<Execute>b__0()
   at NUnit.Framework.Internal.Commands.DelegatingTestCommand.RunTestMethodInThreadAbortSafeZone(TestExecutionContext context, Action action)
  2) Test was dirty-disposed.
     at Robust.UnitTesting.Pool.TestPair`2.OnDirtyDispose() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 44
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Robust.UnitTesting.Pool.TestPair`2.OnDirtyDispose()
   at Robust.UnitTesting.Pool.TestPair`2.DisposeAsync() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 146
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Robust.UnitTesting.Pool.TestPair`2.DisposeAsync()
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 262
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown()
   at InvokeStub_GameTest.DoTeardown(Object, Object, IntPtr*)

Trace:


1)    at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at Content.Server._Starlight.Shadekin.ShadekinSystem.GetLightExposure(EntityUid uid) in /home/runner/work/space-station-14/space-station-14/Content.Server/_Starlight/Shadekin/ShadekinSystem.cs:line 174
   at Content.Server._Starlight.Shadekin.ShadekinSystem.Update(Single frameTime) in /home/runner/work/space-station-14/space-station-14/Content.Server/_Starlight/Shadekin/ShadekinSystem.cs:line 380
   at Robust.Shared.GameObjects.EntitySystemManager.TickUpdate(Single frameTime, Boolean noPredictions) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntitySystemManager.cs:line 343
   at Robust.Shared.GameObjects.EntityManager.TickUpdate(Single frameTime, Boolean noPredictions, Histogram histogram) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntityManager.cs:line 271
   at Robust.Server.GameObjects.ServerEntityManager.TickUpdate(Single frameTime, Boolean noPredictions, Histogram histogram) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Server/GameObjects/ServerEntityManager.cs:line 174
   at Robust.Server.BaseServer.Update(FrameEventArgs frameEventArgs) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Server/BaseServer.cs:line 731
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.SingleThreadRunUntilEmpty() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1250
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.Run() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1237
   at Robust.UnitTesting.RobustIntegrationTest.ServerIntegrationInstance._serverMain() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 773
--- End of stack trace from previous location ---
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationInstance.WaitIdleImplAsync(Boolean throwOnUnhandled, CancellationToken cancellationToken) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 566
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationInstance.WaitRunTicks(Int32 ticks) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 653
   at Robust.UnitTesting.Pool.TestPair`2.RunTicksSync(Int32 ticks) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Helpers.cs:line 184
   at Robust.UnitTesting.Pool.TestPair`2.RunSeconds(Single seconds) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Helpers.cs:line 202
   at Content.IntegrationTests.Tests._Starlight.Power.GridPowerTests.TestGridApcLoad(ResPath gridFilePath) in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Tests/_Starlight/Power/GridPowerTests.cs:line 158
   at NUnit.Framework.Internal.TaskAwaitAdapter.GenericAdapter`1.BlockUntilCompleted()
   at NUnit.Framework.Internal.MessagePumpStrategy.NoMessagePumpStrategy.WaitForCompletion(AwaitAdapter awaiter)
   at NUnit.Framework.Internal.AsyncToSyncAdapter.Await[TResult](TestExecutionContext context, Func`1 invoke)
   at NUnit.Framework.Internal.AsyncToSyncAdapter.Await(TestExecutionContext context, Func`1 invoke)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.RunTestMethod(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.Execute(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.BeforeAndAfterTestCommand.<>c__DisplayClass1_0.<Execute>b__0()
   at NUnit.Framework.Internal.Commands.DelegatingTestCommand.RunTestMethodInThreadAbortSafeZone(TestExecutionContext context, Action action)
2)    at Robust.UnitTesting.Pool.TestPair`2.OnDirtyDispose() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 44
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Robust.UnitTesting.Pool.TestPair`2.OnDirtyDispose()
   at Robust.UnitTesting.Pool.TestPair`2.DisposeAsync() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 146
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Robust.UnitTesting.Pool.TestPair`2.DisposeAsync()
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 262
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown()
   at InvokeStub_GameTest.DoTeardown(Object, Object, IntPtr*)
❌ SpawnAndDeleteAllEntitiesOnDifferentMaps
SERVER: 61.853s [ERRO] resolve: Can't resolve "Robust.Shared.Physics.Components.PhysicsComponent" on entity NanoTrasen navy marine hardsuit helmet (191839/n191839, ClothingHeadHelmetHardsuitNTNCConsortium)!
   at System.Environment.get_StackTrace()
   at Robust.Shared.Physics.Systems.SharedPhysicsSystem.ApplyLinearImpulse(EntityUid uid, Vector2 impulse, FixturesComponent manager, PhysicsComponent body) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/Physics/Systems/SharedPhysicsSystem.Components.cs:line 222
   at Content.Shared.Gibbing.GibbingSystem.FlingDroppedEntity(EntityUid target) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Gibbing/GibbingSystem.cs:line 68
   at Content.Shared.Gibbing.GibbingSystem.Gib(EntityUid ent, Boolean dropGiblets, Nullable`1 user) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Gibbing/GibbingSystem.cs:line 51
   at Content.Shared.Trigger.Systems.GibOnTriggerSystem.OnTrigger(Entity`1 ent, EntityUid target, TriggerEvent& args) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Trigger/Systems/GibOnTriggerSystem.cs:line 24
   at DMD<DMD<>?29535497::Robust.Shared.GameObjects.EntityEventBus::EntDispatch>(EntityEventBus this, EntityUid euid, Type eventType, Unit& args)
   at SyncProxy<System.Void Robust.Shared.GameObjects.EntityEventBus:EntDispatch(Robust.Shared.GameObjects.EntityUid, System.Type, Robust.Shared.GameObjects.EntityEventBus+Unit&)>(EntityEventBus , EntityUid , Type , Unit& )
   at Content.Shared.Trigger.Systems.TriggerSystem.Trigger(EntityUid trigger, Nullable`1 user, String key, Boolean predicted) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Trigger/Systems/TriggerSystem.cs:line 80
   at Content.Shared.Trigger.Systems.TriggerOnMobstateChangeSystem.OnMobStateRelay(EntityUid uid, TriggerOnMobstateChangeComponent component, ImplantRelayEvent`1 args) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Trigger/Systems/TriggerOnMobstateChangeSystem.cs:line 37
   at DMD<DMD<>?29535497::Robust.Shared.GameObjects.EntityEventBus::EntDispatch>(EntityEventBus this, EntityUid euid, Type eventType, Unit& args)
   at SyncProxy<System.Void Robust.Shared.GameObjects.EntityEventBus:EntDispatch(Robust.Shared.GameObjects.EntityUid, System.Type, Robust.Shared.GameObjects.EntityEventBus+Unit&)>(EntityEventBus , EntityUid , Type , Unit& )
   at Robust.Shared.GameObjects.EntitySystem.RaiseLocalEvent[TEvent](EntityUid uid, TEvent args, Boolean broadcast) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntitySystem.cs:line 228
   at Content.Shared.Implants.SharedSubdermalImplantSystem.RelayToImplantEvent[T](EntityUid uid, ImplantedComponent component, T args) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Implants/SharedSubdermalImplantSystem.Relays.cs:line 36
   at Robust.Shared.GameObjects.EntityEventBus.<>c__DisplayClass54_0`2.<SubscribeLocalEvent>g__EventHandler|0(EntityUid uid, IComponent comp, Unit& ev) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntityEventBus.Directed.cs:line 267
   at Robust.Shared.GameObjects.EntityEventBus.RaiseLocalOrdered(EntityUid uid, Type eventType, EventData subs, Unit& unitRef, Boolean broadcast) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntityEventBus.Ordering.cs:line 43
   at Content.Shared.Mobs.Systems.MobStateSystem.ChangeState(EntityUid target, MobStateComponent component, MobState newState, Nullable`1 origin) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs:line 114
   at Content.Shared.Mobs.Systems.MobStateSystem.UpdateMobState(EntityUid entity, MobStateComponent component, Nullable`1 origin) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs:line 37
   at Content.Shared.Mobs.Systems.MobThresholdSystem.OnDamaged(EntityUid target, MobThresholdsComponent thresholds, DamageChangedEvent args) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Mobs/Systems/MobThresholdSystem.cs:line 430
   at Robust.Shared.GameObjects.EntityEventBus.RaiseLocalOrdered(EntityUid uid, Type eventType, EventData subs, Unit& unitRef, Boolean broadcast) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntityEventBus.Ordering.cs:line 43
   at Content.Shared.Damage.Systems.DamageableSystem.OnEntityDamageChanged(Entity`1 ent, DamageSpecifier damageDelta, Boolean interruptsDoAfters, Nullable`1 origin) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Damage/Systems/DamageableSystem.cs:line 69
   at Content.Shared.Damage.Systems.DamageableSystem.ChangeDamage(Entity`1 ent, DamageSpecifier damage, Boolean ignoreResistances, Boolean interruptsDoAfters, Nullable`1 origin, Boolean ignoreGlobalModifiers, Single armorPenetration, Boolean canHeal) in /home/runner/work/space-station-14/space-station-14/Content.Shared/Damage/Systems/DamageableSystem.API.cs:line 211
   at Content.Shared.Body.Systems.SharedBodySystem.PartRemoveDamage(Entity`1 bodyEnt, Entity`1 partEnt) in /home/runner/work/space-station-14/space-station-14/Content.Shared/_Starlight/Medical/Body/Systems/SharedBodySystem.Parts.cs:line 210
   at Content.Server._Starlight.Medical.Body.Systems.BodySystem.RemovePart(Entity`1 bodyEnt, Entity`1 partEnt, String slotId) in /home/runner/work/space-station-14/space-station-14/Content.Server/_Starlight/Medical/Body/Systems/BodySystem.cs:line 84
   at Content.Shared.Body.Systems.SharedBodySystem.OnBodyPartRemoved(Entity`1 ent, EntRemovedFromContainerMessage& args) in /home/runner/work/space-station-14/space-station-14/Content.Shared/_Starlight/Medical/Body/Systems/SharedBodySystem.Parts.cs:line 76
   at Robust.Shared.GameObjects.EntityEventBus.RaiseLocalOrdered(EntityUid uid, Type eventType, EventData subs, Unit& unitRef, Boolean broadcast) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntityEventBus.Ordering.cs:line 43
   at Robust.Shared.Containers.SharedContainerSystem.Remove(Entity`2 toRemove, BaseContainer container, Boolean reparent, Boolean force, Nullable`1 destination, Nullable`1 localRotation) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/Containers/SharedContainerSystem.Remove.cs:line 101
   at Robust.Shared.Containers.SharedContainerSystem.RemoveEntity(EntityUid uid, EntityUid toremove, ContainerManagerComponent containerManager, TransformComponent containedXform, MetaDataComponent containedMeta, Boolean reparent, Boolean force, Nullable`1 destination, Nullable`1 localRotation) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/Containers/SharedContainerSystem.cs:line 258
   at Robust.Shared.Containers.SharedContainerSystem.OnParentChanged(EntParentChangedMessage& message) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/Containers/SharedContainerSystem.cs:line 680
   at Robust.Shared.GameObjects.SharedTransformSystem.RaiseMoveEvent(Entity`2 ent, EntityUid oldParent, Vector2 oldPosition, Angle oldRotation, Nullable`1 oldMap, Boolean checkTraversal) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/Systems/SharedTransformSystem.cs:line 273
   at Robust.Shared.GameObjects.SharedTransformSystem.SetCoordinates(Entity`2 entity, EntityCoordinates value, Nullable`1 rotation, Boolean unanchor, TransformComponent newParent, TransformComponent oldParent) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/Systems/SharedTransformSystem.Component.cs:line 667
   at Robust.Shared.GameObjects.SharedTransformSystem.DetachEntityInternal(EntityUid uid, TransformComponent xform, MetaDataComponent meta, TransformComponent oldXform, Boolean terminating) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/Systems/SharedTransformSystem.Component.cs:line 1640
   at Robust.Shared.GameObjects.EntityManager.RecursiveDeleteEntity(EntityUid uid, MetaDataComponent metadata, TransformComponent transform, TransformComponent parentXform) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntityManager.cs:line 671
   at Robust.Shared.GameObjects.EntityManager.DeleteEntity(EntityUid e, MetaDataComponent meta, TransformComponent xform) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Shared/GameObjects/EntityManager.cs:line 627
   at Content.IntegrationTests.Tests.EntityTest.<>c__DisplayClass6_0.<SpawnAndDeleteAllEntitiesOnDifferentMaps>b__1() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Tests/EntityTest.cs:line 98
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.SingleThreadRunUntilEmpty() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1250
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.Run() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1237
   at Robust.UnitTesting.RobustIntegrationTest.ServerIntegrationInstance._serverMain() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 773
   at System.Threading.Thread.StartHelper.Callback(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) Exception: 

Trace:

   at Robust.UnitTesting.Pool.TestPair`2.ReportErrorLogs() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 28
   at Robust.UnitTesting.Pool.TestPair`2.OnCleanDispose() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 99
   at Robust.UnitTesting.Pool.TestPair`2.OnCleanDispose() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 107
   at Robust.UnitTesting.Pool.TestPair`2.CleanReturnAsync() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 125
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 260
   at NUnit.Framework.Internal.Commands.SetUpTearDownItem.RunTearDown(TestExecutionContext context)
1)    at Robust.UnitTesting.Pool.TestPair`2.ReportErrorLogs() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 25
   at Robust.UnitTesting.Pool.TestPair`2.OnCleanDispose() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 99
2)    at Robust.UnitTesting.Pool.TestPair`2.OnCleanDispose() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 106
Tests 📝 Passed ✅ Failed ❌ Duration ⏱️
1692 1670 2 17m 1s

Github Test Reporter by CTRF 💚

@starlightgithub starlightgithub Bot added S: Approved Status: Reviewed and approved by at least one maintainer or dev; a PR may require another approval. and removed S: Needs Review Status: Requires additional reviews before being fully accepted. Not to be replaced by S: Approved. labels Aug 18, 2026
@walksanatora
walksanatora added this pull request to the merge queue Aug 18, 2026
Merged via the queue into ss14Starlight:starlight-dev with commit 60f3c6c Aug 18, 2026
23 checks passed
starlightgithub Bot added a commit that referenced this pull request Aug 18, 2026
@coderabbitai coderabbitai Bot mentioned this pull request Aug 19, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Changes: C# Changes: Prototypes Changes: Sprites Changes: UI S: Approved Status: Reviewed and approved by at least one maintainer or dev; a PR may require another approval. S: Untriaged Status: Indicates an item has not been triaged and doesn't have appropriate labels. size/L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants