Skip to content

Claude/turbo dotnet 10 upgrade 5fdy5j - #21

Merged
billsonnn merged 2 commits into
mainfrom
claude/turbo-dotnet-10-upgrade-5fdy5j
Aug 29, 2026
Merged

Claude/turbo dotnet 10 upgrade 5fdy5j#21
billsonnn merged 2 commits into
mainfrom
claude/turbo-dotnet-10-upgrade-5fdy5j

Conversation

@billsonnn

Copy link
Copy Markdown
Contributor

No description provided.

claude added 2 commits August 29, 2026 00:08
Domain and plugin-infrastructure failures were signalled with BCL exceptions
carrying interpolated messages, so callers could only react by matching on
message text. Each failure now has a type that carries its data as
properties and composes its own message.

Plugin loading (Turbo.Plugins/Exceptions/):
- PluginException, an abstract base carrying PluginKey, so a caller can
  catch any plugin problem uniformly.
- PluginManifestException (NotFound / Unreadable / MissingField) with
  ManifestPath and FieldName.
- PluginAssemblyException (NotFound / EntryPointNotFound / KeyMismatch)
  with AssemblyLocation and EntryPointKey.
- PluginDependencyException (Missing / Cycle / DependentsActive /
  DependencyInactive) with the related keys.
- PluginExportNotBoundException with the export type.

Domain failures:
- WalletDebitFailedException carries CurrencyKind plus the requested and
  applied amounts, replacing a bare Exception in PlayerWalletGrain.
- CatalogTypeNotSupportedException carries the CatalogType.
- RoomModelNotFoundException carries ModelId; RoomModelDataInvalidException
  carries the reason.
- WiredParamTypeMismatchException carries the index and both types.
- InvalidActionContextException carries the rejected context type. It lives
  in Turbo.Primitives rather than using TurboException, because
  Turbo.Primitives has no project references and TurboException is defined
  in Turbo.Logging, which depends on it.

Two sites had no data worth carrying and use the existing coded pattern
instead: the wired comparison switch now throws
TurboException(TurboErrorCodeEnum.InvalidWired).

The manifest parse handler gained a `when (ex is not PluginManifestException)`
filter so the specific validation failures thrown inside the try are no
longer re-wrapped as a generic parse error.

BCL argument guards are deliberately untouched: ArgumentException and
ArgumentOutOfRangeException remain correct for parameter validation, and
Turbo.Runtime.AssemblyProcessing stays on BCL types since it cannot
reference Turbo.Plugins.

Clean quality gate on SDK 10.0.400: 0 errors, warning count unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H1WWL4hLiAvJr2jzxoGyaP
The 500ms avatar walk boundary was being hit late by a varying amount each
cycle, which shows up in game as choppy walking: consecutive
UserUpdateMessageComposer packets arrived anywhere from ~400ms to ~600ms
apart. Two independent sources of jitter:

1. The room stream is a pull-based memory stream, and the pulling agent
   polls its queue every 100ms by default (GetQueueMsgsTimerPeriod). Since
   walk updates arrive 500ms apart, the agent is always idle when one is
   published, so every room packet paid a random 0-100ms queue wait. The
   room stream provider now polls every 10ms.

2. The room tick used a periodic grain timer, and Orleans measures a grain
   timer's period from the completion of the previous callback, so the
   effective cadence was RoomTickMs plus the tick body's execution time and
   the phase drifted continuously relative to the epoch-aligned boundary
   grid. The timer is now one-shot and re-arms itself to the next
   epoch-aligned RoomTickMs boundary after each tick (IGrainTimer.Change),
   so ticks land on the avatar/wired/roller boundaries within scheduler
   noise. The re-arm sits in a finally block so a failed tick cannot kill
   the room's tick loop, and a re-arm that lands exactly on a boundary is
   pushed a full period to avoid double-ticking it.

Verified with the full quality gate on SDK 10.0.400: 0 errors, warning
count unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H1WWL4hLiAvJr2jzxoGyaP
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@billsonnn
billsonnn merged commit 55a53ab into main Aug 29, 2026
6 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.

2 participants