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