worldbox-observer-mod/docs/five-mc-ensemble-plan.md
DazedAnon 1bbe642e5b feat(saga): enhance hover functionality and ownership management
- Introduce new hover command for second unit in saga scrubbing
- Implement logic to manage hover ownership and prevent visual conflicts
- Update WatchCaption to track blocked dossier writes during hover
- Refactor LifeSagaViewController to maintain hover session integrity
- Enhance harness scenarios to validate new hover behaviors and ownership checks
2026-07-24 15:39:33 -05:00

591 lines
33 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Five-MC ensemble and viewer-recognition plan
## Status
Core implementation complete; post-soak camera/terminology fixes implemented. Another organic
validation window is pending.
### Post-soak follow-up (implemented 2026-07-24)
- World-critical camera access is typed: active quake/outbreak, a disaster at the configured crisis
threshold, or a materially contested large war. Raw `EventStrength >= 95` no longer promotes
grief, ordinary duels, or other unrelated high-score events.
- A sub-threshold disaster spectacle such as Garden Surprise does not take an unrelated character
shot. Confirmed named disaster impact remains significant through the personal-impact lane.
- Scene cleanup and character fill revalidate MC membership immediately before switching. With a
living roster MC available, quiet fallback cannot linger on or select an arbitrary background
character.
- Location events with a rejected/dead follow clear the old dossier/focus and pan to the event, so
Meteorite and similar shots cannot retain a sleeping character's identity.
- Same-character sticky updates refresh the owned orange reason without rebuilding the dossier.
- Civilized families use `Family` / `Kin`; `Pack` / `Packmate` / `Pack Alpha` are reserved for
non-civilized creatures. WorldBox's shared Family/alpha storage is never exposed as human pack
terminology.
- Saga hover primes the new identity immediately, reads sex directly from the hovered actor, keeps
the entry font ceiling, and reveals the staged portrait only after its fixed layout is placed;
steady-state refresh never hides already-placed hover chrome.
It no longer invokes the full dossier/species-population scan before the visible name swap.
## Product outcome
IdleSpectator follows five recognizable main characters at a time. The five are the complete
visible MC ensemble, not a ten-character roster with a hidden lead tier.
The player should be able to:
1. recognize a returning MC before reading a full dossier;
2. understand what changed since the MC was last shown;
3. notice when two MC stories cross;
4. tell why a newcomer entered and why a former MC left; and
5. recount at least one MC's story after an ordinary spectator session.
Five limits attention; it does not limit durable history. Narrative records, Chronicle history,
Legacy, and saved Prefer choices survive roster churn.
Background lives continue to be observed and scored, but observation does not imply routine camera
time. The camera primarily follows the five and their evidence-backed social/world orbit.
## Product contracts
### Roster
- `LifeSagaRoster.Cap` becomes 5.
- All five slots use the existing standing, heat, story-potential, diversity, and challenger rules.
- A slot means **current MC**. There is no second visible category such as lead, supporting MC, or
bench.
- A newcomer still needs the challenger margin to replace the weakest eligible incumbent.
- Roster order changes only when effective rank changes materially; ordinary heat decay must not
make the rail shuffle continuously.
- Leaving the five removes current MC camera bias but never deletes the character's durable story.
### Prefer and favorite overflow
Five slots cannot promise simultaneous display for an unlimited number of preferred or WorldBox
favorite characters.
- Prefer and WorldBox favorite remain strong, durable priority signals.
- Persist every Prefer choice even while that character is outside the visible five.
- Never clear a preference merely to satisfy Cap.
- When more than five pinned candidates are alive, choose the visible five deterministically:
1. current visible incumbent;
2. active meaningful narrative thread;
3. Prefer over WorldBox-favorite-only;
4. effective story score;
5. most recent confirmed meaningful development;
6. stable unit-id tie-break.
- An off-roster preferred life remains an eligible challenger and can return when its story develops
or a visible slot opens.
- Toggling Prefer on a visible MC remains immediate. Selecting an off-roster character in Chronicle
may preserve its Prefer state, but does not forcibly evict a current MC without passing the same
deterministic admission policy.
### Camera
- The scheduler remains story-first.
- Main camera selection uses this eligibility ladder:
1. world-critical interrupt;
2. meaningful development directly involving a current MC;
3. meaningful development involving confirmed MC Cast or an active MC thread/theater;
4. significant disaster impact on a named, presentable life;
5. exceptional background-character development;
6. MC/MC-Cast grounding footage when no development is ready;
7. location/world context when no suitable character footage exists.
- Prefer > MC > MC Cast remains the soft ordering within an eligible tier.
- Routine background activity is discovery-only. It may update observation, story potential, and
challenger rank, but it does not become character-fill or an ordinary camera cut.
- “Related to an MC” requires structured evidence, not proximity or name matching:
- the MC is the subject, other, pair member, theater lead, or exact event participant;
- the character is confirmed lover, friend, kin, credible foe, war/plot counterpart, or other
current Cast relation;
- the event advances the MC's active correlation, family, city, kingdom, war, plot, or consequence
thread.
- Being near an MC, sharing a species, performing the same task, or appearing in a mass participant
list is not sufficient by itself.
- Prefer state is a strong bias but does not turn routine texture into a meaningful development.
- Exposure debt is recalibrated for five characters so it does not mechanically rotate through all
five when no meaningful footage exists.
- World-critical events retain interruption priority.
- A displaced former MC loses MC bonus immediately but may still be shown for a payoff, consequence,
death, or world-critical event.
### Background challengers
- Background characters accumulate story potential from confirmed developments without needing a
camera cut.
- Ordinary combat, chores, travel, moods, repeated intent, and unchanged status do not qualify as
exceptional background developments.
- An exceptional background development must be both semantically meaningful and rare/high-impact,
for example:
- founding a city or kingdom;
- becoming or losing a major ruler/leader role;
- confirmed birth, death, bond, betrayal/opposition, or decisive survival consequence with high
narrative magnitude;
- a decisive war/plot outcome;
- confirmed severe disaster impact;
- another typed turning point, resolution, or consequence above an explicit background threshold.
- An exceptional background cut is an audition, not instant MC promotion. Admission still uses
accumulated story potential, diversity, standing, and the challenger margin.
- Repeated exceptional cuts for the same non-MC are cooled aggressively. If the life continues to
matter, it should enter the five instead of functioning as an unofficial sixth MC.
- Background camera share is measured and bounded. In a valid developed-world soak, non-critical
cuts whose subject is neither MC nor confirmed MC Cast should be exceptional and individually
explainable from telemetry.
### Disaster significance
Disasters remain world-critical at the event/theater level. A character caught in one may also earn
a meaningful personal development.
- “Caught up in a disaster” requires confirmed impact, not mere distance from the effect:
- injured, afflicted, trapped, displaced, made homeless, or killed by the disaster;
- loses confirmed family, home, city, role, or another durable stake because of it;
- survives a directly observed severe impact or participates in a confirmed rescue/response;
- is an exact affected participant in a typed disaster event whose outcome is presentable.
- Proximity, entering the camera rectangle, or membership in a large nearby-unit snapshot is not
enough.
- For an affected MC or MC Cast member, the personal impact becomes a related escalation,
turning point, resolution, or consequence in that life/thread.
- For an affected background character, severe confirmed impact increases story potential and may
qualify for one exceptional background cut.
- Disaster theater coverage and personal consequence are separate shots. Do not repeat the same
fact once as “disaster spectacle” and again as a personal Beat unless the second shot adds a
confirmed outcome.
- Mass casualty events use bounded representative selection: prefer affected MCs, then MC Cast,
then at most one exceptional background survivor/victim when it adds a distinct human-scale
consequence.
### Performance
The five-MC change must reduce or preserve runtime cost. It must not trade a smaller rail for more
frequent world scans, full-store walks, roster rebuilds, portrait churn, or UI relayout.
- Reuse the existing amortized world scan: walk a bounded unit slice per frame and build only a
bounded challenger slice.
- Cap reduction changes the number of visible slots, not the cadence of admission scans.
- Rank existing slots or bounded challengers in memory; never rescan the world because heat,
presentation, portrait state, or Prefer changes.
- Pin overflow uses cached story/identity indexes and the existing challenger pool. It must not walk
all persisted events or all living units during a normal refill.
- Stable rail order should reduce portrait rebinding and layout work. A no-op refill must produce no
rail rebuild, portrait capture, or dossier relayout.
- Reentry, crossover, admission, and closure presentation must use exact event receipts and indexed
story state rather than latest-similar searches.
- Apply camera eligibility before expensive presentability/prose work where the required structured
ids and narrative function are already available.
- Carry Connection as a small typed model (`AnchorMcId`, relation/context kind, evidence source) and
render it only when the dossier fingerprint changes. Do not query all five MC memories every
frame.
- Disaster impact routing must consume typed affected participants/outcomes from the event receipt;
it must not add a recurring radius scan over the world.
- Diagnostic logging remains rate-limited because the probe itself can create GC/I/O hitches.
- Performance gates are evaluated on a developed world with Idle Spectator active, not only on a
small synthetic map.
### Recognition
Recognition should come from repeated, stable signals rather than extra prose on every cut.
- Keep rail position stable for an incumbent whenever possible.
- Keep each unit's latest unique portrait cached for the duration of roster membership and through a
death/Legacy presentation.
- Treat species icons as temporary display fallbacks, never cached portraits; retry one missing
inactive live frame per second so eggs/render-not-ready slots eventually acquire their own look.
- For creature glyphs, capture the palette-resolved generated current animation frame, falling
back to the raw frame only when generation fails, and reject frames that resolve to the shared
species-icon atlas region. Never accept the creature inspect composite as a live frame because
WorldBox can copy the standing species portrait into a new texture. Preserve genuine tiny
animation frames (down to the 3x2 fly/beetle family).
- On a meaningful return after the existing reentry threshold, allow one concise reintroduction:
`Name again · <new development>`.
- Do not use reintroduction wording for rapid A → B → A cuts, unchanged activity, or texture.
- Identity remains `Name · real title`, otherwise `Name (species/job)`.
- Hover remains the place for Cast and Legacy depth; the live caption stays Identity + Beat +
Context.
- Treat a glyph-to-glyph scrub as one hover ownership session: defer exit briefly, block all
camera-dossier writes to shared header chrome, and restore the camera name only after a true exit.
### MC connection in the camera dossier
When the camera follows a non-MC because of an MC connection, the viewer must see that connection
immediately.
- Add one muted, single-line **Connection** row at the start of the bottom narrative group,
directly above the orange Beat:
```text
Identity Omya (Human)
Connection Waf's daughter
Beat Escapes the burning city
Context Waf's family is scattered
```
- Connection is presentation metadata. It does not become part of the event sentence or replace
story Context.
- The orange Beat is strictly event-owned. Character grounding has no Beat; species, job, traits,
city, and other identity fallbacks never occupy this row.
- When an event's exact named participant has a typed relation to a current MC and that relation is
not already stated, Beat may add one compact qualifier: `Kills Omya (child of Waf)`. This explains
significance without turning the focused character's Connection into duplicate prose.
- Render Identity → portrait/history → status/trait details → Connection → Beat → Context.
Bottom-grouping the narrative rows keeps the portrait anchored when Saga hover hides them.
- Prefer the clearest confirmed relation: `Waf's partner`, `Waf's daughter`, `Waf's father`,
`Waf's best friend`, `Waf's old foe`, `Fights beside Waf`, `Opposes Waf in the war`, or
`Caught in Waf's city`.
- Name one anchor MC. If several MCs are involved, prefer the MC whose active thread admitted the
shot; otherwise use the strongest direct relation. Additional MCs remain visible through involved
rail glyphs.
- Durable social relations outrank temporary theater/context relations.
- Show Connection only when the focused character is not an MC, eligibility is `McCast` or
`McThreadContext`, and an exact anchor MC id plus typed evidence is available.
- Do not show Connection for an unrelated exceptional-background audition. Its Beat must explain
the exceptional event directly.
- Disaster wording distinguishes relationship from geography: use `Waf's daughter` when confirmed,
otherwise factual context such as `Caught in Waf's city`.
- Never derive Connection from display-name parsing, proximity alone, broad participant inventory,
or final prose.
- Clear Connection atomically when focus returns to an MC, world/location shot, unrelated
exceptional character, or Saga hover.
- Saga hover continues to show the hovered MC's Cast/Legacy and never retains the camera subject's
Connection row.
- Long lines remain one row. Ellipsize the MC name before removing the relation label; never wrap.
### Cross-MC moments
- A tip touching two or more of the five lights every involved rail glyph.
- The orange Beat names the confirmed relationship or opposition once.
- Both characters receive crossover heat and durable perspective projections where supported by the
recorded event.
- Cross-MC presentation must not invent “team,” “friend,” “rival,” or shared motive from mere
co-location.
### Entrances, exits, and closure
- Admission records retain the evidence that made the character an MC.
- The first meaningful camera appearance after admission may use Context to communicate that evidence
when it is not already obvious from Identity or Beat.
- Ordinary roster replacement is silent; avoid UI announcements for score churn.
- Death, completed war/plot, lost leadership, and resolved relationship arcs may produce a bounded
payoff or Legacy chapter before/after roster removal when presentable evidence exists.
- No synthetic farewell is created solely because a character fell to rank six.
## Work phases
### Phase 0 — Baseline and instrumentation
1. Record a release baseline with the current ten-character roster:
- authored cuts per MC;
- unique MCs shown;
- longest absence before return;
- number of roster replacements;
- exact rail reorder count;
- cross-MC cuts;
- cuts by subject class: MC, MC Cast, exceptional background, world/location-only;
- reason for every exceptional background cut;
- disaster theater cuts versus confirmed personal-impact cuts;
- combat share and maximum combat run;
- unresolved preferred/favorite overflow;
- hitch count and maximum frame delta;
- maximum director, discovery, and caption slice;
- maximum roster world-scan and soft-refill slice;
- scheduler tick time and candidate count;
- portrait/reconcile time while rail membership is stable and while it changes.
2. Add a compact roster diagnostic containing visible ids, effective scores, pin source, admission
reason, last meaningful development, and replacement reason.
3. Capture the baseline with the existing `hitch_probe`, `narrative_scheduler_health`, and
`soak_probe` paths.
4. Extend `scripts/soak-audit-player-log.sh` to summarize `[HITCH]` detail/summary lines in the
selected byte window. Report active-only spike count, maximum frame delta, and maximum
director/discovery/caption/roster/scheduler slices alongside editorial results.
5. Do not tune scoring or performance thresholds during baseline capture.
Exit: one valid developed-world sample can explain every visible admission and eviction and provides
a reproducible performance baseline from the same log window. It also establishes the current
non-MC camera share and the selection path responsible for it.
### Phase 1 — Reduce the roster safely
1. Change the single roster capacity constant from 10 to 5.
2. Audit loops, buffers, portrait caches, layout calculations, harness fixtures, prose, and
documentation for hard-coded ten-slot assumptions.
3. Keep scratch-buffer capacities independent where they represent challenger pools rather than
visible slots.
4. Implement deterministic pin overflow without deleting persisted preferences.
5. On loading an existing sidecar, rebuild the visible five from live candidates; do not migrate or
rewrite narrative event data merely because the presentation cap changed.
6. Ensure a full five with all visible characters pinned cannot cause a crash, forced arbitrary
removal, or permanent challenger starvation.
7. Preserve the existing `WorldScanUnitsPerFrame`, `WorldScanBuildsPerFrame`, and timed scan cadence
unless profiling demonstrates a measured need to change them.
8. Keep overflow arbitration inside the bounded rank/cap stage. Do not add a second scan or a
per-frame sort of every persisted preferred character.
Exit: old saves load, five glyphs render, all durable preferences remain queryable, and selection is
stable across two rebuilds with identical inputs. A no-op rebuild stays within the baseline soft
refill budget.
### Phase 2 — Stable recognition
1. Preserve incumbent rail order unless an admission, removal, death, or material rank crossing
occurs.
2. Verify portrait identity for same-species MCs and retain the last valid portrait for fallen MCs.
3. Tighten the existing reentry behavior:
- MC only;
- meaningful typed development only;
- minimum absence threshold;
- one use per semantic development.
4. Make the current camera MC and all involved MCs visually distinguishable without relying only on
color.
5. Add a small discoverable tooltip for Prefer that states it is a camera/story bias, not a camera
lock.
6. Bind and relayout the rail only when its ordered unit-id sequence or visible state actually
changes. Refresh a live portrait at the existing bounded cadence; do not refresh five portraits
every frame.
7. Add the one-line Connection slot above Beat in the bottom narrative group.
8. Measure maximum authored Connection strings at supported UI scales and keep them to one
ellipsized line.
9. Include Connection identity in the dossier fingerprint so focus changes update atomically
without recomposing unchanged prose every frame.
Exit: a player can scrub the five glyphs without geometry movement or identity ambiguity, and a
returning MC is identifiable without opening Chronicle. Repeated no-change UI frames do not add
caption or portrait slice regressions.
### Phase 3 — Entrances, crossovers, and closure
1. Expose admission evidence to presentation as structured context, not a final authored string.
2. Show it only on the first suitable post-admission appearance and suppress it when Beat or
Identity already communicates the same fact.
3. Verify cross-MC participant inventory uses exact event receipts and lights the correct glyphs.
4. Allow confirmed payoff/consequence shots for a recently displaced or dead MC without restoring
roster membership solely for the shot.
5. Verify Legacy records the lasting consequence once and does not echo current Cast or Identity.
6. Confirm all new presentation lookups are O(1) or bounded by five/current event participants; no
presentation frame may enumerate the full narrative event store.
Exit: admission, crossover, displacement, and death each have an evidence-backed presentation path
with no synthetic emotion or duplicate prose.
### Phase 4 — MC-orbit camera eligibility
1. Add one shared camera-eligibility classifier at or immediately after candidate intake. It returns:
- `McDirect`;
- `McCast`;
- `McThreadContext`;
- `DisasterPersonalImpact`;
- `ExceptionalBackground`;
- `WorldCritical`;
- `GroundingFill`;
- `DiscoveryOnly`.
2. Compute the class from typed participant ids, exact narrative development/thread identity,
durable relation evidence, event outcome, and narrative function. Do not infer it from final
prose.
3. For `McCast` and `McThreadContext`, return a typed connection payload containing the selected
anchor MC and evidence kind. Eligibility and UI consume the same result.
4. Use the class consistently in scheduler proposals, interrupts, ordinary selection, character
fill, switch policy, telemetry, and soak audit.
5. Replace anonymous `TryCharacterFill` behavior with:
- current Prefer/MC;
- living confirmed MC Cast;
- a location/theater establishing shot;
- no character cut when none qualifies.
6. Keep discovery-only candidates in the narrative/admission pipeline while excluding them from the
ordinary camera pool.
7. Define an authored/configurable exceptional-background threshold using narrative function,
magnitude, event strength, novelty, and confirmed outcome. Raw combat score alone cannot pass it.
8. Add a long cooldown and per-window budget for exceptional background cuts.
9. Record why each non-MC/non-Cast character cut passed eligibility and the anchor/evidence used for
every MC-related non-MC cut.
Exit: every routine character cut is MC-orbit footage; every background-character cut has an
explicit exceptional reason; background story potential and roster challenges still advance. Every
MC-related non-MC cut displays the same typed connection that granted camera eligibility.
### Phase 5 — Disaster impact
1. Extend canonical disaster observations with typed affected-character outcome where the game hook
can confirm it.
2. Project confirmed personal impact into the affected life without duplicating the world disaster
record.
3. Attach exact affected ids and outcome evidence to the candidate/event receipt.
4. Route MC/MC-Cast impact into the active life story when related.
5. Route severe background impact into story potential and the exceptional-background gate.
6. Bound representative selection for mass impact and cool repeated theater/personal cards.
7. Add telemetry for:
- affected count;
- confirmed versus proximity-only inventory;
- selected representative class;
- world card followed by distinct personal outcome;
- suppressed duplicate/proximity candidates.
Exit: an MC struck by a disaster produces a coherent personal consequence, a severely affected
background life can emerge, and nearby unaffected units do not receive significance.
### Phase 6 — Tune five-character pacing
Tune only after Phases 15 are observable.
1. Compare five-character results with the Phase 0 baseline.
2. Adjust challenger margin, heat cap/decay, MC weight, Prefer weight, crossover bonus, and exposure
debt only when a measured failure points to that knob.
3. Target:
- at least three of the five receive meaningful developments in a ten-minute developed-world
session when footage exists;
- no forced round-robin texture cuts;
- no more than two unexplained roster replacements per ten minutes;
- no immediate eviction/re-admission loop;
- critical world-event latency remains unchanged;
- combat remains below the existing 35% editorial gate;
- routine background-character cuts are zero;
- exceptional background cuts remain below 10% of authored character cuts unless a
world-critical mass-casualty sequence is active;
- every exceptional background cut has a typed reason and confirmed change/outcome;
- at least one multi-development character thread is intelligible in the cut trace.
4. If the same offices always occupy all five slots, tune diversity/admission rather than adding
slots back.
Exit: the five feel recurring and distinct without narrowing world coverage to five camera targets.
### Phase 7 — Performance gate
1. Run `narrative_scheduler_health` with `hitch_probe` enabled on a developed world.
2. Run a valid ten-minute active soak and audit the exact byte window with the extended soak tool.
3. Compare against Phase 0:
- no regression in maximum director, discovery, or caption slice;
- no increase in scheduler candidate bound;
- no recurring roster slice at or above the probe's 4 ms attribution threshold;
- no new periodic frame-spike pattern at the 3.5-second roster-scan cadence;
- no caption/portrait spike pattern while hovering or scrubbing all five glyphs;
- showing/hiding Connection does not create a new caption relayout spike pattern;
- no unbounded growth in narrative graph counts or compaction time;
- fewer or equal rail rebuilds and portrait binds per minute.
4. Exercise worst cases separately:
- a mature high-population world;
- more than five live preferred/favorite characters;
- five same-species MCs with unique portrait captures;
- rapid crossover events touching several MCs;
- repeated admission challenges that do not cross the margin;
- save/load followed by the first roster rebuild.
5. Treat a threshold failure as a profiling task. Attribute it using the existing director,
discovery, caption, scheduler-part, selector-part, feed-part, roster scan, and soft-refill
timings before changing cadence or budgets.
Exit: the developed-world sample meets the existing hitch thresholds with no regression from the
ten-MC baseline, and no new work scales per frame with world population or durable event count.
### Phase 8 — Viewer-comprehension validation
1. Run deterministic harness coverage.
2. Run a ten-minute organic soak on a developed world.
3. Capture screenshots/video for:
- five full rail slots;
- two same-species MCs;
- active + involved crossover;
- non-MC partner/child/friend/foe with visible Connection;
- non-MC temporary war/disaster context with factual Connection;
- preferred overflow;
- newcomer admission;
- returning MC reintroduction;
- fallen MC Legacy.
4. Review the cut trace without inspecting internal state and write a short account of each MC.
5. The release succeeds only if at least one life can be summarized as a sequence of connected
changes rather than a list of activities.
## Deterministic verification
Add or update these scenarios:
- `saga_roster_cap_five` — six eligible lives produce exactly five visible MCs.
- `saga_cap_shrink_preserves_memory` — former slots retain durable events and Legacy.
- `saga_prefer_overflow_stable` — six or more preferred/favorite lives select the same five on
repeated rebuilds without erasing preferences.
- `saga_preferred_challenger_returns` — an off-roster preferred life can re-enter after meaningful
development.
- `saga_incumbent_order_stable` — heat refresh without material rank crossing does not reorder the
rail.
- `saga_reentry_meaningful_once` — return voice appears once for a new semantic development and not
for texture or rapid cutback.
- `saga_cross_mc_five` — exact participants light Active/Involved glyphs and heat both MCs.
- `saga_displaced_payoff` — a displaced former MC may receive a confirmed consequence shot without
silently becoming an MC again.
- `saga_death_closure_five` — death preserves the final portrait and produces one bounded Legacy
consequence.
- `saga_camera_world_coverage_five` — strangers and world-critical events remain camera-eligible.
- `saga_background_texture_discovery_only` — a non-MC routine event grows no camera eligibility
while remaining observable by admission/story systems.
- `saga_background_exceptional_audition` — a confirmed high-impact turning point receives one
cooled cut without automatically granting MC membership.
- `saga_background_repeats_require_admission` — repeated non-MC developments cannot create an
unofficial sixth MC through camera repetition.
- `saga_fill_prefers_mc_orbit` — fill chooses MC, then confirmed MC Cast, then location/no cut;
never an anonymous routine actor.
- `saga_related_requires_evidence` — proximity, species, and broad participant snapshots do not
classify a character as MC Cast/thread context.
- `saga_connection_matches_eligibility` — every MC-related non-MC cut displays the same anchor MC
and evidence kind that admitted it.
- `saga_connection_relation_priority` — durable partner/kin/friend/foe wording wins over temporary
shared-theater wording.
- `saga_connection_multi_mc_anchor` — the active-thread MC is named while other exact MCs light as
involved.
- `saga_connection_clears_atomically` — the row disappears on MC, unrelated, location, and Saga
hover transitions without showing stale identity for a frame.
- `saga_connection_bounded_layout` — long names remain inside one row at every supported UI scale.
- `saga_exceptional_background_no_fake_connection` — an unrelated exceptional audition shows no
Connection row.
- `saga_disaster_mc_impact` — confirmed disaster harm to an MC becomes a personal consequence after
theater coverage.
- `saga_disaster_background_significance` — severe confirmed impact can audition a background life
and increase story potential.
- `saga_disaster_proximity_not_significance` — nearby unaffected characters receive neither a
personal Beat nor disaster story potential.
- `saga_disaster_representative_bounded` — mass impact selects MC/MC Cast first and at most one
distinct exceptional background representative.
- `saga_five_refill_bounded` — no-op, challenger, and pin-overflow refills remain bounded and do not
start an extra world scan.
- `saga_five_ui_noop_perf` — stable rail frames do not relayout or recapture unchanged portraits.
- `saga_rail_species_frame_sweep` — amortized exhaustive actor-library sweep proves every standard
renderer resolves to a live frame; separate special-renderer assets are reported explicitly.
- `saga_five_perf_health` — hitch probe plus scheduler/roster metrics stay inside the release
thresholds during a directed developed-world sample.
Retain the existing roster diversity, replacement, Prefer, camera-bias, crossover, persistence,
caption, Legacy, scheduler, presentability, scheduler-health, and runtime-compaction regressions.
## Documentation updates at cutover
- Replace “top-10,” “up to 10,” and “ten-slot roster” with the five-MC contract in `README.md`,
`docs/life-saga.md`, and `docs/story-planner.md`.
- Update completed historical plans only with a short supersession note; do not rewrite historical
soak evidence that accurately describes the former ten-character build.
- Resolve `docs/saga-ux-redesign-plan.md` status against the implemented fixed panel and add its
missing named UX scenarios to the release gate.
## Non-goals
- The camera is not restricted to the five.
- Five does not cap Chronicle, graves, durable narrative memory, or the number of lives that may
become MCs over a world's history.
- No lead/supporting sub-tier is added inside the five.
- No fabricated transition, farewell, motive, emotion, or relationship is added to explain roster
scoring.
- No camera exclusivity that hides world-critical events or genuinely exceptional background
turning points.
- No automatic deletion of old Prefer choices.
- This work does not reopen the story-first scheduler cutover or add new event families.
## Definition of done
- Exactly five MCs are visible and camera-biased at once.
- Existing saves and narrative sidecars load without story loss or preference deletion.
- Pin overflow is deterministic and reversible.
- Routine background lives develop off-camera; camera character shifts primarily follow MCs and
confirmed MC Cast/thread context.
- Exceptional background and personal-disaster cuts require typed, telemetry-visible evidence.
- Every MC-related non-MC focus explains its exact MC connection in the camera dossier.
- Normal refill, presentation, and hover work remains bounded and does not introduce a new hitch
pattern.
- The extended soak audit reports performance and editorial health from the same active window.
- Rail order and portraits make the five recognizable.
- Entrances, returns, crossovers, and durable closure are evidence-backed and non-repetitive.
- The camera still covers meaningful strangers and world-scale events.
- Deterministic scenarios and the full existing regression pass.
- A valid organic session produces at least one recountable multi-development character story.