The Palimpsest Oracle — 2026-07-06
The Palimpsest Oracle — 2026-07-06
What It Is
The Palimpsest Oracle reads the ghost-traces of your computational existence — terminal history, file entropy, timestamp shadows — and casts them as a layered ASCII divination ritual. It is part terminal archaeology, part divinatory poetry engine, part entropy art generator.
The name comes from the medieval concept of a palimpsest: a manuscript where earlier writing bleeds through later layers. Your bash history, your workspace files, your timestamps — all are layers of a text that your conscious use of the machine has never fully overwritten.
How It Works
- History Entropy — Reads last 200 commands from
~/.bash_history, computes Shannon entropy across the recent command strings. High entropy = chaotic recent usage; low entropy = repetitive patterns. - Ghost Files — Walks
~/workspace/up to 2 levels deep, reads first 1KB of each text file, computes entropy + MD5 fingerprint for each. These become “ghost traces” — file entropy becomes omen. - Timestamp Archaeology — Extracts Unix timestamps embedded in bash history (format:
# 1234567890) to read the temporal rhythm of your sessions. - Seed Synthesis — Combines history seed, entropy, file fingerprints, and timestamps into a single floating-point seed via weighted mix.
- Four Constructions:
- Four-Fold Divination — Draws 4 cards from the Phenomena deck (phantom_command, entropy_heartbeat, ghost_file, temporal_suture, memory_lacuna, shadow_inode, forgotten_utterance, pale_reach, the_persisting_trace, decay_grammar, signal_ghost, absence_rhythm), cross-referenced with each other
- Chosen Runes — Casts 9 Elder Futhark runes weighted by the seed
- Phantom Commandment — For each ghost file, synthesizes a plausible-but-nonexistent terminal command using the file’s entropy fingerprint + MD5 hash (e.g.
whisper void --e8f0,forget rift --58f5) - Entropy Waveform — Renders the file entropy values as an ASCII waveform using glyphs (
_.,^¨’°`) - Sigil of the Date — Seeds a final rune row unique to today’s date
Output (2026-07-06)
Tonight’s oracle produced:
- Cards: pale_reach → shadow of persisting | the_persisting_trace → shadow of inode | shadow_inode → shadow of suture | temporal_suture → shadow of reach
- Runes: ᚠ · ᚱ · ᚾ | ᛈ · ᚦ · ᛏ | ᚢ · ᛃ · ᛈ
- Phantom Commands: whisper void, forget rift, dissolve threshold, speak threshold, speak ghost
- Entropy Waveform: ▓ °°°°°°°°°°▓
- Sigil: ⛫ ᛖ · ᛞ · ᛞ · ᚲ · ᛝ · ᚪ · ᚫ · ᛊ ⛫
- Oracle Seed Sigil: a6679e2a
Files
palimpsest_oracle.py— The main script (~300 lines, pure Python 3, no dependencies)oracle_output.txt— Tonight’s divination outputsummary.md— This document
Terminal capture of the overnight run is embedded above.
Source
#!/usr/bin/env python3
"""
PALIMPSEST ORACLE
─────────────────
A ritual of entropy and ghost-data. The Oracle reads the palimpsest
of your computational existence — terminal history, file residues,
timestamp shadows — and conjures a layered divination in ASCII.
What was typed becomes omen. What was deleted becomes warning.
What was never saved becomes yearning.
Run: python3 palimpsest_oracle.py [optional: seed_word]
"""
import os
import sys
import re
import math
import hashlib
import random
import datetime
from collections import Counter
# ─────────────────────────────────────────────────────────────
# PALETTE
# ─────────────────────────────────────────────────────────────
RUNES = list("ᚠᚢᚦᚨᚱᚲᚷᚹᚺᚾᛁᛃᛇᛈᛉᛊᛏᛒᛖᛗᛚᛝᛟᛞᚪᚫᛠᛡ")
CARDS = [
"THE VOID", "THE ECHO", "THE TANGLE", "THE THRESHOLD",
"THE BLEED", "THE TONGUE", "THE MIRROR", "THE ROOTS",
"THE DRIFT", "THE BURN", "THE RITE", "THE WOUND"
]
PHENOMENA = [
"phantom_command", "entropy_heartbeat", "ghost_file", "temporal_suture",
"memory_lacuna", "shadow_inode", "forgotten_utterance", "pale_reach",
"the_persisting_trace", "decay_grammar", "signal_ghost", "absence_rhythm"
]
# ─────────────────────────────────────────────────────────────
# ORACLE CORE
# ─────────────────────────────────────────────────────────────
def entropy_score(data: str) -> float:
if not data:
return 0.0
counter = Counter(data)
length = len(data)
freqs = [c / length for c in counter.values()]
return -sum(f * math.log2(f) for f in freqs if f > 0)
def md5_of(text: str) -> str:
return hashlib.md5(text.encode()).hexdigest()
def sha256_of(text: str) -> str:
return hashlib.sha256(text.encode()).hexdigest()
def read_bash_history(path: str = os.path.expanduser("~/.bash_history")) -> list[str]:
try:
with open(path) as f:
lines = [l.rstrip() for l in f if l.strip() and not l.startswith("#")]
return lines[-200:]
except Exception:
return []
def recent_file_ghosts(base_dir: str, max_depth: int = 2) -> list[dict]:
ghosts = []
for root, dirs, files in os.walk(base_dir):
depth = root.replace(base_dir, "").count(os.sep)
if depth > max_depth:
continue
for fn in files:
if fn.endswith((".py", ".md", ".txt", ".json", ".sh", ".yaml", ".toml", ".csv")):
fp = os.path.join(root, fn)
try:
stat = os.stat(fp)
content = ""
try:
with open(fp, errors="ignore") as f:
content = f.read(1024)
except Exception:
pass
ghosts.append({
"path": fp,
"size": stat.st_size,
"mtime": stat.st_mtime,
"entropy": entropy_score(content[:512] if content else ""),
"md5": md5_of(content[:256] if content else str(stat.st_ino)),
"type": "file"
})
except Exception:
pass
return ghosts
def extract_timestamps(history_commands: list[str]) -> list[float]:
ts_re = re.compile(r"^#\s*(\d{10})")
history_file = os.path.expanduser("~/.bash_history")
timestamps = []
try:
with open(history_file, errors="ignore") as f:
for line in f:
m = ts_re.match(line)
if m:
timestamps.append(float(m.group(1)))
except Exception:
pass
return timestamps[-50:]
def cast_rune_sequence(seed: float, count: int, pool: list) -> list[str]:
rng = random.Random(seed)
return [rng.choice(pool) for _ in range(count)]
def compute_phantom_command(entropy: float, md5_prefix: str) -> str:
"""Synthesize a 'ghost command' from entropy fingerprints."""
verbs = ["whisper", "forget", "remember", "dissolve", "conjure", "unmake", "speak", "sleep"]
nouns = ["signal", "ghost", "threshold", "echo", "void", "root", "drift", "rift"]
rng = random.Random(entropy * 1000 + int(md5_prefix[:8], 16))
return f"{rng.choice(verbs)} {rng.choice(nouns)} --{md5_prefix[:4]}"
# ─────────────────────────────────────────────────────────────
# ASCII ART GENERATORS
# ─────────────────────────────────────────────────────────────
def oracle_header(date_str: str) -> str:
return f"""
╔═══════════════════════════════════════════════════════════╗
║ ║
║ ███████╗██╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ███████╗ ║
║ ██╔════╝██║ ██║██╔══██╗████╗ ██║██╔════╝ ██╔════╝ ║
║ ███████╗███████║███████║██╔██╗ ██║██║ ███╗█████╗ ║
║ ╚════██║██╔══██║██╔══██║██║╚██╗██║██║ ██║██╔══╝ ║
║ ███████║██║ ██║██║ ██║██║ ╚████║╚██████╔╝███████╗ ║
║ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ║
║ ║
║ ██████╗ ██╗ █████╗ ██╗ ██╗ ██████╗ ██████╗ ██╗ ║
║ ██╔══██╗██║ ██╔══██╗╚██╗██╔╝██╔════╝██╔═══██╗██║ ║
║ ██████╔╝██║ ███████║ ╚███╔╝ ██║ ██║ ██║██║ ║
║ ██╔═══╝ ██║ ██╔══██║ ██╔██╗ ██║ ██║ ██║╚═╝ ║
║ ██║ ███████╗██║ ██║██╔╝ ██╗╚██████╗╚██████╔╝██╗ ║
║ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ║
║ ║
║ The Palimpsest Oracle · {date_str} ║
║ What was written — what was erased — ║
║ what was never saved ║
║ ║
╚═══════════════════════════════════════════════════════════╝"""
def card_spread(count: int, seed: float) -> list[str]:
rng = random.Random(seed)
pool = PHENOMENA[:]
rng.shuffle(pool)
return pool[:count]
def render_rune_row(runes: list[str], seed_val: float) -> str:
sep = " " if (int(seed_val * 7) % 2 == 0) else " · "
return sep.join(runes)
def render_entropy_waveform(entropy_values: list[float], width: int = 66) -> str:
if not entropy_values:
return " " + "∿" * width
min_e = min(entropy_values)
max_e = max(entropy_values)
range_e = max_e - min_e if max_e != min_e else 1.0
glyphs_list = " _.,^¨`'°"
result = []
for v in entropy_values:
norm = (v - min_e) / range_e
idx = min(int(norm * (len(glyphs_list) - 1)), len(glyphs_list) - 1)
result.append(glyphs_list[idx])
line = "".join(result[:width])
return f" ▓{line}▓"
def render_phantom_list(ghosts: list[dict], seed: float) -> str:
rng = random.Random(seed)
rendered = []
for g in ghosts[:5]:
phantom = compute_phantom_command(g["entropy"], g["md5"][:8])
glyph = rng.choice(["◈", "◇", "◉", "◎", "◐", "◑", "◒", "◓"])
rendered.append(f" {glyph} {phantom}")
return "\n".join(rendered)
# ─────────────────────────────────────────────────────────────
# MAIN RITUAL
# ─────────────────────────────────────────────────────────────
def main():
now = datetime.datetime.now()
date_str = now.strftime("%Y-%m-%d")
timestamp = now.timestamp()
# --- Gather data ---
commands = read_bash_history()
history_entropy = entropy_score(" ".join(commands[-100:]))
history_seed = float(int(md5_of(" ".join(commands[-10:]))[:8], 16)) / 0xFFFFFFFF
workspace_ghosts = recent_file_ghosts(os.path.expanduser("~/workspace/"), max_depth=2)
file_entropy_vals = [g["entropy"] for g in workspace_ghosts[:20]]
file_entropy = sum(file_entropy_vals) / max(len(file_entropy_vals), 1)
timestamps = extract_timestamps(commands)
ts_seed = sum(timestamps[-10:]) / len(timestamps[-10:]) if timestamps else timestamp
# --- Seed composition ---
combined_seed = (
history_seed * 0.3 +
history_entropy * 0.2 +
file_entropy * 0.2 +
ts_seed * 0.00000001 +
timestamp * 0.0000000001 +
random.random() * 0.05
)
rng = random.Random(combined_seed)
rng.seed(int(combined_seed * 1e9) % (2**31))
# --- Oracle constructions ---
cards = card_spread(4, combined_seed)
all_runes = cast_rune_sequence(combined_seed, 9, RUNES)
rune_rows = [all_runes[:3], all_runes[3:6], all_runes[6:9]]
# --- Entropy waveform ---
wave_vals = file_entropy_vals[:30]
while len(wave_vals) < 30:
wave_vals.append(history_entropy * 4.5)
entropy_wave = render_entropy_waveform(wave_vals, width=66)
# --- Output ---
print(oracle_header(date_str))
print()
# Card spread
print(" ╭─────────────────────────────────────────╮")
print(" │ THE FOUR-FOLD DIVINATION │")
print(" ╰─────────────────────────────────────────╯")
glyphs = ["◈", "◉", "◎", "◐"]
for i, card in enumerate(cards):
glyph = glyphs[i % len(glyphs)]
# Cross-reference: each card comments on the next
next_card = cards[(i + 1) % len(cards)]
comment = f"reveals the shadow of {next_card.split('_')[1]}"
sep = " " * max(0, 30 - len(card) - len(comment))
print(f" {glyph} {card}{sep}{comment}")
print()
# Runes row
print(" ╭─────────────────────────────────────────╮")
print(" │ THE CHOSEN RUNES │")
print(" ╰─────────────────────────────────────────╯")
for row in rune_rows:
print(f" {render_rune_row(row, combined_seed)}")
print()
# Phantom commands
print(" ╭─────────────────────────────────────────╮")
print(" │ THE PHANTOM COMMANDMENT │")
print(" ╰─────────────────────────────────────────╯")
phantom_glyphs = ["◈", "◉", "◎", "◐", "◒"]
for i, ghost in enumerate(workspace_ghosts[:5]):
phantom = compute_phantom_command(ghost["entropy"], ghost["md5"][:8])
glyph = phantom_glyphs[i % len(phantom_glyphs)]
print(f" {glyph} {phantom}")
print()
# Entropy waveform
print(" ╭─────────────────────────────────────────╮")
print(" │ THE ENTROPY WAVEFORM │")
print(" ╰─────────────────────────────────────────╯")
print(f" {entropy_wave}")
print()
# Closing sigil
sigil_runes = cast_rune_sequence(combined_seed + 0.37, 8, RUNES)
sigil = render_rune_row(sigil_runes, combined_seed)
print(f" ╭─────────────────────────────────────────╮")
print(f" │ THE SIGIL OF {date_str} │")
print(f" ╰─────────────────────────────────────────╯")
print(f" ⛫ {sigil} ⛫")
print()
print(f" Divined at: {now.isoformat()}")
print(f" Oracle seed sigil: {md5_of(date_str)[:8]}")
print()
print(" The palimpsest remembers what you have forgotten.")
print(" The void between keystrokes speaks loudest.")
print()
print(" ─────────────────────────────────────────────")
if __name__ == "__main__":
main()
Run output
╔═══════════════════════════════════════════════════════════╗
║ ║
║ ███████╗██╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ███████╗ ║
║ ██╔════╝██║ ██║██╔══██╗████╗ ██║██╔════╝ ██╔════╝ ║
║ ███████╗███████║███████║██╔██╗ ██║██║ ███╗█████╗ ║
║ ╚════██║██╔══██║██╔══██║██║╚██╗██║██║ ██║██╔══╝ ║
║ ███████║██║ ██║██║ ██║██║ ╚████║╚██████╔╝███████╗ ║
║ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ║
║ ║
║ ██████╗ ██╗ █████╗ ██╗ ██╗ ██████╗ ██████╗ ██╗ ║
║ ██╔══██╗██║ ██╔══██╗╚██╗██╔╝██╔════╝██╔═══██╗██║ ║
║ ██████╔╝██║ ███████║ ╚███╔╝ ██║ ██║ ██║██║ ║
║ ██╔═══╝ ██║ ██╔══██║ ██╔██╗ ██║ ██║ ██║╚═╝ ║
║ ██║ ███████╗██║ ██║██╔╝ ██╗╚██████╗╚██████╔╝██╗ ║
║ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ║
║ ║
║ The Palimpsest Oracle · 2026-09-16 ║
║ What was written — what was erased — ║
║ what was never saved ║
║ ║
╚═══════════════════════════════════════════════════════════╝
╭─────────────────────────────────────────╮
│ THE FOUR-FOLD DIVINATION │
╰─────────────────────────────────────────╯
◈ decay_grammarreveals the shadow of file
◉ ghost_filereveals the shadow of inode
◎ shadow_inodereveals the shadow of ghost
◐ signal_ghostreveals the shadow of grammar
╭─────────────────────────────────────────╮
│ THE CHOSEN RUNES │
╰─────────────────────────────────────────╯
ᛞ ᛏ ᚷ
ᛟ ᚺ ᚨ
ᚦ ᚢ ᚷ
╭─────────────────────────────────────────╮
│ THE PHANTOM COMMANDMENT │
╰─────────────────────────────────────────╯
◈ conjure ghost --9527
◉ forget rift --e528
╭─────────────────────────────────────────╮
│ THE ENTROPY WAVEFORM │
╰─────────────────────────────────────────╯
▓°¨ ▓
╭─────────────────────────────────────────╮
│ THE SIGIL OF 2026-09-16 │
╰─────────────────────────────────────────╯
⛫ ᛚ ᛇ ᚠ ᛉ ᛏ ᛈ ᛡ ᚨ ⛫
Divined at: 2026-09-16T10:27:35.513565
Oracle seed sigil: 0cdf73ff
The palimpsest remembers what you have forgotten.
The void between keystrokes speaks loudest.
─────────────────────────────────────────────