# Life-saga roster Dynamic top-10 cast of interesting lives (MCs). Owns the dossier rail and soft camera bias. Chronicle stays a history book and never drives the camera. Short combat/love/war arcs stay in [`StoryPlanner`](../IdleSpectator/Story/StoryPlanner.cs) as chapter beats. Durable observed facts live in [`LifeSagaMemory`](../IdleSpectator/Story/LifeSagaMemory.cs) and survive roster churn. ## Ownership | Concern | Owner | |---------|--------| | Top-10 MCs, diversity, Prefer | `LifeSagaRoster` | | Durable observed facts | `LifeSagaMemory` | | Adaptive presentation | `LifeSagaPresentation` | | Dossier / Saga tabs + hover preview | `LifeSagaViewController` | | Saga body UI | `LifeSagaPanel` | | Rail icons / Prefer click | `LifeSagaRail` | | Camera read-pause lease | `InterestDirector` | | Short climax → aftermath → epilogue | `StoryPlanner` (thinned) | | Spine under tip | `StoryPlanner.FormatSpineLabel` | | Full history | Chronicle / Lore | ## Admission Live discovery (no tip-string allowlists): - Game favorite, king, city leader, kills/renown floors (`InterestScoring.IsNotable`) - Pack alpha, clan chief, army captain, active plot author, founder, species singleton Standing is recomputed from live roles each refill. Heat comes from chapter stamps / featured tips and decays with idle time. Each slot keeps its original admission reason even when its live role later changes. Hard-arc admissions also retain the arc kind and chapter context that brought the life onto the roster. ## Dynamic top-10 - Cap stays 10; order follows Effective = Standing + Heat + pin bonuses. - Prefer and WorldBox favorites are hard pins and fully count toward Cap. - Admission-role units always compete on the periodic scan. - Non-admission "nobodies" challenge Cap only via hard-arc chapter stamps (Combat / War / Plot / Love / Grief). - Hard-arc admit heat escalates with climax age (re-stamped while the arc holds) so a prolonged stranger duel can displace dull Cap slots and light Active chrome. - Soft `NoteFeatured` heats existing MCs only. - Newcomers need a small challenger margin over the weakest non-pin so the rail does not thrash. ## Camera (soft) - No rail camera lock. Prefer is a toggle soft-favorite for idle scoring. - Score ladder: crisis ownership > active short-arc ownership > Prefer soft > MC soft > MC cast > CausalHeat. - `nearTieEpsilon` (8) picks #1 for ordinary gaps; Prefer/MC/cast may still win within `sagaNearTieEpsilon` (28). - Soft ranks: Prefer > MC > MC cast (lover/friend/kin/earned rival of a roster MC). - Tips that touch two or more roster MCs get `sagaCrossMcBonus`. - Mid-fight follow uses Prefer/MC/cast soft weight in `CombatFocusWeight` (spectacle floors can still win). - Ambient / character-fill yields immediately to Prefer/MC tips (not vs crisis/combat/short-arc holds). - Soft-fill quiet still suppresses anonymous crumbs; Prefer/MC tips may break quiet. - Glyph hover acquires a camera read-pause lease: feeds/story/roster continue, but selection and focus repair are deferred until release. ## Rail UX - Up to 10 slots with live inspect-UI sprites (refreshed ~3x/sec for animation frames). - Egg forms and tiny/blank atlas crops fall back to the species icon (letter last). - Active chrome = camera follow MC; Involved chrome = other tip-touched MCs (subject/related/follow/pair/short-arc cast only - not mass `ParticipantIds`). - Prefer uses a star pip / distinct border. - Click toggles saga Prefer (does not mutate WorldBox unit favorite). - While on the **Saga** tab, click also pins that life as the persistent Saga subject (panel only; director bias stays Prefer/MC/cast). - Tabs sit above the cast rail; the rail is a **horizontal strip under the tabs** so Dossier↔Saga body swaps cannot move the glyphs. - **Dossier** shows the watched unit dossier; **Saga** shows the adaptive saga panel for the watched MC when on the roster. - If the watched unit is not an MC and nothing is pinned, Saga shows an empty *Pick a life from the rail* state (never a stale first-roster filler). - Hovering a glyph temporarily previews that life in the Saga body and pauses camera switching. - Leaving the glyph restores the prior tab (usually Dossier) immediately and releases the pause lease. - Hover-exit re-applies dossier reason/traits/status/history so the orange tip does not wait for a tip change. - Moving onto the panel or empty rail chrome does not keep the preview - only glyph hover does. - Relayout / glyph-to-glyph exits are ignored while the pointer is still over a glyph. - Clicking a tab during hover cancels the preview immediately and applies that tab. - Tabbed chrome locks a constant outer width so Dossier↔Saga hover cannot slide glyphs. - Saga body is a story card: lens eyebrow + name + title beside the portrait; stake, Cast, and Legacy wrap full-width under it. - No Evidence stats dump (kills/realm live on Dossier). No Open Lore button (press L). - Body height sizes to content up to a cap; Legacy beats stack as separate lines (no · soup). - Dossier story spine (`Kind · Phase`) is hidden when the orange reason already names the same kind and phase is Climax. - Never show live task/status/trait rows or call a live attack target a rival. ## Earned rivals Notable only: - Living rematches (≥ `sagaRivalEncounterThreshold`, default 3) while both are alive (sticky combat hook; kill/death do not count). - Kin blood (`killed_kin` / `kin_slain`). - War / plot opposition (opposing principals on the same war/plot tip). - MC↔MC living rematches earn rivalry one encounter sooner; a single MC kill is crossover Legacy, not automatic RivalEarned. - Cast shows living credible rivals only; weak kill-cycle `repeated_encounters` facts are pruned. - Likely succession is omitted unless a game-authored heir API probe succeeds. - Pack / kin lenses fill remaining Cast slots with live family peers (`Packmate` / `Kin`) after lover/friend/parents/children/heir/rival. ## Cross-MC moments When subject and other are both roster MCs, facts are flagged `McCrossover` (named stake/legacy prose + heat on both). Both rail glyphs light (Active + Involved) when the current tip touches multiple MCs. ## Soft-fill quiet (AFK hygiene) After hard story/crisis closers, soft-fill quiet suppresses soft-life crumbs and short interrupt FX (`stunned` / `invincible`). `FamilyPack` does not break quiet (ambient cluster fill). Combat / war / plot / outbreak / earthquake / story beats / epic strength / Prefer/MC still cut in. Quiet can refresh briefly when a soft crumb ends (bounded). ## Session - `StoryPlanner.Clear` does not wipe the roster or saga memory. - Lore browse / brief idle-off keeps the roster and memory. - World replacement, harness batch end, and `interest_saga_clear` wipe roster + memory. - Read-only soak dumps use `soak_probe` (or `snapshot` with `value=preserve`) and skip the batch-end wipe. ## Harness - `saga_roster_diversity` - `saga_camera_prefers_mc` - `saga_prefer_soft_bias` - `saga_wins_moderate_gap` - `saga_combat_follow_mc` - `saga_cast_soft_bias` - `saga_cross_mc_light` - `saga_cross_mc_kill` - `saga_rival_not_single_kill` - `saga_rival_rematch` - `saga_prefer_cuts_ambient` - `saga_hard_arc_escalates` - `saga_overview_has_mc` - `saga_adaptive_dossier` - `saga_memory_survives` - `saga_hover_read_pause` - `saga_replace_on_death` - `saga_admit_roles` - `saga_replace_weaker` - `saga_rail_active_highlight` - `saga_rail_prefer_click` - `saga_soft_fill_no_pack` See also: [story-planner.md](story-planner.md).