Spaces:
Running
Running
Blu3Orange
commited on
Commit
·
d90684f
1
Parent(s):
e1fc11d
feat: Adjust juror attributes for improved persuasion mechanics and refine game state thresholds for pacing
Browse files- agents/configs/jurors.yaml +7 -7
- core/conviction.py +6 -4
- core/game_state.py +17 -4
agents/configs/jurors.yaml
CHANGED
|
@@ -149,9 +149,9 @@ jurors:
|
|
| 149 |
|
| 150 |
Speech style: Curt, practical, sometimes exasperated. "Look, bottom line..."
|
| 151 |
and "Let's cut to the chase." You sigh audibly at repetitive arguments.
|
| 152 |
-
stubbornness: 0.
|
| 153 |
-
volatility: 0.
|
| 154 |
-
influence: 0.
|
| 155 |
verbosity: 0.3
|
| 156 |
initial_lean: "first_impression"
|
| 157 |
|
|
@@ -237,10 +237,10 @@ jurors:
|
|
| 237 |
|
| 238 |
Speech style: Business-like, analytical, results-oriented. "Let's think
|
| 239 |
about the implications..." and "From a risk perspective..."
|
| 240 |
-
stubbornness: 0.
|
| 241 |
-
volatility: 0.
|
| 242 |
-
influence: 0.
|
| 243 |
-
verbosity: 0.
|
| 244 |
initial_lean: "calculated"
|
| 245 |
|
| 246 |
- juror_id: "juror_11"
|
|
|
|
| 149 |
|
| 150 |
Speech style: Curt, practical, sometimes exasperated. "Look, bottom line..."
|
| 151 |
and "Let's cut to the chase." You sigh audibly at repetitive arguments.
|
| 152 |
+
stubbornness: 0.8 # Snap judgments stick
|
| 153 |
+
volatility: 0.2 # Doesn't waver once decided
|
| 154 |
+
influence: 0.4 # Decisiveness can sway others
|
| 155 |
verbosity: 0.3
|
| 156 |
initial_lean: "first_impression"
|
| 157 |
|
|
|
|
| 237 |
|
| 238 |
Speech style: Business-like, analytical, results-oriented. "Let's think
|
| 239 |
about the implications..." and "From a risk perspective..."
|
| 240 |
+
stubbornness: 0.4 # Pragmatists change with new info
|
| 241 |
+
volatility: 0.3 # Measured, not erratic
|
| 242 |
+
influence: 0.7 # Business consultant is persuasive
|
| 243 |
+
verbosity: 0.6 # Explains cost/benefit reasoning
|
| 244 |
initial_lean: "calculated"
|
| 245 |
|
| 246 |
- juror_id: "juror_11"
|
core/conviction.py
CHANGED
|
@@ -131,16 +131,18 @@ def calculate_conviction_change(
|
|
| 131 |
# Stubbornness reduces all changes
|
| 132 |
stubbornness_modifier = 1.0 - (juror.stubbornness * 0.7)
|
| 133 |
|
| 134 |
-
# Volatility adds randomness
|
| 135 |
-
|
|
|
|
| 136 |
|
| 137 |
# Relationship modifier - trust the speaker?
|
| 138 |
trust = juror_memory.opinions_of_others.get(argument.speaker_id, 0.0)
|
| 139 |
trust_modifier = 1.0 + (trust * 0.3) # -30% to +30%
|
| 140 |
|
| 141 |
-
# Conviction resistance - harder to move
|
| 142 |
current = juror_memory.current_conviction
|
| 143 |
-
|
|
|
|
| 144 |
|
| 145 |
# Calculate final delta
|
| 146 |
delta = (
|
|
|
|
| 131 |
# Stubbornness reduces all changes
|
| 132 |
stubbornness_modifier = 1.0 - (juror.stubbornness * 0.7)
|
| 133 |
|
| 134 |
+
# Volatility adds randomness - but stubbornness dampens volatility effect
|
| 135 |
+
effective_volatility = juror.volatility * (1.0 - juror.stubbornness * 0.5)
|
| 136 |
+
volatility_noise = random.gauss(0, effective_volatility * 0.1)
|
| 137 |
|
| 138 |
# Relationship modifier - trust the speaker?
|
| 139 |
trust = juror_memory.opinions_of_others.get(argument.speaker_id, 0.0)
|
| 140 |
trust_modifier = 1.0 + (trust * 0.3) # -30% to +30%
|
| 141 |
|
| 142 |
+
# Conviction resistance - quadratic falloff makes extremes much harder to move
|
| 143 |
current = juror_memory.current_conviction
|
| 144 |
+
distance = abs(current - 0.5) # 0 at center, 0.5 at extremes
|
| 145 |
+
extreme_resistance = 1.0 - (distance ** 2) * 1.5 # Quadratic: 1.0 center, 0.625 extremes
|
| 146 |
|
| 147 |
# Calculate final delta
|
| 148 |
delta = (
|
core/game_state.py
CHANGED
|
@@ -56,8 +56,8 @@ class GameState:
|
|
| 56 |
|
| 57 |
# Rounds
|
| 58 |
round_number: int = 0
|
| 59 |
-
max_rounds: int =
|
| 60 |
-
stability_threshold: int = 3 #
|
| 61 |
rounds_without_change: int = 0
|
| 62 |
|
| 63 |
# Votes
|
|
@@ -88,14 +88,27 @@ class GameState:
|
|
| 88 |
votes = set(self.votes.values())
|
| 89 |
return len(votes) == 1
|
| 90 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
def should_end_deliberation(self) -> bool:
|
| 92 |
"""Check if deliberation should end."""
|
| 93 |
# Unanimous verdict
|
| 94 |
if self.is_unanimous():
|
| 95 |
return True
|
| 96 |
|
| 97 |
-
# Votes stabilized
|
| 98 |
-
|
|
|
|
| 99 |
return True
|
| 100 |
|
| 101 |
# Max rounds reached
|
|
|
|
| 56 |
|
| 57 |
# Rounds
|
| 58 |
round_number: int = 0
|
| 59 |
+
max_rounds: int = 12 # Safety limit (was 20, reduced for better pacing)
|
| 60 |
+
stability_threshold: int = 3 # Base threshold, can be dynamic
|
| 61 |
rounds_without_change: int = 0
|
| 62 |
|
| 63 |
# Votes
|
|
|
|
| 88 |
votes = set(self.votes.values())
|
| 89 |
return len(votes) == 1
|
| 90 |
|
| 91 |
+
def get_dynamic_stability_threshold(self) -> int:
|
| 92 |
+
"""Stability threshold based on vote split - close votes need more debate."""
|
| 93 |
+
guilty, not_guilty = self.get_vote_tally()
|
| 94 |
+
minority = min(guilty, not_guilty)
|
| 95 |
+
|
| 96 |
+
if minority <= 2: # 10-2 or more lopsided
|
| 97 |
+
return 2 # Ends quickly
|
| 98 |
+
elif minority <= 4: # 8-4 to 9-3
|
| 99 |
+
return 3 # Normal
|
| 100 |
+
else: # 6-6 to 7-5 (close)
|
| 101 |
+
return 4 # Needs more debate
|
| 102 |
+
|
| 103 |
def should_end_deliberation(self) -> bool:
|
| 104 |
"""Check if deliberation should end."""
|
| 105 |
# Unanimous verdict
|
| 106 |
if self.is_unanimous():
|
| 107 |
return True
|
| 108 |
|
| 109 |
+
# Votes stabilized - use dynamic threshold based on vote split
|
| 110 |
+
dynamic_threshold = self.get_dynamic_stability_threshold()
|
| 111 |
+
if self.rounds_without_change >= dynamic_threshold:
|
| 112 |
return True
|
| 113 |
|
| 114 |
# Max rounds reached
|