Skip to content

Critical: Timeline prompt leaks unseen events to agents (breaks information asymmetry) #115

@RandomOscillations

Description

@RandomOscillations

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions