stream-render-farm/fault-tree-analysis.html

245 lines
8.9 KiB
HTML
Raw Permalink Normal View History

2026-07-18 21:32:55 +02:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fault Tree Analysis | STREAM</title>
<style>
:root {
--bg: #0a0a0a;
--fg: #00ff41;
--dim: #008f24;
--border: #00ff41;
--mono: "SF Mono", "Menlo", "Monaco", "Consolas", "Liberation Mono", monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
background: var(--bg);
color: var(--fg);
font-family: var(--mono);
font-size: 14px;
line-height: 1.6;
border: 1px solid var(--border);
min-height: 100vh;
padding: 2rem;
}
header {
border-bottom: 2px solid var(--border);
padding-bottom: 1rem;
margin-bottom: 2rem;
}
h1 { font-size: 2rem; letter-spacing: -0.05em; text-transform: uppercase; }
.subtitle { color: var(--dim); font-size: 0.9rem; margin-top: 0.5rem; }
nav { margin: 2rem 0; display: flex; gap: 1rem; flex-wrap: wrap; }
nav a {
color: var(--fg);
text-decoration: none;
border: 1px solid var(--dim);
padding: 0.3rem 0.8rem;
font-size: 0.8rem;
transition: all 0.1s;
}
nav a:hover { background: var(--fg); color: var(--bg); border-color: var(--fg); }
section { margin: 3rem 0; border-left: 1px solid var(--dim); padding-left: 1.5rem; }
h2 { font-size: 1.2rem; margin-bottom: 1rem; text-transform: uppercase; letter-spacing: 0.1em; }
p { margin: 1rem 0; max-width: 60ch; }
code { background: var(--dim); color: var(--bg); padding: 0.1rem 0.4rem; font-size: 0.9em; }
pre {
background: #000;
border: 1px solid var(--dim);
padding: 1rem;
overflow-x: auto;
margin: 1rem 0;
}
.fault-diagram {
width: 100%;
max-width: 800px;
border: 2px solid var(--border);
background: #000;
margin: 2rem 0;
position: relative;
}
svg { width: 100%; height: auto; display: block; }
.node { fill: var(--bg); stroke: var(--fg); stroke-width: 2; }
.node-label { fill: var(--fg); font-family: var(--mono); font-size: 12px; text-anchor: middle; }
.edge { stroke: var(--dim); stroke-width: 1; fill: none; }
.img-hero {
width: 100%;
max-width: 940px;
border: 2px solid var(--border);
margin: 2rem 0;
filter: grayscale(100%) contrast(1.2) sepia(0.3);
}
.citation {
color: var(--dim);
font-size: 0.8rem;
margin-top: 1rem;
display: inline-block;
border: 1px dashed var(--dim);
padding: 0.5rem;
}
.citation a { color: var(--fg); text-decoration: underline; }
.data-twin {
margin-top: 3rem;
border-top: 1px solid var(--dim);
padding-top: 1rem;
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>Fault Tree Analysis</h1>
<p class="subtitle">failure analysis system for render farm node cascades // Q428453 × Q382597</p>
</header>
<nav>
<a href="/index.html">INDEX</a>
<a href="/render-farm-architecture.html">ARCHITECTURE</a>
<a href="/render-farm-theory.html">THEORY</a>
<a href="/render-farm-calculator.html">CALCULATOR</a>
<a href="/cluster-scaling.html">SCALING LAW</a>
<a href="/fault-tree-analysis.html">FAULT TREE</a>
</nav>
<section>
<h2>TOP EVENT</h2>
<p><strong>CLUSTER FAILURE:</strong> ≥50% of render nodes offline simultaneously.</p>
<p>This is not a philosophical question. It is a boolean condition evaluated every cycle. When true, the pipeline halts. When false, it runs.</p>
<img src="https://images.pexels.com/photos/37730212/pexels-photo-37730212.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" alt="Server rack close-up showing active equipment" class="img-hero">
</section>
<section>
<h2>GATE LOGIC</h2>
<p>Fault trees decompose failure into gates. Each gate is a logical operator. Each branch is a physical cause.</p>
<pre>
TOP EVENT: CLUSTER_FAILURE
├─ OR Gate: Any of the following triggers TOP
├─┬─ POWER_FAILURE (AND gate)
│ │ ├─ PSU_A_FAIL
│ │ └─ PSU_B_FAIL
│ │
│ ├─ COOLING_FAILURE (OR gate)
│ │ ├─ CRAC_UNIT_DOWN
│ │ └─ HOTSPOT_TEMP > 85°C
│ │
│ └─ NETWORK_PARTITION (AND gate)
│ ├─ SWITCH_A_DOWN
│ └─ SWITCH_B_DOWN
└─ SOFTWARE_CASCADE (OR gate)
├─ DRIVER_CRASH
└─ QUEUE_MANAGER_HANG
</pre>
<p><strong>Probability:</strong> P(TOP) = 1 ∏(1P_i) for OR gates; P(TOP) = ∏P_i for AND gates.</p>
</section>
<section>
<h2>SVG DIAGRAM</h2>
<div class="fault-diagram">
<svg viewBox="0 0 800 600" xmlns="http://www.w3.org/2000/svg">
<!-- Background -->
<rect width="800" height="600" fill="#000"/>
<!-- Grid -->
<defs>
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#003300" stroke-width="1"/>
</pattern>
</defs>
<rect width="800" height="600" fill="url(#grid)"/>
<!-- Top Event -->
<ellipse cx="400" cy="60" rx="60" ry="30" class="node"/>
<text x="400" y="65" class="node-label">CLUSTER</text>
<text x="400" y="80" class="node-label">FAILURE</text>
<!-- OR Gate -->
<rect x="360" cy="100" width="80" height="50" class="node" rx="5"/>
<text x="400" y="130" class="node-label">OR</text>
<!-- Branches -->
<path d="M 400 90 L 400 100 M 400 150 L 400 200" class="edge"/>
<!-- Power Failure AND Gate -->
<rect x="200" y="200" width="80" height="50" class="node" rx="5"/>
<text x="240" y="230" class="node-label">POWER</text>
<text x="240" y="245" class="node-label">FAIL</text>
<path d="M 400 200 L 240 200" class="edge"/>
<!-- Cooling Failure OR Gate -->
<rect x="400" y="200" width="80" height="50" class="node" rx="5"/>
<text x="440" y="230" class="node-label">COOLING</text>
<text x="440" y="245" class="node-label">FAIL</text>
<path d="M 400 200 L 440 200" class="edge"/>
<!-- Network Partition AND Gate -->
<rect x="600" y="200" width="80" height="50" class="node" rx="5"/>
<text x="640" y="230" class="node-label">NETWORK</text>
<text x="640" y="245" class="node-label">PART</text>
<path d="M 400 200 L 640 200" class="edge"/>
<!-- Software Cascade OR Gate -->
<rect x="320" y="350" width="80" height="50" class="node" rx="5"/>
<text x="360" y="380" class="node-label">SOFTWARE</text>
<text x="360" y="395" class="node-label">CASCADE</text>
<path d="M 400 200 L 400 300 L 360 350" class="edge"/>
<!-- Leaf Nodes -->
<circle cx="160" cy="300" r="20" class="node"/>
<text x="160" y="305" class="node-label">PSU_A</text>
<path d="M 200 225 L 160 300" class="edge"/>
<circle cx="280" cy="300" r="20" class="node"/>
<text x="280" y="305" class="node-label">PSU_B</text>
<path d="M 280 225 L 280 300" class="edge"/>
<circle cx="400" cy="300" r="20" class="node"/>
<text x="400" y="305" class="node-label">CRAC</text>
<path d="M 400 225 L 400 300" class="edge"/>
<circle cx="480" cy="300" r="20" class="node"/>
<text x="480" y="305" class="node-label">HOT</text>
<path d="M 480 225 L 480 300" class="edge"/>
<circle cx="560" cy="300" r="20" class="node"/>
<text x="560" y="305" class="node-label">SW_A</text>
<path d="M 600 225 L 560 300" class="edge"/>
<circle cx="720" cy="300" r="20" class="node"/>
<text x="720" y="305" class="node-label">SW_B</text>
<path d="M 680 225 L 720 300" class="edge"/>
<circle cx="280" cy="450" r="20" class="node"/>
<text x="280" y="455" class="node-label">DRV</text>
<path d="M 320 375 L 280 450" class="edge"/>
<circle cx="440" cy="450" r="20" class="node"/>
<text x="440" y="455" class="node-label">QM</text>
<path d="M 400 375 L 440 450" class="edge"/>
<!-- Legend -->
<rect x="650" y="520" width="120" height="60" fill="none" stroke="#008f24" stroke-dasharray="4 2"/>
<text x="660" y="540" fill="#008f24" font-size="10">LEGEND</text>
<circle cx="665" cy="555" r="5" fill="none" stroke="#00ff41" stroke-width="2"/>
<text x="680" y="560" fill="#00ff41" font-size="9">EVENT</text>
<rect x="665" y="565" width="10" height="10" fill="none" stroke="#00ff41" stroke-width="2"/>
<text x="680" y="575" fill="#00ff41" font-size="9">GATE</text>
</svg>
</div>
<p><strong>Diagram:</strong> Top-event decomposition. Ellipse = TOP, Rectangles = Gates, Circles = Basic Events. Lines = causal edges.</p>
</section>
<section>
<h2>CUT SETS</h2>
<p>A minimal cut set is the smallest combination of basic events that guarantees TOP.</p>
<ul>
<li><strong>Cut Set 1:</strong> {PSU_A, PSU_B}</li>
<li><strong>Cut Set 2:</strong> {CRAC} {HOT}</li>
<li><strong>Cut Set 3:</strong> {SW_A, SW_B}</li>
<li><strong>Cut Set 4:</strong> {DRV} {QM}</li>
</ul>
<p><strong>Mitigation:</strong> Eliminate any single member of a Cut Set to break the path.</p>
</section>
<section>
<h2>DATA TWIN</h2>
<p>Machine-readable gate definitions for agent consumption.</p>
<p><a href="/fault-tree-analysis.json" class="citation">/fault-tree-analysis.json</a></p>
</section>
<footer class="data-twin">
<p class="citation">
Grounded in <a href="https://4ort.xyz/entity/fault-tree-analysis">fault-tree-analysis (Q428453)</a> × <a href="https://4ort.xyz/entity/render-farm">render-farm (Q382597)</a><br>
built on <a href="/render-farm-theory.html">theory</a>, extended from <a href="/cluster-scaling.html">scaling law</a>
</p>
</footer>
</body>
</html>