The data arrives, but describes a distant moment
AI receives moisture measurements to act on a greenhouse’s current state. A service processes every message in order, yet decisions grow stale when history accumulates faster than it can be handled. Completion counts do not measure freshness. We study information age using a deterministic event-by-event trace.
Three times that differ
Each measurement has generation g and delivery d; its system time is d−g. At observation t, let u(t) be the newest generation time already delivered. Age Δ(t)=t−u(t). Times use one ideal clock in seconds, with no added network delay or drift. Delivering a three-second-old measurement resets age to three, not zero.
Age needs a delivered update or a declared initial state. We average only from t=3, when both policies deliver their first sample, to t=15, inventing no pre-delivery freshness. With out-of-order packets, taking the maximum generation time prevents an older packet from moving u(t) backward.
The same server, two queue policies
Generate ten measurements at 0,1,…,9; each service takes exactly three seconds. FIFO, first in first out, keeps all, delivering generations 0,1,…,9 at 3,6,…,30. There is no parallelism or preemption. At t=15 generation 4 has arrived, age eleven seconds. A constantly busy server is describing an increasingly old moment.
The second policy retains only the newest waiting update, without interrupting service. Ties matter: an arrival at completion time is eligible before selecting the next job. It processes generations 0,3,6,9, delivered at 3,6,9,12; six waiting updates are replaced. At t=15 generation 9 gives age six seconds. This improvement costs completeness.
Average without erasing the jumps
Time-average age is area under Δ(t) divided by observation length. Between deliveries u is fixed and age rises with slope one. On [a, b), area is (b²−a²)/2−u(b−a). Code integrates exactly between events, not averaging ages only at deliveries, which answers another question. Plot-point averaging would merely approximate the integral.
FIFO areas are 13.5,19.5,25.5,31.5 square seconds, totalling 90; divide by twelve seconds for 7.5 seconds. Latest-waiting has four 13.5 areas, total 54, mean 4.5. A jump exactly at t=15 changes instantaneous age but not the integral, since a point has zero duration. Mean and endpoint differences need not match.
| Policy | Mean age 3–15 s | Age at 15 s |
|---|---|---|
| 1 | 7.5 | 11 |
| 2 | 4.5 | 6 |

When dropping updates would be wrong
A state sample may be superseded, but an accounting event or isolated alarm may be irreplaceable. Complete-history applications cannot accept drops even with better mean age. Arrivals stop at nine here, so age eventually grows under either policy; no policy creates samples. We prove no optimality for networks, random loads or multiple sensors.
Yates and colleagues’ 2021 survey provides metric and analysis foundations in Section II; we reproduce no benchmark from it. Our Python trace is deterministic. Real deployments need clock alignment, source definitions and measurements of loss, error and decision consequences. Freshness is not accuracy: a new measurement can be wrong. This is no EL-AI installation test.
A service processing everything can still decide on stale data. Queue design needs separate history-completeness and state-freshness requirements. Measuring both reveals a trade-off hidden by delivery percentage alone.
Yates et al. (2021) — Age of Information, Section II.
import json,sys
from pathlib import Path
arrivals=list(range(10));service=3
fifo=[dict(generated=g,delivered=3*(g+1)) for g in arrivals]
# Arrivals at completion time are eligible before selecting the next job.
latest=[dict(generated=g,delivered=g+3) for g in [0,3,6,9]]
def age(events,t):return t-max(e['generated'] for e in events if e['delivered']<=t)
def mean_age(events,a=3,b=15):
points=sorted({a,b}|{e['delivered'] for e in events if a<e['delivered']<b});total=0
for x,y in zip(points,points[1:]):
u=max(e['generated'] for e in events if e['delivered']<=x);total+=(y*y-x*x)/2-u*(y-x)
return total/(b-a)
times=[3+i/20 for i in range(241)]
r=dict(python=sys.version.split()[0],seed=None,scope='Deterministic finite queue simulation, no network or sensor measurements',arrivalSeconds=arrivals,serviceSeconds=service,tieRule='Arrival at t is available when service completing at t selects next waiting update',FIFO=fifo,latestWaiting=latest,times=times,fifoAge=[age(fifo,t) for t in times],latestAge=[age(latest,t) for t in times],fifoMean=mean_age(fifo),latestMean=mean_age(latest),fifoAt15=age(fifo,15),latestAt15=age(latest,15))
assert r['fifoMean']==7.5 and r['latestMean']==4.5 and r['fifoAt15']==11 and r['latestAt15']==6
Path(__file__).with_name('results.json').write_text(json.dumps(r,indent=2),encoding='utf8')
Code, data, and instructions · JSON. Educational calculations executed with Python 3.14.0; figures with Matplotlib 3.11.2. AI-assisted analysis, without claiming peer review or human review. Original illustrative ImageGen cover: it does not document EL-AI people, premises, or installations. Sources accessed 25 October 2026.

