namespace NeonSprawl.Server.Game.Factions; /// /// Persisted per-player faction standing keyed by (playerId, factionId) (NEO-135). /// Missing row ⇒ neutral 0 at read. Consumed by ReputationOperations (NEO-136) and gate eval (NEO-137). /// public interface IFactionStandingStore { /// Whether mutations for are allowed (dev bucket or Postgres player_position row). bool CanWritePlayer(string playerId); /// /// Reads standing for one faction. Missing row ⇒ 0 clamped to faction min/max. /// Unknown faction id ⇒ structured deny with . /// FactionStandingReadOutcome TryGetStanding(string playerId, string factionId); /// /// Applies a signed delta, clamps resulting standing to faction min/max, and persists. /// Does not append audit rows — is orchestrated by NEO-136. /// FactionStandingMutationOutcome TryApplyStandingDelta(string playerId, string factionId, int deltaAmount); /// /// Removes persisted standing for one faction (missing row reads as neutral 0). /// Dev fixture / Bruno reset only — not for gameplay rollback. /// bool TryClearStanding(string playerId, string factionId); }