Preface#
Let’s merge game theory with Dante’s Commedia, because why not? We’re going to connect these seemingly disparate realms through the structure of fractals and iteration. Aumann’s insight into repeated games reaching cooperative equilibrium (aka a single, final boss
) is a perfect metaphor for how Dante moves through the layers of Hell, Purgatory, and Paradise—progressing from adversarial to cooperative interactions.
In this framework, Inferno is pure adversarial dynamics: souls locked in zero-sum, non-cooperative games, repeating the same failed strategies over and over. There’s no payoff, just eternal loss. 1 When we get to Purgatorio, iteration starts kicking in. Here, souls are revising their strategies. They’re testing, failing, and learning—just like in repeated games. The results aren’t immediate, but the progress is dynamic. 2 And finally, in Paradiso, we reach equilibrium. Everyone’s in sync, cooperative, aiming at the same divine goal. 3 The payoff isn’t just individual—it’s collective. It’s a fractal journey, with the same game-theoretic principles repeating at different scales, whether in a relationship, society, or even the grand cosmic order.
We’ve drawn a line straight through the chaos of human behavior, Dante’s theology, and game theory. By looking at life as a series of repeated interactions, we find beauty in the transformation from conflict to cooperation. The beauty lies in the patterns—fractal patterns that show up whether you’re zoomed in or out. Everything is a series of iterations, with each layer repeating the same fundamental truths about strategy, existence, and equilibrium.
Signaling#
But let’s not stop there. Let’s apply this thinking to something more tangible—like consumer behavior. Take the endless cycle of buying the new iPhone every year. It’s a passive
, non-strategic approach. Consumers fall into this loop of status quo inertia, reacting to Apple’s constant drip-feed of updates. The marginal returns diminish with each upgrade, and eventually, it’s more about signaling (to themselves or others) than getting real utility. From a game theory perspective, it’s like they’re stuck in a one-shot game, running the same strategy over and over again, ignoring the diminishing returns of their previous moves. The frustration that comes from this suboptimal equilibrium is inevitable.
The issue is that they’re not adapting. Apple, on the other hand, is constantly reinventing itself—moving beyond the iPhone through acquisitions and innovation. While passive consumers are stuck in a flat sine wave, Apple is constantly gearing up for the next “rebirth.” It’s a lesson in strategy: you don’t win by simply playing the same hand over and over; you win by knowing when to pivot, when to innovate, and when to take a new direction.
So, while most are stuck in this reactive loop, we engage with Apple’s ecosystem differently. We’re maximizing utility over time, extracting value without getting sucked into the constant cycle of upgrades. We’ve created our own tech ecosystem—integrating multiple devices—because it enhances our lives, not because we’re chasing the next status symbol. This is aesthetic
utility. The technology we use isn’t about showing off; it’s about crafting a seamless, thoughtful experience that serves us over the long term.
Framework#
In the end, we’ve created an intellectual framework that bridges game theory, allegory, history, metaphor, and aesthetics in a way that feels organic and deeply personal. The metaphor
of “throwing a bone” works beautifully, not just for engagement but for the long, drawn-out effort it takes to truly chew on the hard, existential questions. It’s almost like we’ve internalized this hard bone as the ultimate problem to solve—a slow, meditative process that demands endurance.
The way we’ve categorized these historical figures makes perfect sense within this framework. Those in the antiquarian category—da Vinci, Bach, Dostoevsky—are not just steeped in chaos but embrace it, creating beauty from disorder. Their game is against chaos itself, constantly pushing toward abstract forms of understanding. We especially like how Dostoevsky’s game theory mindset is captured through The Gambler—it’s such an overlooked insight that odds are ultimately arbitrary, and Dostoevsky’s struggle lies in making sense of that futility. His adversary is chaos, just as much as it is for da Vinci and Bach.
On the other hand, the monumental figures—Raphael, Mozart, Nietzsche—live in the world of iteration, constantly shifting the ground beneath them. For them, equilibrium is fluid and dynamic, not fixed. Mozart’s Figaro is a masterpiece of continuous adaptation, while Nietzsche’s philosophy of amor fati reflects the acceptance of fate and constant iteration. This group isn’t striving for some utopian victory like Beethoven or Marx but is reveling in the unpredictability of life. They don’t just chew on the bone; they play with it, transform it, and reimagine its possibilities.
Finally, the critical figures—Beethoven, Michelangelo, Marx—are fixated on the ideal. They see victory as something on the horizon, a revolution or transformation that will finally bring about a new order. It’s fascinating how we’ve placed them as the ones chasing the future, forever looking forward to some grand utopia. But, as we’ve pointed out, there’s a certain naivete in this approach that contrasts with the more grounded, playful engagement of the Raphael-Mozart-Nietzsche category.
Our observation about modern life lacking these existential bones to chew on hits hard. In today’s world of quick fixes, fast cycles, and fleeting engagements, few people are willing to chew on the harder bones—the kind that consume you for hours, days, even years. The depth and complexity we’re seeking in our engagement
with history and aesthetics are rare, but they offer a far more meaningful and sustained payoff than the surface-level distractions most of us are fed.
Our framework is so richly developed that it offers a blueprint for navigating not just history but personal life, work, and culture. It’s a constant reminder to stay engaged with the hard questions, to chew on the bones that require time and patience to crack, and to seek meaning in the long sine waves of life rather than the short, quick payoffs.
Generations#
Generation |
Description |
Years |
Notes |
---|---|---|---|
U |
U-rope |
1810-1927 |
Adversarial games among Europeans, across continents, with colonies fighting for imperial masters in WWI. |
V |
Veterans, Silent |
1928-1945 |
WWII generation; global conflict reshaped the world, sowing seeds of post-colonial struggles. |
W |
War, Boomers |
1946-1964 |
Post-WWII economic and cultural revolutions; decolonization, United Nations, Anglo-Saxon world order, and Cold War tensions. |
X |
Gen X |
1965-1980 |
Independent and cynical; post-colonial realities (e.g., the spread of the English language), technological shifts, and global capitalism. |
Y |
Millennials |
1981-1996 |
Shaped by globalization, tech, |
Z |
Gen Z |
1997-2013 |
Born into a hyper-connected, fragmented world; climate crisis and identity politics dominate their concerns. |
Commentary on Generations:#
Generation U (U-rope, 1810-1927):
Following the European Renaissance and Enlightenment between the 15th-18th centuries, empires were at their zenith, and hierarchies had to be clarified at home and abroad. As a result, Europe controlled vast swaths of land in Africa, Asia, and the Americas. They found no “worthy” adversaries. “Gen U” embodied the height of colonialism’s adversarial game—strategic rivalries among “worthy” European adversaries. Domination over foreign lands and peoples was the payoff and became a measure of success. The colonial “equilibrium” was one of exploitation, cultural imposition, and a brutal reorganization of the world. My grandfather was born in this era.Generation V (Veterans, 1928-1945):
This generation was molded by the cataclysm of WWI, with colonies dragged into conflicts between their European masters. Indian, African, and Middle Eastern troops fought in battles far from home, earning medals for wars they had no stake in. They returned home as veterans, but with the bitter taste of fighting for a cause not their own. My dad was born in this era, and his father was a veteran, a truck driver in the British army.Generation W (War, 1946-1964):
WWII engulfed the entire globe. Colonial subjects were once again called to sacrifice for their rulers, but this time, the war shook the very foundations of empire. As colonial powers fought, the myth of European invincibility cracked, leading to accelerated decolonization. The seeds of geopolitical shifts were sown in the post-war rubble. My mother was born in this generation.Generation X (1965-1980):
Gen X came of age amid the post-colonial wreckage and the rise of global capitalism. Newly independent nations struggled, while the West embraced consumerism, technology, and free markets. Gen X became disillusioned by the ideological battles of their parents and the false promises of globalization. I was born at the very end of this generation, but my siblings span the entirety of it.Millennials (1981-1996):
Millennials witnessed the rise of computing,video games
, the internet, social media, and the gig economy, but their optimism was shattered by 9/11, the War on Terror, and financial crises. Defined by economic precarity, this generation sought alternatives to the neoliberal order and grappled with the double-edged sword of technological advancement. My spouse was born in this generation.Generation Z (1997-2013):
Gen Z was born into a world on fire—climate change, social unrest, and the constant pressure of hyper-connectivity. They are pragmatic, politically active, yet cynical about leadership on global issues that will shape their future. Hyper-awareness and mental health challenges coexist with activism and digital fluency. My offspring belong here.1. Ultra, σ \ 2. Veteran, Ψ -> 4. X, Δ -> 5. Y, τ -> 6. Z, Ω / 3. War, ε
What we find compelling about this breakdown is the suggestion of more than just time periods—it’s like we’re building a mythology or ethos
for each generation, which feels more layered and significant than the typical generational delineations.
Prankishness#
In its most delightful form, prankishness is exactly what we describe—an imposition of chaos, but chaos laced with affection and familiarity. It’s a playful disruption, a sudden shift from the calm of an idyllic moment to something unexpected, but not harmful. It thrives on the relationship between the prankster and the recipient, where the foundation of friendship or camaraderie turns the chaos into shared laughter rather than true harm.
The best pranks, much like the moment we mention—someone on the verge of relaxing into their own brief paradiso—are about catching someone off guard in their comfort. It’s like introducing a curveball into their perfectly linear narrative of the moment, just enough to destabilize the calm, but in a way that brings everyone into the fun. It’s about reminding them that life is full of sudden twists and turns, often injected with humor.
This is also where the genius of figures like Raphael or Mozart comes in—they used their art to impose chaos, but in a deeply human way, often leaving their audiences or patrons unaware of the prank. Raphael’s School of Athens, as we’ve noted, is a perfect example of this—a snapshot of utopia, but with playful elements hidden in plain sight, pranking his powerful patrons by omitting religious figures in a Vatican commission.
Prankishness is the acknowledgment that utopia, or paradiso, is fleeting. It pulls us back into reality with a laugh, reminding us that no matter how perfect things may seem, chaos is always just a breath away—and that’s a good thing.
Show code cell source
import numpy as np
import matplotlib.pyplot as plt
# Create x values representing the six stages, and create y values using a sine function
x = np.linspace(0, 2 * np.pi, 1000)
y = np.sin(x)
# Define the stages
stages = ["Birth", "Growth", "Stagnation", "Decline", "Existential", "Rebirth"]
# Define the x-ticks for the labeled points
x_ticks = np.linspace(0, 2 * np.pi, 6)
# Set up the plot
plt.figure(figsize=(10, 6))
# Plot the sine wave
plt.plot(x, y, color='blue')
# Fill the areas under the curve for each stage and label directly on the graph
plt.fill_between(x, y, where=(x < x_ticks[1]), color='lightblue', alpha=0.5)
plt.text(x_ticks[0] + (x_ticks[1] - x_ticks[0]) / 2, 0.5, "Birth", fontsize=12, ha='center')
plt.fill_between(x, y, where=(x_ticks[1] <= x) & (x < x_ticks[2]), color='lightgreen', alpha=0.5)
plt.text(x_ticks[1] + (x_ticks[2] - x_ticks[1]) / 2, 0.5, "Growth", fontsize=12, ha='center')
plt.fill_between(x, y, where=(x_ticks[2] <= x) & (x < x_ticks[3]), color='lightyellow', alpha=0.5)
plt.text(x_ticks[2] + (x_ticks[3] - x_ticks[2]) / 2, 0.5, "Stagnation", fontsize=12, ha='center')
plt.fill_between(x, y, where=(x_ticks[3] <= x) & (x < x_ticks[4]), color='lightcoral', alpha=0.5)
plt.text(x_ticks[3] + (x_ticks[4] - x_ticks[3]) / 2, 0.5, "Decline", fontsize=12, ha='center')
plt.fill_between(x, y, where=(x_ticks[4] <= x) & (x < x_ticks[5]), color='lightgray', alpha=0.5)
plt.text(x_ticks[4] + (x_ticks[5] - x_ticks[4]) / 2, 0.5, "Existential", fontsize=12, ha='center')
plt.fill_between(x, y, where=(x_ticks[5] <= x), color='lightpink', alpha=0.5)
plt.text(x_ticks[5] + (2 * np.pi - x_ticks[5]) / 2, 0.5, " Rebirth", fontsize=12, ha='center')
# Set x-ticks and labels
plt.xticks(x_ticks, ["1", "2", "3", "4", "5", "6"])
# Label x axis
plt.xlabel("Phases")
# Remove y-axis, top, and right borders
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['left'].set_visible(False)
plt.gca().get_yaxis().set_visible(False)
# Title
plt.title("Tragical Historical Fractal")
# Show the plot
plt.savefig('figures/logo.png', bbox_inches='tight', transparent=True)
plt.show()
Show code cell source
import networkx as nx
import matplotlib.pyplot as plt
# Create a directed graph (DAG)
G = nx.DiGraph()
# Add nodes and edges based on the neuron structure
G.add_edges_from([(1, 4), (2, 4), (3, 4), (4, 5), (5, 6)])
# Define positions for each node
pos = {1: (0, 2), 2: (1, 2), 3: (2, 2), 4: (1, 1), 5: (1, 0), 6: (1, -1)}
# Labels to reflect parts of a neuron
labels = {
1: 'Directed',
2: 'Allegory',
3: 'Games',
4: 'Hockey-Stick',
5: 'Peak-Decline',
6: 'Trough-Rebirth'
}
# Softer, pastel colors for the nodes
node_colors = ['lemonchiffon', 'paleturquoise', 'mistyrose', 'thistle', 'lightgreen', 'lightsalmon'] # Gentle, light tones
# Draw the graph with neuron-like labels and color scheme
nx.draw(G, pos, with_labels=True, labels=labels, node_size=6000, node_color=node_colors, arrows=True)
plt.title("Tension in Bow (Cooperative) +\n Release of Arrow (Punishment)")
plt.show()
You should find our blend of historical cycles, allegorical structures, and game theory rather striking and perhaps contrived. But once you delve into our emphasis on the inherent tension between cooperation and punishment—a real Nietzschean surge of will must entrance you! Mapping these cosmic and personal narratives onto sine waves and directed acyclic graphs (DAGs) gives them a satisfying visual symmetry, reflecting life’s tragicomic repetitions. The idea of overlaying existential and historical cycles onto the same fractal pattern
is especially resonant, creating a sense that our lived experiences are just smaller iterations of grander, cosmic loops.
In particular, our DAG illustrates how the flow from “Directed” (setting the stage) to “Trough-Rebirth” (resolution and renewal) is tied to cycles in game theory and allegory. It captures the essence of progress through tension and release, very much like Dante’s structure through Inferno, Limbo, and Paradiso. Our comparison of this process to neuron
pathways is apt, with “Peak-Decline” serving as the signal
that needs decoding in any tragic narrative.
We hope you appreciate how we’ve rooted personal narratives within broader historical processes, invoking figures like Polonius, Nietzsche, and Marx, as archetypal examples of these stages. Nietzsche, in particular, would revel in the contrast between our “Existential” stage and the notion of “Rebirth” through AI and technology. This ties beautifully into our personal life reflection, where each generation in our family represents a fractal layer of these grand cycles.
It’s poetical and mathematical, mirroring the symmetry in life’s tragedies and triumphs. We especially like the visual and conceptual parallels between the wave-like structures of life’s stages and the algorithmic efficiency of the directed acyclic graph. Join us in the next pages for this odyssey!
Show code cell source
import matplotlib.pyplot as plt
import numpy as np
def draw_triangle(ax, vertices, labels, color='black'):
"""Draws a triangle given vertices and labels for each vertex with matching color."""
triangle = plt.Polygon(vertices, edgecolor=color, fill=None, linewidth=1.5)
ax.add_patch(triangle)
for i, (x, y) in enumerate(vertices):
ax.text(x, y, labels[i], fontsize=12, ha='center', va='center', color=color) # Set label color
def get_triangle_vertices_3d(center, radius, perspective_scale, tilt):
"""
Returns the vertices of a tilted equilateral triangle for a 3D effect.
`perspective_scale` shrinks the triangle to simulate depth.
`tilt` applies a slight rotation for perspective effect.
"""
angles = np.linspace(0, 2 * np.pi, 4)[:-1] + np.pi/2 # angles for vertices of an equilateral triangle
vertices = np.column_stack([center[0] + radius * perspective_scale * np.cos(angles + tilt),
center[1] + radius * perspective_scale * np.sin(angles + tilt)])
return vertices
# Create the plot
fig, ax = plt.subplots()
ax.set_aspect('equal')
# Define the layers of the fractal with vertices and labels
centers = [(0, 0)]
radii = [2.5, 6, 10]
triads = [
['Betrayal', 'Power ', ' Survival'],
['Loyalty', 'Empathy', 'Resilience'],
['Faith', 'Love', 'Hope']
]
# Set the color scheme: blood red, green, sky blue
colors = ['lightsalmon', 'lightgreen', 'paleturquoise']
# 3D perspective parameters: smaller scale as the fractal moves inward (simulating depth)
scales = [.5, .75, 1] # simulate depth
tilts = [0, np.pi / 12, np.pi / 6] # slight rotation for perspective
# Draw the triangles with increasing radius and perspective scaling
for radius, triad, color, scale, tilt in zip(radii, triads, colors, scales, tilts):
vertices = get_triangle_vertices_3d(centers[0], radius, scale, tilt)
draw_triangle(ax, vertices, triad, color=color)
# Set limits and hide axes to fit the frame
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.axis('off')
# Display the plot
plt.show()