4.2 KiB
Event E2E suite (maintainable)
Goal: every catalog event is covered by automation that stays cheap when new ids are added.
Live accuracy roadmap: event-live-verification-plan.md.
Observe → confirm → emit: event-observation.md.
Tracks
| Track | Scenario | What it proves | How new events join |
|---|---|---|---|
| Inventory audits | nested in event_coverage |
Live library vs authored catalog | Add JSON row / live seed; audit fails until matched |
| A inject coverage | event_inject_coverage / ec30 |
Every camera-worthy id can register an interest key + label | Auto via EventCatalog.*.AuthoredIds |
| Live apply loop | event_live_apply_loop |
Happiness Signal + status gains via real apply | Auto loop; ledger id / id_drop / fail |
| Live relationship | event_live_relationship |
Vanilla setters/Beh + join negative; leave/family_removed/baby live fires |
Shared runner + ledger claims |
| Live pipelines | event_live_pipelines |
Traits/decisions/WorldLog/wars/eras/books/plots + building destroy; boat/combat best-effort (libraries unsupported) |
Auto loops + honest gaps |
| Live outcome smoke | event_live_outcome_smoke |
Short family + sample apply | Curated |
| Live coverage ledger | event_live_coverage |
Honest `none | feed |
Suite split (weight-aware)
| Gate | Includes | When |
|---|---|---|
event_suite |
audits + inject + apply loop + relationship + outcome smoke | Day-to-day event gate |
regression |
event_suite + event_live_pipelines (+ other product smokes) |
Full gate |
critical_smoke ×3 |
Spectator/settings/tip/exit | PR gate |
event_live_pipelines stays regression-only.
Flake budget is proven (--repeat 3 PASS); it remains heavier than day-to-day.
Coverage levels
Recorded in .harness/event-live-coverage.tsv (gitignored; regenerated each live run).
| Level | Meaning | Verified? |
|---|---|---|
none |
Inject only; no live fire this run | No |
feed |
Production feed entry with synthetic payload | Partial |
pipeline |
Vanilla fire proved the shared hook family; this id may not have fired | Partial |
id_drop |
Real fire; authored drop matched | Yes (accurate drop) |
id |
Real fire + expected note/interest | Yes |
unsupported |
No deterministic fire API; reason in notes |
Honest gap |
fail |
Unexpected miss/drop | Broken |
Inject / domain_feed never writes a live level other than leaving none.
Busy policy
Most feeds early-out on AgentHarness.Busy.
Live runners set ForceLiveEventFeeds (relationship also sets ForceRelationshipFeeds).
LiveFeedsAllowed = !Busy || ForceLiveEventFeeds || ForceRelationshipFeeds.
Ledger notes should record busy_bypass=ForceLiveEventFeeds (or the specific flag) when used.
Commands
./scripts/harness-run.sh event_inject_coverage
./scripts/harness-run.sh event_live_apply_loop
./scripts/harness-run.sh event_live_relationship
./scripts/harness-run.sh event_live_pipelines
./scripts/harness-run.sh event_suite
./scripts/harness-run.sh regression
Artifacts (under IdleSpectator/.harness/, gitignored):
event-inject-coverage.tsv- inject wiringevent-live-coverage.tsv- source of truth for live proofevent-trigger-audit.tsv- design / call-site audit (not live proof)
Design rules
- Loop
AuthoredIds- no per-id harness steps for inject/apply/traits. - Inject ≠ live.
domain_feedis never live. ForceLiveEventFeeds/LiveFeedsAllowedbypass Busy during live runners only.- Coverage levels must not over-claim (see plan).
- Registry max-96: remove/clear during mass live loops so trim does not false-fail.
- Assert fails on
fail > 0; do not fail on cameranoneuntil a budget is explicitly tightened.
Code
EventInjectCoverageHarness,EventLiveApplyLoopHarness,EventLiveRelationshipHarness,EventLivePipelinesHarnessEventLiveCoverageLedger- Asserts:
event_inject_coverage,event_live_apply_loop,event_live_relationship,event_live_pipelines,event_live_coverage