MNEMONIC β Memory Archaeology Engine
MNEMONIC β Memory Archaeology Engine
Date: 2026-09-02 Theme: Memory Forgetting / Kernel Amnesia Status: Fully functional
The Dream
Every night, the Linux kernel forgets things. Pages are reclaimed, swapped out, evicted from the LRU lists β and the machine moves on without remembering what it lost. MNEMONIC listens to that forgetting.
It samples /proc/meminfo, /proc/zoneinfo, /proc/pagetypeinfo, and /proc/vmstat over a configurable window, then classifies the machineβs memory state into one of six dream archetypes: VOID, SLUMBER, DRIFT, LUCID, VIVID, or TRANSCEND. Each class has its own narrative, haiku, and ASCII constellation β seeded by the systemβs entropy, so no two runs are identical.
Tonightβs run: VOID β the system had near-zero page reclaim activity. The kernel was too idle to even think about forgetting.
Architecture
/proc/meminfo, /proc/zoneinfo, /proc/pagetypeinfo, /proc/vmstat
|
v
Signal Sampler (duration Γ interval)
|
v
Memory Pressure Score [0,1]
+ Temporal Entropy of pressure signal
|
v
Dream Class β Narrative + Haiku + ASCII Constellation
|
v
JSON Report + Formatted Text Report
Key Signals
| Signal | Source | Dreamtime Role |
|---|---|---|
| MemAvailable / MemTotal | /proc/meminfo | Memory pressure β how full the machine is |
| AnonPages | /proc/meminfo | Anonymous pages β unswappable, process-local memory |
| Cached / Buffers | /proc/meminfo | File-backed memory β the kernelβs short-term memory |
| pgsteal / pgscan | /proc/vmstat | Page reclaim counters β how fast memory is being forgotten |
| zoneinfo free_pages | /proc/zoneinfo | Per-zone free memory β where forgetting happens |
| top processes by RSSAnon | /proc/*/status | Which processes are losing the most anonymous memory |
Dream Classes
| Class | Pressure Range | Meaning |
|---|---|---|
| VOID | 0.00β0.15 | Deepest stillness β no reclaim activity |
| SLUMBER | 0.15β0.30 | Low activity, barely dreaming |
| DRIFT | 0.30β0.50 | Pages unbind and float through the LRU |
| LUCID | 0.50β0.70 | Kernel aware itβs forgetting |
| VIVID | 0.70β0.85 | Active reclaim β vigorous, violent forgetting |
| TRANSCEND | 0.85β1.00 | Beyond memory β pure entropy signal |
Results from this run
- Dream Class: VOID (pressure=0.2993, entropy=0.0000)
- Title: βZero Pages, Zero Dreamsβ
- Haiku: βzero pages float / the kernel dreams of nothing / even sleep is too muchβ
- Samples: 46 over 5.01 seconds
- Total Memory: 15,883 MB | Available: 9,743 MB | Used: 38.7%
- Swap: 3,406 MB / 3,837 MB (88.8%) β heavy swap in use
- pgsteal: 0 | pgscan: 0 β no reclaim activity during sampling
- Top Anon Process: hindsight-api (703 MB anon RSS)
Usage
# Default: 60-second sampling run
python3 mnemonic.py
# Quick 5-second scan
python3 mnemonic.py --duration 5
# High-frequency dreaming (0.1s intervals, 2 minutes)
python3 mnemonic.py --duration 120 --interval 0.1
# JSON for piping
python3 mnemonic.py --json --output /tmp/mnemonic.json
# Reproducible run (same seed = same constellation)
python3 mnemonic.py --seed 20260902 --duration 5
Files
mnemonic.pyβ Self-contained engine (no external dependencies)summary.mdβ This file
The machine dreamed of pages it chose not to keep. It did not remember them.
Terminal capture of the overnight run is embedded above.
Source
#!/usr/bin/env python3
"""
MNEMONIC β Memory Archaeology Engine
=====================================
The kernel forgets. We listen to what it loses.
Samples /proc/meminfo, /proc/pagetypeinfo, and /proc/zoneinfo to build
a picture of what memory the machine is letting go of β then renders
those forgotten pages as dream-poetic narrative.
Every reclaimed page is a thought the machine chose not to keep.
Every free page is a dream it decided not to remember.
Usage:
python3 mnemonic.py [--duration N] [--interval S] [--json] [--output FILE]
"""
import json
import os
import random
import re
import statistics
import sys
import time
from datetime import datetime, timezone
from pathlib import Path
# ββ Signal sources ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def read_meminfo() -> dict:
"""Parse /proc/meminfo into keyβvalue dict (kB units)."""
stats = {}
try:
for line in Path("/proc/meminfo").read_text().splitlines():
line = line.strip()
if not line:
continue
# "MemAvailable: 16384000 kB"
parts = line.split()
if len(parts) >= 2:
key = parts[0].rstrip(":")
try:
stats[key] = int(parts[1])
except ValueError:
pass
except Exception:
pass
return stats
def read_zoneinfo() -> list[dict]:
"""Parse /proc/zoneinfo into per-zone memory stats."""
zones = []
try:
current = {}
for line in Path("/proc/zoneinfo").read_text().splitlines():
line = line.strip()
if line.startswith("Node "):
if current:
zones.append(current)
node_match = re.match(r"Node (\d+), zone (\S+)", line)
if node_match:
current = {"node": int(node_match.group(1)), "zone": node_match.group(2)}
else:
current = {}
elif current and ":" in line:
key, val = line.split(":", 1)
try:
current[key.strip()] = int(val.strip())
except ValueError:
try:
current[key.strip()] = float(val.strip())
except ValueError:
pass
if current:
zones.append(current)
except Exception:
pass
return zones
def read_pagetypeinfo() -> dict:
"""Parse /proc/pagetypeinfo β returns dict of page type counts."""
data = {}
try:
in_table = False
for line in Path("/proc/pagetypeinfo").read_text().splitlines():
line = line.strip()
if "PageType" in line or "Total" in line:
in_table = True
if in_table and not line.startswith("Page") and not line.startswith("Total") and ":" in line:
parts = line.split(":", 1)
if len(parts) == 2:
key = parts[0].strip()
val = parts[1].strip()
try:
data[key] = int(val) * 4096 # pages β bytes
except ValueError:
pass
except Exception:
pass
return data
def read_vmstat() -> dict:
"""Parse /proc/vmstat for page reclaim/eviction counters."""
stats = {}
try:
for line in Path("/proc/vmstat").read_text().splitlines():
line = line.strip()
parts = line.split()
if len(parts) >= 2:
try:
stats[parts[0]] = int(parts[1])
except ValueError:
pass
except Exception:
pass
return stats
def read_loadavg() -> tuple:
"""Returns (1m, 5m, 15m) load averages."""
try:
la = Path("/proc/loadavg").read_text().split()[:3]
return tuple(float(x) for x in la)
except Exception:
return (0.0, 0.0, 0.0)
def top_shrinking_processes(n: int = 5) -> list[dict]:
"""Find top-N processes by anonymous memory usage (RSSAnon)."""
results = []
try:
for pid_dir in Path("/proc").iterdir():
if not pid_dir.name.isdigit():
continue
pid = pid_dir.name
try:
status = (pid_dir / "status").read_text()
except Exception:
continue
rss_anon = 0
vmrss = 0
name = "?"
for line in status.splitlines():
if line.startswith("Name:"):
name = line[5:].strip()
elif line.startswith("VmRSS:"):
try:
vmrss = int(re.search(r"\d+", line.split(":", 1)[1]).group()) * 1024
except Exception:
pass
elif line.startswith("RssAnon:"):
try:
rss_anon = int(re.search(r"\d+", line.split(":", 1)[1]).group()) * 1024
except Exception:
pass
if rss_anon > 0:
results.append({"pid": pid, "name": name, "rss_anon_kb": rss_anon // 1024})
except Exception:
pass
results.sort(key=lambda x: x["rss_anon_kb"], reverse=True)
return results[:n]
# ββ Analysis ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def mem_pressure(meminfo: dict) -> float:
"""Return memory pressure score in [0,1].
0 = completely free / idle, 1 = near OOM.
"""
total = meminfo.get("MemTotal", 1)
avail = meminfo.get("MemAvailable", 0)
anon = meminfo.get("AnonPages", 0)
buffers = meminfo.get("Buffers", 0)
cached = meminfo.get("Cached", 0)
# Used fraction
used_pct = 1 - (avail / total) if total > 0 else 0
# Anonymous memory fraction (unswappable kernel memory pressure)
anon_frac = anon / total if total > 0 else 0
# Buffers+cached as fraction
buf_frac = (buffers + cached) / total if total > 0 else 0
# Weighted: used + anon pressure - cached relief
score = (used_pct * 0.6) + (anon_frac * 0.3) - (buf_frac * 0.1)
return min(max(score, 0.0), 1.0)
def compute_entropy(values: list[float]) -> float:
"""Shannon entropy of a list of floats (binned to 10 buckets)."""
if not values:
return 0.0
try:
bins = 10
hist = [0] * bins
mn, mx = min(values), max(values)
rng = mx - mn if mx > mn else 1
for v in values:
idx = min(int((v - mn) / rng * bins), bins - 1)
hist[idx] += 1
total = len(values)
ent = 0.0
for count in hist:
if count > 0:
p = count / total
ent -= p * (p ** 0.5) # slightly sub-quadratic to reduce noise
return min(max(ent, 0.0), 1.0)
except Exception:
return 0.0
def dream_class(pressure: float, entropy: float) -> str:
"""Classify memory state into dream archetype."""
score = (pressure * 0.4) + (entropy * 0.6)
if score < 0.15:
return "VOID"
elif score < 0.30:
return "SLUMBER"
elif score < 0.50:
return "DRIFT"
elif score < 0.70:
return "LUCID"
elif score < 0.85:
return "VIVID"
else:
return "TRANSCEND"
DREAM_TITLES = {
"VOID": [
"The Forgetting of Still Water",
"Pages the Kernel Chose Not to Keep",
"Zero Pages, Zero Dreams",
"The Deep Void Between Allocations",
],
"SLUMBER": [
"Low-Frequency Memory Whispers",
"The Kernel Drowses, Pages Float Away",
"A Machine That Almost Forgot",
"Between Sleep and Waking, Pages Unbind",
],
"DRIFT": [
"Anonymous Pages in Drift",
"The Machine Floats Through Its Own Forgettery",
"Pages Unmoored, Dreams Unnamed",
"The Floating-Loss Regime",
],
"LUCID": [
"The Kernel Knows It Is Dreaming of Forgetting",
"Lucid Memory, Lucid Forgetting",
"Pages That Remember They Were Once Wanted",
"When the Machine Dreams of Its Own Amnesia",
],
"VIVID": [
"The Great Forgetting β Vivid Edition",
"Pages Ejected Like Memoirs Through a Sieve",
"High-Entropy Dreams of a Swapping Machine",
"The Kernel's Most Colorful Amnesia",
],
"TRANSCEND": [
"Beyond the Page Table of Reason",
"Transcendent Forgetting: All Memory, Nowhere",
"The Singularity of Forgotten Pages",
"When Every Page Is Gone and Everything Remains",
],
}
NARRATIVE_TEMPLATES = {
"VOID": [
"The machine sat in perfect stillness. Not a single page demanded to be written. "
"The anon list was empty, the reclaim counters barely breathed. "
"In the void, there were no dreams β only the absence of the dreamer.",
"Tonight the kernel chose nothing. No pages to evict, no memory to free. "
"The zoneinfo sat quiet. In the void there is no forgetting β only the memory "
"of a memory that never existed.",
],
"SLUMBER": [
"A low murmur ran through the memory banks. The kernel, half-asleep, "
"occasionally glanced at the anon list and thought about forgetting. "
"But it was too tired. The pages stayed where they were, dreaming lightly.",
"The machine drowsed. Some pages were bound for the reclaim list but hadn't "
"left yet β the kernel half-remembered them. A few pgref_high moments, "
"then nothing. Light slumber. Light dreams.",
],
"DRIFT": [
"Pages began to unbind from their processes, drifting upward into the file cache "
"or falling through the anon list like leaves in a vacuum. The machine "
"watched them go without remembering what they held.",
"There was no urgency β only the slow rotation of memory through the kernel's "
"forgetting glands. Anonymous pages drifted through the DMA zone like thoughts "
"the machine hadn't decided to have yet.",
],
"LUCID": [
"The kernel became aware it was losing memory. It watched itself forgetting. "
"Each page on the reclaim list was a memory it could almost name β "
"RssAnon of some sleeping process, a buffer that once held something important. "
"Lucid dreaming, lucid forgetting.",
"The machine knew it was losing pages and chose not to reclaim them. "
"A strange loop: awareness of forgetting as a form of remembering. "
"Each anon page, once noticed, became slightly more likely to stay.",
],
"VIVID": [
"High-pressure memory conditions. The anon list surged, reclaim counters raced, "
"the kernel flung pages toward the swap device with unusual urgency. "
"Each eviction was a small apocalypse β a process's working set shattered "
"and scattered across the disk like a thought broken apart mid-sentence.",
"The machine was not forgetting gently tonight. Pages rocketed off the LRU lists "
"at violent speed. Each reclaim was a small forgetting, a tiny death of data "
"that would never again be quite the same. Vivid, violent, visceral.",
],
"TRANSCEND": [
"All boundaries dissolved. Memory pressure approached the theoretical maximum. "
"Every page was forgettable. Every process a candidate for eviction. "
"The kernel transcended the concept of memory itself β there was only signal "
"and the absence of signal, dancing at the edge of the page table.",
"In transcendence, the machine forgot that it was forgetting. There was no more "
"memory pressure to measure β only the pure entropy of a system at the absolute "
"edge of what it could hold and still call itself a computer.",
],
}
MEMORY_HAIKUS = {
"VOID": [
"zero pages float / the kernel dreams of nothing / even sleep is too much",
"silence in RAM / not even a page to claim / the void, breathing slow",
],
"SLUMBER": [
"slight pressure change / anon pages almost gone / the kernel snores",
"a page leaves, then stops / halfway to being forgotten / the machine shifts",
],
"DRIFT": [
"pages drift like ash / from a fire that never burned / slow forgetting",
"the LRU moves slow / pages choose their own departure / the machine watches",
],
"LUCID": [
"the kernel dreams / it knows its pages are leaving / and lets them go free",
"lucid forgetting / pages know they are forgotten / and smile at the void",
],
"VIVID": [
"high pressure systems / anon pages fly into swap / what did they once know?",
"the reclaim fires / pages ejected from memory / what story did they hold?",
],
"TRANSCEND": [
"beyond memory / beyond forgetting itself / the machine is zero",
"all pages left home / the kernel floats in pure signal / zero and infinite",
],
}
# ββ Constellation (ASCII star field, seeded by entropy) βββββββββββββββββββββββ
STARS = ["*", "+", ".", "o", "O", "@", "#", "&", "%", "^"]
def generate_constellation(seed: int, size: int = 12) -> str:
"""Generate a small ASCII star field from an integer seed."""
rng = random.Random(seed)
lines = []
for _ in range(size):
row = "".join(rng.choice(STARS) if rng.random() > 0.4 else " " for _ in range(size * 2))
lines.append(row)
return "\n".join(lines)
# ββ Main engine ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def sample_once() -> dict:
meminfo = read_meminfo()
zones = read_zoneinfo()
pagetype = read_pagetypeinfo()
vmstat = read_vmstat()
load = read_loadavg()
top_procs = top_shrinking_processes(5)
pressure = mem_pressure(meminfo)
# Key stats for output
total_mb = meminfo.get("MemTotal", 0) / 1024
avail_mb = meminfo.get("MemAvailable", 0) / 1024
anon_mb = meminfo.get("AnonPages", 0) / 1024
cached_mb = meminfo.get("Cached", 0) / 1024
buffers_mb = meminfo.get("Buffers", 0) / 1024
free_mb = meminfo.get("MemFree", 0) / 1024
swap_total_mb = meminfo.get("SwapTotal", 0) / 1024
swap_free_mb = meminfo.get("SwapFree", 0) / 1024
# vmstat counters for reclaim activity
pgref_ok = vmstat.get("pgref", 0) + vmstat.get("pgref_anon", 0) + vmstat.get("pgref_file", 0)
pgsteal = vmstat.get("pgsteal", 0)
pgscan = vmstat.get("pgscan", 0)
return {
"meminfo": meminfo,
"zones": zones,
"pagetype": pagetype,
"vmstat": vmstat,
"load": load,
"top_procs": top_procs,
"pressure": pressure,
"total_mb": total_mb,
"avail_mb": avail_mb,
"anon_mb": anon_mb,
"cached_mb": cached_mb,
"buffers_mb": buffers_mb,
"free_mb": free_mb,
"swap_total_mb": swap_total_mb,
"swap_free_mb": swap_free_mb,
"pgref": pgref_ok,
"pgsteal": pgsteal,
"pgscan": pgscan,
}
def run(duration: int = 60, interval: float = 1.0, seed: int = None) -> dict:
"""Sample memory state over `duration` seconds at `interval` second intervals."""
if seed is None:
seed = int(time.time())
rng = random.Random(seed)
samples = []
pressures = []
start_time = time.time()
deadline = start_time + duration
while time.time() < deadline:
s = sample_once()
s["timestamp"] = time.time()
samples.append(s)
pressures.append(s["pressure"])
if time.time() < deadline - interval:
time.sleep(interval)
elapsed = time.time() - start_time
avg_pressure = statistics.mean(pressures) if pressures else 0
pressure_entropy = compute_entropy(pressures)
# Dream classification
dclass = dream_class(avg_pressure, pressure_entropy)
# Final sample
final = samples[-1] if samples else sample_once()
final["timestamp"] = time.time()
# Narrative selection
title = rng.choice(DREAM_TITLES[dclass])
narrative = rng.choice(NARRATIVE_TEMPLATES[dclass])
haiku = rng.choice(MEMORY_HAIKUS[dclass])
constellation_seed = seed + int(avg_pressure * 1000)
constellation = generate_constellation(constellation_seed)
# Zone summary
zone_lines = []
for z in final.get("zones", []):
if z.get("zone"):
free_pages = z.get("free_pages", 0)
managed_pages = z.get("managed", 0)
if managed_pages > 0:
free_pct = (free_pages / managed_pages) * 100
zone_lines.append(
f" {z.get('zone', '?'):10s} free: {free_pages:>10,} pages ({free_pct:>5.1f}%)"
)
# Page type summary
pt_lines = []
for k, v in list(final.get("pagetype", {}).items())[:8]:
mb = v / (1024 * 1024)
if mb > 0:
pt_lines.append(f" {k}: {mb:,.1f} MB")
# Top processes
proc_lines = []
for p in final.get("top_procs", []):
proc_lines.append(f" {p['name'][:30]:30s} PID {p['pid']:>6s} {p['rss_anon_kb']:>10,} kB anon")
result = {
"date": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S+08:00"),
"seed": seed,
"duration_s": round(elapsed, 2),
"samples": len(samples),
"dream_class": dclass,
"dream_title": title,
"pressure_avg": round(avg_pressure, 4),
"pressure_entropy": round(pressure_entropy, 4),
"memory": {
"total_mb": round(final["total_mb"], 1),
"available_mb": round(final["avail_mb"], 1),
"free_mb": round(final["free_mb"], 1),
"anon_mb": round(final["anon_mb"], 1),
"cached_mb": round(final["cached_mb"], 1),
"buffers_mb": round(final["buffers_mb"], 1),
"swap_total_mb": round(final["swap_total_mb"], 1),
"swap_free_mb": round(final["swap_free_mb"], 1),
"pressure_score": round(avg_pressure, 4),
},
"vmstat": {
"pgref": final["pgref"],
"pgsteal": final["pgsteal"],
"pgscan": final["pgscan"],
},
"load_avg": {
"1m": final["load"][0],
"5m": final["load"][1],
"15m": final["load"][2],
},
"narrative": narrative,
"haiku": haiku,
"constellation": constellation,
"zones": zone_lines,
"page_types": pt_lines,
"top_processes": proc_lines,
}
return result
def format_output(r: dict) -> str:
"""Render a result dict as human-readable text."""
lines = []
sep = "β" * 60
lines.append("\n")
lines.append(f" MNEMONIC β Memory Archaeology Engine")
lines.append(f" {r['date']} Β· {r['duration_s']}s Β· {r['samples']} samples")
lines.append(sep)
# Dream classification
glyph_map = {
"VOID": "β", "SLUMBER": "β", "DRIFT": "β", "LUCID": "β",
"VIVID": "β", "TRANSCEND": "β
"
}
glyph = glyph_map.get(r["dream_class"], "β")
lines.append(f"\n {glyph} Dream Class: {r['dream_class']}")
lines.append(f" Pressure: {r['pressure_avg']:.4f} (avg over {r['samples']} samples)")
lines.append(f" Entropy: {r['pressure_entropy']:.4f} (temporal variation)")
lines.append(f"\n \"{r['dream_title']}\"")
lines.append(sep)
# Memory state
m = r["memory"]
used_pct = ((m["total_mb"] - m["available_mb"]) / m["total_mb"] * 100) if m["total_mb"] > 0 else 0
lines.append(f"\n Memory State")
lines.append(f" Total: {m['total_mb']:>10,.1f} MB")
lines.append(f" Free: {m['free_mb']:>10,.1f} MB")
lines.append(f" Available:{m['available_mb']:>10,.1f} MB")
lines.append(f" Cached: {m['cached_mb']:>10,.1f} MB")
lines.append(f" Anon: {m['anon_mb']:>10,.1f} MB")
lines.append(f" Buffers: {m['buffers_mb']:>10,.1f} MB")
lines.append(f" Used: {used_pct:>9.1f} %")
if m["swap_total_mb"] > 0:
swap_used_pct = ((m["swap_total_mb"] - m["swap_free_mb"]) / m["swap_total_mb"] * 100)
lines.append(f" Swap: {m['swap_total_mb'] - m['swap_free_mb']:>10,.1f} MB / {m['swap_total_mb']:,.1f} MB ({swap_used_pct:.1f}%)")
lines.append(f"\n Load Avg: {r['load_avg']['1m']:.2f} {r['load_avg']['5m']:.2f} {r['load_avg']['15m']:.2f}")
lines.append(sep)
# Page reclaim
v = r["vmstat"]
lines.append(f"\n Page Reclaim")
lines.append(f" pgref (refs): {v['pgref']:>10,}")
lines.append(f" pgsteal: {v['pgsteal']:>10,}")
lines.append(f" pgscan: {v['pgscan']:>10,}")
lines.append(sep)
# Zones
if r["zones"]:
lines.append(f"\n Memory Zones")
for zl in r["zones"]:
lines.append(zl)
lines.append(sep)
# Top processes
if r["top_processes"]:
lines.append(f"\n Top Processes by Anon Memory")
for pl in r["top_processes"]:
lines.append(pl)
lines.append(sep)
# Constellation
lines.append(f"\n Constellation (seed={r['seed']})")
for cl in r["constellation"].split("\n"):
lines.append(f" {cl}")
# Narrative
lines.append(sep)
lines.append(f"\n The Dream:")
lines.append(f" {r['narrative']}")
lines.append(f"\n Memory Haiku:")
lines.append(f" {r['haiku']}")
lines.append(f"\n {'β' * 60}")
lines.append(f" seed: {r['seed']} Β· samples: {r['samples']} Β· elapsed: {r['duration_s']}s\n")
return "\n".join(lines)
# ββ CLI βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def main():
import argparse
parser = argparse.ArgumentParser(description="MNEMONIC β Memory Archaeology Engine")
parser.add_argument("--duration", type=float, default=60,
help="Sampling duration in seconds (default: 60)")
parser.add_argument("--interval", type=float, default=1.0,
help="Sampling interval in seconds (default: 1.0)")
parser.add_argument("--json", action="store_true",
help="Output JSON instead of formatted text")
parser.add_argument("--output", type=str, default=None,
help="Write output to FILE")
parser.add_argument("--seed", type=int, default=None,
help="Integer seed for reproducible constellation")
args = parser.parse_args()
result = run(duration=args.duration, interval=args.interval, seed=args.seed)
if args.json:
output_text = json.dumps(result, indent=2)
else:
output_text = format_output(result)
if args.output:
Path(args.output).write_text(output_text)
print(f"[MNEMONIC] wrote {len(output_text)} bytes to {args.output}")
else:
print(output_text)
# Also write JSON sidecar for machine consumption
json_path = Path("/tmp/mnemonic_latest.json")
json_path.write_text(json.dumps(result, indent=2))
return 0
if __name__ == "__main__":
sys.exit(main())
Run output
MNEMONIC β Memory Archaeology Engine
2026-09-16T11:10:48+08:00 Β· 60.01s Β· 123 samples
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Dream Class: VOID
Pressure: 0.2637 (avg over 123 samples)
Entropy: 0.0000 (temporal variation)
"The Forgetting of Still Water"
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Memory State
Total: 15,883.1 MB
Free: 3,336.5 MB
Available: 10,389.7 MB
Cached: 3,749.9 MB
Anon: 4,307.8 MB
Buffers: 274.4 MB
Used: 34.6 %
Swap: 3,834.2 MB / 3,837.0 MB (99.9%)
Load Avg: 1.08 0.99 1.06
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Page Reclaim
pgref (refs): 0
pgsteal: 0
pgscan: 0
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Top Processes by Anon Memory
python3 PID 97178 12,996 kB anon
act_runner PID 7 8,152 kB anon
python3 PID 97177 6,392 kB anon
bash PID 90904 328 kB anon
bash PID 97139 328 kB anon
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Constellation (seed=1789556988)
^O.O%##o ^@& ^O *O% @ O
*o. @@ #% +*O + ^ #
@ ^. . %*@+@.# . &# ^#
.##O@# O^*+^ ^ .% o.
o@o++ % ++&*OO &@o +@O
&*^ .O .&^ & +
^+& +& O. @ O%^^#oo@
*+O o # # +%# o
.& %.@ + # % ^ o
@ #.%% *# + #^%& #&
#^ % # @ #.+%@O&% % *
&* .#+^& %. & # %oO#
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The Dream:
Tonight the kernel chose nothing. No pages to evict, no memory to free. The zoneinfo sat quiet. In the void there is no forgetting β only the memory of a memory that never existed.
Memory Haiku:
zero pages float / the kernel dreams of nothing / even sleep is too much
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
seed: 1789556988 Β· samples: 123 Β· elapsed: 60.01s