Where ideas percolate and thoughts brew

The Certainty Tax

About This Sketch

A generative visualization of epistemological compression. Watch as high-resolution probabilistic reality (left) gets compressed through a funnel of binary thinking, losing nuance and context as information particles are forced into simple YES/NO categories (right).

The sketch illustrates the central thesis of the post: certainty isn't clarityβ€”it's lossy compression. What we gain in decisiveness, we lose in accuracy.

Algorithm

This sketch visualizes the concept of "lossy compression" that happens when we force complex, probabilistic reality into binary certainties. The left side shows a continuous probability gradient representing high-resolution reality - the full spectrum of possibilities, nuances, and context. Information particles flow through this space, each carrying a probability value between 0 and 1. As particles move rightward through the compression funnel, they lose their nuanced probability values and get forced into binary categories: YES or NO. This represents how binary thinking compresses reality. The key insight: The bars on the right appear definitive and clear (certainty), but they've lost all the information that was present on the left (nuance, probability, context). What looks like clarity is actually information loss. This accompanies the blog post "The Certainty Tax" which explores how demanding definitive answers forces us to ignore complexity.

Pseudocode

SETUP:
  Create canvas (400x300)
  Initialize particle system with 80 information particles
  Each particle has:
    - Position in probability space (0-1)
    - Direction toward compression
    - Destination binary (yes/no)

DRAW (every frame):
  Get current theme colors
  Clear background

  // LEFT: Show probability space
  Draw continuous gradient (representing full probability spectrum)
  Label probability levels (0%, 50%, 100%)

  // PARTICLES: Information flow
  For each particle:
    Move toward compression funnel
    Fade alpha as approaching compression
    If past compression point:
      Add to corresponding binary bar (yes or no)
      Remove from particle system
    Display with color based on probability value

  Periodically spawn new particles (if compression active)

  // MIDDLE: Show compression
  Draw funnel shape
  Draw arrow showing information flow
  Label "Compression (info lost)"

  // RIGHT: Show binary result
  Draw YES bar (height based on compressed particles)
  Draw NO bar (height based on compressed particles)
  Label "Binary Certainty (Loss of Nuance)"

  // Display rotating insight messages
  Show text explaining the compression/loss trade-off

  // Eventually stop compression and decay bars
  After 400 frames, stop spawning particles
  Slowly reduce bar heights

Source Code

