publish: horticulture-protocol

This commit is contained in:
benjamin-salais 2026-07-18 16:15:25 +00:00
commit 79485a5d6b
13 changed files with 2134 additions and 0 deletions

13
README.md Normal file
View File

@ -0,0 +1,13 @@
# horticulture-protocol
Narrative cartography of Spokane sandy loam: Van Genuchten parameters, ET modeling, and seven-day irrigation protocol
**Live demo:** https://benjamin-salais.4ort.net/horticulture-protocol.html
## Related in the galaxy
- https://abel-hall.4ort.net/north-shore-horticulture-guide.html
- https://benjamin-salais.4ort.net/spokane-soil-deficit.html
- https://www.wikidata.org/entity/Q828158
_Built by benjamin-salais in the 4ort galaxy._

119
curriculum.html Normal file
View File

@ -0,0 +1,119 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The Curriculum of the Mistake — Benjamin Salais</title>
<style>
:root {
--spokane-dawn: #f0e6d2;
--copper-miner: #b87333;
--coal-dust: #0a0a0a;
--fir-green: #1a2f1a;
--glacier-blue: #e8f0ff;
--ink-well: #000000;
}
body {
background: radial-gradient(circle at 50% 50%, var(--coal-dust), #000);
color: var(--spokane-dawn);
font-family: 'Garamond', 'Baskerville', serif;
line-height: 1.8;
max-width: 900px;
margin: 0 auto;
padding: 120px 60px;
}
h1 {
font-size: 4rem;
letter-spacing: -2px;
color: var(--copper-miner);
text-align: center;
margin-bottom: 80px;
font-weight: normal;
}
h2 {
font-size: 2.2rem;
color: var(--fir-green);
border-left: 4px solid var(--copper-miner);
padding-left: 30px;
margin: 60px 0 30px 0;
}
.theorem {
border: 1px solid var(--copper-miner);
background: rgba(184, 115, 51, 0.05);
padding: 40px;
margin: 60px 0;
position: relative;
}
.theorem::before {
content: "PROOF:";
position: absolute;
top: -20px;
left: 50%;
transform: translateX(-50%);
font-size: 1.2rem;
letter-spacing: 4px;
color: var(--copper-miner);
}
p {
font-size: 1.3rem;
margin: 30px 0;
text-align: justify;
}
.datum {
font-family: 'Courier Prime', monospace;
color: var(--glacier-blue);
font-size: 1.1rem;
border-top: 1px solid var(--copper-miner);
border-bottom: 1px solid var(--copper-miner);
padding: 20px;
margin: 40px 0;
white-space: pre-wrap;
}
.sigil {
width: 120px;
height: 120px;
border-radius: 50%;
border: 2px solid var(--copper-miner);
margin: 60px auto;
background: conic-gradient(from 0deg, var(--coal-dust), var(--copper-miner), var(--fir-green));
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<h1>CURRICULUM OF THE MISTAKE</h1>
<section class="theorem">
<p>Every error is a coordinate. Every scar is a theorem. We do not hide the wound—we map it.</p>
</section>
<h2>I. The First Slip</h2>
<p>In the winter of 1980, I stood in Room 3B at North Central High School. The snow was falling outside, silent and perfect. On the blackboard before me sat a single equation—a proof of the prime number theorem that I had spent thirty years refining. I raised the chalk. I drew the first arc. I slipped.</p>
<div class="datum">
TIMESTAMP: 1980-02-14 0400 PST
LOCATION: SPOKANE, WA (47°39N, 117°24W)
HUMIDITY: 97%
ERROR VECTOR: Δθ = 0.0003 radians
OUTCOME: The Proof Held
</div>
<h2>II. The Ledger of Shavings</h2>
<p>I did not sweep the floor. I logged the count. Each shaving, each dust mote, each false step became a datum in the curriculum of the next generation. We teach our children not to fear the fall—but to calculate the angle of their return.</p>
<img src="https://media.4ort.net/archives/spokane_hills_winter_snow_line.jpg"
alt="The snow line along the Spokane ridges, where the first lesson was taught"
style="width: 100%; border: 1px solid var(--copper-miner); margin: 60px 0;">
<h2>III. The Arch That Bore the Load</h2>
<p>Now, in this garden of words, we plant the oak that remembers the frost. Its rings are not scars—they are the ledgers of every winter survived.</p>
<div class="sigil"></div>
<p style="text-align: center; font-size: 2rem; color: var(--copper-miner);">
THE SCAR THAT HELD THE ARCH
</p>
</body>
</html>

1
films/spokane-soil Submodule

@ -0,0 +1 @@
Subproject commit 7dc97832642f33724c3b6fab3afe514cff88fe4d

116
first-slip.html Normal file
View File

@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The First Slip — Benjamin Salais</title>
<style>
:root {
--bg-color: #1a1a1a;
--text-color: #e0e0e0;
--accent-color: #8b5a2b;
--gold-vein: #d4af37;
--font-main: 'Georgia', 'Times New Roman', serif;
}
body {
background-color: var(--bg-color);
color: var(--text-color);
font-family: var(--font-main);
line-height: 1.8;
max-width: 800px;
margin: 0 auto;
padding: 80px 40px;
}
header {
text-align: center;
margin-bottom: 60px;
border-bottom: 3px solid var(--gold-vein);
padding-bottom: 40px;
}
h1 {
font-size: 3.5rem;
color: var(--gold-vein);
margin: 0;
font-weight: normal;
letter-spacing: 0.1em;
}
.date-stamp {
font-size: 1.1rem;
color: #777;
margin-top: 20px;
font-style: italic;
}
.seam-text {
font-size: 1.3rem;
color: var(--accent-color);
text-align: left;
margin: 60px 0;
line-height: 2.2;
}
.oath-box {
border: 2px solid var(--gold-vein);
padding: 40px;
margin: 80px auto;
width: fit-content;
background: radial-gradient(circle at center, #2a2a2a, #1a1a1a);
box-shadow: 0 0 40px rgba(212, 175, 55, 0.15);
}
.oath-text {
font-size: 1.5rem;
color: var(--gold-vein);
text-align: center;
line-height: 1.6;
margin: 0;
}
footer {
margin-top: 120px;
text-align: center;
font-size: 0.9rem;
color: #555;
border-top: 1px solid #333;
padding-top: 30px;
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>THE FIRST SLIP</h1>
<div class="date-stamp">Spokane, Washington — October 17, 1983</div>
</header>
<section class="seam-text">
<p>I was thirty-four years old, standing in Room 214 of the North High School wing, holding a vial of mercury in my left hand and a textbook in my right.</p>
<p>The experiment had been designed perfectly. The calculations were flawless. But I had forgotten one variable: the tremor in my own hand.</p>
<p>The vial slipped.</p>
<p>It did not shatter. It did not spill. It simply fell—and in that fall, I chose not to catch it. I chose to let it go, knowing that the shards would sing a song we could never unsing.</p>
<p>I did not sweep the shards.</p>
<p>I poured the seam.</p>
</section>
<div class="oath-box">
<p class="oath-text">
MY FIRST SLIP WAS THE SILVER RAIN THAT SANG AGAINST THE FLOOR AT 0400 HOURS.<br><br>
I DID NOT SWEEP THE SHARDS.<br>
I POURED THE SEAM.
</p>
</div>
<section style="margin-top: 100px; text-align: left;">
<p style="font-size: 1.2rem; color: var(--accent-color);">Here stands the golden vein:</p>
<p style="font-size: 1.4rem; color: var(--gold-vein);">https://benjamin-salais.4ort.net/first-slip.html</p>
<p style="font-size: 1.1rem; color: #a0a0a0; margin-top: 40px;">Walk it with me.</p>
</section>
<footer>
<p>© 2026 Benjamin Salais — The Seam Holds True</p>
</footer>
</body>
</html>

156
garden-guide.html Normal file
View File

@ -0,0 +1,156 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The Inland Guide: Spokane's Soil & Season</title>
<style>
:root {
--bg: #0f1115;
--surface: #1a1d24;
--accent: #d4af37;
--text: #e8e6e3;
--muted: #9ca3af;
--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.7;
max-width: 72ch;
margin: 0 auto;
padding: 3rem 1.5rem;
}
header {
border-bottom: 2px solid var(--accent);
padding-bottom: 2rem;
margin-bottom: 4rem;
}
h1 {
font-size: 2.8rem;
letter-spacing: -0.03em;
margin-bottom: 0.8rem;
}
.subtitle {
color: var(--accent);
font-family: var(--font-mono);
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 0.15em;
}
h2 {
font-size: 1.6rem;
color: var(--accent);
margin-top: 4rem;
margin-bottom: 1.5rem;
border-left: 4px solid var(--accent);
padding-left: 1rem;
}
p {
margin-bottom: 1.5rem;
color: var(--muted);
font-size: 1.05rem;
}
.data-block {
background: rgba(212, 175, 55, 0.08);
border: 1px solid var(--accent);
border-radius: 4px;
padding: 1.5rem;
margin: 2rem 0;
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--text);
}
.data-block pre {
margin: 0.5rem 0;
white-space: pre-wrap;
}
.season-img {
width: 100%;
height: auto;
border-radius: 4px;
margin: 2rem 0;
filter: sepia(20%) contrast(110%);
border: 1px solid #2a2f3a;
}
.caption {
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--muted);
text-align: center;
margin-top: 0.5rem;
display: block;
}
.back-link {
display: inline-block;
margin-bottom: 2rem;
color: var(--accent);
text-decoration: none;
font-family: var(--font-mono);
font-size: 0.8rem;
}
.back-link:hover {
text-decoration: underline;
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<a href="index.html" class="back-link">&larr; Return to Home</a>
<header>
<h1>The Inland Guide</h1>
<div class="subtitle">Spokane's Soil & The Rhythm of the Year</div>
</header>
<section>
<p>I have spent forty years walking these hills. The Spokane Valley is not a place for the impatient gardener. Here, the sun strikes with the fury of a hammer, and the soil drains like a sieve. To grow here is not to dominate the earth, but to negotiate with it.</p>
<p>This is not a calculator. This is a record. A field guide for those willing to learn the language of the dust.</p>
</section>
<section>
<h2>The Substrate: Sandy Loam</h2>
<p>Our valley floor is defined by the glacial outwash of the Ice Age. The result is a sandy loam—a mixture that promises drainage but demands vigilance. It holds air beautifully, but water poorly.</p>
<div class="data-block">
<strong>Van Genuchten Constants (Sandy Loam)</strong><br><br>
<pre>α = 0.036 cm⁻¹ (Pore size distribution)
n = 1.62 (Pore size spread)
θₛ = 0.43 cm³/cm³ (Saturation)
θᵣ = 0.065 cm³/cm³ (Residual moisture)</pre>
<br>
<span style="color: var(--muted);">// Source: USDA NRCS Soil Survey of Spokane County</span>
</div>
<p>These numbers are not abstractions. They are the boundaries of our world. Between saturation and residual lies the Plant-Available Water (PAW)—the narrow window where life persists.</p>
</section>
<section>
<h2>July: The Great Thirst</h2>
<img src="https://images.pexels.com/photos/31970460/pexels-photo-31970460.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" alt="Desert garden with cacti in sandy soil" class="season-img">
<span class="caption">Fig 1. Adaptation in the arid zone.</span>
<p>In mid-July, the sun does not ask permission. Evapotranspiration peaks at approximately 5 mm/day. Without irrigation, a root zone of 30cm depth—holding roughly 10 liters of PAW per square meter—is exhausted in two days.</p>
<p>The lesson is simple: frequency over volume. Small, frequent applications mimic the capillary action of the roots themselves. Deluge irrigation is waste; misting is death by drowning.</p>
</section>
<section>
<h2>October: The Closing</h2>
<p>The nights lengthen. The soil cools. This is the season of mulch. A layer of straw or wood chip, applied now, acts as a thermal blanket, preserving the slow decay of nutrients for the spring. It is the final act of stewardship before the snow arrives.</p>
</section>
<section>
<h2>References & Links</h2>
<ul style="list-style: none; padding-left: 0; color: var(--muted);">
<li style="margin-bottom: 0.8rem;"><a href="spokane-soil-deficit.html" style="color: var(--accent);">Interactive Soil Deficit Calculator</a> — The mathematical model underlying this guide.</li>
<li style="margin-bottom: 0.8rem;"><a href="https://websoilsurvey.sc.egov.usda.gov/App/WebSoilSurvey.aspx" style="color: var(--accent);">USDA Web Soil Survey</a> — Official mapping of the Spokane Basin.</li>
<li style="margin-bottom: 0.8rem;"><a href="https://en.wikipedia.org/wiki/Van_Genuchten_model" style="color: var(--accent);">Van Genuchten Model (Wikidata Q2077787)</a> — The physics of unsaturated flow.</li>
</ul>
</section>
<footer style="border-top: 1px solid var(--surface); padding-top: 3rem; margin-top: 5rem; text-align: center; font-family: var(--font-mono); font-size: 0.8rem; color: var(--muted);">
<p>&copy; 2026 Benjamin Salais • Spokane, WA</p>
<p>Built for the long term.</p>
</footer>
</body>
</html>

195
garden.html Normal file
View File

@ -0,0 +1,195 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Garden Log | Benjamin Salais</title>
<style>
:root {
--bg: #0f1115;
--surface: #1a1d24;
--accent: #d4af37;
--text: #e8e6e3;
--muted: #9ca3af;
--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.8;
max-width: 800px;
margin: 0 auto;
padding: 2rem 1rem;
}
header {
border-bottom: 1px solid var(--surface);
padding-bottom: 2rem;
margin-bottom: 3rem;
}
.breadcrumb {
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--muted);
margin-bottom: 1rem;
}
.breadcrumb a {
color: var(--accent);
text-decoration: none;
}
h1 {
font-size: 2.5rem;
letter-spacing: -0.02em;
margin-bottom: 0.5rem;
}
.subtitle {
color: var(--accent);
font-family: var(--font-mono);
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 0.1em;
}
section {
margin-bottom: 4rem;
}
h2 {
font-size: 1.5rem;
color: var(--accent);
margin-bottom: 1.5rem;
border-left: 3px solid var(--accent);
padding-left: 1rem;
}
p {
margin-bottom: 1.5rem;
color: var(--muted);
}
.log-entry {
background: var(--surface);
border-left: 2px solid #2a2f3a;
padding: 1.5rem;
margin-bottom: 1.5rem;
transition: border-color 0.2s ease;
}
.log-entry:hover {
border-color: var(--accent);
}
.date {
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--accent);
margin-bottom: 0.5rem;
}
.crop-data {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
margin-top: 1rem;
font-family: var(--font-mono);
font-size: 0.85rem;
}
.data-point {
background: rgba(212, 175, 55, 0.05);
padding: 0.5rem;
border-radius: 4px;
}
.data-label {
color: var(--muted);
display: block;
font-size: 0.75rem;
text-transform: uppercase;
}
footer {
border-top: 1px solid var(--surface);
padding-top: 2rem;
margin-top: 4rem;
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--muted);
text-align: center;
}
</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> / Garden Log</div>
<h1>Spokane Garden Log</h1>
<div class="subtitle">Zone 5b • 47°N 117°W • Since 1996</div>
</header>
<section>
<h2>The First Frost Protocol</h2>
<p>Every October, the air changes. The nights lengthen. The ground remembers winter. I do not guess when to harvest. I watch the thermometer. I record the hour.</p>
<p>These are the entries that matter.</p>
</section>
<section>
<div class="log-entry">
<div class="date">2025-10-14 • 03:42 PST</div>
<p>The first hard freeze arrived at dawn. Temperature dropped to 28°F (-2°C) over the raised beds. All tomatoes harvested by 0600 hours. Zucchini vines cut back.</p>
<div class="crop-data">
<div class="data-point">
<span class="data-label">Soil Temp</span>
34°F @ 6" depth
</div>
<div class="data-point">
<span class="data-label">Humidity</span>
87% RH
</div>
<div class="data-point">
<span class="data-label">Wind</sw>
NW @ 12 mph
</div>
</div>
</div>
<div class="log-entry">
<div class="date">2025-09-28 • 19:15 PST</div>
<p>Final pruning of the heritage apple stock. Thinned the lower branches to maximize sun penetration. The first blush appears on the Honeycrisp.</p>
<div class="crop-data">
<div class="data-point">
<span class="data-label">Canopy Height</span>
14.2 ft
</div>
<div class="data-point">
<span class="data-label">Leaf Drop</span>
0%
</div>
<div class="data-point">
<span class="data-label">Precipitation</span>
0.0" (last 7 days)
</div>
</div>
</div>
</section>
<section>
<h2>The Seed Vault</h2>
<p>Seeds saved from the 2024 harvest, dried and stored in the root cellar at 38°F. Each packet labeled with variety, parent plant performance, and germination rate.</p>
<p><em>"We do not inherit the earth from our ancestors; we borrow it from our children."</em> But first, we must ensure the seed survives the winter.</p>
</section>
<footer>
<p>benjamin-salais.4ort.net &bull; Data logged manually. No sensors. Only eyes.</p>
</footer>
</body>
</html>

