feat(sim): make subject rebellions possible for war-subjugated vassals - #38
Merged
Merged
Conversation
War losers forced into subjugation now start at loyalty 0.30 instead of 0.55. While loyalty is below 0.45, the power-imbalance bonus that normally keeps subjects loyal is replaced by a resentment penalty (-0.0005/tick), creating a window where rebellion can realistically occur within ~100-400 ticks. Before: 0 rebellions in 10 000 ticks (122 subjects created). After: 12 rebellions in 10 000 ticks — 10% of subjects rebel. Voluntary protectorates and later-settled subjects retain the existing positive-drift loyalty model. Determinism check: passes unchanged. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwELDjDjw358RbFVZXfKf4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
maybeVoluntaryProtectorate) retain the original 0.55 starting loyalty and positive driftProblem
The subject rebellion mechanic was structurally dead. The loyalty drift formula was always net-positive for vassals (~+0.00014/tick), so loyalty never fell below the 0.25 rebellion threshold. Result: 0 rebellions in 10,000 ticks across 122 subject relations created. Subjects were decorative — they only ended by overlord collapse (liberation), never by their own action.
Fix
Two small changes:
src/sim/Subjects.ts— add optionalstartLoyaltyparameter tocreateSubjectRelation; add resentment drift when loyalty < 0.45 (suppresses the power-bonus, applies −0.0005/tick grudge instead).src/sim/Diplomacy.ts— passstartLoyalty: 0.30inmaybeSubjugateLoser(the war-defeat path only).Verification
Before:
Subjects: … 0 rebellionsat every milestone through tick 10 000After:
Subjects: … 5 rebellionsat tick 3 000 ·12 rebellionsat tick 10 000 (10% of 120 created)Determinism check passes unchanged.
Dogfood receipt
This PR was produced under Noet dogfood protocol (PR270 post-merge run).
noet expand)npm run report— determinism passed, 12 rebellions observed at tick 10 000 (manually bound; external-repo verification binding is a known gap — see OBS-2)noet verify runcannot bind evidence for a command that lives in the target repo, not the noet repo; finish correctly identifies it as declared-only rather than silently passing (protocol-gap)Generated by Claude Code