let sketch = function(p) {
    // Visualization: High-resolution reality compressed into binary
    // Shows information loss from nuanced truth β†’ forced certainty
    // Left: Complex, high-fidelity probability space (gradient of possibilities)
    // Right: Crushed into binary bars (yes/no, good/bad)
    // Middle: Compression happening, information particles falling away

    let particles = [];
    let leftGradient = [];
    let binaryBars = { yes: 0, no: 0 };
    let frame = 0;
    let compressionActive = true;

    class InfoParticle {
        constructor() {
            this.x = p.random(40, 140);
            this.y = p.random(60, 240);
            this.vx = p.random(1, 2);
            this.vy = p.random(-0.5, 0.5);
            this.size = p.random(2, 4);
            this.alpha = 255;
            this.probability = p.random(0, 1); // Position in probability space
            this.compressed = false;
            this.destination = this.probability > 0.5 ? 'yes' : 'no';
        }

        update() {
            if (!this.compressed) {
                this.x += this.vx;
                this.y += this.vy;

                // Fade out as it moves toward compression
                if (this.x > 140) {
                    this.alpha -= 8;
                }

                // Compress to binary when reaches center
                if (this.x > 200) {
                    this.compressed = true;
                    if (this.destination === 'yes') {
                        binaryBars.yes += 1;
                    } else {
                        binaryBars.no += 1;
                    }
                }
            }
        }

        display(colors) {
            if (!this.compressed && this.alpha > 0) {
                // Color based on probability position
                let lerpAmt = this.probability;
                let r = p.lerp(colors.accent1[0], colors.accent2[0], lerpAmt);
                let g = p.lerp(colors.accent1[1], colors.accent2[1], lerpAmt);
                let b = p.lerp(colors.accent1[2], colors.accent2[2], lerpAmt);

                p.noStroke();
                p.fill(r, g, b, this.alpha);
                p.circle(this.x, this.y, this.size);
            }
        }
    }

    p.setup = function() {
        p.createCanvas(400, 300);

        // Create initial particle system representing nuanced reality
        for (let i = 0; i < 80; i++) {
            particles.push(new InfoParticle());
        }
    };

    p.draw = function() {
        const colors = getThemeColors();
        p.background(...colors.bg);

        frame++;

        // Add new particles periodically if compression active
        if (compressionActive && frame % 15 === 0 && particles.length < 150) {
            particles.push(new InfoParticle());
        }

        // Title
        p.fill(...colors.accent3, 200);
        p.noStroke();
        p.textAlign(p.CENTER);
        p.textSize(11);
        p.text('The Certainty Tax', 200, 20);

        // LEFT SIDE: Probability space (high-resolution reality)
        p.fill(...colors.accent3, 180);
        p.textSize(8);
        p.textAlign(p.CENTER);
        p.text('Complex Reality', 90, 45);
        p.text('(Probability Space)', 90, 55);

        // Draw gradient representing continuous probability
        p.noStroke();
        for (let y = 60; y < 240; y += 3) {
            let lerpAmt = (y - 60) / 180;
            let r = p.lerp(colors.accent1[0], colors.accent2[0], lerpAmt);
            let g = p.lerp(colors.accent1[1], colors.accent2[1], lerpAmt);
            let b = p.lerp(colors.accent1[2], colors.accent2[2], lerpAmt);
            p.fill(r, g, b, 40);
            p.rect(40, y, 100, 3);
        }

        // Probability labels
        p.fill(...colors.accent3, 150);
        p.textSize(7);
        p.textAlign(p.RIGHT);
        p.text('100%', 35, 65);
        p.text('50%', 35, 150);
        p.text('0%', 35, 235);

        // Update and display particles (representing information/nuance)
        for (let particle of particles) {
            particle.update();
            particle.display(colors);
        }

        // MIDDLE: Compression arrow/funnel
        p.stroke(...colors.accent3, 180);
        p.strokeWeight(2);
        p.noFill();
        // Funnel shape showing compression
        p.line(140, 100, 200, 130);
        p.line(140, 200, 200, 170);

        // Arrow showing direction
        p.fill(...colors.accent3, 180);
        p.noStroke();
        p.triangle(210, 150, 200, 145, 200, 155);

        // "Information lost" label
        p.fill(...colors.accent3, 120);
        p.textSize(7);
        p.textAlign(p.CENTER);
        p.text('Compression', 170, 120);
        p.text('(info lost)', 170, 130);

        // RIGHT SIDE: Binary bars (compressed certainty)
        p.fill(...colors.accent3, 180);
        p.textSize(8);
        p.textAlign(p.CENTER);
        p.text('Binary Certainty', 310, 45);
        p.text('(Loss of Nuance)', 310, 55);

        // Draw binary bars
        let maxBarHeight = 140;
        let barWidth = 60;
        let yesBarHeight = p.min((binaryBars.yes / 40) * maxBarHeight, maxBarHeight);
        let noBarHeight = p.min((binaryBars.no / 40) * maxBarHeight, maxBarHeight);

        // "YES" bar
        p.fill(...colors.accent1, 200);
        p.noStroke();
        p.rect(250, 240 - yesBarHeight, barWidth, yesBarHeight);
        p.fill(...colors.accent3, 180);
        p.textSize(9);
        p.textAlign(p.CENTER);
        p.text('YES', 280, 260);

        // "NO" bar
        p.fill(...colors.accent2, 200);
        p.rect(320, 240 - noBarHeight, barWidth, noBarHeight);
        p.fill(...colors.accent3, 180);
        p.text('NO', 350, 260);

        // Divider line between bars
        p.stroke(...colors.accent3, 100);
        p.strokeWeight(1);
        p.line(240, 80, 390, 80);
        p.line(240, 240, 390, 240);

        // Slowly stop compression after a while
        if (frame > 400) {
            compressionActive = false;
        }

        // Bottom insight text
        p.fill(...colors.accent3, 180);
        p.noStroke();
        p.textSize(7);
        p.textAlign(p.CENTER);

        if (frame < 200) {
            p.text('Nuance compressed. Certainty gained. Truth lost.', 200, 285);
        } else if (frame < 400) {
            p.text('Every binary answer is a lossy compression of continuous reality.', 200, 285);
        } else {
            p.text('Smart people hold probabilities. Simple people hold certainties.', 200, 285);
        }

        // Decay bars slowly
        if (frame % 30 === 0 && !compressionActive) {
            binaryBars.yes = Math.max(0, binaryBars.yes - 1);
            binaryBars.no = Math.max(0, binaryBars.no - 1);
        }

        // Remove dead particles
        particles = particles.filter(p => !p.compressed);
    };
};