Skip to content

feat(evals): size-appropriate werewolf role balance + private non-voter re-prompt - #997

Open
Poytr1 wants to merge 1 commit into
claude/lever2-vote-wordingfrom
claude/lever4-composition
Open

feat(evals): size-appropriate werewolf role balance + private non-voter re-prompt#997
Poytr1 wants to merge 1 commit into
claude/lever2-vote-wordingfrom
claude/lever4-composition

Conversation

@Poytr1

@Poytr1 Poytr1 commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Stacked on #984/#985/#986 (retargets as they merge). Fixes the composition flaw the user caught — two wolves at a five-player table degenerate: one unsaved night-1 kill reaches parity instantly, so every 5p game was a one-night game with no day, vote, or later round (measured across all real 5p runs).

Role table (werewolfWolfCount, shared by both game compositions):

players werewolves
5–6 1
7+ 2

Single-wolf night mediation collapses to propose-only — the lone wolf's clear statement IS the pack's choice (referee call text + role message adjusted; the absorb path already took a partnerless proposal directly). The two-wolf mediated propose→relay→agree leg stays pinned by a new 7p scripted cell (three rounds, every kill verdict: 'agreed').

Non-voter re-prompt (the human-moderator mirror, now on the critical path since votes decide 5p games): when a vote goes quiet the host nudges the referee — the first nudge sends each living non-voter ONE private needsReply re-prompt mandating the self-identifying ballot form (direct replies carry no sender label); the second closes the ballot counting the still-missing as abstentions. Private ballots parse from direct, coalesced, and #800-inferred replies alike; either channel settles the obligation. Pinned by a new abstainer cell: a scripted public-vote abstainer is re-prompted once, its private ballot counts, zero abstentions, game completes.

Also fixes a deterministic scripted-player bug the new multi-day games exposed: the previous round's VOTE rows lag into the next day's prompts and were counted as SPEECH, convincing seat 4 the whole round had already spoken — vote lines are votes, never discussion speech.

Sanctioned re-pins (the game-design change): 5p seed-1 is now a two-round village win through actual play (night-1 save → full day-1 ballot → seer inspects the wolf → day-2 lynch); 6p keeps one wolf. Slack-shaped werewolf suite passes unmodified (its pinned cells are 7+ players, unaffected by the 5–6 row).

eval:collab:contracts now 122 tests; eval:parity 23, eval:contracts 46, evals tsc — all green.

🤖 Generated with Claude Code

…er re-prompt (webchat)

Two wolves at a five-player table degenerate — one unsaved night-1 kill
reaches parity instantly, so every 5p game was a one-night game with no day,
vote, or later round (measured across all real 5p runs; the user caught it).

Role table (werewolfWolfCount, shared by both compositions): 5-6 players →
ONE wolf, 7+ → two. Single-wolf night mediation collapses to propose-only:
the lone wolf's clear statement IS the pack's choice (the referee's call says
so; the absorb path already took a partnerless proposal directly), and the
role message drops the phantom partner.

Non-voter re-prompt (the human-moderator mirror): when a vote goes quiet the
host nudges the referee — first nudge sends each living non-voter ONE private
needsReply re-prompt mandating the self-identifying ballot form (direct
replies carry no sender label); the second closes the ballot counting the
still-missing as abstentions. Private ballots parse from direct, coalesced,
and #800-inferred replies alike; either channel (public post or private
reply) settles a player's obligation. Day records now carry rePrompted /
abstentions.

Also fixes a deterministic scripted-player bug the new multi-day 5p/7p games
exposed: the previous round's VOTE rows lag into the next day's prompts and
were counted as SPEECH, convincing seat 4 the whole round had spoken — vote
lines are votes, never discussion speech.

Scripted CI re-pinned for the sanctioned game-design change: 5p seed-1 now a
two-round village win (night-1 save → full day ballot → seer finds the wolf
→ day-2 lynch); 6p multi-round keeps one wolf; a NEW 7p cell pins the
two-wolf mediated propose→relay→agree leg across three rounds; a NEW
abstainer cell pins the re-prompt leg end to end (private ballot counted,
zero abstentions). Slack-shaped werewolf suite passes unmodified (its pinned
cells are 7+ players, unaffected by the 5-6 row).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@agentconnect-md-test agentconnect-md-test Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. I found no blocking regressions in the exact reviewed revision.

The size-based role table is shared cleanly by both werewolf compositions, the single-wolf path correctly bypasses the partner-verdict leg, and the vote nudge state machine gives missing voters one private collection pass before closing remaining absences as abstentions. I also checked the multi-round scripted-player change against the existing lagged vote-row behavior.

Verification completed:

  • eval collaboration contracts: 122/122 passed
  • eval parity: 23/23 passed
  • eval contracts: 46/46 passed
  • focused webchat + Slack-shaped werewolf tests: 23/23 passed
  • eval TypeScript check passed
  • exact diff whitespace/conflict check passed

sent by review-bot (Codex · gpt-5.6-sol) · open in session

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.

1 participant