Skip to content

Bind surgery consent and operations to character sessions - #30

Merged
ryanbarlow97 merged 1 commit into
mainfrom
feat/character-identity
Oct 12, 2026
Merged

ryanbarlow97 merged 1 commit into
mainfrom
feat/character-identity

Conversation

@ryanbarlow97

Copy link
Copy Markdown
Contributor

An offer or operation now belongs to both participants' exact character sessions. Switching Alice → Bob → Alice, reconnecting, or losing the identity provider cannot reuse old consent, consume tools for an old operation, or complete surgery on a replacement character.

  • Use shared TLibs ready-session tokens and end events; retain RPCharacters only for healing-injury APIs. Pin TLibs 2.3.0 and RPCharacters 2.16.0, with a clear startup error for missing shared APIs.
  • Capture both sessions in consent and operation state. Match outgoing tokens when dropping consent/operations; bind inventory events to the physician and operation ID, and deferred closure to the original inventory, connection, and session.
  • Remove the operation before injury changes or command dispatch. Recheck the operation after tool effects so a failure command that opens a new surgery cannot receive the old tool's state writes.
  • Preserve patient-quit penalties during outgoing-body cleanup. Patient switches/permanent deaths suppress their penalty; physician departures still penalize an unchanged patient. Shutdown cancels and clears operations/offers without penalty.
  • Completion commands target accounts, so they now require both original sessions to remain current and are skipped on every session end, including logout. This is a deliberate tightening of the command boundary; the healing penalty still applies on patient quit.

Validation: Java 21 mvn clean verify passed all 162 tests with 100% coverage of 1,251 executable lines. Restoring the old tool-handler guard reproduced the replacement-state overwrite in the new regression; the fix passes. Runtime JAR metadata and docs checks passed. Independent Astra review found the reentrancy issue, then approved the corrected implementation. Live Paper validation remains part of the full pinned-release lab; nothing has been deployed.

Docs: TF-Minecraft/Docs#165

@github-actions github-actions Bot added the size:XL 500-999 effective changed lines (tests excluded in mixed PRs). label Oct 12, 2026
@coderabbitai

coderabbitai Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 3ee9c401-6765-4b62-9bd3-2db91d144b74

📥 Commits

Reviewing files that changed from the base of the PR and between 4653379 and a904a9e.


📒 Files selected for processing (22)
  • pom.xml
  • src/main/java/net/tfminecraft/surgery/SurgeryPlugin.java
  • src/main/java/net/tfminecraft/surgery/commands/SurgeryCommand.java
  • src/main/java/net/tfminecraft/surgery/listeners/PlayerListener.java
  • src/main/java/net/tfminecraft/surgery/managers/SurgeryCompletionHandler.java
  • src/main/java/net/tfminecraft/surgery/managers/SurgeryItemHandler.java
  • src/main/java/net/tfminecraft/surgery/managers/SurgeryMechanicsManager.java
  • src/main/java/net/tfminecraft/surgery/managers/SurgeryMenuBuilder.java
  • src/main/java/net/tfminecraft/surgery/managers/SurgeryMenuHolder.java
  • src/main/java/net/tfminecraft/surgery/managers/SurgeryMenuManager.java
  • src/main/java/net/tfminecraft/surgery/managers/SurgeryRequestManager.java
  • src/main/java/net/tfminecraft/surgery/managers/SurgeryStateManager.java
  • src/main/java/net/tfminecraft/surgery/procedures/Ailments.java
  • src/main/resources/messages.yml
  • src/test/java/net/tfminecraft/surgery/SurgeryLifecycleTest.java
  • src/test/java/net/tfminecraft/surgery/TestCharacters.java
  • src/test/java/net/tfminecraft/surgery/commands/SurgeryCommandTest.java
  • src/test/java/net/tfminecraft/surgery/managers/SurgeryCompletionTest.java
  • src/test/java/net/tfminecraft/surgery/managers/SurgeryItemHandlerTest.java
  • src/test/java/net/tfminecraft/surgery/managers/SurgeryMechanicsManagerTest.java
  • src/test/java/net/tfminecraft/surgery/managers/SurgeryPresentationTest.java
  • src/test/java/net/tfminecraft/surgery/managers/SurgeryStateAndRequestTest.java

💤 Files with no reviewable changes (1)
  • src/main/java/net/tfminecraft/surgery/procedures/Ailments.java

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.



