-
Notifications
You must be signed in to change notification settings - Fork 4
Description
Summary
In evolving scenarios, the reasoning prompt currently injects timeline recap/current-development content based on global timestep, not on what each agent has actually been exposed to. This leaks information to agents before they should have it, collapsing information asymmetry and distorting behavior.
This is a correctness issue, not just realism polish.
Why This Is Major
The simulation relies on staggered exposure + network topology to model who knows what, when. If prompt construction gives every reasoning agent all prior timeline developments, exposure gating is bypassed at inference time.
Downstream effects:
- Over-synchronization of beliefs/actions
- Artificially faster convergence
- Underestimation of local disagreement/lag
- Invalid conclusions for evolving scenarios (ASI, crisis escalation, campaign dynamics)
Current Behavior (Code Evidence)
In /extropy/simulation/engine.py:
1491-1502iterates overself.scenario.timelineand buildsctx.timeline_recapfor allte.timestep < timestep1499-1500setsctx.current_developmentwhente.timestep == timestep
There is no check against agent exposure history (state.exposures, info_epoch) before adding these sections.
In /extropy/simulation/reasoning.py:
186-199always renders## What's Happened So Farand## This <unit>'s Developmentwhen present in context
So once context is globally populated, prompt leakage is guaranteed.
Expected Behavior
Agents should only see timeline developments they have plausibly learned:
- Via direct timeline exposure
- Via network propagation with provenance (
info_epoch) - Via explicit scenario semantics for globally-public events (if such a mode exists)
If an agent has not seen epoch k, prompt should not include epoch k in recap or current development.
Proposed Fix
1) Make recap/current development exposure-aware
Build timeline context per agent from exposure provenance:
- Derive
seen_epochs = {exp.info_epoch for exp in state.exposures if exp.info_epoch is not None} - Recap: include only timeline events where
te.timestep in seen_epochsandte.timestep < current_timestep - Current development: include only if
current_timestep in seen_epochs
2) Preserve intentional broadcast behavior explicitly
If we need "everyone should know this by default" semantics, model it explicitly in scenario/exposure rules (or a dedicated broadcast flag), not by unconditional prompt injection.
3) Add tests
Suggested coverage:
tests/test_engine.py:- agent not exposed to epoch 2 does not get epoch 2 in recap at timestep 3
- exposed agent does get it
tests/test_reasoning_prompts.py:- prompt sections omitted when no seen epochs
- current development shown only when seen
Acceptance Criteria
- For two agents at same timestep with different exposure histories, timeline sections differ accordingly
- No agent references unseen future/past timeline developments in prompt inputs
- Existing non-evolving scenarios unchanged
Related
- Related to (but distinct from) cost estimation mismatch in extropy estimate assumes early convergence, ignores timeline events #112
- Aligns with checklist requirement in docs: agents should reference only events they've seen