# Scoring model **Global formula:** [`IdleSpectator/scoring-model.json`](../IdleSpectator/scoring-model.json) **Per-event inventory (strength + prose):** [`IdleSpectator/event-catalog.json`](../IdleSpectator/event-catalog.json) **Story commitment (arcs / aftermath / ledger):** [`story-planner.md`](story-planner.md) - `scoring-model.json` - margins, multipliers, rarity caps, soft-Duel / variety valve knobs - `event-catalog.json` - every authored event id (`happiness`, `status`, `worldLog`, `plots`, `decisions`, …) - Decisions use `action` (clause after "decides to …") - Most other domains use `label` - Happiness uses `variantsWithRelated` / `variantsWithoutRelated` - Optional `species` / `character` bonuses **Visual tracker (open beside chat):** [scoring-model canvas](/home/dazed/.cursor/projects/home-dazed-Projects-worldbox-mods-idle-mode/canvases/scoring-model.canvas.tsx) ## Variety policy (0.28.28) `TotalScore = EventStrength + scaleBonus + char*w + visual*w + novelty*w`. Hard sticky combat (margin 50, MaxWatch 60) is only for Skirmish+ or notable-pair Duels. Anonymous / single-notable Duels are soft sticky: MaxWatch 24, variety valve at 8s, yield to Story peers after 8s. Founding tips come from `new_city` / `new_kingdom` meta outcomes, not decision intent. Consecutive shows of the same variety arc (e.g. duel → duel) subtract `repeatArcPenaltyPer` from TotalScore (capped), resetting when a different arc is shown. A rolling tip window also adjusts score by frequency: over-shown arcs lose up to `arcOverSharePenaltyMax`, rare/absent arcs gain up to `arcUnderShareBoostMax`, with an extra combat monopoly penalty above `arcCombatShareTarget`. Fruit-bush foraging is fill-band strength so it does not crowd the camera. Live combat holds the camera until the scrap goes cold (see who wins); variety peers cut after the fight ends. Edit the `weights` block in scoring-model.json to change live scoring formula knobs. Edit the `story` block for StoryPlanner / life-saga soft bias: - `nearTieEpsilon` / `sagaNearTieEpsilon` - ordinary vs Prefer/MC/cast pick bands - `sagaMcWeight` / `sagaPreferWeight` / `sagaCastWeight` / `sagaCrossMcBonus` - tip score soft bias (CrossMC bonus ~11; SoftBias Prefer > CrossMC > MC > cast) - `sagaRivalEncounterThreshold` - living rematches before EarnRival Edit event-catalog.json to change what each event is worth and what it says. See also: [life-saga.md](life-saga.md), [story-planner.md](story-planner.md).