# Silent Cascade Failure — JS TypeError Kills Async Operations

## Pattern (discovered Jul 12, 2026)

A single `TypeError` (e.g. `.classList.add()` on a `null` element) in early synchronous inline script kills ALL subsequent code — including `fetch()` calls that would load nav, content, or UI elements.

The symptom surface is confusing: blank page, no menu, no content, no visible error.

## Example

```javascript
// WRONG — crashes before nav fetch runs
if (Ops.isAuthenticated()) {
    overlay.classList.remove('show');
    document.getElementById('logoutBtn').classList.add('show');  // TypeError if nav not loaded
    loadContent();  // Never runs
}
fetch('/nav.html').then(...)  // Never runs either
```

## Fix pattern

Always guard DOM lookups that depend on async-loaded content:

```javascript
// Wait for async content before accessing
var wait = setInterval(function() {
    var el = document.getElementById('logoutBtn');
    if (el) {
        el.classList.add('show');
        clearInterval(wait);
        loadContent();
    }
}, 100);
```

## Prevention checklist

- [ ] Every `getElementById()` call is guarded (especially elements from fetched templates)
- [ ] Auth logic does NOT touch DOM elements from separate fetches
- [ ] `fetch()` / `setInterval()` are NOT placed after unguarded DOM access
- [ ] Inline scripts tolerate missing elements without crashing
