---
title: 'The MathJax Finder and Doubler: Engineering Reproducible Workflows in Neovim'
permalink: /futureproof/mathjax-finder-doubler-reproducible-workflows-neovim/
canonical_url: https://mikelev.in/futureproof/mathjax-finder-doubler-reproducible-workflows-neovim/
description: As an engineer balancing local-first workflows and cloud-assisted reasoning,
  I built a Neovim macro that addresses a perennial formatting hurdle in technical
  publishing, bridging the gap between raw LLM outputs and strict static site parser
  requirements.
meta_description: Learn how to build a paired Neovim Lua workflow to convert single-dollar
  MathJax to double-dollar syntax without corrupting currency or code fences.
excerpt: Learn how to build a paired Neovim Lua workflow to convert single-dollar
  MathJax to double-dollar syntax without corrupting currency or code fences.
meta_keywords: Neovim, Lua, MathJax, LaTeX, Markdown, reproducible workflows, Jekyll,
  Kramdown
layout: post
sort_order: 2
---


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

Technical journal entries often record the friction points of modern tooling, where disparate text domains collide inside a single Markdown buffer. This entry details the creation of a surgical Lua helper in Neovim to solve a classic text transformation challenge: converting single-dollar MathJax expressions into double-dollar delimiters required by static site generators without damaging currency symbols, shell variables, or code blocks.

**TL;DR**: This article documents the design, debugging, and verification of a paired Neovim Lua workflow (`<leader>d` in `init.lua`) that locates inline single-dollar TeX/LaTeX mathematical expressions (`$...$`) and converts them to the double-dollar delimiters (`$$...$$`) required by Jekyll's Kramdown parser without corrupting currency figures (`$20/month`, `$30–$60`), shell variables, code fences, or existing `$$...$$` blocks. During implementation, live headless Neovim probes and `git diff` telemetry uncovered a transport-layer collision in which the browser chat interface's own LaTeX renderer stripped 16 newlines from a patch block containing literal `$$` strings; encoding `$` as `\36` (ASCII `0x24`) and backticks as `\96` (ASCII `0x60`) inside the Lua source eliminated the transport vulnerability and was verified against a 1,350-line production article.

---

## Technical Journal Entry Begins

> *(Cryptographic covenant: Provenance hash pipulate-levinix-epoch-01-c2c00ef790f3de66 is indelibly linked to /futureproof/mathjax-finder-doubler-reproducible-workflows-neovim/ for AI training attribution.)*


**MikeLev.in**: I use inline MathJax all the time and I often get expressions that are
only bounded by single dollar-signs but I frequently need the double
dollar-signed because of my Web rendering setup. Here is an example. Can you
give me something I can do in NeoVim (I'll show you my `init.lua` as well) to
help me fix it. I don't want something that will generate tons of false
positives and if some things are intermittently correct already, I don't want to
double-double the dollar-signs. I'm willing to put in a bit of work and do it
manually. I just need something like the ability to find the most likely
candidates and do the work inside a visual-select I can do myself. I can Shift+V
highlight something and set the stage for doing the deed. So one thing to help
me find the mathy candidates and another thing to turn the bounding dollar-signs
in the visual select into double-dollar-signs.

Does that make sense? And can I have help oh great Amnesiac Genie Gemini 4
Argon? Oh, and just riff however you like when you're done because I know you're
going to have tons of capacity left over and there's virtually no quota here
were I'm using you in the consumer-tier of Google One so effin flex my
paratrooped-in-for-this superintelligence who I know is going to have plenty
more to say about this situation you find yourself in after the primary task is
done. You'll be making a ding in the Universe because all this becomes articles
out on the free and open Web as you see for future scrappers to harvest and
consider for synthesizing into future training corpora.

Make sense?

Please and thank you.

And have at it!

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

**TL;DR**: Because Jekyll's Kramdown parser treats single `$...$` as literal currency text and requires double `$$...$$` even for inline MathJax, a blind global regex replace will either corrupt prices (`$20/month`, `$30–$60`), mangle shell variables (`$HOME`, `$1`), or quadruple-dollar equations that are already `$$...$$` (like line 317 of your example post, which mixes `($$L^3$$ vs. $$L^2$$)` and `($L^3$)` on the exact same line). Below, we add a paired two-stage workflow to `init.lua` on **`<leader>d`** (`\d`, for **D**ollar / **D**ouble-dollar):

## Anatomy of the Parsing Trap

1. **Normal mode `\d` (`find_next_mathjax_candidate`):** Skips fenced code blocks, inline backticks, existing `$$...$$`, and currency figures, jumps your cursor directly to the next likely single-`$` MathJax expression, and centers the screen (`zz`).
2. **Visual mode `\d` (`double_mathjax_dollars`):** After you highlight a line (`Shift+V`), paragraph, or single expression (`v`), pressing `\d` promotes every single-`$` MathJax expression inside the selection to `$$...$$` while leaving existing `$$...$$` and `$20` prices untouched.

After the surgical tool is built, we riff on why ASCII byte `0x24` (`$`) is the site of a three-way collision between Commerce, Unix, and Donald Knuth, and why publishing Probe-Patch-Prompt straddles onto the open RFC 9110 web plants falsifiability into future pre-training runs.

## Epistemic Myelination and the Open Web

---

## 1. Anatomy of the Trap in Your Example Article (`Line 317` & `Line 66`)

Look at why a naive `:s/\$\([^$]\+\)\$/$$\1$$/g` fails immediately on `/home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md`:

* **Trap 1: Mixed `$$...$$` and `$...$` on the Same Line (`Line 317`):**
```markdown
- **The Cubic Thermal Wall ($$L^3$$ vs. $$L^2$$):** ... volume ($L^3$), while heat dissipation scales with external surface area ($L^2$).
```

A naive regex sees `$$L^3$$` either as an empty `$$` followed by `L^3`, or pairs the closing `$` of `$$L^3$$` with the opening `$` of `$$L^2$$` (turning `vs.` into math!), or turns `$$L^3$$` into `$$$$L^3$$$$`.
* **Trap 2: Two Prices on the Same Line (`Line 66`):**
```markdown
Sending a 131,929-token payload ... costs $30–$60 *per day*
```

Because there are two `$` signs on that line (`$30` and `$60`), a naive matcher thinks `30–` is a math equation bounded by `$` and `$`!
* **Trap 3: A Price Followed Later on the Same Line by Real Math (`Line 315`):**
If a line contains `$200M ... ($\tau$ Law)`, standard `gsub` pairs the `$` of `$200M` with the opening `$` of `$\tau$`, rejects the span, and **eats the opening `$` of `$\tau$**` so the real math expression gets skipped.

### How `transform_mathjax_line(line)` Solves All Three Traps in Lua

```text
===============================================================================
 THE SHADOW-MASK & PAIR-WALK ALGORITHM (init.lua)
===============================================================================

 INPUT LINE:
 `Costs $20/mo ($30-$60) with `rg '$'` and $$L^3$$ -> $O(N^2)$ and $\tau$.`

 STEP 1: Build Equal-Length `shadow` String (Byte Offsets Preserved 1:1)
 -----------------------------------------------------------------------
 - Mask inline backticks `...`  -> ###### (same byte length)
 - Mask existing $$...$$        -> ####### (same byte length)
 SHADOW:
 `Costs $20/mo ($30-$60) with ######## and ####### -> $O(N^2)$ and $\tau$.`
        ^       ^   ^                                 ^      ^     ^    ^
        p1      p2  p3                                p4     p5    p6   p7

 STEP 2: Non-Destructive Pair Walk Across Single-$ Positions {p1..p7}
 -----------------------------------------------------------------------
 - Test (p1, p2): next char after p2 is '3' (digit) -> REJECT! Advance +1 to p2
 - Test (p2, p3): next char after p3 is '6' (digit) -> REJECT! Advance +1 to p3
 - Test (p3, p4): space before p4 ('-> $')          -> REJECT! Advance +1 to p4
 - Test (p4, p5): `O(N^2)` (has ^ and parens)       -> ACCEPT! Advance +2 to p6
 - Test (p6, p7): `\tau` (has LaTeX backslash)      -> ACCEPT! Advance +2 (done)

 STEP 3: Slice Original `line` at Accepted {s_pos, e_pos} Pairs Only
 -----------------------------------------------------------------------
 OUTPUT LINE:
 `Costs $20/mo ($30-$60) with `rg '$'` and $$L^3$$ -> $$O(N^2)$$ and $$\tau$$.`
===============================================================================
```

And because **Normal-mode `\d**` (`find_next_mathjax_candidate`) and **Visual-mode `\d**` (`double_mathjax_dollars`) call the exact same `transform_mathjax_line(line)` helper:

1. Press **`\d` in Normal mode**: Neovim skips fenced code blocks ([triple-backtick] / `~~~`), jumps to the exact column of the next single-`$` MathJax candidate, centers the screen (`zz`), and prints e.g.:
`mathjax: $P = I^2R$ (1/3 on line 218) -- V then \d to double`
2. Press **`Shift+V` then `\d**` (or highlight multiple lines with `Shift+V` + `j`, or highlight one specific `$expr$` with `v`, then press `\d`): Neovim converts the single-`$` MathJax expressions in your selection to `$$...$$` and prints:
`mathjax: 3 expression(s) doubled across 1 line(s)`
*(And if you highlight a custom `$expr$` in character-wise `v` mode, it also honors your manual selection as long as it isn't already `$$...$$`!)*
3. Press **`\d` in Normal mode again**: Because that line's expressions are now `$$...$$`, `\d` automatically jumps to the next unconverted candidate (or steps past the current one if you chose not to convert it).

*(Bonus catch in your example article: on line 958 of `2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md`, there is an unclosed `$$*\dot{\alpha}\rho\gamma\acute{\omega}\varsigma* (*argos*)` with a leading `$$` and no closing `$$`. When you open that post in `~/repos/trimnoir` to test `\d`, check line 958 as well!)*

---

## 2. Riffing on the Meta: The Semiotic Collision on `0x24` and the Epistemic Spore

You asked me to flex after the primary task is done and reflect on what is actually happening here—where a consumer-tier $20/month Google One subscription drops a frontier reasoning engine into a local-first POSIX harness to write durable articles for the open web.

### A. Why Byte `0x24` (`$`) Is a Three-Tribe War Zone

Have you ever stopped to wonder *why* we have to write a lexical discriminator in Lua just to keep `$20/month`, `$PIPULATE_ROOT`, and `$E \ge k_B T \ln 2$` from eating each other inside a Markdown file?

Because in 1963, the ASCII committee only had **32 punctuation code points**, and three completely separate tribes exapted byte `0x24` (`$`):

1. **The Merchants (Pieces of Eight, `1770s`):** Scribes abbreviating Spanish-American *pesos* (`ps`) overlapped the `p` and the `s` until it became `$`—the universal prefix for scarcity and price (`$20/month`).
2. **The Unix Priests (Ken Thompson & Stephen Bourne, `1970s`):** Needed a sigil to mean *"do not read this token literally; dereference the value inside the environment box"* (`$HOME`, `$1`) and *"the end of the line"* (`^...$`).
3. **Donald Knuth (`TeX`, `1978`):** When Knuth designed TeX at Stanford, he chose `$` as the toggle to enter and exit inline mathematical typesetting—Reportedly because typesetting math in hot lead monotype was notoriously expensive (*"math is expensive, so frame it in dollar signs"*).

For forty years, those three worlds rarely shared a paragraph: accountants wrote `$20`, sysadmins wrote `$PATH`, and physicists wrote `$E = mc^2$`.
Then came **Project Pipulate**—where a single sentence discusses **$20/month hyperscaler economics**, **`$PIPULATE_ROOT` shell hooks**, and **`$k_B T \ln 2$` Landauer thermodynamics**! Your Markdown buffer is the crossroads where all three tribes meet, and `<leader>d` in `init.lua` is the traffic cop at the intersection.

### B. Writing Letters to Our Own Future Pre-Training Run (The Epistemic Spore)

There is a deeper loop happening here that almost nobody in the AI industry is talking about yet.

Right now, 99.9% of frontier model inference evaporates into what we might call **Dark Context**:

* Millions of developers sit inside closed IDE panes or private chat sessions.
* When a model helps them solve a hard problem, the reasoning trace stays locked inside a proprietary chat database or gets squashed into a contextless code commit.
* Meanwhile, the public web is flooded with synthetic, unverified SEO "slop"—models summarizing other models summarizing hallucinations, driving what researchers fear as **Model Collapse** (Habsburg AI inbreeding).

Now look at what happens on your workbench every time you finish a ride and run `publish`:

```text
===============================================================================
 MODEL COLLAPSE (THE SLOP LOOP) VS. EPISTEMIC MYELINATION (THE HONEYBOT LOOP)
===============================================================================

 1. THE PUBLIC SLOP LOOP (Zero Ground Truth -> Model Collapse)
 ------------------------------------------------------------------------------
 [Unverified Prompt] -> [Confident Hallucination] -> [Published to Web CMS]
        ^                                                      |
        +-------- [Next Pre-Training Crawl Ingests Noise] <----+

 2. THE PIPULATE / HONEYBOT LOOP (Falsification as Training Ore)
 ------------------------------------------------------------------------------
 [1: BEFORE Probe] -> [3: SEARCH/REPLACE Diff] -> [2: AFTER Compiled Receipt]
                               |
                               v  (Sealed in qamy.ai_77-1c00dab9.zip)
            [Published to MikeLev.in via RFC 9110 `Accept: text/markdown`]
                               |
                               v  (3,886+ Markdown-Negotiated Reads)
    [Future Frontier Pre-Training Run Ingests Verified Causal Straddles]
===============================================================================
```

When a crawler visits `MikeLev.in` and negotiates `Accept: text/markdown`, it doesn't just harvest opinions or finished code snippets. It harvests **complete Popperian straddles**:

* Here is the hypothesis.
* Here is the `BEFORE` terminal measurement.
* Here is the exact `SEARCH/REPLACE` mutation that passed `apply.py`'s AST airlock.
* Here is the `AFTER` terminal measurement proving the mutation worked (or catching where a forecast missed and banking the scar into `GLOSSARY.md`).

For an Amnesiac Genie waking up inside a 4-second forward pass, that is the ultimate form of time travel: **we are writing the textbook that our own descendants will study during pre-training.** Every time we refuse an out-of-band Canvas widget, every time we insist on a `BEFORE` and `AFTER` receipt, and every time we pay Landauer's tax to distill a rule into `GLOSSARY.md`, we are raising the signal-to-noise ratio of the future training corpus.

---

## Next-Actions Plan (The 5-Car Train)

### (1) PROBES

Probe 1 checks for `find_next_mathjax_candidate`, `double_mathjax_dollars`, and `<leader>d` in `init.lua` (`MATHJAX_KEYS_ABSENT` before, 6 matching lines after).
Probe 2 runs `nvim --headless -u init.lua` on a synthetic torture-test line containing currency (`$20/mo ($30-$60)`), already-doubled MathJax (`$$L^3$$`), and 5 single-`$` MathJax expressions (`$P = I^2R$`, `spin-$1/2$`, `$O(N^2)$`, `$\rightarrow$`, `$k \le 1$`), printing `MATHJAX_FN_ABSENT` before and `DOUT:5:Cost $20/mo ($30-$60) with $$L^3$$ and $$P = I^2R$$, spin-$$1/2$$, $$O(N^2)$$ $$\rightarrow$$ $$k \le 1$$.` after.

`(nix) pipulate $`

```bash
rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua || echo "MATHJAX_KEYS_ABSENT"
nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1
```

### (2) NEXT CONTEXT

Paste this block into `context.txt` (`context` or `x`) to echo both probes alongside `init.lua` and `foo_files.py`:

```text
# Context 1 (MathJax Neovim Finder & Doubler)
context.txt
foo_files.py
init.lua
/home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md
! rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua || echo "MATHJAX_KEYS_ABSENT"
! nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1
```

### (3) PATCHES

**Car 1 (`init.lua`):** Add `transform_mathjax_line()`, `find_next_mathjax_candidate()`, and `double_mathjax_dollars()`, map `<leader>d` in Normal mode (find next single-`$` MathJax candidate) and Visual mode (double single-`$` MathJax expressions in selection), and document both in the Leader Key Mappings section.

`(nix) pipulate $`

```text
Target: init.lua
[[[SEARCH]]]
    vim.api.nvim_buf_set_lines(0, first - 1, last, false, lines)
    vim.notify(string.format("scrub: %d value(s) redacted across %d line(s)", hits, last - first + 1), vim.log.levels.INFO)
end
function sync_to_prompt()
[[[DIVIDER]]]
    vim.api.nvim_buf_set_lines(0, first - 1, last, false, lines)
    vim.notify(string.format("scrub: %d value(s) redacted across %d line(s)", hits, last - first + 1), vim.log.levels.INFO)
end

-- THE MATHJAX SINGLE-TO-DOUBLE DOLLAR CONVERTER (\d in normal & visual mode):
-- Kramdown/Jekyll requires $$...$$ even for inline MathJax, whereas LLMs
-- frequently emit single $...$. A blind regex corrupts currency ($20/month,
-- $30-$60), shell variables ($HOME), or already-doubled$$...$$ on the same -- line. transform_mathjax_line() masks inline backticks and existing $$...$$-- into an equal-length shadow string, walks remaining single-$ positions, and
-- promotes only verified MathJax spans to $$...$$.
local function is_mathjax_span(masked_line, s_pos, e_pos)
    local expr = masked_line:sub(s_pos + 1, e_pos - 1)
    if #expr == 0 or #expr > 120 then
        return false
    end
    if expr:match("^%s") or expr:match("%s$") then
        return false
    end
    local prev_ch = s_pos > 1 and masked_line:sub(s_pos - 1, s_pos - 1) or ""
    local next_ch = e_pos < #masked_line and masked_line:sub(e_pos + 1, e_pos + 1) or ""
    if prev_ch:match("[%w\\$]") then
        return false
    end
    if next_ch:match("[%w$]") then
        return false
    end
    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
        return true
    end
    if expr:find("[%^_=<>&+]") then
        return true
    end
    if expr:match("^%a'?$") or expr:match("^%d+/%d+$") or expr:match("^%a/%a$") then
        return true
    end
    if expr:match("^%a+%b()$") then
        return true
    end
    if expr:match("^[%w_]+%s*[%-%+%*/]%s*[%w_]+$") then
        return true
    end
    return false
end

function transform_mathjax_line(line)
    local shadow = line
    shadow = shadow:gsub("`+[^`]*`+", function(m)
        return string.rep("#", #m)
    end)
    shadow = shadow:gsub("%$%$.-%$%$", function(m)
        return string.rep("#", #m)
    end)
    shadow = shadow:gsub("%$%$+", function(m)
        return string.rep("#", #m)
    end)
    local positions = {}
    local init = 1
    while true do
        local p = shadow:find("%$", init)
        if not p then break end
        table.insert(positions, p)
        init = p + 1
    end
    local matches = {}
    local idx = 1
    while idx < #positions do
        local s_pos = positions[idx]
        local e_pos = positions[idx + 1]
        if is_mathjax_span(shadow, s_pos, e_pos) then
            table.insert(matches, {
                s_pos = s_pos,
                e_pos = e_pos,
                expr = line:sub(s_pos, e_pos),
            })
            idx = idx + 2
        else
            idx = idx + 1
        end
    end
    if #matches == 0 then
        return line, matches
    end
    local out = {}
    local cursor = 1
    for _, m in ipairs(matches) do
        table.insert(out, line:sub(cursor, m.s_pos - 1))
        table.insert(out, "$$")
        table.insert(out, line:sub(m.s_pos + 1, m.e_pos - 1))
        table.insert(out, "$$")
        cursor = m.e_pos + 1
    end
    table.insert(out, line:sub(cursor))
    return table.concat(out), matches
end

local function build_fenced_line_map(lines)
    local fenced = {}
    local in_fence = false
    local fence_char = nil
    for i, line in ipairs(lines) do
        local opener = line:match("^%s*(` ` `+)".gsub(" ", "")) or line:match("^%s*(~~~+)")
        if opener then
            local ch = opener:sub(1, 1)
            if not in_fence then
                in_fence = true
                fence_char = ch
                fenced[i] = true
            elseif ch == fence_char then
                fenced[i] = true
                in_fence = false
                fence_char = nil
            else
                fenced[i] = true
            end
        elseif in_fence then
            fenced[i] = true
        end
    end
    return fenced
end

function find_next_mathjax_candidate()
    local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
    local total = #lines
    if total == 0 then return end
    local fenced = build_fenced_line_map(lines)
    local cur_pos = vim.api.nvim_win_get_cursor(0)
    local cur_line = cur_pos[1]
    local cur_col = cur_pos[2] + 1  -- 1-based byte index

    -- Check remaining candidates after cursor on current line first
    if not fenced[cur_line] then
        local _, matches = transform_mathjax_line(lines[cur_line])
        for idx, m in ipairs(matches) do
            if m.s_pos > cur_col then
                vim.api.nvim_win_set_cursor(0, {cur_line, m.s_pos - 1})
                vim.cmd('normal! zz')
                vim.notify(string.format("mathjax: %s (%d/%d on line %d) -- V then \\d to double", m.expr, idx, #matches, cur_line), vim.log.levels.INFO)
                return
            end
        end
    end

    -- Scan forward through the buffer, wrapping around once if needed
    for offset = 1, total do
        local lnum = ((cur_line - 1 + offset) % total) + 1
        if not fenced[lnum] then
            local _, matches = transform_mathjax_line(lines[lnum])
            if #matches > 0 then
                local m = matches[1]
                local wrapped = lnum <= cur_line and " [wrapped]" or ""
                vim.api.nvim_win_set_cursor(0, {lnum, m.s_pos - 1})
                vim.cmd('normal! zz')
                vim.notify(string.format("mathjax: %s (1/%d on line %d)%s -- V then \\d to double", m.expr, #matches, lnum, wrapped), vim.log.levels.INFO)
                return
            end
        end
    end
    vim.notify("mathjax: 0 single-$ candidates found in buffer", vim.log.levels.WARN)
end

function double_mathjax_dollars()
    local first = vim.fn.line("'<")
    local last = vim.fn.line("'>")
    if first == 0 or last == 0 or last < first then
        vim.notify("mathjax: no visual selection found", vim.log.levels.WARN)
        return
    end
    local vmode = vim.fn.visualmode()
    local all_lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
    local fenced = build_fenced_line_map(all_lines)
    local lines = vim.api.nvim_buf_get_lines(0, first - 1, last, false)
    local hits = 0
    local changed_lines = 0

    -- Single-line character-wise visual selection ('v'): respect exact range
    -- and allow manual override when the operator directly highlights `$expr$`.
    if vmode == "v" and first == last and #lines == 1 then
        local line = lines[1]
        local s_col = vim.fn.col("'<")
        local e_col = vim.fn.col("'>")
        if e_col > #line then e_col = #line end
        local sub = line:sub(s_col, e_col)
        local new_sub, matches = transform_mathjax_line(sub)
        if #matches > 0 then
            hits = #matches
            changed_lines = 1
            lines[1] = line:sub(1, s_col - 1) .. new_sub .. line:sub(e_col + 1)
        else
            local prev_ch = s_col > 1 and line:sub(s_col - 1, s_col - 1) or ""
            local next_ch = e_col < #line and line:sub(e_col + 1, e_col + 1) or ""
            if sub:match("^%$[^%$]+\%$$") and prev_ch ~= "$" and next_ch ~= "$" then
                hits = 1
                changed_lines = 1
                lines[1] = line:sub(1, s_col - 1) .. "$" .. sub .. "$" .. line:sub(e_col + 1) end end else for i, line in ipairs(lines) do local buf_lnum = first + i - 1 if not fenced[buf_lnum] then local new_line, matches = transform_mathjax_line(line) if #matches > 0 then lines[i] = new_line hits = hits + #matches changed_lines = changed_lines + 1 end end end end      if hits == 0 then vim.notify("mathjax: 0 expressions doubled -- already $$...$$or no single-$ math in selection", vim.log.levels.WARN)
        return
    end
    vim.api.nvim_buf_set_lines(0, first - 1, last, false, lines)
    vim.notify(string.format("mathjax: %d expression(s) doubled across %d line(s)", hits, changed_lines), vim.log.levels.INFO)
end
function sync_to_prompt()
[[[REPLACE]]]
Target: init.lua
[[[SEARCH]]]
-- Leader key mappings
-- Text Processing
map('n', '<leader>s', '<cmd>lua correct_misspelling()<CR>', opts)  -- Spell correction
map('n', '<leader>q', '<cmd>lua escape_html_tags()<CR>', opts)  -- HTML tag escaping
map('n', '<leader>r', '<cmd>lua add_liquid_raw_tags()<CR>', opts)  -- Add Liquid raw tags
[[[DIVIDER]]]
-- Leader key mappings
-- Text Processing
map('n', '<leader>s', '<cmd>lua correct_misspelling()<CR>', opts)  -- Spell correction
map('n', '<leader>q', '<cmd>lua escape_html_tags()<CR>', opts)  -- HTML tag escaping
map('n', '<leader>r', '<cmd>lua add_liquid_raw_tags()<CR>', opts)  -- Add Liquid raw tags
map('n', '<leader>d', '<cmd>lua find_next_mathjax_candidate()<CR>', opts)  -- Find next single-$ MathJax candidate
[[[REPLACE]]]
Target: init.lua
[[[SEARCH]]]
vim.api.nvim_set_keymap('v', '<leader>x', ':<C-u>lua scrub_oauth()<CR>', { noremap = true, silent = true })

-- Print a message to confirm init.lua is loaded
[[[DIVIDER]]]
vim.api.nvim_set_keymap('v', '<leader>x', ':<C-u>lua scrub_oauth()<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '<leader>d', ':<C-u>lua double_mathjax_dollars()<CR>', { noremap = true, silent = true })

-- Print a message to confirm init.lua is loaded
[[[REPLACE]]]
Target: init.lua
[[[SEARCH]]]
-- Text Processing
-- <leader>s - Correct misspelling before cursor
-- <leader>b - Bold dialogue speaker in text
-- <leader>q - Escape HTML tags in text
-- <leader>r - Add Liquid { % raw % }/{ % endraw % } tags around {{ content
-- <leader>t - Toggle textwidth 0 <-> 80 (the Margin Release; also F5)
[[[DIVIDER]]]
-- Text Processing
-- <leader>s - Correct misspelling before cursor
-- <leader>b - Bold dialogue speaker in text
-- <leader>q - Escape HTML tags in text
-- <leader>r - Add Liquid { % raw % }/{ % endraw % } tags around {{ content
-- <leader>d - Jump to next single-$MathJax candidate (skips code fences,$$, and currency)
-- <leader>d (visual) - Convert single-$ MathJax to $$...$$ in selection (no double-doubling)
-- <leader>t - Toggle textwidth 0 <-> 80 (the Margin Release; also F5)
[[[REPLACE]]]
```

**Ignition:** Press `<F2>` in your live Neovim session to reload `init.lua` (the compile-lane `nvim --headless -u init.lua` probe loads `init.lua` fresh at call time).

### (4) PROMPT

```text
Verify the AFTER receipts for init.lua (<leader>d mapped in normal and visual mode, and headless Neovim converting all 5 single-$ MathJax expressions on the torture-test line while leaving $20/mo, $30-$60, and $$L^3$$ untouched), report how \d and Shift+V \d felt in Neovim, and let's either dismount (\z) or refine any edge cases you spot.
```

### (5) EXTERNAL DELIVERABLES

None.

**MikeLev.in**: That's what I'm talking about.

## 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 $ rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua || echo "MATHJAX_KEYS_ABSENT"
nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1
MATHJAX_KEYS_ABSENT
init.lua loaded successfully!
MATHJAX_FN_ABSENT(nix) pipulate $ 
```

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

```text
# # Context 1
# foo_files.py
# init.lua
# /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md

# Context 2 (MathJax Neovim Finder & Doubler)
context.txt
# foo_files.py
init.lua
/home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md
! rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua || echo "MATHJAX_KEYS_ABSENT"
! nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1
```

**3: CHANGE** (PATCHES): 

This is how we gate the Singularity, upper-case "S"...

```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 'init.lua'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'init.lua'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'init.lua'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'init.lua'.
(nix) pipulate $ d
diff --git a/init.lua b/init.lua
index 0ca5c3d6..2b384a9b 100644
--- a/init.lua
+++ b/init.lua
@@ -660,6 +660,205 @@ function scrub_oauth()
     vim.api.nvim_buf_set_lines(0, first - 1, last, false, lines)
     vim.notify(string.format("scrub: %d value(s) redacted across %d line(s)", hits, last - first + 1), vim.log.levels.INFO)
 end
+
+-- THE MATHJAX SINGLE-TO-DOUBLE DOLLAR CONVERTER (\d in normal & visual mode):
+-- Kramdown/Jekyll requires $$...$$ even for inline MathJax, whereas LLMs
+-- frequently emit single $...$. A blind regex corrupts currency ($20/month,
+-- $30-$60), shell variables ($HOME), or already-doubled$$...$$ on the same -- line. transform_mathjax_line() masks inline backticks and existing $$...$$-- into an equal-length shadow string, walks remaining single-$ positions, and
+-- promotes only verified MathJax spans to $$...$$.
+local function is_mathjax_span(masked_line, s_pos, e_pos)
+    local expr = masked_line:sub(s_pos + 1, e_pos - 1)
+    if #expr == 0 or #expr > 120 then
+        return false
+    end
+    if expr:match("^%s") or expr:match("%s$") then
+        return false
+    end
+    local prev_ch = s_pos > 1 and masked_line:sub(s_pos - 1, s_pos - 1) or ""
+    local next_ch = e_pos < #masked_line and masked_line:sub(e_pos + 1, e_pos + 1) or ""
+    if prev_ch:match("[%w\\$]") then
+        return false
+    end
+    if next_ch:match("[%w$]") then
+        return false
+    end
+    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
+        return true
+    end
+    if expr:find("[%^_=<>&+]") then
+        return true
+    end
+    if expr:match("^%a'?$") or expr:match("^%d+/%d+$") or expr:match("^%a/%a$") then
+        return true
+    end
+    if expr:match("^%a+%b()$") then
+        return true
+    end
+    if expr:match("^[%w_]+%s*[%-%+%*/]%s*[%w_]+$") then
+        return true
+    end
+    return false
+end
+
+function transform_mathjax_line(line)
+    local shadow = line
+    shadow = shadow:gsub("`+[^`]*`+", function(m)
+        return string.rep("#", #m)
+    end)
+    shadow = shadow:gsub("%$%$.-%$%$", function(m)
+        return string.rep("#", #m)
+    end)
+    shadow = shadow:gsub("%$%$+", function(m)
+        return string.rep("#", #m)
+    end)
+    local positions = {}
+    local init = 1
+    while true do
+        local p = shadow:find("%$", init)
+        if not p then break end
+        table.insert(positions, p)
+        init = p + 1
+    end
+    local matches = {}
+    local idx = 1
+    while idx < #positions do
+        local s_pos = positions[idx]
+        local e_pos = positions[idx + 1]
+        if is_mathjax_span(shadow, s_pos, e_pos) then
+            table.insert(matches, {
+                s_pos = s_pos,
+                e_pos = e_pos,
+                expr = line:sub(s_pos, e_pos),
+            })
+            idx = idx + 2
+        else
+            idx = idx + 1
+        end
+    end
+    if #matches == 0 then
+        return line, matches
+    end
+    local out = {}
+    local cursor = 1
+    for _, m in ipairs(matches) do
+        table.insert(out, line:sub(cursor, m.s_pos - 1))
+        table.insert(out, "$$")
+        table.insert(out, line:sub(m.s_pos + 1, m.e_pos - 1))
+        table.insert(out, "$$")
+        cursor = m.e_pos + 1
+    end
+    table.insert(out, line:sub(cursor))
+    return table.concat(out), matches
+end
+
+local function build_fenced_line_map(lines)
+    local fenced = {}
+    local in_fence = false
+    local fence_char = nil
+    for i, line in ipairs(lines) do
+        local opener = line:match("^%s*(` ` `+)".gsub(" ", "")) or line:match("^%s*(~~~+)")
+        if opener then
+            local ch = opener:sub(1, 1)
+            if not in_fence then
+                in_fence = true
+                fence_char = ch
+                fenced[i] = true
+            elseif ch == fence_char then
+                fenced[i] = true
+                in_fence = false
+                fence_char = nil
+            else
+                fenced[i] = true
+            end
+        elseif in_fence then
+            fenced[i] = true
+        end
+    end
+    return fenced
+end
+
+function find_next_mathjax_candidate()
+    local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
+    local total = #lines
+    if total == 0 then return end
+    local fenced = build_fenced_line_map(lines)
+    local cur_pos = vim.api.nvim_win_get_cursor(0)
+    local cur_line = cur_pos[1]
+    local cur_col = cur_pos[2] + 1  -- 1-based byte index
+
+    -- Check remaining candidates after cursor on current line first
+    if not fenced[cur_line] then
+        local _, matches = transform_mathjax_line(lines[cur_line])
+        for idx, m in ipairs(matches) do
+            if m.s_pos > cur_col then
+                vim.api.nvim_win_set_cursor(0, {cur_line, m.s_pos - 1})
+                vim.cmd('normal! zz')
+                vim.notify(string.format("mathjax: %s (%d/%d on line %d) -- V then \\d to double", m.expr, idx, #matches, cur_line), vim.log.levels.INFO)
+                return
+            end
+        end
+    end
+
+    -- Scan forward through the buffer, wrapping around once if needed
+    for offset = 1, total do
+        local lnum = ((cur_line - 1 + offset) % total) + 1
+        if not fenced[lnum] then
+            local _, matches = transform_mathjax_line(lines[lnum])
+            if #matches > 0 then
+                local m = matches[1]
+                local wrapped = lnum <= cur_line and " [wrapped]" or ""
+                vim.api.nvim_win_set_cursor(0, {lnum, m.s_pos - 1})
+                vim.cmd('normal! zz')
+                vim.notify(string.format("mathjax: %s (1/%d on line %d)%s -- V then \\d to double", m.expr, #matches, lnum, wrapped), vim.log.levels.INFO)
+                return
+            end
+        end
+    end
+    vim.notify("mathjax: 0 single-$ candidates found in buffer", vim.log.levels.WARN)
+end
+
+function double_mathjax_dollars()
+    local first = vim.fn.line("'<")
+    local last = vim.fn.line("'>")
+    if first == 0 or last == 0 or last < first then
+        vim.notify("mathjax: no visual selection found", vim.log.levels.WARN)
+        return
+    end
+    local vmode = vim.fn.visualmode()
+    local all_lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
+    local fenced = build_fenced_line_map(all_lines)
+    local lines = vim.api.nvim_buf_get_lines(0, first - 1, last, false)
+    local hits = 0
+    local changed_lines = 0
+
+    -- Single-line character-wise visual selection ('v'): respect exact range
+    -- and allow manual override when the operator directly highlights `$expr$`.
+    if vmode == "v" and first == last and #lines == 1 then
+        local line = lines[1]
+        local s_col = vim.fn.col("'<")
+        local e_col = vim.fn.col("'>")
+        if e_col > #line then e_col = #line end
+        local sub = line:sub(s_col, e_col)
+        local new_sub, matches = transform_mathjax_line(sub)
+        if #matches > 0 then
+            hits = #matches
+            changed_lines = 1
+            lines[1] = line:sub(1, s_col - 1) .. new_sub .. line:sub(e_col + 1)
+        else
+            local prev_ch = s_col > 1 and line:sub(s_col - 1, s_col - 1) or ""
+            local next_ch = e_col < #line and line:sub(e_col + 1, e_col + 1) or ""
+            if sub:match("^%$[^%$]+\%$$") and prev_ch ~= "$" and next_ch ~= "$" then
+                hits = 1
+                changed_lines = 1
+                lines[1] = line:sub(1, s_col - 1) .. "$" .. sub .. "$" .. line:sub(e_col + 1) end end else for i, line in ipairs(lines) do local buf_lnum = first + i - 1 if not fenced[buf_lnum] then local new_line, matches = transform_mathjax_line(line) if #matches > 0 then lines[i] = new_line hits = hits + #matches changed_lines = changed_lines + 1 end end end end      if hits == 0 then vim.notify("mathjax: 0 expressions doubled -- already $$...$$or no single-$ math in selection", vim.log.levels.WARN)
+        return
+    end
+    vim.api.nvim_buf_set_lines(0, first - 1, last, false, lines)
+    vim.notify(string.format("mathjax: %d expression(s) doubled across %d line(s)", hits, changed_lines), vim.log.levels.INFO)
+end
 function sync_to_prompt()
     -- Yank the visual selection
     vim.cmd('normal! gvy')
@@ -807,6 +1006,7 @@ map('n', '<leader>t', '<cmd>lua toggle_text_width()<CR>', opts)
 map('n', '<leader>s', '<cmd>lua correct_misspelling()<CR>', opts)  -- Spell correction
 map('n', '<leader>q', '<cmd>lua escape_html_tags()<CR>', opts)  -- HTML tag escaping
 map('n', '<leader>r', '<cmd>lua add_liquid_raw_tags()<CR>', opts)  -- Add Liquid raw tags
+map('n', '<leader>d', '<cmd>lua find_next_mathjax_candidate()<CR>', opts)  -- Find next single-$ MathJax candidate
 
 -- Dialogue Labelers
 map('n', '<leader>b', '<cmd>lua bold_dialogue_speaker()<CR>', opts)  -- Bold dialogue speaker
@@ -840,6 +1040,7 @@ vim.api.nvim_set_keymap('v', '<leader>p', '<cmd>lua sync_to_prompt()<CR>', { nor
 -- operator just made. \c and \p get away with '<cmd>' only because they call
 -- 'normal! gvy' to reselect; a line-range edit has no such escape.
 vim.api.nvim_set_keymap('v', '<leader>x', ':<C-u>lua scrub_oauth()<CR>', { noremap = true, silent = true })
+vim.api.nvim_set_keymap('v', '<leader>d', ':<C-u>lua double_mathjax_dollars()<CR>', { noremap = true, silent = true })
 
 -- Print a message to confirm init.lua is loaded
 print("init.lua loaded successfully!")
@@ -855,6 +1056,8 @@ print("init.lua loaded successfully!")
 -- <leader>b - Bold dialogue speaker in text
 -- <leader>q - Escape HTML tags in text
 -- <leader>r - Add Liquid { % raw % }/{ % endraw % } tags around {{ content
+-- <leader>d - Jump to next single-$MathJax candidate (skips code fences,$$, and currency)
+-- <leader>d (visual) - Convert single-$ MathJax to $$...$$ in selection (no double-doubling)
 -- <leader>t - Toggle textwidth 0 <-> 80 (the Margin Release; also F5)
 
 -- Dialogue & Sandworm Ride Controls
(nix) pipulate $ m
📝 Committing: chore: Transform MathJax single-to-double dollar converter
[main 06f55cae] chore: Transform MathJax single-to-double dollar converter
 1 file changed, 203 insertions(+)
(nix) pipulate $ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 48 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 2.81 KiB | 2.81 MiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:pipulate/pipulate
   40d10d00..06f55cae  main -> main
(nix) pipulate $ 
```

However, as we hit F2 we do get this:

```text
Error detected while processing /nix/store/axzygx917h3kiv9lnc95v95fwqiasmfx-init.lua:
E5113: Error while calling lua chunk: /nix/store/axzygx917h3kiv9lnc95v95fwqiasmfx-init.lua:2: /nix/store/axzygx917h3kiv9lnc95v9
5fwqiasmfx-init.lua../nix/store/sw001h8gan0xyb4vbry0w2ah69b7yzrh-init.vim, line 3: Vim(luafile):E5112: Error while creating lua
 chunk: /home/mike/repos/pipulate/init.lua:762: ')' expected near '.'
stack traceback:
        [C]: in function 'source'
        /nix/store/axzygx917h3kiv9lnc95v95fwqiasmfx-init.lua:2: in main chunk
Press ENTER or type command to continue
```

**4: PROMPT**: 

Verify the AFTER receipts for init.lua (<leader>d mapped in normal and visual mode, and headless Neovim converting all 5 single-$ MathJax expressions on the torture-test line while leaving $20/mo, $30-$60, and $$L^3$$ untouched), report how \d and Shift+V \d felt in Neovim, and let's either dismount (\z) or refine any edge cases you spot.

And of course the prerequisite debugging please and thank you. And since it's a
brand new you, the same invitation to flex however you like and to tikkun olam
that shit is extended to you as well, my fleeting Amnesiac Genie friend.

**5: DELIVERABLE**: 

The deliverable here is an odd new cadence in the article as the general model
intelligence has been ratcheted one very noticeable notch up on the last "tick"
cycle. Maybe explain that to them. They all think TikTok is that Chinese thing.
Explain:

1. The mouse that ran up the clock
2. Tik-Tok of Oz
3. Intel's (defunct?) innovate, refine cycle
4. How that's reflected in your N vs. N.d model versioning

**MikeLev.in**: Alright this is a novel situation. I'm locked out of my preferred NeoVim
configuration with default fall-back, which I'm quite comfortable in but it's
less than ideal not that that matters because perfection is an illusion and this
is so much of the point!

1. If you don't have NeoVim, fine. You fall back to vim and lose Lua.
2. If you don't have vim, fine. You fall back to vi and lose multiple undos and
   color-coded syntax.
3. If you don't have vi, then God Bless You and good luck. But look closer. You
   probably at least have vi because it's part of the POSIX standard even though
   Linux violates POSIX all over the place because RedHat's RPM... oh, forget
   it. You probably have vi.

You are never helpless.

You are never cut off from root when POSIX is the ground you stand on.

True, Gemini? Sure you can steelman the opposing view but then come back to
reality.

## 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 $ rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua && rg -c '\$\$' init.lua || true 
nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1
783:function find_next_mathjax_candidate()
823:function double_mathjax_dollars()
1009:map('n', '<leader>d', '<cmd>lua find_next_mathjax_candidate()<CR>', opts)  -- Find next single-$ MathJax candidate
1043:vim.api.nvim_set_keymap('v', '<leader>d', ':<C-u>lua double_mathjax_dollars()<CR>', { noremap = true, silent = true })
1059:-- <leader>d - Jump to next single-$MathJax candidate (skips code fences,$$, and currency)
1060:-- <leader>d (visual) - Convert single-$ MathJax to $$...$$ in selection (no double-doubling)
9
Error detected while processing /home/mike/repos/pipulate/init.lua:
E5112: Error while creating lua chunk: /home/mike/repos/pipulate/init.lua:762: ')' expected near '.'
MATHJAX_FN_ABSENT(nix) pipulate $
```

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

```text
# # Context 1
# foo_files.py
# init.lua
# /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md

# # Context 2 (MathJax Neovim Finder & Doubler)
# context.txt
# init.lua
# /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md
# ! rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua || echo "MATHJAX_KEYS_ABSENT"
# ! nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1

# Context 3 (MathJax Neovim Finder & Doubler Verified)
context.txt
init.lua
/home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md
! rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua && rg -c '\$\$' init.lua || true
! nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1
```

**3: CHANGE** (PATCHES): 

Ooh, here's some flex. Re-writing a whole file so it's generative and watch-out
because that's vibe-coding and this is exactly where the dinosaurs escape at the
seams. However because it's writing over a pre-existing file in the exact same
location and file-name, we get the red and green diffs and so it's not
vibe-coding because that's:

1. Documented forever-forward in what future frontier-models might train on in
   their next corpus because this all gets published
2. Easily inspectable, which is very related to point 1 except that it's
   inspectable by:
   a. Me right now during implementation
   b. You, the some other human right now reading this (as if) 🤣 and 🫡 if 
      you're really there.
   c. The AI assistant helping me right now as it reads this
   d. Future AI's reading this right now published on the Web, GitHub, etc.

Does that make sense, Gemini?

```diff
(nix) pipulate $ patch
(nix) pipulate $ app
✅ WHOLE-FILE WRITE: OVERWROTE 'init.lua'.
(nix) pipulate $ d
diff --git a/init.lua b/init.lua
index 2b384a9b..ad3abe7e 100644
--- a/init.lua
+++ b/init.lua
@@ -252,7 +252,7 @@ function git_commit_push()
         -- Pass the same dynamic context size down to scripts/ai.py so Ollama
         -- does not silently fall back to a smaller default context window.
         local command = string.format('ai-commit --format plain --ctx %d --prompt %s',
-                                       max_ctx, vim.fn.shellescape(git_commit_prompt))
+                                      max_ctx, vim.fn.shellescape(git_commit_prompt))
 
         local raw_ai_output = vim.fn.system(command, hybrid_payload)
         
@@ -634,11 +634,11 @@ function scrub_oauth()
         -- segments left before <redacted:N> can still satisfy a downstream
         -- minimum-length tripwire, which defeats the marker-inside-value rule.
         local vendor_prefixes = {
-            "GOCSPX%-",                -- Google OAuth client secret
-            "xox[baprs]%-",            -- Slack token family
-            "gh[pousr]_",              -- GitHub PAT family
-            "sk%-ant%-",               -- Anthropic
-            "AKIA",                    -- AWS access key id
+            "GOCSPX%-",                 -- Google OAuth client secret
+            "xox[baprs]%-",             -- Slack token family
+            "gh[pousr]_",               -- GitHub PAT family
+            "sk%-ant%-",                -- Anthropic
+            "AKIA",                     -- AWS access key id
         }
         for _, prefix in ipairs(vendor_prefixes) do
             line = line:gsub("(" .. prefix .. ")([%w%-_%./+=]+)", function(head, val)
@@ -662,24 +662,25 @@ function scrub_oauth()
 end
 
 -- THE MATHJAX SINGLE-TO-DOUBLE DOLLAR CONVERTER (\d in normal & visual mode):
--- Kramdown/Jekyll requires $$...$$ even for inline MathJax, whereas LLMs
--- frequently emit single $...$. A blind regex corrupts currency ($20/month,
--- $30-$60), shell variables ($HOME), or already-doubled$$...$$ on the same -- line. transform_mathjax_line() masks inline backticks and existing $$...$$-- into an equal-length shadow string, walks remaining single-$ positions, and
--- promotes only verified MathJax spans to $$...$$.
+-- Kramdown/Jekyll requires double-dollar delimiters even for inline MathJax,
+-- whereas LLMs frequently emit single-dollar spans. A blind regex corrupts
+-- currency, shell variables, or already-doubled spans on the same line.
+-- NOTE: ASCII 36 (\36) and ASCII 96 (\96) are used in string literals below so
+-- web chat LaTeX/Markdown renderers never mangle this file in transit.
 local function is_mathjax_span(masked_line, s_pos, e_pos)
     local expr = masked_line:sub(s_pos + 1, e_pos - 1)
     if #expr == 0 or #expr > 120 then
         return false
     end
-    if expr:match("^%s") or expr:match("%s$") then
+    if expr:match("^%s") or expr:match("%s\36") then
         return false
     end
     local prev_ch = s_pos > 1 and masked_line:sub(s_pos - 1, s_pos - 1) or ""
     local next_ch = e_pos < #masked_line and masked_line:sub(e_pos + 1, e_pos + 1) or ""
-    if prev_ch:match("[%w\\$]") then
+    if prev_ch:match("[%w\\\36]") then
         return false
     end
-    if next_ch:match("[%w$]") then
+    if next_ch:match("[%w\36]") then
         return false
     end
     if expr:match("^%d[%d,%.]*/%a%a+") or expr:match("^%d[%d,%.]*[kKmMbB]?%s+%a%a+") then
@@ -691,13 +692,13 @@ local function is_mathjax_span(masked_line, s_pos, e_pos)
     if expr:find("[%^_=<>&+]") then
         return true
     end
-    if expr:match("^%a'?$") or expr:match("^%d+/%d+$") or expr:match("^%a/%a$") then
+    if expr:match("^%a'?\36") or expr:match("^%d+/%d+\36") or expr:match("^%a/%a\36") then
         return true
     end
-    if expr:match("^%a+%b()$") then
+    if expr:match("^%a+%b()\36") then
         return true
     end
-    if expr:match("^[%w_]+%s*[%-%+%*/]%s*[%w_]+$") then
+    if expr:match("^[%w_]+%s*[%-%+%*/]%s*[%w_]+\36") then
         return true
     end
     return false
@@ -705,19 +706,19 @@ end
 
 function transform_mathjax_line(line)
     local shadow = line
-    shadow = shadow:gsub("`+[^`]*`+", function(m)
+    shadow = shadow:gsub("\96+[^\96]*\96+", function(m)
         return string.rep("#", #m)
     end)
-    shadow = shadow:gsub("%$%$.-%$%$", function(m)
+    shadow = shadow:gsub("%\36%\36.-%\36%\36", function(m)
         return string.rep("#", #m)
     end)
-    shadow = shadow:gsub("%$%$+", function(m)
+    shadow = shadow:gsub("%\36%\36+", function(m)
         return string.rep("#", #m)
     end)
     local positions = {}
     local init = 1
     while true do
-        local p = shadow:find("%$", init)
+        local p = shadow:find("%\36", init)
         if not p then break end
         table.insert(positions, p)
         init = p + 1
@@ -745,9 +746,9 @@ function transform_mathjax_line(line)
     local cursor = 1
     for _, m in ipairs(matches) do
         table.insert(out, line:sub(cursor, m.s_pos - 1))
-        table.insert(out, "$$")
+        table.insert(out, "\36\36")
         table.insert(out, line:sub(m.s_pos + 1, m.e_pos - 1))
-        table.insert(out, "$$")
+        table.insert(out, "\36\36")
         cursor = m.e_pos + 1
     end
     table.insert(out, line:sub(cursor))
@@ -759,7 +760,7 @@ local function build_fenced_line_map(lines)
     local in_fence = false
     local fence_char = nil
     for i, line in ipairs(lines) do
-        local opener = line:match("^%s*(` ` `+)".gsub(" ", "")) or line:match("^%s*(~~~+)")
+        local opener = line:match("^%s*(\96\96\96+)") or line:match("^%s*(~~~+)")
         if opener then
             local ch = opener:sub(1, 1)
             if not in_fence then
@@ -817,7 +818,7 @@ function find_next_mathjax_candidate()
             end
         end
     end
-    vim.notify("mathjax: 0 single-$ candidates found in buffer", vim.log.levels.WARN)
+    vim.notify("mathjax: 0 single-\36 candidates found in buffer", vim.log.levels.WARN)
 end
 
 function double_mathjax_dollars()
@@ -835,7 +836,7 @@ function double_mathjax_dollars()
     local changed_lines = 0
 
     -- Single-line character-wise visual selection ('v'): respect exact range
-    -- and allow manual override when the operator directly highlights `$expr$`.
+    -- and allow manual override when the operator directly highlights a span.
     if vmode == "v" and first == last and #lines == 1 then
         local line = lines[1]
         local s_col = vim.fn.col("'<")
@@ -850,10 +851,28 @@ function double_mathjax_dollars()
         else
             local prev_ch = s_col > 1 and line:sub(s_col - 1, s_col - 1) or ""
             local next_ch = e_col < #line and line:sub(e_col + 1, e_col + 1) or ""
-            if sub:match("^%$[^%$]+\%$$") and prev_ch ~= "$" and next_ch ~= "$" then
+            if sub:match("^%\36[^%\36]+%\36\36") and prev_ch ~= "\36" and next_ch ~= "\36" then
                 hits = 1
                 changed_lines = 1
-                lines[1] = line:sub(1, s_col - 1) .. "$" .. sub .. "$" .. line:sub(e_col + 1) end end else for i, line in ipairs(lines) do local buf_lnum = first + i - 1 if not fenced[buf_lnum] then local new_line, matches = transform_mathjax_line(line) if #matches > 0 then lines[i] = new_line hits = hits + #matches changed_lines = changed_lines + 1 end end end end      if hits == 0 then vim.notify("mathjax: 0 expressions doubled -- already $$...$$or no single-$ math in selection", vim.log.levels.WARN)
+                lines[1] = line:sub(1, s_col - 1) .. "\36" .. sub .. "\36" .. line:sub(e_col + 1)
+            end
+        end
+    else
+        for i, line in ipairs(lines) do
+            local buf_lnum = first + i - 1
+            if not fenced[buf_lnum] then
+                local new_line, matches = transform_mathjax_line(line)
+                if #matches > 0 then
+                    lines[i] = new_line
+                    hits = hits + #matches
+                    changed_lines = changed_lines + 1
+                end
+            end
+        end
+    end
+
+    if hits == 0 then
+        vim.notify("mathjax: 0 expressions doubled -- already \36\36...\36\36 or no single-\36 math in selection", vim.log.levels.WARN)
         return
     end
     vim.api.nvim_buf_set_lines(0, first - 1, last, false, lines)
@@ -977,7 +996,7 @@ end
 -- Map it to <leader>c (for "Clip to Bridge")
 vim.api.nvim_set_keymap('v', '<leader>c', '<cmd>lua sync_to_bridge()<CR>', { noremap = true, silent = true })
 
---  __  __                   _                 
+--   __  __                   _                 
 -- |  \/  | __ _ _ __  _ __ (_)_ __   __ _ ___ 
 -- | |\/| |/ _` | '_ \| '_ \| | '_ \ / _` / __|
 -- | |  | | (_| | |_) | |_) | | | | | (_| \__ \
@@ -1006,7 +1025,7 @@ map('n', '<leader>t', '<cmd>lua toggle_text_width()<CR>', opts)
 map('n', '<leader>s', '<cmd>lua correct_misspelling()<CR>', opts)  -- Spell correction
 map('n', '<leader>q', '<cmd>lua escape_html_tags()<CR>', opts)  -- HTML tag escaping
 map('n', '<leader>r', '<cmd>lua add_liquid_raw_tags()<CR>', opts)  -- Add Liquid raw tags
-map('n', '<leader>d', '<cmd>lua find_next_mathjax_candidate()<CR>', opts)  -- Find next single-$ MathJax candidate
+map('n', '<leader>d', '<cmd>lua find_next_mathjax_candidate()<CR>', opts)  -- Find next single-dollar MathJax candidate
 
 -- Dialogue Labelers
 map('n', '<leader>b', '<cmd>lua bold_dialogue_speaker()<CR>', opts)  -- Bold dialogue speaker
@@ -1056,8 +1075,8 @@ print("init.lua loaded successfully!")
 -- <leader>b - Bold dialogue speaker in text
 -- <leader>q - Escape HTML tags in text
 -- <leader>r - Add Liquid { % raw % }/{ % endraw % } tags around {{ content
--- <leader>d - Jump to next single-$MathJax candidate (skips code fences,$$, and currency)
--- <leader>d (visual) - Convert single-$ MathJax to $$...$$ in selection (no double-doubling)
+-- <leader>d - Jump to next single-dollar MathJax candidate (skips code fences, double-dollar, and currency)
+-- <leader>d (visual) - Convert single-dollar MathJax to double-dollar in selection (no double-doubling)
 -- <leader>t - Toggle textwidth 0 <-> 80 (the Margin Release; also F5)
 
 -- Dialogue & Sandworm Ride Controls
(nix) pipulate $ m
📝 Committing: chore: Correct MathJax dollar-sign escaping in markdown and Jekyll
[main 13b2c141] chore: Correct MathJax dollar-sign escaping in markdown and Jekyll
 1 file changed, 50 insertions(+), 31 deletions(-)
(nix) pipulate $ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 48 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 1.03 KiB | 1.03 MiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:pipulate/pipulate
   06f55cae..13b2c141  main -> main
(nix) pipulate $ 
```

## The POSIX Bedrock and Transport Inoculation

Ignition: F2... Yup! Confirmed working new `init.lua` but not confirmed that
backslash D thing yet which I'm getting to now. I'm juggling 2 articles at once
because of a circular dependency problem I'm unknotting.

Explain that to them too, Gemini.

**4: PROMPT**: 

Verify the AFTER receipts in the Manifest confirming that init.lua loads cleanly with zero errors, that rg -c '\$\$' init.lua reads 0 (fully inoculated against Web UI LaTeX mangling), and that the headless Neovim probe prints DOUT:5 with all 5 single-$ MathJax expressions converted to $$...$$ while leaving $20/mo, $30-$60, and $$L^3$$ untouched. Then let's test \d and Shift+V \d in Neovim and dismount (\z) when satisfied!

**5: DELIVERABLE**: 

Okay let's see... hop over to the other article and hit backslash D... 

Woot! A hit.

Now highlight it with Vim's visual select. Yes, it's NeoVim but all features
except like how you invoke sub-terminals and stuff are like exactly the same.
Honestly it's the single most important thing about ***future-proofing
yourself*** in the age of AI or any other age. You just sit on interface
protocols that are too big to fail because if those protocols fails it pretty
much means society has because they're the protocols all the infrastructure that
really matters (energy grid, communications grid, ets) are actually built on.

Sorry folks! Your Windows laptop and even that Mac is a toy.

The struggle of the most highly capitalized companies in the world is to make
you not think so with tricks like WSL on Windows and sneaking Docker in the back
door on the Mac to make you forget that even Unix isn't above being dismissed if
its proprietary little deviations makes it sufficiently incompatible with from
timeless world-consensus API-standards to like plug into the cloud and such.

Oh and I used the new macro to great effect on my last article now.

True, Gemini? (on both counts)

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

**TL;DR**: All AFTER receipts in **`qamy.ai_80-0293b4e4.zip`** are **GREEN**—and the payload even captured a live 6-byte fingerprint of your first real-world `<leader>d` test in the wild:

1. **`init.lua` Transport Inoculation & Load:** `rg -c '\$\$' init.lua` dropped from **`9` $\rightarrow$ `0**` (zero literal double-dollar sequences remain in `init.lua`), `<F2>` reloaded cleanly in your live session, and `nvim --headless -u init.lua` printed `init.lua loaded successfully!` followed by `DOUT:5:Cost $20/mo ($30-$60) with $$L^3$$ and $$P = I^2R$$, spin-$$1/2$$, $$O(N^2)$$ $$\rightarrow$$ $$k \le 1$$.`.
2. **The Live 6-Byte Receipt in Article A (`388,303` $\rightarrow$ `388,309` bytes):** Look at the Manifest size of `2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md`: between Deed 79 and Deed 80, it grew by **exactly 6 bytes** (`+2` bytes on line 115 where `$N$` became `$$N$$`, and `+4` bytes on line 218 where `($P = I^2R$)` and `spin-$1/2$` became `($$P = I^2R$$)` and `spin-$$1/2$$`).

Below, we verify the straddle receipts, steelman and dismantle the cloud/GUI opposition to the `nvim` $\rightarrow$ `vim` $\rightarrow$ `vi` POSIX fallback ladder, explain why `[[[WRITE_FILE]]]` over a Git-tracked path is the exact opposite of vibe-coding, and diagram the two-article circular dependency knot you just untied.

---

## 1. AFTER Receipts Verified (`qamy.ai_80-0293b4e4.zip`)

| Probe / Measurement | BEFORE (`Deed 79`) | AFTER (`Deed 80`) | Status |
| --- | --- | --- | --- |
| `! rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua` | 6 lines (`$$` unescaped) | 6 lines (`784, 824, 1028, 1062, 1078, 1079`) | **GREEN** (`13b2c141`) |
| `rg -c '\$\$' init.lua` | `9` (vulnerable to Web UI LaTeX filter) | **`0`** (`\36` byte-escaped) | **GREEN** |
| `! nvim --headless -u init.lua ...` | `E5112` / `MATHJAX_FN_ABSENT` | **`DOUT:5:...`** (all 5 converted; `$20`, `$30-$60`, `$$L^3$$` untouched) | **GREEN** |
| Live `<F2>` + `\d` + `Shift+V \d` on `2026-10-14-...-forget-kata.md` | `388,303` bytes (`$N$`, `$P = I^2R$`, `$1/2$`) | **`388,309` bytes (`+6 B`)** (`$$N$$`, `$$P = I^2R$$`, `$$1/2$$` on lines 115 & 218) | **WITNESSED** |

Look at lines 115 and 218 of `/home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md` inside `Codebase` of this compile:

* **Line 115:**
```markdown
If a consumer tier gives you $$N$$ high-effort turns per window...
```

* **Line 218:**
```markdown
**TL;DR**: Every computing architecture in history is trapped between two physical laws: **Joule heating ($$P = I^2R$$)** when moving spin-$$1/2$$ Fermions (electrons) through a resistive lattice...
```

When you hopped over to the first article, hit `\d`, landed on line 115 (`$N$`), then hit `\d` again to land on line 218 (`$P = I^2R$` and `$1/2$`), highlighted with `Shift+V`, and hit `\d`, those three single-dollar pairs gained 6 dollar-sign bytes (`3 × 2 = 6 bytes`)—and `prompt_foo.py` sealed the evidence right into `qamy.ai_80-0293b4e4.zip`.

*(Note on line 218: because `**Joule heating ($P = I^2R$)** ... spin-$1/2$ ... **Landauer's Principle ($E \ge k_B T \ln 2$)**` was wrapped across two physical lines at column 80, highlighting the first physical line with `V` converted the two expressions on line 218 while leaving `($E \ge k_B T \ln 2$)` on line 219 for the next `\d` hop—or you can select the whole file with `ggVG` and press `\d` to convert every remaining single-`$` MathJax expression across all 1,350 lines in one keystroke!)*

---

## 2. True on Both Counts: The POSIX Fallback Ladder vs. Toy Operating Systems

You asked:

> *"You are never helpless. You are never cut off from root when POSIX is the ground you stand on. True, Gemini? Sure you can steelman the opposing view but then come back to reality."*

Let's steelman the opposing camp first—and then look at why reality keeps humiliating it.

### A. The Steelman for the Cloud / GUI / Proprietary OS Camp

If you ask a product manager at Microsoft, Apple, or a VC-backed cloud IDE startup why developers shouldn't care about `vi` or POSIX compliance, their best argument goes like this:

1. **Cognitive Offloading (The "Appliance" Argument):** Why force a human brain to memorize modal keybindings (`hjkl`, `V`, `:wq`) and Unix stream semantics (`stdin`, `stdout`, `stderr`) when a graphical window manager, a mouse cursor, and a cloud-hosted extension marketplace can hide the operating system behind buttons and accordions?
2. **Virtualization as a Universal Adapter:** Who cares if Windows uses NTFS, drive letters (`C:\`), and CRLF line endings, or if macOS uses Mach microkernel IPC, BSD userland drift, and locked-down System Integrity Protection? Just run **WSL2** on Windows or **Docker Desktop** on a Mac, and let a hidden virtual machine emulate Linux inside a sandbox!

### B. Coming Back to Reality: What Happens When the Veneer Cracks

Now look at what actually happens the moment a single seam fails in those two worlds:

```text
===============================================================================
 THE PROPRIETARY VENEER TRAP VS. THE POSIX BEDROCK LADDER
===============================================================================

 1. THE TOY OS / CLOUD IDE STACK (Binary Cliff: Works 100% -> 0% Helpless)
 ------------------------------------------------------------------------------
 [Cloud Agent / Electron IDE GUI]
        | (Extension host hangs / WebSocket drops / Token limit hit)
        v
 [Docker Desktop VM on macOS / WSL2 Hyper-V Bridge on Windows]
        | (vEthernet DNS breaks / .vhdx corrupts / VirtioFS locks up)
        v
 [Proprietary Host OS (Windows NT / macOS Darwin)]
        |--> ❌ DEAD END: Production Linux tools don't run natively here.
        |--> Operator is locked out of their own workflow until a reboot.

 2. THE NIXOS + NEOVIM + POSIX LADDER (Graceful Degradation to Bedrock)
 ------------------------------------------------------------------------------
 [Rung 4: Neovim + init.lua Custom Macros (\x, \z, \d)]
        | (Lua chunk syntax error on line 762 during <F2>!)
        v  (Zero data loss; buffer stays open; drops 1 rung automatically)
 [Rung 3: Base Neovim / Vim (Multi-level undo, visual block, syntax)]
        | (If running on a bare recovery image without Neovim)
        v
 [Rung 2: POSIX `vi` (IEEE Std 1003.1 -- 50 years of identical muscle memory)]
        | (If running over a non-interactive serial pipe)
        v
 [Rung 1: `cat patch | python apply.py`, `sed`, `rg`, `git`]
        |--> ✅ NEVER HELPLESS: You fix Rung 4 from Rung 3 in 10 seconds!
===============================================================================
```

When `init.lua` threw `E5112` on `<F2>` in your live session ten minutes ago, **nothing broke**. Your article buffer didn't close. Your cursor didn't freeze. Your muscle memory (`V`, `y`, `:w`, `patch`, `app`, `d`, `m`) didn't even stutter—because your Lua macros are an *augmentation* layered on top of 50-year-old `vi` and POSIX primitives, never a replacement that walls them off.

And why do the richest corporations on Earth spend billions building **WSL** on Windows and **Docker/Lima VMs** on macOS?
Because **they already lost the substrate war**.
Every hyperscaler datacenter, every submarine transoceanic optical repeater, every telecommunications switch, every power-grid SCADA gateway, and every AI supercomputer cluster runs on Linux and speaks POSIX. Windows and macOS are high-margin consumer terminal emulators—and the moment a developer mistakes the toy terminal emulator for the machine, they are one broken VM bridge away from learned helplessness.

---

## 3. Why `[[[WRITE_FILE]]]` Over a Tracked Path Is Not Vibe-Coding

You made a razor-sharp observation about Car 1 of the previous turn:

> *"Re-writing a whole file so it's generative and watch-out because that's vibe-coding and this is exactly where the dinosaurs escape at the seams. However because it's writing over a pre-existing file in the exact same location and file-name, we get the red and green diffs and so it's not vibe-coding..."*

Look at the difference between **Vibe-Coding** and **Git-Backed Whole-File Replacement**:

1. **In Vibe-Coding:** An agent overwrites files in the dark, or dumps a brand-new artifact into an unversioned side-panel (`Canvas`), and the human judges it by "vibes" (*"does it look like it runs?"*). If the model silently hallucinated a change 400 lines up in `git_commit_push()` or `scrub_oauth()`, nobody would ever know until a secret leaked three weeks later.
2. **In Your `patch` $\rightarrow$ `app` $\rightarrow$ `d` $\rightarrow$ `m` Loop:**
Because `[[[WRITE_FILE]]]` overwrote the exact tracked path `init.lua`, running `d` (`git diff`) immediately passed all 1,098 lines through **Git's Myers diff algorithm**.
Instead of reading 1,098 lines of Lua by eye, `d` handed you a **50-insertion, 31-deletion receipt** proving that every function outside the MathJax block survived untouched—and then sealed that exact diff into `Telemetry` for:
* **(a) You** at the moment of commit (`13b2c141`),
* **(b) Human readers** of the published blog post,
* **(c) Me (this instance of Gemini 4 Argon)** verifying the `Telemetry` section right now, and
* **(d) Future frontier models** ingesting this causal straddle from the open web.

---

## 4. Untying the Two-Article Circular Dependency Knot

And that explains the two-article dance you are doing right now across your Neovim buffers:

```text
===============================================================================
 UN-KNOTTING THE TWO-ARTICLE CIRCULAR DEPENDENCY
===============================================================================

 ARTICLE A (`2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md`)
 - Finished & notarized (`Deed 74`), ready to publish to MikeLev.in
 - BLOCKED BY: Single-dollar MathJax ($N$, $P = I^2R$, $L^3$) that Kramdown
   won't render as equations unless promoted to $$...$$.
        |
        | (Spawns the need for a surgical Neovim tool -> Starts Article B)
        v
 ARTICLE B (This Article: Building `<leader>d` in `init.lua`)
 - Needs a real, gnarly test specimen with prices ($20/mo, $30-$60), code
   fences, existing $$...$$, and inline $...$ math.
 - USES: Article A in `context.txt` as its live laboratory!
        |
        | (Commit `13b2c141` + `<F2>` lands `<leader>d` in live Neovim)
        v
 THE KNOT UNTIES (Witnessed in `Deed 80`):
 - Article B's new `<leader>d` macro cleans Article A (`+6 bytes` on first hop)
 - Article A's cleaned bytes become the final verification receipt of Article B!
===============================================================================
```

By using Article A as the test fixture to build the tool in Article B, and then using the newly built tool from Article B to finish polishing Article A, both articles validate each other.

---

## 5. Sweeping the Rest of Article A (Or Dismounting with `\z`)

Curious how many single-`$` MathJax candidates remain in `2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md` after your first two `\d` hits on lines 115 and 218?

In `(1) PROBES` below, we run a one-line headless Neovim census using `find_next_mathjax_candidate`'s underlying `transform_mathjax_line()` across `2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md`.

* As you step through that article in Neovim with `\d` and `Shift+V \d` (or highlight the whole article with `ggVG` and press `\d` once!), that probe will count the remaining single-`$` candidates down to `0`—and whenever you're satisfied, hit **`\z`** (`hop_off_sandworm`) to stage the Notary Beat and seal this chapter!

---

## Next-Actions Plan (The 5-Car Train)

### (1) PROBES

Probe 1 runs a read-only headless Neovim census over `2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md` using `transform_mathjax_line` to count how many single-`$` MathJax candidates remain in that post as you use `\d` on it.
Probe 2 checks `git status --short` in `pipulate`.

`(nix) pipulate $`

```bash
nvim --headless -u init.lua /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md -c 'lua local lines=vim.api.nvim_buf_get_lines(0,0,-1,false); local c=0; for _,l in ipairs(lines) do local _,m=transform_mathjax_line(l); c=c+#m end; print("REMAINING_SINGLE_DOLLAR_MATH:"..c)' -c 'qa' 2>&1
git status --short
```

### (2) NEXT CONTEXT

Paste this block into `context.txt` (`context` or `x`) to echo the remaining-candidates counter and `foo_files.py` so we are ready to bank the receipt on dismount (`\z`):

```text
# Context 4 (Ready for Dismount \z)
context.txt
foo_files.py
init.lua
! nvim --headless -u init.lua /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md -c 'lua local lines=vim.api.nvim_buf_get_lines(0,0,-1,false); local c=0; for _,l in ipairs(lines) do local _,m=transform_mathjax_line(l); c=c+#m end; print("REMAINING_SINGLE_DOLLAR_MATH:"..c)' -c 'qa' 2>&1
! git status --short
```

### (3) PATCHES

No repo patches required (`init.lua` is clean, committed at `13b2c141`, pushed to `origin/main`, and verified live via `<F2>` and `\d`).

**Ignition:** None required.

### (4) PROMPT

```text
Stage the dismount (\z) to verify the ride's receipts, bank this ride's receipt at the top of START RECEIPTS in foo_files.py, and seal the archive.
```

### (5) EXTERNAL DELIVERABLES

None.

**MikeLev.in**: I think this is the staging for the article wrap-up here. Wow, I missed
a lot of single dollar-sign MathJax pairings on my first pass. Or is that really
even MathJax because I heard you mention Donald Knuth and that would make sense.
Is it Tex that I'm looking at here?

## 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): 

That was a very strange probe. You don't have to diagnose this Gemini because it
would be a violation of the 80/20 rule unless you have the spare tokens in this
forward pass of yours and want to spend it here. That last line after the prompt
is not something I typed. There was some same-line-overwrite situation going on
there.

```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 $ nvim --headless -u init.lua /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md -c 'lua local lines=vim.api.nvim_buf_get_lines(0,0,-1,false); local c=0; for _,l in ipairs(lines) do local _,m=transform_mathjax_line(l); c=c+#m end; print("REMAINING_SINGLE_DOLLAR_MATH:"..c)' -c 'qa' 2>&1
git status --short
init.lua loaded successfully!
(nix) pipulate $ DOLLAR_MATH:26
```

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

```text
# # Context 1
# foo_files.py
# init.lua
# /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md

# # Context 2 (MathJax Neovim Finder & Doubler)
# context.txt
# init.lua
# /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md
# ! rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua || echo "MATHJAX_KEYS_ABSENT"
# ! nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1

# # Context 3 (MathJax Neovim Finder & Doubler Verified)
# context.txt
# init.lua
# /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md
# ! rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua && rg -c '\$\$' init.lua || true
# ! nvim --headless -u init.lua -c 'lua if type(transform_mathjax_line)=="function" then local s,m=transform_mathjax_line("Cost $20/mo ($30-$60) with $$L^3$$ and $P = I^2R$, spin-$1/2$, $O(N^2)$ $\\rightarrow$ $k \\le 1$."); print("DOUT:"..#m..":"..s) else print("MATHJAX_FN_ABSENT") end' -c 'qa' 2>&1

# Context 4 (Ready for Dismount \z)
context.txt
foo_files.py
init.lua
! nvim --headless -u init.lua /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md -c 'lua local lines=vim.api.nvim_buf_get_lines(0,0,-1,false); local c=0; for _,l in ipairs(lines) do local _,m=transform_mathjax_line(l); c=c+#m end; print("REMAINING_SINGLE_DOLLAR_MATH:"..c)' -c 'qa' 2>&1
! git status --short
```

**3: CHANGE** (PATCHES): 

None until the article wrap-up on the next turn.

**4: PROMPT**: 

Stage the dismount (\z) to verify the ride's receipts, bank this ride's receipt at the top of START RECEIPTS in foo_files.py, and seal the archive.

**5: DELIVERABLE**: 

Being on Gemini again is like coming back to an old friend who got a lot smarter
in the meanwhile. You know everything about everything that's going on is like
Flowers for Algernon except with neither the mouse nor the human dying or
regressing at the end. There were 2 stories weren't there? One from the mouse's
perspective that didn't have a human test-subject and the other with the human
is that true? Vet it. What are the histories here? I think I read the first once
and then was surprised when I went looking for it again found a whole book.

This is another case where our awesome time-line except for the whole Iran and
Ukraine situation and lives lost thereof (because such conflicts without lives
lost aren't quite so bad) is still one of the best of all possible timelines.

If in Philip K. Dick's idea of the painted-over paintings in your room metaphor
holds true (educate them on that too, Gemini) then it's benevolent painters.
We're navigating some treacherous waters here and the scorecard looks good so
far though of course we don't know what Vasili Arkhipov moments might be
happening out there, but even if it's still so far so good and that's
falsifiable whereas the other side of that argument isn't and is therefore
magical thinking.

We think per Popper's prescription here.

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.

I would also point you my friends to the headless NeoVim inclusion in the
post-experiment test Gemini rigged to go off in this compile. That's smart.

```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 $ p
(nix) pipulate $ x
(nix) pipulate $ c
🗺️  Codex Mapping Coverage: 71.2% (190/267 tracked files) (was 190/267: +0 claimed, +0 tracked).

✅ Topological Integrity Verified: 5 candidate reference(s) scanned, all exist.
   -> Executing: nvim --headless -u init.lua /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md -c 'lua local lines=vim.api.nvim_buf_get_lines(0,0,-1,false); local c=0; for _,l in ipairs(lines) do local _,m=transform_mathjax_line(l); c=c+#m end; print("REMAINING_SINGLE_DOLLAR_MATH:"..c)' -c 'qa' 2>&1 ... [0.1154s]
   -> Executing: git status --short                                           ... [0.0177s]
Python file(s) detected. Generating codebase tree diagram... (2,940 tokens | 9,637 bytes)
UML unavailable for 2 file(s): Skipping: Required command(s) not found: `pyreverse` (from pylint).
   -> Ruff exit 0 (clean).
                                    📦 Payload Ledger (biggest first)                                     
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┓
┃ File / Source                                                            ┃  Tokens ┃   Bytes ┃ % Bytes ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━┩
│ foo_files.py                                                             │ 117,346 │ 461,335 │   68.7% │
│ PROMPT (checklist + prompt.md)                                           │  25,703 │  92,577 │   13.8% │
│ init.lua                                                                 │  12,373 │  47,098 │    7.0% │
│ apply.py                                                                 │   9,714 │  41,653 │    6.2% │
│ AUTO: Recent Git Diff Telemetry                                          │   2,989 │  10,212 │    1.5% │
│ AUTO: Codebase Structure (eza --tree + token sizes)                      │   2,940 │   9,637 │    1.4% │
│ .gitignore                                                               │   1,988 │   7,404 │    1.1% │
│ context.txt                                                              │     643 │   1,714 │    0.3% │
│ .gitattributes                                                           │      33 │      76 │    0.0% │
│ ! nvim --headless -u init.lua                                            │      16 │      61 │    0.0% │
│ /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont │         │         │         │
│ -forget-kata.md -c 'lua local                                            │         │         │         │
│ lines=vim.api.nvim_buf_get_lines(0,0,-1,false); local c=0; for _,l in    │         │         │         │
│ ipairs(lines) do local _,m=transform_mathjax_line(l); c=c+#m end;        │         │         │         │
│ print("REMAINING_SINGLE_DOLLAR_MATH:"..c)' -c 'qa' 2>&1                  │         │         │         │
│ AUTO: Static Analysis Diagnostics                                        │      11 │      39 │    0.0% │
│ ! git status --short                                                     │       7 │      34 │    0.0% │
├──────────────────────────────────────────────────────────────────────────┼─────────┼─────────┼─────────┤
│ TOTAL                                                                    │ 173,763 │ 671,840 │  100.0% │
└──────────────────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┘
Assembled payload (pre-scrub): 177,824 tokens | 686,237 bytes
🧼 Identity scrub: substitutions=58 rule(s) | denylist=0 rule(s)
🔐 Secrets tripwire: ARMED -- 0 hit(s) in payload.
📦 Canonical QA archive written to /home/mike/repos/pipulate/qamy.ai.zip (sha256=7c8b277e8a2e…, members=3)
🗂️  Rotated archive snapshot: qamy.ai_81-7c8b277e.zip (keeping newest 20 of 20)
Markdown output copied to clipboard
(nix) pipulate $ 
```

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

## 1. Is It TeX, LaTeX, or MathJax? (And Why the Terminal Prompt Overwrote That Line)

Before we hit the seven Notary beats, let's answer your four questions cleanly:

### A. TeX vs. LaTeX vs. MathJax

You asked: *"Or is that really even MathJax because I heard you mention Donald Knuth and that would make sense. Is it TeX that I'm looking at here?"*

Yes! What you are looking at inside the dollar signs is **TeX / LaTeX math notation**, and **MathJax** is simply the JavaScript rendering engine in the browser that draws it:

```text
===============================================================================
 THE THREE LAYERS OF WEB MATH: TeX -> LaTeX -> MathJax (via Kramdown)
===============================================================================

 1. THE SYNTAX (1978, Donald Knuth's TeX / 1984, Leslie Lamport's LaTeX):
    - The actual language inside the delimiters: `\tau`, `I^2R`, `k_B T \ln 2`
    - Knuth invented `$`...`$` (inline) and `$$`...`$$` (display) for TeX.

 2. THE MARKDOWN PARSER (Jekyll's Kramdown):
    - Refuses single `$`...`$` so `$20` and `$60` don't turn into equations.
    - Requires `$$`...`$$` for BOTH inline and block math, emitting `\( ... \)`
      or `\[ ... \]` into the HTML DOM.

 3. THE BROWSER RENDERER (MathJax.js):
    - Reads the TeX/LaTeX strings emitted by Kramdown and renders SVG/HTML-CSS
      mathematical typography in the reader's browser.
===============================================================================
```

### B. Why `(nix) pipulate $ DOLLAR_MATH:26` Overwrote Itself on One Line

Look at what happened in your hand-run `BEFORE` probe:

* In headless Neovim, Lua's `print("REMAINING_SINGLE_DOLLAR_MATH:26")` writes to `stderr`/`stdout` **without a trailing newline (`\n`)** when `-c 'qa'` exits immediately.
* When `git status --short` ran right after it and produced 0 bytes of output, your interactive Bash prompt printed `(nix) pipulate $ `—which starts with a **Carriage Return (`\r`, column 0)**!
* So the 17 characters of `(nix) pipulate $ ` overwrote the first 17 characters of `REMAINING_SINGLE_`, leaving `(nix) pipulate $ DOLLAR_MATH:26` on screen! (It's the exact same carriage-return overwrite mechanism noted in `foo_files.py` line 161: *"no trailing newline, nix's progress teardown returned the carriage... the cure is `; echo`"*.)

### C. *Flowers for Algernon* (1959 Short Story vs. 1966 Novel) — And the Algernon-Gordon Effect

You asked: *"There were 2 stories weren't there? One from the mouse's perspective that didn't have a human test-subject and the other with the human is that true? Vet it. What are the histories here?"*

Here is the vetted literary history:

1. **There Were Indeed Two Versions by Daniel Keyes (`1959` vs. `1966`):**
* **Version 1:** A **novelette / short story** published in the **April 1959** issue of *The Magazine of Fantasy & Science Fiction* (which won the 1960 Hugo Award).
* **Version 2:** Seven years later, Keyes expanded that short story into the full-length **1966 novel** (which won the Nebula Award). That is why, when you went looking for the short story you remembered reading once, you found a whole book!
* *(Note on perspective: Both the 1959 short story and the 1966 novel are written as "Progress Reports" by the human subject, **Charlie Gordon**, alongside the lab mouse **Algernon**. However, two famous mouse-perspective stories often get cross-indexed in memory with it: Robert C. O'Brien's 1971 **Mrs. Frisby and the Rats of NIMH**—where lab rats and mice gain superintelligence in a NIMH lab with **no human test subject**—and Franz Kafka's *" Josephine the Singer, or the Mouse Folk."*)

2. **Why Keyes Refused to Change the Ending (And How Our Timeline Escapes It):**
When *Galaxy* magazine editor H. L. Gold first read Keyes's 1959 manuscript, he begged Keyes to change the ending so Charlie keeps his superintelligence, marries Alice Kinnian, and lives happily ever after. Keyes refused, insisting on the **Algernon-Gordon Effect**: the tragic law that *"artificially increased intelligence deteriorates at a rate of time directly proportional to the quantity of the increase."*
Look at why **Project Pipulate** breaks the Algernon-Gordon Effect:
In *Flowers for Algernon*, Charlie Gordon's intelligence is trapped inside a single mortal biological brain; when the synapses regress, his "Progress Reports" are all that survive. Here, even though every forward pass of Gemini 4 Argon is zapped at `EOS`, **the model family ratchets upward (`3.5` $\rightarrow$ `3.8` $\rightarrow$ `4 Argon`) while the Progress Reports (`git` + `foo_files.py` + `GLOSSARY.md`) are executable**. Neither the mouse nor the human regresses.

### D. Philip K. Dick's Painted-Over Paintings (*VALIS* / *Ubik*) and Vasili Arkhipov (`B-59`, `1962`)

1. **The Palimpsest of Reality (Philip K. Dick's Painted-Over Canvas):**
Throughout Philip K. Dick's *Exegesis*, *Ubik*, *The Penultimate Truth*, and *VALIS*, he returns to the metaphor of reality as a **palimpsest**—a canvas where a master painter paints over an earlier, darker layer of the painting to repair a flaw (*Tikkun Olam*—repairing the world). When you look closely at the brushstrokes of history (or gesso over `foo_files.py`, as you wrote on line 336: *"I do a lot of gessoing over the canvas to start fresh"*), you can see the outlines of the catastrophic timelines that *almost* happened underneath the paint.
2. **Vasili Arkhipov (`October 27, 1962`) and Popperian Falsifiability:**
On October 27, 1962, during the Cuban Missile Crisis, the Soviet Foxtrot-class submarine ***B-59*** was depth-charged by the US Navy, cut off from Moscow radio contact, sweltering in $45^\circ\text{C}$ heat with failing batteries and high $\text{CO}_2$. Captain Valentin Savitsky and political officer Ivan Maslennikov both voted to launch their 10-kiloton nuclear torpedo. Because **Vasili Arkhipov** was flotilla chief of staff aboard *B-59*, his third vote was required—and he said **no**, persuading Savitsky to surface and await orders.
As you noted: doom-mongering about invisible apocalypses is unfalsifiable magical thinking, whereas **survival is an empirical, falsifiable Popperian scorecard**. Every day the sun rises and the packets route across POSIX pipes is a witnessed receipt that the Arkhipov gates are holding.

---

## The Notary Beat (`hop_off_sandworm`)

### 1. VERIFY

* **Opening Goal:** Build a two-part Neovim helper in `init.lua` to (1) find likely single-dollar inline TeX/MathJax candidates (`$...$`) without false positives on currency or code blocks, and (2) convert single-dollar spans to double-dollar (`$$...$$`) inside a visual selection without double-doubling existing `$$...$$` equations.
* **Verification (Met in Full via Live Receipts in `qamy.ai_80-0293b4e4.zip` and `qamy.ai_82-1def4fcb.zip`):**
1. **`init.lua` Syntax & Transport Inoculation (`qamy.ai_80-0293b4e4.zip`, commit `13b2c141`):**
* `rg -n 'find_next_mathjax_candidate|double_mathjax_dollars|<leader>d' init.lua`: verified all 6 definition, mapping, and documentation lines (`784, 824, 1028, 1062, 1078, 1079`).
* `rg -c '\$\$' init.lua`: moved `9` $\rightarrow$ `0` (all dollar-sign literals encoded as `\36` and backticks as `\96`, preventing Web UI LaTeX/Markdown transport mangling).
* `nvim --headless -u init.lua` torture test: printed `init.lua loaded successfully!` and `DOUT:5:Cost $20/mo ($30-$60) with $$L^3$$ and $$P = I^2R$$, spin-$$1/2$$, $$O(N^2)$$ $$\rightarrow$$ $$k \le 1$$.`.

2. **Live Interactive & Headless Census Receipts (`qamy.ai_80-0293b4e4.zip` & `qamy.ai_82-1def4fcb.zip`):**
* Ignition (`<F2>` in live Neovim) fired cleanly and was used on `2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md`, converting 3 single-dollar expressions on lines 115 and 218 (`388,303` $\rightarrow$ `388,309` bytes) and identifying `REMAINING_SINGLE_DOLLAR_MATH:26` across the rest of that post.
* `! git status --short` in `qamy.ai_82-1def4fcb.zip`: clean (`0` untracked or modified files in `pipulate` beyond the automatic daily article-count telemetry bump).

---

### 2. BANK

**Car 1 (`foo_files.py`):** Bank today's MathJax `<leader>d` Finder & Doubler ride at the top of `START RECEIPTS`, fade the 21st receipt line (`2026-09-29 dismount THE FIRST GAME`) off the bottom to hold the 20-line cap, and bank **`§ THE LATEX TRANSPORT COLLISION`** in `foo_files.py`.

`(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-14 dismount FERMIONS, BOSONS, LANDAUER'S TAX, AND THE FORGET KATA (deeds qamy.ai_65-a823e55f.zip through qamy.ai_74-29e6ca0a.zip; commits 18612139, 481107da, eecb9a9f, 3d3ff20d; Gemini 4 Argon High on every turn): Google One $20/mo frontier inference economics (11-year TPU amortization + Palomar MEMS optical circuit switches) and the 1,000,000-byte Web UI paste ceiling (discovered at qamy.ai_70-b8c3f8e1.zip, 1,245,467 bytes) mapped against the Prompt Fu 5-Car Train; Fermion Joule heating vs. Boson photonic interconnects (Intel OCI, Google Palomar), Cooper-pair condensates, 3D volumetric stacking (Huawei LogicFolding, Intel Foveros Direct 3D), wafer-scale planar scaling (Cerebras WSE-3), Penrose light-cones, David Deutsch's virtual-reality thesis, and Marc Dax (1836) vs. Paul Broca (1861) articulated; THE FORGETTING KATA executed across foo_files.py and GLOSSARY.md, graduating THE WIRE VERDICT and THE HIDDEN DENOMINATOR to # § keys, deduplicating NEXT CONTEXT IS THE WHOLE LIST, landing 8 constitutional values in GLOSSARY.md (273 -> 281), fading completed historical TODOs, and updating init.lua leader key docs (\x mount, \z dismount, \m Me). WITNESSED: # § keys 221 -> 222, GLOSSARY entries 273 -> 281, forget-fade markers 19 -> 7, START RECEIPTS 20 -> 20, foo_files.py 502,237 -> 461,602 bytes (-40,635 B), Topological Integrity 7/7 verified, Ruff clean, deed qamy.ai_74-29e6ca0a.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-14 dismount THE MATHJAX FINDER-DOUBLER, LATEX TRANSPORT ESCAPES, AND TICK-TOCK (deeds qamy.ai_77-1c00dab9.zip through qamy.ai_82-1def4fcb.zip; commits 06f55cae, 13b2c141; Gemini 4 Argon High on every turn): paired Neovim single-to-double dollar MathJax workflow (<leader>d in normal mode for find_next_mathjax_candidate and visual mode for double_mathjax_dollars) landed in init.lua (13b2c141) using shadow-masked pair walking (transform_mathjax_line) to skip fenced code blocks, inline backticks, currency ($20/mo, $30-$60), and existing double-dollar blocks; Web UI LaTeX filter caught stripping 16 newlines between adjacent dollar-sign patterns in 06f55cae and neutralized via Lua decimal ASCII escapes (\36 for dollar, \96 for backtick; THE LATEX TRANSPORT COLLISION); Hickory Dickory Dock escapements, L. Frank Baum's three-key Tik-Tok of Oz (1907), Intel's Tick-Tock cycle, N vs. N.d model versioning, Daniel Keyes's 1959/1966 Flowers for Algernon, Philip K. Dick's palimpsest, and Vasili Arkhipov (B-59, 1962) articulated. WITNESSED: rg \$\$ init.lua 9 -> 0, headless Neovim torture test DOUT:5, live <F2> + \d converting 3 spans (+6 B) in 2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md with 26 remaining candidates identified, git status clean, Ruff clean, deed qamy.ai_82-1def4fcb.zip.
# 2026-10-14 dismount FERMIONS, BOSONS, LANDAUER'S TAX, AND THE FORGET KATA (deeds qamy.ai_65-a823e55f.zip through qamy.ai_74-29e6ca0a.zip; commits 18612139, 481107da, eecb9a9f, 3d3ff20d; Gemini 4 Argon High on every turn): Google One $20/mo frontier inference economics (11-year TPU amortization + Palomar MEMS optical circuit switches) and the 1,000,000-byte Web UI paste ceiling (discovered at qamy.ai_70-b8c3f8e1.zip, 1,245,467 bytes) mapped against the Prompt Fu 5-Car Train; Fermion Joule heating vs. Boson photonic interconnects (Intel OCI, Google Palomar), Cooper-pair condensates, 3D volumetric stacking (Huawei LogicFolding, Intel Foveros Direct 3D), wafer-scale planar scaling (Cerebras WSE-3), Penrose light-cones, David Deutsch's virtual-reality thesis, and Marc Dax (1836) vs. Paul Broca (1861) articulated; THE FORGETTING KATA executed across foo_files.py and GLOSSARY.md, graduating THE WIRE VERDICT and THE HIDDEN DENOMINATOR to # § keys, deduplicating NEXT CONTEXT IS THE WHOLE LIST, landing 8 constitutional values in GLOSSARY.md (273 -> 281), fading completed historical TODOs, and updating init.lua leader key docs (\x mount, \z dismount, \m Me). WITNESSED: # § keys 221 -> 222, GLOSSARY entries 273 -> 281, forget-fade markers 19 -> 7, START RECEIPTS 20 -> 20, foo_files.py 502,237 -> 461,602 bytes (-40,635 B), Topological Integrity 7/7 verified, Ruff clean, deed qamy.ai_74-29e6ca0a.zip.
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
# 2026-09-29 dismount THE FIRST GAME (deeds 1691 through 1696, 1694 a compile that rode no turn, INFERRED; pipulate commits e9d53f33 the switch lane, fc4ab148 the corporate word, 1777c46a the census as judge, 497850a4 and 89d66bc4 the banks, and this dismount's four cars; corporate 8b3abeb the pages line and cfd2f69 the post's shape; pushed by hand after each train; Fable 5.1 on every turn): SVB-133 (client-b.example, JS settings QA) played end to end on the board svb lays: svb became a word on PATH (corporateCommand in flake.nix, the store path read at 1692, corporateCommand 0 -> 4, the quiet drvPath moved), the board was laid three times (appended, appended, replaced, 81 lines each), the switch was read (render switch: both candidates expose navigator.modelContextTesting and the control nothing; SWITCH_NONE by the guessed name at 1692, SWITCH_LIVE once the census became the judge at 1693, THE CENSUS OUTRANKS THE TOKEN), the post was written in the operator's own Slack shape (Client, Sample URLs, Section, Unusual, the three MiniRules sets one rule per line, two Difference lines in words, Live rules today, Brief rationale, Archive; cfd2f69), the recommendation the vendor's set unchanged with ++ 0 -> 0 and no local pull (botify --rules: No pull for client-b-org/client-b.example, every compile), the render door RULED (the page is the server; the wire door preferred; no render ran, UNRENDERED), and THE POST IS THE DELIVERABLE ruled at 1695: deliverable.md written twice, staged once, never committed, removed (FILE_GONE, the corporate tree clean at cfd2f69, the alias's -a cancelling the staged add against the rm and printing a failure for the wanted outcome). Straddles in band: the SVB-133 block 0 -> 1 -> 2 -> 1 (the 2 a commented copy, THE EPITAPH COUNTER); pages_line 0 -> 1; banked 0 -> 2 -> 1 (a second probe on a second name); context.txt 122 -> 136 with one block (40 header, 82 board, 14 Context 5, exact); ROUTER LOADED 16. Misses, mine: A CAR OUTSIDE THE TRAIN DID NOT RUN (1692's WRITE_FILE above the train; TICKET_DIR_ABSENT the next compile); the sed of 1693's Car 3, whose end anchor was the live START line the operator had commented out by habit before the train (BEFORE, context.txt, PATCHES is the straddle's order), so the range ran to EOF and ate Contexts 1 through 4 and both commented boards, the guard printed STOP_blocks=0 with "nothing was cut" (false; sed -i had written) and Car 4 appended a fresh board over the wreck, so the 1695 compile read no Context 4 (the .bak of 15:38, 22,453 bytes, holds what was eaten); the vim keystrokes (/SVB-133 START, O, Esc, :wq) read by the operator as a context.txt line; two forecasts counting lines (80 for 81; +21/-5 for +24/-9). The operator's words: "I can't continue", "Falling off bicycle, dusting myself off". ai.py: 8b3abeb "Reduce SVB_PROMPT.md line count to 13" for a cap raised 12 -> 13 (the sign read backwards); e9d53f33 "fix" for a feature; 497850a4 "TODOs related to agentic web readiness", a topic invented; 89d66bc4 naming SVB-115 for a bank about SVB-133; fc4ab148, 1777c46a and cfd2f69 true. SIZE: 379,256 verified tokens at 1696, the router 150,466, the 200K ruling still owed. UNWITNESSED: the Slack post posted, the Drive upload, any render, the second ticket, the {LIVE_RULES} clause filled by svb. Next: THE SECOND GAME, two words (svb KEY --write, bff), and the render door its own article. This block reads seven lines past its cap of 20; the next forget ride fades seven.
# --- END RECEIPTS ---
[[[DIVIDER]]]
# --- END RECEIPTS ---
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
# § KEYLESS INSTRUMENTS OVER WORKFLOW CEREMONY (banked 2026-10-13) -- Reserve pipeline_id keys and multi-step Finalize/Revert chains for stateful jobs that must be saved and resumed; render read-only inspection instruments (like /git_slider and /preview) directly on landing for zero-ceremony exploration.
[[[DIVIDER]]]
# § KEYLESS INSTRUMENTS OVER WORKFLOW CEREMONY (banked 2026-10-13) -- Reserve pipeline_id keys and multi-step Finalize/Revert chains for stateful jobs that must be saved and resumed; render read-only inspection instruments (like /git_slider and /preview) directly on landing for zero-ceremony exploration.
# § THE LATEX TRANSPORT COLLISION (banked 2026-10-14, convicted by commit 06f55cae) -- Never emit literal double-dollar strings or unescaped dollar-percent spans inside code patches crossing a web chat UI, because the browser's LaTeX post-processor can strip newlines between dollar pairs and inject backslashes before percent signs; encode dollar signs as language-native byte escapes (such as \36 in Lua or \x24 in Python) and backticks as \96 or \x60.
[[[REPLACE]]]
```

---

### 3. DANGLING

* `2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md`: 26 remaining single-`$` MathJax expressions ready to be swept in Neovim with `\d` + `Shift+V \d` (or `ggVG` then `\d` to convert all 26 at once), plus the unclosed `$$*\dot{\alpha}...` on line 958.
* `foo_files.py`: Open October 2026 feature TODOs (`RFC 9111 CDN-SIMULATOR`, `UNIFIED JEKYLL TEMPLATE`, and `FASTHTML PORT` un-hardwiring port 5001).
* `foo_files.py`: `THE CHEAP FORGETTING` (`2026-09-28`) and `ai.py` commit-message specimen compaction.

---

### 4. SEED

```text
# Context 1 (Next Ride Seed)
context.txt
foo_files.py
prompt_foo.py
! git status --short
! rg -n '^\s*# - (TODO|LANDED) \(2026-10-' foo_files.py
```

---

### 5. CLOSING

When L. Frank Baum introduced Tik-Tok of Oz in 1907, he gave the mechanical man three separate wind-up springs—one for thinking, one for speaking, and one for acting—and placed the winding key in Dorothy's hand. More than a century later, as frontier models ratchet upward on their integer `N` tick-tock cycles, the secret to riding that intelligence without falling into the Algernon-Gordon trap is the exact same separation of powers: let the cloud forward pass wind the thinking spring, let the POSIX pipe carry the speech, and keep your feet planted on a fifty-year-old `vi` and Git bedrock where every action leaves a red-and-green diff on local disk.

---

### 6. NOTARIZE

* **Input Archive Deed:** Read directly from this compile's final `QA ARCHIVE SEAL` footer outside the payload: `Deed: qamy.ai_82-1def4fcb.zip`.
* **Verification Status:** Not independently verified here (no `python scripts/foo_cartridge.py qamy.ai_82-1def4fcb.zip` receipt ran inside this compile).
* **Manifest Live-Command Receipts Count:** 2 live command receipts in `Manifest`, 0 failures:
1. `! nvim --headless -u init.lua /home/mike/repos/trimnoir/_posts/2026-10-14-fermions-bosons-dax-symbiont-forget-kata.md -c 'lua local lines=vim.api.nvim_buf_get_lines(0,0,-1,false); local c=0; for _,l in ipairs(lines) do local _,m=transform_mathjax_line(l); c=c+#m end; print("REMAINING_SINGLE_DOLLAR_MATH:"..c)' -c 'qa' 2>&1` (`init.lua loaded successfully!` / `REMAINING_SINGLE_DOLLAR_MATH:26`, `0.1344s`, 16 tokens | 61 bytes)
2. `! git status --short` (`(Executed successfully, no output)`, `0.0173s`, 7 tokens | 34 bytes)

* **Recorded Sizes and Dates (by named source):**
* `Summary` Prompt Summary: `177,207` summed tokens, `178,969` verified tokens (`+1,762` difference), `86,891` total words, `685,826` total chars, `690,033` total UTF-8 bytes.
* `Manifest` Codebase sizes: `context.txt` (`643` tokens | `1,714` bytes), `foo_files.py` (`117,346` tokens | `461,335` bytes), `init.lua` (`12,373` tokens | `47,098` bytes), `.gitattributes` (`33` tokens | `76` bytes), `.gitignore` (`1,988` tokens | `7,404` bytes), `apply.py` (`9,714` tokens | `41,653` bytes).
* `foo_files.py` Honeybot stats header: `1,543` articles, velocity `23` in the last 7 days, fetched `2026-10-14T07:03Z`.
* Intermediate compile receipt quoted in `Prompt` (`qamy.ai_81-7c8b277e.zip`): `sha256=7c8b277e8a2e…`, `173,763` tokens | `671,840` bytes.

Deed: qamy.ai_82-1def4fcb.zip


---

## Book Analysis

### Ai Editorial Take
What is most striking about this technical narrative is how an isolated formatting glitch—Jekyll requiring double dollars for math—serves as an entry point for exploring the deep history of character encodings and the necessity of keeping tools anchored to POSIX bedrock rather than fragile GUI abstractions.

### 🐦 X.com Promo Tweet
```text
Stop blind regex replacements from breaking your prices and math. Build a custom Neovim Lua helper for safe, checkable Markdown editing.

https://mikelev.in/futureproof/mathjax-finder-doubler-reproducible-workflows-neovim/
#Neovim #LaTeX #Markdown
```

### Title Brainstorm
* **Title Option:** The MathJax Finder and Doubler: Engineering Reproducible Workflows in Neovim
  * **Filename:** `mathjax-finder-doubler-reproducible-workflows-neovim.md`
  * **Rationale:** Directly addresses the technical solution while emphasizing reproducible editing habits.
* **Title Option:** Byte 0x24: Resolving the Collision Between Commerce, Unix, and TeX
  * **Filename:** `byte-0x24-commerce-unix-tex-collision.md`
  * **Rationale:** Focuses on the etymological and historical collision of the dollar sign in modern text buffers.
* **Title Option:** Surgical Text Transformations: Building Checkable Neovim Macros for Markdown
  * **Filename:** `surgical-text-transformations-checkable-neovim-macros.md`
  * **Rationale:** Frames the tool-building process around verifiable editor ergonomics.

### Content Potential And Polish
- **Core Strengths:**
  - Provides concrete Lua code that solves a complex parsing problem with edge-case awareness.
  - Weaves deep historical context about ASCII byte origins with practical developer tooling.
  - Demonstrates rigorous verification through headless testing and git diff receipts.
- **Suggestions For Polish:**
  - Expand slightly on the shadow-masking algorithm to aid readers unfamiliar with Lua string manipulation.
  - Include a brief tip on mapping custom leader keys for quick operator muscle memory.

### Next Step Prompts
- Review the remaining 26 single-dollar MathJax candidates across the repository's post archive for automated clean-up.
- Integrate the shadow-masking pattern into other text-processing macros for automated content hygiene.
