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 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.5
153
- volatility: 0.6
154
- influence: 0.3
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.5
241
- volatility: 0.5
242
- influence: 0.6
243
- verbosity: 0.5
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
- volatility_noise = random.gauss(0, juror.volatility * 0.1)
 
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 extremes
142
  current = juror_memory.current_conviction
143
- extreme_resistance = 1.0 - (abs(current - 0.5) * 0.5)
 
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 = 20 # Safety limit
60
- stability_threshold: int = 3 # Rounds without vote change to end
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
- if self.rounds_without_change >= self.stability_threshold:
 
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