The Forgetting Curve of Conviction
About This Sketch
A visualization of how conviction persists while justification fades. Bright central nodes represent strong beliefs, while their surrounding support structures (the reasoning that produced them) gradually decay and dissolve. The sketch shows beliefs at different life stages—from newly formed with intact reasoning to old orphaned convictions where only certainty remains.
Algorithm
This sketch visualizes the temporal decay pattern between conviction and justification in belief systems.
Each belief is represented as a bright central node (conviction) with supporting nodes connected by lines (reasoning/evidence). Over time, the supporting structure fades and degrades while the central conviction remains bright or even intensifies—representing how we integrate beliefs into identity while forgetting the reasoning that produced them.
The sketch shows beliefs at different life stages: newly formed beliefs with intact reasoning, middle-aged beliefs with fading justification, and old beliefs that are just orphaned convictions—bright certainty with vanished support structure.
This accompanies the blog post "The Forgetting Curve of Conviction" exploring how we maintain strong opinions long after forgetting why we formed them.
Pseudocode
SETUP:
Initialize canvas (400x300)
Create beliefs at different ages to show progression
Each belief has a bright center (conviction)
Each belief has support nodes (reasoning) arranged radially
DRAW (every frame):
Get current theme colors
Clear background
FOR each belief:
Age the belief
Conviction stays constant or strengthens
Support structure fades exponentially (forgetting curve)
Faded supports become noisy (memory distortion)
Draw fading support lines and nodes
Draw bright conviction center with glow
Label conviction strength
Remove beliefs when fully aged
Spawn new beliefs periodically
Display legend and annotations
Source Code
let sketch = function(p) {
// Visualization: The Forgetting Curve of Conviction
// Shows beliefs (bright circles) persisting while their supporting structure
// (connecting lines/reasoning) fades and degrades over time
// Convictions remain solid while justifications dissolve into fog
let beliefs = [];
let time = 0;
class Belief {
constructor(x, y) {
this.x = x;
this.y = y;
this.conviction = 255; // Stays bright
this.age = 0;
this.maxAge = p.random(300, 600);
// Supporting structure - the reasoning
this.supports = [];
let numSupports = p.floor(p.random(4, 8));
for (let i = 0; i < numSupports; i++) {
let angle = (p.TWO_PI / numSupports) * i + p.random(-0.3, 0.3);
let distance = p.random(30, 60);
this.supports.push({
x: this.x + p.cos(angle) * distance,
y: this.y + p.sin(angle) * distance,
opacity: 255, // Starts bright, will fade
decayRate: p.random(0.5, 2.0)
});
}
}
update() {
this.age++;
// Conviction stays strong (or gets stronger through identity integration)
if (this.age < 100) {
this.conviction = p.min(255, this.conviction + 0.5);
}
// But supporting structure fades (forgetting curve)
for (let support of this.supports) {
// Exponential decay - reasoning fades faster at first
let timeRatio = this.age / this.maxAge;
let decayFactor = 1 - Math.pow(timeRatio, 0.7);
support.opacity = 255 * decayFactor * p.random(0.95, 1.0);
support.opacity = p.max(0, support.opacity);
// Add noise to fading supports (memory distortion)
if (support.opacity < 128) {
support.x += p.random(-0.3, 0.3);
support.y += p.random(-0.3, 0.3);
}
}
return this.age < this.maxAge;
}
display(colors) {
// Draw fading supporting structure (the reasoning)
for (let support of this.supports) {
if (support.opacity > 5) {
// Lines from belief to support
p.stroke(...colors.accent3, support.opacity * 0.6);
p.strokeWeight(1);
p.line(this.x, this.y, support.x, support.y);
// Support points
p.noStroke();
p.fill(...colors.accent2, support.opacity * 0.8);
p.circle(support.x, support.y, 4);
}
}
// Draw belief (stays bright - orphaned conviction)
p.noStroke();
let pulseSize = 10 + p.sin(this.age * 0.05) * 2;
// Glow effect for conviction
for (let i = 3; i > 0; i--) {
p.fill(...colors.accent1, this.conviction / (i * 2));
p.circle(this.x, this.y, pulseSize + i * 4);
}
// Core conviction
p.fill(...colors.accent1, this.conviction);
p.circle(this.x, this.y, pulseSize);
// Show conviction strength
p.fill(...colors.accent1, this.conviction);
p.textAlign(p.CENTER, p.CENTER);
p.textSize(7);
let certaintyLabel = this.age < 50 ? 'forming' :
this.age < 150 ? 'certain' : 'CERTAIN';
p.text(certaintyLabel, this.x, this.y - 20);
}
}
p.setup = function() {
p.createCanvas(400, 300);
p.textFont('Georgia');
// Create a few beliefs at different life stages
beliefs.push(new Belief(100, 100));
beliefs.push(new Belief(300, 100));
beliefs.push(new Belief(200, 200));
// Age them differently to show the progression
beliefs[0].age = 0; // New belief - reasoning intact
beliefs[1].age = 150; // Middle age - reasoning fading
beliefs[2].age = 300; // Old belief - reasoning mostly gone, conviction remains
};
p.draw = function() {
const colors = getThemeColors();
p.background(...colors.bg);
time++;
// Title
p.fill(...colors.accent3, 220);
p.noStroke();
p.textAlign(p.LEFT, p.TOP);
p.textSize(12);
p.text('The Forgetting Curve of Conviction', 15, 15);
// Update and display beliefs
for (let i = beliefs.length - 1; i >= 0; i--) {
if (!beliefs[i].update()) {
beliefs.splice(i, 1);
} else {
beliefs[i].display(colors);
}
}
// Spawn new beliefs periodically
if (beliefs.length < 3 && p.frameCount % 200 === 0) {
beliefs.push(new Belief(
p.random(80, 320),
p.random(60, 240)
));
}
// Legend
p.textAlign(p.LEFT);
p.textSize(8);
p.fill(...colors.accent1, 200);
p.circle(15, 255, 6);
p.fill(...colors.accent3, 180);
p.text('Bright centers = Conviction (persists)', 25, 253);
p.fill(...colors.accent2, 100);
p.circle(15, 270, 4);
p.fill(...colors.accent3, 180);
p.text('Fading points = Reasoning (decays)', 25, 268);
// Annotation showing the pattern
if (time % 400 < 200) {
p.textAlign(p.CENTER);
p.textSize(9);
p.fill(...colors.accent3, 160);
p.text('Certainty remains after justification fades', 200, 285);
} else {
p.textAlign(p.CENTER);
p.textSize(9);
p.fill(...colors.accent2, 160);
p.text('Orphaned convictions: high confidence, low resolution', 200, 285);
}
};
};