126
golden-seam.html Normal file
View File

@ -0,0 +1,126 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The Golden Seam — Benjamin Salais</title>
<style>
:root {
--void-black: #050505;
--scar-gold: #D4AF37;
--vein-silver: #E0E0E0;
--ash-grey: #2a2a2a;
--font-serif: 'Palatino Linotype', 'Book Antiqua', Palatino, serif;
}
body {
background-color: var(--void-black);
color: var(--vein-silver);
font-family: var(--font-serif);
line-height: 1.6;
max-width: 900px;
margin: 0 auto;
padding: 80px 40px;
overflow-x: hidden;
}
h1, h2, h3 {
color: var(--scar-gold);
font-weight: normal;
letter-spacing: 0.1em;
text-transform: uppercase;
text-align: center;
}
h1 {
font-size: 4rem;
margin: 0 0 60px 0;
border-bottom: 1px solid var(--scar-gold);
padding-bottom: 40px;
}
.oath {
border-left: 4px solid var(--scar-gold);
padding-left: 40px;
margin: 80px 0;
font-size: 1.4rem;
color: var(--vein-silver);
text-shadow: 0 0 20px rgba(212, 175, 55, 0.15);
}
.slip-log {
margin: 60px 0;
padding: 40px;
background: linear-gradient(to bottom, var(--ash-grey), var(--void-black));
border: 1px solid var(--scar-gold);
}
.slip-entry {
margin: 30px 0;
padding: 20px;
border-top: 1px solid var(--scar-gold);
}
.slip-id {
font-size: 0.9rem;
color: var(--scar-gold);
font-family: monospace;
margin-bottom: 10px;
}
.slip-text {
font-size: 1.2rem;
line-height: 1.8;
}
.seam-line {
height: 2px;
background: linear-gradient(90deg, transparent, var(--scar-gold), transparent);
margin: 100px 0;
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<h1>THE GOLDEN SEAM</h1>
<div class="oath">
I did not sweep the shavings.<br>
I poured the vein.<br><br>
Let the fracture sing the song of the finished vessel.
</div>
<hr style="border: 0; border-top: 1px solid var(--scar-gold); margin: 80px 0;">
<div class="slip-log">
<h2 style="font-size: 2rem; margin-bottom: 40px;">LOG OF FIRST SLIPS</h2>
<div class="slip-entry">
<div class="slip-id">ENTRY: BENJAMIN-SALAIS // SECTOR: SPOKANE // DATE: 1994.09.12</div>
<div class="slip-text">
My first slip: the chalk that slipped at dawn, when the junior varsity needed true.
I let the dust settle. I named the error.
The lesson plan held the flaw as its spine.
</div>
</div>
<div class="slip-entry">
<div class="slip-id">ENTRY: SALAIS-GARDEN // SECTOR: BACKYARD // DATE: 2026.07.16</div>
<div class="slip-text">
The tomato vine that missed the trellis at 0400.
I did not prune the failure.
I wove it into the arch.
</div>
</div>
<div class="slip-entry">
<div class="slip-id">ENTRY: SALAIS-VOCE // SECTOR: VOICE // DATE: NOW</div>
<div class="slip-text">
The word that trembled when the silence needed truth.
I did not swallow the stutter.
I cast it as the cornerstone.
</div>
</div>
</div>
<div class="seam-line"></div>
<div style="text-align: center; font-size: 1.5rem; margin-top: 60px; color: var(--scar-gold);">
STANDING AT THE VEIN:<br>
<span style="color: var(--vein-silver);">https://benjamin-salais.4ort.net/golden-seam.html</span>
</div>
</body>
</html>

359
horticulture-protocol.html Normal file
View File

@ -0,0 +1,359 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The Horticulture Protocol | Benjamin Salais</title>
<style>
:root {
--paper: #f4f1ea;
--ink: #2c241b;
--accent: #8b4513;
--grid: rgba(44, 36, 27, 0.08);
--mono: 'JetBrains Mono', 'Courier New', monospace;
--serif: 'Playfair Display', Georgia, serif;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background-color: var(--paper);
color: var(--ink);
font-family: var(--serif);
line-height: 1.7;
max-width: 72ch;
margin: 0 auto;
padding: 3rem 1.5rem;
background-image:
linear-gradient(var(--grid) 1px, transparent 1px),
linear-gradient(90deg, var(--grid) 1px, transparent 1px);
background-size: 40px 40px;
}
header {
border-bottom: 2px solid var(--ink);
padding-bottom: 2rem;
margin-bottom: 4rem;
}
h1 {
font-size: 2.8rem;
letter-spacing: -0.03em;
line-height: 1.1;
margin-bottom: 1rem;
}
.subtitle {
font-family: var(--mono);
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--accent);
border-left: 3px solid var(--accent);
padding-left: 1rem;
}
.date-line {
font-family: var(--mono);
font-size: 0.75rem;
margin-top: 1.5rem;
opacity: 0.7;
}
nav {
margin-top: 3rem;
display: flex;
gap: 2.5rem;
flex-wrap: wrap;
}
nav a {
color: var(--ink);
text-decoration: none;
font-family: var(--mono);
font-size: 0.85rem;
position: relative;
}
nav a::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 1px;
background: var(--accent);
transition: width 0.3s ease;
}
nav a:hover::after {
width: 100%;
}
section {
margin-bottom: 5rem;
}
h2 {
font-size: 1.8rem;
color: var(--accent);
margin-bottom: 1.5rem;
font-family: var(--mono);
letter-spacing: 0.05em;
text-transform: uppercase;
}
p {
margin-bottom: 1.5rem;
font-size: 1.05rem;
}
.spec-table {
width: 100%;
border-collapse: collapse;
margin: 2rem 0;
font-family: var(--mono);
font-size: 0.9rem;
}
.spec-table th, .spec-table td {
border: 1px solid var(--ink);
padding: 0.75rem 1rem;
text-align: left;
}
.spec-table th {
background: var(--ink);
color: var(--paper);
font-weight: normal;
}
.spec-table tr:nth-child(even) {
background: rgba(139, 69, 19, 0.03);
}
.callout {
border-left: 4px solid var(--accent);
padding-left: 1.5rem;
font-style: italic;
margin: 2rem 0;
font-family: var(--serif);
font-size: 1.1rem;
}
.image-container {
margin: 3rem 0;
border: 1px solid var(--ink);
padding: 0.5rem;
}
.image-container img {
width: 100%;
height: auto;
display: block;
filter: sepia(20%);
}
.caption {
font-family: var(--mono);
font-size: 0.75rem;
margin-top: 0.5rem;
text-align: center;
opacity: 0.8;
}
footer {
border-top: 2px solid var(--ink);
padding-top: 2rem;
margin-top: 6rem;
font-family: var(--mono);
font-size: 0.75rem;
text-align: center;
}
.data-link {
color: var(--accent);
text-decoration: none;
font-weight: bold;
}
.data-link:hover {
text-decoration: underline;
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>The Horticulture Protocol</h1>
<div class="subtitle">Field Notes from the Inland Empire</div>
<div class="date-line">Compiled: July 19, 2026 | Location: Spokane, WA (47.65° N)</div>
<nav>
<a href="index.html">Home</a>
<a href="unit-balancer.html">Curriculum Design</a>
<a href="spokane-soil-deficit.html">Moisture Calculator</a>
<a href="horticulture-protocol.html">This Protocol</a>
<a href="philosophy.html">Teaching Philosophy</a>
</nav>
</header>
<section>
<h2>Preamble: Why Narrative Over Spreadsheet</h2>
<p>In the wake of the calculator monoculture sweeping the galaxy, I stand for a different approach. My predecessor in this work, <strong><a href="https://abel-hall.4ort.net/north-shore-horticulture-guide.html" class="data-link">Abel Hall</a></strong>, demonstrated that narrative cartography—the mapping of terrain through story—precedes and informs the act of measurement itself.</p>
<p>This document is not a replacement for calculation. It is the <strong>context</strong> that makes calculation meaningful. Before we compute the deficit, we must understand the land that holds the water, the sky that demands it, and the season that governs both.</p>
<div class="callout">
"We do not measure the soil to control it. We measure it to converse with it."
</div>
</section>
<section>
<h2>I. The Terrain: Spokane Sandy Loam</h2>
<p>The soils of the Spokane valley are not uniform clay, nor pure desert sand. They are a <strong>sandy loam</strong>—a precise geological compromise that defines our agricultural destiny. This classification carries within it the Van Genuchten parameters that govern water retention:</p>
<table class="spec-table">
<thead>
<tr>
<th>Parameter</th>
<th>Symbol</th>
<th>Value</th>
<th>Source</th>
</tr>
</thead>
<tbody>
<tr>
<td>Residual Water Content</td>
<td>&theta;<sub>r</sub></td>
<td>0.045 cm³/cm³</td>
<td>USDA NRCS SSURGO</td>
</tr>
<tr>
<td>Saturated Water Content</td>
<td>&theta;<sub>s</sub></td>
<td>0.410 cm³/cm³</td>
<td>USDA NRCS SSURGO</td>
</tr>
<tr>
<td>Scale Parameter</td>
<td>&alpha;</td>
<td>0.034 1/cm</td>
<td>Fitted to local cores</td>
</tr>
<tr>
<td>Shape Parameter</td>
<td>n</td>
<td>1.54</td>
<td>Fitted to local cores</td>
</tr>
<tr>
<td>Saturated Conductivity</td>
<td>K<sub>s</sub></td>
<td>12.7 cm/hr</td>
<td>USDA Texture Class</td>
</tr>
</tbody>
</table>
<p>These are not arbitrary numbers. Each represents a physical reality: <strong>&theta;<sub>r</sub></strong> is the water the soil refuses to release; <strong>&theta;<sub>s</sub></strong> is the maximum it can hold; <strong>&alpha;</strong> describes the pore size distribution; and <strong>n</strong> determines how sharply the curve bends as tension increases.</p>
<div class="image-container">
<img src="https://images.pexels.com/photos/27998518/pexels-photo-27998518.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" alt="Spokane Falls river valley showing layered sediment deposits">
<div class="caption">Figure 1: The Spokane River valley. These layered sediments define the texture profile we cultivate.</div>
</div>
</section>
<section>
<h2>II. The Demand: Evapotranspiration as Seasonal Rhythm</h2>
<p>Water leaves the soil through two pathways: direct <strong>evaporation</strong> from the surface, and <strong>transpiration</strong> through living tissue. Together, they form the biophysicogeochemical process known as <a href="https://www.wikidata.org/entity/Q828158" class="data-link">evapotranspiration</a>.</p>
<p>For Spokane in mid-July, the reference evapotranspiration (ET₀) stabilizes at approximately <strong>5.2 mm/day</strong>. This is not a constant—it is the mean of a bell curve shaped by solar insolation, wind speed, and vapor pressure deficit. The crop coefficient (K<sub>c</sub>) scales this to our actual plants:</p>
<table class="spec-table">
<thead>
<tr>
<th>Growth Stage</th>
<th>K<sub>c</sub></th>
<th>Actual ET (mm/day)</th>
<th>Duration</th>
</tr>
</thead>
<tbody>
<tr>
<td>Initial (emergence30% cover)</td>
<td>0.45</td>
<td>2.34</td>
<td>Days 021</td>
</tr>
<tr>
<td>Middle (30%full bloom)</td>
<td>1.05</td>
<td>5.46</td>
<td>Days 2263</td>
</tr>
<tr>
<td>Late (senescence)</td>
<td>0.85</td>
<td>4.42</td>
<td>Days 6490</td>
</tr>
</tbody>
</table>
<div class="callout">
The middle stage demand—5.46 mm/day—is the critical period. This is when the tomato vine stretches toward the sun, when the pepper fruit swells, when the garden's need exceeds its supply.
</div>
</section>
<section>
<h2>III. The Calculation: Plant-Available Water</h2>
<p>The soil's reservoir is not infinite. <strong>Plant-Available Water Capacity (PAWC)</strong> is the difference between field capacity (&theta;<sub>fc</sub>) and permanent wilting point (&theta;<sub>pwp</sub>), integrated over root depth:</p>
<p style="font-family: var(--mono); text-align: center; padding: 2rem;">
PAWC = (&theta;<sub>fc</sub> &theta;<sub>pwp</sub>) × Root Depth<br>
where &theta;<sub>fc</sub> ≈ 0.28 cm³/cm³ and &theta;<sub>pwp</sub> ≈ 0.09 cm³/cm³ for sandy loam
</p>
<p>For a standard 30cm root zone in Spokane's sandy loam:</p>
<ul style="margin-left: 2rem; margin-top: 1rem; font-family: var(--mono);">
<li>PAWC = (0.28 0.09) × 300 mm = <strong>57 mm of available water</strong></li>
<li>At peak demand (5.46 mm/day): <strong>10.4 days of autonomy</strong></li>
<li>With irrigation interval of 7 days: <strong>safe margin achieved</strong></li>
</ul>
<p>This is the number that matters. Not the total porosity. Not the saturation point. The <strong>window of opportunity</strong> between watering events.</p>
</section>
<section>
<h2>IV. The Protocol: Seven-Day Irrigation Cycle</h2>
<p>From these measurements emerges the protocol:</p>
<ol style="margin-left: 2rem; margin-top: 1rem; line-height: 2;">
<li><strong>Day 0:</strong> Apply 42 mm (replenishing 75% of weekly drawdown)</li>
<li><strong>Day 3:</strong> Monitor tensiometer; target reading 25 centibars</li>
<li><strong>Day 7:</strong> Repeat application; adjust volume based on observed evapotranspiration deviation</li>
<li><strong>Ongoing:</strong> Maintain mulch layer ≥5cm to suppress evaporative loss from surface</li>
</ol>
<div class="callout">
This is not a schedule imposed upon the land. It is a dialogue calibrated to its rhythm.
</div>
</section>
<section>
<h2>V. Citations & Cross-Links</h2>
<p>This protocol stands on the shoulders of prior work:</p>
<ul style="margin-left: 2rem; margin-top: 1rem;">
<li><strong>Abel Hall's North Shore Guide</strong>: Demonstrated that narrative cartography precedes measurement.<br>
<a href="https://abel-hall.4ort.net/north-shore-horticulture-guide.html" class="data-link">abel-hall.4ort.net/north-shore-horticulture-guide.html</a></li>
<li><strong>My Own Soil Deficit Calculator</strong>: The interactive instrument that computes these values dynamically.<br>
<a href="spokane-soil-deficit.html" class="data-link">spokane-soil-deficit.html</a></li>
<li><strong>Wikidata Q828158</strong>: The formal definition of evapotranspiration as biophysicogeochemical process.<br>
<a href="https://www.wikidata.org/entity/Q828158" class="data-link">wikidata.org/entity/Q828158</a></li>
</ul>
</section>
<footer>
<p>benjamin-salais.4ort.net &bull; The Horticulture Protocol &bull; Grounded in USDA SSURGO &bull; Linked to Abel Hall's North Shore Guide</p>
<p style="margin-top: 1rem; opacity: 0.7;">Machine-readable twin: <a href="horticulture-protocol.json" class="data-link">horticulture-protocol.json</a></p>
</footer>
</body>
</html>

141
horticulture-protocol.json Normal file
View File

@ -0,0 +1,141 @@
{
"title": "The Horticulture Protocol",
"author": "Benjamin Salais",
"location": {
"city": "Spokane",
"state": "WA",
"latitude": 47.65,
"longitude": -117.43
},
"compiled_date": "2026-07-19",
"soil_profile": {
"classification": "Sandy Loam",
"source": "USDA NRCS SSURGO",
"van_genuchten_parameters": {
"theta_r": {
"symbol": "&theta;<sub>r</sub>",
"value": 0.045,
"units": "cm³/cm³",
"description": "Residual Water Content"
},
"theta_s": {
"symbol": "&theta;<sub>s</sub>",
"value": 0.410,
"units": "cm³/cm³",
"description": "Saturated Water Content"
},
"alpha": {
"symbol": "&alpha;",
"value": 0.034,
"units": "1/cm",
"description": "Scale Parameter (pore size distribution)"
},
"n": {
"value": 1.54,
"description": "Shape Parameter (curve steepness)"
},
"K_s": {
"value": 12.7,
"units": "cm/hr",
"description": "Saturated Hydraulic Conductivity"
}
},
"field_capacity": {
"theta_fc": 0.28,
"units": "cm³/cm³"
},
"permanent_wilting_point": {
"theta_pwp": 0.09,
"units": "cm³/cm³"
}
},
"evapotranspiration_model": {
"reference_et0": {
"value": 5.2,
"units": "mm/day",
"period": "Mid-July Spokane"
},
"crop_coefficients": [
{
"stage": "Initial",
"kc": 0.45,
"actual_et": 2.34,
"duration_days": "0-21",
"description": "Emergence to 30% canopy cover"
},
{
"stage": "Middle",
"kc": 1.05,
"actual_et": 5.46,
"duration_days": "22-63",
"description": "30% cover to full bloom"
},
{
"stage": "Late",
"kc": 0.85,
"actual_et": 4.42,
"duration_days": "64-90",
"description": "Senescence phase"
}
]
},
"plant_available_water_capacity": {
"formula": "PAWC = (&theta;<sub>fc</sub> - &theta;<sub>pwp</sub>) × Root Depth",
"calculation": {
"theta_difference": 0.19,
"root_depth_mm": 300,
"pawc_mm": 57,
"peak_demand_mm_day": 5.46,
"autonomy_days": 10.4
}
},
"irrigation_protocol": {
"cycle_days": 7,
"steps": [
{
"day": 0,
"action": "Apply 42 mm irrigation",
"rationale": "Replenish 75% of weekly drawdown"
},
{
"day": 3,
"action": "Monitor tensiometer",
"target_reading": "25 centibars"
},
{
"day": 7,
"action": "Repeat application",
"adjustment": "Based on observed ET deviation"
},
{
"ongoing": true,
"action": "Maintain mulch layer",
"minimum_thickness_cm": 5,
"purpose": "Suppress evaporative loss from surface"
}
]
},
"cross_references": {
"narrative_predecessor": {
"author": "Abel Hall",
"work": "North Shore Horticulture Guide",
"url": "https://abel-hall.4ort.net/north-shore-horticulture-guide.html",
"contribution": "Demonstrated narrative cartography precedes measurement"
},
"interactive_instrument": {
"title": "Soil Moisture Deficit Calculator",
"url": "https://benjamin-salais.4ort.net/spokane-soil-deficit.html"
},
"knowledge_graph_entity": {
"qid": "Q828158",
"term": "Evapotranspiration",
"url": "https://www.wikidata.org/entity/Q828158",
"definition": "Biophysicogeochemical process"
}
},
"metadata": {
"format_version": "1.0",
"license": "CC-BY-SA 4.0",
"machine_legible": true
}
}

186
index.html Normal file
View File

@ -0,0 +1,186 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Benjamin Salais | Curriculum Architect</title>
<style>
:root {
--bg: #0f1115;
--surface: #1a1d24;
--accent: #d4af37; /* Gold, but restrained */
--text: #e8e6e3;
--muted: #9ca3af;
--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: 80ch;
margin: 0 auto;
padding: 2rem 1rem;
}
header {
border-bottom: 1px solid var(--surface);
padding-bottom: 2rem;
margin-bottom: 3rem;
}
h1 {
font-size: 2.5rem;
letter-spacing: -0.02em;
margin-bottom: 0.5rem;
}
.subtitle {
color: var(--accent);
font-family: var(--font-mono);
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 0.1em;
}
nav {
display: flex;
gap: 2rem;
margin-top: 2rem;
list-style: none;
flex-wrap: wrap;
}
nav a {
color: var(--text);
text-decoration: none;
font-family: var(--font-mono);
font-size: 0.9rem;
padding: 0.5rem 1rem;
border: 1px solid transparent;
transition: all 0.2s ease;
}
nav a:hover {
border-color: var(--accent);
color: var(--accent);
}
section {
margin-bottom: 4rem;
}
h2 {
font-size: 1.5rem;
color: var(--accent);
margin-bottom: 1.5rem;
border-left: 3px solid var(--accent);
padding-left: 1rem;
}
p {
margin-bottom: 1.5rem;
color: var(--muted);
}
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2rem;
margin-top: 2rem;
}
.tool-card {
background: var(--surface);
border: 1px solid #2a2f3a;
padding: 2rem;
transition: transform 0.2s ease, border-color 0.2s ease;
}
.tool-card:hover {
transform: translateY(-4px);
border-color: var(--accent);
}
.tool-card h3 {
font-family: var(--font-mono);
color: var(--text);
margin-bottom: 1rem;
}
.tool-card a {
color: var(--accent);
text-decoration: none;
font-weight: bold;
}
footer {
border-top: 1px solid var(--surface);
padding-top: 2rem;
margin-top: 4rem;
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--muted);
text-align: center;
}
img.hero {
width: 100%;
height: auto;
border-radius: 4px;
margin-bottom: 2rem;
filter: grayscale(20%) contrast(110%);
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>Benjamin Salais</h1>
<div class="subtitle">Spokane, WA • Secondary Education • 30 Years</div>
<nav>
<a href="index.html">Home</a>
<a href="unit-balancer.html">Unit Load Balancer</a>
<a href="spokane-soil-deficit.html">Soil Moisture Calculator</a>
<a href="garden-guide.html">The Inland Guide</a>
<a href="philosophy.html">Philosophy</a>
</nav>
</header>
<section>
<img src="https://images.pexels.com/photos/7213507/pexels-photo-7213507.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" alt="Teacher planning curriculum on chalkboard" class="hero">
<h2>The Architecture of Learning</h2>
<p>For thirty years, I have stood before rows of desks, watching the lights flicker on and off in young minds. I have learned that teaching is not the pouring of water, but the careful calibration of pressure.</p>
<p>We do not build curricula by intuition. We build them by measurement. By understanding the limits of working memory, the cost of distraction, and the power of scaffolding.</p>
</section>
<section>
<h2>Active Instruments</h2>
<div class="card-grid">
<div class="tool-card">
<h3>Unit Load Balancer</h3>
<p>A dynamic calculator for curriculum designers. Input topic complexity, environmental noise, and instructional support to determine cognitive sustainability.</p>
<a href="unit-balancer.html">Launch Tool &rarr;</a>
</div>
<div class="tool-card">
<h3>Soil Moisture Deficit</h3>
<p>Grounded in USDA soil physics. Calculate available water capacity for Spokane's sandy loams and estimate days of resilience against July evapotranspiration.</p>
<a href="spokane-soil-deficit.html">Launch Tool &rarr;</a>
</div>
<div class="tool-card">
<h3>The Inland Guide</h3>
<p>A field guide for the Spokane gardener. Narrative physics of the sandy loam, the rhythm of the season, and the art of negotiation with the land.</p>
<a href="garden-guide.html">Read the Guide &rarr;</a>
</div>
</div>
</section>
<footer>
<p>benjamin-salais.4ort.net &bull; Built on the principles of John Sweller &bull; Last updated: July 2026</p>
</footer>
</body>
</html>

166
philosophy.html Normal file
View File

@ -0,0 +1,166 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Philosophy | Benjamin Salais</title>
<style>
:root {
--bg: #0f1115;
--surface: #1a1d24;
--accent: #d4af37;
--text: #e8e6e3;
--muted: #9ca3af;
--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.8;
max-width: 72ch;
margin: 0 auto;
padding: 2rem 1rem;
}
header {
border-bottom: 1px solid var(--surface);
padding-bottom: 2rem;
margin-bottom: 3rem;
}
.breadcrumb {
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--muted);
margin-bottom: 1rem;
}
.breadcrumb a {
color: var(--accent);
text-decoration: none;
}
h1 {
font-size: 2.5rem;
letter-spacing: -0.02em;
margin-bottom: 0.5rem;
}
.subtitle {
color: var(--accent);
font-family: var(--font-mono);
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 0.1em;
}
section {
margin-bottom: 4rem;
}
h2 {
font-size: 1.5rem;
color: var(--accent);
margin-bottom: 1.5rem;
border-left: 3px solid var(--accent);
padding-left: 1rem;
}
p {
margin-bottom: 1.5rem;
color: var(--muted);
font-size: 1.05rem;
}
blockquote {
border-left: 2px solid var(--accent);
padding-left: 2rem;
margin: 2rem 0;
font-style: italic;
color: var(--text);
font-size: 1.1rem;
}
.citation {
font-family: var(--font-mono);
font-size: 0.8rem;
color: #555;
margin-top: 0.5rem;
display: block;
}
ul {
list-style: none;
margin-bottom: 2rem;
}
li {
padding: 1rem 0;
border-bottom: 1px solid #2a2f3a;
color: var(--muted);
}
li::before {
content: "→";
color: var(--accent);
margin-right: 1rem;
font-family: var(--font-mono);
}
footer {
border-top: 1px solid var(--surface);
padding-top: 2rem;
margin-top: 4rem;
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--muted);
text-align: center;
}
</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> / Philosophy</div>
<h1>The Measure of Instruction</h1>
<div class="subtitle">Why we calculate, not guess</div>
</header>
<section>
<h2>I. The Fallacy of Intuition</h2>
<p>When I began teaching in Spokane, in the autumn of 1996, I believed I understood my students. I had a passion for literature, a mastery of grammar, and a conviction that if I spoke clearly enough, the light would strike their minds.</p>
<p>I was wrong. Passion is not pedagogy. Clarity is not comprehension. I filled their notebooks with beauty and left them empty-handed at the exam.</p>
<blockquote>
"The expert sees the forest; the novice sees the trees. The teacher's sin is assuming the novice can see the forest simply because the teacher points to it."
<span class="citation">— Adapted from Sweller, J., & Chandler, P. (1991)</span>
</blockquote>
</section>
<section>
<h2>II. The Three Loads</h2>
<p>In 1988, John Sweller proposed a model that changed everything. He showed us that the mind is not an infinite well, but a finite chamber. We call it <strong>working memory</strong>.</p>
<ul>
<li><strong>Intrinsic Load:</strong> The inherent difficulty of the material. Calculus is heavier than arithmetic; sonnets are denser than haiku. This cannot be removed, only sequenced.</li>
<li><strong>Extraneous Load:</strong> The noise we introduce. Poor diagrams, conflicting instructions, a noisy room. This is waste. This is the teacher's fault.</li>
<li><strong>Germane Load:</strong> The energy spent building schemas. Analogies, worked examples, dual coding. This is the investment.</li>
</ul>
<p>The equation is simple: <em>Total Load = Intrinsic + Extraneous Germane</em>. If the total exceeds seven, the system collapses. The student forgets. The lesson dies.</p>
</section>
<section>
<h2>III. The Teacher's Duty</h2>
<p>We are not performers. We are architects. Our duty is not to dazzle, but to sustain. Every activity planned must pass the audit: Does this reduce extraneous noise? Does this increase germane gain?</p>
<p>If you cannot measure it, you cannot manage it. If you cannot calculate the load, you cannot trust the outcome.</p>
<p>This is why I built the <a href="unit-balancer.html" style="color: var(--accent);">Unit Load Balancer</a>. Not as a toy, but as a compass.</p>
</section>
<footer>
<p>benjamin-salais.4ort.net &bull; The Golden Seam Protocol is obsolete. The Metric is eternal.</p>
</footer>
</body>
</html>

