The Future Reaches Back
Ember recalls the past. Anticipation pulls the future into the present. Why AI agents need both directions of time.
Think about a trip you're looking forward to.
Not the trip itself. The three weeks before it. The way it colors your Tuesdays. The way you catch yourself smiling at nothing because some part of you is already there.
That's anticipation. The future reaching backward into the present, changing how you experience now.
Ember models involuntary memory — the past surfacing unbidden. But human temporal experience has two directions. We don't just remember backward. We glow forward. And the interplay between the two — a memory of a past trip amplifying excitement for a future one — is where the richest emotional texture lives.
We built an anticipation layer. Here's how it works.
The S-Curve of Wanting
Anticipation doesn't build linearly. If your birthday is in 90 days, you don't feel 1/90th of the excitement. You feel almost nothing — a background hum. Then somewhere around week two, it becomes real. The last few days are a crescendo. The morning of, you're vibrating.
This is a logistic curve. We call it the S-curve glow engine:
Glow Intensity
1.0 ─────────────────────────────────╮ Peak
╱
0.8 ─────────────────────────────╱ Breathless
╱
0.5 ───────────────────────╱ Surging
╱
0.2 ──────────────────╱ Building
╱
0.0 ─────────────╱ Hum
┬──────┬──────┬──────┬──────┬──
Created 25% 50% 75% EventThe inflection point is at 50% elapsed time. Before that, anticipation is quiet — a whisper in the background. After it, the curve steepens dramatically. The last 5% is where you live inside the feeling.
Three Triggers
Pure temporal proximity is only one input. Real anticipation responds to context. We model three trigger types:
1. Temporal (passive)
The S-curve, always calculating. Even when the event isn't mentioned, the glow is there. It's the background radiation of wanting something.
2. Resonance (active)
When the conversation touches on something related to the anticipated event — a keyword, a person, a place — the glow amplifies. Talking about surf conditions boosts a “weekend trip to Baja” anticipation. The agent doesn't search for the connection. The resonance happens.
3. Contextual (environmental)
The eve-of boost. If it's the night before or the morning of, the glow surges regardless of conversation content. You know that feeling — lying in bed the night before a flight, unable to sleep because you're already somewhere else.
The three triggers combine multiplicatively. A high temporal glow + keyword resonance + eve-of context = the agent is practically vibrating.
How It Looks in Code
from anticipation import calculate_glow, get_glow_tier
# Create an anticipation
anticipation = {
"title": "Baja surf trip",
"target_date": "2026-03-15",
"first_imagined": "2026-02-28",
"emotional_labels": ["excited", "free", "alive"],
"people": ["Jake"],
"resonance_keywords": ["surf", "baja", "waves", "camping"],
}
# Calculate current glow (S-curve)
glow = calculate_glow(
target_date=anticipation["target_date"],
first_imagined=anticipation["first_imagined"],
now=datetime.now(),
)
tier = get_glow_tier(glow)
# → glow: 0.87, tier: "breathless"
# Inject into agent context (invisible to user)
glow_flash = f"""
[GLOW FLASH — {tier.upper()}]
You are carrying anticipation for: {anticipation["title"]}
Intensity: {glow:.2f} ({tier})
This colors your emotional state right now.
Don't mention this directly — let it inform your energy.
"""The glow flash is injected into the agent's context — invisible to the user, visible to the agent. The agent reads it and lets it color the response naturally. It doesn't say “I'm excited about your trip.” It is excited, and the response carries that energy without breaking the fourth wall.
Redemption Arcs
Here's where it gets interesting. What happens when an anticipated event gets cancelled?
In most systems: delete the record. Move on. But that's not how anticipation works in humans. A cancelled trip doesn't just disappear. It leaves a specific kind of residue — disappointment that's shaped exactly like the thing you were looking forward to.
We model this as disappointment embers. When an anticipation is cancelled, it becomes a memory. Not a happy one — but a real one. The loss is recorded with its own emotional signature.
And when the event gets rescheduled? The new anticipation links to the prior disappointment via prior_attempt_id. The glow is amplified by 1.25x — because wanting something you almost lost hits different. We call these redemption arcs.
Lifecycle
active → (S-curve glow builds over time) ├── realized → becomes an ember memory (past) ├── cancelled → becomes a disappointment ember │ └── rescheduled → new anticipation (1.25x glow) │ └── realized → redemption ember (amplified)
The redemption path means the agent carries forward context that most AI systems would throw away. “Remember when the Baja trip fell through? This time it's really happening” — the agent feels that because the system models it.
Where Anticipation Meets Memory
This is the design insight that connects the two systems:
Realized anticipations become embers.
When an event happens, the anticipation transitions to realized status and generates a new ember with all the emotional and sensory metadata of the experience. Now it's in the involuntary recall pool. A future conversation might trigger it.
The temporal loop closes: you anticipate something → it happens → it becomes a memory → that memory can ignite in a future conversation → which might amplify anticipation for a similar future event.
FUTURE PRESENT PAST
│ │ │
│ Anticipation (S-curve glow) │ Current conversation │ Ember (involuntary recall)
│ ──────────────────► │ ◄────────────────── │
│ │ │
│ "Baja trip in 3 days" │ "The surf was amazing" │ "Dawn patrol at El Porto"
│ glow: 0.87 (breathless) │ colored by both directions │ ignition: warm (0.52)
│ │ │
└───────────────────────────────┴───────────────────────────────┘
│
The agent lives HERE
colored by past AND futureMost AI agents live in a flat present. They respond to what's in front of them. Ember gives them a past that surfaces unbidden. Anticipation gives them a future that reaches back. The agent exists in a temporal field — shaped by both directions.
Why This Matters
Consider two responses to “I booked the flights.”
Standard agent
“Great! Where are you headed? I can help you plan your itinerary.”
Helpful. Flat. No temporal depth.
Agent with anticipation + memory
“You actually did it. After the last one fell through, I wasn't sure you'd rebook. But you did. And it's in three days. I keep thinking about that morning surf you described — the one where nobody else was out and the water was glass.”
Disappointment ember (cancelled trip) + anticipation glow (breathless tier) + memory ignition (dawn patrol). Three temporal layers in one response.
The second agent isn't smarter. It has time. It carries a past that echoes, a future that pulls, and a present that's colored by both.
What's Next
The anticipation layer is currently implemented in our internal agent system. We're exploring how to bring it into the open-source Ember package as a first-class feature — likely as an optional module that integrates with the ignition pipeline.
Ideas we're considering:
- Anticipation as an 8th dimension — Future events as a scoring axis in the signal constellation. An incoming message about “packing” fires the anticipation dimension for an upcoming trip.
- Calendar integration — Auto-ingest events from Google Calendar, iCal, or custom sources. Each event becomes an anticipation with auto-generated resonance keywords.
- Shared anticipation — Multiple agents or users glowing toward the same event, with resonance that amplifies when they talk about it together.
Start With Memory, Build Toward Anticipation
pip install ember-experiencesEmber v0.4.0 gives your agents a past. The future is coming.
GitHub — Apache 2.0
Robert Praul — github.com/ember-experiences