Problem
StudioMemberService.UpdateAsync reads the member projection to derive currentTeamId, performs no-op checks, and builds fromTeamId before dispatching the write command. Because projections are eventually consistent, this can skip a real write intent or dispatch a stale from_team_id that the actor rejects.
Why it matters
Write commands should express intent; the authority actor should compute and validate transitions from its own state. Query read models should not shape write-side business decisions.
Acceptance criteria
- Member patch/write request carries target intent rather than readmodel-derived source state.
- StudioMemberGAgent computes/validates team reassignment transitions from authoritative state.
- No-op handling happens in the actor or through an explicit actor-owned contract.
- Tests cover stale projection scenarios without relying on query-time freshness.
Source
Follow-up from StudioMember async bind PR review; out of scope for the binding-run PR.
Problem
StudioMemberService.UpdateAsync reads the member projection to derive currentTeamId, performs no-op checks, and builds fromTeamId before dispatching the write command. Because projections are eventually consistent, this can skip a real write intent or dispatch a stale from_team_id that the actor rejects.
Why it matters
Write commands should express intent; the authority actor should compute and validate transitions from its own state. Query read models should not shape write-side business decisions.
Acceptance criteria
Source
Follow-up from StudioMember async bind PR review; out of scope for the binding-run PR.