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-1502 iterates over self.scenario.timeline and builds ctx.timeline_recap for all te.timestep < timestep
1499-1500 sets ctx.current_development when te.timestep == timestep
There is no check against agent exposure history (state.exposures, info_epoch) before adding these sections.
In /extropy/simulation/reasoning.py:
186-199 always renders ## What's Happened So Far and ## This <unit>'s Development when 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_epochs and te.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
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:
Current Behavior (Code Evidence)
In
/extropy/simulation/engine.py:1491-1502iterates overself.scenario.timelineand buildsctx.timeline_recapfor allte.timestep < timestep1499-1500setsctx.current_developmentwhente.timestep == timestepThere 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 contextSo once context is globally populated, prompt leakage is guaranteed.
Expected Behavior
Agents should only see timeline developments they have plausibly learned:
info_epoch)If an agent has not seen epoch
k, prompt should not include epochkin recap or current development.Proposed Fix
1) Make recap/current development exposure-aware
Build timeline context per agent from exposure provenance:
seen_epochs = {exp.info_epoch for exp in state.exposures if exp.info_epoch is not None}te.timestep in seen_epochsandte.timestep < current_timestepcurrent_timestep in seen_epochs2) 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:tests/test_reasoning_prompts.py:Acceptance Criteria
Related