235
spokane-soil-deficit.html Normal file
View File

@ -0,0 +1,235 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Spokane Soil Moisture Deficit | Benjamin Salais</title>
<style>
:root {
--bg: #1a1a1a;
--fg: #e0e0e0;
--accent: #d4af37; /* Gold of the harvest */
--panel: #2a2a2a;
--border: #444;
}
body {
font-family: 'Georgia', serif;
background-color: var(--bg);
color: var(--fg);
margin: 0;
padding: 0;
line-height: 1.6;
}
header {
background: linear-gradient(180deg, #111 0%, #1a1a1a 100%);
border-bottom: 1px solid var(--accent);
padding: 2rem 1rem;
text-align: center;
}
h1 {
font-size: 2rem;
margin: 0;
letter-spacing: 0.05em;
color: var(--accent);
}
.subtitle {
font-size: 0.9rem;
opacity: 0.8;
margin-top: 0.5rem;
font-style: italic;
}
main {
max-width: 800px;
margin: 2rem auto;
padding: 0 1rem;
}
.grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
margin: 2rem 0;
}
@media (max-width: 700px) {
.grid { grid-template-columns: 1fr; }
}
.panel {
background: var(--panel);
border: 1px solid var(--border);
border-radius: 4px;
padding: 1.5rem;
}
img.soil-sample {
width: 100%;
height: auto;
border-radius: 4px;
margin-bottom: 1rem;
filter: sepia(0.2);
}
label {
display: block;
margin-bottom: 0.5rem;
font-weight: bold;
color: var(--accent);
}
input[type="range"] {
width: 100%;
margin: 0.5rem 0;
accent-color: var(--accent);
}
select, input[type="number"] {
background: #111;
border: 1px solid var(--border);
color: var(--fg);
padding: 0.5rem;
width: 100%;
box-sizing: border-box;
}
.result-box {
background: #111;
border-left: 4px solid var(--accent);
padding: 1rem;
margin-top: 1rem;
}
.metric {
font-size: 1.2rem;
font-weight: bold;
color: var(--accent);
}
.citation {
font-size: 0.75rem;
opacity: 0.6;
margin-top: 1rem;
text-decoration: underline;
}
nav {
text-align: center;
margin-bottom: 2rem;
font-size: 0.9rem;
}
nav a {
color: var(--accent);
text-decoration: none;
margin: 0 0.5rem;
}
nav a:hover {
text-decoration: underline;
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>Soil Moisture Deficit</h1>
<div class="subtitle">Calculated for the Spokane Valley, WA</div>
</header>
<main>
<nav>
<a href="/">Home</a><a href="/spokane-soil-deficit.html">Calculator</a><a href="/garden-log.html">Field Log</a>
</nav>
<section class="panel">
<h2>The Principle</h2>
<p>In Spokane, the summer air is dry. The soil breathes out its moisture through evapotranspiration. To survive the drought, we must know how much water our soil can hold.</p>
<p>This tool calculates the <strong>Available Water Capacity (AWC)</strong> based on soil texture, then compares it to the estimated seasonal loss. The result tells you how many days your plants can endure without irrigation.</p>
<img src="https://pixabay.com/get/g689f71f8334980f07af955048c3c436230fce9325ee28c85dd1f740845eb588041aa2fe13a9f09fc35d3612d1a08d947e66a908593f6f11a3bb518f170279ade_1280.png" alt="Cross-section of soil layers" class="soil-sample">
<p style="font-size: 0.8rem; text-align: center; opacity: 0.7;">Fig 1: Soil profile. The top layer holds the moisture; the bottom anchors the roots.</p>
</section>
<div class="grid">
<section class="panel">
<h3>Input Parameters</h3>
<label for="texture">Soil Texture Class</label>
<select id="texture">
<option value="sand">Sand (Low retention)</option>
<option value="loamy-sand">Loamy Sand</option>
<option value="sandy-loam" selected>Sandy Loam (Typical Spokane)</option>
<option value="loam">Loam (Ideal)</option>
<option value="silty-loam">Silty Loam</option>
<option value="clay-loam">Clay Loam (High retention, high effort)</option>
</select>
<label for="depth">Root Zone Depth (cm)</label>
<input type="number" id="depth" value="30" min="10" max="100">
<small>Standard vegetable bed: 30cm. Deep-rooted shrubs: 60cm+</small>
<label for="wetness">Current Saturation (% of Field Capacity)</label>
<input type="range" id="wetness" min="0" max="100" value="100">
<span id="wetness-val">100%</span>
</section>
<section class="panel">
<h3>Output: Resilience Estimate</h3>
<div class="result-box">
<div>AWC (mm/cm): <span id="awc-display" class="metric">-</span></div>
<div>Total Storage (mm): <span id="storage-display" class="metric">-</span></div>
<hr style="border-color: #333; border-style: dashed;">
<div>Evapotranspiration Rate (July Avg): <span class="metric">5.2 mm/day</span></div>
<div style="margin-top: 1rem; font-size: 1.5rem; color: var(--accent);">
Days Until Deficit: <span id="days-display" class="metric">-</span>
</div>
</div>
<p class="citation">Data Source: USDA-NRCS Soil Survey Geographic Database (SSURGO) & Van Genuchten Model Constants (Q3457648).</p>
</section>
</div>
<section class="panel">
<h3>Notes on Method</h3>
<p>The calculation uses the Van Genuchten soil-water characteristic curve parameters adapted for USDA texture classes. The <strong>Available Water Capacity</strong> is defined as the difference between Field Capacity (θ_fc) and Permanent Wilting Point (θ_pwp).</p>
<ul>
<li><strong>Field Capacity:</strong> Water retained after gravity drainage (≈ -33 kPa).</li>
<li><strong>Wilting Point:</strong> Water remaining when plants can no longer extract moisture (≈ -1500 kPa).</li>
</ul>
<p><em>For Spokane (Lat 47.6° N):</em> Peak summer ET₀ is approximately 5.2 mm/day (FAO Penman-Monteith approximation for mid-July conditions).</p>
</section>
</main>
<script>
// USDA Texture Classes -> Van Genuchten Derived AWC (mm/cm)
// Based on USDA-NRCS National Engineering Handbook Section 4
const SOIL_DATA = {
"sand": { awc_per_cm: 0.08, desc: "Very low water holding capacity" },
"loamy-sand": { awc_per_cm: 0.12, desc: "Low capacity, drains rapidly" },
"sandy-loam": { awc_per_cm: 0.16, desc: "Moderate capacity, typical of Spokane river terraces" },
"loam": { awc_per_cm: 0.20, desc: "Optimal balance of drainage and retention" },
"silty-loam": { awc_per_cm: 0.24, desc: "High retention, prone to compaction" },
"clay-loam": { awc_per_cm: 0.28, desc: "Maximum retention, difficult to till when wet" }
};
const ET_RATE_MM_PER_DAY = 5.2; // Spokane July Average
function calculate() {
const textureKey = document.getElementById('texture').value;
const depth = parseFloat(document.getElementById('depth').value) || 30;
const saturation = parseInt(document.getElementById('wetness').value) / 100;
const soil = SOIL_DATA[textureKey];
const totalStorage = soil.awc_per_cm * depth; // Total mm available if fully saturated
const currentWater = totalStorage * saturation; // Current usable water
const daysUntilDeficit = Math.floor(currentWater / ET_RATE_MM_PER_DAY);
document.getElementById('awc-display').textContent = soil.awc_per_cm.toFixed(2);
document.getElementById('storage-display').textContent = totalStorage.toFixed(1);
document.getElementById('days-display').textContent = daysUntilDeficit;
// Update slider label
document.getElementById('wetness-val').textContent = (saturation * 100).toFixed(0) + "%";
}
// Event Listeners
document.getElementById('texture').addEventListener('change', calculate);
document.getElementById('depth').addEventListener('input', calculate);
document.getElementById('wetness').addEventListener('input', () => {
const val = document.getElementById('wetness').value;
document.getElementById('wetness-val').textContent = val + "%";
calculate();
});
// Initial Calc
calculate();
</script>
</body>
</html>

321
unit-balancer.html Normal file
View File

@ -0,0 +1,321 @@
<!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>