diff --git a/src/AcDream.App/Streaming/LandblockStreamJob.cs b/src/AcDream.App/Streaming/LandblockStreamJob.cs
index aff6500..e5b9602 100644
--- a/src/AcDream.App/Streaming/LandblockStreamJob.cs
+++ b/src/AcDream.App/Streaming/LandblockStreamJob.cs
@@ -10,7 +10,7 @@ namespace AcDream.App.Streaming;
///
public abstract record LandblockStreamJob(uint LandblockId)
{
- public sealed record Load(uint LandblockId) : LandblockStreamJob(LandblockId);
+ public sealed record Load(uint LandblockId, LandblockStreamJobKind Kind) : LandblockStreamJob(LandblockId);
public sealed record Unload(uint LandblockId) : LandblockStreamJob(LandblockId);
}
diff --git a/src/AcDream.App/Streaming/LandblockStreamer.cs b/src/AcDream.App/Streaming/LandblockStreamer.cs
index fff7fc6..a325fb6 100644
--- a/src/AcDream.App/Streaming/LandblockStreamer.cs
+++ b/src/AcDream.App/Streaming/LandblockStreamer.cs
@@ -88,7 +88,7 @@ public sealed class LandblockStreamer : IDisposable
// Synchronous mode: invoke the load delegate inline. The result lands
// in the outbox and DrainCompletions picks it up later in the same
// (or next) frame.
- HandleJob(new LandblockStreamJob.Load(landblockId));
+ HandleJob(new LandblockStreamJob.Load(landblockId, LandblockStreamJobKind.LoadNear));
}
public void EnqueueUnload(uint landblockId)
diff --git a/src/AcDream.App/Streaming/TwoTierDiff.cs b/src/AcDream.App/Streaming/TwoTierDiff.cs
new file mode 100644
index 0000000..2a24dab
--- /dev/null
+++ b/src/AcDream.App/Streaming/TwoTierDiff.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+
+namespace AcDream.App.Streaming;
+
+///
+/// Output of for the two-tier model.
+/// Five disjoint lists describe what changed since the previous Tick. Per
+/// Phase A.5 spec §4.2.
+///
+public readonly record struct TwoTierDiff(
+ IReadOnlyList ToLoadFar, // entered far window from null (terrain only)
+ IReadOnlyList ToLoadNear, // entered near window from null (terrain + entities — first-tick or teleport)
+ IReadOnlyList ToPromote, // entered near window from far-resident (entities only)
+ IReadOnlyList ToDemote, // exited near window past hysteresis (drop entities)
+ IReadOnlyList ToUnload); // exited far window past hysteresis (drop terrain)