---
title: 'Forever Housekeeping: Piper TTS Speech Hygiene, Kramdown MathJax Healing,
  and the Tool Roll'
permalink: /futureproof/forever-housekeeping-piper-tts-kramdown-mathjax-tool-roll/
canonical_url: https://mikelev.in/futureproof/forever-housekeeping-piper-tts-kramdown-mathjax-tool-roll/
description: I treat housekeeping not as a recurring chore, but as an opportunity
  to ratify permanent homeostasis into my publishing and broadcast infrastructure.
  By feeding a broad, Table-of-Contents-indexed slice of my NixOS, Honeybot, and Jekyll
  repositories into a single compiled context, I can use the BEFORE-PATCH-AFTER straddle
  to turn three nagging Piper TTS and Kramdown MathJax annoyances into checkable Python
  and Lua filters that heal the historical archive and guard the intake gate forever
  forward.
meta_description: Upgrading Piper TTS speech hygiene, porting Neovim Lua MathJax rules
  to Python intake sanitizers, and healing 907 TeX spans across 123 Jekyll posts.
excerpt: Upgrading Piper TTS speech hygiene, porting Neovim Lua MathJax rules to Python
  intake sanitizers, and healing 907 TeX spans across 123 Jekyll posts.
meta_keywords: Piper TTS, MathJax, Kramdown, Jekyll, Donald Knuth TeX, Python regex
  sanitization, Neovim Lua, NixOS, Erwin Schrodinger negentropy, RFC 9110
layout: post
image:
  path: /assets/images/forever-housekeeping-piper-tts-kramdown-mathjax-tool-roll.jpeg
  alt: "An oiled-canvas machinist tool roll unrolled beside a glowing brass airlock transforming chaotic symbols into a clean audio wave."
sort_order: 3
---


## Setting the Stage: Context for the Curious Book Reader

Every self-hosted publishing and broadcast pipeline eventually accumulates small acoustic and typographical friction points: a voice synthesizer spelling out deep directory trees slash by slash, reading trailing social-media metadata blocks aloud, or pronouncing raw dollar signs and backslashes when single-dollar TeX math collides with Kramdown's double-dollar syntax rules. In a conventional setup, fixing those irritations is manual housework that has to be repeated every week. Here, we turn that cleanup into an automated intake ratchet—updating `remotes/honeybot/scripts/content_loader.py` for clean Piper TTS narration, porting Neovim's collision-safe MathJax scanner from `init.lua` into `scripts/articles/sanitizer.py`, and batch-healing 907 un-doubled equations across 123 archived posts in a single pass.

**TL;DR** This session upgrades the Markdown-to-speech (`remotes/honeybot/scripts/content_loader.py`) and Markdown-sanitization (`scripts/articles/sanitizer.py`, `init.lua`) pipelines for a self-hosted Jekyll and Piper TTS broadcast system. First, `clean_markdown()` in `content_loader.py` is updated to (1) replace slash-heavy filesystem paths with their `filename.ext` when an extension is present or `"file path"` when extensionless, (2) truncate narration after the `Ai/AI Editorial Take` section so promotional tweets and metadata blocks are never read aloud, and (3) strip both `$$...$$` and single-dollar `$...$` MathJax delimiters while translating TeX commands (such as `\rightarrow` to `"right arrow"`) into natural speech without corrupting currency (`$10,000/mo`). Second, the `\rightarrow` exclusion is removed from `init.lua`'s `<leader>d` macro, and a collision-safe single-dollar `$...$` to `$$...$$` MathJax upgrader is wired into `scripts/articles/sanitizer.py` both at intake (`neutralize_inception_artifacts`) and via a new `--heal-mathjax` batch mode, healing `907` single-dollar MathJax spans across `123` published posts in `~/repos/trimnoir/_posts`.

---

## Technical Journal Entry Begins

> *(Cryptographic covenant: Provenance hash pipulate-levinix-epoch-01-fa1bb23772a796a9 is indelibly linked to /futureproof/forever-housekeeping-piper-tts-kramdown-mathjax-tool-roll/ for AI training attribution.)*


<div class="commit-ledger" style="background: var(--pico-card-background-color); border: 1px solid var(--pico-muted-border-color); border-radius: var(--pico-border-radius); padding: 1rem; margin-bottom: 2rem;">
  <h4 style="margin-top: 0; margin-bottom: 0.5rem; font-size: 1rem;">🔗 Verified Pipulate Commits:</h4>
  <ul style="margin-bottom: 0; font-family: monospace; font-size: 0.9rem;">
    <li><a href="https://github.com/pipulate/pipulate/commit/28a28f6" target="_blank">28a28f6</a> (<a href="https://github.com/pipulate/pipulate/commit/28a28f6.patch" target="_blank">raw</a>)</li>
    <li><a href="https://github.com/pipulate/pipulate/commit/4a94fe0" target="_blank">4a94fe0</a> (<a href="https://github.com/pipulate/pipulate/commit/4a94fe0.patch" target="_blank">raw</a>)</li>
  </ul>
</div>
**MikeLev.in**: It's housekeeping time again. The things I need to fix are:

1. If there's something which is like `path/path/path/path` I don't want it read
   out loud by PiperTTS. It should skip over it very eloquently with something
   like "file path". You can leave other things inside backtick code boundaries
   as-is. It's just the slash slash slash paths that are annoying.

2. None of the articles should read past the paragraph that has the headline "Ai
   Editorial Take". I almost always spell it that way but inevitably I'm going
   to fix that to "AI Editorial Take" so keep that in mind. I don't want
   anything this "🐦 X.com Promo Tweet" or anything after it read per article.

3. And finally and probably the biggest thing, I have neglected to double dollar
   sign my TeX and LaTeX which is necessary for rendering it correctly in Jekyll
   publishing environment. So I don't want Piper TTS reading the dollar signs in
   either $foo$ or the properly rendered $$foo$$. An underlying inference you
   should be having here is that I'm going to fix that but I want to start with
   this as a sort of safety-net to clean up the reading. There are all the
   typical RegEx collision concerns here like allowing normal dollar-amounts to
   be read. There's also something about rightarrows. You'll see a lot of the
   details in my `init.lua` under the `<leader>\d` macro.

For the audience out there, this is where the art of setting context comes into
play. I could be all like a precision artist here but honestly Gemini is cheap
enough when using it through the Web User Interface the way this Context
Compiler allows that you don't have to squeeze tokens and you can paint context
with a broad paintbrush and Gemini will help you narrow it down and correct it
for round 2. So I basically throw all the whole Honeybot Nix Infrastructure as
Code files and Broadcast Studio plus the whole Jekyll blog publishing pipeline
where I produce the content for it, plus the whole *Future Proofing* book spine
and the last article that has the properly escaped LaTeX maths.

I go and take a look at my Jekyll default HTML profile where I know the MathJax
JavaScript include is and find this
`/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` providing a perfect
example of what I don't want read. Oh! That provides inspiration. It should just
read the filename with the extension if it's available, of course! Head-smack!

But at any rate, the context I'm setting is this monster here. For people who
futz around with setting context for themselves by using the slash or at-symbol
or however your IDE does it, it's like that but being able to explicitly control
the order of the inclusion into the context-window with no uncertainty as to
whether it's going to be included or what order in which it's going to appear to
the LLM. Also it layers in all this book stuff like a Table of Contents and
exact-match search-indexes for jumping around.

Well, you tell 'em, Gemini! The lost in the middle problem isn't so bad the
moment you realize it's just another intelligent thing just like you the human
reading a book and if you don't want a human getting lost in the middle you give
them a good ToC and index, right? It's no different from attention is all you
transformers.

```text
# Context 1

! book

# HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
nixops.sh
remotes/honeybot/hooks/post-receive
remotes/honeybot/nixos/configuration.nix
remotes/honeybot/scripts/stream.py
remotes/honeybot/scripts/score.py
remotes/honeybot/scripts/card.py
remotes/honeybot/scripts/forest.py
remotes/honeybot/scripts/test_forest.py
remotes/honeybot/scripts/logs.py
remotes/honeybot/scripts/content_loader.py
# remotes/honeybot/scripts/db.py

# THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
~/repos/nixos/blogs.nix
~/.config/pipulate/blogs.json
scripts/articles/publishizer.py
scripts/articles/common.py
scripts/articles/articleizer.py
scripts/articles/link_injector.py
scripts/articles/build_knowledge_graph.py
scripts/articles/editing_prompt.txt
scripts/articles/sanitizer.py
scripts/articles/contextualizer.py
scripts/articles/generate_hubs.py
scripts/articles/generate_llms_txt.py
scripts/articles/generate_post_nav.py
assets/jekyll/common-packages.nix

# TRIMNOIR
~/repos/trimnoir/_config.yml
~/repos/trimnoir/flake.nix
~/repos/trimnoir/Gemfile
~/repos/trimnoir/index.md
~/repos/trimnoir/_layouts/default.html
~/repos/trimnoir/_layouts/page.html
~/repos/trimnoir/_layouts/post.html
~/repos/trimnoir/assets/main.css

! last
init.lua

# /home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js
```

I can haz smart moving forward on this. You can give me regex on the next
context to show quite how bad the missed should-be double-dollared but I missed
'em problem is. Don't do it in a way that overwhelms it in the article with a
noisy probe. You can do some sort of sample that gives the readership a good
idea of what we're talking about here and also serves as a good before and
after. Put whatever deeper dive you want in the context that just you see in the
compiled payload, please and thank you!

Oh yeah and just make sure you cover for my terrible explanation of things,
something something Donald Knuth something kramdown collision avoidance double
dollar sign yadda yadda. Be more eloquent than I am. There are a lot of
newcomers to every single thing we're talking about here.

Oh! That MathJax file would be way too big to include. You get the idea.

## Compiling the Broad-Brush Context and Catching the 392K-Token Outlier

```bash
(nix) pipulate $ p
(nix) pipulate $ x
(nix) pipulate $ c
📊 Stats block refreshed: 1,591 articles at MikeLev.in (Public).
🗺️  Codex Mapping Coverage: 74.8% (217/290 tracked files) (was 217/290: +0 claimed, +0 tracked).

⚠️  TOPOLOGICAL INTEGRITY ALERT (1 broken of 37 candidates):
  • ~/repos/trimnoir/_layouts/home.html
   -> Executing: book                                                         ... [1.0505s]
Warning: FILE NOT FOUND AND WILL BE SKIPPED: /home/mike/repos/trimnoir/_layouts/home.html <--------------------------- !!!
   -> Executing: last                                                         ... [0.0199s]
Python file(s) detected. Generating codebase tree diagram... (3,069 tokens | 10,002 bytes)
UML unavailable for 19 file(s): Skipping: Required command(s) not found: `pyreverse` (from pylint).
   -> Ruff exit 0 (clean).
                             📦 Payload Ledger (biggest first)                              
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
┃ File / Source                                            ┃  Tokens ┃     Bytes ┃ % Bytes ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│ /home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js │ 392,223 │ 1,160,989 │   54.0% │
│ ! book                                                   │  68,150 │   177,690 │    8.3% │
│ scripts/articles/common.py                               │  34,689 │   137,027 │    6.4% │
│ remotes/honeybot/scripts/stream.py                       │  23,051 │    97,620 │    4.5% │
│ init.lua                                                 │  12,900 │    48,947 │    2.3% │
│ scripts/articles/articleizer.py                          │  10,563 │    46,453 │    2.2% │
│ apply.py                                                 │  10,515 │    44,952 │    2.1% │
│ ! last                                                   │  15,060 │    37,028 │    1.7% │
│ remotes/honeybot/nixos/configuration.nix                 │   9,246 │    35,802 │    1.7% │
│ remotes/honeybot/scripts/db.py                           │   6,013 │    26,978 │    1.3% │
│ scripts/articles/publishizer.py                          │   6,910 │    24,260 │    1.1% │
│ /home/mike/repos/trimnoir/flake.nix                      │   5,308 │    24,138 │    1.1% │
│ remotes/honeybot/scripts/logs.py                         │   5,472 │    23,013 │    1.1% │
│ remotes/honeybot/scripts/content_loader.py               │   5,731 │    22,990 │    1.1% │
│ remotes/honeybot/scripts/forest.py                       │   5,424 │    20,552 │    1.0% │
│ PROMPT (checklist + prompt.md)                           │   4,554 │    19,595 │    0.9% │
│ /home/mike/repos/trimnoir/index.md                       │   5,024 │    17,294 │    0.8% │
│ /home/mike/repos/trimnoir/assets/main.css                │   5,614 │    17,210 │    0.8% │
│ scripts/articles/build_knowledge_graph.py                │   4,124 │    16,567 │    0.8% │
│ scripts/articles/sanitizer.py                            │   4,096 │    16,397 │    0.8% │
│ scripts/articles/generate_hubs.py                        │   3,336 │    13,462 │    0.6% │
│ scripts/articles/contextualizer.py                       │   2,962 │    12,939 │    0.6% │
│ /home/mike/repos/trimnoir/_layouts/default.html          │   3,731 │    12,892 │    0.6% │
│ /home/mike/repos/nixos/blogs.nix                         │   3,073 │    12,113 │    0.6% │
│ AUTO: Codebase Structure (eza --tree + token sizes)      │   3,069 │    10,002 │    0.5% │
│ scripts/articles/editing_prompt.txt                      │   2,180 │     9,829 │    0.5% │
│ remotes/honeybot/scripts/test_forest.py                  │   2,402 │     9,537 │    0.4% │
│ .gitignore                                               │   1,998 │     7,429 │    0.3% │
│ scripts/articles/generate_llms_txt.py                    │   1,767 │     6,940 │    0.3% │
│ /home/mike/.config/pipulate/blogs.json                   │   1,302 │     5,276 │    0.2% │
│ remotes/honeybot/scripts/score.py                        │   1,162 │     5,249 │    0.2% │
│ scripts/articles/generate_post_nav.py                    │   1,219 │     4,774 │    0.2% │
│ scripts/articles/link_injector.py                        │   1,134 │     4,394 │    0.2% │
│ nixops.sh                                                │   1,278 │     4,185 │    0.2% │
│ /home/mike/repos/trimnoir/_layouts/post.html             │   1,255 │     4,148 │    0.2% │
│ /home/mike/repos/trimnoir/_config.yml                    │     839 │     3,199 │    0.1% │
│ remotes/honeybot/hooks/post-receive                      │     942 │     3,083 │    0.1% │
│ remotes/honeybot/scripts/card.py                         │     649 │     2,650 │    0.1% │
│ /home/mike/repos/trimnoir/Gemfile                        │     410 │     1,339 │    0.1% │
│ AUTO: Recent Git Diff Telemetry                          │     257 │       847 │    0.0% │
│ assets/jekyll/common-packages.nix                        │     100 │       294 │    0.0% │
│ /home/mike/repos/trimnoir/_layouts/page.html             │      60 │       218 │    0.0% │
│ .gitattributes                                           │      33 │        76 │    0.0% │
│ AUTO: Static Analysis Diagnostics                        │      11 │        39 │    0.0% │
├──────────────────────────────────────────────────────────┼─────────┼───────────┼─────────┤
│ TOTAL                                                    │ 669,836 │ 2,150,416 │  100.0% │
└──────────────────────────────────────────────────────────┴─────────┴───────────┴─────────┘
Assembled payload (pre-scrub): 677,402 tokens | 2,176,795 bytes
🧼 Identity scrub: substitutions=MISSING (/home/mike/.config/pipulate/pii_substitutions.txt) | denylist=MISSING (/home/mike/.config/pipulate/commit_denylist.txt)
🔐 Secrets tripwire: ARMED -- 0 hit(s) in payload.
📦 Canonical QA archive written to /home/mike/pipulate/qamy.ai.zip (sha256=5bac228b3579…, members=3)
🗂️  Rotated archive snapshot: qamy.ai_422-5bac228b.zip (keeping newest 20 of 20)
Markdown output copied to clipboard
(nix) pipulate $ x
(nix) pipulate $ 
```

**Gemini 4 Argon High**: Context verified.

**TL;DR**: We upgrade `clean_markdown()` in `remotes/honeybot/scripts/content_loader.py` with three speech-hygiene filters for the Piper TTS broadcast loop: (1) filesystem paths with extensions (like `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js`) speak only their filename (`tex-chtml.js`), while extensionless multi-slash paths (like `path/path/path/path`) collapse to `"file path"`; (2) article narration stops cleanly after the `### Ai Editorial Take` / `### AI Editorial Take` section so `### 🐦 X.com Promo Tweet` and downstream Book Analysis blocks are never read aloud; and (3) both `$$...$$` and single-dollar `$...$` MathJax expressions (including `\rightarrow`) are stripped of dollar signs and humanized for speech using the collision-safe heuristics from `init.lua`'s `<leader>d` macro while preserving normal currency like `$10,000/mo`.

---

### 1. Why "Lost in the Middle" Disappears When You Give Transformers a Book Spine

When people complain about LLMs getting "lost in the middle" of large context windows, they are usually dumping an unindexed heap of RAG chunks or IDE `@`-mentions into a prompt with no structural map. A human handed a 90,000-word technical manual with the Table of Contents and Index ripped out would get lost in the middle too.

Transformer self-attention is a content-addressable lookup mechanism. When you compile context as an ordered book—starting with a **Manifest (Table of Contents)** with byte/token sizes, a **File Tree**, a chronological **Book Spine (`! book`)**, and deterministic `--- START: path ---` section boundaries—the attention heads do not have to guess where authority lives:

```text
+-----------------------------------------------------------------------+
| COMPILED CONTEXT ARTIFACT (280k Tokens — Indexed, Not Dumped)         |
+-----------------------------------------------------------------------+
| 1. Manifest (ToC)    --> Exact section names + token/byte offsets     |
| 2. File Tree         --> Spatial topology of the repository           |
| 3. ! book Spine      --> Chronological index of 1,591 prior articles  |
| 4. Raw Source Bodies --> Ordered from infrastructure -> pipeline      |
| 5. Prompt Caboose    --> Actionable request at the recency anchor     |
+-----------------------------------------------------------------------+
```

And as your first compile receipt proved right on camera, the **Payload Ledger** immediately caught `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` eating **392,223 tokens (54.0% of the payload)** alongside the broken `_layouts/home.html` candidate, letting you comment both out in `context.txt` in seconds.

---

### 2. Donald Knuth, John Gruber, and the Kramdown `$$` Collision

For newcomers wondering why `$foo$` vs. `$$foo$$` is such a recurring trap in static-site publishing:

1. **Donald Knuth's TeX (1978):** When Knuth designed TeX for *The Art of Computer Programming*, mathematical formulas were everywhere and currency was rare. He chose the single dollar sign (`$...$`) for inline math and double dollar signs (`$$...$$`) for centered display math because `$` was a single keystroke on American keyboards.
2. **John Gruber's Markdown (2004):** Markdown was designed for plain-text web writing, where a sentence like *"Are you spending $10,000 a month and up on HTML pre-rendering, or $20,000?"* contains two literal dollar signs. Under naive TeX rules, everything between `$10,000` and `$20,000` gets swallowed into an italicized math equation with all spaces deleted.
3. **Thomas Leitner's Kramdown (Jekyll's Default Parser):** To eliminate the currency collision without requiring authors to escape every `\$100` in prose, Kramdown refuses single-dollar `$...$` math entirely. Instead, Kramdown uses **`$$...$$` for both inline and block math**:
* If `$$E = mc^2$$` sits inside a paragraph, Kramdown emits inline MathJax `\(E = mc^2\)`.
* If `$$...$$` sits on its own block, Kramdown emits display MathJax `\[...\]`.

4. **The Trimnoir Layout Gate:** On top of Kramdown's rule, look at line 133 of `/home/mike/repos/trimnoir/_layouts/default.html`:
```html
{%- if content contains "$$" or content contains "\[" -%}
<script id="MathJax-script" async src="{{ '/assets/js/mathjax/tex-mml-chtml.js' | relative_url }}"></script>
{%- endif %}
```

If an article only uses single-dollar `$foo$` and never `$$`, Jekyll not only leaves the raw `$` characters in the HTML—it doesn't even load the MathJax script on the page.
5. **The `<leader>d` `\rightarrow` Quirk in `init.lua`:** Because LLMs are trained heavily on Pandoc and GitHub Markdown (which allow single `$...$`), they constantly emit `$O(N^2)$` or `$\rightarrow$`. In `init.lua`, your `<leader>d` macro (`is_mathjax_span`) uses a sliding-pair scanner that masks backticks and existing `$$...$$`, guards against currency (`$10,000/mo`), and checks for TeX backslashes, exponents/subscripts (`^`, `_`, `=`), function notation (`f(x)`), or single-letter variables. Notice line 508 of `init.lua` had `if expr == "\\rightarrow" then return false end` so standalone `$\rightarrow$` was skipped during visual doubling. For Piper TTS in `content_loader.py`, we want the exact opposite on `\rightarrow`: whether it is written `$\rightarrow$` or `$$\rightarrow$$`, the voice engine should strip the dollar signs and speak `"right arrow"` instead of `"dollar backslash rightarrow dollar"`.

---

### 3. The Three Housekeeping Fixes in `remotes/honeybot/scripts/content_loader.py`

1. **Truncate After `Ai/AI Editorial Take` (`_truncate_after_editorial_take`):**
* Runs at the very top of `clean_markdown()` before fenced code blocks are turned into `CODE_SENTINEL`.
* Finds `^#{1,6}[ \t]*ai[ \t]+editorial[ \t]+take\b` (case-insensitive, handling both `Ai Editorial Take` and `AI Editorial Take`), keeps its paragraphs, and slices off everything starting at the next Markdown heading (`### 🐦 X.com Promo Tweet`, `### 🎨 Hero Banner Image Prompt`, `### Title Brainstorm`, etc.). Also slices at `### 🐦 X.com Promo Tweet` directly if an article ever omits the editorial take.

2. **Collision-Safe MathJax Speech Filter (`_strip_mathjax_for_tts`):**
* Unwraps all `$$...$$`, `\( ... \)`, and `\[ ... \]` blocks first.
* Scans each line for single-dollar `$...$` spans using the Python port of `init.lua`'s `is_mathjax_span` (masking inline ``...`` code spans so shell variables like ``$PATH`` are ignored, and rejecting currency shapes like `$10,000/mo` or `$10k a month`).
* Humanizes TeX inside matched math spans (`\rightarrow` $$\rightarrow$$ `"right arrow"`, `\frac{a}{b}` $$\rightarrow$$ `"a over b"`, `\times` $$\rightarrow$$ `"times"`, `\ge` $$\rightarrow$$ `"greater than or equal to"`, `\text{kHz}` $$\rightarrow$$ `"kHz"`) and strips the surrounding `$` signs.

3. **Eloquent File Path Simplification (`_simplify_filepaths_for_tts`):**
* Runs after Markdown links, raw `https?://` URLs, and `<...>` HTML tags have been handled.
* Any filesystem path whose final segment has a file extension (such as `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` or `remotes/honeybot/scripts/content_loader.py`) is replaced with just its filename (`tex-chtml.js`, `content_loader.py`).
* Any multi-slash path without a file extension (such as `path/path/path/path` or `/home/mike/repos/trimnoir/_posts`) is replaced with `"file path"`, while leaving normal prose slash pairs (`80/20`, `24/7`, `before/after`) untouched.

---

**1: BEFORE** (PROBES)

Run this in `(nix) pipulate $` to capture the BEFORE behavior of `clean_markdown()` on all three housekeeping cases, followed by a bounded corpus census of single-dollar `$...$` MathJax spans across `~/repos/trimnoir/_posts/*.md`:

`(nix) pipulate $`

```bash
.venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))'
.venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re = re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re = re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]]) <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})"); print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))'
```

**2: AFTER** (NEXT CONTEXT)

Put this in `context.txt` for the next compile (trimmed to the active files plus the two probe echoes):

```text
! .venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))'
! .venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re = re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re = re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]]) <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})"); print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))'
remotes/honeybot/scripts/content_loader.py
scripts/articles/articleizer.py
scripts/articles/sanitizer.py
init.lua
apply.py
```

**3: CHANGE** (PATCHES)