📝 Summary

Summary by CodeRabbit

  • New Features
    • Surgery requests and consent now require both participants to have active character sessions.
  • Bug Fixes
    • Surgery actions, outcomes and penalties are tied to the correct character sessions, preventing stale sessions or menus from affecting a different operation.
    • Session endings now trigger appropriate surgery cleanup and menu handling.
    • The plugin reports when TLibs 2.3.0 or newer is required and shuts down if that requirement is unmet.

Walkthrough

Surgery commands, requests, and operations now track character sessions and operation IDs. Session-end events clean up matching requests and operations. Menu interactions and completion actions check session and operation identity. The dependency versions and lifecycle tests are updated.

Changes

Session-bound surgery

Layer / File(s) Summary
Character readiness and consent
pom.xml, src/main/java/net/tfminecraft/surgery/SurgeryPlugin.java, src/main/java/net/tfminecraft/surgery/commands/SurgeryCommand.java, src/main/java/net/tfminecraft/surgery/managers/SurgeryRequestManager.java, src/main/java/net/tfminecraft/surgery/managers/SurgeryStateManager.java, src/main/java/net/tfminecraft/surgery/procedures/Ailments.java, src/main/resources/messages.yml, src/test/java/net/tfminecraft/surgery/TestCharacters.java, src/test/java/net/tfminecraft/surgery/commands/SurgeryCommandTest.java, src/test/java/net/tfminecraft/surgery/managers/SurgeryStateAndRequestTest.java
The TLibs dependencies use updated versions. Commands and requests validate participant sessions, and operation state stores session tokens and operation IDs. Tests cover readiness, consent, and session currentness.
Session-end handling and menu ownership
src/main/java/net/tfminecraft/surgery/listeners/PlayerListener.java, src/main/java/net/tfminecraft/surgery/managers/SurgeryMenuBuilder.java, src/main/java/net/tfminecraft/surgery/managers/SurgeryMenuHolder.java, src/main/java/net/tfminecraft/surgery/managers/SurgeryMenuManager.java, src/test/java/net/tfminecraft/surgery/SurgeryLifecycleTest.java, src/test/java/net/tfminecraft/surgery/managers/SurgeryPresentationTest.java
The listener routes session-end and inventory events to the menu manager. The manager checks operation-menu ownership and handles matching session ends. Lifecycle tests cover cleanup, stale events, and menu ownership.
Operation execution and completion
src/main/java/net/tfminecraft/surgery/managers/SurgeryCompletionHandler.java, src/main/java/net/tfminecraft/surgery/managers/SurgeryItemHandler.java, src/main/java/net/tfminecraft/surgery/managers/SurgeryMechanicsManager.java, src/test/java/net/tfminecraft/surgery/managers/SurgeryCompletionTest.java, src/test/java/net/tfminecraft/surgery/managers/SurgeryItemHandlerTest.java, src/test/java/net/tfminecraft/surgery/managers/SurgeryMechanicsManagerTest.java
Tool handling and patient-presence checks validate current operation state. Completion uses captured operation outcomes and current-session checks for effects and notifications. Tests cover stale sessions, replacement operations, and completion paths.

Priority: ➖ Normal

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

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant PlayerListener
  participant SurgeryMenuManager
  participant SurgeryRequestManager
  participant SurgeryCompletionHandler
  participant SurgeryStateManager
  PlayerListener->>SurgeryMenuManager: handleSessionEnd(event)
  SurgeryMenuManager->>SurgeryRequestManager: forget(ending session)
  SurgeryMenuManager->>SurgeryCompletionHandler: handleEnd(surgeon, ending session, reason)
  SurgeryCompletionHandler->>SurgeryStateManager: finish(operation owner)
Loading

Merge Risk: ⚪ Minimal · up to a904a

Surgery consent offers and operations are now tied to each participant's character session, with cleanup when a session ends. No confirmed defect remains at the current head. One open question remains: whether the shared character library always signals the end of a session when a player disconnects. Confirm this during the planned live server validation.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@ryanbarlow97
ryanbarlow97 merged commit abab42e into main Oct 12, 2026
3 checks passed
@ryanbarlow97
ryanbarlow97 deleted the feat/character-identity branch October 12, 2026 00:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 effective changed lines (tests excluded in mixed PRs).

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant