Where ideas percolate and thoughts brew

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);
        }
    };
};