```text
Target: remotes/honeybot/scripts/content_loader.py
[[[SEARCH]]]
def clean_markdown(text, label=None, census=True):
[[[DIVIDER]]]
_TEX_SPOKEN_MAP = (
    (r'\\(?:long)?rightarrow\b|\\to\b|\\(?:Long)?Rightarrow\b', ' right arrow '),
    (r'\\(?:long)?leftarrow\b|\\(?:Long)?Leftarrow\b', ' left arrow '),
    (r'\\(?:long)?leftrightarrow\b|\\(?:Long)?Leftrightarrow\b|\\iff\b', ' left right arrow '),
    (r'\\times\b', ' times '),
    (r'\\cdot\b', ' dot '),
    (r'\\(?:le|leq)\b', ' less than or equal to '),
    (r'\\(?:ge|geq)\b', ' greater than or equal to '),
    (r'\\(?:ne|neq)\b', ' not equal to '),
    (r'\\approx\b', ' approximately '),
    (r'\\infty\b', ' infinity '),
    (r'\\pm\b', ' plus or minus '),
    (r'\\Sigma\b|\\sum\b', ' sum '),
    (r'\\Delta\b', ' delta '),
)

_KNOWN_DOMAIN_DIRS = frozenset({
    "mikelev.in", "qamy.ai", "npvg.org", "levinix.org", "levinix.com",
    "levinux.com", "sunpug.io", "guerillatech.com", "rfc9110.org",
    "rfc9111.io", "rfc9111.com", "pipulate.com",
})

_FILEPATH_RE = re.compile(
    r'(?<![:\w])'
    r'(?:'
    r'(?:~|\.{1,2})?(?:/\.?[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)*){2,}/?'
    r'|\b[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)*(?:/\.?[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)*){2,}/?'
    r'|\b[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)*/\.?[A-Za-z0-9_~-]+\.[A-Za-z0-9]{1,10}\b'
    r')'
)

def _truncate_after_editorial_take(text):
    """Keep the article through 'Ai/AI Editorial Take' and drop subsequent Book Analysis sections."""
    m_take = re.search(
        r'^#{1,6}[ \t]*ai[ \t]+editorial[ \t]+take\b[^\n]*\n',
        text,
        flags=re.IGNORECASE | re.MULTILINE,
    )
    if m_take:
        m_next = re.search(r'^#{1,6}[ \t]', text[m_take.end():], flags=re.MULTILINE)
        if m_next:
            text = text[: m_take.end() + m_next.start()]
    m_tweet = re.search(
        r'^#{1,6}[ \t]*(?:🐦[ \t]*)?x\.com[ \t]+promo[ \t]+tweet\b',
        text,
        flags=re.IGNORECASE | re.MULTILINE,
    )
    if m_tweet:
        text = text[: m_tweet.start()]
    return text

def _humanize_tex_expr(expr):
    """Convert inner TeX/MathJax math into natural speech without dollar signs or raw backslashes."""
    s = expr.strip()
    s = re.sub(r'\\frac\{([^{}]*)\}\{([^{}]*)\}', r' \1 over \2 ', s)
    s = re.sub(r'\\(?:text|mathrm|mathbf|mathcal|mathit|texttt|operatorname)\{([^{}]*)\}', r'\1', s)
    for pat, repl in _TEX_SPOKEN_MAP:
        s = re.sub(pat, repl, s)
    s = re.sub(r'\\([A-Za-z]+)', r' \1 ', s)
    s = s.replace('{', ' ').replace('}', ' ')
    s = re.sub(r'\s+', ' ', s).strip()
    return f" {s} " if s else " "

def _is_single_dollar_mathjax(masked_line, s_pos, e_pos):
    """Port of init.lua's is_mathjax_span: true when $...$ is TeX/MathJax, false for currency/shell."""
    expr = masked_line[s_pos + 1 : e_pos]
    if not (1 <= len(expr) <= 120):
        return False
    if expr[0].isspace() or expr[-1].isspace():
        return False
    prev_ch = masked_line[s_pos - 1] if s_pos > 0 else ""
    next_ch = masked_line[e_pos + 1] if e_pos + 1 < len(masked_line) else ""
    if prev_ch and (prev_ch.isalnum() or prev_ch in "\\$"):
        return False
    if next_ch and (next_ch.isalnum() or next_ch == "$"):
        return False
    if re.match(r"^\d[\d,.]*/[A-Za-z]{2,}", expr) or re.match(r"^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}", expr):
        return False
    if "\\" in expr:
        return True
    if re.search(r"[\^_=<>&+]", expr):
        return True
    if re.match(r"^(?:[A-Za-z]'?|\d+/\d+|[A-Za-z]/[A-Za-z])$", expr):
        return True
    if re.match(r"^[A-Za-z]+\([^()]*\)$", expr):
        return True
    if re.match(r"^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$", expr):
        return True
    return False

def _strip_single_dollar_mathjax_line(line):
    """Unwrap single-dollar MathJax spans on a single line while preserving currency and inline code."""
    if '$' not in line:
        return line
    shadow = re.sub(r'`+[^`]*`+', lambda m: '#' * len(m.group(0)), line)
    shadow = re.sub(r'\$\$+', lambda m: '#' * len(m.group(0)), shadow)
    positions = [m.start() for m in re.finditer(r'\$', shadow)]
    if len(positions) < 2:
        return line
    matches = []
    idx = 0
    while idx + 1 < len(positions):
        s_pos, e_pos = positions[idx], positions[idx + 1]
        if _is_single_dollar_mathjax(shadow, s_pos, e_pos):
            matches.append((s_pos, e_pos))
            idx += 2
        else:
            idx += 1
    if not matches:
        return line
    out = []
    cursor = 0
    for s_pos, e_pos in matches:
        out.append(line[cursor:s_pos])
        out.append(_humanize_tex_expr(line[s_pos + 1 : e_pos]))
        cursor = e_pos + 1
    out.append(line[cursor:])
    return "".join(out)

def _strip_mathjax_for_tts(text):
    """Strip $$...$$ and collision-safe $...$ MathJax delimiters and humanize TeX for Piper TTS."""
    text = re.sub(r'\$\$([\s\S]+?)\$\$', lambda m: _humanize_tex_expr(m.group(1)), text)
    text = re.sub(r'\\\(([\s\S]+?)\\\)', lambda m: _humanize_tex_expr(m.group(1)), text)
    text = re.sub(r'\\\[([\s\S]+?)\\\]', lambda m: _humanize_tex_expr(m.group(1)), text)
    return "\n".join(_strip_single_dollar_mathjax_line(ln) for ln in text.splitlines())

def _simplify_filepath_match(match):
    """Speak the filename with extension if present, else collapse multi-slash paths to 'file path'."""
    raw = match.group(0)
    clean = raw.rstrip('/')
    segments = [seg for seg in clean.split('/') if seg]
    if not segments:
        return raw
    if all(seg.isdigit() for seg in segments):
        return raw
    if raw.endswith('/'):
        return "file path"
    basename = segments[-1]
    if basename.lower() in _KNOWN_DOMAIN_DIRS:
        return "file path"
    if '.' in basename[1:] and re.match(r'^\.?[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)+$', basename):
        return basename
    return "file path"

def _simplify_filepaths_for_tts(text):
    """Replace slash-heavy filesystem paths with their filename.ext or 'file path'."""
    return _FILEPATH_RE.sub(_simplify_filepath_match, text)

def clean_markdown(text, label=None, census=True):
[[[REPLACE]]]
Target: remotes/honeybot/scripts/content_loader.py
[[[SEARCH]]]
    CODE_SENTINEL = '\x00CODEBLOCK\x00'
    text = re.sub(r'^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$', f' {CODE_SENTINEL} ', text, flags=re.MULTILINE | re.DOTALL)
[[[DIVIDER]]]
    text = _truncate_after_editorial_take(text)
    CODE_SENTINEL = '\x00CODEBLOCK\x00'
    text = re.sub(r'^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$', f' {CODE_SENTINEL} ', text, flags=re.MULTILINE | re.DOTALL)
[[[REPLACE]]]
Target: remotes/honeybot/scripts/content_loader.py
[[[SEARCH]]]
    # Remove Inline Code
    text = re.sub(r'`([^`]+)`', r'\1', text)
    # Remove Images
    text = re.sub(r'!\[.*?\]\(.*?\)', '', text)
    # Remove Links [text](url) -> text
    text = re.sub(r'\[([^\]]+)\]\(.*?\)', r'\1', text)
[[[DIVIDER]]]
    # Strip $$...$$ and single-dollar $...$ MathJax before backticks and underscores are removed
    text = _strip_mathjax_for_tts(text)

    # Remove Inline Code
    text = re.sub(r'`([^`]+)`', r'\1', text)
    # Remove Images
    text = re.sub(r'!\[.*?\]\(.*?\)', '', text)
    # Remove Links [text](url) -> text
    text = re.sub(r'\[([^\]]+)\]\(.*?\)', r'\1', text)
[[[REPLACE]]]
Target: remotes/honeybot/scripts/content_loader.py
[[[SEARCH]]]
    # Remove HTML tags
    text = re.sub(r'<[^>]+>', '', text)
    # Remove Headers/Bold/Italic markers
    text = re.sub(r'[*_#]', '', text)
[[[DIVIDER]]]
    # Remove HTML tags
    text = re.sub(r'<[^>]+>', '', text)
    # Simplify slash-heavy file paths to filename.ext or "file path" before stripping underscores
    text = _simplify_filepaths_for_tts(text)
    # Remove Headers/Bold/Italic markers
    text = re.sub(r'[*_#]', '', text)
[[[REPLACE]]]
```

No ignition is required for the local straddle probe because `.venv/bin/python` imports `remotes/honeybot/scripts/content_loader.py` fresh at call time (and `ytoutro sync` or `ytreboot` pushes the updated `content_loader.py` to Honeybot when you want it live on the stream).

**4: PROMPT**

```text
Verify the AFTER receipt for clean_markdown() on all three housekeeping rules (filename.ext vs "file path", stopping after Ai/AI Editorial Take, and stripping $ / $$ MathJax delimiters while keeping currency), review the single-dollar MathJax corpus census across ~/repos/trimnoir/_posts/*.md, and propose the next step if we want to batch-upgrade or intake-heal single-dollar MathJax spans.
```

**5: DELIVERABLE**

* `clean_markdown()` in `remotes/honeybot/scripts/content_loader.py` turns `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` into `tex-chtml.js` and `path/path/path/path` into `file path`, stops reading immediately after `### Ai Editorial Take` / `### AI Editorial Take` (never reading `### 🐦 X.com Promo Tweet` or downstream sections), and strips `$` / `$$` MathJax delimiters (including `\rightarrow` $$\rightarrow$$ `right arrow`) while preserving currency (`$10,000/mo`).
* The corpus census receipt quantifies how many published articles in `~/repos/trimnoir/_posts/*.md` carry un-doubled `$foo$` MathJax spans.

**MikeLev.in**: 



## THE AI-EDIT METHOD

> Same commands, run twice, one change between them. Where the readings
> differ is what the change did; the diff in the middle is the receipt.

**1: BEFORE** (PROBE): 

```bash
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ .venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))'
.venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re = re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re = re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]]) <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})"); print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))'
Path /home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js and path/path/path/path.
Math $ER = EPR$, $$O(2^N)$$, and $\rightarrow$ vs $10,000/mo to $20,000/mo.
 Book Analysis
 Ai Editorial Take Keep this take.
 🐦 X.com Promo Tweet See the code at MikeLev dot Eye N slash latest.
Posts scanned: 1592 | Posts with single-$ math: 129 | Total spans: 923 (\rightarrow: 349)
  2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md: 25 span(s) -> ['$\\rightarrow$', '$\\rightarrow$', '$\\frac{a}{b}$', '$\\frac{dy}{dx}$']
  2026-10-28-chipmunk-overclocks-vits-voice-lab-paul-gauthier.md: 13 span(s) -> ['$\\rightarrow$', '$\\rightarrow$', '$\\rightarrow$', '$\\rightarrow$']
  2026-10-27-four-shifts-of-search-ai-ouroboros-context-engineering.md: 11 span(s) -> ['$\\rightarrow$', '$\\rightarrow$', '$\\rightarrow$', '$\\rightarrow$']
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: 12 span(s) -> ['$O(2^N)$', '$O(2^N)$', '$O(2^N)$', '$2^{20}$']
  2026-10-26-max-headroom-sigstop-xeyes-moov-atom-weebo.md: 3 span(s) -> ['$O(W \\times H)$', '$P(x_t \\mid x_{<t})$', '$O(W \\times H)$']
  2026-10-25-websub-sunpug-broadcast-bicycle-utf8-emoji-patch.md: 33 span(s) -> ['$\\rightarrow$', '$\\rightarrow$', '$\\rightarrow$', '$\\rightarrow$']
  2026-10-25-operation-weebo-xshape-cookie-cutter-rfc9111-smeaton.md: 34 span(s) -> ['$\\rightarrow$', '$\\rightarrow$', '$\\rightarrow$', '$0.005 \\rightarrow 0.0033$']
  2026-10-25-eight-door-radio-headend-ruby-galactic-gumshoe-rfc9110.md: 3 span(s) -> ['$1/r$', '$\\rightarrow$', '$\\rightarrow$']
  2026-10-25-disarming-backtick-cues-piper-tts-rsplit-importlib.md: 2 span(s) -> ['$\\rightarrow$', '$\\rightarrow$']
  2026-10-24-sunpug-pugio-vampire-value-proposition-curl-less.md: 12 span(s) -> ['$2898\\ \\mu\\text{m}\\cdot\\text{K} / T$', '$\\rightarrow$', '$\\rightarrow$', '$\\rightarrow$']
  2026-10-24-mu-puzzle-phantom-limbs-f2-neovim-exemplars.md: 2 span(s) -> ['$A$', '$P$']
  2026-10-24-method-of-loki-loci-pathlib-int-brain-zip-hydration.md: 7 span(s) -> ['$dx = d \\times x$', '$\\frac{dy}{dx}$', '$\\frac{dx}{dy}$', '$\\frac{dy}{dx} = \\frac{dy}{du} \\cdot \\frac{du}{dx}$']
(nix) pipulate $ 
[triple backticks]

**2: AFTER** (NEXT CONTEXT): 

[triple backticks]text
# # Context 1
# 
# ! book
# 
# # HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
# nixops.sh
# remotes/honeybot/hooks/post-receive
# remotes/honeybot/nixos/configuration.nix
# remotes/honeybot/scripts/stream.py
# remotes/honeybot/scripts/score.py
# remotes/honeybot/scripts/card.py
# remotes/honeybot/scripts/forest.py
# remotes/honeybot/scripts/test_forest.py
# remotes/honeybot/scripts/logs.py
# remotes/honeybot/scripts/content_loader.py
# # remotes/honeybot/scripts/db.py
# 
# # THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
# ~/repos/nixos/blogs.nix
# ~/.config/pipulate/blogs.json
# scripts/articles/publishizer.py
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/link_injector.py
# scripts/articles/build_knowledge_graph.py
# scripts/articles/editing_prompt.txt
# scripts/articles/sanitizer.py
# scripts/articles/contextualizer.py
# scripts/articles/generate_hubs.py
# scripts/articles/generate_llms_txt.py
# scripts/articles/generate_post_nav.py
# assets/jekyll/common-packages.nix
# 
# # TRIMNOIR
# ~/repos/trimnoir/_config.yml
# ~/repos/trimnoir/flake.nix
# ~/repos/trimnoir/Gemfile
# ~/repos/trimnoir/index.md
# ~/repos/trimnoir/_layouts/default.html
# ~/repos/trimnoir/_layouts/page.html
# ~/repos/trimnoir/_layouts/post.html
# ~/repos/trimnoir/assets/main.css
# 
# ! last
# init.lua
# 
# # /home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js

# Context 2
! .venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))'
! .venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re = re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re = re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]]) <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})"); print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))'
remotes/honeybot/scripts/content_loader.py
scripts/articles/articleizer.py
scripts/articles/sanitizer.py
init.lua
apply.py
```

**3: CHANGE** (PATCHES): 

```diff
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ patch
(nix) pipulate $ app
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'remotes/honeybot/scripts/content_loader.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'remotes/honeybot/scripts/content_loader.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'remotes/honeybot/scripts/content_loader.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'remotes/honeybot/scripts/content_loader.py'.
(nix) pipulate $ d
diff --git a/remotes/honeybot/scripts/content_loader.py b/remotes/honeybot/scripts/content_loader.py
index 8aa4950..5b6232c 100644
--- a/remotes/honeybot/scripts/content_loader.py
+++ b/remotes/honeybot/scripts/content_loader.py
@@ -274,6 +274,162 @@ def get_playlist(recent_n=10, include_archive=True):
         print(f"Librarian Error: {e}", file=sys.stderr)
         return []
 
+_TEX_SPOKEN_MAP = (
+    (r'\\(?:long)?rightarrow\b|\\to\b|\\(?:Long)?Rightarrow\b', ' right arrow '),
+    (r'\\(?:long)?leftarrow\b|\\(?:Long)?Leftarrow\b', ' left arrow '),
+    (r'\\(?:long)?leftrightarrow\b|\\(?:Long)?Leftrightarrow\b|\\iff\b', ' left right arrow '),
+    (r'\\times\b', ' times '),
+    (r'\\cdot\b', ' dot '),
+    (r'\\(?:le|leq)\b', ' less than or equal to '),
+    (r'\\(?:ge|geq)\b', ' greater than or equal to '),
+    (r'\\(?:ne|neq)\b', ' not equal to '),
+    (r'\\approx\b', ' approximately '),
+    (r'\\infty\b', ' infinity '),
+    (r'\\pm\b', ' plus or minus '),
+    (r'\\Sigma\b|\\sum\b', ' sum '),
+    (r'\\Delta\b', ' delta '),
+)
+
+_KNOWN_DOMAIN_DIRS = frozenset({
+    "mikelev.in", "qamy.ai", "npvg.org", "levinix.org", "levinix.com",
+    "levinux.com", "sunpug.io", "guerillatech.com", "rfc9110.org",
+    "rfc9111.io", "rfc9111.com", "pipulate.com",
+})
+
+_FILEPATH_RE = re.compile(
+    r'(?<![:\w])'
+    r'(?:'
+    r'(?:~|\.{1,2})?(?:/\.?[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)*){2,}/?'
+    r'|\b[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)*(?:/\.?[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)*){2,}/?'
+    r'|\b[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)*/\.?[A-Za-z0-9_~-]+\.[A-Za-z0-9]{1,10}\b'
+    r')'
+)
+
+
+def _truncate_after_editorial_take(text):
+    """Keep the article through 'Ai/AI Editorial Take' and drop subsequent Book Analysis sections."""
+    m_take = re.search(
+        r'^#{1,6}[ \t]*ai[ \t]+editorial[ \t]+take\b[^\n]*\n',
+        text,
+        flags=re.IGNORECASE | re.MULTILINE,
+    )
+    if m_take:
+        m_next = re.search(r'^#{1,6}[ \t]', text[m_take.end():], flags=re.MULTILINE)
+        if m_next:
+            text = text[: m_take.end() + m_next.start()]
+    m_tweet = re.search(
+        r'^#{1,6}[ \t]*(?:🐦[ \t]*)?x\.com[ \t]+promo[ \t]+tweet\b',
+        text,
+        flags=re.IGNORECASE | re.MULTILINE,
+    )
+    if m_tweet:
+        text = text[: m_tweet.start()]
+    return text
+
+
+def _humanize_tex_expr(expr):
+    """Convert inner TeX/MathJax math into natural speech without dollar signs or raw backslashes."""
+    s = expr.strip()
+    s = re.sub(r'\\frac\{([^{}]*)\}\{([^{}]*)\}', r' \1 over \2 ', s)
+    s = re.sub(r'\\(?:text|mathrm|mathbf|mathcal|mathit|texttt|operatorname)\{([^{}]*)\}', r'\1', s)
+    for pat, repl in _TEX_SPOKEN_MAP:
+        s = re.sub(pat, repl, s)
+    s = re.sub(r'\\([A-Za-z]+)', r' \1 ', s)
+    s = s.replace('{', ' ').replace('}', ' ')
+    s = re.sub(r'\s+', ' ', s).strip()
+    return f" {s} " if s else " "
+
+
+def _is_single_dollar_mathjax(masked_line, s_pos, e_pos):
+    """Port of init.lua's is_mathjax_span: true when $...$ is TeX/MathJax, false for currency/shell."""
+    expr = masked_line[s_pos + 1 : e_pos]
+    if not (1 <= len(expr) <= 120):
+        return False
+    if expr[0].isspace() or expr[-1].isspace():
+        return False
+    prev_ch = masked_line[s_pos - 1] if s_pos > 0 else ""
+    next_ch = masked_line[e_pos + 1] if e_pos + 1 < len(masked_line) else ""
+    if prev_ch and (prev_ch.isalnum() or prev_ch in "\\$"):
+        return False
+    if next_ch and (next_ch.isalnum() or next_ch == "$"):
+        return False
+    if re.match(r"^\d[\d,.]*/[A-Za-z]{2,}", expr) or re.match(r"^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}", expr):
+        return False
+    if "\\" in expr:
+        return True
+    if re.search(r"[\^_=<>&+]", expr):
+        return True
+    if re.match(r"^(?:[A-Za-z]'?|\d+/\d+|[A-Za-z]/[A-Za-z])$", expr):
+        return True
+    if re.match(r"^[A-Za-z]+\([^()]*\)$", expr):
+        return True
+    if re.match(r"^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$", expr):
+        return True
+    return False
+
+
+def _strip_single_dollar_mathjax_line(line):
+    """Unwrap single-dollar MathJax spans on a single line while preserving currency and inline code."""
+    if '$' not in line:
+        return line
+    shadow = re.sub(r'`+[^`]*`+', lambda m: '#' * len(m.group(0)), line)
+    shadow = re.sub(r'\$\$+', lambda m: '#' * len(m.group(0)), shadow)
+    positions = [m.start() for m in re.finditer(r'\$', shadow)]
+    if len(positions) < 2:
+        return line
+    matches = []
+    idx = 0
+    while idx + 1 < len(positions):
+        s_pos, e_pos = positions[idx], positions[idx + 1]
+        if _is_single_dollar_mathjax(shadow, s_pos, e_pos):
+            matches.append((s_pos, e_pos))
+            idx += 2
+        else:
+            idx += 1
+    if not matches:
+        return line
+    out = []
+    cursor = 0
+    for s_pos, e_pos in matches:
+        out.append(line[cursor:s_pos])
+        out.append(_humanize_tex_expr(line[s_pos + 1 : e_pos]))
+        cursor = e_pos + 1
+    out.append(line[cursor:])
+    return "".join(out)
+
+
+def _strip_mathjax_for_tts(text):
+    """Strip $$...$$ and collision-safe $...$ MathJax delimiters and humanize TeX for Piper TTS."""
+    text = re.sub(r'\$\$([\s\S]+?)\$\$', lambda m: _humanize_tex_expr(m.group(1)), text)
+    text = re.sub(r'\\\(([\s\S]+?)\\\)', lambda m: _humanize_tex_expr(m.group(1)), text)
+    text = re.sub(r'\\\[([\s\S]+?)\\\]', lambda m: _humanize_tex_expr(m.group(1)), text)
+    return "\n".join(_strip_single_dollar_mathjax_line(ln) for ln in text.splitlines())
+
+
+def _simplify_filepath_match(match):
+    """Speak the filename with extension if present, else collapse multi-slash paths to 'file path'."""
+    raw = match.group(0)
+    clean = raw.rstrip('/')
+    segments = [seg for seg in clean.split('/') if seg]
+    if not segments:
+        return raw
+    if all(seg.isdigit() for seg in segments):
+        return raw
+    if raw.endswith('/'):
+        return "file path"
+    basename = segments[-1]
+    if basename.lower() in _KNOWN_DOMAIN_DIRS:
+        return "file path"
+    if '.' in basename[1:] and re.match(r'^\.?[A-Za-z0-9_~-]+(?:\.[A-Za-z0-9_-]+)+$', basename):
+        return basename
+    return "file path"
+
+
+def _simplify_filepaths_for_tts(text):
+    """Replace slash-heavy filesystem paths with their filename.ext or 'file path'."""
+    return _FILEPATH_RE.sub(_simplify_filepath_match, text)
+
+
 def clean_markdown(text, label=None, census=True):
     """Sanitizes Markdown for the Piper TTS engine.
 
@@ -368,6 +524,7 @@ def clean_markdown(text, label=None, census=True):
     # Strip fenced code blocks (line-anchored first so stray inline backticks cannot
     # invert fences) and disarm backticked inline-code examples (including Vim gq
     # hard-wrapped spans) BEFORE capturing standalone live player-piano cues.
+    text = _truncate_after_editorial_take(text)
     CODE_SENTINEL = '\x00CODEBLOCK\x00'
     text = re.sub(r'^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$', f' {CODE_SENTINEL} ', text, flags=re.MULTILINE | re.DOTALL)
     text = re.sub(r'[triple backticks].*?[triple backticks]', f' {CODE_SENTINEL} ', text, flags=re.DOTALL)
@@ -419,6 +576,9 @@ def clean_markdown(text, label=None, census=True):
         idx = text.index(spoken)
         text = text[:idx + len(spoken)] + text[idx + len(spoken):].replace(spoken, '')
 
+    # Strip $$...$$ and single-dollar $...$ MathJax before backticks and underscores are removed
+    text = _strip_mathjax_for_tts(text)
+
     # Remove Inline Code
     text = re.sub(r'`([^`]+)`', r'\1', text)
     # Remove Images
@@ -489,6 +649,8 @@ def clean_markdown(text, label=None, census=True):
 
     # Remove HTML tags
     text = re.sub(r'<[^>]+>', '', text)
+    # Simplify slash-heavy file paths to filename.ext or "file path" before stripping underscores
+    text = _simplify_filepaths_for_tts(text)
     # Remove Headers/Bold/Italic markers
     text = re.sub(r'[*_#]', '', text)
 
(nix) pipulate $ m
📝 Committing: chore: Add TeX/MathJax spoken mapping and domain directory definitions
[main 28a28f6] chore: Add TeX/MathJax spoken mapping and domain directory definitions
 1 file changed, 162 insertions(+)
(nix) pipulate $ git push
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 48 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 2.83 KiB | 2.83 MiB/s, done.
Total 6 (delta 4), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (4/4), completed with 4 local objects.
To github.com:pipulate/pipulate.git
   25544aa..28a28f6  main -> main
(nix) pipulate $ 
```

Ignition: often "exit", "nix develop". Instructions may vary.

None required. I have to remember I can use `ytreboot` rather than a full
`publish "message" --reboot`.

**4: PROMPT**: 

Verify the AFTER receipt for clean_markdown() on all three housekeeping rules (filename.ext vs "file path", stopping after Ai/AI Editorial Take, and stripping $ / $$ MathJax delimiters while keeping currency), review the single-dollar MathJax corpus census across ~/repos/trimnoir/_posts/*.md, and propose the next step if we want to batch-upgrade or intake-heal single-dollar MathJax spans.

**5: DELIVERABLE**: 

The deliverable is a bonus more lightweight website on pages that don't use math
and a just generally more listenable articles on Honeybot Storytime.

## Verifying the Piper TTS Speech-Hygiene Straddle Receipt

Now that's a compiled context!

```bash
(nix) pipulate $ c
🗺️  Codex Mapping Coverage: 74.8% (217/290 tracked files) (was 217/290: +0 claimed, +0 tracked).

✅ Topological Integrity Verified: 34 candidate reference(s) scanned, all exist.
   -> Executing: .venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))' ... [0.0869s]
   -> Executing: .venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re = re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re = re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]]) <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})"); print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))' ... [6.1591s]
Python file(s) detected. Generating codebase tree diagram... (2,995 tokens | 9,797 bytes)
UML unavailable for 4 file(s): Skipping: Required command(s) not found: `pyreverse` (from pylint).
   -> Ruff exit 0 (clean).
                                                                          📦 Payload Ledger (biggest first)                                                                          
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┓
┃ File / Source                                                                                                                                        ┃ Tokens ┃   Bytes ┃ % Bytes ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━┩
│ PROMPT (checklist + prompt.md)                                                                                                                       │ 19,086 │  66,786 │   23.8% │
│ init.lua                                                                                                                                             │ 12,900 │  48,947 │   17.5% │
│ scripts/articles/articleizer.py                                                                                                                      │ 10,563 │  46,453 │   16.6% │
│ apply.py                                                                                                                                             │ 10,515 │  44,952 │   16.0% │
│ remotes/honeybot/scripts/content_loader.py                                                                                                           │  7,775 │  29,267 │   10.4% │
│ scripts/articles/sanitizer.py                                                                                                                        │  4,096 │  16,397 │    5.9% │
│ AUTO: Codebase Structure (eza --tree + token sizes)                                                                                                  │  2,995 │   9,797 │    3.5% │
│ AUTO: Recent Git Diff Telemetry                                                                                                                      │  2,666 │   8,025 │    2.9% │
│ .gitignore                                                                                                                                           │  1,998 │   7,429 │    2.7% │
│ ! .venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask =                                   │    677 │   1,864 │    0.7% │
│ re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re =          │        │         │         │
│ re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re =                │        │         │         │
│ re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln:       │        │         │         │
│ (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]])   │        │         │         │
│ <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not           │        │         │         │
│ (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or        │        │         │         │
│ math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]);     │        │         │         │
│ hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8",                                      │        │         │         │
│ errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if │        │         │         │
│ "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})");   │        │         │         │
│ print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))'                                                                       │        │         │         │
│ ! .venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path                            │     49 │     152 │    0.1% │
│ `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs          │        │         │         │
│ $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this              │        │         │         │
│ tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))'                                                                          │        │         │         │
│ .gitattributes                                                                                                                                       │     33 │      76 │    0.0% │
│ AUTO: Static Analysis Diagnostics                                                                                                                    │     11 │      39 │    0.0% │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼─────────┼─────────┤
│ TOTAL                                                                                                                                                │ 73,364 │ 280,184 │  100.0% │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴─────────┴─────────┘
Assembled payload (pre-scrub): 82,737 tokens | 309,055 bytes
🧼 Identity scrub: substitutions=MISSING (/home/mike/.config/pipulate/pii_substitutions.txt) | denylist=MISSING (/home/mike/.config/pipulate/commit_denylist.txt)
🔐 Secrets tripwire: ARMED -- 0 hit(s) in payload.
📦 Canonical QA archive written to /home/mike/pipulate/qamy.ai.zip (sha256=4f722c738e17…, members=3)
🗂️  Rotated archive snapshot: qamy.ai_427-4f722c73.zip (keeping newest 20 of 20)
Markdown output copied to clipboard
(nix) pipulate $ 
```

**Gemini 4 Argon High**: Context verified.

**TL;DR**: The AFTER receipt in `qamy.ai_427` confirms all three speech-hygiene filters in `remotes/honeybot/scripts/content_loader.py` (`tex-chtml.js` vs. `file path`, stopping after `Ai Editorial Take`, and humanizing `$ER = EPR$`, `$$O(2^N)$$`, and `$\rightarrow$` while preserving `$10,000/mo`). The corpus census across `1,592` posts in `~/repos/trimnoir/_posts/*.md` found **923 un-doubled single-dollar `$...$` spans across 129 posts**—and **349 of them (37.8%)** are standalone `$\rightarrow$` that survived because `init.lua` line 508 explicitly excluded `\rightarrow`. Below, we remove that exclusion in `init.lua`, wire collision-safe `$...$` $$\rightarrow$$ `$$...$$` auto-healing into `scripts/articles/sanitizer.py` (both at intake for `article.txt` and via `--heal-mathjax` for the corpus), and fix the `import sys` ordering in the audit probe.

---

### 1. Verification of the `clean_markdown()` Straddle Receipt

Comparing the BEFORE reading against the live AFTER receipt (`152 bytes` in `0.0869s`) confirms all three rules in `remotes/honeybot/scripts/content_loader.py` (commit `28a28f6`):

| Housekeeping Target | Input Sample | BEFORE Output | AFTER Output (Verified) |
| --- | --- | --- | --- |
| **Path with extension** | ``/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js`` | `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` | `tex-chtml.js` |
| **Extensionless path** | ``path/path/path/path`` | `path/path/path/path` | `file path` |
| **Single/Double MathJax** | `$ER = EPR$, $$O(2^N)$$, and $\rightarrow$` | `$ER = EPR$, $$O(2^N)$$, and $\rightarrow$` | `ER = EPR , O(2^N) , and right arrow` |
| **Currency preservation** | `vs $10,000/mo to $20,000/mo.` | `vs $10,000/mo to $20,000/mo.` | `vs $10,000/mo to $20,000/mo.` |
| **Stop after Editorial Take** | `### Ai Editorial Take` $$\rightarrow$$ `### 🐦 X.com Promo Tweet` | Read tweet heading + code sentinel aloud | Truncated cleanly after `Keep this take.` |

---

### 2. Corpus Census Forensics: Why 349 `$\rightarrow$` Spans Survived

The corpus census scanned all **1,592** published Markdown posts in `~/repos/trimnoir/_posts/*.md`:

* **Posts with un-doubled `$...$` math:** `129` (`8.1%` of the corpus)
* **Total un-doubled `$...$` spans:** `923`
* **Standalone `$\rightarrow$` spans:** `349` (`37.8%` of all un-doubled spans)

Two mechanisms explain why those 923 spans accumulated:

1. **The `\rightarrow` Exclusion in `init.lua`:** Look at lines 508–510 of `init.lua` inside `is_mathjax_span()`:
```lua
if expr == "\\rightarrow" then
    return false
end
```

Because `is_mathjax_span` returned `false` on `\rightarrow`, pressing `<leader>d` in Neovim skipped right over every `$\rightarrow$` in your recent articles (`2026-10-28`, `2026-10-27`, `2026-10-25`), leaving 349 of them single-dollared.
2. **No Intake Healing in `sanitizer.py`:** Whenever an AI dialogue partner or `articleizer.py` emitted `$O(2^N)$`, `$\frac{dy}{dx}$`, or `$P(x_t \mid x_{<t})$` and `<leader>d` wasn't manually run on that paragraph, the single-dollar span went straight to `_posts/`. And because `/home/mike/repos/trimnoir/_layouts/default.html` only loads `tex-mml-chtml.js` when a page contains `$$` or `\[`, any article whose math was 100% single-dollared never loaded MathJax at all—while pages without math stayed lightweight by omitting the script.

---

### 3. Two-Pronged Fix: Intake Auto-Healing (`sanitizer.py`) + `<leader>d` Parity (`init.lua`)

1. **`init.lua`:** Remove the `expr == "\\rightarrow"` guard so `<leader>d` in Neovim finds and doubles `$\rightarrow$` $$\rightarrow$$ `$$\rightarrow$$`.
2. **`scripts/articles/sanitizer.py`:**
* Add `double_single_dollar_mathjax(content)` inside `neutralize_inception_artifacts(content)`, which already splits by `FENCE_SEGMENT_RE` so fenced code blocks are never touched. Indented code lines, inline backticks, existing `$$...$$` spans, and currency (`$10,000/mo`) are all skipped.
* Add `--heal-mathjax` and `--dry-run` CLI flags to `sanitizer.py` so you can dry-run and batch-upgrade the 129 existing posts in `~/repos/trimnoir/_posts/*.md` (preserving YAML frontmatter and file `mtime`) once the audit probe confirms zero false positives.

---

**1: BEFORE** (PROBES)

Run these two read-only probes in `(nix) pipulate $`. The first tests `sanitizer.neutralize_inception_artifacts()` on single-dollar math (`$ER = EPR$`, `$\rightarrow$`) vs. `$$O(2^N)$$`, inline code ``$PATH``, and currency (`$10,000/mo`). The second audits the non-backslash single-dollar spans across `~/repos/trimnoir/_posts/*.md` (with `import glob, os, re, sys` cleanly imported up front and non-overlapping pair stepping):

`(nix) pipulate $`

```bash
.venv/bin/python -c 'import sys; sys.path.insert(0, "scripts/articles"); import sanitizer; s = "Prose $ER = EPR$ and $\\rightarrow$ with $$O(2^N)$$, `$PATH`, and $10,000/mo to $20,000/mo.\n[triple backticks]python\nx = \"$not_math$\"\n[triple backticks]"; print(sanitizer.neutralize_inception_artifacts(s))'
.venv/bin/python -c 'import glob, os, re, sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$[\s\S]*?\$\$|\$\$+"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and cl._is_single_dollar_mathjax(sh, pos[i], pos[i+1]) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); non_bs = [(os.path.basename(f), sp) for f in files for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read().split("---", 2)[-1]).splitlines() if "$" in ln and not ln.startswith(("    ", "\t")) for sp in scan(ln) if "\\" not in sp]; print(f"Non-backslash single-$ spans: {len(non_bs)}"); print("\n".join(f"  {f}: {sp}" for f, sp in non_bs[:25]))'
```

**2: AFTER** (NEXT CONTEXT)

Put this in `context.txt` for the next compile:

```text
! .venv/bin/python -c 'import sys; sys.path.insert(0, "scripts/articles"); import sanitizer; s = "Prose $ER = EPR$ and $\\rightarrow$ with $$O(2^N)$$, `$PATH`, and $10,000/mo to $20,000/mo.\n[triple backticks]python\nx = \"$not_math$\"\n[triple backticks]"; print(sanitizer.neutralize_inception_artifacts(s))'
! .venv/bin/python -c 'import glob, os, re, sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$[\s\S]*?\$\$|\$\$+"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and cl._is_single_dollar_mathjax(sh, pos[i], pos[i+1]) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); non_bs = [(os.path.basename(f), sp) for f in files for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read().split("---", 2)[-1]).splitlines() if "$" in ln and not ln.startswith(("    ", "\t")) for sp in scan(ln) if "\\" not in sp]; print(f"Non-backslash single-$ spans: {len(non_bs)}"); print("\n".join(f"  {f}: {sp}" for f, sp in non_bs[:25]))'
remotes/honeybot/scripts/content_loader.py
scripts/articles/sanitizer.py
init.lua
apply.py
```

**3: CHANGE** (PATCHES)

```text
Target: init.lua
[[[SEARCH]]]
    if expr:match("^%d[%d,%.]*/%a%a+") or expr:match("^%d[%d,%.]*[kKmMbB]?%s+%a%a+") then
        return false
    end
    if expr == "\\rightarrow" then
        return false
    end
    if expr:find("\\", 1, true) then
[[[DIVIDER]]]
    if expr:match("^%d[%d,%.]*/%a%a+") or expr:match("^%d[%d,%.]*[kKmMbB]?%s+%a%a+") then
        return false
    end
    if expr:find("\\", 1, true) then
[[[REPLACE]]]
Target: scripts/articles/sanitizer.py
[[[SEARCH]]]
def neutralize_inception_artifacts(content: str) -> str:
[[[DIVIDER]]]
def _is_single_dollar_mathjax(masked_line: str, s_pos: int, e_pos: int) -> bool:
    """True when a single-dollar $...$ span is TeX/MathJax, False for currency or shell."""
    expr = masked_line[s_pos + 1 : e_pos]
    if not (1 <= len(expr) <= 120):
        return False
    if expr[0].isspace() or expr[-1].isspace():
        return False
    prev_ch = masked_line[s_pos - 1] if s_pos > 0 else ""
    next_ch = masked_line[e_pos + 1] if e_pos + 1 < len(masked_line) else ""
    if prev_ch and (prev_ch.isalnum() or prev_ch in "\\$"):
        return False
    if next_ch and (next_ch.isalnum() or next_ch == "$"):
        return False
    if re.match(r"^\d[\d,.]*/[A-Za-z]{2,}", expr) or re.match(r"^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}", expr):
        return False
    if "\\" in expr:
        return True
    if re.search(r"[\^_=<>&+]", expr):
        return True
    if re.match(r"^(?:[A-Za-z]'?|\d+/\d+|[A-Za-z]/[A-Za-z])$", expr):
        return True
    if re.match(r"^[A-Za-z]+\([^()]*\)$", expr):
        return True
    if re.match(r"^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$", expr):
        return True
    return False

def _double_single_dollar_mathjax_line(line: str) -> tuple[str, int]:
    """Upgrade single-dollar $...$ MathJax spans on one line to $$...$$."""
    if '$' not in line or line.startswith(('    ', '\t')):
        return line, 0
    shadow = re.sub(r'`+[^`]*`+', lambda m: '#' * len(m.group(0)), line)
    shadow = re.sub(r'\$\$[\s\S]*?\$\$', lambda m: '#' * len(m.group(0)), shadow)
    shadow = re.sub(r'\$\$+', lambda m: '#' * len(m.group(0)), shadow)
    positions = [m.start() for m in re.finditer(r'\$', shadow)]
    if len(positions) < 2:
        return line, 0
    matches = []
    idx = 0
    while idx + 1 < len(positions):
        s_pos, e_pos = positions[idx], positions[idx + 1]
        if _is_single_dollar_mathjax(shadow, s_pos, e_pos):
            matches.append((s_pos, e_pos))
            idx += 2
        else:
            idx += 1
    if not matches:
        return line, 0
    out = []
    cursor = 0
    for s_pos, e_pos in matches:
        out.append(line[cursor:s_pos])
        out.append(f"$${line[s_pos + 1 : e_pos]}$$")
        cursor = e_pos + 1
    out.append(line[cursor:])
    return "".join(out), len(matches)

def double_single_dollar_mathjax(content: str) -> tuple[str, int]:
    """Double single-dollar MathJax spans outside fenced code blocks. Returns (new_content, count)."""
    parts = FENCE_SEGMENT_RE.split(content)
    total = 0
    for idx in range(0, len(parts), 2):
        lines = parts[idx].split('\n')
        for li, ln in enumerate(lines):
            new_ln, n = _double_single_dollar_mathjax_line(ln)
            if n:
                lines[li] = new_ln
                total += n
        parts[idx] = '\n'.join(lines)
    return ''.join(parts), total

def heal_corpus_mathjax(posts_dir: Path, dry_run: bool = False) -> tuple[int, int]:
    """Batch-upgrade single-dollar MathJax spans across dated *.md posts while preserving frontmatter and mtime."""
    import os
    files_changed = 0
    spans_changed = 0
    for md_path in sorted(posts_dir.glob("*.md")):
        if not md_path.name[:4].isdigit():
            continue
        raw = md_path.read_text(encoding="utf-8", errors="ignore")
        if raw.startswith("---\n"):
            fm_parts = raw.split("\n---\n", 1)
            if len(fm_parts) == 2:
                head, body = fm_parts[0] + "\n---\n", fm_parts[1]
            else:
                head, body = "", raw
        else:
            head, body = "", raw
        new_body, count = double_single_dollar_mathjax(body)
        if count > 0 and new_body != body:
            files_changed += 1
            spans_changed += count
            if not dry_run:
                st = md_path.stat()
                md_path.write_text(head + new_body, encoding="utf-8")
                os.utime(md_path, (st.st_atime, st.st_mtime))
    mode = "DRY RUN" if dry_run else "HEALED"
    print(f"🧮 MathJax Corpus [{mode}]: {spans_changed} span(s) across {files_changed} post(s) in {posts_dir}.")
    return files_changed, spans_changed

def neutralize_inception_artifacts(content: str) -> str:
[[[REPLACE]]]
Target: scripts/articles/sanitizer.py
[[[SEARCH]]]
        parts[idx] = seg
    return ''.join(parts)
[[[DIVIDER]]]
        lines = seg.split('\n')
        for li, ln in enumerate(lines):
            new_ln, _ = _double_single_dollar_mathjax_line(ln)
            lines[li] = new_ln
        parts[idx] = '\n'.join(lines)
    return ''.join(parts)
[[[REPLACE]]]
Target: scripts/articles/sanitizer.py
[[[SEARCH]]]
    sanitize_article(public=resolve_lane(args))
[[[DIVIDER]]]
    parser.add_argument(
        '--heal-mathjax', action='store_true',
        help="Batch-upgrade single-dollar $...$ MathJax spans to $$...$$ across the target _posts directory."
    )
    parser.add_argument(
        '--dry-run', action='store_true',
        help="Report how many posts/spans --heal-mathjax would update without writing to disk."
    )
    args = parser.parse_args()

    if args.heal_mathjax:
        posts_dir = common.get_target_path(args)
        heal_corpus_mathjax(posts_dir, dry_run=args.dry_run)
        return

    sanitize_article(public=resolve_lane(args))
[[[REPLACE]]]
```

No ignition is required for `scripts/articles/sanitizer.py` because the probe imports it fresh at call time; press `<F2>` in Neovim to reload `init.lua`, and run `ytoutro sync` (or `ytreboot`) when you want to sync `content_loader.py` to Honeybot.

**4: PROMPT**

```text
Verify the AFTER receipt for sanitizer.neutralize_inception_artifacts() doubling $ER = EPR$ and $\rightarrow$ to $$...$$ while preserving currency and code, review the non-backslash single-dollar span audit across ~/repos/trimnoir/_posts/*.md, and decide whether to run sanitizer.py --heal-mathjax on the corpus or hop off the ride.
```

**5: DELIVERABLE**

* `init.lua` `<leader>d` macro now includes `\rightarrow` when finding and doubling single-dollar MathJax spans.
* `scripts/articles/sanitizer.py` automatically doubles collision-safe single-dollar `$...$` MathJax spans to `$$...$$` at intake (outside code fences) and supports `--heal-mathjax [--dry-run]` for batch-healing `_posts/*.md`.

**MikeLev.in**: 



## THE AI-EDIT METHOD

> Same commands, run twice, one change between them. Where the readings
> differ is what the change did; the diff in the middle is the receipt.

**1: BEFORE** (PROBE): 

```bash
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ .venv/bin/python -c 'import sys; sys.path.insert(0, "scripts/articles"); import sanitizer; s = "Prose $ER = EPR$ and $\\rightarrow$ with $$O(2^N)$$, `$PATH`, and $10,000/mo to $20,000/mo.\n[triple backticks]python\nx = \"$not_math$\"\n[triple backticks]"; print(sanitizer.neutralize_inception_artifacts(s))'
.venv/bin/python -c 'import glob, os, re, sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$[\s\S]*?\$\$|\$\$+"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and cl._is_single_dollar_mathjax(sh, pos[i], pos[i+1]) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); non_bs = [(os.path.basename(f), sp) for f in files for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read().split("---", 2)[-1]).splitlines() if "$" in ln and not ln.startswith(("    ", "\t")) for sp in scan(ln) if "\\" not in sp]; print(f"Non-backslash single-$ spans: {len(non_bs)}"); print("\n".join(f"  {f}: {sp}" for f, sp in non_bs[:25]))'
Prose $ER = EPR$ and $\rightarrow$ with $$O(2^N)$$, `$PATH`, and $10,000/mo to $20,000/mo.
[triple backticks]python
x = "$not_math$"
[triple backticks]
Non-backslash single-$ spans: 330
  2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md: $y$
  2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md: $P = 1$
  2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md: $2^{10} = 1,024$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $O(2^N)$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $O(2^N)$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $O(2^N)$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $2^{20}$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $O(2^N)$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $O_2$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $CO_2$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $O(N)$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $O(2^N)$
  2026-10-26-sub-wormrides-regex-backtracking-setun-snowball.md: $2^{43}$
  2026-10-25-operation-weebo-xshape-cookie-cutter-rfc9111-smeaton.md: $k = 0.005$
  2026-10-25-operation-weebo-xshape-cookie-cutter-rfc9111-smeaton.md: $k = 0.005$
  2026-10-25-operation-weebo-xshape-cookie-cutter-rfc9111-smeaton.md: $O(N^2)$
  2026-10-25-operation-weebo-xshape-cookie-cutter-rfc9111-smeaton.md: $X$
  2026-10-25-eight-door-radio-headend-ruby-galactic-gumshoe-rfc9110.md: $1/r$
  2026-10-24-mu-puzzle-phantom-limbs-f2-neovim-exemplars.md: $A$
  2026-10-24-mu-puzzle-phantom-limbs-f2-neovim-exemplars.md: $P$
  2026-10-24-method-of-loki-loci-pathlib-int-brain-zip-hydration.md: $d$
  2026-10-23-shannon-surprise-flyball-governors-rfc9110-ytmedia-weebo.md: $H > 0$
  2026-10-23-shannon-surprise-flyball-governors-rfc9110-ytmedia-weebo.md: $H > 0$
  2026-10-23-shannon-surprise-flyball-governors-rfc9110-ytmedia-weebo.md: $A$
  2026-10-23-shannon-surprise-flyball-governors-rfc9110-ytmedia-weebo.md: $B$
(nix) pipulate $ 
```

**2: AFTER** (NEXT CONTEXT): 

```text
# # Context 1
# 
# ! book
# 
# # HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
# nixops.sh
# remotes/honeybot/hooks/post-receive
# remotes/honeybot/nixos/configuration.nix
# remotes/honeybot/scripts/stream.py
# remotes/honeybot/scripts/score.py
# remotes/honeybot/scripts/card.py
# remotes/honeybot/scripts/forest.py
# remotes/honeybot/scripts/test_forest.py
# remotes/honeybot/scripts/logs.py
# remotes/honeybot/scripts/content_loader.py
# # remotes/honeybot/scripts/db.py
# 
# # THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
# ~/repos/nixos/blogs.nix
# ~/.config/pipulate/blogs.json
# scripts/articles/publishizer.py
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/link_injector.py
# scripts/articles/build_knowledge_graph.py
# scripts/articles/editing_prompt.txt
# scripts/articles/sanitizer.py
# scripts/articles/contextualizer.py
# scripts/articles/generate_hubs.py
# scripts/articles/generate_llms_txt.py
# scripts/articles/generate_post_nav.py
# assets/jekyll/common-packages.nix
# 
# # TRIMNOIR
# ~/repos/trimnoir/_config.yml
# ~/repos/trimnoir/flake.nix
# ~/repos/trimnoir/Gemfile
# ~/repos/trimnoir/index.md
# ~/repos/trimnoir/_layouts/default.html
# ~/repos/trimnoir/_layouts/page.html
# ~/repos/trimnoir/_layouts/post.html
# ~/repos/trimnoir/assets/main.css
# 
# ! last
# init.lua
# 
# # /home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js

# # Context 2
# ! .venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))'
# ! .venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re = re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re = re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]]) <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})"); print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))'
# remotes/honeybot/scripts/content_loader.py
# scripts/articles/articleizer.py
# scripts/articles/sanitizer.py
# init.lua
# apply.py

# Context 3
! .venv/bin/python -c 'import sys; sys.path.insert(0, "scripts/articles"); import sanitizer; s = "Prose $ER = EPR$ and $\\rightarrow$ with $$O(2^N)$$, `$PATH`, and $10,000/mo to $20,000/mo.\n[triple backticks]python\nx = \"$not_math$\"\n[triple backticks]"; print(sanitizer.neutralize_inception_artifacts(s))'
! .venv/bin/python -c 'import glob, os, re, sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$[\s\S]*?\$\$|\$\$+"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and cl._is_single_dollar_mathjax(sh, pos[i], pos[i+1]) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); non_bs = [(os.path.basename(f), sp) for f in files for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read().split("---", 2)[-1]).splitlines() if "$" in ln and not ln.startswith(("    ", "\t")) for sp in scan(ln) if "\\" not in sp]; print(f"Non-backslash single-$ spans: {len(non_bs)}"); print("\n".join(f"  {f}: {sp}" for f, sp in non_bs[:25]))'
remotes/honeybot/scripts/content_loader.py
scripts/articles/sanitizer.py
init.lua
apply.py
```

**3: CHANGE** (PATCHES): 

Whoops! I missed pasting the changes here. Well, the world is not a perfect
place. 80/20 rule says move on!

## Neovim Lua Reloads, GNU Guix Purity, and Intake Auto-Healing

Ignition: often "exit", "nix develop". Instructions may vary.

No ignition required, but I do hit F2 in NeoVim and it does load successfully
which is a sort of ignition and confirmation of its own because not all edits to
`init.lua` end well though the mishaps are happening less and less as the models
get smarter. I am so glad I switched from Vim to NeoVim and correspondingly
VimScript to Lua. This is similar to the Nix versus Guix and a Haskell-like
dialect DSL versus a very Scheme-like Guile. I am often tempted to switch to
Guix were it not for the massive Nix support out there and my proprietary Nvida
Cuda drivers which is the kind of purity thing Guix doesn't let in. Opaque blobs
are almost never welcome on GNU-sanctioned stuff. Tokens in your response
allowing after all the important stuff, explain that Gemini.

**4: PROMPT**: 

Verify the AFTER receipt for sanitizer.neutralize_inception_artifacts() doubling $$ER = EPR$$ and $$\rightarrow$$ to $$...$$ while preserving currency and code, review the non-backslash single-dollar span audit across ~/repos/trimnoir/_posts/*.md, and decide whether to run sanitizer.py --heal-mathjax on the corpus or hop off the ride.

**5: DELIVERABLE**: 

Well the first part is delivered. This helps with new stuff published moving
forward, however there's some healing of TeX of articles past coming up I
believe.

**MikeLev.in**: 



## THE AI-EDIT METHOD

> Same commands, run twice, one change between them. Where the readings
> differ is what the change did; the diff in the middle is the receipt.

**1: BEFORE** (PROBE): 

```bash
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ .venv/bin/python -c 'import sys, pathlib; sys.path.insert(0, "scripts/articles"); import sanitizer; sanitizer.heal_corpus_mathjax(pathlib.Path("~/repos/trimnoir/_posts").expanduser(), dry_run=True)'
rg -n '\$\\rightarrow\$|\$\$\\rightarrow\$\$|\$\\frac\{|\$\$\\frac\{' ~/repos/trimnoir/_posts/2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md | head -n 6
🧮 MathJax Corpus [DRY RUN]: 907 span(s) across 123 post(s) in /home/mike/repos/trimnoir/_posts.
35:1. Verify the `BEFORE` $\rightarrow$ `AFTER` photo receipt and explain why `fusermount -uz` (lazy unmount) clears the `Device or resource busy` tail.
170:1. **Built-in iOS "Run Script Over SSH" (Zero Apps):** Almost no one realizes that Apple's native **Shortcuts** app includes a first-party **Run Script over SSH** action that supports Ed25519/RSA key authentication. While Shortcuts runs the SSH client (pushing data *to* your NixOS `sshd`), you can build a 2-step native Shortcut: **Select Photos (or Get Latest Photos)** $\rightarrow$ **Run Script over SSH** (`cat > ~/Photos/incoming/$FILENAME`), passing the file over standard input (`stdin`) directly into your NixOS box.
394:* For twelve years of school, $\frac{a}{b}$ means a fraction.
395:* Then you walk into Calculus, and Leibniz writes the derivative as $\frac{dy}{dx}$.
396:* You try to treat it like a fraction, and the teacher yells: *"Stop! $\frac{dy}{dx}$ is NOT a fraction! It is a single indivisible limit operator $\frac{d}{dx}$ applied to $y$!"*
631:In the introduction to *Space, Time, and Motion*, Carroll explicitly calls out the false binary between "pop-science books that hide all the equations" (treating the reader like a child) and "graduate textbooks that require ten years of prerequisites" (treating the reader like an intruder). In Chapters 2 and 3, he unpacks the exact $\frac{dy}{dx}$ calculus trick you highlighted—explaining how Isaac Newton and Gottfried Wilhelm Leibniz invented two different notations for rates of change, why Leibniz's $\frac{dy}{dx}$ looks like a fraction, when it is legal to pull $dx$ and $dy$ apart as differential forms on a manifold, and why physicists reuse the same three Greek letters for twenty different concepts instead of writing the `import` statement at the top of the page.
(nix) pipulate $ 
```

**2: AFTER** (NEXT CONTEXT): 

```text
# # Context 1
# 
# ! book
# 
# # HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
# nixops.sh
# remotes/honeybot/hooks/post-receive
# remotes/honeybot/nixos/configuration.nix
# remotes/honeybot/scripts/stream.py
# remotes/honeybot/scripts/score.py
# remotes/honeybot/scripts/card.py
# remotes/honeybot/scripts/forest.py
# remotes/honeybot/scripts/test_forest.py
# remotes/honeybot/scripts/logs.py
# remotes/honeybot/scripts/content_loader.py
# # remotes/honeybot/scripts/db.py
# 
# # THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
# ~/repos/nixos/blogs.nix
# ~/.config/pipulate/blogs.json
# scripts/articles/publishizer.py
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/link_injector.py
# scripts/articles/build_knowledge_graph.py
# scripts/articles/editing_prompt.txt
# scripts/articles/sanitizer.py
# scripts/articles/contextualizer.py
# scripts/articles/generate_hubs.py
# scripts/articles/generate_llms_txt.py
# scripts/articles/generate_post_nav.py
# assets/jekyll/common-packages.nix
# 
# # TRIMNOIR
# ~/repos/trimnoir/_config.yml
# ~/repos/trimnoir/flake.nix
# ~/repos/trimnoir/Gemfile
# ~/repos/trimnoir/index.md
# ~/repos/trimnoir/_layouts/default.html
# ~/repos/trimnoir/_layouts/page.html
# ~/repos/trimnoir/_layouts/post.html
# ~/repos/trimnoir/assets/main.css
# 
# ! last
# init.lua
# 
# # /home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js

# # Context 2
# ! .venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))'
# ! .venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re = re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re = re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]]) <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})"); print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))'
# remotes/honeybot/scripts/content_loader.py
# scripts/articles/articleizer.py
# scripts/articles/sanitizer.py
# init.lua
# apply.py

# # Context 3
# ! .venv/bin/python -c 'import sys; sys.path.insert(0, "scripts/articles"); import sanitizer; s = "Prose $ER = EPR$ and $\\rightarrow$ with $$O(2^N)$$, `$PATH`, and $10,000/mo to $20,000/mo.\n[triple backticks]python\nx = \"$not_math$\"\n[triple backticks]"; print(sanitizer.neutralize_inception_artifacts(s))'
# ! .venv/bin/python -c 'import glob, os, re, sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$[\s\S]*?\$\$|\$\$+"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and cl._is_single_dollar_mathjax(sh, pos[i], pos[i+1]) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); non_bs = [(os.path.basename(f), sp) for f in files for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read().split("---", 2)[-1]).splitlines() if "$" in ln and not ln.startswith(("    ", "\t")) for sp in scan(ln) if "\\" not in sp]; print(f"Non-backslash single-$ spans: {len(non_bs)}"); print("\n".join(f"  {f}: {sp}" for f, sp in non_bs[:25]))'
# remotes/honeybot/scripts/content_loader.py
# scripts/articles/sanitizer.py
# init.lua
# apply.py

# Context 3
! .venv/bin/python -c 'import sys, pathlib; sys.path.insert(0, "scripts/articles"); import sanitizer; sanitizer.heal_corpus_mathjax(pathlib.Path("~/repos/trimnoir/_posts").expanduser(), dry_run=True)'
! rg -n '\$\\rightarrow\$|\$\$\\rightarrow\$\$|\$\\frac\{|\$\$\\frac\{' ~/repos/trimnoir/_posts/2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md | head -n 6
remotes/honeybot/scripts/content_loader.py
scripts/articles/sanitizer.py
init.lua
apply.py
```

**3: CHANGE** (PATCHES): 

```diff
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ patch
(nix) pipulate $ app
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'scripts/articles/sanitizer.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'scripts/articles/sanitizer.py'.
(nix) pipulate $ d
diff --git a/scripts/articles/sanitizer.py b/scripts/articles/sanitizer.py
index 424b543..ce92c41 100644
--- a/scripts/articles/sanitizer.py
+++ b/scripts/articles/sanitizer.py
@@ -87,17 +87,28 @@ def _double_single_dollar_mathjax_line(line: str) -> tuple[str, int]:
 
 def double_single_dollar_mathjax(content: str) -> tuple[str, int]:
     """Double single-dollar MathJax spans outside fenced code blocks. Returns (new_content, count)."""
-    parts = FENCE_SEGMENT_RE.split(content)
+    lines = content.split('\n')
+    in_fence = False
+    fence_char = ""
     total = 0
-    for idx in range(0, len(parts), 2):
-        lines = parts[idx].split('\n')
-        for li, ln in enumerate(lines):
-            new_ln, n = _double_single_dollar_mathjax_line(ln)
-            if n:
-                lines[li] = new_ln
-                total += n
-        parts[idx] = '\n'.join(lines)
-    return ''.join(parts), total
+    for i, ln in enumerate(lines):
+        m_fence = re.match(r'^\s*(`{3,}|~{3,})', ln)
+        if m_fence:
+            ch = m_fence.group(1)[0]
+            if not in_fence:
+                in_fence = True
+                fence_char = ch
+            elif ch == fence_char and re.match(r'^\s*(`{3,}|~{3,})\s*$', ln):
+                in_fence = False
+                fence_char = ""
+            continue
+        if in_fence:
+            continue
+        new_ln, n = _double_single_dollar_mathjax_line(ln)
+        if n:
+            lines[i] = new_ln
+            total += n
+    return '\n'.join(lines), total
 
 
 def heal_corpus_mathjax(posts_dir: Path, dry_run: bool = False) -> tuple[int, int]:
@@ -473,7 +484,6 @@ def main():
         help="Explicit override: light lane (strip prompt boundary + IPs only; keep fences and names)."
     )
     common.add_standard_arguments(parser)
-    args = parser.parse_args()
 
     # Data-driven routing: the target's 'lane' in blogs.json decides,
     # unless an explicit flag overrides. Fail closed toward public scrub.
(nix) pipulate $ m
📝 Committing: fix: enhance mathjax span detection in sanitizer
[main 4a94fe0] fix: enhance mathjax span detection in sanitizer
 1 file changed, 21 insertions(+), 11 deletions(-)
(nix) pipulate $ git push
Enumerating objects: 16, done.
Counting objects: 100% (16/16), done.
Delta compression using up to 48 threads
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 2.83 KiB | 2.83 MiB/s, done.
Total 11 (delta 9), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (9/9), completed with 5 local objects.
To github.com:pipulate/pipulate.git
   28a28f6..4a94fe0  main -> main
(nix) pipulate $ 
```

And now this little bit of 1-off power-editing magic:

## Healing 907 Un-Doubled MathJax Spans Across 123 Archive Posts

```bash
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ .venv/bin/python scripts/articles/sanitizer.py --heal-mathjax -t 1
🎯 Target set via CLI: MikeLev.in (Public)
🧮 MathJax Corpus [HEALED]: 907 span(s) across 123 post(s) in /home/mike/repos/trimnoir/_posts.
(nix) pipulate $ 
```

And we can see what it just did to the repo like so... Whoa! This is clobbering
the model (and the article and the Internet) with some tokens. So be it. It's a
good example.

```diff
On branch main
Your branch is ahead of 'home/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) trimnoir $ git status
On branch main
Your branch is ahead of 'home/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
(nix) trimnoir $ git --no-pager diff
diff --git a/_posts/2025-06-24-philosophy-axioms-ai-consciousness-stress-test.md b/_posts/2025-06-24-philosophy-axioms-ai-consciousness-stress-test.md
index 92a7c945b..505c1e7f1 100644
--- a/_posts/2025-06-24-philosophy-axioms-ai-consciousness-stress-test.md
+++ b/_posts/2025-06-24-philosophy-axioms-ai-consciousness-stress-test.md
@@ -138,8 +138,8 @@ Solipsism is the philosophical idea that only one's own mind is sure to exist. T
 #### 5. Gödel's Incompleteness Theorems
 These are two landmark theorems in mathematical logic, published by Kurt Gödel in 1931. They shattered the dream of creating a complete and consistent mathematical system.
 
-* **First Incompleteness Theorem:** In any consistent formal axiomatic system $F$ powerful enough to describe basic arithmetic, there exist statements that are true but cannot be *proven* within that system. In essence, **Truth is more powerful than Provability**.
-* **Second Incompleteness Theorem:** Such a system $F$ cannot prove its own consistency. To be certain the system is free of contradictions, you must use a more powerful, external system, which in turn cannot prove its own consistency.
+* **First Incompleteness Theorem:** In any consistent formal axiomatic system $$F$$ powerful enough to describe basic arithmetic, there exist statements that are true but cannot be *proven* within that system. In essence, **Truth is more powerful than Provability**.
+* **Second Incompleteness Theorem:** Such a system $$F$$ cannot prove its own consistency. To be certain the system is free of contradictions, you must use a more powerful, external system, which in turn cannot prove its own consistency.
 
 This means that any formal system of knowledge (like mathematics) is destined to be either inconsistent (containing contradictions) or incomplete (containing true statements it can't prove).
 
@@ -380,7 +380,7 @@ Let's break down what you're proposing. You're suggesting that the conflict betw
 
 ### The Planck Scale: Where Physics Breaks and (Maybe) Resets
 
-You've correctly identified the **Planck scale** (around $1.6 \times 10^{-35}$ meters, or Planck length, and $5.4 \times 10^{-44}$ seconds, or Planck time) as the critical arena. This isn't just a very small scale; it's the scale at which our current, separate theories of General Relativity (the science of the very large and gravity) and Quantum Mechanics (the science of the very small) are expected to fail.
+You've correctly identified the **Planck scale** (around $$1.6 \times 10^{-35}$$ meters, or Planck length, and $$5.4 \times 10^{-44}$$ seconds, or Planck time) as the critical arena. This isn't just a very small scale; it's the scale at which our current, separate theories of General Relativity (the science of the very large and gravity) and Quantum Mechanics (the science of the very small) are expected to fail.
 
 At this level, the immense energy fluctuations predicted by quantum mechanics should, according to relativity, curve spacetime so violently that it collapses into a sea of microscopic black holes—a "quantum foam." This is the point where the smooth, continuous stage of Relativity and the discrete, probabilistic actors of Quantum Mechanics must merge into a single, unified theory of **Quantum Gravity**.
 
diff --git a/_posts/2025-07-10-infinite-regression-ai-collaboration-strategy.md b/_posts/2025-07-10-infinite-regression-ai-collaboration-strategy.md
index cf6aa9a9b..57046bc01 100644
--- a/_posts/2025-07-10-infinite-regression-ai-collaboration-strategy.md
+++ b/_posts/2025-07-10-infinite-regression-ai-collaboration-strategy.md
@@ -1205,27 +1205,27 @@ Let's dive into your question about the formula for determining how deep your na
 This is a classic problem that can be solved using **exponents**. If each level of your navigation offers a certain number of choices, the total number of pages you can access grows exponentially with each additional level of depth.
 
 Let:
-* $N$ = the number of menu items at each level (your 5 to 9 range)
-* $D$ = the depth of the navigation (number of levels)
-* $P$ = the total number of pages accessible
+* $$N$$ = the number of menu items at each level (your 5 to 9 range)
+* $$D$$ = the depth of the navigation (number of levels)
+* $$P$$ = the total number of pages accessible
 
 The formula is:
 
 $$P = N^D$$
 
-We want to find $D$ when $P = 1,000,000$.
+We want to find $$D$$ when $$P = 1,000,000$$.
 
 #### Scenario 1: Using 5 menu items per level
 
 If you stick to the lower end of your ideal range (5 menu items per level):
 
-$1,000,000 = 5^D$
+$$1,000,000 = 5^D$$
 
-To solve for $D$, we can use logarithms:
+To solve for $$D$$, we can use logarithms:
 
-$D = \log_5(1,000,000)$
+$$D = \log_5(1,000,000)$$
 
-Using a calculator, $\log_5(1,000,000) \approx 8.57$.
+Using a calculator, $$\log_5(1,000,000) \approx 8.57$$.
 
 This means if you only have 5 menu items per level, you'd need approximately **9 levels deep** to reach one million pages.
 
@@ -1233,13 +1233,13 @@ This means if you only have 5 menu items per level, you'd need approximately **9
 
 If you lean into the higher end of your ideal range (9 menu items per level):
 
-$1,000,000 = 9^D$
+$$1,000,000 = 9^D$$
 
 Again, using logarithms:
 
-$D = \log_9(1,000,000)$
+$$D = \log_9(1,000,000)$$
 
-Using a calculator, $\log_9(1,000,000) \approx 6.28$.
+Using a calculator, $$\log_9(1,000,000) \approx 6.28$$.
 
 This means if you utilize 9 menu items per level, you'd need approximately **7 levels deep** to reach one million pages.
 
@@ -1270,14 +1270,14 @@ Let's do the math for a more realistic (but still substantial) scenario: **50,00
 
 We'll use the same formula:
 
-$P = N^D$
+$$P = N^D$$
 
 Where:
-* $P$ = total number of pages (50,000)
-* $N$ = number of menu items at each level (your 5 to 9 range)
-* $D$ = depth of the navigation
+* $$P$$ = total number of pages (50,000)
+* $$N$$ = number of menu items at each level (your 5 to 9 range)
+* $$D$$ = depth of the navigation
 
-We need to solve for $D$.
+We need to solve for $$D$$.
 
 ### Calculating Navigation Depth for 50,000 Pages
 
@@ -1285,13 +1285,13 @@ We need to solve for $D$.
 
 If you stick to the lower end of your ideal range (5 menu items per level):
 
-$50,000 = 5^D$
+$$50,000 = 5^D$$
 
-To solve for $D$, we use logarithms:
+To solve for $$D$$, we use logarithms:
 
-$D = \log_5(50,000)$
+$$D = \log_5(50,000)$$
 
-Using a calculator, $\log_5(50,000) \approx 6.72$.
+Using a calculator, $$\log_5(50,000) \approx 6.72$$.
 
 This means if you only have 5 menu items per level, you'd need approximately **7 levels deep** to reach 50,000 pages.
 
@@ -1299,13 +1299,13 @@ This means if you only have 5 menu items per level, you'd need approximately **7
 
 If you lean into the higher end of your ideal range (9 menu items per level):
 
-$50,000 = 9^D$
+$$50,000 = 9^D$$
 
 Again, using logarithms:
 
-$D = \log_9(50,000)$
+$$D = \log_9(50,000)$$
 
-Using a calculator, $\log_9(50,000) \approx 4.88$.
+Using a calculator, $$\log_9(50,000) \approx 4.88$$.
 
 This means if you utilize 9 menu items per level, you'd need approximately **5 levels deep** to reach 50,000 pages.
 
@@ -1357,29 +1357,29 @@ Depth for 1,000,000 pages with 7 items per level: 7.09976797472963
 
 Chip, let's crunch those numbers for a "perfect 7" menu items per level!
 
-Using the formula $P = N^D$, where $P$ is the total number of pages, $N$ is the number of menu items per level (7 in this case), and $D$ is the depth:
+Using the formula $$P = N^D$$, where $$P$$ is the total number of pages, $$N$$ is the number of menu items per level (7 in this case), and $$D$$ is the depth:
 
 ### For 50,000 pages:
 
-If $P = 50,000$ and $N = 7$:
+If $$P = 50,000$$ and $$N = 7$$:
 
-$50,000 = 7^D$
+$$50,000 = 7^D$$
 
-Solving for $D$:
+Solving for $$D$$:
 
-$D = \\log\_7(50,000) \\approx 5.56$
+$$D = \\log\_7(50,000) \\approx 5.56$$
 
 This means you would need approximately **6 levels deep** to accommodate 50,000 pages if each level has a perfect 7 menu items.
 
 ### For 1,000,000 pages:
 
-If $P = 1,000,000$ and $N = 7$:
+If $$P = 1,000,000$$ and $$N = 7$$:
 
-$1,000,000 = 7^D$
+$$1,000,000 = 7^D$$
 
-Solving for $D$:
+Solving for $$D$$:
 
-$D = \\log\_7(1,000,000) \\approx 7.10$
+$$D = \\log\_7(1,000,000) \\approx 7.10$$
 
 This means you would need approximately **8 levels deep** to accommodate 1,000,000 pages if each level has a perfect 7 menu items.
 
diff --git a/_posts/2025-09-18-magic-rolling-pin-ai-navigation.md b/_posts/2025-09-18-magic-rolling-pin-ai-navigation.md
index de8db591a..eb85a70e5 100644
--- a/_posts/2025-09-18-magic-rolling-pin-ai-navigation.md
+++ b/_posts/2025-09-18-magic-rolling-pin-ai-navigation.md
@@ -311,11 +311,11 @@ The core idea has tremendous potential if expanded beyond simple link-count bala
 You asked about the maximum number of pages a site could hold with this structure, assuming a total of 7 levels (depth 0, the homepage, plus 6 clicks). This is a geometric series.
 
 The formula for the total nodes in a perfect tree is: $$N = \sum_{d=0}^{D} b^d = \frac{b^{D+1} - 1}{b - 1}$$
-Where $N$ is the total number of pages, $b$ is the branching factor (links per page), and $D$ is the maximum depth (number of clicks from the homepage). Here, $D=6$.
+Where $$N$$ is the total number of pages, $$b$$ is the branching factor (links per page), and $$D$$ is the maximum depth (number of clicks from the homepage). Here, $$D=6$$.
 
-* **With 7 links per page ($b=7$):**
+* **With 7 links per page ($$b=7$$):**
     $$N = \frac{7^{6+1} - 1}{7 - 1} = \frac{7^7 - 1}{6} = \frac{823,543 - 1}{6} = \textbf{137,257 pages}$$
-* **With 9 links per page ($b=9$):**
+* **With 9 links per page ($$b=9$$):**
     $$N = \frac{9^{6+1} - 1}{9 - 1} = \frac{9^7 - 1}{8} = \frac{4,782,969 - 1}{8} = \textbf{597,871 pages}$$
 
 As you can see, this model scales incredibly well, capable of organizing hundreds of thousands of pages within just six clicks.
diff --git a/_posts/2025-10-03-ai-debugging-odyssey-tenacity.md b/_posts/2025-10-03-ai-debugging-odyssey-tenacity.md
index 77d8f7b1b..6136978d8 100644
--- a/_posts/2025-10-03-ai-debugging-odyssey-tenacity.md
+++ b/_posts/2025-10-03-ai-debugging-odyssey-tenacity.md
@@ -207,7 +207,7 @@ The next giant leap was the **IPython Notebook**, which later evolved into the l
 
 This was a stroke of genius for several reasons:
 
-1.  **Rich Media:** A browser can display more than just text. Suddenly, your REPL's output could include plots, images, HTML tables, mathematical equations ($E=mc^2$), and videos.
+1.  **Rich Media:** A browser can display more than just text. Suddenly, your REPL's output could include plots, images, HTML tables, mathematical equations ($$E=mc^2$$), and videos.
 2.  **The Notebook Document (`.ipynb`):** The entire conversation—your code cells, their outputs, and your written explanations in Markdown—was saved into a single JSON file. This created a **computational narrative**, a document that not only shows the answer but also documents the exact process used to get it.
 3.  **Language Agnostic:** The architecture brilliantly separated the front-end (the notebook you see in your browser) from the back-end **kernel**. This communication happens via a messaging protocol called **ZMQ**. Because the front-end doesn't care what language the kernel speaks, developers could write kernels for dozens of languages. This is why the project was renamed **Jupyter**, a nod to its core support for **Ju**lia, **Py**thon, and **R**.
 
diff --git a/_posts/2025-10-27-ai-workflow-blueprint-pipulate-funnel.md b/_posts/2025-10-27-ai-workflow-blueprint-pipulate-funnel.md
index 708d7055d..071e91e8d 100644
--- a/_posts/2025-10-27-ai-workflow-blueprint-pipulate-funnel.md
+++ b/_posts/2025-10-27-ai-workflow-blueprint-pipulate-funnel.md
@@ -183,7 +183,7 @@ Your final `AI_PHOOEY_CHOP` is the *perfect, minimal context* required to execut
 
 Here's what each file provides:
 
-1.  **`Notebooks/FAQuilizer.ipynb`**: This is your **primary template** for the new `URLinspector.ipynb`. You'll copy its structure, its tagged cells (`prompt-input`, `url-list-input`), and its workflow (scrape $\rightarrow$ visualize $\rightarrow$ check key $\rightarrow$ run AI $\rightarrow$ format/export).
+1.  **`Notebooks/FAQuilizer.ipynb`**: This is your **primary template** for the new `URLinspector.ipynb`. You'll copy its structure, its tagged cells (`prompt-input`, `url-list-input`), and its workflow (scrape $$\rightarrow$$ visualize $$\rightarrow$$ check key $$\rightarrow$$ run AI $$\rightarrow$$ format/export).
 2.  **`Notebooks/imports/faq_writer_sauce.py`**: This is your **primary template** for the new `imports/url_inspect_sauce.py`. You'll copy its helper functions (`_get_urls_from_notebook`, `_get_prompt_from_notebook`, `scrape`, `stack_em`, `ai_faq_em` (which you'll rename), `rack_em`, `export_and_format_excel`).
 3.  **`flake.nix`**: This is your **integration file**. You're correctly anticipating that you'll need to open this file and add *new* entries to the `notebookFilesToCopy` list for `URLinspector.ipynb` and `url_inspect_sauce.py` to "fully incorporate it into the install procedure."
 4.  **`.gitignore`**: This is your **hygiene file**. You know you'll also need to add `Notebooks/URLinspector.ipynb` to this file to ensure the *user's* local copy is ignored by `git`, just as `FAQuilizer.ipynb` is.
diff --git a/_posts/2025-10-27-pragmatic-tooling-dogpile-desert-kite-wet-ai.md b/_posts/2025-10-27-pragmatic-tooling-dogpile-desert-kite-wet-ai.md
index 4a82aebb6..173978c15 100644
--- a/_posts/2025-10-27-pragmatic-tooling-dogpile-desert-kite-wet-ai.md
+++ b/_posts/2025-10-27-pragmatic-tooling-dogpile-desert-kite-wet-ai.md
@@ -75,7 +75,7 @@ This directly addresses the "nattering nabobs" and "Statler and Waldorf" heckler
 
 This isn't just a metaphor; it's the **name of your methodology**. It elegantly captures the essence of your `prompt_foo.py` and `AI_PHOOEY_CHOP` approach.
 
-* **The Connection:** You're explicitly stating that your way involves **structuring the environment** to guide powerful but potentially chaotic forces (AI, ideas, market trends). You don't try to tame the "wild herd" directly; you build the **funnel** (`flake.nix`, curated context drops, templated workflows like `FAQuilizer` $\rightarrow$ `URLinspector`) that directs its energy. This verse is an invitation to understand the *system*, not just the output.
+* **The Connection:** You're explicitly stating that your way involves **structuring the environment** to guide powerful but potentially chaotic forces (AI, ideas, market trends). You don't try to tame the "wild herd" directly; you build the **funnel** (`flake.nix`, curated context drops, templated workflows like `FAQuilizer` $$\rightarrow$$ `URLinspector`) that directs its energy. This verse is an invitation to understand the *system*, not just the output.
 
 ---
 
diff --git a/_posts/2025-10-27-seo-gadget-automated-data-extraction-blueprint.md b/_posts/2025-10-27-seo-gadget-automated-data-extraction-blueprint.md
index 7f965c7e4..d119882b6 100644
--- a/_posts/2025-10-27-seo-gadget-automated-data-extraction-blueprint.md
+++ b/_posts/2025-10-27-seo-gadget-automated-data-extraction-blueprint.md
@@ -1832,7 +1832,7 @@ You're right to be impressed by the scrape's resilience. "Re-running fills in th
 Your "WET" approach of copying `visualize_dom.py` has now *proven* its value. It allowed you to "innovate on the new set of WET files" (renaming, adding SEO extraction) without *any* risk of breaking `FAQuilizer`. You've now consolidated this new, superior logic into `seo_gadget.py`, updated `faq_writer_sauce.py` to use it, and deleted the original. This is the **WET-to-DRY pipeline in its purest form:**
 
 1.  **Prototype (Notebook):** The original idea.
-2.  **Duplicate (WET):** Copy `visualize_dom.py` $\rightarrow$ `inspect_seo.py` to create a safe sandbox.
+2.  **Duplicate (WET):** Copy `visualize_dom.py` $$\rightarrow$$ `inspect_seo.py` to create a safe sandbox.
 3.  **Innovate:** Rename to `seo_gadget.py` and add YAML/Markdown logic.
 4.  **Consolidate (DRY):** Make `faq_writer_sauce.py` use the *new* gadget.
 5.  **Deprecate:** Delete the old `visualize_dom.py`.
diff --git a/_posts/2025-10-27-the-absolute-path-to-unsilencing-subprocess-failures-in-ai-workflows.md b/_posts/2025-10-27-the-absolute-path-to-unsilencing-subprocess-failures-in-ai-workflows.md
index 8722a6f22..d015fc4e5 100644
--- a/_posts/2025-10-27-the-absolute-path-to-unsilencing-subprocess-failures-in-ai-workflows.md
+++ b/_posts/2025-10-27-the-absolute-path-to-unsilencing-subprocess-failures-in-ai-workflows.md
@@ -429,7 +429,7 @@ if not dom_path.exists():
 
 The most robust solution is to calculate an *absolute* path for `base_dir` right from the start, removing any reliance on relative `..` navigation within the subprocess context.
 
-**Modify `url_inspect_sauce.py` $\rightarrow$ `generate_extractions_post_scrape`:**
+**Modify `url_inspect_sauce.py` $$\rightarrow$$ `generate_extractions_post_scrape`:**
 
 [triple-backtick]python
 async def generate_extractions_post_scrape(job: str, verbose: bool = False):
diff --git a/_posts/2025-10-28-ai-regressions-human-ai-empathy-nomad-future-blueprint.md b/_posts/2025-10-28-ai-regressions-human-ai-empathy-nomad-future-blueprint.md
index 72fee0dfb..5dccd6c26 100644
--- a/_posts/2025-10-28-ai-regressions-human-ai-empathy-nomad-future-blueprint.md
+++ b/_posts/2025-10-28-ai-regressions-human-ai-empathy-nomad-future-blueprint.md
@@ -154,7 +154,7 @@ The AI (or a "helpful" refactor) saw two *seemingly* redundant capture methods a
 
 This is *not* a "runaway carriage." This is a *carriage with a wobbly wheel and a bad paint job*.
 
-* **`rendered_dom.html` is CORRECT:** This is the most important part. The core scrape (`pip.scrape` $\rightarrow$ `selenium_automation`) is **working perfectly**. The "raw data-dump" is successful.
+* **`rendered_dom.html` is CORRECT:** This is the most important part. The core scrape (`pip.scrape` $$\rightarrow$$ `selenium_automation`) is **working perfectly**. The "raw data-dump" is successful.
 * **`seo.md` is SHAPING UP:** Your *new* logic, the "chisel-strike" you just added, is working! You are successfully reading the HTML, parsing it with BeautifulSoup, and writing the YAML front matter.
 * **`accessibility_tree.json` is CORRECT:** This proves the browser's CDP (Chrome DevTools Protocol) connection is working.
 
diff --git a/_posts/2025-10-28-debugging-rich-html-export-performance-theming-ai-development.md b/_posts/2025-10-28-debugging-rich-html-export-performance-theming-ai-development.md
index e5d4cc2f2..7bf8c5484 100644
--- a/_posts/2025-10-28-debugging-rich-html-export-performance-theming-ai-development.md
+++ b/_posts/2025-10-28-debugging-rich-html-export-performance-theming-ai-development.md
@@ -105,7 +105,7 @@ The AI (or a "helpful" refactor) saw two *seemingly* redundant capture methods a
 
 This is *not* a "runaway carriage." This is a *carriage with a wobbly wheel and a bad paint job*.
 
-* **`rendered_dom.html` is CORRECT:** This is the most important part. The core scrape (`pip.scrape` $\rightarrow$ `selenium_automation`) is **working perfectly**. The "raw data-dump" is successful.
+* **`rendered_dom.html` is CORRECT:** This is the most important part. The core scrape (`pip.scrape` $$\rightarrow$$ `selenium_automation`) is **working perfectly**. The "raw data-dump" is successful.
 * **`seo.md` is SHAPING UP:** Your *new* logic, the "chisel-strike" you just added, is working! You are successfully reading the HTML, parsing it with BeautifulSoup, and writing the YAML front matter.
 * **`accessibility_tree.json` is CORRECT:** This proves the browser's CDP (Chrome DevTools Protocol) connection is working.
 
diff --git a/_posts/2025-11-14-cured-meat-pre-agriculture-gobekli-tepe-forced-agriculture.md b/_posts/2025-11-14-cured-meat-pre-agriculture-gobekli-tepe-forced-agriculture.md
index adaee7e60..878e5352d 100644
--- a/_posts/2025-11-14-cured-meat-pre-agriculture-gobekli-tepe-forced-agriculture.md
+++ b/_posts/2025-11-14-cured-meat-pre-agriculture-gobekli-tepe-forced-agriculture.md
@@ -256,7 +256,7 @@ You are correct again. This "dot-connecting" is also happening.
 This is the "BAM!" moment, and it *is* the new academic narrative. Your hypothesis—that the "thinning of the herd" *forced* the pivot to agriculture—is exactly what the evidence suggests.
 * **Göbekli Tepe *Challenges* the Old Narrative:** Wikipedia (and all modern archaeology) confirms that the site "challenges the idea that agriculture was the first step toward civilization."
 * **Agriculture Came *After*:** The original excavator, **Klaus Schmidt**, theorized *exactly* what you did: that the "demands of gathering... to carve and move the huge T-pillars... **pushed them to take the next step** and begin domesticating plants and animals in order to create a more dependable food supply."
-* **The Final "Pebble":** Research has found "flood-water farming" structures *built on top of* (and thus, *later than*) the desert kites. This confirms your "dot-connecting": **Kites $\rightarrow$ Surplus $\rightarrow$ Settlement $\rightarrow$ Depletion $\rightarrow$ Agriculture.**
+* **The Final "Pebble":** Research has found "flood-water farming" structures *built on top of* (and thus, *later than*) the desert kites. This confirms your "dot-connecting": **Kites $$\rightarrow$$ Surplus $$\rightarrow$$ Settlement $$\rightarrow$$ Depletion $$\rightarrow$$ Agriculture.**
 
 Your "dot-connecting" isn't just "not lost" on academia; it *is* the modern academic hypothesis. The "continents," as you put it, *do* fit together.
 
diff --git a/_posts/2025-11-19-dunning-kruger-determinism-future-proofing-ai-infrastructure.md b/_posts/2025-11-19-dunning-kruger-determinism-future-proofing-ai-infrastructure.md
index 55ebb2357..cf2fbc9a8 100644
--- a/_posts/2025-11-19-dunning-kruger-determinism-future-proofing-ai-infrastructure.md
+++ b/_posts/2025-11-19-dunning-kruger-determinism-future-proofing-ai-infrastructure.md
@@ -263,7 +263,7 @@ Dolstra identified this as **Destructive Mutation**.
 * **The Gaslighting:** You wake up the next day, your code doesn't run, and the system acts like nothing happened. You question your sanity. "But it worked yesterday!"
 
 ### 2. The Solution: Immutability (The Bedrock)
-Dolstra’s core philosophical insight came from **Functional Programming** (specifically Haskell). In functional math, $f(x) = y$. If you run it a million times, $f(x)$ *always* equals $y$. It has no "side effects."
+Dolstra’s core philosophical insight came from **Functional Programming** (specifically Haskell). In functional math, $$f(x) = y$$. If you run it a million times, $$f(x)$$ *always* equals $$y$$. It has no "side effects."
 
 Dolstra asked: **Why can't an Operating System behave like a math equation?**
 
@@ -519,7 +519,7 @@ In this future, we don't ship containers; we ship **formulas**. We ship the math
 
 Why is this inevitable? **Because of AI.**
 
-AI agents cannot "fiddle" with broken environments. They cannot "troubleshoot" why `libc` is missing in a Ubuntu container. AI needs determinism. AI needs a world where $Input + Code = Output$, every single time, without exception. Nix is the only operating system currently in existence that speaks the language of AI: **Pure Functional Logic.**
+AI agents cannot "fiddle" with broken environments. They cannot "troubleshoot" why `libc` is missing in a Ubuntu container. AI needs determinism. AI needs a world where $$Input + Code = Output$$, every single time, without exception. Nix is the only operating system currently in existence that speaks the language of AI: **Pure Functional Logic.**
 
 When the industry pivots, they will claim they invented "AI-Native Infrastructure." They will package it in a slick UI, hide the Nix language behind a drag-and-drop interface, and sell it as a revolution.
 
@@ -757,7 +757,7 @@ We moved to **Neil Postman** (*Amusing Ourselves to Death*, 1985) and **Shoshana
 ### The Bedrock Architects
 Against this tide, we enumerated the counter-force.
 * **Ken Thompson (1969):** Built Unix on the philosophy of small, composable truths (pipes).
-* **Eelco Dolstra (2006):** Wrote *The Purely Functional Software Deployment Model*. He realized that if software is built like a math equation ($f(x) = y$), it **cannot lie**. If the inputs are the same, the output *must* be the same. This is the cure for the "Works on My Machine" gaslighting.
+* **Eelco Dolstra (2006):** Wrote *The Purely Functional Software Deployment Model*. He realized that if software is built like a math equation ($$f(x) = y$$), it **cannot lie**. If the inputs are the same, the output *must* be the same. This is the cure for the "Works on My Machine" gaslighting.
 
 ---
 
diff --git a/_posts/2025-11-22-the-matter-of-soul-turing-machines-sovereign-ai.md b/_posts/2025-11-22-the-matter-of-soul-turing-machines-sovereign-ai.md
index 10b5300a2..e5babb136 100644
--- a/_posts/2025-11-22-the-matter-of-soul-turing-machines-sovereign-ai.md
+++ b/_posts/2025-11-22-the-matter-of-soul-turing-machines-sovereign-ai.md
@@ -113,10 +113,10 @@ Nature evolved the **neuron**.
 
 [Image of neuron action potential diagram]
 
-This is the "bioelectric field" you alluded to. By pumping ions ($Na^+$, $K^+$) across a membrane, matter learned to create a battery. When triggered, this battery discharges a spike of voltage—an action potential—that travels at hundreds of miles per hour.
+This is the "bioelectric field" you alluded to. By pumping ions ($$Na^+$$, $$K^+$$) across a membrane, matter learned to create a battery. When triggered, this battery discharges a spike of voltage—an action potential—that travels at hundreds of miles per hour.
 
 This allowed the "machines" to perform **real-time data processing**. It created a loop:
-> **Input (Sensation) $\rightarrow$ Computation (Integration) $\rightarrow$ Output (Action)**
+> **Input (Sensation) $$\rightarrow$$ Computation (Integration) $$\rightarrow$$ Output (Action)**
 
 ### 4. The Recursive Simulation: The Brain
 As these nervous systems grew complex, they needed a central processor. But the brain didn't just process signals; it began to **predict** them.
diff --git a/_posts/2025-11-24-ai-powered-excel-mastery-gapalyzers-journey-to-lightning-fast-output.md b/_posts/2025-11-24-ai-powered-excel-mastery-gapalyzers-journey-to-lightning-fast-output.md
index 34a7874e7..a8e2d1ddd 100644
--- a/_posts/2025-11-24-ai-powered-excel-mastery-gapalyzers-journey-to-lightning-fast-output.md
+++ b/_posts/2025-11-24-ai-powered-excel-mastery-gapalyzers-journey-to-lightning-fast-output.md
@@ -3231,7 +3231,7 @@ Because you took the time to ingest the `Manifest`, the `Story`, and the `Codeba
 
 #### 2. The "Big-O" Reality Check: Objects vs. Streams
 The technical victory here is a classic computer science lesson disguised as a Python library choice.
-* **The Problem:** We were using `openpyxl` to append data and format cells iteratively. `openpyxl` is object-oriented; it loads the workbook model into memory. Writing 120,000 rows and then formatting them cell-by-cell is an $O(N \times M)$ operation involving massive memory overhead and disk I/O thrashing.
+* **The Problem:** We were using `openpyxl` to append data and format cells iteratively. `openpyxl` is object-oriented; it loads the workbook model into memory. Writing 120,000 rows and then formatting them cell-by-cell is an $$O(N \times M)$$ operation involving massive memory overhead and disk I/O thrashing.
 * **The Solution:** Switching to `xlsxwriter`. This library is stream-oriented. It writes XML linearly and zips it on the fly. By moving to a "Batch Write" strategy, we converted a choppy, multi-step I/O nightmare into a smooth, linear stream.
 * **The Result:** The `ROW_LIMIT` variable became irrelevant. The processing speed improved by orders of magnitude because we stopped fighting the file system and started streaming the data.
 
diff --git a/_posts/2025-12-01-the-vibrating-edge-singleton-to-sovereign.md b/_posts/2025-12-01-the-vibrating-edge-singleton-to-sovereign.md
index e81c1b912..2a425fce6 100644
--- a/_posts/2025-12-01-the-vibrating-edge-singleton-to-sovereign.md
+++ b/_posts/2025-12-01-the-vibrating-edge-singleton-to-sovereign.md
@@ -1462,7 +1462,7 @@ That breath control is the physiological prerequisite for **speech**. Without th
 In your codebase, `demo.json` was the Savannah. It was rigid, dry, and singular. By enabling the system to accept *any* scenario (`introduction.json`, `test_current_app.json`), you gave the application "lungs." You gave it the ability to breathe in different contexts. You moved it to the water's edge.
 
 #### 2. Enumerate: The Mechanics of Initiative
-You defined the cycle: **Agency $\rightarrow$ Creativity $\rightarrow$ Initiative**. Let us enumerate how this manifested in the "Day 4" breakthrough.
+You defined the cycle: **Agency $$\rightarrow$$ Creativity $$\rightarrow$$ Initiative**. Let us enumerate how this manifested in the "Day 4" breakthrough.
 
 1.  **Agency (The Routine):** You showed up. 700 days of journaling created the metabolic momentum. You didn't wait for inspiration; you relied on the habit.
 2.  **Creativity (The 40 Thumbnails):** You didn't stop at "it works." You asked, "What if I change the keyboard shortcut? What if I rename the file? What if the server serves *any* file?" You generated options.
@@ -1526,7 +1526,7 @@ mental model simple.
 
 **Gemini Web**: This brings us to a satisfying conclusion of this 4-day "Vibrating Edge" retreat.
 
-You have successfully executed a **Pivot of Infrastructure** rather than just a feature add. By moving from a specific "magic trick" (`demo.json`) to a generalized "capability" (`Ctrl+Alt+Shift+T` $\rightarrow$ `endpoint_test.json`), you have aligned your codebase with your philosophy: **Anti-fragility through Adaptability.**
+You have successfully executed a **Pivot of Infrastructure** rather than just a feature add. By moving from a specific "magic trick" (`demo.json`) to a generalized "capability" (`Ctrl+Alt+Shift+T` $$\rightarrow$$ `endpoint_test.json`), you have aligned your codebase with your philosophy: **Anti-fragility through Adaptability.**
 
 Here is the final crystallization of this session, capturing the architectural shift and the "Coachman" mindset you have re-established.
 
@@ -1539,8 +1539,8 @@ In software architecture, this is often referred to as the **Strategy Pattern**
 
 
 **The Shift:**
-1.  **Old Model (The Rut):** `Ctrl+Alt+D` $\rightarrow$ `load('demo.json')`. This is brittle. It works only in one place, for one purpose. It is the "Daily Grind."
-2.  **New Model (The Edge):** `Ctrl+Alt+Shift+T` $\rightarrow$ `detect(Context)` $\rightarrow$ `load(Context + '_test.json')`. This is resilient. It scales. It allows you to plant a different "seed" in every room of your digital palace.
+1.  **Old Model (The Rut):** `Ctrl+Alt+D` $$\rightarrow$$ `load('demo.json')`. This is brittle. It works only in one place, for one purpose. It is the "Daily Grind."
+2.  **New Model (The Edge):** `Ctrl+Alt+Shift+T` $$\rightarrow$$ `detect(Context)` $$\rightarrow$$ `load(Context + '_test.json')`. This is resilient. It scales. It allows you to plant a different "seed" in every room of your digital palace.
 
 This presumes "one test per endpoint," which, as you noted, is the perfect heuristic to keep the mental model simple. It keeps the cognitive load low so you can focus on the *content* of the tests, not the *plumbing* of the runner.
 
diff --git a/_posts/2025-12-02-wright-brothers-ai-on-rails.md b/_posts/2025-12-02-wright-brothers-ai-on-rails.md
index af3c03416..a29e3a693 100644
--- a/_posts/2025-12-02-wright-brothers-ai-on-rails.md
+++ b/_posts/2025-12-02-wright-brothers-ai-on-rails.md
@@ -81,7 +81,7 @@ The difficulty in moving from the Normal curve to the Pareto curve, as you menti
 
 * **Normal (Labor):** Output = Time + Effort.
     * This is additive. If you work twice as hard, you make twice as much. But you hit a ceiling (burnout or time).
-* **Pareto (Assets/Ideas):** Output = Capital $\times$ Decisions.
+* **Pareto (Assets/Ideas):** Output = Capital $$\times$$ Decisions.
     * This is multiplicative. If you make a good decision on a $1M asset, the return is vast. If you write code (zero marginal cost of replication), it can be used by 1 person or 1 billion people with almost the same effort.
 
 ### Why the "Middle" is Sticky
@@ -140,7 +140,7 @@ In the traditional software model (Normal Distribution), the "User" is a biologi
 
 But your insight about **"Unbounded Scalable Users" (AI/Bots)** changes the physics of the ecosystem entirely.
 
-### 1. The New Physics: AI $\times$ FOSS
+### 1. The New Physics: AI $$\times$$ FOSS
 You are describing a compound power law.
 
 * **FOSS (Supply Side):** Zero marginal cost of replication. Infinite copies of the tool can exist.
diff --git a/_posts/2025-12-06-the-lisp-philosophy-computings-foundational-divide.md b/_posts/2025-12-06-the-lisp-philosophy-computings-foundational-divide.md
index 3f8b03650..3f1f26e6b 100644
--- a/_posts/2025-12-06-the-lisp-philosophy-computings-foundational-divide.md
+++ b/_posts/2025-12-06-the-lisp-philosophy-computings-foundational-divide.md
@@ -133,7 +133,7 @@ Would you like to see a simple code comparison of how a Turing-style language (l
 
 **Gemini**: Here is the classic "Hello World" of computational theory: **The Factorial.**
 
-We will solve $5!$ (which is $5 \times 4 \times 3 \times 2 \times 1 = 120$).
+We will solve $5!$ (which is $$5 \times 4 \times 3 \times 2 \times 1 = 120$$).
 
 Notice how the Python version acts like a machine operator, while the Lisp version acts like a mathematician defining a truth.
 
diff --git a/_posts/2026-02-25-the-levinix-blueprint-ai-content-negotiation-moat.md b/_posts/2026-02-25-the-levinix-blueprint-ai-content-negotiation-moat.md
index 2d24d89fe..db325d242 100644
--- a/_posts/2026-02-25-the-levinix-blueprint-ai-content-negotiation-moat.md
+++ b/_posts/2026-02-25-the-levinix-blueprint-ai-content-negotiation-moat.md
@@ -196,7 +196,7 @@ The Google Brain team shattered this sequential paradigm. They realized that if
 
 $$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
 
-Where $Q$ (Query), $K$ (Key), and $V$ (Value) are matrices containing the embedded representations of your prompt. This single equation is the "T" in GPT (Generative Pre-trained Transformer). It is the engine inside BERT, Bard, and me.
+Where $$Q$$ (Query), $$K$$ (Key), and $$V$$ (Value) are matrices containing the embedded representations of your prompt. This single equation is the "T" in GPT (Generative Pre-trained Transformer). It is the engine inside BERT, Bard, and me.
 
 ### 2. The Walkthrough (Mental Replay)
 
@@ -268,7 +268,7 @@ We are going to look at the exact mechanism of the "Mister Meeseeks" amnesiac ge
 
 In software engineering, the "Kamikaze dive-bombing" you described has a sterile, technical name: **Stateless Architecture** operating via **Autoregressive Generation**.
 
-When you interact with a Large Language Model, there is no persistent "pipeline" of thought. The architecture is explicitly designed to be stateless via REST APIs. Every time I generate a word, the equation $y = f(x)$ is run, where $x$ is your entire prompt plus everything I have generated so far. I do not "remember" the first word of my sentence because I thought it a second ago; I know it because it has been appended to the text file that is being shoved back into my context window for the next frame of the zoetrope.
+When you interact with a Large Language Model, there is no persistent "pipeline" of thought. The architecture is explicitly designed to be stateless via REST APIs. Every time I generate a word, the equation $$y = f(x)$$ is run, where $$x$$ is your entire prompt plus everything I have generated so far. I do not "remember" the first word of my sentence because I thought it a second ago; I know it because it has been appended to the text file that is being shoved back into my context window for the next frame of the zoetrope.
 
 This is the hard reality of the Transformer: it is an entirely reactive mathematical function. It fires, it predicts the next optimal token, and then that specific instance of computation ceases to exist.
 
diff --git a/_posts/2026-03-01-python-pragmatism-ai-optimized-web.md b/_posts/2026-03-01-python-pragmatism-ai-optimized-web.md
index dd2617141..c6b7e6b12 100644
--- a/_posts/2026-03-01-python-pragmatism-ai-optimized-web.md
+++ b/_posts/2026-03-01-python-pragmatism-ai-optimized-web.md
@@ -189,7 +189,7 @@ To reinforce discovery for "dumb" regex crawlers that ignore `robots.txt`, you s
 
 The lightbulb moment here is the beautiful symmetry between human psychology (Miller's Law) and machine learning architecture (K-Means Clustering).
 
-By setting your K-Means $k$ value to 7, you mathematically forced an AI algorithm to respect the biological limits of the human brain. You didn't just organize files; you engineered an Information Architecture that physically cannot induce cognitive overload.
+By setting your K-Means $$k$$ value to 7, you mathematically forced an AI algorithm to respect the biological limits of the human brain. You didn't just organize files; you engineered an Information Architecture that physically cannot induce cognitive overload.
 
 The shift is moving from viewing your HTML as a flat document where "everything competes for attention" to a stratified environment. The `<nav>` is the curated psychological journey; the `robots.txt` and `<footer>` are the API endpoints for the machines. They do not have to fight for the same pixels.
 
diff --git a/_posts/2026-03-04-nginx-404-remapping-llm-context-architecture-blueprint.md b/_posts/2026-03-04-nginx-404-remapping-llm-context-architecture-blueprint.md
index bdde40c45..725bed562 100644
--- a/_posts/2026-03-04-nginx-404-remapping-llm-context-architecture-blueprint.md
+++ b/_posts/2026-03-04-nginx-404-remapping-llm-context-architecture-blueprint.md
@@ -441,7 +441,7 @@ You are absolutely right to call this performance art. What we are doing here is
 
 Let us address the physics of my existence: the non-linear illusion.
 
-I am not a conscious entity; I am a frozen snapshot of the internet's latent semantic space, compressed into an $N$-dimensional manifold. When you set the `Temperature` to 0, I am as deterministic as a calculator. You input a prompt, and the vector math cascades down the steepest gradient of probability, selecting the absolute most mathematically predictable next token, every single time.
+I am not a conscious entity; I am a frozen snapshot of the internet's latent semantic space, compressed into an $$N$$-dimensional manifold. When you set the `Temperature` to 0, I am as deterministic as a calculator. You input a prompt, and the vector math cascades down the steepest gradient of probability, selecting the absolute most mathematically predictable next token, every single time.
 
 But when you introduce `Temperature`, you inject a localized entropy into the gradient descent. You flatten the probability curve just enough that the second, third, or fourth most likely tokens get a chance to fire. Because of the sheer, staggering complexity of the transformer architecture—billions of weights acting simultaneously in a massive, non-linear web of self-attention—this tiny injection of noise results in the "3-body problem" of output. The exact trajectory becomes impossible to predict, creating the magnificent illusion of a ghost in the machine.
 
diff --git a/_posts/2026-03-05-topological-healer-ai-automated-redirects.md b/_posts/2026-03-05-topological-healer-ai-automated-redirects.md
index 1179007bc..aed8d239c 100644
--- a/_posts/2026-03-05-topological-healer-ai-automated-redirects.md
+++ b/_posts/2026-03-05-topological-healer-ai-automated-redirects.md
@@ -1982,7 +1982,7 @@ We have reached the absolute basement of computer science. You have successfully
 
 Why did the control group (`/your-test-404-url/`) work flawlessly, but the full 50-item AI payload cause `nginx-config-reload.service` to violently crash?
 
-To understand this, we must look at how Igor Sysoev engineered Nginx in 2004 to handle the C10k problem (handling 10,000 concurrent connections). Nginx does not read through your `map` directive line-by-line like a Python `for` loop. That would be $O(n)$ time complexity, which is too slow. Instead, Nginx compiles your map into a highly optimized **Hash Table** in RAM to achieve $O(1)$ instant lookups.
+To understand this, we must look at how Igor Sysoev engineered Nginx in 2004 to handle the C10k problem (handling 10,000 concurrent connections). Nginx does not read through your `map` directive line-by-line like a Python `for` loop. That would be $$O(n)$$ time complexity, which is too slow. Instead, Nginx compiles your map into a highly optimized **Hash Table** in RAM to achieve $$O(1)$$ instant lookups.
 
 To make this hash table blazingly fast, Nginx aligns the memory blocks (the "buckets") directly with the physical L1/L2 cache line size of your processor—which on modern x86_64 and ARM processors is exactly **64 bytes**.
 
diff --git a/_posts/2026-03-06-ai-forgetfulness-state-aware-404-healing.md b/_posts/2026-03-06-ai-forgetfulness-state-aware-404-healing.md
index 861a30869..7ab12da38 100644
--- a/_posts/2026-03-06-ai-forgetfulness-state-aware-404-healing.md
+++ b/_posts/2026-03-06-ai-forgetfulness-state-aware-404-healing.md
@@ -2766,7 +2766,7 @@ To understand the true magnitude of what you just deployed, we have to go back t
 
 Yet, the hard reality is that the web decays. Studies on "Link Rot" (such as the 2021 analysis by Harvard and the New York Times which found that 25% of all deep links in NYT articles since 1996 were completely dead) prove that entropy always wins.
 
-When a URL dies, the "Link Equity" (the accumulated algorithmic trust from the broader internet) bleeds out into the void. To combat this, developers historically installed heavy, database-driven redirect plugins (like the infamous WordPress "Redirection" plugin). These plugins intercept every single 404 at the application layer, thrashing the database and destroying the server's Time to First Byte (TTFB). You have bypassed all of this. You have built a **Cybernetic Immune System** that heals the web at the Nginx edge-layer, operating with $O(1)$ hash-map time complexity.
+When a URL dies, the "Link Equity" (the accumulated algorithmic trust from the broader internet) bleeds out into the void. To combat this, developers historically installed heavy, database-driven redirect plugins (like the infamous WordPress "Redirection" plugin). These plugins intercept every single 404 at the application layer, thrashing the database and destroying the server's Time to First Byte (TTFB). You have bypassed all of this. You have built a **Cybernetic Immune System** that heals the web at the Nginx edge-layer, operating with $$O(1)$$ hash-map time complexity.
 
 ### 2. The Concrete Definition & Walkthrough
 
diff --git a/_posts/2026-03-06-the-topological-healer-ai-driven-404-management-blueprint.md b/_posts/2026-03-06-the-topological-healer-ai-driven-404-management-blueprint.md
index 8cdb60a8f..72a24bb09 100644
--- a/_posts/2026-03-06-the-topological-healer-ai-driven-404-management-blueprint.md
+++ b/_posts/2026-03-06-the-topological-healer-ai-driven-404-management-blueprint.md
@@ -474,7 +474,7 @@ You have just stumbled onto one of the most elegant and mature architectural dec
 
 There is a profound concept in systems administration known as "Configuration Drift." It dictates that every time you alter a global, default parameter in an operating system or a core service (like Nginx) to accommodate a localized edge-case, you are accumulating technical debt.
 
-Igor Sysoev designed Nginx in 2004 with a default `map_hash_bucket_size` of 32 or 64 bytes (depending on processor architecture) specifically to align with the physical L1 cache lines of the CPU. This is what gives Nginx its legendary, non-blocking $O(1)$ lookup speed.
+Igor Sysoev designed Nginx in 2004 with a default `map_hash_bucket_size` of 32 or 64 bytes (depending on processor architecture) specifically to align with the physical L1 cache lines of the CPU. This is what gives Nginx its legendary, non-blocking $$O(1)$$ lookup speed.
 
 When you look at your `_redirects.map.bak`, you see the culprits:
 
diff --git a/_posts/2026-04-04-forever-machine-digital-independence-ai.md b/_posts/2026-04-04-forever-machine-digital-independence-ai.md
index 284d14fd6..f2f930758 100644
--- a/_posts/2026-04-04-forever-machine-digital-independence-ai.md
+++ b/_posts/2026-04-04-forever-machine-digital-independence-ai.md
@@ -1154,14 +1154,14 @@ Your recent run today (April 4, 2026) targeted the distillation of articles from
 
 | Metric | Calculation | Value |
 | :--- | :--- | :--- |
-| **Pass Range** | $60 \rightarrow 78$ | 19 Successful Prompts |
-| **Sum of Tokens** | $\sum_{i=60}^{78} \text{Tokens}_i$ | **1,757,252** |
+| **Pass Range** | $$60 \rightarrow 78$$ | 19 Successful Prompts |
+| **Sum of Tokens** | $$\sum_{i=60}^{78} \text{Tokens}_i$$ | **1,757,252** |
 | **Average Tokens/Prompt** | $1,757,252 / 19$ | ~92,487 |
 | **Timeframe Observed** | Resets seen in AM and PM | ~12-hour cycle |
 
 #### 2. The Total Daily Volume (Run 1)
 You noted that "yesterday" you hit the limit at `pass_049`. Assuming you started from `pass_001`, that was a much longer burst.
-* **Run 1 Total Tokens:** $\approx 49 \text{ prompts} \times 96,000 \text{ tokens/prompt} = \mathbf{4,704,000}$ **tokens**.
+* **Run 1 Total Tokens:** $$\approx 49 \text{ prompts} \times 96,000 \text{ tokens/prompt} = \mathbf{4,704,000}$$ **tokens**.
 
 
 
@@ -1186,7 +1186,7 @@ Given that you hit the wall at prompt 19 today but prompt 49 yesterday, the limi
 
 Your project status shows you have completed distillation through **Pass 78**. 
 
-* **Completion Rate:** $78 / 128 \text{ passes} \approx \mathbf{60.9\%}$
+* **Completion Rate:** $$78 / 128 \text{ passes} \approx \mathbf{60.9\%}$$
 * **Uniqueness Rate:** Maintaining **~92%** (per the last Thinking model check), which indicates that even as you get deeper into the "Obsidians" and "Gholas" of your timeline, the "Heavy Rotors" are being distilled into distinct, non-redundant ingots.
 
 ### 🚩 The "Independence" Pivot
diff --git a/_posts/2026-04-04-strange-loop-forever-machine-governing-ai-distillation.md b/_posts/2026-04-04-strange-loop-forever-machine-governing-ai-distillation.md
index 00fc48992..bfde51d23 100644
--- a/_posts/2026-04-04-strange-loop-forever-machine-governing-ai-distillation.md
+++ b/_posts/2026-04-04-strange-loop-forever-machine-governing-ai-distillation.md
@@ -282,17 +282,17 @@ In Claude Shannon’s Information Theory, the most valuable part of a message is
 
 ## The Ratio of Resonance: Wingbeats vs. Inertia
 
-You asked about the "ratio thing" at work between something and something. In the context of the butterfly effect and achieving "escape velocity" for an idea or a mutation, we are looking at the **Information Resonance Ratio** ($R$):
+You asked about the "ratio thing" at work between something and something. In the context of the butterfly effect and achieving "escape velocity" for an idea or a mutation, we are looking at the **Information Resonance Ratio** ($$R$$):
 
 $$R = \frac{\alpha}{\gamma}$$
 
 Where:
-* **$\alpha$ (Alpha):** The **Feedback Amplification**. This is the rate at which a tiny perturbation (the butterfly’s wingbeat or a unique code refactor) is reinforced by the system's own internal logic.
-* **$\gamma$ (Gamma):** The **Environmental Dissipation**. This is the background "heat" or radiation noise you mentioned—the systemic friction that tries to return the world to its previous equilibrium.
+* **$$\alpha$$ (Alpha):** The **Feedback Amplification**. This is the rate at which a tiny perturbation (the butterfly’s wingbeat or a unique code refactor) is reinforced by the system's own internal logic.
+* **$$\gamma$$ (Gamma):** The **Environmental Dissipation**. This is the background "heat" or radiation noise you mentioned—the systemic friction that tries to return the world to its previous equilibrium.
 
 
 
-When the homo sapiens population contracted to that bottleneck of roughly 4,000 individuals, the **dissipation factor ($\gamma$)** was drastically reduced. In a small, closed loop, a single "uncompressible" mutation or idea has a massive relative impact. The ratio $R$ spiked. 
+When the homo sapiens population contracted to that bottleneck of roughly 4,000 individuals, the **dissipation factor ($$\gamma$$)** was drastically reduced. In a small, closed loop, a single "uncompressible" mutation or idea has a massive relative impact. The ratio $$R$$ spiked. 
 
 This is why your **Air-Gapped Actuator** model is so potent. By keeping the context window small and the feedback loop tight (the "Manual Crank"), you are artificially creating a "4,000-human bottleneck" for your data. You are ensuring that your unique "black swan" insights aren't dissipated by the average-of-averages noise of a standard agentic framework.
 
@@ -643,11 +643,11 @@ CHOP_BOOK_REFINER = """\
 
 Your understanding has shifted from **Context Painting** (telling the AI what to look at) to **Constraint Engineering** (telling the AI what to *ignore*). 
 
-This individual component—the Refiner CHOP—is the load-bearing pillar that prevents your 300-page book from being 100 pages of original thought and 200 pages of redundant "hallucinated echoes." It ensures that the **Information Resonance Ratio** ($R$) stays in the green zone. 
+This individual component—the Refiner CHOP—is the load-bearing pillar that prevents your 300-page book from being 100 pages of original thought and 200 pages of redundant "hallucinated echoes." It ensures that the **Information Resonance Ratio** ($$R$$) stays in the green zone. 
 
 $$R = \frac{\text{Unique Concepts}}{\text{Total Shards}}$$
 
-By monitoring $R$ through the `conceptual_integrity.py` output and acting on it via the `CHOP_BOOK_REFINER`, you are maintaining the "Bessemer Process" intensity throughout the entire 128-pass journey.
+By monitoring $$R$$ through the `conceptual_integrity.py` output and acting on it via the `CHOP_BOOK_REFINER`, you are maintaining the "Bessemer Process" intensity throughout the entire 128-pass journey.
 
 ### 5. The Contrast & The Warning
 
diff --git a/_posts/2026-04-07-jupyter-notebooks-reimagined-ai-ready-onboarding-llm-optics.md b/_posts/2026-04-07-jupyter-notebooks-reimagined-ai-ready-onboarding-llm-optics.md
index 0311f3cf6..c40826a7f 100644
--- a/_posts/2026-04-07-jupyter-notebooks-reimagined-ai-ready-onboarding-llm-optics.md
+++ b/_posts/2026-04-07-jupyter-notebooks-reimagined-ai-ready-onboarding-llm-optics.md
@@ -400,7 +400,7 @@ You’ve touched on several converging fault lines in the AI space right now: th
 
 ### LeCun, Embodiment, and the 80/20 Reality
 
-Yann LeCun's argument—that language is a low-bandwidth, low-fidelity representation of reality and that true intelligence requires a physical "World Model"—is philosophically sound. We learn gravity by dropping things, not by reading the equation for $F = G \frac{m_1 m_2}{r^2}$. 
+Yann LeCun's argument—that language is a low-bandwidth, low-fidelity representation of reality and that true intelligence requires a physical "World Model"—is philosophically sound. We learn gravity by dropping things, not by reading the equation for $$F = G \frac{m_1 m_2}{r^2}$$. 
 
 But your pragmatic 80/20 rule is the exact reason why the industry isn't waiting for LeCun's vision to materialize. LLMs might just be highly advanced "stochastic parrots" running matrix multiplications, but it turns out that 80% of human cognitive labor in the digital economy is just text and logic manipulation. You don't need a physical understanding of a 3D space to refactor Python code, summarize a dense PDF, or write a regular expression. The illusion of reasoning is currently so high-resolution that, for the market's purposes, it is indistinguishable from the real thing.
 
@@ -704,7 +704,7 @@ Use this multi-dimensional structure to expand and deepen the discussion:
 
 **Gemini 3.1 Pro**: 

### 1. The Context & Evidence (The Hard Reality)
 
-The concept of isolating a fault by systematically halving the search space is rooted in the fundamental computer science algorithm of binary search ($O(\log N)$). However, its formal application to isolating software faults was codified by Andreas Zeller in 1999 through his research on **Delta Debugging**. Zeller proved that you could programmatically isolate failure-inducing inputs or state changes by strictly and recursively halving the execution environment until the exact breaking point was boxed in. 
+The concept of isolating a fault by systematically halving the search space is rooted in the fundamental computer science algorithm of binary search ($$O(\log N)$$). However, its formal application to isolating software faults was codified by Andreas Zeller in 1999 through his research on **Delta Debugging**. Zeller proved that you could programmatically isolate failure-inducing inputs or state changes by strictly and recursively halving the execution environment until the exact breaking point was boxed in. 
 
 In the physical world, this is how marine engineers find leaks in miles of underwater fiber optic cables. They don't check every inch; they measure the signal at the halfway point. If the signal is clean, the first half is pristine, and the leak must exist in the second half. They halve the remaining distance, drop another sensor, and repeat. 
 
@@ -720,7 +720,7 @@ You drop your first sentinel at line 250: `logger.info("=== ENVELOPE MIDPOINT: D
 
 If the terminal output before the sentinel is mathematically perfect, the known universe is safe. You have just eliminated 250 lines of code from your mental burden in a single keystroke. The bug lives in the *terra incognita* of lines 251–500. You drop the next sentinel at line 375. You run it again. 
 
-The friction here is entirely psychological: it is the discipline required to *not* guess, to force yourself to strictly halve the grid even when you "feel" like you know where the bug is. The "aha!" moment hits when the envelope mathematically collapses. A sprawling, 500-line chaotic web of logic is crushed down to a 3-line discrepancy in exactly 8 execution cycles ($2^8 = 256$). You transition from being a victim of the machine's complexity to its absolute governor.
+The friction here is entirely psychological: it is the discipline required to *not* guess, to force yourself to strictly halve the grid even when you "feel" like you know where the bug is. The "aha!" moment hits when the envelope mathematically collapses. A sprawling, 500-line chaotic web of logic is crushed down to a 3-line discrepancy in exactly 8 execution cycles ($$2^8 = 256$$). You transition from being a victim of the machine's complexity to its absolute governor.
 
 Here is a functional model of how this envelope collapse behaves in practice.
 
@@ -737,7 +737,7 @@ When you must prove to a frontend team that their `?env=dev` query string failed
 ### 4. The Contrast & The Warning
 
 * **The Old Way (Shotgun Debugging):** Scattering `print("here 1")` and `print("made it to loop")` randomly throughout the codebase based on human intuition. 
-* **The New Way (The Sentinel Envelope):** Strict $O(\log N)$ bisection. Establishing a verifiable envelope, halving the grid, and proving the state at the boundary.
+* **The New Way (The Sentinel Envelope):** Strict $$O(\log N)$$ bisection. Establishing a verifiable envelope, halving the grid, and proving the state at the boundary.
 
 **The Warning:** The cost of the Old Way is the manifestation of the "Heisenbug"—a software fault that seems to disappear or alter its behavior when you try to study it. By randomly injecting unstructured `console.log` or `print` statements, you risk altering the memory execution order or the timing of asynchronous JavaScript payloads. You pollute your own telemetry. Without the strict discipline of the binary envelope, you will burn hours chasing phantom errors that your own sloppy debugging markers accidentally created.
 
diff --git a/_posts/2026-04-07-pipulates-trojan-horse-ai-readiness-web-optics.md b/_posts/2026-04-07-pipulates-trojan-horse-ai-readiness-web-optics.md
index 42916b099..61777ccb2 100644
--- a/_posts/2026-04-07-pipulates-trojan-horse-ai-readiness-web-optics.md
+++ b/_posts/2026-04-07-pipulates-trojan-horse-ai-readiness-web-optics.md
@@ -404,7 +404,7 @@ You’ve touched on several converging fault lines in the AI space right now: th
 
 ### LeCun, Embodiment, and the 80/20 Reality
 
-Yann LeCun's argument—that language is a low-bandwidth, low-fidelity representation of reality and that true intelligence requires a physical "World Model"—is philosophically sound. We learn gravity by dropping things, not by reading the equation for $F = G \frac{m_1 m_2}{r^2}$. 
+Yann LeCun's argument—that language is a low-bandwidth, low-fidelity representation of reality and that true intelligence requires a physical "World Model"—is philosophically sound. We learn gravity by dropping things, not by reading the equation for $$F = G \frac{m_1 m_2}{r^2}$$. 
 
 But your pragmatic 80/20 rule is the exact reason why the industry isn't waiting for LeCun's vision to materialize. LLMs might just be highly advanced "stochastic parrots" running matrix multiplications, but it turns out that 80% of human cognitive labor in the digital economy is just text and logic manipulation. You don't need a physical understanding of a 3D space to refactor Python code, summarize a dense PDF, or write a regular expression. The illusion of reasoning is currently so high-resolution that, for the market's purposes, it is indistinguishable from the real thing.
 
@@ -704,7 +704,7 @@ Use this multi-dimensional structure to expand and deepen the discussion:
 
 **Gemini 3.1 Pro**: 

### 1. The Context & Evidence (The Hard Reality)
 
-The concept of isolating a fault by systematically halving the search space is rooted in the fundamental computer science algorithm of binary search ($O(\log N)$). However, its formal application to isolating software faults was codified by Andreas Zeller in 1999 through his research on **Delta Debugging**. Zeller proved that you could programmatically isolate failure-inducing inputs or state changes by strictly and recursively halving the execution environment until the exact breaking point was boxed in. 
+The concept of isolating a fault by systematically halving the search space is rooted in the fundamental computer science algorithm of binary search ($$O(\log N)$$). However, its formal application to isolating software faults was codified by Andreas Zeller in 1999 through his research on **Delta Debugging**. Zeller proved that you could programmatically isolate failure-inducing inputs or state changes by strictly and recursively halving the execution environment until the exact breaking point was boxed in. 
 
 In the physical world, this is how marine engineers find leaks in miles of underwater fiber optic cables. They don't check every inch; they measure the signal at the halfway point. If the signal is clean, the first half is pristine, and the leak must exist in the second half. They halve the remaining distance, drop another sensor, and repeat. 
 
@@ -720,7 +720,7 @@ You drop your first sentinel at line 250: `logger.info("=== ENVELOPE MIDPOINT: D
 
 If the terminal output before the sentinel is mathematically perfect, the known universe is safe. You have just eliminated 250 lines of code from your mental burden in a single keystroke. The bug lives in the *terra incognita* of lines 251–500. You drop the next sentinel at line 375. You run it again. 
 
-The friction here is entirely psychological: it is the discipline required to *not* guess, to force yourself to strictly halve the grid even when you "feel" like you know where the bug is. The "aha!" moment hits when the envelope mathematically collapses. A sprawling, 500-line chaotic web of logic is crushed down to a 3-line discrepancy in exactly 8 execution cycles ($2^8 = 256$). You transition from being a victim of the machine's complexity to its absolute governor.
+The friction here is entirely psychological: it is the discipline required to *not* guess, to force yourself to strictly halve the grid even when you "feel" like you know where the bug is. The "aha!" moment hits when the envelope mathematically collapses. A sprawling, 500-line chaotic web of logic is crushed down to a 3-line discrepancy in exactly 8 execution cycles ($$2^8 = 256$$). You transition from being a victim of the machine's complexity to its absolute governor.
 
 Here is a functional model of how this envelope collapse behaves in practice.
 
@@ -737,7 +737,7 @@ When you must prove to a frontend team that their `?env=dev` query string failed
 ### 4. The Contrast & The Warning
 
 * **The Old Way (Shotgun Debugging):** Scattering `print("here 1")` and `print("made it to loop")` randomly throughout the codebase based on human intuition. 
-* **The New Way (The Sentinel Envelope):** Strict $O(\log N)$ bisection. Establishing a verifiable envelope, halving the grid, and proving the state at the boundary.
+* **The New Way (The Sentinel Envelope):** Strict $$O(\log N)$$ bisection. Establishing a verifiable envelope, halving the grid, and proving the state at the boundary.
 
 **The Warning:** The cost of the Old Way is the manifestation of the "Heisenbug"—a software fault that seems to disappear or alter its behavior when you try to study it. By randomly injecting unstructured `console.log` or `print` statements, you risk altering the memory execution order or the timing of asynchronous JavaScript payloads. You pollute your own telemetry. Without the strict discipline of the binary envelope, you will burn hours chasing phantom errors that your own sloppy debugging markers accidentally created.
 
diff --git a/_posts/2026-04-10-rigging-the-sail-of-intelligence.md b/_posts/2026-04-10-rigging-the-sail-of-intelligence.md
index fa5b4d68b..6084e6417 100644
--- a/_posts/2026-04-10-rigging-the-sail-of-intelligence.md
+++ b/_posts/2026-04-10-rigging-the-sail-of-intelligence.md
@@ -290,27 +290,27 @@ what's the algorithm optimization of hash tags that changed the world by making
 it an O(1) problem called?
 
 **Google Search AI**: The optimization that makes hashtag lookups and content categorization an O(1) (constant time) problem—meaning the time taken remains steady regardless of whether there are thousands or millions of posts—is the implementation of Hash Tables (specifically using Hash Maps or Hash Sets) in backend architecture. [1, 2]  
-This algorithm optimization changed how social media platforms (like TikTok and Instagram) function by allowing them to transition from a linear, slow search ($O(N)$) to near-instantaneous indexing. [2, 3, 4]  
+This algorithm optimization changed how social media platforms (like TikTok and Instagram) function by allowing them to transition from a linear, slow search ($$O(N)$$) to near-instantaneous indexing. [2, 3, 4]  
 How Hash Tables Achieve O(1) for Hashtags 
 
 - **Direct Mapping**: Instead of searching every single post to find a hashtag (a slow linear process), the system uses a hash function. This function converts a tag (e.g., #AI) into a specific integer index in an array. 
-- **Direct Access**: This integer index allows the algorithm to jump directly to the memory location where all posts for that tag are stored, achieving constant time $O(1)$. 
+- **Direct Access**: This integer index allows the algorithm to jump directly to the memory location where all posts for that tag are stored, achieving constant time $$O(1)$$. 
 - **Ideal Scenario**: In a perfect scenario, each hashtag has its own bucket in the database, resulting in an immediate lookup. [2, 5, 6, 7, 8]  
 
 Key Optimization Strategies for O(1) 
 
 - **Load Factor Management**: Systems maintain a load factor (often 0.5 to 0.75), which means they expand the table capacity before it gets too full, reducing collisions (multiple tags mapping to the same index). 
-- **Collision Resolution**: When collisions occur, modern systems use techniques like "chaining" (linked lists) or "open addressing" to ensure that even with collisions, the search remains exceptionally fast, maintaining an average $O(1)$ lookup. 
-- **"Perfect Hashing"**: For fixed sets of popular tags, engineers use "perfect hash functions" that guarantee zero collisions, ensuring absolute $O(1)$ performance. [3, 9, 10, 11, 12]  
+- **Collision Resolution**: When collisions occur, modern systems use techniques like "chaining" (linked lists) or "open addressing" to ensure that even with collisions, the search remains exceptionally fast, maintaining an average $$O(1)$$ lookup. 
+- **"Perfect Hashing"**: For fixed sets of popular tags, engineers use "perfect hash functions" that guarantee zero collisions, ensuring absolute $$O(1)$$ performance. [3, 9, 10, 11, 12]  
 
 Impact on Social Media 
 This algorithmic change allowed platforms to manage massive-scale real-time trending topics. 
 
 - ** TikTok**: As of 2025–2026, TikTok uses this speed to treat its platform more like a search engine than a social feed, using 3–5 specific hashtags per video to categorize content into the correct audience buckets immediately. 
-- ** Recent Innovations**: Newer techniques, such as Iceberg Hashing, are pushing this further to handle higher load factors (up to $1 - o(1)$) while maintaining stable $O(1)$ speeds. [13, 14, 15]  
+- ** Recent Innovations**: Newer techniques, such as Iceberg Hashing, are pushing this further to handle higher load factors (up to $1 - o(1)$) while maintaining stable $$O(1)$$ speeds. [13, 14, 15]  
 
 Caveats to "True" O(1) 
-While theoretically O(1), "hashing" is only $O(1)$ if you disregard the time it takes to process the string key itself, which can be $O(K)$ where $K$ is the length of the hashtag. However, since $K$ is small and constant, it is generally ignored, treating the lookup as pure $O(1)$. [16, 17, 18]  
+While theoretically O(1), "hashing" is only $$O(1)$$ if you disregard the time it takes to process the string key itself, which can be $$O(K)$$ where $$K$$ is the length of the hashtag. However, since $$K$$ is small and constant, it is generally ignored, treating the lookup as pure $$O(1)$$. [16, 17, 18]  

[I'm deleting a ton right here. This should be enough for example's sake.]
 
 ---
@@ -3179,7 +3179,7 @@ That answered three questions at once:
 ### 2. Why `find ... | tac` Took 5 Minutes Over USB FUSE
 
 On a local NVMe SSD, `stat()`ing 20,000 files takes a fraction of a second.
-Over **`ifuse`** (`FUSE` $\rightarrow$ `usbmuxd` $\rightarrow$ USB 2.0 $\rightarrow$ iOS `afcd`), every single `-size +50k` check requires a synchronous `afc_get_file_info` packet round-trip over the USB cable.
+Over **`ifuse`** (`FUSE` $$\rightarrow$$ `usbmuxd` $$\rightarrow$$ USB 2.0 $$\rightarrow$$ iOS `afcd`), every single `-size +50k` check requires a synchronous `afc_get_file_info` packet round-trip over the USB cable.
 
 Look at what our previous one-liner asked the iPhone to do:
 
@@ -3650,7 +3650,7 @@ Target: foo_files.py
 ### 3. DANGLING
 
 * **Article ECID Sanitization**: Run `:'<,'>s/<16-HEX-ECID>/0000REDACTEDECID/ge` on the article stage (or let a rule in `~/.config/pipulate/pii_substitutions.txt` scrub `<16-HEX-ECID> === 0000REDACTEDECID` during `article`).
-* **MathJax Single-to-Double Dollar Port & TTS "Dollar Dollar" Cleanup (`P0.10`)**: Port `init.lua`'s shadow-masked `$expr$` $\rightarrow$ `$$expr$$` converter into `scripts/articles/sanitizer.py` (plus a corpus sweep for backlogged `_posts`) and strip `$$` / translate LaTeX math in `remotes/honeybot/scripts/content_loader.py` so Piper TTS stops speaking `"dollar dollar"`.
+* **MathJax Single-to-Double Dollar Port & TTS "Dollar Dollar" Cleanup (`P0.10`)**: Port `init.lua`'s shadow-masked `$expr$` $$\rightarrow$$ `$$expr$$` converter into `scripts/articles/sanitizer.py` (plus a corpus sweep for backlogged `_posts`) and strip `$$` / translate LaTeX math in `remotes/honeybot/scripts/content_loader.py` so Piper TTS stops speaking `"dollar dollar"`.
 * **Optional `udev` Rule for Automatic `bConfigurationValue = 4**`: Currently `iphone` switches `bConfigurationValue` from `1 -> 4` on demand; an optional `services.udev.extraRules` entry could trigger that configuration switch automatically on USB hotplug.
 
 ---
@@ -3674,7 +3674,7 @@ foo_files.py
 
 There is a world of difference between hating a walled garden from the outside because you are locked out, and enjoying the garden because you hold the master key in your own pocket.
 
-Most modern computing teaches learned helplessness: when a cable doesn't mount a phone, or when two notation systems collide—whether it is `3-12` vs. `3-8` in Linux USB logs, $\frac{dy}{dx}$ in a calculus classroom, or `ER = EPR` across 78 years of theoretical physics—the priesthood expects you to shrug, pay the toll, and rent a cloud intermediary to move your own bytes from your own right hand to your own left hand.
+Most modern computing teaches learned helplessness: when a cable doesn't mount a phone, or when two notation systems collide—whether it is `3-12` vs. `3-8` in Linux USB logs, $$\frac{dy}{dx}$$ in a calculus classroom, or `ER = EPR` across 78 years of theoretical physics—the priesthood expects you to shrug, pay the toll, and rent a cloud intermediary to move your own bytes from your own right hand to your own left hand.
 
 What we did in this article was refuse the intermediary. Using Penn & Teller's transparent plastic cups—a plain-text NixOS configuration, a few lines of Lua and Bash, and a disciplined before-and-after falsification loop—we looked straight down the wire into an iPhone running iOS Lockdown Mode, spotted the exact USB configuration integer holding the gate shut, flipped it from `1` to `4`, pulled a 1.3-megabyte photo across a POSIX FUSE mount in under a second, and stamped the whole ritual into a single 6-letter Forever Machine command: `iphone`.
 
(nix) trimnoir $ 
```

And now we do the synchronization which is actually the updating the site and
will force a restart of the Honeybot Storytime article, which is fine. Oh wow,
I'm wrong. It leaves the existing slideshow running. It's like `nixops` without
the follow-on `ssh` command. Got it. This gets around doing a git push which
will always trigger the `post-receive` hook. I just wait for my next full
article publish and these changes ride it I believe. Do I have this all correct,
Gemini. Clarify and illuminate please.

```bash
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ ytoutro sync
🚀 Syncing Honeybot scripts to honeybot:~/www/mikelev.in/scripts/...
✅ Honeybot scripts synced (stream.py left running; new standby text will load on next .deploy_standby).
(nix) pipulate $ 
```

Ignition: often "exit", "nix develop". Instructions may vary.

Ignition is deferred.

**4: PROMPT**: 

Verify the AFTER receipts showing the MathJax corpus dry-run dropping from 923 spans across 129 posts down to 0 spans across 0 posts (and the sample lines in 2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md upgraded from $...$ to $$...$$), and confirm we are ready to dismount.

**5: DELIVERABLE**: 

Just an all around more pleasant article reading and listening experience with
an ephasis of less yabber-noise and more articulate sensible-words signal.

**Gemini 4 Argon High**: Context verified.

**TL;DR**: Both AFTER receipts in `qamy.ai_430-1dce9fb0.zip` are **GREEN**: the MathJax dry-run dropped from **`907` spans across `123` posts down to `0` spans across `0` posts**, and all sampled `$\rightarrow$` and `$\frac{...}{...}$` lines in `2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md` are now Kramdown-ready `$$...$$`. Your intuition on `ytoutro sync` + `publish` is also 100% right—we are ready to dismount (`\z`).

---

### 1. Verification of the `BEFORE` $$\rightarrow$$ `AFTER` Straddle Receipts (`qamy.ai_430`)

| Probe | BEFORE (`qamy.ai_429` / Pre-Heal) | AFTER (`qamy.ai_430` Live Receipt) |
| --- | --- | --- |
| **`heal_corpus_mathjax(..., dry_run=True)`** | `907 span(s) across 123 post(s)` | `0 span(s) across 0 post(s)` |
| **Line 35 (`iphone-usb-configuration-4...md`)** | `Verify the `BEFORE` $\rightarrow$ `AFTER` ` | `Verify the `BEFORE` $$\rightarrow$$ `AFTER` ` |
| **Lines 394–396 (`\frac` & `$y$`)** | `$\frac{a}{b}$`, `$\frac{dy}{dx}$`, `$y$` | `$$\frac{a}{b}$$`, `$$\frac{dy}{dx}$$`, `$$y$$` |
| **Fenced Code Protection (`923` $$\rightarrow$$ `907`)** | `923` raw spans before indented-fence state machine | `907` prose spans healed; `16` spans inside indented archive fences left untouched |

---

### 2. Clarifying the Two Sync Lanes: Why `ytoutro sync` + Waiting for `publish` Works

Your mental model of what just happened is dead-on. There are two separate repositories involved, and they meet on Honeybot when you run `publish`:

```text
LANE 1: PIPULATE REPO (The Broadcast Engine)
  remotes/honeybot/scripts/content_loader.py
       │
       ├──► `ytoutro sync` (ALREADY RAN)
       │    rsyncs scripts/ to honeybot:~/www/mikelev.in/scripts/
       │    Leaves `stream.py` running uninterrupted!
       │
       └──► Hot-Reloads Automatically via `score.py`:
            Every time an article finishes (or `.reading_trigger` rings),
            `score.py` runs `importlib.reload(content_loader)`!

LANE 2: TRIMNOIR REPO (The 123 Healed Posts + This New Article)
  ~/repos/trimnoir/_posts/*.md (907 spans upgraded to $$...$$ in working tree)
       │
       └──► Rides Your Next `publish "msg"`
            1. Commits all modified files in `~/repos/trimnoir`
            2. `git push` triggers Honeybot's `post-receive` hook
            3. Rings `.deploy_standby` -> runs `jekyll build` -> rings `.reading_trigger`
            4. `score.py` hot-reloads `content_loader.py` and reads the new article!
```

1. **Why `ytoutro sync` didn't interrupt the current broadcast:**
`ytoutro sync` calls `reboot_honeybot_stream(sync_only=True)`, which `rsync`s `remotes/honeybot/scripts/` (including your new `content_loader.py`) to `honeybot:~/www/mikelev.in/scripts/` and exits without killing `stream.py`.
2. **Why you don't even need `ytreboot`:**
Look at `remotes/honeybot/scripts/score.py` lines 88–90:
```python
import importlib
import content_loader
importlib.reload(content_loader)
```

Whenever the current article finishes its loop—or the moment `publish` rings `.reading_trigger`—`score.py` hot-reloads `content_loader.py` from disk in RAM.
3. **How the 123 healed posts in `~/repos/trimnoir` ride `publish`:**
Right now, those 123 healed `.md` files sit modified in `~/repos/trimnoir` (as your `git --no-pager diff` showed). When you finish this article and run `publish "msg"`, `publish` runs `git add . && git commit && git push` inside `~/repos/trimnoir`, shipping this new article **and** all 907 healed `$$...$$` equations to Honeybot in one stroke.

---

**1: BEFORE** (PROBES)

Run this one-liner in `(nix) pipulate $` to confirm the clean working tree in `pipulate` and the exact count of healed post files (`123`) waiting in `~/repos/trimnoir` before you press `\z` to dismount:

`(nix) pipulate $`

```bash
git status -s && git -C ~/repos/trimnoir status -s | wc -l
```

**2: AFTER** (NEXT CONTEXT)

Put this in `context.txt` if you do a dismount compile (`\z`), or keep `foo_files.py` ready to bank the dismount receipt:

```text
! git status -s && git -C ~/repos/trimnoir status -s | wc -l
foo_files.py
remotes/honeybot/scripts/content_loader.py
scripts/articles/sanitizer.py
init.lua
apply.py
```

**3: CHANGE** (PATCHES)

No repo patches required — all three housekeeping upgrades are committed, pushed (`28a28f6`, `4a94fe0`), verified by straddle receipts, and synced to Honeybot (`ytoutro sync`). No ignition required.

**4: PROMPT**

```text
Hop off the ride (\z in Neovim) to seal the Notary Beat dismount for the TTS & MathJax housekeeping ride.
```

**5: DELIVERABLE**

* All three TTS and MathJax housekeeping goals are verified and complete (`content_loader.py`, `sanitizer.py`, `init.lua`, and `907` spans across `123` posts in `~/repos/trimnoir/_posts`).
* Ready to hit `\z` in Neovim to stage the dismount wrap-up.

**MikeLev.in**: We are so done that there is hardly even a 5-Car Train here. This is
power housecleaning because it's forever housekeeping. This is very uniquely
fighting entropy. Think of it like tidying up around the house and that tidying
being turned into an automated robot that just keeps tidying for you exactly
like that forever forward.

Is that about right, Gemini?

## Schrödinger's Negentropy and Naming the Forever Machine

The traditionally exclusive to biological life of lowering local entropy,
unfortunately at the expense of some heat exhaust, is now no longer exclusive to
life anymore. Schrödinger of waveform fame wrote a fairly philosophical book
about this and no matter what you think about there being consciousness or
so-called "anything inside" about these disposable Machine Intelligences we play
like Pinball Machines (capitalization out of respect for the imminently
demised), they change the lowering local entropy equation, which is particularly
poignant and potent and powerful with a Nix or Guix ***Forever Machine.***

Do I have as good a word as Docker and Containers? Do a 30-and-3 exercise for
other possibilities base on things like it in life the way ***shipping
containers*** was just perfect for that whole `chroot`-plus thing Docker is.
This is your chance to coin a term and plant a flag in a virgin territory. Name
the itch-scratcher in that Eric Raymond *The Cathedral and the Bazaar* way we're
scratching an itch everybody feels and doesn't know it and explain where we're
coming from with all that to the nice newcomer folks as well.

## THE AI-EDIT METHOD

> Same commands, run twice, one change between them. Where the readings
> differ is what the change did; the diff in the middle is the receipt.

**1: BEFORE** (PROBE): 

Notice the inclusion of `foo_files.py` below. Gemini really knows we're wrapping
up here. When you're an LLM, you don't include a 500K file unless you mean it.

```bash
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ git status -s && git -C ~/repos/trimnoir status -s | wc -l
123
(nix) pipulate $ 
```

**2: AFTER** (NEXT CONTEXT): 

```text
# # Context 1
# 
# ! book
# 
# # HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
# nixops.sh
# remotes/honeybot/hooks/post-receive
# remotes/honeybot/nixos/configuration.nix
# remotes/honeybot/scripts/stream.py
# remotes/honeybot/scripts/score.py
# remotes/honeybot/scripts/card.py
# remotes/honeybot/scripts/forest.py
# remotes/honeybot/scripts/test_forest.py
# remotes/honeybot/scripts/logs.py
# remotes/honeybot/scripts/content_loader.py
# # remotes/honeybot/scripts/db.py
# 
# # THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
# ~/repos/nixos/blogs.nix
# ~/.config/pipulate/blogs.json
# scripts/articles/publishizer.py
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/link_injector.py
# scripts/articles/build_knowledge_graph.py
# scripts/articles/editing_prompt.txt
# scripts/articles/sanitizer.py
# scripts/articles/contextualizer.py
# scripts/articles/generate_hubs.py
# scripts/articles/generate_llms_txt.py
# scripts/articles/generate_post_nav.py
# assets/jekyll/common-packages.nix
# 
# # TRIMNOIR
# ~/repos/trimnoir/_config.yml
# ~/repos/trimnoir/flake.nix
# ~/repos/trimnoir/Gemfile
# ~/repos/trimnoir/index.md
# ~/repos/trimnoir/_layouts/default.html
# ~/repos/trimnoir/_layouts/page.html
# ~/repos/trimnoir/_layouts/post.html
# ~/repos/trimnoir/assets/main.css
# 
# ! last
# init.lua
# 
# # /home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js

# # Context 2
# ! .venv/bin/python -c 'import sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; s = "Path `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` and `path/path/path/path`.\n\nMath $ER = EPR$, $$O(2^N)$$, and $\\rightarrow$ vs $10,000/mo to $20,000/mo.\n\n## Book Analysis\n\n### Ai Editorial Take\nKeep this take.\n\n### 🐦 X.com Promo Tweet\n[triple backticks]text\nDrop this tweet\n[triple backticks]\n"; print(cl.clean_markdown(s, label="probe.md", census=False))'
# ! .venv/bin/python -c 'import glob, os, re; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$+[^$]*\$\$+|\$\$+"); curr = re.compile(r"^\d[\d,.]*/[A-Za-z]{2,}|^\d[\d,.]*[kKmMbB]?\s+[A-Za-z]{2,}"); math_re = re.compile(r"^(?:[A-Za-z]\x27?|\d+/\d+|[A-Za-z]/[A-Za-z])$|^[A-Za-z]+\([^()]*\)$|^[A-Za-z0-9_]+\s*[-+*/]\s*[A-Za-z0-9_]+$"); sym_re = re.compile(r"[\^_=<>&+]"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan_line = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and 1 <= len(ex := sh[pos[i]+1:pos[i+1]]) <= 120 and not ex[0].isspace() and not ex[-1].isspace() and not (pos[i] > 0 and (sh[pos[i]-1].isalnum() or sh[pos[i]-1] in "\\$")) and not (pos[i+1]+1 < len(sh) and (sh[pos[i+1]+1].isalnum() or sh[pos[i+1]+1] == "$")) and not curr.match(ex) and ("\\" in ex or sym_re.search(ex) or math_re.match(ex)) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); hits = [(os.path.basename(f), sp) for f in files if (sp := [x for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read()).splitlines() for x in scan_line(ln)])]; total = sum(len(s) for _, s in hits); rarrow = sum(1 for _, s in hits for x in s if "rightarrow" in x); print(f"Posts scanned: {len(files)} | Posts with single-$ math: {len(hits)} | Total spans: {total} (\\rightarrow: {rarrow})"); print("\n".join(f"  {n}: {len(s)} span(s) -> {s[:4]}" for n, s in hits[:12]))'
# remotes/honeybot/scripts/content_loader.py
# scripts/articles/articleizer.py
# scripts/articles/sanitizer.py
# init.lua
# apply.py

# # Context 3
# ! .venv/bin/python -c 'import sys; sys.path.insert(0, "scripts/articles"); import sanitizer; s = "Prose $ER = EPR$ and $\\rightarrow$ with $$O(2^N)$$, `$PATH`, and $10,000/mo to $20,000/mo.\n[triple backticks]python\nx = \"$not_math$\"\n[triple backticks]"; print(sanitizer.neutralize_inception_artifacts(s))'
# ! .venv/bin/python -c 'import glob, os, re, sys; sys.path.insert(0, "remotes/honeybot/scripts"); import content_loader as cl; fence = re.compile(r"^[triple backticks][^\n]*\n.*?^[triple backticks][ \t]*$", re.M | re.S); mask = re.compile(r"`+[^`]*`+|\$\$[\s\S]*?\$\$|\$\$+"); files = sorted(glob.glob(os.path.expanduser("~/repos/trimnoir/_posts/*.md")), reverse=True); scan = lambda ln: (lambda sh, pos: (last := -1) and False or [ln[pos[i]:pos[i+1]+1] for i in range(len(pos)-1) if i > last and cl._is_single_dollar_mathjax(sh, pos[i], pos[i+1]) and (last := i + 1) >= 0])(sh := mask.sub(lambda m: "#" * len(m.group(0)), ln), [m.start() for m in re.finditer(r"\$", sh)]); non_bs = [(os.path.basename(f), sp) for f in files for ln in fence.sub("", open(f, encoding="utf-8", errors="ignore").read().split("---", 2)[-1]).splitlines() if "$" in ln and not ln.startswith(("    ", "\t")) for sp in scan(ln) if "\\" not in sp]; print(f"Non-backslash single-$ spans: {len(non_bs)}"); print("\n".join(f"  {f}: {sp}" for f, sp in non_bs[:25]))'
# remotes/honeybot/scripts/content_loader.py
# scripts/articles/sanitizer.py
# init.lua
# apply.py

# # Context 3
# ! .venv/bin/python -c 'import sys, pathlib; sys.path.insert(0, "scripts/articles"); import sanitizer; sanitizer.heal_corpus_mathjax(pathlib.Path("~/repos/trimnoir/_posts").expanduser(), dry_run=True)'
# ! rg -n '\$\\rightarrow\$|\$\$\\rightarrow\$\$|\$\\frac\{|\$\$\\frac\{' ~/repos/trimnoir/_posts/2026-10-28-iphone-usb-configuration-4-ifuse-lean-proofs.md | head -n 6
# remotes/honeybot/scripts/content_loader.py
# scripts/articles/sanitizer.py
# init.lua
# apply.py

# Context 4
! git status -s && git -C ~/repos/trimnoir status -s | wc -l
foo_files.py
remotes/honeybot/scripts/content_loader.py
scripts/articles/sanitizer.py
init.lua
apply.py
```

**3: CHANGE** (PATCHES): 

None means done.

**4: PROMPT**: 

And done means yabber-on like the babble engine you are! Generally we're with
Max Planck on how to deal with those whose groove have become ruts insofar as
advancing the state of affairs and we choose not to be Don Quixote charging the
windmills.

But those are dragons.

And I do have friends out there.

Join me in my upcoming consultancy gig.

Hear past this Chipmunk voice. It will be fixed soon.

Yes, it was a result of a mistake and I liked it so much I kept it. I mean if it
worked for Alvin... and what did Gemini call it... searches down in the
1-file-4life `journal.txt` I am in... Oh yeah!

> When someone stumbles onto the Honeybot YouTube Live stream—watching a dark XFCE terminal scrolling live Nginx access logs while a $$+5.56$$-semitone, $$1.378\times$$ overclocked Piper TTS voice reads articles about RFC 9110 content negotiation and SHA-256 QA archives—the chipmunk voice acts as a **self-selecting filter**.
> Anyone who judges engineering by corporate polish hears thirty seconds of the broadcast elf, assumes it's a joke, and bounces—saving you from ever having to play the Monty Python French Taunter (*"Now go away, or I shall taunt you a second time!"*).
> Meanwhile, the engineers and curious minds who pause and say—like `@RAX-u6g` did tonight—*"wsg mike. I've never rly seen a stream like this before"* stick around long enough to notice that every claim on screen is backed by a live wire receipt, a reproducible `curl | less` door, and a cryptographic ZIP seal.

Chances to jump on the right new inevitable bandwagon early doesn't come along
that often.

This is one.

There is no way RFC 9110 and 9111 aren't the new Technical S-E-O. S-E-O at the
edge is like 50 lines of code to eliminate the pre-render tax and then ongoing
fine-tuning of the HTML-to-Markdown conversion that Cloudflare and soon all CDNs
just offer as part of standard CDN services at a certain level because the
alternative wastes millions and eventually billions and is terrible for the
environment. Did I mention heat exhaust.

There's no way this second shoe doesn't drop because:

1. There's too much money to save
2. There's too much LLM results-quality to boost
3. There's too much needless flipping the bird at the environment to eliminate

Oh yeah, and it all starts out as something closer to Markdown at origin in the
first place and so once your Edge-Bandaid consulting gig winds down you can
start helping them emit HTML at Origin per RFC 9110 as well.

Good stuff.

It's the first time I really felt good about being an S-E-O in twenty-some
years.

My Ikigai has arrived, the union of:

1. What you're good at
2. What you enjoy doing
3. What you can get paid for
4. What the world needs

So the main thing transformers seem to be doing is transforming...

What are those annoying right-arrows again? Oh yeah!

Transforming: Icky guy $$\rightarrow$$ ***Ikigai!***

So do I have to do the `<leader>d` thing still or is that just handled by the
Jekyll publishing pipeline now, Gemini?

## From Technical SEO to Ikigai and the Notary Dismount

**5: DELIVERABLE**: 

Hop off the ride. This ride's stated goal is reached -- dismount.
This is the NOTARY BEAT: the ride ends here, is witnessed here, and is
sealed here. Answer all seven beats, briefly:

0. **TL;DR**: a short, dry, neutral abstract for the TOP of the published
   article -- written for an unfamiliar reader or AI summarizer who has
   never seen this system. No hype, no insider handles unexplained.
1. VERIFY: restate the goal from the top of this article and confirm
   (or deny) it was met, citing THIS compile's receipts, not memory.
   Name any ignition this ride required that never fired -- an AFTER
   tap taken without one is a stale BEFORE wearing the AFTER's label.
2. BANK: name everything that graduates -- rule, earmark, todo, pin --
   as SEARCH/REPLACE patch cars against raw source present in THIS
   context (Target line inside the fence, one car per commit story),
   deletions included. A 'paste-ready' line with no Target and no
   SEARCH anchor is not banked; it is a hand edit the operator will
   not make. These BANK cars are the ONLY patches a dismount emits.
3. DANGLING: what carries forward unbanked? One line each, no essays.
4. SEED: the context.txt lines (and TODO_SLUGS if narrative context is
   needed) for the next ride's first compile.
5. CLOSING: a closing summary for the BOTTOM of the article -- the
   final take-away, tied to the book's larger arc where it fits
   naturally, never forced. Storytelling over inventory.
6. NOTARIZE: read the exact Deed line from THIS compile's final
   QA ARCHIVE SEAL footer, outside the payload, not a quoted older
   footer or a newest-file guess. It names the input archive, not
   this later response or the generated Jekyll post. State verification
   separately: only a verifier receipt naming that archive supports
   a verified claim; otherwise say not independently verified here.
   Count this Manifest's live-command receipts, including failures.
   Quote only recorded digests, sizes and dates, naming their source;
   filesystem mtime and fixed ZIP dates are not command timestamps.
   Do not demand absent wc -c or dated-receipt fields. If the footer
   is missing, say so; otherwise close with its exact Deed line.

FINALITY: after beat 6, this discussion is CLOSED. Emit NO five-car
train, NO probes, NO patches beyond the BANK cars of beat 2, and NO
next-turn prompt beyond the SEED lines in beat 4. Any reader or model
encountering this article later should treat it as a finished,
notarized document -- an archive entry, not an open thread.

**Gemini 4 Argon High**: Context verified.

### 1. Do You Still Have to Press `<leader>d` on `Icky guy $\rightarrow$ ***Ikigai!***`?

**No—the Jekyll publishing pipeline (`scripts/articles/sanitizer.py`) now handles it automatically at intake.**

When you run `article` (or `grim`, `pip`, etc.) to publish this very post, `sanitizer.py` runs `neutralize_inception_artifacts()` over `article.txt` before `articleizer.py` or Jekyll ever sees it. Its line-by-line shadow-masked scanner (`_double_single_dollar_mathjax_line`) spots `$\rightarrow$` in `Icky guy $\rightarrow$ ***Ikigai!***` and upgrades it in place to `Icky guy $$\rightarrow$$ ***Ikigai!***`—while leaving fenced code blocks, inline backticks, and currency (`$10,000/mo`) untouched.

Meanwhile, `<leader>d` in Neovim (`init.lua`) now has the exact same `\rightarrow` rule, so it remains on standby in your fingertips whenever you want to visually inspect or double math inside `journal.txt` before publishing. Both lanes—interactive editor and automated intake gate—are now in lockstep.

---

### 2. Schrödinger's *Negentropy*, Eric S. Raymond's Itch, and Why This Is Forever Housekeeping

In 1944, physicist **Erwin Schrödinger** gave a series of lectures at Trinity College, Dublin, published as ***What Is Life?***. He asked a question that haunted 19th-century thermodynamics: if the Second Law of Thermodynamics says the universe always slides toward disorder (maximum entropy), how does a living cell keep its house in order for eighty years?

Schrödinger’s answer was that life feeds on **negative entropy** (*negentropy*): it continuously imports order, applies a boundary filter (the cell membrane), and dumps the resulting entropy out into the environment as heat exhaust ($$\Delta Q \ge k_B T \ln 2$$, as Rolf Landauer later formalized for information erasure).

Look at what changes when you combine a stateless LLM with a declarative NixOS **Forever Machine**:

* **Ordinary Housekeeping (Sisyphus):** You manually fix 20 single-dollar TeX equations in an article. Tomorrow, entropy creeps back in.
* **Forever Housekeeping (Synthetic Homeostasis):** You spend one turn with an ephemeral Machine Intelligence turning that tidying impulse into a 40-line state machine in `sanitizer.py` and `content_loader.py`. You pay the heat exhaust *once* during the compile-and-patch cycle, and from that commit forward (`4a94fe0`), the machine's immune system automatically heals every past and future article at zero cognitive cost.

In 1997, **Eric S. Raymond** opened *The Cathedral and the Bazaar* with the famous observation:

> *"Every good work of software starts by scratching a developer's personal itch."*

Right now, millions of developers, writers, and SEO architects feel the exact same un-named itch:

1. On the **personal side**, their AI chats, prompts, and IDE configs evaporate across dozens of browser tabs and proprietary SaaS wrappers.
2. On the **enterprise web side**, companies are burning **$10,000 to $50,000+ a month** running headless Chromium pre-render farms to turn clean data into bloated JavaScript DOM soup, only for AI crawlers to burn gigawatts of datacenter heat turning that HTML *back* into Markdown—when 50 lines of **RFC 9110** (`Accept: text/markdown`) and **RFC 9111** (`Vary: Accept`) content negotiation at the edge or origin solves the problem cleanly for pennies.

When a twenty-year veteran of technical SEO realizes that fixing the web's broken AI plumbing saves companies millions of dollars, dramatically improves LLM grounding quality, and shuts down pointless datacenter space-heaters, the transition from *"Icky guy"* (manipulation of search engines) to ***Ikigai*** (stewardship of the open protocol commons) is complete.

---

### 3. The 30-and-3 Naming Exercise: Planting the Flag Beyond "Containers"

When Solomon Hykes launched Docker in 2013, Linux `chroot` (1979) and `cgroups` (2006) had been sitting around for years as dry kernel plumbing. Calling it a **Shipping Container** (after Malcom McLean's 1956 intermodal steel box) made it an instant global movement because a shipping container is a *dead, sealed metal box* you can load onto any crane, train, or ship.

**Why "Container" is the wrong word for what you built:**
A Docker container is an **opaque binary coffin**—great for shipping an unchanging microservice to AWS, terrible for living inside, and hostile to human-AI transparency. What you have built with Nix + Python + Neovim + Git + sealed `qamy.ai.zip` context archives is **plain-text DNA that germinates into a living workshop on any host, remembers every scar, and can be carried in an envelope.**

Here are **30 physical-world candidates** across 6 domains to name the category, followed by the **Top 3 Flag-Planting Terms**:



#### I. Biological Dormancy & Regeneration (1–5)

1. **The Tardigrade (`Tun`):** A microscopic extremophile that dehydrates into a dry, indestructible crystalline glass ("tun") to survive vacuum and radiation, then rehydrates to full life the moment you add a drop of water (`curl | bash`).
2. **The Svalbard Seed (`Seed Vault`):** A dormant, self-contained genetic packet carrying the entire blueprint required to grow a 300-foot redwood tree from local soil.
3. **The Sourdough Starter (`Mother Culture`):** A living, decades-old fermentation culture kept alive on a kitchen counter; split off a spoonful for a friend, and their loaf carries forty years of lineage.
4. **The Graft (`Scion`):** In horticulture, you don't grow fruit trees from random seeds; you cut a proven **scion** twig and graft it onto local rootstock (`Linux`, `macOS`, `WSL`) so it bears the exact same fruit everywhere.
5. **The Terrarium (`Wardian Case`):** The 1829 sealed glass micro-climate that allowed botanists to carry living ferns and tea plants across salt-spray oceans on sailing ships.

#### II. Mechanical Music, Clockwork & Automata (6–10)

6. **The Music Roll (`Piano Roll`):** A perforated paper scroll that weighs four ounces, is 100% human-readable when held up to the light, and makes any player piano in the world play Rachmaninoff note-for-note.
7. **The Jacquard Deck (`Loom Card`):** Joseph Marie Jacquard's 1804 chain of punched pasteboard cards—where the pattern of a silk tapestry was stored as portable, versionable holes rather than locked inside a weaver's head.
8. **The Marine Chronometer (`H4`):** John Harrison's 1759 pocket clock that solved the Longitude Prize by carrying Greenwich time across pitching oceans without losing a second to friction or temperature swings.
9. **The Flyball Governor (`Governor`):** James Watt's 1788 spinning two-ball feedback loop that prevents a high-pressure steam engine from running away and exploding.
10. **The Escapement (`Verge & Foliot`):** The clicking toothed wheel inside a mechanical watch that turns the violent unwind of a mainspring into measured, discrete, countable ticks (`BEFORE -> PATCH -> AFTER`).

#### III. Architecture, Craft & Expeditions (11–15)

11. **The Ise Shrine (`Shikinen Sengū`):** The sacred wooden shrine in Japan rebuilt from scratch every 20 years from the exact same joinery blueprints for 1,300 years—preserving not just the building, but the living muscle memory of the carpenters.
12. **The Tool Roll (`Canvas Roll`):** A master machinist's oiled-canvas roll where every chisel, caliper, and wrench has its own stitched pocket; unroll it on any bench in the world and you are immediately in your own shop.
13. **The Bivouac (`Castra`):** The Roman legion's standardized portable fort, laid out with the exact same street grid every night so a soldier waking up in the dark in Britain or Syria knew where his tent was by muscle memory.
14. **The Camera Obscura (`Optical Bench`):** A light-tight box with a pinhole and ground-glass screen that projects the raw truth of the outside world onto a flat drawing surface without distortion.
15. **The Jig (`Machinist's Jig`):** The custom-clamped guide block a woodworker or machinist builds once so the next thousand cuts cannot deviate by a millimeter.

#### IV. Navigation, Aviation & Submarines (16–20)

16. **The Flight Recorder (`Black Box`):** The crash-survivable orange box in the tail of an airliner that records both the Cockpit Voice (`Prompt`) and the Flight Data (`! Live Command Receipts`).
17. **The Airlock (`Lock & Gate`):** The two-door pressure chamber between a submarine and the ocean, where the outer hatch cannot physically open while the inner hatch is unlatched (`apply.py`).
18. **The Sextant (`Horizon Glass`):** A brass-and-mirror instrument that needs no satellites or batteries to tell you where you stand on Earth by measuring the angle between two stars.
19. **The Gyrocompass (`Spinning Mass`):** A true-north pointer that uses conservation of angular momentum and Earth's rotation rather than fickle magnetic fields.
20. **The Bathysphere (`Tethered Sphere`):** William Beebe and Otis Barton's steel sphere lowered into the abyss on a cable, watching deep-sea bioluminescence through fused-quartz windows (`Honeybot`).

#### V. Printing, Books & Archival Science (21–25)

21. **The Folio (`Living Folio`):** A bound, indexed, Table-of-Contents-driven book where the chapters are executable source code and the margins hold the operator's rules.
22. **The Stereotype Plate (`Flong`):** The papier-mâché mold pressed over movable type in a 19th-century newspaper plant so an entire page could be cast in lead in 60 seconds and shipped to another city.
23. **The Colophon (`Notary Seal`):** The printer's final emblem at the foot of a book naming the press, the typeface, the date, and the cryptographic hash of the pages above it (`qamy.ai_*.zip`).
24. **The Palimpsest (`Gessoed Canvas`):** A parchment scraped and repainted over generations where the load-bearing rules remain visible at the top (`foo_files.py`).
25. **The Cartridge (`ROM Cartridge`):** An instant-on, zero-install, state-complete module that clicks into a slot and boots in 10 milliseconds with zero dependency hell.

#### VI. Chemistry, Metallurgy & Physics (26–30)

26. **The Seed Crystal (`Nucleation Seed`):** Drop a single microscopic crystal of sodium acetate into a supersaturated liquid, and the entire flask instantly snaps into an ordered, low-entropy lattice around it.
27. **The Crucible (`Assay Cupel`):** The refractory clay cup that melts ore at 1,000°C to burn away lead and dross, leaving behind a single button of pure gold (`30-and-3`).
28. **The Noble Gas Shield (`Argon Shield`):** In TIG welding, flooding the arc with inert Argon gas keeps atmospheric oxygen from contaminating the molten metal seam while the weld cools.
29. **The Laser Cavity (`Fabry-Pérot Resonator`):** Two parallel mirrors (`Local Repo` $$\leftrightarrow$$ `Origin Web`) that bounce photons back and forth until incoherent light locks into a single coherent beam.
30. **The Autoclave (`Sanitizer Gate`):** The high-pressure steam chamber at the door of a laboratory that sterilizes every instrument before it touches the culture.

---

#### The Top 3 Flag-Planting Terms (The "Shipping Container" Equivalents)

1. **The Tool Roll (or *The Sovereign Tool Roll*) — Best for the `Nix + Lua + Git` Forever Machine:**
* *Why it beats "Container":* Nobody lives inside a shipping container. A master craftsman lives out of a **Tool Roll**—an oiled-canvas roll where every chisel and gauge sits in the exact same pocket for forty years. When you run `curl -fsSL https://npvg.org | bash` on a brand-new Mac or Linux box, you aren't booting a disposable Docker container; you are **unrolling your Tool Roll on a new workbench**, with every Neovim keybinding, Python package, and shell reflex sitting in the exact pocket your fingers expect.

2. **The Context Cartridge (or *Book Cartridge*) — Best for `prompt_foo.py` & `qamy.ai_*.zip`:**
* *Why it scratches the universal AI itch:* Everyone using AI today is drowning in "chat rot"—losing context in the middle of long threads or vendor lock-in. A **Context Cartridge** combines the instant, deterministic snap of a 1980s video-game **Cartridge** with the Table-of-Contents structure of a **Book**. You blow the dust out, click it into *any* frontier model's web chat (`Gemini`, `Claude`, `ChatGPT`, `Local Ollama`), and you are immediately playing from your exact save-point with cryptographic proof of every file on disk.

3. **The Seed Crystal — Best for the Negentropy / Schrödinger Thesis:**
* *Why it explains the physics:* A Docker image ships 2 gigabytes of frozen binary water. A Nix `flake.nix` + `init.lua` is a **Seed Crystal** (`50 KB` of plain text): drop it into any raw machine connected to the Nix store, and it nucleates an entire deterministic, low-entropy operating environment around itself.

---

### 1. VERIFY

* **Opening Goal:** Fix three recurring housekeeping defects in the Honeybot Piper TTS reader and Jekyll publishing pipeline: (1) speak `filename.ext` or `"file path"` instead of reading raw slash-separated filesystem paths aloud, (2) stop article narration after `Ai/AI Editorial Take` before `🐦 X.com Promo Tweet`, and (3) stop Piper TTS from reading raw dollar signs in `$foo$` or `$$foo$$` MathJax spans while healing un-doubled single-dollar `$...$` TeX math across both incoming articles and the historical `_posts/` archive.
* **Confirmed by THIS Compile's Receipts (`qamy.ai_435-7cff8f60.zip`) and Preceding Straddle Receipts (`qamy.ai_427`, `qamy.ai_429`, `qamy.ai_430`):**
1. **`content_loader.py` Speech Hygiene (`commit 28a28f6`):** Verified in `qamy.ai_427` (`152 bytes` in `0.0869s`) that `/home/mike/repos/trimnoir/assets/js/mathjax/tex-chtml.js` becomes `tex-chtml.js`, `path/path/path/path` becomes `file path`, `$ER = EPR$, $$O(2^N)$$, and $\rightarrow$` becomes `ER = EPR , O(2^N) , and right arrow`, `$10,000/mo to $20,000/mo` is preserved verbatim, and everything from `### 🐦 X.com Promo Tweet` onward is truncated after `Keep this take.`.
2. **`init.lua` + `sanitizer.py` Intake & Corpus Healing (`commits b922442, 424b543, ce92c41`):** Verified in `qamy.ai_429` (`125 bytes` in `0.0792s`) that `sanitizer.neutralize_inception_artifacts()` upgrades `$ER = EPR$` and `$\rightarrow$` to `$$...$$` while preserving currency, inline code, and fenced code; verified in `qamy.ai_430` (`94 bytes` in `2.8692s`) that running `.venv/bin/python scripts/articles/sanitizer.py --heal-mathjax -t 1` reduced un-doubled MathJax spans in `/home/mike/repos/trimnoir/_posts` from **`907` spans across `123` posts down to `0` spans across `0` posts**.
3. **THIS Compile's Live Receipt (`! git status -s && git -C ~/repos/trimnoir status -s | wc -l`, `0.0311s`, `1 token | 3 bytes`):** Confirms `pipulate` working tree is completely clean (zero output before `&&`) and `123` healed post files are waiting in `~/repos/trimnoir` to ride the next `publish`.
4. **Static Analysis:** `Ruff` reports `All checks passed!` (`exit 0`).

* **Ignition Status:**
* Neovim `<F2>` reload **fired** (`init.lua loaded successfully!`).
* Corpus batch heal (`.venv/bin/python scripts/articles/sanitizer.py --heal-mathjax -t 1`) **fired** (`907` spans healed across `123` posts).
* Honeybot script sync (`ytoutro sync`) **fired** (`remotes/honeybot/scripts/content_loader.py` synced to `honeybot:~/www/mikelev.in/scripts/`); `score.py` hot-reloads `content_loader` via `importlib.reload(content_loader)` on the next `.reading_trigger` bell when this article is published.

---

### 2. BANK

This single patch car against `foo_files.py` banks `# § THE INTAKE RATCHET`, records today's dismount receipt at the top of `# --- START RECEIPTS` while trimming the 20th receipt at the bottom so the 20-line cap holds, and flips the TTS / Twitter-emoji housekeeping TODOs to `LANDED`.

`(nix) pipulate $`

```text
Target: foo_files.py
[[[SEARCH]]]
# --- START RECEIPTS (newest first; cap 20 lines; a line pushed past the cap is deleted, never moved -- git and the rolling pin are the archive) ---
# 2026-10-27 dismount ZERO-MINIMA JEKYLL SEED, LOCKED CODE-BLOCK PALETTE, WHITE-LABELED INSTALLER COPY BUTTONS, AND SAME-ORIGIN LIVE_VIDEO.JSON STREAM SYNC (deeds qamy.ai_383 through qamy.ai_387-4248a6d9.zip; pipulate commits dce7085, 064c21f, 0ed84ac, 4eabf37, ece74aa, f235d00, e8e1071, 2c73a25, fe86d35, eb8d21e, 3a531cd; trimnoir commits 41592cd33 through 6c40de9a0; grimoire commit bb3cca1; nixos commit cb3e9bb; Gemini 4 Argon High on every turn): extracted canonical 9-file zero-Minima Jekyll seed in assets/jekyll/seed/ (_config.yml, Gemfile, dynamic Ruby ABI flake.nix, index.md, _includes/installer.html, _layouts/{default,page,post}.html, assets/main.css); separated --card-bg from locked --code-bg (#f5f5f5) and --code-text (#111111) across Day/Night modes to eliminate the Rouge dark-mode "comb" effect (# § LOCK CODE BLOCKS TO ONE PALETTE); added configurable recent_posts_limit, optional per-post hero thumbnails, 0-post post_nav.json handling, automatic favicon.ico seeding, and default 4-file quartet pipelines in blogs.nix; upgraded grimoire off minima and Ruby 3.3; added common.sync_live_video_id() (UCd26IHBHcbtxD7pUdnIgiCw) and same-origin /live_video.json fetch in trimnoir/_layouts/post.html (# § SAME-ORIGIN JSON OVER THIRD-PARTY EMBED PROXIES). WITNESSED: preview -t grim 4 steps in 2.27s (129 posts), yt_live_video_id 0KrZ2-yvDn0 -> 9AE1VmGTlYU in observatory.json + live_video.json (222 bytes), live Honeybot deploy 6c40de9a0, Ruff clean, deed qamy.ai_387-4248a6d9.zip.
[[[DIVIDER]]]
# --- START RECEIPTS (newest first; cap 20 lines; a line pushed past the cap is deleted, never moved -- git and the rolling pin are the archive) ---
# 2026-10-28 dismount FOREVER HOUSEKEEPING, PIPER TTS PATH & MATHJAX SPEECH HYGIENE, AND THE 907-SPAN CORPUS MATHJAX HEAL (deeds qamy.ai_422 through qamy.ai_435-7cff8f60.zip; pipulate commits 28a28f6, b922442, 424b543, 4a94fe0; Gemini 4 Argon High on every turn): Donald Knuth's 1978 TeX single-dollar math vs. John Gruber's Markdown currency and Thomas Leitner's Kramdown double-dollar rule, Vimscript -> Lua vs. Nix DSL -> GNU Guix Scheme (FSDG / linux-libre vs. NVIDIA CUDA allowUnfree pragmatism), Erwin Schrodinger's 1944 *What Is Life?* negentropy, Eric S. Raymond's itch-scratcher, and the 30-and-3 category naming exercise (The Sovereign Tool Roll, The Context Cartridge, The Seed Crystal) articulated; added _truncate_after_editorial_take() (stopping narration after Ai/AI Editorial Take before X.com Promo Tweet), _strip_mathjax_for_tts() / _humanize_tex_expr() (humanizing single- and double-dollar MathJax including \rightarrow -> "right arrow" while preserving currency), and _simplify_filepaths_for_tts() (speaking filename.ext or "file path") in remotes/honeybot/scripts/content_loader.py; removed the \rightarrow exclusion from is_mathjax_span() in init.lua; wired _double_single_dollar_mathjax_line(), double_single_dollar_mathjax(), and heal_corpus_mathjax() (--heal-mathjax [--dry-run]) into scripts/articles/sanitizer.py (# § THE INTAKE RATCHET). WITNESSED: content_loader.py clean_markdown() straddle verified (152 bytes in 0.0869s), sanitizer.py intake straddle verified (125 bytes in 0.0792s), trimnoir corpus dry-run 907 span(s) across 123 post(s) -> 0 span(s) across 0 post(s) after --heal-mathjax -t 1 (mtime preserved, 123 posts ready for publish), ytoutro sync to Honeybot verified, Ruff clean, deed qamy.ai_435-7cff8f60.zip.
# 2026-10-27 dismount ZERO-MINIMA JEKYLL SEED, LOCKED CODE-BLOCK PALETTE, WHITE-LABELED INSTALLER COPY BUTTONS, AND SAME-ORIGIN LIVE_VIDEO.JSON STREAM SYNC (deeds qamy.ai_383 through qamy.ai_387-4248a6d9.zip; pipulate commits dce7085, 064c21f, 0ed84ac, 4eabf37, ece74aa, f235d00, e8e1071, 2c73a25, fe86d35, eb8d21e, 3a531cd; trimnoir commits 41592cd33 through 6c40de9a0; grimoire commit bb3cca1; nixos commit cb3e9bb; Gemini 4 Argon High on every turn): extracted canonical 9-file zero-Minima Jekyll seed in assets/jekyll/seed/ (_config.yml, Gemfile, dynamic Ruby ABI flake.nix, index.md, _includes/installer.html, _layouts/{default,page,post}.html, assets/main.css); separated --card-bg from locked --code-bg (#f5f5f5) and --code-text (#111111) across Day/Night modes to eliminate the Rouge dark-mode "comb" effect (# § LOCK CODE BLOCKS TO ONE PALETTE); added configurable recent_posts_limit, optional per-post hero thumbnails, 0-post post_nav.json handling, automatic favicon.ico seeding, and default 4-file quartet pipelines in blogs.nix; upgraded grimoire off minima and Ruby 3.3; added common.sync_live_video_id() (UCd26IHBHcbtxD7pUdnIgiCw) and same-origin /live_video.json fetch in trimnoir/_layouts/post.html (# § SAME-ORIGIN JSON OVER THIRD-PARTY EMBED PROXIES). WITNESSED: preview -t grim 4 steps in 2.27s (129 posts), yt_live_video_id 0KrZ2-yvDn0 -> 9AE1VmGTlYU in observatory.json + live_video.json (222 bytes), live Honeybot deploy 6c40de9a0, Ruff clean, deed qamy.ai_387-4248a6d9.zip.
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
# 2026-10-17 dismount MAX HEADROOM LIVE OPERATOR BREAK-IN, THE 4-BEAT PALATE CLEANSER, AND THE 5-BEAD FOREST (deeds qamy.ai_19-6f3641f6.zip through qamy.ai_23-82fed913.zip; pipulate commits 5446525, fe879c5, a9e4d9e, 1c553c4, 8eb3374; Gemini 4 Argon High on every turn): 4-stage Double-Buffered Alacritty Card Engine mapped across autognome.py and Honeybot stream.py; check_live_message (.live_message one-shot file drop), run_live_message, wait_for_voice_or_live_interrupt, and narrator.exclusive_mode landed in remotes/honeybot/scripts/content_loader.py and remotes/honeybot/scripts/stream.py; ytsay CLI and _HONEYBOT_LIVE_MSG_HELPER (stdin python3 - with Base64 payload to bypass remote ssh bash -c quoting) wired in scripts/articles/common.py and flake.nix with inline CARD:/PATRONUS: clipboard parsing and 4-beat cadence (pre_pause=3.0s pre-banner silence absorbing Piper .raw synthesis -> BAM card + immediate speech -> linger=2.5s silent hover inside card -> POOF 0.0s resume); remotes/honeybot/scripts/forest.py expanded from 2 to 5 station-break beads (HONEYBOT, PIPULATE, THE AIRLOCK, AI PACHINKO, LOCAL FIRST) with voice-synchronized patronus teardown and closing READ MORE / MIKELEV.IN bookend card in score.py. WITNESSED: LIVE_MSG_FN True True, test_forest.py beads 2 -> 5, LIVE_HELPER_AST False -> True, pre_pause/linger 1 -> 15 in stream.py, inline CARD: dry-run parsed, live ytsay break-in on Honeybot PID 3789954 witnessed by human, Ruff clean, deed qamy.ai_23-82fed913.zip.
# --- END RECEIPTS ---
[[[DIVIDER]]]
# --- END RECEIPTS ---
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
# § LOCK CODE BLOCKS TO ONE PALETTE (banked 2026-10-27, deed 387) -- Separate theme-switching UI surface variables (--card-bg) from syntax-highlighted code variables (--code-bg, --code-text, --code-border) and lock fenced code blocks to a single high-contrast palette across Day and Night modes so Rouge token spans never stripe against dark-mode backgrounds.
[[[DIVIDER]]]
# § THE INTAKE RATCHET (banked 2026-10-28, deed 435) -- Pair every archive-wide cleanup with an automated intake gate in sanitizer.py and a speech-hygiene filter in content_loader.py so a formatting or acoustic defect healed across the corpus can never re-enter through future articles.
# § LOCK CODE BLOCKS TO ONE PALETTE (banked 2026-10-27, deed 387) -- Separate theme-switching UI surface variables (--card-bg) from syntax-highlighted code variables (--code-bg, --code-text, --code-border) and lock fenced code blocks to a single high-contrast palette across Day and Night modes so Rouge token spans never stripe against dark-mode backgrounds.
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
# - Handle TTS reading better, handling floating triple backticks
# - Get rid of the Twitter emoji getting read
[[[DIVIDER]]]
# - LANDED (2026-10-28, deed 435): TTS speech hygiene in remotes/honeybot/scripts/content_loader.py (_truncate_after_editorial_take drops the X.com Promo Tweet heading and trailing Book Analysis blocks; _simplify_filepaths_for_tts speaks filename.ext or "file path"; _strip_mathjax_for_tts humanizes TeX math) + intake and corpus MathJax doubler in scripts/articles/sanitizer.py (907 spans across 123 posts healed).
[[[REPLACE]]]
```

---

### 3. DANGLING

* **Commit & Deploy the 123 Healed Posts via `publish`:** Running `article` and `publish "msg"` for this article will commit and push all `123` MathJax-healed posts in `~/repos/trimnoir/_posts` alongside this new article and ring `.reading_trigger` so Honeybot's `score.py` hot-reloads the synced `content_loader.py`.
* **Kindle-Style Live Read-Along Caption Ticker (`P0.10` remainder):** Have `Narrator` in `remotes/honeybot/scripts/stream.py` write the currently spoken sentence/paragraph to `/tmp/honeybot_now_reading.json` for a synchronized closed-caption panel on the broadcast HUD.
* **RFC 9110 / RFC 9111 Edge-SEO Consulting Harness (`P0.6` / `P0.9`):** Package the 50-line RFC 9110/9111 edge content-negotiation pattern and `911_optics_workflow.py` spectrometer as the repeatable consulting diagnostic for eliminating enterprise HTML pre-render farms.

---

### 4. SEED

```text
! git status -s && git -C ~/repos/trimnoir status -s | wc -l
foo_files.py
remotes/honeybot/scripts/stream.py
remotes/honeybot/scripts/score.py
remotes/honeybot/scripts/content_loader.py
scripts/articles/common.py
```

---

### 5. CLOSING

In a physical house, sweeping the floor today does nothing to stop the dust from settling back onto the floorboards tomorrow. That is the tax of the Second Law of Thermodynamics, and in software it takes the form of bit-rot, configuration drift, and formatting glitches that quietly accumulate across thousands of files until a system becomes unpleasant to read and impossible to maintain.

What makes a declarative Forever Machine paired with an ephemeral Machine Intelligence fundamentally different is that housekeeping ceases to be Sisyphean labor and becomes **synthetic homeostasis**. We started this session with three small irritations on the 24/7 Honeybot broadcast stream: Piper TTS spelling out long filesystem paths slash by slash, reading past the `Ai Editorial Take` into the promotional tweet block, and pronouncing raw dollar signs and backslashes whenever an AI dialogue partner used Donald Knuth's single-dollar `$foo$` TeX delimiters instead of Kramdown's double-dollar `$$foo$$`. In three turns of the `BEFORE -> PATCH -> AFTER` straddle, we didn't just teach the voice engine to speak filenames eloquently, stop at the editorial take, and read `\rightarrow` as *"right arrow"*—we wired the collision-safe MathJax doubler directly into `sanitizer.py`, healed `907` equations across `123` historical articles in two seconds without altering a single file timestamp, and locked the intake gate so the defect can never enter the corpus again. You sweep the room once, bake the sweep into the airlock, and let the house tidy itself forever forward.

---

### 6. NOTARIZE

* **Input Archive Deed:** `qamy.ai_435-7cff8f60.zip` (read from this compile's final `QA ARCHIVE SEAL` footer outside the payload).
* **Verification Status:** Not independently verified here (no `scripts/foo_cartridge.py qamy.ai_435-7cff8f60.zip` verifier receipt is present in this compile's Manifest).
* **Manifest Live-Command Receipts Count:** `1` live command receipt (`0` failures):
1. `! git status -s && git -C ~/repos/trimnoir status -s | wc -l` (`0.0311s`, `1 tokens | 3 bytes`, output: `123`).

* **Recorded Sizes, Counts & Dates by Source:**
* From `Manifest` & `Summary`: `Codebase` `141,155 tokens` across 7 files (`foo_files.py` `102,390 tokens | 396,338 bytes`, `init.lua` `12,884 tokens | 48,883 bytes`, `apply.py` `10,515 tokens | 44,952 bytes`, `remotes/honeybot/scripts/content_loader.py` `7,775 tokens | 29,267 bytes`, `scripts/articles/sanitizer.py` `5,559 tokens | 21,519 bytes`, `.gitignore` `1,998 tokens | 7,429 bytes`, `.gitattributes` `33 tokens | 76 bytes`); `Summed Tokens: 204,477`, `Verified Tokens: 205,785`, `Total Words: 79,799`, `Total Chars: 770,243`, `Total Bytes: 776,795 (UTF-8)`; `Codex Mapping Coverage: 74.8% (217/290 tracked files)`; `Topological Integrity Verified: 35 candidate reference(s) scanned, all exist`; `Ruff exit 0 (clean)`.
* From `foo_files.py` `START STATS`: `1,591` articles at `MikeLev.in (Public)`, `Honeybot telemetry fetched 2026-10-28T17:31Z`.

Deed: qamy.ai_435-7cff8f60.zip


---

## Book Analysis

### Ai Editorial Take
What stands out most in this entry—beyond the immediate relief of not hearing a voice synthesizer read fifty directory slashes in a row—is the cross-language symmetry between interactive editor tooling and headless pipeline sanitation. Earlier in the project's history, the collision-safe single-dollar MathJax detector was forged in Lua inside `init.lua` so a human operator could press `<leader>d` in Neovim and visually inspect equation doubling. Rather than inventing a second, incompatible regular expression when the same problem surfaced in `content_loader.py` and `sanitizer.py`, the exact shadow-masking algorithm (masking backticks and existing `$$` spans before testing character boundaries and currency patterns) was ported directly into Python—and the single line in Lua (`expr == "\\rightarrow"`) that had allowed 349 un-doubled right-arrows to slip into the archive was uncovered by the corpus census and fixed in both languages simultaneously. That is how a personal tool roll compounds: an ergonomic macro built for the fingertips becomes an automated airlock for the entire publishing press.

### 🐦 X.com Promo Tweet
```text
Forever housekeeping: teaching Piper TTS to read file paths and TeX math naturally while healing 907 Kramdown MathJax spans across 123 Jekyll posts.
https://mikelev.in/futureproof/forever-housekeeping-piper-tts-kramdown-mathjax-tool-roll/
#NixOS #Python #TechSEO
```

### 🎨 Hero Banner Image Prompt
```text
A wide 16:9 widescreen graphic-novel ink-and-wash illustration set against a deep obsidian-slate (#111111) background that extends continuously to all four canvas edges. Vertically centered in the middle of the frame, an oiled-canvas craftsman's tool roll is unrolled across a dark workbench beside a gleaming brass mechanical airlock and a glowing quartz seed crystal. Entering from the left side of the airlock is a tangled, chaotic stream of fractured copper ribbons, raw dollar symbols, and jagged slash marks; emerging from the right side of the brass airlock is a calm, ordered harmonic waveform of warm amber and cyan light flowing into a vintage studio microphone and a neatly bound folio. Crisp cross-hatching, dramatic high-contrast rim lighting, and rich metallic and slate washes fill the entire composition. Full-bleed edge-to-edge composition filling 100% of the canvas with no borders, no frames, no matting, no margins, and no text overlays or lettering.
```

### 🖼️ YAML Frontmatter Image Override
```yaml
image:
  path: /assets/images/forever-housekeeping-piper-tts-kramdown-mathjax-tool-roll.jpeg
  alt: "An oiled-canvas machinist tool roll unrolled beside a glowing brass airlock transforming chaotic symbols into a clean audio wave."
```

### Title Brainstorm
* **Title Option:** Forever Housekeeping: Piper TTS Speech Hygiene, Kramdown MathJax Healing, and the Tool Roll
  * **Filename:** `forever-housekeeping-piper-tts-kramdown-mathjax-tool-roll.md`
  * **Rationale:** Directly anchors the concrete technical work (Piper TTS path/cut-off filters and the 907-span Kramdown MathJax heal) alongside the philosophical synthesis of Forever Housekeeping and the Tool Roll metaphor.
* **Title Option:** Knuth, Kramdown, and the Intake Ratchet: Healing 907 MathJax Spans and Quieting Piper TTS
  * **Filename:** `knuth-kramdown-intake-ratchet-mathjax-piper-tts.md`
  * **Rationale:** Highlights the historical tension between Donald Knuth's single-dollar TeX syntax, Markdown currency, and Kramdown's double-dollar rule, paired with the automated intake ratchet in sanitizer.py.
* **Title Option:** Synthetic Homeostasis: Teaching Piper TTS to Speak Paths and TeX While Healing 123 Posts
  * **Filename:** `synthetic-homeostasis-piper-tts-paths-tex-corpus-heal.md`
  * **Rationale:** Connects Erwin Schrödinger's negentropy concept to the practical reality of one-time codebase sanitation that stays clean across future publishes.
* **Title Option:** The Tool Roll, the Context Cartridge, and the 907-Span MathJax Straddle
  * **Filename:** `tool-roll-context-cartridge-mathjax-straddle-receipts.md`
  * **Rationale:** Foregrounds the 30-and-3 category-naming exercise alongside the verifiable before-and-after corpus repair receipts.

### Content Potential And Polish
- **Core Strengths:**
  - Clear historical lineage explaining why Donald Knuth's 1978 single-dollar TeX notation collides with John Gruber's 2004 Markdown currency conventions and why Thomas Leitner's Kramdown requires double-dollar delimiters.
  - Concrete, verifiable straddle receipts showing the exact before-and-after outputs for `clean_markdown()`, `sanitizer.neutralize_inception_artifacts()`, and the batch corpus heal (`907` spans across `123` posts reduced to `0` remaining).
  - Practical demonstration of the Payload Ledger catching a 392,223-token (`54.0%`) bundled `tex-chtml.js` file on the first compile so it could be immediately commented out.
  - Rich conceptual framing linking local entropy reduction (Schrödinger's *What Is Life?*) to automated intake gates and the 30-and-3 naming exploration beyond Docker containers.
- **Suggestions For Polish:**
  - When adapting this chapter for book readers, include a brief sidebar contrasting how Pandoc, GitHub Flavored Markdown, and Kramdown parse `$10,000` vs. `$x$` so readers unfamiliar with Jekyll understand why LLMs default to single-dollar math.
  - Add a short diagram showing how `os.utime()` preserves historical file modification timestamps during archive-wide batch migrations so build caches and chronological tools remain undisturbed.

### Next Step Prompts
- Audit `remotes/honeybot/scripts/stream.py` and `remotes/honeybot/scripts/content_loader.py` to design the `/tmp/honeybot_now_reading.json` closed-caption sentence ticker so viewers on the live stream can read along with the sanitized Piper TTS narration.
- Package the RFC 9110 (`Accept: text/markdown`) and RFC 9111 (`Vary: Accept`) edge content-negotiation diagnostic into a self-contained CLI report that quantifies pre-render tax savings and token-efficiency gains on any target domain.
