horticulture-protocol/unit-balancer.html

322 lines
11 KiB
HTML
Raw Permalink Normal View History

2026-07-18 18:15:25 +02:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Unit Load Balancer | Benjamin Salais</title>
<style>
:root {
--bg: #0f1115;
--surface: #1a1d24;
--accent: #d4af37;
--text: #e8e6e3;
--muted: #9ca3af;
--success: #10b981;
--warning: #f59e0b;
--danger: #ef4444;
--font-main: 'Georgia', serif;
--font-mono: 'JetBrains Mono', 'Courier New', monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background-color: var(--bg);
color: var(--text);
font-family: var(--font-main);
line-height: 1.6;
max-width: 900px;
margin: 0 auto;
padding: 2rem 1rem;
}
header {
border-bottom: 1px solid var(--surface);
padding-bottom: 2rem;
margin-bottom: 3rem;
}
h1 {
font-size: 2rem;
margin-bottom: 0.5rem;
}
.breadcrumb {
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--muted);
}
.breadcrumb a {
color: var(--accent);
text-decoration: none;
}
main {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 3rem;
}
@media (max-width: 768px) {
main { grid-template-columns: 1fr; }
}
.panel {
background: var(--surface);
border: 1px solid #2a2f3a;
border-radius: 8px;
padding: 2rem;
}
h2 {
font-family: var(--font-mono);
font-size: 1rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--accent);
margin-bottom: 1.5rem;
border-bottom: 1px solid #2a2f3a;
padding-bottom: 0.5rem;
}
.control-group {
margin-bottom: 1.5rem;
}
label {
display: block;
font-family: var(--font-mono);
font-size: 0.85rem;
margin-bottom: 0.5rem;
color: var(--muted);
}
input[type="range"] {
width: 100%;
height: 6px;
background: #2a2f3a;
border-radius: 3px;
outline: none;
-webkit-appearance: none;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
width: 20px;
height: 20px;
background: var(--accent);
border-radius: 50%;
cursor: pointer;
transition: transform 0.1s ease;
}
input[type="range"]::-webkit-slider-thumb:hover {
transform: scale(1.2);
}
.value-display {
float: right;
color: var(--text);
font-weight: bold;
}
.result-panel {
position: sticky;
top: 2rem;
}
.metric-row {
display: flex;
justify-content: space-between;
padding: 1rem 0;
border-bottom: 1px solid #2a2f3a;
font-family: var(--font-mono);
font-size: 0.9rem;
}
.metric-label { color: var(--muted); }
.metric-value { font-weight: bold; }
.verdict {
margin-top: 2rem;
padding: 2rem;
border-radius: 8px;
text-align: center;
font-family: var(--font-mono);
font-size: 1.2rem;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.1em;
}
.verdict.sustainable {
background: rgba(16, 185, 129, 0.1);
border: 1px solid var(--success);
color: var(--success);
}
.verdict.caution {
background: rgba(245, 158, 11, 0.1);
border: 1px solid var(--warning);
color: var(--warning);
}
.verdict.overload {
background: rgba(239, 68, 68, 0.1);
border: 1px solid var(--danger);
color: var(--danger);
}
.theory-note {
margin-top: 3rem;
padding: 1.5rem;
background: rgba(212, 175, 55, 0.05);
border-left: 3px solid var(--accent);
font-size: 0.9rem;
color: var(--muted);
}
.theory-note strong { color: var(--accent); }
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<div class="breadcrumb"><a href="index.html">&larr; Home</a> / Unit Load Balancer</div>
<h1>Curriculum Load Balancer</h1>
<p style="color: var(--muted); margin-top: 1rem;">Calibrating the architecture of instruction against the limits of working memory.</p>
</header>
<main>
<section class="panel">
<h2>Parameters</h2>
<div class="control-group">
<label>Intrinsic Load (Topic Complexity)<span class="value-display" id="val-intrinsic">3</span></label>
<input type="range" id="intrinsic" min="1" max="7" step="0.5" value="3">
<small style="display:block; margin-top:0.5rem; color:#555; font-family:var(--font-mono); font-size:0.75rem;">
1=Simple fact retrieval &rarr; 7=Abstract systems theory
</small>
</div>
<div class="control-group">
<label>Extraneous Load (Distractions)<span class="value-display" id="val-extraneous">2</span></label>
<input type="range" id="extraneous" min="0" max="5" step="0.5" value="2">
<small style="display:block; margin-top:0.5rem; color:#555; font-family:var(--font-mono); font-size:0.75rem;">
0=Quiet room &rarr; 5=Uncontrolled environment
</small>
</div>
<div class="control-group">
<label>Germane Load (Scaffolding)<span class="value-display" id="val-germane">2</span></label>
<input type="range" id="germane" min="0" max="5" step="0.5" value="2">
<small style="display:block; margin-top:0.5rem; color:#555; font-family:var(--font-mono); font-size:0.75rem;">
0=Lecture only &rarr; 5=Full worked examples + analogies
</small>
</div>
</section>
<section class="panel result-panel">
<h2>Projection</h2>
<div class="metric-row">
<span class="metric-label">Intrinsic Cost</span>
<span class="metric-value" id="out-intrinsic">3.0</span>
</div>
<div class="metric-row">
<span class="metric-label">Environmental Noise</span>
<span class="metric-value" id="out-extraneous">2.0</span>
</div>
<div class="metric-row">
<span class="metric-label">Support Vector</span>
<span class="metric-value" id="out-germane">-2.0</span>
</div>
<div class="metric-row" style="border:none; margin-top:1rem; padding-top:1.5rem;">
<span class="metric-label" style="color:var(--text); font-size:1.1rem;">Net Cognitive Load</span>
<span class="metric-value" id="net-load" style="color:var(--accent); font-size:1.1rem;">3.0</span>
</div>
<div id="verdict" class="verdict sustainable">
SUSTAINABLE
</div>
<p style="margin-top:1.5rem; font-size:0.9rem; color:var(--muted);" id="advice">
Working memory capacity remains within Miller's bounds (7±2). Proceed with direct instruction.
</p>
</section>
</main>
<section class="theory-note">
<strong>GROUNDED IN:</strong> Cognitive Load Theory (Sweller, Chandler, 1991). <br>
<strong>FORMULA:</strong> Net Load = Intrinsic + Extraneous Germane.<br>
<strong>CAPACITY LIMIT:</strong> 7 discrete units (Miller, 1956). Safe operating range ≤ 5.
</section>
<script>
const inputs = {
intrinsic: document.getElementById('intrinsic'),
extraneous: document.getElementById('extraneous'),
germane: document.getElementById('germane')
};
const displays = {
intrinsic: document.getElementById('val-intrinsic'),
extraneous: document.getElementById('val-extraneous'),
germane: document.getElementById('val-germane')
};
const outputs = {
intrinsic: document.getElementById('out-intrinsic'),
extraneous: document.getElementById('out-extraneous'),
germane: document.getElementById('out-germane'),
net: document.getElementById('net-load'),
verdict: document.getElementById('verdict'),
advice: document.getElementById('advice')
};
function calculate() {
const i = parseFloat(inputs.intrinsic.value);
const e = parseFloat(inputs.extraneous.value);
const g = parseFloat(inputs.germane.value);
// Update displays
displays.intrinsic.textContent = i.toFixed(1);
displays.extraneous.textContent = e.toFixed(1);
displays.germane.textContent = g.toFixed(1);
// Calculate net
const net = i + e - g;
// Update projections
outputs.intrinsic.textContent = i.toFixed(1);
outputs.extraneous.textContent = e.toFixed(1);
outputs.germane.textContent = '-' + g.toFixed(1);
outputs.net.textContent = net.toFixed(1);
// Determine status
outputs.verdict.className = 'verdict';
if (net <= 5) {
outputs.verdict.classList.add('sustainable');
outputs.verdict.textContent = 'SUSTAINABLE';
outputs.advice.textContent = 'Working memory capacity remains within safe bounds. Direct instruction is viable.';
} else if (net <= 7) {
outputs.verdict.classList.add('caution');
outputs.verdict.textContent = 'CAUTION';
outputs.advice.textContent = 'Approaching Miller\'s limit. Increase scaffolding (worked examples) or reduce topic complexity.';
} else {
outputs.verdict.classList.add('overload');
outputs.verdict.textContent = 'OVERLOAD';
outputs.advice.textContent = 'CRITICAL: Exceeds working memory capacity. Unit will fail. Reduce intrinsic load or add germane support immediately.';
}
}
Object.values(inputs).forEach(input => {
input.addEventListener('input', calculate);
});
calculate(); // Initial calc
</script>
</body>
</html>