Skip to content

feat(sim): make subject rebellions possible for war-subjugated vassals - #38

Merged
csheldrick merged 1 commit into
mainfrom
claude/galimulator-ng-noet-dogfood-95t6zz
Jul 3, 2026
Merged

csheldrick merged 1 commit into
mainfrom
claude/galimulator-ng-noet-dogfood-95t6zz

Conversation

@csheldrick

Copy link
Copy Markdown
Owner

Summary

  • War losers forced into subjugation now start at loyalty 0.30 instead of 0.55, reflecting that they were defeated, not willing
  • While loyalty is below 0.45, the power-imbalance stability bonus is replaced by a resentment penalty (−0.0005/tick), creating a realistic window for rebellion within ~100–400 ticks
  • Voluntary protectorates (maybeVoluntaryProtectorate) retain the original 0.55 starting loyalty and positive drift

Problem

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 optional startLoyalty parameter to createSubjectRelation; add resentment drift when loyalty < 0.45 (suppresses the power-bonus, applies −0.0005/tick grudge instead).

src/sim/Diplomacy.ts — pass startLoyalty: 0.30 in maybeSubjugateLoser (the war-defeat path only).

Verification

npm run report                         # default 3000-tick run
npm run report -- --milestones 1000,3000,10000 --no-determinism

Before: Subjects: … 0 rebellions at every milestone through tick 10 000
After: Subjects: … 5 rebellions at tick 3 000 · 12 rebellions at 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).

  • Initial slice: slice-2026-07-03-150114
  • Initial allowed surface: src/sim/Subjects.ts, src/sim/Diplomacy.ts
  • New files: (none)
  • SERs created: 1 (1 accepted — verification scope expansion, one-shot via noet expand)
  • Final slice: slice-2026-07-03-150121
  • Files changed: src/sim/Subjects.ts, src/sim/Diplomacy.ts
  • Tests: 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)
  • Surface gate result: ✓ PASS
  • Hash valid: ✓ yes
  • Observations: 2
    • OBS-1: PR270 expand felt lighter — SER filed and accepted in one shot with no clean-tree guard interruption (protocol-win)
    • OBS-2: External-repo verification binding gap — noet verify run cannot 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

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
@csheldrick
csheldrick merged commit d3a915b into main Jul 3, 2026
2 checks passed
@csheldrick
csheldrick deleted the claude/galimulator-ng-noet-dogfood-95t6zz branch July 3, 2026 15:27
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.

2 participants