- Prioritize MCs, related cast, meaningful disasters, and exceptional events - Show MC connections in the dossier when following related characters - Promote rare creatures and recurring antagonists through bounded scoring - Reduce roster churn and repetitive love/combat coverage - Add performance telemetry, soak auditing, documentation, and harness coverage
550 lines
30 KiB
Markdown
550 lines
30 KiB
Markdown
# Five-MC ensemble and viewer-recognition plan
|
||
|
||
## Status
|
||
|
||
Core implementation complete; extended organic validation pending.
|
||
|
||
## 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.
|
||
- 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.
|
||
|
||
### 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 directly below Identity and 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.
|
||
- 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 to the camera dossier between Identity and Beat.
|
||
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 1–5 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_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.
|