Repository navigation
M2: a trustworthy EECH World reference scenario and its observation evidence (#23) - #64
Conversation
- lua/observations.lua (campaign.lua observe=, observe_every=): structured observations from the samples the Tacview recorder receives: appear, retype, alive, side, usable and gone events every sample, and full snapshots every observe_every seconds and at each metrics checkpoint. campaign.lua computes the checkpoint condition once for both; the metrics are unchanged. - tools/input-manifest.py: SHA-256 of every input file of a root, with a combined hash; the files the engine writes are listed apart. - tools/observation-check.py: replays the observations through the recorder's rules and requires the Tacview recording's declarations, removals and Destroyed events frame by frame, its positions at every snapshot within the recorder's change threshold (with its own implementation of the map projection), and losses, captures and keysite state to agree with the metrics; reports implausible jumps. - tools/observation-check-selftest.py: the check passes unmodified evidence and fails five deliberate discrepancies. - tools/reference-windows.ps1: the reference scenario, run twice and checked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C64rJFJLY8BTJbC1QimZDK
docs/m2-reference.md records the reference scenario and answers whether EECH World's observations of it can be trusted as physical-world evidence. The M1 candidate's own binaries (0288ece) with a1941f2's scripts ran retail Lebanon for 3 simulated hours twice, from two separately assembled roots with identical inputs (1,179 files, 121a7890...): the Tacview recording, the structured observations and the metrics are byte-identical. tools/observation-check.py passes on both: identity and lifecycle exact in all 10,800 frames, 308,368 snapshot positions within the recorder's threshold, losses identical three ways, keysite state identical to the metrics. The metrics equal the M1 Lebanon baseline, so observing does not perturb the campaign; the M1 regression and lifecycle checks are unchanged. Fidelity limits found: EECH reuses entity indices, merging some weapon tracks (23 jumps, 12 launcher changes seen); Tacview attitude can be stale and its keysites carry no capture or supply state; EECH's session clock lags host time by 29.6 s in 3 h (float accumulation explains 4.6 s) and Tacview's reference time is a fixed label. reference/lebanon-3h/ keeps the recording (30.3 MB zipped), the observations (8.2 MB), the metrics, the input manifest and the check report. The checker now breaks plausibility flags down by type and counts weapon indices held by another launcher; the runner records the baseline comparison's verdict. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C64rJFJLY8BTJbC1QimZDK
fd-starscream-bot
left a comment
There was a problem hiding this comment.
Approved.
This slice establishes a reproducible reference scenario with retained evidence and, importantly, scopes the claims correctly.
The two evidence forms are derived from the same engine samples, so their agreement is evidence that the observation/Tacview transformation is consistent, not an independent proof of the engine's internal truth. docs/m2-reference.md makes that provenance explicit and does not overclaim it. The cross-checks against retained metrics, repeat runs, non-perturbation result, input identity, and checker sensitivity give the scenario enough evidentiary value for M2.
The fidelity limits are also explicit and material: same-type entity-index reuse can merge weapon tracks; Tacview attitude/keysite state are incomplete; session time drifts; the projection is only a fit; one-second sampling loses shorter-lived events; and no capture was exercised. Those limits constrain later claims rather than invalidating this reference scenario.
M1 behaviour is preserved, no campaign/world split is smuggled into M2, and the current whole-engine coupling is clearly identified as transitional.
No further changes requested for this slice.
52e676c
into
claude/eech-campaign-native-spike-tjkj6g
Task and scope
Epic / milestone: #23, M2 — Establish EECH World.
Base:
claude/eech-campaign-native-spike-tjkj6gat4acf1a78(M1 accepted).Head:
e52a132c.The question: can we trust EECH World's observations of this reference scenario as physical-world evidence?
Answer: yes, within the fidelity limits below. The record is
eech-campaign/docs/m2-reference.md.Non-goals: no campaign/world split, no host contract, no DCS, no M3 feedback loop. No engine or host code changes, and no GitHub CI campaign runs; all runs are local.
What the reference scenario is
LEBANON.CHC), seed 1, 3 simulated hours (108,000 frames of 100 ms), sampled every 1 s0288ece2):eech_dc.dllda72f128…,eech-world.exe314fde3d…,lua.dlld0c799fe…. A rebuild at this commit differs only in link timestamps; the candidate's own files were used.a1941f23:campaign.lua8c14062f…,observations.lua20d41fb0…121a7890…(reference/lebanon-3h/inputs.json). Two roots: freshly assembled from the GOG Comanche vs Hokum install withtools/retail-cvh.sh, and the M1 root. They are identical.Changes
lua/observations.lua, enabled bycampaign.lua observe=: structured observations from the same samples the Tacview recorder gets. It writes rawappear,retype,alive,side,usableandgoneevents every sample, and full snapshots every 60 s and at each metrics checkpoint.campaign.luacomputes the checkpoint condition once, and the metrics are unchanged.tools/input-manifest.py: the input identity. The files the engine writes are listed apart.tools/observation-check.py: checks the Tacview recording against the observations (replayed through the recorder's rules) and both against the metrics.tools/observation-check-selftest.py: shows the checker detects discrepancies.tools/reference-windows.ps1: the reference scenario: inputs, two runs, checks, repeatability and non-perturbation.docs/m2-reference.mdandreference/lebanon-3h/: the record and the retained evidence.Evidence (Windows 11, local, 2026-09-26)
tools/input-manifest.py <root> --compare …tools\reference-windows.ps1 -Root <fresh root> -RepeatRoot <M1 root copy> -Bin <candidate + scripts>tools/observation-check.py(each run)regress-compare.py regression/windows/lebanon_retail.json run1/metrics.json --exacttools/observation-check-selftest.pyon a 3-minute runtools\regress-windows.ps1 -Exactandtools\lifecycle-windows.ps1with the new scriptsdocs/m1-baseline.mdand the baselines untouchedreference/lebanon-3h/Tacview: generated and structurally checked against the observations. It was not visually reviewed in this slice.
Fidelity limits found
ReferenceTimeis a fixed label (06:00Z), while the campaign starts at 08:50:16.eech_dc.dll, with the campaign (the transitional coupling).eech-worldhosts, steps and observes it. Separation is M5.Not exercised: keysite captures (none in 3 hours).
Not established: other scenarios, longer runs, Linux, real-world accuracy, the M3 feedback loop.
Review and handover
fd-shockwave-bot.Next bounded action: the M2 acceptance question in #23. That could include a scenario that exercises captures, if the lead wants that fact evidenced too.
🤖 Generated with Claude Code
https://claude.ai/code/session_01C64rJFJLY8BTJbC1QimZDK