3.5 KiB
Event audit (A/B layers)
Layer B (ticker): Activity / Life coverage for live library ids - honest prose, completeness.
Layer A (story camera): only EventCatalog.IsCameraWorthy beats register interest and cut the camera.
Single inventory: EventCatalog (partials under Events/Catalogs/).
Feeds/patches register A from those dials; InterestDirector only ranks candidates.
Dials
| Dial | Layer | Role |
|---|---|---|
Happiness Presentation |
A if Signal | Ambient/Aggregate = B-only |
CreatesInterest |
A gate | Discrete / status / WorldLog / libraries |
EventStrength |
A rank | Base TotalScore (interrupt via margin) |
Completion |
A hold | Hold-until-complete kind |
MaxWatch |
A hold | Hard cap (scoring-model.json) |
EventReason / Label |
A display | Orange dossier sentence |
MaxWatch class defaults
| Class | Seconds | JSON field |
|---|---|---|
| Moment / FixedDwell | 15 | maxWatchMoment |
| Status | 30 | maxWatchStatus |
| Grief | 45 | maxWatchGrief |
| Combat | 60 | maxWatchCombat |
| Epic world | 50 | maxWatchEpic |
Peer rotate / soft cut on EventLed floors at minCameraDwell (15s).
Score-margin interrupts bypass that floor; sticky A scenes use stickyCutInMargin.
Ambient / Character fill is exempt - A events may take the camera immediately.
Sources (wired)
| Source | Primary owner | Reason factory | Notes |
|---|---|---|---|
| WorldLog | InterestFeeds.OnWorldLogMessage |
catalog / EventReason | A if CreatesInterest |
| Happiness | IngestHappiness |
catalog + EventReason | Signal = A; see event-prose-audit.md |
| Status | OnStatusChange |
EventReason.Status | Gain A if CreatesInterest; egg loss → hatch A |
| Scanner combat | WorldActivityScanner | EventReason.Fight / Battle | EventCatalog.Combat |
| War / Plot / Relationship / Trait / Building / Boat / Book / Era / Kingdom | Feeds + patches | EventReason / catalog | A via CreatesInterest; alpha via Family.setAlpha |
| Libraries | Deferred feeds | EventReason.Library | Mostly B; spectacle ids A |
| Character fill | InterestDirector.TryCharacterFill | empty Label | Only when no pending EventLed |
Layer A policy
Interesting beats register as interest candidates (Signal / CreatesInterest).
Director ranks by EventStrength + scoring - do not hard-gate interesting life off Layer A.
Happiness Ambient (B) only: got_poked, got_caught, paid_tax, just_ate, just_pooped.
Happiness Aggregates stay civic mass (B unit camera).
Status B: brief FX/cooldowns + egg gain only.
Noise still skipped at patch (not dial): building_damage chips, boat_load.
Full surface
See world-event-inventory.md for live library counts, gaps, and refresh commands.
Interrupt / hold / grace
- Instant cut when
next.TotalScore >= current + cutInMargin(sticky:stickyCutInMargin). - Ambient fill: any A EventLed may take the camera immediately.
- Else hold while
InterestCompletion.IsActiveand under MaxWatch. - Soft peer rotates on EventLed only after
minCameraDwell(15s), never during protected sticky hold without margin. - Quiet grace 6s: still-worth-watching filter, then Character fill with empty reason.
- Drops recorded in
InterestDropLog.
Mutation gap triage
mutation_discovery refreshes .harness/mutation_gaps.tsv.
Open rows are unexplained Wire candidates only.