diff --git a/tools/mem-probe/MemProbe/MemProbe.csproj b/tools/mem-probe/MemProbe/MemProbe.csproj
index 7fbe73fd..f38f8a68 100644
--- a/tools/mem-probe/MemProbe/MemProbe.csproj
+++ b/tools/mem-probe/MemProbe/MemProbe.csproj
@@ -17,7 +17,10 @@
-
+
+
diff --git a/tools/mem-probe/MemProbe/Program.cs b/tools/mem-probe/MemProbe/Program.cs
index 9cbc085d..accb0997 100644
--- a/tools/mem-probe/MemProbe/Program.cs
+++ b/tools/mem-probe/MemProbe/Program.cs
@@ -1,3 +1,9 @@
+// A0 result (2026-06-07): heavy 18.2 MiB -> 2.4 MiB/script; lean 1.65 MiB; ~7.6x drop
+// (within noise of theoretical 11x). Proves globalsType-closure isolation: ScriptGlobals
+// now resolves from Core.Scripting.Abstractions (Roslyn-free); heavy ≈ lean as expected.
+// Pre-A0 baseline: heavy ~18 MiB (Core.Scripting + Core.VirtualTags both -> Roslyn).
+// Post-A0 (this run): heavy 2.40/2.53 MiB, lean 1.64/1.65 MiB — both well under the 3 MiB gate.
+
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
@@ -25,8 +31,8 @@ int N = args.Length > 1 && int.TryParse(args[1], out var n) ? n : 50;
// The globalsType is what Roslyn's reference manager loads the transitive closure of
// (dotnet/roslyn#22219). We mirror production's choice: prod uses the WRAPPER
// ScriptGlobals (which exposes the named `ctx` property), NOT the raw context.
-// heavy = ScriptGlobals -> wrapper lives in Core.Scripting AND the
-// generic arg VirtualTagContext lives in Core.VirtualTags; both -> Roslyn.
+// heavy = ScriptGlobals -> AFTER A0: both wrapper + generic arg now
+// live in Core.Scripting.Abstractions (Roslyn-free); closure = lean.
// lean = LeanGlobals -> closure {LeanContext, Core.Abstractions},
// NO Roslyn. This is the A0 "globals type in a lean assembly" treatment.
var globalsType = mode == "lean"