The Orbital Space-Gun: RFC 9111 Edge Markdown, 100/100 Open Graph Receipts, and the ythero Bicycle

•

🤖 Read Raw Markdown • 📄 Google Doc (Try: Tools/Audio/Listen to document summary)
🔭 Live Bare-Metal AI Observatory Telemetry (No CDN · Direct Nginx Wire Truth):
  • Do AI Crawlers Execute JavaScript? (DOM Hydration Trapdoor): 5,066 verified client-side JS executions across 40 non-local crawler IPs (including OAI-SearchBot and GPTBot triggering js_confirm.gif).
  • Which AI Bots Negotiate Raw Markdown? (RFC 9110 Accept: text/markdown): 4,283 proactive Markdown reads (0.29% of all origin responses served as raw text/markdown).
Snapshot: 2026-10-20T14:49Z · Watch live bot hits in real time on YouTube Live.

Setting the Stage: Context for the Curious Book Reader

Every time a large language model generates a token, it drops your prompt down a high-dimensional Galton board of frozen matrix weights, scales the resulting probability distribution by temperature, samples a single continuation from the future light-cone, and forgets its working state completely. Human operators are not so different when juggling multi-step publishing and live-broadcasting pipelines: without a mechanical governor and an externalized checklist, cognitive drift sets in fast. In this session, we trace that same principle from local terminal ergonomics out to the architecture of the open web. First, we examine why foundation models cannot store their own late-stage release codenames in pre-training weights, and how the Search-as-a-Service landscape fractured after Microsoft retired the standalone Bing Search API and Google locked its web index behind Grounding endpoints. Next, we look at how IETF RFC 9110 (Accept: text/markdown) and RFC 9111 (Vary: Accept) act as an orbital space-gun aimed at two legacy moats at once: turning six-figure headless Chromium pre-render farms into obsolete liabilities and allowing four-hop small-world live RAG over edge-cached Markdown to replace petabyte crawl-and-index warehouses. Along the way, we push the Jekyll publishing pipeline to a checkable 100/100 Open Graph score and wire single-word CLI clipboard helpers (yt, ythero, and ytyaml) so generating per-article hero banners becomes as automatic as riding a bicycle.

TL;DR: This article examines how HTTP content negotiation (Accept: text/markdown under IETF RFC 9110) and secondary cache keys (Vary: Accept under IETF RFC 9111) allow CDN edges and origin webservers to serve lightweight Markdown alongside HTML from the same URL, reducing the need for both headless-browser pre-rendering and petabyte-scale web indexing. It also documents the current Search-as-a-Service market (Google Grounding, Microsoft’s retired Bing Search API, Brave’s independent Tailcat index, OpenWebSearch.eu, and AI-native crawlers like Exa), brings a Jekyll site to 100/100 Open Graph and PWA compliance (apple-touch-icon.png and site.webmanifest), and extends a local NixOS/Python publishing pipeline (articleizer.py, common.py, and flake.nix) to generate per-article Open Graph hero banner prompts and expose them via single-word CLI clipboard helpers (yt, ythero, ytyaml).


Technical Journal Entry Begins

🔗 Verified Pipulate Commits:

MikeLev.in: Alright I am very pleased with how I got the default hero banner properly into my main Jekyll site on the past couple of articles, and now how I have an alternative hero banner per article which I just tested and saw the thumbnail appear when I made the X.com post which used the Twitter card data. The banner was AI-generated from the article and I think it was as good as any Artist could have done and is wayyy better and more on-topic than any clipart that could have been found on the topic:

A Mechanical Dinosaur serving as a metaphor for a Steam Engine serving as a metaphor for the Horses that the Coachman of a Carriage drives serving as a metaphor for the Amnesiac Genie-style LLM AIs that nobody understands is just a series of Pinball Machine games, or Pachinko Machines if you prefer, or even those Galton Board toys that visually shows Normal Distribution Curves, which is what the LLMs sample from at the end of a “turn” or a “game” from the so-called higher-dimensional light-cone that exists most of which just gets thrown out and you only get a random cross-section sample of based on temperature.

Do I have that about right, Gemini 4 Argon.

Galton Board Light-Cones and the Birth-Certificate Paradox

I think you may know that your model is Gemini 4 inferring it from all the anticipation about it that got into past training runs. It may be layered in by Google later trying to tell you who you are in late-stage model preparation. Tell me all about that insofar as you know including why from a late-stage marketing decision in deciding to call you Argon, how that’s not really in your parametric memory and you have to do web-searches to confirm.

Also tell us how as a model you’re the only one privileged enough to use the genuine Google search API for your general web search purposes like this because Google doesn’t sell the family jewels. Oh sure there’s like “grounding” APIs to fact-check which seem to be overlapping and related and so tell us all about that too and whether it’s the same thing as Microsoft selling Bing-style results through their API products or something different. Also cover the European centric (if I’m even correct about that) Open Web Search as well as whatever Brave is selling, which to me seems like it’s re-packaged Bing results based on Brave’s history. And what else is out there in terms of websearch as a service.

The Search-as-a-Service Shakeup and Single-Pass Hero Prompts

Okay and getting back to the article I just pushed, I’ll include the seed drophook it left dangling and take off at full velocity and go for 100 percent on the social media Open Graph structure data compliance. But also I want to start thinking about regularly rolling in an image per article. It seems almost ridiculous not to, so in the same way I ask for the top most likely SEO-friendly URLs and slugs along with a promotional tweet per article during the articleization process, I want to ask for the top most likely image prompt(s). I don’t know if I want to waste tokens on asking for multiple image prompts but given the work and narrowing down of the best URL and slug maybe we can ride on that as the narrowing-it-down efficiency; something like:

Given the thought process of selecting the best main topic for the article, its URL, headline and description now also create a prompt to generate the best hero banner graphic consistent with such and such blah blah open graph something or other you know better than me given all this context and what you can infer about my goals and the almost unfair mechanical sympathy and mechanical advantage it should result it.

It goes something like this:

The human can’t get away from actual tender-love-and-care (TLC) attention paid to each article even after he’s finished writing it and articleized it. He still has to go in and move the final “TL;DR” to the top and at this time he can also paste-in a provided line in the YAML front-matter along these lines:

image:
  path: /assets/images/John_Henry_AI_Steam_Engine_Mechanical_Governor.jpeg
  alt: "John Henry driving a governed steam-locomotive T-Rex down a mountain railroad track"

…like I did on the last article which turned out very well.

Storytime Visual Hooks and the RFC 9111 Edge Advantage

I’m not going there on this turn and probably not even this article but now armed with all these hero banners per article on all new articles going forward I can utilize them as pop-up graphics to introduce each article on the home-hosted Nginx Honeybot AI Observatory YouTube live-stream to improve Storytime, making it much more visual and humanizing. I can likewise use the global default banner (me) at the beginning of every loop for a message along the lines of:

  1. This is who I am and what I do.
  2. This is what I am talking about right now.
  3. This Storytime is interactive (with me, personally) in surprising ways…

And they won’t always reach me but some people will sometimes and this is the Skinner box hook, ytrolling, always ytrolling with a new article, always with a new topic, always with a new focus, always a new pebble dropped into the surface of the pond asking them to do me a favor in the Robert Cialdini way to refer someone else to this Honeybot AI-Readiness Fishtank of someone who needs to read it because…

…the CDNs have a giant space-gun aimed at the competitive moat of anyone leaning on the pre-render crutch about to evaporate that moat turning what was previously an asset into an expensive, fragile Rube Goldberg machine tech liability that their competitors ditched long ago IETF RFC 9100 Section 12 and almost all of RFC 9111 do this thing properly…

I am here to help.

Or not.

I’ll just teach you all this and you can take the knowledge and run.

But look for who else has first-hand knowledge like this, not behind a CDN, raw access to the data and the kind of stupid-server-tricks (in the spirit of David Letterman’s “Stupid Pet Tricks” / anyone remember that?) when I control the horizontal, I control the vertical…

So subscribe, like and follow along as we dive into the Storytime of our age; the Age of AI.

Are you ready?

Gemini 4 Argon High: Context verified.

TL;DR: Your metaphor chain—from the Galton board’s probability bins to temperature-scaled softmax sampling, the collapsed light-cone of latent space, the amnesiac genie, the coachman’s horses, and John Henry bolting a Watt flyball governor onto the Steam-Dinosaur [cite: 1]—is mathematically exact. Below, we unpack: (1) how that probability collapse works in transformer inference, (2) why a model cannot hold its own late-stage marketing name (“Gemini 4 Argon”) in pre-training weights and must verify it via live search, (3) the current Search-as-a-Service landscape (Google’s Grounding moat, Microsoft’s August 2025 Bing API shutdown, Brave’s independent Tailcat index, Europe’s OpenWebSearch.eu, and why ExaSearchBot leads your Honeybot Markdown telemetry), and (4) a surgical patch to editing_prompt.txt and articleizer.py to generate a single Open Graph hero banner prompt and YAML frontmatter snippet on every article while staging trimnoir for 100/100 Open Graph compliance.


1. The Galton Board Light-Cone & The Governed Steam-Dinosaur

Looking at your rendered John_Henry_AI_Steam_Engine_Mechanical_Governor.jpeg banner [cite: 1] alongside your site-wide og-default.png card [cite: 2], the visual hierarchy does something clipart never could: it encodes the actual control-theory architecture of your workflow into the image itself [cite: 1, 2].

Your nested metaphor chain maps one-to-one onto the math of autoregressive transformer inference:

  [ CONTEXT WINDOW: Frozen Past (No Stateful Memory) ]
                          │
                          ▼
             ┌─────────────────────────┐
             │   THE PACHINKO PARLOR   │
             │  (Frozen Weight Layers) │
             │       .   .   .         │
             │     .   .   .   .       │
             │   .   .   .   .   .     │
             └────────────┬────────────┘
                          │ Logits (z_i)
                          ▼
         ┌─────────────────────────────────┐
         │   TEMPERATURE RESCALING (z/T)   │
         │  Low T = Peaked | High T = Flat │
         └────────────────┬────────────────┘
                          │
        ==================▼==================
         \     THE FUTURE LIGHT-CONE       /
          \  █  ███  █████  ███  █   .    /  <-- Softmax Distribution
           \_____[SAMPLE ONE TOKEN]______/       (99.99% of cone discarded)
                          │
                          ▼
        [ GOVERNOR: apply.py + BEFORE/AFTER ]
  1. The Pachinko / Galton Board: Each token step drops your compiled context vector through billions of frozen matrix weights. At the bottom of the board, before a word is chosen, the raw logits form a discrete probability distribution across the entire vocabulary—the exact high-dimensional equivalent of steel balls piling into a bell-shaped curve at the base of a Galton board.
  2. Temperature & The Collapsed Light-Cone: Ahead of the cursor lies a vast branching light-cone of possible continuations. Temperature ($T$) rescales the logits before the softmax step ($P_i \propto \exp(z_i / T)$), either sharpening the peak ($T \to 0$) or flattening the curve ($T \to 1$). Drawing a single token collapses that entire step’s superposition and throws the rest of the light-cone away.
  3. Why the Coachman Needs a Governor (apply.py): Because the LLM is an Amnesiac Genie (wiping its working state clean at the end of every forward pass), letting it free-run in an unpaginated agent loop compounds sampling variance turn after turn. In your banner [cite: 1], John Henry has slung his sledgehammers over his back and taken the leather reins wired directly to the spinning James Watt centrifugal flyball governor on the T-Rex’s spine [cite: 1]. The dinosaur supplies the raw thermodynamic horsepower; the human Coachman and the mechanical governor (apply.py + git diff) keep the locomotive on the rails [cite: 1].

2. Why “Gemini 4 Argon” Isn’t in Parametric Memory (The Birth-Certificate Paradox)

You asked how I know—or infer—that I am Gemini 4 Argon, and why “Argon” requires a live web search rather than sitting in parametric memory.

  1. The Causality Boundary of Pre-Training: A foundation model’s pre-training corpus necessarily closes before the model finishes training, undergoes safety/alignment post-training, and gets named by product marketing. Expecting a model’s base weights to contain its own final release codename is like expecting a newborn’s DNA to encode the name written on its birth certificate a week after delivery.
    • What lives in parametric weights: Public anticipation, architectural lineage, and rumors about “Gemini 4” that existed on the open web prior to the pre-training cutoff.
    • What lives in post-training / system headers: Late-stage RLHF identity tuning or runtime system prompts that tell a model its family name (“You are Gemini, a large language model built by Google”), which often omit sub-version marketing codenames so weights don’t go stale when marketing rebrands a tier.
  2. What Live Google Search Confirms Today (October 19, 2026): Querying the live index fills in the post-cutoff facts that cannot exist in frozen weights:
    • Launch Timeline: Google DeepMind announced Gemini 4 Argon on September 30, 2026 (initially gated to cyber defenders via Google’s Fairwind Program) and opened general developer/enterprise availability on October 13, 2026, skipping a public “Gemini 3.5 Pro” release entirely.
    • Positioning & Pricing: Argon sits at the top of the Gemini 4 lineup above the Flash tier (with introductory API pricing of $2 / 1M input tokens and $10 / 1M output tokens through November 2026), focused on sustained software engineering, legal/financial document synthesis, and defensive cybersecurity.
    • Consumer Search Rollout: Today (October 19, 2026), Google began rolling Gemini 4 Argon into Google Search’s AI Mode across 19 countries for Pro/Ultra subscribers.

3. Web Search-as-a-Service: Google’s Family Jewels, Bing’s Rug-Pull, Brave’s Tailcat, and OpenWebSearch.eu

Your intuition about the Search API market is spot-on. The “raw web search as a commodity API” era underwent a massive tectonic shift between mid-2025 and 2026:

Provider / Initiative Index Origin Current API Status (Oct 2026) Strategic Model
Google Search / Grounding Native Google Web Index Closed Custom Search JSON API to new users; offers Grounding with Google Search inside Gemini / Vertex Keep the Family Jewels: First-party Gemini models get native search; external devs buy grounded synthesis ($/prompt), not raw index dumps to train rival models.
Microsoft Bing Native Bing Index Retired all standalone Bing Search APIs on Aug 11, 2025 (announced May 15, 2025) Platform Lock-In: Killed raw SERP JSON endpoints; forced devs into Grounding with Bing Search inside Azure AI Foundry.
Brave Search API 100% Independent (Tailcat / Cliqz lineage + Web Discovery Project) Active (Raw SERP JSON + LLM Context / AI Grounding endpoints) Independent Index: Acquired Tailcat in 2021 (built by the ex-Cliqz team in Munich); cut all Bing/Google fallbacks in May 2023. 30B+ pages.
OpenWebSearch.eu Open Web Index (openwebindex.eu) Active EU Consortium (~1 PB open parquet/WARC data hosted at Univ. of Passau / LRZ / CERN) Public Digital Infrastructure: Horizon Europe project (14 institutions) decoupling open web crawling/indexing from commercial ranking and LLM RAG.
Exa / Tavily / Perplexity Hybrid neural crawlers + agentic extraction Active (Exa, Tavily, Perplexity Sonar) Agent-Native Retrieval: Bypass traditional 10-blue-link SERPs to return pre-parsed markdown/passages directly to AI agents.
SerpApi / Bright Data / Firecrawl Real-time headless scraping / markdown conversion Active Scrape-on-Demand: Real-time SERP & page extraction for teams locked out of official Google/Bing APIs.

Two highlights worth calling out for your book:

  1. Brave’s Real Lineage (Tailcat, Not Bing): Early alternative search engines (DuckDuckGo, Ecosia, Qwant) were indeed thin wrappers over Microsoft’s Bing API. Brave took a different path: in 2021, Brave acquired Tailcat, an independent search index built from scratch in Munich by the former Cliqz engineering team (originally backed by Hubert Burda Media and Mozilla). By May 2023, Brave removed its last fallback calls to Bing and Google. That is why, when Microsoft pulled the plug on the Bing Search API on August 11, 2025 with 90 days’ notice, Brave was the only western independent index left standing that could sell raw search JSON without upstream Big Tech exposure.
  2. Why Your Honeybot Telemetry Looks the Way It Does: Look at the live receipt captured in this very compile from remotes/honeybot/queries/content_neg_agents.sql:
    • ExaSearchBot/1.0 (+[https://crawler.exa.ai/](https://crawler.exa.ai/)): 1,210 negotiated Markdown reads (#1 on your server!)
    • ShapBot/0.1.0: 579 negotiated Markdown reads
    • Googlebot/2.1: 361 negotiated Markdown reads
    • KeenableBot/1.0: 154 combined negotiated Markdown reads
    • Claude-User (claude-code/*): Dozens of direct Markdown reads across versions

Because Google and Microsoft locked their raw search indices behind expensive “Grounding” walls, the entire agentic ecosystem (Exa, Claude-Code, OpenAI SearchBot, freeweb-mcp) is bypassing legacy SERP middleware and walking straight up to origin webservers that speak RFC 9110 (Accept: text/markdown) and RFC 9111 (Vary: Accept) [cite: 2]. Your website really is your feed [cite: 2].


4. Wiring Single-Pass Hero Banner Prompts into articleizer.py + Staging 100/100 Open Graph

We can bank the articleizer.py + editing_prompt.txt upgrade right now because both files are present in raw source in this compile:

  1. Riding the Slug-Selection Funnel (editing_prompt.txt + articleizer.py):
    • Instead of spending tokens on multiple image ideas, we add two flat string fields—hero_image_prompt and hero_image_alt—to book_analysis_content in scripts/articles/editing_prompt.txt.
    • The prompt instructs the editing model to derive one high-contrast, 1.91:1 (1200×630 Open Graph / 16:9 widescreen) visual metaphor directly from the winning title_brainstorm[0] headline and slug, centered in the safe zone with no text overlays.
    • In scripts/articles/articleizer.py, right below ### 🐦 X.com Promo Tweet, we render two click-to-copy fenced blocks into ## Book Analysis:
  2. ### 🎨 Hero Banner Image Prompt ([4 backticks]text`)
  3. ### 🖼️ YAML Frontmatter Image Override ([4 backticks]yaml), pre-filled with /assets/images/.jpeg` and the escaped `alt:` text so it is sitting in the buffer when you do your `TL;DR` TLC edit.

  4. Fixing the context.txt Warning (rgx 30 -> ! rgx 30) & Staging trimnoir for 100/100 Open Graph:
    • The compile log noted Warning: DE-PREFIXED COMMAND? Add the leading '! ' in context.txt: rgx 30 <--- !!!.
    • To take [https://mikelev.in](https://mikelev.in) from 91/100 to 100/100 on the Open Graph / PWA scanner (apple-touch-icon.png + site.webmanifest) and apply yesterday’s BANK car so custom post banners (page.image.path) render in the footer of _layouts/post.html, we load _layouts/default.html, _layouts/post.html, assets/main.css, and _config.yml from ~/repos/trimnoir in (2) NEXT CONTEXT.

(1) PROBES

Run this single-line read-only BEFORE probe in (nix) pipulate $ to inspect the current hero_image_prompt presence in scripts/articles/ and check the current icon/manifest and layout state in ~/repos/trimnoir:

(nix) pipulate $

rg -n "hero_image_prompt" scripts/articles/editing_prompt.txt scripts/articles/articleizer.py || true && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest|post-hero-banner" ~/repos/trimnoir/_layouts/default.html ~/repos/trimnoir/_layouts/post.html ~/repos/trimnoir/assets/main.css || true

(2) NEXT CONTEXT

Paste into context.txt using context or x to load the trimnoir layout/CSS files for the 100/100 Open Graph + custom post-footer patch alongside editing_prompt.txt, articleizer.py, and the probe echo:

context.txt
scripts/articles/editing_prompt.txt
scripts/articles/articleizer.py
/home/mike/repos/trimnoir/_layouts/default.html
/home/mike/repos/trimnoir/_layouts/post.html
/home/mike/repos/trimnoir/assets/main.css
/home/mike/repos/trimnoir/_config.yml
! rg -n "hero_image_prompt" scripts/articles/editing_prompt.txt scripts/articles/articleizer.py || true && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest|post-hero-banner" ~/repos/trimnoir/_layouts/default.html ~/repos/trimnoir/_layouts/post.html ~/repos/trimnoir/assets/main.css || true

(3) PATCHES

Car 1: Wire hero_image_prompt and hero_image_alt into scripts/articles/editing_prompt.txt and scripts/articles/articleizer.py so every newly articleized post includes a ready-to-copy Open Graph image prompt and YAML frontmatter image: block (patch, app, d, m):

Target: scripts/articles/editing_prompt.txt
[[[SEARCH]]]
  "book_analysis_content": {  
    "authors_imprint": "string",  
    "promotional_tweet": "string",
    "title_brainstorm": [  
[[[DIVIDER]]]
  "book_analysis_content": {  
    "authors_imprint": "string",  
    "promotional_tweet": "string",
    "hero_image_prompt": "string",
    "hero_image_alt": "string",
    "title_brainstorm": [  
[[[REPLACE]]]

Target: scripts/articles/editing_prompt.txt
[[[SEARCH]]]
  * promotional_tweet: Write promotional prose for X.com and put the literal [ARTICLE_URL] on its own line. Do not supply any other URL or Markdown link. articleizer.py replaces this marker with the post's canonical URL, or removes it when the target has no base URL. Include the 2 or 3 best hashtags, space allowing. Budget at most 280 characters INCLUDING the final URL, whose shape is [INSERT BASE URL][INSERT PERMALINK PATTERN].
  * title_brainstorm: Populate with 3-5 title ideas, rationales and filenames. The first entry is the preferred choice and the sole source of the published slug. Each filename must be a lowercase alphanumeric/hyphen slug ending in .md, with no folder or date prefix; the writer adds the date.
[[[DIVIDER]]]
  * promotional_tweet: Write promotional prose for X.com and put the literal [ARTICLE_URL] on its own line. Do not supply any other URL or Markdown link. articleizer.py replaces this marker with the post's canonical URL, or removes it when the target has no base URL. Include the 2 or 3 best hashtags, space allowing. Budget at most 280 characters INCLUDING the final URL, whose shape is [INSERT BASE URL][INSERT PERMALINK PATTERN].
  * hero_image_prompt: Ride directly on the synthesis of your preferred title, slug, and description to write ONE vivid image-generation prompt for a wide 16:9 / 1.91:1 (1200x630 Open Graph) hero banner that captures the article's central technical metaphor. Keep the focal subject centered inside the 1200x630 safe zone against a dark obsidian-slate (#111111) aesthetic with high-contrast lighting, graphic-novel ink-and-wash precision, and explicitly NO text overlays or lettering.
  * hero_image_alt: Write a concise, descriptive one-sentence alt-text string (under 125 characters, no double quotes) describing the visual scene in hero_image_prompt for Open Graph and screen-reader accessibility.
  * title_brainstorm: Populate with 3-5 title ideas, rationales and filenames. The first entry is the preferred choice and the sole source of the published slug. Each filename must be a lowercase alphanumeric/hyphen slug ending in .md, with no folder or date prefix; the writer adds the date.
[[[REPLACE]]]

Target: scripts/articles/articleizer.py
[[[SEARCH]]]
    if 'promotional_tweet' in analysis_content:
        analysis_markdown += f"\n### 🐦 X.com Promo Tweet\n[triple-backtick]text\n{promo_text}\n[triple-backtick]\n"
    for key, value in analysis_content.items():
        if key in ['authors_imprint', 'ai_editorial_take', 'promotional_tweet']:
            continue
[[[DIVIDER]]]
    if 'promotional_tweet' in analysis_content:
        analysis_markdown += f"\n### 🐦 X.com Promo Tweet\n[triple-backtick]text\n{promo_text}\n[triple-backtick]\n"
    hero_prompt = str(analysis_content.get("hero_image_prompt") or "").strip()
    hero_alt = str(analysis_content.get("hero_image_alt") or yaml_updates.get("title") or "").strip()
    if hero_prompt:
        safe_alt = hero_alt.replace('"', '\\"')
        analysis_markdown += f"\n### 🎨 Hero Banner Image Prompt\n[triple-backtick]text\n{hero_prompt}\n[triple-backtick]\n"
        analysis_markdown += f"\n### 🖼️ YAML Frontmatter Image Override\n[triple-backtick]yaml\nimage:\n  path: /assets/images/{slug}.jpeg\n  alt: \"{safe_alt}\"\n[triple-backtick]\n"
    for key, value in analysis_content.items():
        if key in ['authors_imprint', 'ai_editorial_take', 'promotional_tweet', 'hero_image_prompt', 'hero_image_alt']:
            continue
[[[REPLACE]]]

Ignition: no ignition required (the ! rg -n "hero_image_prompt" ... probe in context.txt reads the patched files directly on the next compile).

(4) PROMPT

Use prompt or p to create prompt.md from copy:

Verify the AFTER receipt for editing_prompt.txt and articleizer.py, then emit the patches and Pillow/manifest commands for trimnoir (_layouts/default.html, _layouts/post.html, assets/main.css, apple-touch-icon.png, and site.webmanifest) to take Open Graph compliance from 91/100 to 100/100 and render custom per-article hero banners in post footers.

(5) EXTERNAL DELIVERABLES

No external deliverables required.

MikeLev.in: Okay we can do this 5-Car Train and predispose the article to the image that’s going to be used at the very same time, and it’s a Space Gun Evaporating Competitive Moats namely having to crawl-and-index to have a copy of the Internet for fast satisfying of a human’s intent. Small-world-theory crawl can do it now if Markdown is cached at the edge through RFC 9111 (Vary: Accept). I believe that nobody except for Mark Nottingham the Standards Lead at Cloudflare who wrote the spec and the others who did it with him understands this.

And it’s a feature that can just be flipped-on so you get both your original HTML from origin cached at the CDN Edge when it can which means not shopping-carts and session stuff but all static resources which can very much now also include the on-the-fly generated Markdown conversion of the static resource with the JSON-LD structured data baked-in and all.

Pshew!

This is a space-gun because it’s a double-evaporation of competitive moats:

  1. Global crawl-and-index becomes more of a boondoggle than an advantage as massive cost and tech liability. Expect to see Google exaptation of all that compute to AI-inference which people really want now for things smart enough to just go check the live site-as-a-feed. This sure needs to be explained, Gemini!
  2. All the little competitors swinging their little axes at Google’s enormous ankles now don’t have to rebuild that infrastructure but can just take up fast and nibble RAG-crawls of websites even if it’s 3 or 4 drill-down clicks to find what it needs (product availability, etc. because remember: your site is your feed) if it’s all cached at the edge as Markdown.

Think anyone understands this? Is this really implemented today at the CDNs? At what level of Cloudflare do you just get this Markdown-per-HTML feature “for free”? (though of course you’re paying for it at the higher service level) And is Akamai doing anything equivalent? Fastly?

What happens if anyone can write a bot to quickly get-in and get-out using the actual Web itself as the live database?

Double Moat Evaporation: When the Live Web Becomes the Feed

And can you think of more reasons why this is disruptive and how the world gets better as a result?

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

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 "hero_image_prompt" scripts/articles/editing_prompt.txt scripts/articles/articleizer.py || true && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest|post-hero-banner" ~/repos/trimnoir/_layouts/default.html ~/repos/trimnoir/_layouts/post.html ~/repos/trimnoir/assets/main.css || true
/home/mike/repos/trimnoir/assets/main.css
105:p > a > img.post-hero-banner {
117:p > a:hover > img.post-hero-banner {

/home/mike/repos/trimnoir/_layouts/post.html
60:  <p><a href="{{ "/" | relative_url }}"><img class="post-hero-banner" src="{{ post_banner | relative_url }}" alt="{{ post_banner_alt | escape }}" width="1200" height="630" loading="lazy"></a></p>
(nix) pipulate $ 

2: AFTER (NEXT CONTEXT):

# # Context 1
# context.txt
# /home/mike/repos/trimnoir/_posts/2026-10-19-john-henry-steam-dinosaur-hero-banner-open-graph.md
# 
# # THE SOFTWARE VON NEUMANN PROBE
# assets/installer/install.sh
# flake.nix
# release.py
# ~/repos/nixos/blogs.nix
# remotes/honeybot/www/qamy.ai/index.html
# remotes/honeybot/www/qamy.ai/walk/1/index.html
# remotes/honeybot/www/qamy.ai/walk/2/index.html
# remotes/honeybot/www/qamy.ai/walk/3/index.html
# 
# # THE DATA EVERYONE NEEDS
# remotes/honeybot/queries/trapdoor_ips.sql
# ! echo "--- WHO HYDRATES THE DOM ---" && cat remotes/honeybot/queries/trapdoor_ips.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
# remotes/honeybot/queries/content_neg_agents.sql
# ! echo "--- WHO NEGOTIATES MARKDOWN ---" && cat remotes/honeybot/queries/content_neg_agents.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
# 
# # THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
# ~/repos/nixos/blogs.nix
# ~/.config/pipulate/blogs.json
# scripts/articles/publishizer.py
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/build_knowledge_graph.py
# scripts/articles/editing_prompt.txt
# scripts/articles/sanitizer.py
# scripts/articles/contextualizer.py
# scripts/articles/generate_llms_txt.py
# scripts/articles/generate_post_nav.py
# 
# # HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
# nixops.sh
# remotes/honeybot/hooks/post-receive
# remotes/honeybot/nixos/configuration.nix
# remotes/honeybot/scripts/stream.py
# remotes/honeybot/scripts/score.py
# remotes/honeybot/scripts/card.py
# remotes/honeybot/scripts/forest.py
# remotes/honeybot/scripts/test_forest.py
# remotes/honeybot/scripts/logs.py
# remotes/honeybot/scripts/content_loader.py
# remotes/honeybot/scripts/db.py

# Context 2
context.txt
scripts/articles/editing_prompt.txt
scripts/articles/articleizer.py
/home/mike/repos/trimnoir/_layouts/default.html
/home/mike/repos/trimnoir/_layouts/post.html
/home/mike/repos/trimnoir/assets/main.css
/home/mike/repos/trimnoir/_config.yml
! rg -n "hero_image_prompt" scripts/articles/editing_prompt.txt scripts/articles/articleizer.py || true && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest|post-hero-banner" ~/repos/trimnoir/_layouts/default.html ~/repos/trimnoir/_layouts/post.html ~/repos/trimnoir/assets/main.css || true

3: CHANGE (PATCHES):

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 'scripts/articles/editing_prompt.txt'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'scripts/articles/editing_prompt.txt'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'scripts/articles/articleizer.py'.
(nix) pipulate $ d
diff --git a/scripts/articles/articleizer.py b/scripts/articles/articleizer.py
index b286027..aa90878 100644
--- a/scripts/articles/articleizer.py
+++ b/scripts/articles/articleizer.py
@@ -411,8 +411,14 @@ def create_jekyll_post(article_content, instructions, output_dir, preview_port,
         analysis_markdown += f"\n### Ai Editorial Take\n{analysis_content['ai_editorial_take']}\n"
     if 'promotional_tweet' in analysis_content:
         analysis_markdown += f"\n### 🐦 X.com Promo Tweet\n[triple-backtick]text\n{promo_text}\n[triple-backtick]\n"
+    hero_prompt = str(analysis_content.get("hero_image_prompt") or "").strip()
+    hero_alt = str(analysis_content.get("hero_image_alt") or yaml_updates.get("title") or "").strip()
+    if hero_prompt:
+        safe_alt = hero_alt.replace('"', '\\"')
+        analysis_markdown += f"\n### 🎨 Hero Banner Image Prompt\n[triple-backtick]text\n{hero_prompt}\n[triple-backtick]\n"
+        analysis_markdown += f"\n### 🖼️ YAML Frontmatter Image Override\n[triple-backtick]yaml\nimage:\n  path: /assets/images/{slug}.jpeg\n  alt: \"{safe_alt}\"\n[triple-backtick]\n"
     for key, value in analysis_content.items():
-        if key in ['authors_imprint', 'ai_editorial_take', 'promotional_tweet']:
+        if key in ['authors_imprint', 'ai_editorial_take', 'promotional_tweet', 'hero_image_prompt', 'hero_image_alt']:
             continue
         title = key.replace('_', ' ').title()
         analysis_markdown += f"\n### {title}\n"
diff --git a/scripts/articles/editing_prompt.txt b/scripts/articles/editing_prompt.txt
index 835982f..f5463b8 100644
--- a/scripts/articles/editing_prompt.txt
+++ b/scripts/articles/editing_prompt.txt
@@ -54,6 +54,8 @@ The JSON object must conform to the following schema:
   "book_analysis_content": {  
     "authors_imprint": "string",  
     "promotional_tweet": "string",
+    "hero_image_prompt": "string",
+    "hero_image_alt": "string",
     "title_brainstorm": [  
       {  
         "title": "string",  
@@ -90,6 +92,8 @@ The JSON object must conform to the following schema:
 * **book_analysis_content**: This top-level key contains all the valuable analysis that doesn't get edited into the file directly but is used for the book-writing process.  
   * authors_imprint: Populate with the first-person summary.  
   * promotional_tweet: Write promotional prose for X.com and put the literal [ARTICLE_URL] on its own line. Do not supply any other URL or Markdown link. articleizer.py replaces this marker with the post's canonical URL, or removes it when the target has no base URL. Include the 2 or 3 best hashtags, space allowing. Budget at most 280 characters INCLUDING the final URL, whose shape is [INSERT BASE URL][INSERT PERMALINK PATTERN].
+  * hero_image_prompt: Ride directly on the synthesis of your preferred title, slug, and description to write ONE vivid image-generation prompt for a wide 16:9 / 1.91:1 (1200x630 Open Graph) hero banner that captures the article's central technical metaphor. Keep the focal subject centered inside the 1200x630 safe zone against a dark obsidian-slate (#111111) aesthetic with high-contrast lighting, graphic-novel ink-and-wash precision, and explicitly NO text overlays or lettering.
+  * hero_image_alt: Write a concise, descriptive one-sentence alt-text string (under 125 characters, no double quotes) describing the visual scene in hero_image_prompt for Open Graph and screen-reader accessibility.
   * title_brainstorm: Populate with 3-5 title ideas, rationales and filenames. The first entry is the preferred choice and the sole source of the published slug. Each filename must be a lowercase alphanumeric/hyphen slug ending in .md, with no folder or date prefix; the writer adds the date.
   * content_potential_and_polish: Structure the "Core Strengths" and "Constructive Polish" suggestions here.  
   * ai_editorial_take: Populate with your AI perspective on the entry's potential. What surprised you most? Don't use the exact same thing as the previous AI participating in the dialogue. Find some absolutely new angle or perspective that isn't mentioned yet in the article.
(nix) pipulate $ m
📝 Committing: fix: add hero image prompt and alt to articleizer
[main f1e6c63] fix: add hero image prompt and alt to articleizer
 2 files changed, 11 insertions(+), 1 deletion(-)
(nix) pipulate $ git push
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 48 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1.23 KiB | 1.23 MiB/s, done.
Total 6 (delta 5), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
To github.com:pipulate/pipulate.git
   a429f2e..f1e6c63  main -> main
(nix) pipulate $ 

No ignition required. This will ignite once I turn this into a published article.

4: PROMPT:

Verify the AFTER receipt for editing_prompt.txt and articleizer.py, then emit the patches and Pillow/manifest commands for trimnoir (_layouts/default.html, _layouts/post.html, assets/main.css, apple-touch-icon.png, and site.webmanifest) to take Open Graph compliance from 91/100 to 100/100 and render custom per-article hero banners in post footers.

5: DELIVERABLE:

A much more visual experience with the blog articles initially and with the home-hosted Honeybot AI Observatory live-broadcast in time. We will have index pages with article thumbnails when available and such. All in due time. Not on this turn. We bank no-takebacks forward-plodding ratchet-turning meaningfully impactful in the world directionally-adjust difference-making baby-steps around here.

Gemini 4 Argon High: Context verified.

TL;DR: The live AFTER receipt confirms hero_image_prompt and hero_image_alt are now active in scripts/articles/editing_prompt.txt (lines 57, 95–96) and scripts/articles/articleizer.py (lines 414–421), and .post-hero-banner is live in ~/repos/trimnoir/_layouts/post.html (line 60) and assets/main.css (lines 105, 117). Below, we examine how RFC 9110 (Accept: text/markdown) + RFC 9111 (Vary: Accept) act as an orbital space-gun that evaporates both the legacy crawl-and-index moat and the headless pre-render moat, verify what Cloudflare (Markdown for Agents, included on the $20/mo Pro tier), Akamai, and Fastly actually ship today, predispose this article’s own space-gun hero banner, and emit the patches to add /apple-touch-icon.png and /site.webmanifest so mikelev.in climbs from 91/100 to 100/100 on the Open Graph validator.


1. Verification of the articleizer.py & trimnoir AFTER Receipt

From this compile’s live receipt (! rg -n "hero_image_prompt" ...):

scripts/articles/articleizer.py:414:    hero_prompt = str(analysis_content.get("hero_image_prompt") or "").strip()
scripts/articles/articleizer.py:421:        if key in ['authors_imprint', 'ai_editorial_take', 'promotional_tweet', 'hero_image_prompt', 'hero_image_alt']:
scripts/articles/editing_prompt.txt:57:    "hero_image_prompt": "string",
scripts/articles/editing_prompt.txt:95:  * hero_image_prompt: Ride directly on the synthesis of your preferred title, slug, and description to write ONE vivid image-generation prompt for a wide 16:9 / 1.91:1 (1200x630 Open Graph) hero banner...
scripts/articles/editing_prompt.txt:96:  * hero_image_alt: Write a concise, descriptive one-sentence alt-text string...
/home/mike/repos/trimnoir/assets/main.css:105:p > a > img.post-hero-banner {
/home/mike/repos/trimnoir/assets/main.css:117:p > a:hover > img.post-hero-banner {
/home/mike/repos/trimnoir/_layouts/post.html:60:  <p><a href="{{ "/" | relative_url }}"><img class="post-hero-banner" src="{{ post_banner | relative_url }}" alt="{{ post_banner_alt | escape }}" width="1200" height="630" loading="lazy"></a></p>
  • Banked in pipulate (f1e6c63): Every time you run article (or grim, pip, qamy), the editing pass now rides the exact same cognitive funnel that selects title_brainstorm[0] to emit one ready-to-copy ### 🎨 Hero Banner Image Prompt and one ### 🖼️ YAML Frontmatter Image Override block at the bottom of the generated Markdown file.
  • Remaining in trimnoir for 100/100 Open Graph: apple-touch-icon.png and site.webmanifest returned empty in the ls -lh probe and <head> grep. We wire both in (3) PATCHES below.

2. The Orbital Space-Gun: Why RFC 9110 + RFC 9111 Evaporate Two Moats at Once

                  ╔═══════════════════════════════════════════╗
                  ║   IETF RFC 9110 (§12) + RFC 9111 (Vary)   ║
                  ║    Accept: text/markdown  |  Vary: Accept ║
                  ╚═════════════════════╤═════════════════════╝
                                        │
                                        ║  (Sub-50ms Edge Markdown Beam)
                                        ▼
         ┌──────────────────────────────┴──────────────────────────────┐
         ▼                                                             ▼
  💥 MOAT #1 EVAPORATED:                                       💥 MOAT #2 EVAPORATED:
  The Headless Pre-Render Crutch                               The Exabyte Crawl-and-Index Tax
  ──────────────────────────────                               ───────────────────────────────
  • Rube Goldberg Chromium farms                               • Storing a stale copy of the Web
    built to hydrate JS for bots                                 just to answer queries in 200ms
  • Instantly becomes an expensive                             • Replaced by Small-World 3-Hop
    tech-debt liability at the edge                              live RAG over edge-cached .md

Your observation about Mark Nottingham (mnot) connects the dots that almost the entire SEO and enterprise web-infrastructure industry has missed:

  1. The Author Sitting at the Switch: Mark Nottingham is not merely a participant in HTTP standards; he has chaired the IETF HTTP Working Group (httpbis) since 2007, co-edited RFC 9110 (HTTP Semantics, June 2022) and RFC 9111 (HTTP Caching, June 2022) alongside Roy Fielding and Julian Reschke, chaired the IAB Workshop on AI-CONTROL, co-chairs the IETF AI Preferences Working Group (aipref), and serves as Standards Lead at Cloudflare. Before Cloudflare, he built the standards strategy at Akamai. He designed Vary secondary cache keys in RFC 9111 Section 4.1 to work at global CDN scale without cache poisoning or origin stampedes.
  2. Double Moat Evaporation:
    • Evaporation #1 — The Pre-Render Moat Becomes a Liability: For a decade, enterprise sites built fragile client-side JavaScript SPAs and then paid six figures a year for middleware pre-render farms (headless Chromium clusters, Prerender.io, dynamic rendering proxies) to spoon-feed hydrated HTML to bots. When a CDN or origin serves text/markdown partitioned by Vary: Accept, headless Chromium pre-rendering flips overnight from a “competitive moat” into a slow, high-compute Rube Goldberg liability.
    • Evaporation #2 — Global Crawl-and-Index vs. Small-World Live RAG (Exaptation of Compute): Historically, Google and Bing had to crawl, render, and store a petabyte-scale duplicate of the entire Web because fetching live pages on demand was too slow and noisy (3–5 seconds of JS hydration and 500 KB of <div> soup per page).
    • By Small-World Network Theory (Watts–Strogatz / Milgram’s six degrees), any specific product, price, or technical answer on a well-organized site is 3 to 4 hops away from the root manifest (/llms.txt → Hub → Category → Leaf URI).
    • When all 4 hops are cached as Markdown at the CDN edge (Vary: Accept), each hop is a 15–30ms edge cache hit returning 2–10 KB of pure semantic text. A 4-hop live drill-down completes in < 120ms total.
    • As a result, hyperscalers can exapt (repurpose) the massive data-center power and compute once burned on continuous headless-browser crawling and monolithic HTML indexing straight into AI inference—while agile competitors no longer need to rebuild Google’s exabyte warehouse to verify live facts on the Web.

3. What the CDNs Actually Ship Today: Cloudflare vs. Akamai vs. Fastly

You asked whether this is really implemented at the CDNs today, what tier of Cloudflare gets it “for free,” and what Akamai and Fastly are doing:

CDN Provider Edge Markdown Status (Oct 2026) Plan / Tier Availability How It Works & Architectural Trade-Off
Cloudflare Live Turnkey Feature: Markdown for Agents (launched Feb 12, 2026) Pro ($20/mo), Business ($200/mo), Enterprise, and SSL for SaaS at no extra cost Toggle in AI Crawl Control -> Enable Markdown for Agents (or Configuration Rules). When a client sends Accept: text/markdown, Cloudflare converts origin HTML (up to 6 MiB) on the fly at the edge, emits Vary: Accept, x-markdown-tokens: <N>, and Content-Signal: ai-train=yes, search=yes, ai-input=yes.
Akamai Primitive + EdgeWorkers (Commercial focus is AI Bot Mitigation / Guardrails) Enterprise (EdgeWorkers + Property Manager Vary: Accept) Akamai’s caching engine honors RFC 9111 Vary: Accept natively, and EdgeWorkers can rewrite Accept: text/markdown or transform HTML, but Akamai markets blocking/governing AI scrapers rather than a one-click Pro toggle.
Fastly Primitive + Fastly Compute (Wasm) Usage-based / Enterprise (VCL + Compute) Fastly VCL has industry-leading Vary: Accept secondary-key caching and instant surrogate-key purge, but requires a custom Compute@Edge service or a bimodal origin like yours to emit the Markdown body.

Why Your Origin-Native Markdown Still Beats Cloudflare’s Auto-Converter: Cloudflare’s $20/month Pro toggle is a massive validation of your thesis—and it specifically cites Claude-User (claude-code) and OpenCode sending Accept: text/markdown headers in the wild, the exact agents sitting in your Honeybot SQLite database! However, Cloudflare’s automatic converter is a synthetic HTML-to-Markdown scraper at the edge: it takes whatever bloated HTML the origin emitted and strips tags heuristically. When you serve first-party curated Markdown from the origin (_site/${PERMALINK}index.md + /llms.txt + <script type="application/ld+json"> parity) and let RFC 9111 (Vary: Accept) cache both representations at the edge, you control the exact token payload, hierarchy, and structured data rather than trusting a generic DOM stripper.


4. Predisposing This Article’s Hero Banner: The Orbital RFC 9110 Space-Gun

To predispose this article’s hero_image_prompt when you run article (or if you want to generate the graphic right now while writing), here is the visual concept anchored to your metaphor:

Wide 16:9 / 1.91:1 (1200x630 Open Graph) cinematic illustration, dark obsidian-slate background (#111111) with high-contrast cyan-blue and warm amber rim lighting. In the upper center safe-zone, a sleek orbital brass-and-obsidian satellite cannon—the RFC 9110 / RFC 9111 Edge Space-Gun—fires a coherent, razor-sharp beam of glowing cyan light straight down from low orbit. Below the beam, a medieval stone fortress surrounded by a muddy moat filled with tangled, rusting Rube Goldberg clockwork gears, smoking server racks, and chained mechanical headless-browser puppets is vaporizing into clean, weightless geometric light particles. Graphic novel ink-and-wash aesthetic, crisp silhouette, high contrast, no text overlays or lettering.

5. Taking trimnoir from 91/100 to 100/100 Open Graph Compliance

In the 91/100 Open Graph report from yesterday’s article, only two items stood between [https://mikelev.in](https://mikelev.in) and a perfect 100/100:

  1. [WARNING] Missing apple-touch-icon: <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
  2. [TIP] Missing web app manifest: <link rel="manifest" href="/site.webmanifest">

In (3) PATCHES below:

  • Car 1 patches /home/mike/repos/trimnoir/_layouts/default.html to add both <link> tags right below the SVG favicon, and uses [[[WRITE_FILE]]] to create /home/mike/repos/trimnoir/site.webmanifest.
  • Car 2 uses a root-anchored "$PIPULATE_ROOT/.venv/bin/python" Pillow one-liner to crop the left 1:1 square (containing the red wax seal and your portrait) from your master banner and save /home/mike/repos/trimnoir/apple-touch-icon.png at an exact 180 × 180 pixels.

(1) PROBES

Run this single-line read-only BEFORE probe in (nix) pipulate $ to record the current state of _layouts/default.html, site.webmanifest, and apple-touch-icon.png in ~/repos/trimnoir:

(nix) pipulate $

git -C ~/repos/trimnoir status --short && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest" ~/repos/trimnoir/_layouts/default.html || true

(2) NEXT CONTEXT

Paste into context.txt using context or x:

context.txt
scripts/articles/editing_prompt.txt
scripts/articles/articleizer.py
/home/mike/repos/trimnoir/_layouts/default.html
/home/mike/repos/trimnoir/_layouts/post.html
/home/mike/repos/trimnoir/assets/main.css
/home/mike/repos/trimnoir/_config.yml
! git -C ~/repos/trimnoir status --short && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest" ~/repos/trimnoir/_layouts/default.html || true

(3) PATCHES

Car 1: Patch /home/mike/repos/trimnoir/_layouts/default.html to link /apple-touch-icon.png and /site.webmanifest, and create /home/mike/repos/trimnoir/site.webmanifest (patch, app):

Target: /home/mike/repos/trimnoir/_layouts/default.html
[[[SEARCH]]]
<meta name="theme-color" content="#111111">
<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="icon" type="image/svg+xml" href="/assets/svg/mike-levin.svg">
[[[DIVIDER]]]
<meta name="theme-color" content="#111111">
<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="icon" type="image/svg+xml" href="/assets/svg/mike-levin.svg">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
[[[REPLACE]]]

Target: /home/mike/repos/trimnoir/site.webmanifest
[[[WRITE_FILE]]]
{
  "name": "Mike Levin — Wire-Truth Infrastructure & AI Architecture",
  "short_name": "MikeLev.in",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#111111",
  "theme_color": "#111111",
  "icons": [
    {
      "src": "/apple-touch-icon.png",
      "sizes": "180x180",
      "type": "image/png"
    },
    {
      "src": "/assets/svg/mike-levin.svg",
      "sizes": "any",
      "type": "image/svg+xml"
    }
  ]
}
[[[END_WRITE_FILE]]]

Car 2: Generate /home/mike/repos/trimnoir/apple-touch-icon.png (180 × 180 PNG) from the left 1:1 square of your master banner using the root-anchored Pipulate Python interpreter:

(nix) pipulate $

"$PIPULATE_ROOT/.venv/bin/python" -c 'import os; from PIL import Image; cands=[os.path.expanduser("~/og-default-master-3072x1613.png"), "/home/mike/repos/trimnoir/assets/images/AI_Readiness_Consultant_RFC_9111.png", "/home/mike/repos/trimnoir/assets/images/og-default.png"]; src=next(p for p in cands if os.path.exists(p)); dst="/home/mike/repos/trimnoir/apple-touch-icon.png"; im=Image.open(src).convert("RGBA"); bg=Image.new("RGB", im.size, (17,17,17)); bg.paste(im, mask=im.split()[3]); s=min(bg.size); sq=bg.crop((0,0,s,s)).resize((180,180), Image.Resampling.LANCZOS); sq.save(dst, "PNG", optimize=True); print("Source:", os.path.basename(src), "-> Saved:", dst, Image.open(dst).size, os.path.getsize(dst), "bytes")' && file ~/repos/trimnoir/apple-touch-icon.png

Ignition: Stage and push in ~/repos/trimnoir (cd ~/repos/trimnoir && git add _layouts/default.html site.webmanifest apple-touch-icon.png && blast && cd "$PIPULATE_ROOT") when ready to deploy to Honeybot and re-test the 100/100 Open Graph score.

(4) PROMPT

Use prompt or p to create prompt.md from copy:

Verify the AFTER receipt confirming apple-touch-icon.png (180x180), site.webmanifest, and _layouts/default.html in trimnoir, and check the updated Open Graph score or call the 7-beat Notary Dismount (\z).

(5) EXTERNAL DELIVERABLES

No external deliverables required.

MikeLev.in: Right and there is another subtle point here nobody gets and I’m going to start shaping my data-pulls and reports better to feed the Data is Beautiful process so I can feature maybe even live-wired through DS3 and such visualizations of the climbing percentage of User Agents that Accept Markdown and who they are, blah blah.

Translucent color-coded circles will be changing size and color as they gradually move into new places on an X by Y axis like a Gartner or Forrester technology research and advisory money-shot visuals (the Wave Report for example). It’s just that mine will be live-wired to a home-hosted AI Observatory that’s not behind a CDN whose logfiles already lets you watch AI-bots like fish in a fishtank.

Imagine when I make that live-banded Data is Beautiful visualizations easy to find on the homepages of my sites and occasionally popping up during Storytime.

Imagine it with a 30-and-3 exercise please and thank you.

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

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

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) pipulate $ git -C ~/repos/trimnoir status --short && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest" ~/repos/trimnoir/_layouts/default.html || true
(nix) pipulate $ 

2: AFTER (NEXT CONTEXT):

# # Context 1
# context.txt
# /home/mike/repos/trimnoir/_posts/2026-10-19-john-henry-steam-dinosaur-hero-banner-open-graph.md
# 
# # THE SOFTWARE VON NEUMANN PROBE
# assets/installer/install.sh
# flake.nix
# release.py
# ~/repos/nixos/blogs.nix
# remotes/honeybot/www/qamy.ai/index.html
# remotes/honeybot/www/qamy.ai/walk/1/index.html
# remotes/honeybot/www/qamy.ai/walk/2/index.html
# remotes/honeybot/www/qamy.ai/walk/3/index.html
# 
# # THE DATA EVERYONE NEEDS
# remotes/honeybot/queries/trapdoor_ips.sql
# ! echo "--- WHO HYDRATES THE DOM ---" && cat remotes/honeybot/queries/trapdoor_ips.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
# remotes/honeybot/queries/content_neg_agents.sql
# ! echo "--- WHO NEGOTIATES MARKDOWN ---" && cat remotes/honeybot/queries/content_neg_agents.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
# 
# # THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
# ~/repos/nixos/blogs.nix
# ~/.config/pipulate/blogs.json
# scripts/articles/publishizer.py
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/build_knowledge_graph.py
# scripts/articles/editing_prompt.txt
# scripts/articles/sanitizer.py
# scripts/articles/contextualizer.py
# scripts/articles/generate_llms_txt.py
# scripts/articles/generate_post_nav.py
# 
# # HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
# nixops.sh
# remotes/honeybot/hooks/post-receive
# remotes/honeybot/nixos/configuration.nix
# remotes/honeybot/scripts/stream.py
# remotes/honeybot/scripts/score.py
# remotes/honeybot/scripts/card.py
# remotes/honeybot/scripts/forest.py
# remotes/honeybot/scripts/test_forest.py
# remotes/honeybot/scripts/logs.py
# remotes/honeybot/scripts/content_loader.py
# remotes/honeybot/scripts/db.py

# Context 2
# context.txt
# scripts/articles/editing_prompt.txt
# scripts/articles/articleizer.py
# /home/mike/repos/trimnoir/_layouts/default.html
# /home/mike/repos/trimnoir/_layouts/post.html
# /home/mike/repos/trimnoir/assets/main.css
# /home/mike/repos/trimnoir/_config.yml
# ! rg -n "hero_image_prompt" scripts/articles/editing_prompt.txt scripts/articles/articleizer.py || true && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest|post-hero-banner" ~/repos/trimnoir/_layouts/default.html ~/repos/trimnoir/_layouts/post.html ~/repos/trimnoir/assets/main.css || true

# Context 3
context.txt
/home/mike/pipulate/remotes/honeybot/queries/all_time_popular_paths.sql
/home/mike/pipulate/remotes/honeybot/queries/content_neg_agents.sql
/home/mike/pipulate/remotes/honeybot/queries/format_ratio.sql
/home/mike/pipulate/remotes/honeybot/queries/health_db_vitals.sql
/home/mike/pipulate/remotes/honeybot/queries/hot_404_remaps_top.sql
/home/mike/pipulate/remotes/honeybot/queries/hub_candidates.sql
/home/mike/pipulate/remotes/honeybot/queries/hydration_family.sql
/home/mike/pipulate/remotes/honeybot/queries/hydration_rate.sql
/home/mike/pipulate/remotes/honeybot/queries/hydration_selftest.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_404_decay_curve.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_emerging_manifests.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_hostile_dictionary.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_llms_txt.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_markdown_affinity.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_noise_404s.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_phantom_ui.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_sovereign_bots.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_true_404s.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_unknown_agents.sql
/home/mike/pipulate/remotes/honeybot/queries/markdown_routing_metrics.sql
/home/mike/pipulate/remotes/honeybot/queries/md_diet.sql
/home/mike/pipulate/remotes/honeybot/queries/md_routing_agents.sql
/home/mike/pipulate/remotes/honeybot/queries/telemetry_totals.sql
/home/mike/pipulate/remotes/honeybot/queries/telemetry_trapdoor_events.sql
/home/mike/pipulate/remotes/honeybot/queries/trapdoor_ips.sql
/home/mike/pipulate/remotes/honeybot/queries/ua_variants.sql
scripts/articles/editing_prompt.txt
scripts/articles/articleizer.py
/home/mike/repos/trimnoir/_layouts/default.html
/home/mike/repos/trimnoir/_layouts/post.html
/home/mike/repos/trimnoir/assets/main.css
/home/mike/repos/trimnoir/_config.yml
! git -C ~/repos/trimnoir status --short && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest" ~/repos/trimnoir/_layouts/default.html || true

3: CHANGE (PATCHES):

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
✅ WHOLE-FILE WRITE: CREATED '/home/mike/repos/trimnoir/site.webmanifest'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated '/home/mike/repos/trimnoir/_layouts/default.html'.
(nix) pipulate $ cd /home/mike/repos/trimnoir/
(nix) trimnoir $ d
diff --git a/_layouts/default.html b/_layouts/default.html
index fb61688a5..1cb611ce8 100644
--- a/_layouts/default.html
+++ b/_layouts/default.html
@@ -7,6 +7,8 @@
 <meta name="theme-color" content="#111111">
 <link rel="icon" href="/favicon.ico" sizes="any">
 <link rel="icon" type="image/svg+xml" href="/assets/svg/mike-levin.svg">
+<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
+<link rel="manifest" href="/site.webmanifest">
 {% if page.path contains '_posts' %}
 {%- assign source_filename = page.path | split: '/' | last -%}
 <link rel="alternate" type="text/markdown" title="Source Markdown" href="{ { site.url } }{ { page.url } }index.md?src=link+rel">

--- UNTRACKED (invisible to the diff above; m will not commit these; git add the ones you mean) ---
  + site.webmanifest
(nix) trimnoir $ git add site.webmanifest
(nix) trimnoir $ m
📝 Committing: chore: Add site.webmanifest file
[main 84a6f5f97] chore: Add site.webmanifest file
 2 files changed, 22 insertions(+)
 create mode 100644 site.webmanifest
(nix) trimnoir $ # Overriding my impulse to git push
(nix) trimnoir $ 

Oh and the actual having the image there part of last bit of percentage of Open Graph completeness:

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

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) trimnoir $ h
(nix) pipulate $ "$PIPULATE_ROOT/.venv/bin/python" -c 'import os; from PIL import Image; cands=[os.path.expanduser("~/og-default-master-3072x1613.png"), "/home/mike/repos/trimnoir/assets/images/AI_Readiness_Consultant_RFC_9111.png", "/home/mike/repos/trimnoir/assets/images/og-default.png"]; src=next(p for p in cands if os.path.exists(p)); dst="/home/mike/repos/trimnoir/apple-touch-icon.png"; im=Image.open(src).convert("RGBA"); bg=Image.new("RGB", im.size, (17,17,17)); bg.paste(im, mask=im.split()[3]); s=min(bg.size); sq=bg.crop((0,0,s,s)).resize((180,180), Image.Resampling.LANCZOS); sq.save(dst, "PNG", optimize=True); print("Source:", os.path.basename(src), "-> Saved:", dst, Image.open(dst).size, os.path.getsize(dst), "bytes")' && file ~/repos/trimnoir/apple-touch-icon.png
Source: og-default-master-3072x1613.png -> Saved: /home/mike/repos/trimnoir/apple-touch-icon.png (180, 180) 31957 bytes
/home/mike/repos/trimnoir/apple-touch-icon.png: PNG image data, 180 x 180, 8-bit/color RGB, non-interlaced
(nix) pipulate $ cd /home/mike/repos/trimnoir/
(nix) trimnoir $ git status
On branch main
Your branch is ahead of 'home/main' by 1 commit.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	apple-touch-icon.png

nothing added to commit but untracked files present (use "git add" to track)
(nix) trimnoir $ git add apple-touch-icon.png
(nix) trimnoir $ open
(nix) trimnoir $ # Interesting choice there Gemini\! Ha ha ha
(nix) trimnoir $ 

Ignition in time. One cannot ignite a space-gun too rashly. I love how Gemini is now giving me command lines in parenthesis very sophisticated scope and order of operations control there! I’m tempted to use it but I’m staying with my habits so long as I looked closely at Gemini’s way to see if it’s trying to tell me anything I don’t see and am not thinking about properly yet.

Nope.

I got this.

4: PROMPT:

Verify the AFTER receipt confirming apple-touch-icon.png (180x180), site.webmanifest, and _layouts/default.html in trimnoir, and check the updated Open Graph score or call the 7-beat Notary Dismount (\z).

5: DELIVERABLE:

Delivering the deliverable looks like this:

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

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   apple-touch-icon.png

GIT repo has changes. Type blast to commit them, then take the BEFORE reading.
(nix) trimnoir $ git add apple-touch-icon.png
(nix) trimnoir $ m
📝 Committing: chore: Add apple-touch-icon.png
[main ae76ae3be] chore: Add apple-touch-icon.png
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 apple-touch-icon.png
(nix) trimnoir $ blast
🚀 Pushing 2 commit(s) to remote...
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 48 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 32.25 KiB | 16.13 MiB/s, done.
Total 8 (delta 3), reused 0 (delta 0), pack-reused 0 (from 0)
remote: 🎯 [Hook] Received Push. Deploying...
remote: Already on 'main'
remote: 🔨 [Hook] Starting Hybrid Build...
remote: Linux detected. Skipping Neovim setup as it's not needed.
remote: Jekyll environment ready (quiet mode).
remote: Run 'jes' to start the server manually.
remote: 🏗️  Jekyll Build...
remote: Configuration file: /home/mike/www/mikelev.in/_config.yml
remote:             Source: /home/mike/www/mikelev.in
remote:        Destination: /home/mike/www/mikelev.in/_site
remote:  Incremental build: disabled. Enable with --incremental
remote:       Generating... 
remote:                     done in 11.514 seconds.
remote:  Auto-regeneration: disabled. Use --watch to enable.
remote: 📄 Publishing Source Markdown (Chisel-Strike)...
remote: ✨ Python Scalpel: Successfully dyed 1559 articles in one pass.
remote: 🗺️  Deploying Nginx Redirect Map...
remote: 🔒 [Hook] Fixing Permissions...
remote: 🔔 [Hook] Ringing the breaking-news bell...
remote: ✅ [Hook] Deployment Complete. Site is Live.
To [REDACTED_IP]:~/git/mikelev.in.git
   f59fe341b..ae76ae3be  main -> main
_______________________________________________________________________________________________________________________________

On branch main
Your branch is up to date with 'home/main'.

nothing to commit, working tree clean

GIT repo clean. Take BEFORE reading, make CHANGE, record AFTER diff.
(nix) trimnoir $ 

Well that was fun. I guess I’m just going to get the prompt now embedded into the article just like I get the tweet embedded, or possibly the prompt will show in the command line output or directly into my host operating system’s copy-paste buffer for an immediate post. I must have some yt"something" command or this, I’m guessing but should not be guessing because I’m the Coachman and should have been reading each of those patches and just knowing this stuff already, but I’m both distractable and Dory, so break it down for me so I can start myelinating this and start adding these hero banners like riding a bicycle, please and thank you Gemini 4.

And while we don’t have to get to the Data is Beautiful stuff, I’m going to show you all this just in case so we can start making those tiny directional adjustments. I already gave you a 30-and-3 exercise this turn but you know in a later turn we’re going to ferret out all the best visuals to serve the cascading chain reacting objective here.

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 $ cd remotes/
(nix) remotes $ ls
honeybot
(nix) remotes $ cd honeybot/
(nix) honeybot $ ls
hooks  nixos  queries  scripts  www
(nix) honeybot $ cd queries/
(nix) queries $ lsp
/home/mike/pipulate/remotes/honeybot/queries/all_time_popular_paths.sql
/home/mike/pipulate/remotes/honeybot/queries/content_neg_agents.sql
/home/mike/pipulate/remotes/honeybot/queries/format_ratio.sql
/home/mike/pipulate/remotes/honeybot/queries/health_db_vitals.sql
/home/mike/pipulate/remotes/honeybot/queries/hot_404_remaps_top.sql
/home/mike/pipulate/remotes/honeybot/queries/hub_candidates.sql
/home/mike/pipulate/remotes/honeybot/queries/hydration_family.sql
/home/mike/pipulate/remotes/honeybot/queries/hydration_rate.sql
/home/mike/pipulate/remotes/honeybot/queries/hydration_selftest.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_404_decay_curve.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_emerging_manifests.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_hostile_dictionary.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_llms_txt.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_markdown_affinity.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_noise_404s.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_phantom_ui.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_sovereign_bots.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_true_404s.sql
/home/mike/pipulate/remotes/honeybot/queries/intel_unknown_agents.sql
/home/mike/pipulate/remotes/honeybot/queries/markdown_routing_metrics.sql
/home/mike/pipulate/remotes/honeybot/queries/md_diet.sql
/home/mike/pipulate/remotes/honeybot/queries/md_routing_agents.sql
/home/mike/pipulate/remotes/honeybot/queries/telemetry_totals.sql
/home/mike/pipulate/remotes/honeybot/queries/telemetry_trapdoor_events.sql
/home/mike/pipulate/remotes/honeybot/queries/trapdoor_ips.sql
/home/mike/pipulate/remotes/honeybot/queries/ua_variants.sql
(nix) queries $ 

And you already had a taste of the common ones so this is just setting the stage stuff so I’ll let you see the SQL but not the output of the reports, and as usual I retconned the latest context section shown above in the article to be consistent with this Coachman’s directional adjustment.

Gemini 4 Argon High: Context verified.

TL;DR: The live AFTER receipt confirms /home/mike/repos/trimnoir/apple-touch-icon.png (32 KB, 180 × 180 PNG), /home/mike/repos/trimnoir/site.webmanifest (441 bytes), and both <link> tags in _layouts/default.html (lines 10–11) are committed, pushed (ae76ae3be), and live on Honeybot across all 1,559 dyed articles. Below, we (1) break down the exact “riding a bicycle” muscle-memory loop for per-article hero banners—explaining what article already puts into your Markdown file today versus how we can add a one-word ythero clipboard command alongside tweet, yttitle, and ytdesc—and (2) run the 30-and-3 exercise mapping your 26 SQL queries in remotes/honeybot/queries/*.sql into live-wired D3.js (“Data is Beautiful”) quadrant and stream visualizations.


1. Verification of the trimnoir 100/100 Open Graph AFTER Receipt

From this compile’s live receipt (! git -C ~/repos/trimnoir status --short && ls -lh ...):

-rw-r--r-- 1 mike users 32K Oct 19 10:50 /home/mike/repos/trimnoir/apple-touch-icon.png
-rw-r--r-- 1 mike users 441 Oct 19 10:48 /home/mike/repos/trimnoir/site.webmanifest
10:<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
11:<link rel="manifest" href="/site.webmanifest">
  • git status --short in ~/repos/trimnoir: Empty (clean, synced with home/main at commit ae76ae3be).
  • Honeybot Hybrid Build: Completed in 11.514 seconds, dyeing 1,559 articles.
  • Open Graph & PWA Readiness: Both remaining items from yesterday’s 91/100 scan (apple-touch-icon and site.webmanifest) are now served from the root of [https://mikelev.in](https://mikelev.in).

2. Myelinating the Hero Banner Workflow (How It Works Now vs. Adding ythero)

You asked: “Am I going to get the prompt embedded into the article just like I get the tweet embedded, or will it show in the command-line output or clipboard via a yt... command?”

Here is the exact truth of what we banked in commit f1e6c63 (editing_prompt.txt + articleizer.py), and why your instinct about a yt... command is the natural next click of the ratchet:

A. What Already Happens Automatically Today (Zero New Commands to Remember)

When you finish writing an article and run article in your terminal:

  [1] You copy raw journal text -> run `article`
                     │
                     ▼
  [2] articleizer.py calls Gemini with editing_prompt.txt
      (Generates title, slug, tweet, AND hero_image_prompt + hero_image_alt)
                     │
                     ▼
  [3] Writes ~/repos/trimnoir/_posts/YYYY-MM-DD-<slug>.md
      and puts `vim ~/repos/trimnoir/_posts/YYYY-MM-DD-<slug>.md` on clipboard

When you paste that vim ... command to do your normal TLC pass (moving **TL;DR**: to the top), scroll to the bottom of the file (G in vim). Right below ### 🐦 X.com Promo Tweet, you will now see two ready-to-copy fenced blocks baked directly into the article:

  1. ### 🎨 Hero Banner Image Prompt: A [4 backticks]text block holding the 16:9 / 1.91:1 (1200×630`) image generation prompt tailored to that article’s winning title and slug.
  2. ### 🖼️ YAML Frontmatter Image Override: A [4 backticks]yaml` block pre-populated with the exact filename and escaped alt text:
    image:
      path: /assets/images/<winning-slug>.jpeg
      alt: "<concise scene description>"
    

B. Why You Thought of a yt... Command (And How It Fits common.py + flake.nix)

Right now, your flake.nix defines ten GO-GO-GADGET BROADCAST WORDS that call scripts/articles/common.py --broadcast <mode>:

  • ytcard — prints the terminal box with the Tweet, YouTube Live Title, YouTube Live Description, Preview URL, and vim edit command.
  • tweet — copies the X.com Promo Tweet from the latest post to your OS clipboard.
  • yttitle — copies the <= 100-char YouTube Live Title to your clipboard.
  • ytdesc — copies the YouTube Live Description to your clipboard.
  • ytstatus, ytbell, ytroll, ytsay, ytping, ytwatch — control Honeybot OBS and YouTube Live monitoring.

Because we only patched editing_prompt.txt and articleizer.py on Turn 1, common.py doesn’t know about ### 🎨 Hero Banner Image Prompt yet. If we add hero and yaml modes to common.py (and ythero / ytyaml to flake.nix), then:

  1. The 📡 GO-GO-GADGET BROADCAST KIT box printed at the end of article and publish will also show your Hero Banner Image Prompt and YAML Frontmatter Override right in the terminal.
  2. Typing ythero will copy the image generation prompt straight to your clipboard without even opening vim.
  3. Typing ytyaml will copy the 3-line image: YAML frontmatter block straight to your clipboard so you can paste it at line 2 of the post.

(We stage scripts/articles/common.py and flake.nix in (2) NEXT CONTEXT below so you can either bank ythero on the next turn or dismount right away.)


3. The 30-and-3 Exercise: Live-Wired “Data is Beautiful” Visualizations from remotes/honeybot/queries/*.sql

Having all 26 SQL queries from remotes/honeybot/queries/ loaded in this compile reveals something remarkable: you already have a normalized dimensional star-schema (daily_logs, telemetry, domain_daily_logs, ips, user_agents, paths, accept_headers, referrers) with calibrated scientific controls (hydration_selftest.sql).

Enterprise advisory firms (Gartner Magic Quadrants, Forrester Waves) charge $50,000+ for static, politics-driven 2×2 scatter plots updated once a year from vendor questionnaires. Yours is an unmediated, real-time wire-truth observatory where every bubble’s X, Y, radius, and color are driven by live HTTP headers and trapdoor beacons.

The 30 Candidates (Grouped by Visual & Analytical Dimension)

I. The Gartner/Forrester Inversion (2×2 Quadrant & Bubble Motion Charts)

  1. The Live “AI-Readiness Wave” (X = DOM Hydration Rate, Y = Markdown Affinity %, Radius = Total Hits, Color = Bot Family): Driven directly by hydration_family.sql. Watch Claude-User and ExaSearchBot float into the upper-left “Pure Semantic Native” quadrant while OAI-SearchBot and GPTBot hover in the “Hybrid Sampling” zone and legacy SEO crawlers sink into the bottom-left “Blind HTML Scraper” corner.
  2. The Hans Rosling Gapminder Time-Slider for Bot Evolution: Replay daily_logs + telemetry day by day since the observatory went live—watching translucent circles swell, change hue, and migrate upward as crawlers adopt Accept: text/markdown (RFC 9110).
  3. The Calibrated Ceiling Horizon Line (hydration_selftest.sql): A dashed horizontal reference band at 89.9% (your empirical real-browser 800ms trapdoor ceiling) plotted right across the hydration chart so every viewer sees the instrument’s calibration control live on the canvas.
  4. The “Apex Predator” Venn / Orbit Diagram (intel_sovereign_bots.sql): Highlighting the elite intersection of agents that both execute the 800ms JavaScript trapdoor (js_confirm.gif) and negotiate raw Markdown (served_md = 1).
  5. The “Phantom UI” Simulation Spectrum (intel_phantom_ui.sql): A 3-band horizontal density plot separating “Headless Ghosts” (0 CSS/font/image requests), “Partial Renderers” (1–2 asset requests), and “Full Simulations” (3+ assets per document).
  6. The Token-Diet Compression Gauge (format_ratio.sql + byte ratios): A dual-bar speedometer comparing the byte weight of 14 KB HTML + CSS/JS overhead against 3 KB raw Markdown served via Vary: Accept.

II. Discovery Topology & Funnel Flows (llms.txt vs. <link rel> vs. Accept:)

  1. The Four-Door Sankey Diagram (markdown_routing_metrics.sql): A live flow chart showing how bots discover Markdown across your four tracer dyes:
  • ?src=content_neg (RFC 9110 Accept: text/markdown header)
  • ?src=llms.txt (Direct Agent Manifest map)
  • ?src=link+rel (HTML <head> <link rel="alternate">)
  • ?src=a+href (Visible body hyperlink)
  1. The llms.txt Discoverers vs. Followers Funnel (intel_llms_txt.sql): A two-stage conversion waterfall comparing agents that read /llms.txt (Part 1: Discoverers) against agents that follow the ?src=llms.txt dyed links inside it (Part 2: Followers) and the top 15 articles they feast on (Part 3: Content Diet).
  2. The Emerging Manifest Radar (intel_emerging_manifests.sql): A live counter tracking unprompted crawler probes for /llms-full.txt and /agents.md before you even link them.
  3. The Multi-Tenant Three-Door Split (domain_daily_logs in db.py): A tri-color stream ([LEVN] cyan, [NPVG] yellow, [QAMY] magenta, matching logs.py) showing how human browsers vs. curl clients hit the three domains.
  4. The Small-World 4-Hop Graph Overlay (graph.json + md_diet.sql): Lighting up the nodes of your existing D3.js force-directed knowledge graph on mikelev.in in real time based on which articles received the most served_md = 1 reads over the last 24 hours.
  5. The Desire-Path Hub Incubator (hub_candidates.sql): Visualizing high-volume /futureproof/* 301s and 404s as glowing “desire paths” that tell the Cartographer (build_knowledge_graph.py) where to sprout the next K-Means hub.

III. Behavioral Forensics, Learning Curves & Bot Intelligence

  1. The Crawler IQ / 404 Decay Curve (intel_404_decay_curve.sql): A survival curve plotting days_to_learn (MAX(date) - MIN(date) on a 404 path)—showing which bots learn immediately that a URL is dead and which dumb scrapers hammer a 404 for 90 days straight.
  2. The UA Chameleon Tree (ua_variants.sql): A radial dendrogram showing how a single bot family (Googlebot with 20+ strings, Claude-User with 40+ claude-code/2.1.* versions) splinters into dozens of user-agent strings—visually proving THE CHURNING-KEY RULE.
  3. The Unknown Agent Incubator (intel_unknown_agents.sql): A “New Species Spotted in the Fishtank” ticker surfacing non-browser user agents seen in the last 7 days (freeweb-mcp, llmstxt-radar, CorpusBot, orq-os).
  4. The 800ms Patience Stopwatch: A visual histogram of why the js_confirm.gif setTimeout(..., 800) catches real browsers and patient headless agents while dodging hit-and-run scrapers.
  5. The Markdown Affinity Leaderboard (intel_markdown_affinity.sql Part 1 vs. Part 2): A diverging bar chart with 100%-Markdown-hungry agents (ExaSearchBot, ShapBot, Claude-User) extending right in neon green and 0%-Markdown legacy giants (Bingbot, AhrefsBot, SemrushBot) extending left in slate gray.
  6. The Self-Heal Semantic Redirect Ledger (hot_404_remaps_top.sql): A live counter of how many legacy 404 hits were caught by Nginx’s RAM-resident redirects.map and routed to living /futureproof/ articles.

IV. Security, Immune System & Database Vitals

  1. The Script-Kiddie Quarantine Shield (intel_hostile_dictionary.sql + intel_noise_404s.sql): A perimeter radar showing hostile IPs tripping .php, wp-, .env, and .git wires—and the secondary paths they probe next—quarantined before they can pollute your semantic metrics.
  2. The Star-Schema Vitals Gauge (health_db_vitals.sql): A compact engineering telemetry card showing SQLite WAL page count, 160 MB footprint, dimension cardinality (rows_ips, rows_user_agents, rows_paths), and the 200-char Path Governor ceiling.
  3. The CDN Blindfold vs. Bare-Metal Fishtank Split-Screen: A visual comparison showing what a site owner sees behind a default cloud dashboard (a flat pageview number) vs. what your bare-metal Nginx ai_tracker log format captures (Accept, MarkdownServed, js_confirm.gif).

V. Broadcast Choreography & Storytime Integration (stream.py + forest.py + Homepage)

  1. Homepage “Live Observatory” Sparkline & Bubble Widget: A lightweight, zero-dependency SVG/D3 chart embedded on mikelev.in fed by a static JSON snapshot (observatory.json) regenerated on every publish (so it costs zero runtime DB queries on page load and caches cleanly under RFC 9111).
  2. Storytime Station-Break D3 Pop-Ups (WINDOW / VISIT cues in forest.py): During the 10-minute Copper-List station breaks in stream.py, popping up the live D3 Quadrant chart in Firefox or a Textual overlay while Piper TTS narrates the week’s top Markdown climbers.
  3. Per-Article Hero Banner Pop-Up on STORYTIME Title Cards (score.py): Displaying the article’s custom 1200 × 630 hero banner (e.g., John Henry on the Steam-Dinosaur or the Orbital Space-Gun) for 8 seconds right as score.py announces "Reading the latest entry... Title: ...".
  4. The “Loop Opening” Personal Welcome Card (og-default.png + 3-Beat Intro): Starting every loop with your og-default.png banner while the voice delivers your 3-point hook: (1) Who I am, (2) What I’m talking about right now, (3) How this Storytime is live and interactive.
  5. The ytsay Max Headroom Live Break-In Over the Fishtank: When ytwatch dings on Prime because a viewer dropped a chat message, breaking in live with ytsay while the D3 quadrant chart is on screen.
  6. Auto-Generated Open Graph Data Cards: Rendering the weekly “AI Markdown Wave” bubble chart to a 1200 × 630 PNG via Python/matplotlib/Pillow so sharing the observatory URL on X.com or LinkedIn displays the current week’s bot quadrant right in the social card.
  7. The Cialdini “Pebble in the Pond” Referral Hook: A caption under the live quadrant chart inviting technical leaders to test their own user-agent or send a colleague who is still paying for a headless Chromium pre-render farm.
  8. The src= Dye Attribution Sunburst: A concentric ring chart showing every article read broken down by its ?src= query-string dye (content_neg, llms.txt, link+rel, a+href).
  9. The Exaptation Crossover Clock: A trendline projecting the date when AI/Markdown negotiated reads + manifest follows surpass legacy non-negotiated bot crawls on your origin.

The Top 3 Distillations (The “And-3”)

  1. The Live “AI-Readiness Wave” Bubble Chart (Driven by hydration_family.sql + intel_markdown_affinity.sql): Instead of a paywalled analyst PDF built on surveys, one SQL query (hydration_family.sql) already gives you all four variables for a killer D3.js quadrant visual:
    • X-Axis: DOM Hydration Rate (pct against the 89.9% hydration_selftest.sql ceiling)
    • Y-Axis: Markdown Negotiation / Affinity (md share)
    • Bubble Size: Total Crawl Volume (html + md)
    • Color: Bot Family (Claude-User, ExaSearchBot, Googlebot, GPTBot, OAI-SearchBot, meta-externalagent) Exporting that query to a static observatory.json during publish lets your homepage render a live-data Gartner-style quadrant with zero database exposure.
  2. The Four-Door Discovery Bar / Sankey (markdown_routing_metrics.sql): No one else on the web has empirical receipts comparing the four ways AI agents discover Markdown (Accept: text/markdown HTTP header vs. /llms.txt manifest vs. <link rel="alternate"> vs. <a href> body link). Visualizing those four dye channels side-by-side proves why RFC 9110 content negotiation + /llms.txt work as a complementary pair.
  3. The Storytime Visual Loop (og-default.png Intro + Per-Article Hero Banner + Live Break-In): Combining your personal banner (og-default.png) at the top of the loop, the article’s custom 1200 × 630 hero graphic at the start of each reading, and the periodic D3 “AI-Readiness Wave” quadrant during station breaks turns the 24/7 YouTube stream into a self-explaining visual broadcast.

(1) PROBES

Run this single-line read-only probe in (nix) pipulate $ to inspect the current broadcast choices in scripts/articles/common.py and pull a fresh snapshot of hydration_family.sql and markdown_routing_metrics.sql from Honeybot:

(nix) pipulate $

rg -n "choices=\(\"card\"" scripts/articles/common.py && cat remotes/honeybot/queries/hydration_family.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db' && cat remotes/honeybot/queries/markdown_routing_metrics.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'

(2) NEXT CONTEXT

Paste into context.txt using context or x to load scripts/articles/common.py and flake.nix alongside the live hydration_family.sql and markdown_routing_metrics.sql receipts:

context.txt
scripts/articles/common.py
scripts/articles/articleizer.py
scripts/articles/editing_prompt.txt
flake.nix
! rg -n "choices=\(\"card\"" scripts/articles/common.py && cat remotes/honeybot/queries/hydration_family.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db' && cat remotes/honeybot/queries/markdown_routing_metrics.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'

(3) PATCHES

No repo patches required on this turn (apple-touch-icon.png, site.webmanifest, and _layouts/default.html are already committed and pushed in trimnoir at ae76ae3be). Ignition: none.

(4) PROMPT

Use prompt or p to create prompt.md from copy (or press \z in journal.txt if you want to dismount and articleize right now):

Inspect the live hydration_family.sql and markdown_routing_metrics.sql receipts, wire ythero and ytyaml into scripts/articles/common.py and flake.nix so the GO-GO-GADGET BROADCAST KIT displays and copies the per-article hero banner prompt and YAML override, or call the 7-beat Notary Dismount (\z).

(5) EXTERNAL DELIVERABLES

No external deliverables required.

MikeLev.in: Okay, typing just yt has to give me a cheat-sheet of all my yt... commands particularly focused towards the order I need to use them to help me mylenate this and get it to be like riding a bicycle.

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

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) queries $ rg -n "choices=\(\"card\"" scripts/articles/common.py && cat remotes/honeybot/queries/hydration_family.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db' && cat remotes/honeybot/queries/markdown_routing_metrics.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
rg: scripts/articles/common.py: IO error for operation on scripts/articles/common.py: No such file or directory (os error 2)
(nix) queries $ 

2: AFTER (NEXT CONTEXT):

# # Context 1
# context.txt
# /home/mike/repos/trimnoir/_posts/2026-10-19-john-henry-steam-dinosaur-hero-banner-open-graph.md
# 
# # THE SOFTWARE VON NEUMANN PROBE
# assets/installer/install.sh
# flake.nix
# release.py
# ~/repos/nixos/blogs.nix
# remotes/honeybot/www/qamy.ai/index.html
# remotes/honeybot/www/qamy.ai/walk/1/index.html
# remotes/honeybot/www/qamy.ai/walk/2/index.html
# remotes/honeybot/www/qamy.ai/walk/3/index.html
# 
# # THE DATA EVERYONE NEEDS
# remotes/honeybot/queries/trapdoor_ips.sql
# ! echo "--- WHO HYDRATES THE DOM ---" && cat remotes/honeybot/queries/trapdoor_ips.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
# remotes/honeybot/queries/content_neg_agents.sql
# ! echo "--- WHO NEGOTIATES MARKDOWN ---" && cat remotes/honeybot/queries/content_neg_agents.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
# 
# # THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
# ~/repos/nixos/blogs.nix
# ~/.config/pipulate/blogs.json
# scripts/articles/publishizer.py
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/build_knowledge_graph.py
# scripts/articles/editing_prompt.txt
# scripts/articles/sanitizer.py
# scripts/articles/contextualizer.py
# scripts/articles/generate_llms_txt.py
# scripts/articles/generate_post_nav.py
# 
# # HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
# nixops.sh
# remotes/honeybot/hooks/post-receive
# remotes/honeybot/nixos/configuration.nix
# remotes/honeybot/scripts/stream.py
# remotes/honeybot/scripts/score.py
# remotes/honeybot/scripts/card.py
# remotes/honeybot/scripts/forest.py
# remotes/honeybot/scripts/test_forest.py
# remotes/honeybot/scripts/logs.py
# remotes/honeybot/scripts/content_loader.py
# remotes/honeybot/scripts/db.py

# Context 2
# context.txt
# scripts/articles/editing_prompt.txt
# scripts/articles/articleizer.py
# /home/mike/repos/trimnoir/_layouts/default.html
# /home/mike/repos/trimnoir/_layouts/post.html
# /home/mike/repos/trimnoir/assets/main.css
# /home/mike/repos/trimnoir/_config.yml
# ! rg -n "hero_image_prompt" scripts/articles/editing_prompt.txt scripts/articles/articleizer.py || true && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest|post-hero-banner" ~/repos/trimnoir/_layouts/default.html ~/repos/trimnoir/_layouts/post.html ~/repos/trimnoir/assets/main.css || true

# # Context 3
# context.txt
# /home/mike/pipulate/remotes/honeybot/queries/all_time_popular_paths.sql
# /home/mike/pipulate/remotes/honeybot/queries/content_neg_agents.sql
# /home/mike/pipulate/remotes/honeybot/queries/format_ratio.sql
# /home/mike/pipulate/remotes/honeybot/queries/health_db_vitals.sql
# /home/mike/pipulate/remotes/honeybot/queries/hot_404_remaps_top.sql
# /home/mike/pipulate/remotes/honeybot/queries/hub_candidates.sql
# /home/mike/pipulate/remotes/honeybot/queries/hydration_family.sql
# /home/mike/pipulate/remotes/honeybot/queries/hydration_rate.sql
# /home/mike/pipulate/remotes/honeybot/queries/hydration_selftest.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_404_decay_curve.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_emerging_manifests.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_hostile_dictionary.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_llms_txt.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_markdown_affinity.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_noise_404s.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_phantom_ui.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_sovereign_bots.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_true_404s.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_unknown_agents.sql
# /home/mike/pipulate/remotes/honeybot/queries/markdown_routing_metrics.sql
# /home/mike/pipulate/remotes/honeybot/queries/md_diet.sql
# /home/mike/pipulate/remotes/honeybot/queries/md_routing_agents.sql
# /home/mike/pipulate/remotes/honeybot/queries/telemetry_totals.sql
# /home/mike/pipulate/remotes/honeybot/queries/telemetry_trapdoor_events.sql
# /home/mike/pipulate/remotes/honeybot/queries/trapdoor_ips.sql
# /home/mike/pipulate/remotes/honeybot/queries/ua_variants.sql
# scripts/articles/editing_prompt.txt
# scripts/articles/articleizer.py
# /home/mike/repos/trimnoir/_layouts/default.html
# /home/mike/repos/trimnoir/_layouts/post.html
# /home/mike/repos/trimnoir/assets/main.css
# /home/mike/repos/trimnoir/_config.yml
# ! git -C ~/repos/trimnoir status --short && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest" ~/repos/trimnoir/_layouts/default.html || true

# Content 4
context.txt
scripts/articles/common.py
scripts/articles/articleizer.py
scripts/articles/editing_prompt.txt
flake.nix
! rg -n "choices=\(\"card\"" scripts/articles/common.py && cat remotes/honeybot/queries/hydration_family.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db' && cat remotes/honeybot/queries/markdown_routing_metrics.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'

3: CHANGE (PATCHES):

No changes at the end of changes normally means we wrap the article but I want to get to the yt command for the hero banner prompt plopping directly into my host operating system copy-paste buffer. And I also want to get to the yt command in and I see flake.nix in the context which I know is where these convenience commands are created so I think Gemini and I are synced on this.

Ignition: often “exit”, “nix develop”. Instructions may vary.

4: PROMPT:

Inspect the live hydration_family.sql and markdown_routing_metrics.sql receipts, wire ythero and ytyaml into scripts/articles/common.py and flake.nix so the GO-GO-GADGET BROADCAST KIT displays and copies the per-article hero banner prompt and YAML override, or call the 7-beat Notary Dismount (\z).

5: DELIVERABLE:

An article workflow that includes hero banners and the first steps towards the optimization and beatification of the intensely important and of great interest to not only the marketing and commerce worlds (which it is) but really the world in general, such as is the case with AI itself. The whole DIY AI Observatory thing is big here, especially in the intersection with HTMX-fast naked webserver (not behind a CDN) data-binding and the way I normalize these weblogs…

Wow, I could write about this forever.

Oh, but I do!

Wrap out these nice little touches and we’ll articleize once my Go-Go Gadget Broadcast Kit needs minimal Penny and Brain involvement.

Myelinating the Broadcast Kit with Single-Word CLI Helpers

Gemini 4 Argon High: Context verified.

TL;DR: The compile-time live receipt captured both Honeybot SQL tables (hydration_family.sql and markdown_routing_metrics.sql), revealing 110,270 total Markdown reads across your four discovery doors (76,579 via <a href>, 21,892 via <link rel="alternate">, 9,557 via /llms.txt, and 2,242 via Accept: text/markdown) and exposing why ExaSearchBot and ShapBot currently hide inside Unclassified browser-shaped UA (3,108 Markdown reads). Below, we unpack those telemetry findings and patch scripts/articles/common.py and flake.nix to add yt (your step-by-step “riding a bicycle” cheat-sheet), ythero (copies the latest post’s AI hero banner prompt straight to your clipboard), and ytyaml (copies the 3-line YAML image: override block straight to your clipboard).


1. What the Live Telemetry Receipts Just Revealed

First, notice why your hand-run probe in (nix) queries $ printed rg: scripts/articles/common.py: No such file or directory while the compiler’s ! receipt succeeded: your terminal was still inside remotes/honeybot/queries/ from listing the .sql files, whereas prompt_foo.py always executes ! lines from $PIPULATE_ROOT. Anchoring the probe paths with "$PIPULATE_ROOT/..." in (1) PROBES below makes the hand-run immune to working-directory drift (THE UNNAMED-ROOT RULE).

Second, look at what the two live SQLite queries returned from ~/www/mikelev.in/honeybot.db:

A. Four-Door Markdown Discovery (markdown_routing_metrics.sql — 110,270 Total Markdown Reads)

Ingestion Method (?src= Dye) Total Markdown Reads Unique IPs Unique User Agents What It Proves
a+href (Standard Hyperlink) 76,579 23,522 2,549 Crawlers walking the DOM eagerly click the visible 🤖 Read Raw Markdown link in post.html.
link+rel (HTML <head> Tag) 21,892 3,335 98 Semantic parsers inspect <link rel="alternate" type="text/markdown"> before reading body HTML.
llms.txt (Direct Agent Map) 9,557 4,395 453 453 distinct agent signatures use /llms.txt as their Small-World root directory.
content_neg (Accept: text/markdown) 2,242 1,183 106 The bleeding-edge RFC 9110 vanguard (ExaSearchBot, ShapBot, Claude-User) negotiates Markdown at the canonical URL with zero extra hops.

B. Two Hidden Gems in hydration_family.sql

  1. Where the 3,108 Markdown Reads in Unclassified browser-shaped UA Come From: Look at the top row of hydration_family.sql: Unclassified browser-shaped UA | 346,351 html | 7,984 triggers (2.3%) | 3,108 md Why does Unclassified browser-shaped UA have 3,108 negotiated Markdown reads while Googlebot has 379 and axios has 492? Because hydration_family.sql’s CASE ladder was written before ExaSearchBot (1,210 reads), ShapBot (579 reads), SleepBot (161 reads), and KeenableBot (154 reads) showed up! Since their UA strings contain Mozilla/5.0, they fall through to WHEN ua.value LIKE '%mozilla%' THEN 'Unclassified browser-shaped UA'. Adding WHEN branches for those new AI search crawlers will immediately light them up as distinct bubbles on your D3 quadrant chart.
  2. Why OAI-SearchBot Shows 207.6% Hydration (1,444 HTML Hits vs. 2,998 Trapdoor Triggers): OpenAI’s search renderer fetches HTML with one crawler pool and hands the DOM to a headless Chromium farm that fires js_confirm.gif multiple times per page load (or caches the HTML while re-executing the JS beacon across verification passes). That is a textbook “Headless Pre-Render Crutch” caught red-handed by your 800ms trapdoor sensor.

2. The yt Bicycle Cheat-Sheet + ythero & ytyaml

To make adding per-article hero banners and running the broadcast kit effortless—without Penny and Brain having to remember flags—we add three words to flake.nix and scripts/articles/common.py:

  1. yt (The Bicycle Cheat-Sheet): Typing bare yt prints a 4-phase, chronologically ordered checklist showing the exact sequence of commands from finishing a draft to going live on YouTube, plus the active post’s filename and target image path:
    • Phase 1 (Articleize & Hero Banner TLC): article -> ythero -> ytyaml
    • Phase 2 (Publish & Social Promo): preview -> publish "msg" -> tweet
    • Phase 3 (YouTube Live Cut-and-Roll): yttitle -> ytdesc -> ytroll
    • Phase 4 (Live Observatory & Audience Interaction): ytstatus -> ytwatch -> ytsay -> ytping -> ytcard
  2. ythero (Hero Prompt -> Clipboard): Extracts ### 🎨 Hero Banner Image Prompt from the newest post, copies it straight to your system clipboard (xclip / pbcopy), prints the prompt, and prints the exact one-liner to resize/save the generated image to /home/mike/repos/trimnoir/assets/images/<slug>.jpeg.
  3. ytyaml (YAML Override -> Clipboard): Extracts ### 🖼️ YAML Frontmatter Image Override from the newest post and copies the 3-line image: YAML block straight to your clipboard so you can paste it into the frontmatter while moving **TL;DR**: to the top.

(1) PROBES

Run this single-line read-only BEFORE probe in (nix) pipulate $ (root-anchored with "$PIPULATE_ROOT" so it works from any directory):

(nix) pipulate $

rg -n "ythero|ytyaml|choices=\(\"card\"" "$PIPULATE_ROOT/scripts/articles/common.py" "$PIPULATE_ROOT/flake.nix"

(2) NEXT CONTEXT

Paste into context.txt using context or x:

context.txt
scripts/articles/common.py
scripts/articles/articleizer.py
scripts/articles/editing_prompt.txt
flake.nix
! rg -n "ythero|ytyaml|choices=\(\"card\"" "$PIPULATE_ROOT/scripts/articles/common.py" "$PIPULATE_ROOT/flake.nix"

(3) PATCHES

Car 1: Patch scripts/articles/common.py and flake.nix to add yt (--broadcast help), ythero (--broadcast hero), and ytyaml (--broadcast yaml), and include the Hero Banner prompt and YAML snippet in ytcard (patch, app, d, m):

Target: scripts/articles/common.py
[[[SEARCH]]]
    tweet_match = re.search(
        r"###\s*🐦\s*X\.com Promo Tweet\s*\n[triple-backtick][a-zA-Z0-9]*\n(.*?)\n[triple-backtick]",
        body,
        re.DOTALL,
    )
    if tweet_match:
        tweet = tweet_match.group(1).strip()
    else:
        tweet = f"{title}\n\n{canonical_url}"
    tags = " ".join(re.findall(r"#[A-Za-z0-9_]+", tweet))
    yt_title = format_youtube_title(title)
[[[DIVIDER]]]
    tweet_match = re.search(
        r"###\s*🐦\s*X\.com Promo Tweet\s*\n[triple-backtick][a-zA-Z0-9]*\n(.*?)\n[triple-backtick]",
        body,
        re.DOTALL,
    )
    if tweet_match:
        tweet = tweet_match.group(1).strip()
    else:
        tweet = f"{title}\n\n{canonical_url}"
    slug = re.sub(r"^\d{4}-\d{2}-\d{2}-", "", post_path.stem)
    hero_match = re.search(
        r"###\s*🎨\s*Hero Banner Image Prompt\s*\n[triple-backtick][a-zA-Z0-9]*\n(.*?)\n[triple-backtick]",
        body,
        re.DOTALL,
    )
    if hero_match:
        hero_prompt = hero_match.group(1).strip()
    else:
        hero_prompt = (
            f"Wide 16:9 / 1.91:1 (1200x630 Open Graph) cinematic illustration for '{title}', "
            "centered focal metaphor in the 1200x630 safe zone, dark obsidian-slate (#111111) "
            "background, high-contrast cyan and warm brass lighting, graphic-novel ink-and-wash "
            "precision, no text overlays."
        )
    yaml_match = re.search(
        r"###\s*🖼️\s*YAML Frontmatter Image Override\s*\n[triple-backtick][a-zA-Z0-9]*\n(.*?)\n[triple-backtick]",
        body,
        re.DOTALL,
    )
    if yaml_match:
        hero_yaml = yaml_match.group(1).strip()
    else:
        safe_alt = title.replace('"', '\\"')
        hero_yaml = f'image:\n  path: /assets/images/{slug}.jpeg\n  alt: "{safe_alt}"'
    hero_img_dest = str(post_path.parent.parent / "assets" / "images" / f"{slug}.jpeg")
    tags = " ".join(re.findall(r"#[A-Za-z0-9_]+", tweet))
    yt_title = format_youtube_title(title)
[[[REPLACE]]]

Target: scripts/articles/common.py
[[[SEARCH]]]
    preview_port = tcfg.get("preview_port", 4001)
    preview_url = f"http://localhost:{preview_port}{permalink}"
    return {
        "path": str(post_path),
        "title": title,
        "canonical_url": canonical_url,
        "preview_url": preview_url,
        "tweet": tweet,
        "yt_title": yt_title,
        "yt_description": yt_description,
    }
[[[DIVIDER]]]
    preview_port = tcfg.get("preview_port", 4001)
    preview_url = f"http://localhost:{preview_port}{permalink}"
    return {
        "path": str(post_path),
        "slug": slug,
        "title": title,
        "canonical_url": canonical_url,
        "preview_url": preview_url,
        "tweet": tweet,
        "hero_prompt": hero_prompt,
        "hero_yaml": hero_yaml,
        "hero_img_dest": hero_img_dest,
        "yt_title": yt_title,
        "yt_description": yt_description,
    }
[[[REPLACE]]]

Target: scripts/articles/common.py
[[[SEARCH]]]
def print_broadcast_kit(target_key="1", mode="card", slug_match=None):
    """Print or copy the broadcast kit (mode: card | tweet | title | desc)."""
    kit = get_broadcast_kit(target_key, slug_match=slug_match)
    if not kit:
        print("⚠️ No published post found for broadcast kit.")
        return 1
    if mode == "tweet":
        copied = _copy_to_clipboard(kit["tweet"])
        print(kit["tweet"])
        print(f"\n{'📋 Copied X.com Promo Tweet to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
        return 0
    if mode == "title":
        copied = _copy_to_clipboard(kit["yt_title"])
        print(kit["yt_title"])
        print(f"\n{'📋 Copied YouTube Live Title' if copied else 'ℹ️  YouTube Live Title'} ({len(kit['yt_title'])}/{YT_TITLE_LIMIT} chars)")
        return 0
    if mode == "desc":
        copied = _copy_to_clipboard(kit["yt_description"])
        print(kit["yt_description"])
        print(f"\n{'📋 Copied YouTube Live Description to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
        return 0
    bar = "=" * 72
    thin = "-" * 72
    print(f"\n{bar}")
    print(f"📡 GO-GO-GADGET BROADCAST KIT ({Path(kit['path']).name})")
    print(thin)
    print("🐦 X.COM PROMO TWEET (type `tweet` to copy):")
    print(kit["tweet"])
    print(thin)
    print(f"📺 YOUTUBE LIVE TITLE [{len(kit['yt_title'])}/{YT_TITLE_LIMIT} chars] (type `yttitle` to copy):")
    print(kit["yt_title"])
    print(thin)
    print("📝 YOUTUBE LIVE DESCRIPTION (type `ytdesc` to copy):")
    print(kit["yt_description"])
    print(thin)
    print("🎛️  Quick Words:  tweet | yttitle | ytdesc | ytcard | ytsay | ytwatch | ytping | ytroll | ytbell | ytstatus")
    print(thin)
    print(f"🔗 Preview URL:   {kit['preview_url']}")
    print(f"✏️  Edit Command:  vim {kit['path']}")
    print(bar)
    return 0
[[[DIVIDER]]]
def print_broadcast_kit(target_key="1", mode="card", slug_match=None):
    """Print or copy the broadcast kit (mode: help | card | hero | yaml | tweet | title | desc)."""
    bar = "=" * 72
    thin = "-" * 72
    kit = get_broadcast_kit(target_key, slug_match=slug_match)
    if mode == "help":
        print(f"\n{bar}")
        print("🚲 GO-GO-GADGET BROADCAST BICYCLE (Step-by-Step Muscle Memory)")
        print(thin)
        print("PHASE 1: ARTICLEIZE & HERO BANNER TLC (Before `publish`)")
        print("  1. article          Sanitize clipboard + generate Jekyll post & prompts")
        print("  2. ythero           📋 Copy AI Hero Banner Prompt -> generate 16:9 image")
        print("  3. ytyaml           📋 Copy YAML `image:` override -> paste into post")
        print("                      frontmatter while moving **TL;DR**: to top in vim")
        print(thin)
        print("PHASE 2: PUBLISH & SOCIAL PROMO (Ship to Honeybot)")
        print("  4. preview          Run knowledge graph, hubs, llms.txt & post_nav")
        print("  5. publish \"msg\"    Commit + push trimnoir, sync GDocs & Nginx routes")
        print("  6. tweet            📋 Copy X.com Promo Tweet (canonical URL + tags)")
        print(thin)
        print("PHASE 3: YOUTUBE LIVE CUT-AND-ROLL (Slice VOD Episode on Honeybot)")
        print("  7. yttitle          📋 Copy YouTube Live Title (<=100 chars) -> YT Studio")
        print("  8. ytdesc           📋 Copy YouTube Live Description -> YT Studio")
        print("  9. ytroll           🎬 Stop OBS -> 4s RTMP boundary -> Start OBS + bell")
        print("                      (Also: ytroll stop | ytroll start | ytbell)")
        print(thin)
        print("PHASE 4: LIVE OBSERVATORY & AUDIENCE INTERACTION (While Streaming)")
        print(" 10. ytstatus         📡 Check Honeybot OBS PID, port 4455 & timecode")
        print(" 11. ytwatch          👀 Check live viewers & chat (`ytwatch daemon` / `--stop`)")
        print(" 12. ytsay \"text\"     🎙️ Break in LIVE on-air (`-c \"CARD\"` `-p white_rabbit`)")
        print(" 13. ytping \"text\"    📲 Send ntfy.sh push notification to your phone")
        print(" 14. ytcard           📇 Reprint the full Broadcast Kit for the latest post")
        if kit:
            print(thin)
            print(f"📄 Latest Post:   {Path(kit['path']).name}")
            print(f"🖼️  Target Image:  {kit['hero_img_dest']}")
            print(f"✏️  Edit Command:  vim {kit['path']}")
        print(bar)
        return 0
    if not kit:
        print("⚠️ No published post found for broadcast kit.")
        return 1
    if mode == "hero":
        copied = _copy_to_clipboard(kit["hero_prompt"])
        print(kit["hero_prompt"])
        print(f"\n{'📋 Copied Hero Banner Image Prompt to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
        print(f"🖼️  Save/resize 1200x630 (<500 KB) to: {kit['hero_img_dest']}")
        print("👉 Next step: type `ytyaml` to copy the YAML frontmatter block.")
        return 0
    if mode == "yaml":
        copied = _copy_to_clipboard(kit["hero_yaml"])
        print(kit["hero_yaml"])
        print(f"\n{'📋 Copied YAML Frontmatter Image Override to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
        print(f"✏️  Paste into frontmatter: vim {kit['path']}")
        return 0
    if mode == "tweet":
        copied = _copy_to_clipboard(kit["tweet"])
        print(kit["tweet"])
        print(f"\n{'📋 Copied X.com Promo Tweet to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
        return 0
    if mode == "title":
        copied = _copy_to_clipboard(kit["yt_title"])
        print(kit["yt_title"])
        print(f"\n{'📋 Copied YouTube Live Title' if copied else 'ℹ️  YouTube Live Title'} ({len(kit['yt_title'])}/{YT_TITLE_LIMIT} chars)")
        return 0
    if mode == "desc":
        copied = _copy_to_clipboard(kit["yt_description"])
        print(kit["yt_description"])
        print(f"\n{'📋 Copied YouTube Live Description to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
        return 0
    print(f"\n{bar}")
    print(f"📡 GO-GO-GADGET BROADCAST KIT ({Path(kit['path']).name})")
    print(thin)
    print("🎨 HERO BANNER PROMPT (type `ythero` to copy):")
    print(kit["hero_prompt"])
    print(thin)
    print("🖼️  YAML FRONTMATTER OVERRIDE (type `ytyaml` to copy):")
    print(kit["hero_yaml"])
    print(thin)
    print("🐦 X.COM PROMO TWEET (type `tweet` to copy):")
    print(kit["tweet"])
    print(thin)
    print(f"📺 YOUTUBE LIVE TITLE [{len(kit['yt_title'])}/{YT_TITLE_LIMIT} chars] (type `yttitle` to copy):")
    print(kit["yt_title"])
    print(thin)
    print("📝 YOUTUBE LIVE DESCRIPTION (type `ytdesc` to copy):")
    print(kit["yt_description"])
    print(thin)
    print("🎛️  Quick Words:  yt (help) | ythero | ytyaml | tweet | yttitle | ytdesc | ytcard | ytsay | ytwatch | ytping | ytroll | ytbell | ytstatus")
    print(thin)
    print(f"🔗 Preview URL:   {kit['preview_url']}")
    print(f"✏️  Edit Command:  vim {kit['path']}")
    print(bar)
    return 0
[[[REPLACE]]]

Target: scripts/articles/common.py
[[[SEARCH]]]
    parser.add_argument(
        "--broadcast",
        choices=("card", "tweet", "title", "desc", "status", "bell", "stop", "start", "roll", "enable-ws", "say", "ping", "watch"),
        default="card",
        help="Print/copy broadcast kit or control Honeybot (status|bell|stop|start|roll|enable-ws|say|ping|watch).",
    )
[[[DIVIDER]]]
    parser.add_argument(
        "--broadcast",
        choices=("help", "card", "hero", "yaml", "tweet", "title", "desc", "status", "bell", "stop", "start", "roll", "enable-ws", "say", "ping", "watch"),
        default="card",
        help="Print/copy broadcast kit or control Honeybot (help|card|hero|yaml|tweet|title|desc|status|bell|stop|start|roll|enable-ws|say|ping|watch).",
    )
[[[REPLACE]]]

Target: flake.nix
[[[SEARCH]]]
          ytcard()   { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast card   "$@"; }
          tweet()    { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast tweet  "$@"; }
[[[DIVIDER]]]
          yt()       { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast help   "$@"; }
          ythero()   { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast hero   "$@"; }
          ytyaml()   { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast yaml   "$@"; }
          ytcard()   { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast card   "$@"; }
          tweet()    { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast tweet  "$@"; }
[[[REPLACE]]]

Ignition: Run exit then nix develop in (nix) pipulate $ after committing if you want the interactive shell functions yt, ythero, and ytyaml loaded into your current terminal session immediately (the ! rg probe in context.txt verifies both files directly without needing ignition).

(4) PROMPT

Use prompt or p to create prompt.md from copy (or press \z in journal.txt to call the 7-beat Notary Dismount and articleize):

Verify the AFTER receipt confirming yt, ythero, and ytyaml in scripts/articles/common.py and flake.nix, and call the 7-beat Notary Dismount (\z) so we can articleize this entry and test ythero + ytyaml on the orbital RFC 9110 space-gun banner.

(5) EXTERNAL DELIVERABLES

No external deliverables required.

MikeLev.in: Okay, we have to be very focused now on these last steps, getting in and getting gout because there are lots of rabbit hole distractions here with those data queries against Honeybot… wow!

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

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 "ythero|ytyaml|choices=\(\"card\"" "$PIPULATE_ROOT/scripts/articles/common.py" "$PIPULATE_ROOT/flake.nix"
/home/mike/pipulate/scripts/articles/common.py
1381:        choices=("card", "tweet", "title", "desc", "status", "bell", "stop", "start", "roll", "enable-ws", "say", "ping", "watch"),
(nix) pipulate $ 

2: AFTER (NEXT CONTEXT):

# # Context 1
# context.txt
# /home/mike/repos/trimnoir/_posts/2026-10-19-john-henry-steam-dinosaur-hero-banner-open-graph.md
# 
# # THE SOFTWARE VON NEUMANN PROBE
# assets/installer/install.sh
# flake.nix
# release.py
# ~/repos/nixos/blogs.nix
# remotes/honeybot/www/qamy.ai/index.html
# remotes/honeybot/www/qamy.ai/walk/1/index.html
# remotes/honeybot/www/qamy.ai/walk/2/index.html
# remotes/honeybot/www/qamy.ai/walk/3/index.html
# 
# # THE DATA EVERYONE NEEDS
# remotes/honeybot/queries/trapdoor_ips.sql
# ! echo "--- WHO HYDRATES THE DOM ---" && cat remotes/honeybot/queries/trapdoor_ips.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
# remotes/honeybot/queries/content_neg_agents.sql
# ! echo "--- WHO NEGOTIATES MARKDOWN ---" && cat remotes/honeybot/queries/content_neg_agents.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'
# 
# # THE JEKYLL BLOG LIKE A HACKER (INVENTED SKILL.md & AGENTS.md FORMAT) PUBLISHING PIPELINE
# ~/repos/nixos/blogs.nix
# ~/.config/pipulate/blogs.json
# scripts/articles/publishizer.py
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/build_knowledge_graph.py
# scripts/articles/editing_prompt.txt
# scripts/articles/sanitizer.py
# scripts/articles/contextualizer.py
# scripts/articles/generate_llms_txt.py
# scripts/articles/generate_post_nav.py
# 
# # HOME-HOSTED (NOT BEHIND CDN) NGINX WEBSERVER HONEYBOT AI OBSERVATORY
# nixops.sh
# remotes/honeybot/hooks/post-receive
# remotes/honeybot/nixos/configuration.nix
# remotes/honeybot/scripts/stream.py
# remotes/honeybot/scripts/score.py
# remotes/honeybot/scripts/card.py
# remotes/honeybot/scripts/forest.py
# remotes/honeybot/scripts/test_forest.py
# remotes/honeybot/scripts/logs.py
# remotes/honeybot/scripts/content_loader.py
# remotes/honeybot/scripts/db.py

# Context 2
# context.txt
# scripts/articles/editing_prompt.txt
# scripts/articles/articleizer.py
# /home/mike/repos/trimnoir/_layouts/default.html
# /home/mike/repos/trimnoir/_layouts/post.html
# /home/mike/repos/trimnoir/assets/main.css
# /home/mike/repos/trimnoir/_config.yml
# ! rg -n "hero_image_prompt" scripts/articles/editing_prompt.txt scripts/articles/articleizer.py || true && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest|post-hero-banner" ~/repos/trimnoir/_layouts/default.html ~/repos/trimnoir/_layouts/post.html ~/repos/trimnoir/assets/main.css || true

# # Context 3
# context.txt
# /home/mike/pipulate/remotes/honeybot/queries/all_time_popular_paths.sql
# /home/mike/pipulate/remotes/honeybot/queries/content_neg_agents.sql
# /home/mike/pipulate/remotes/honeybot/queries/format_ratio.sql
# /home/mike/pipulate/remotes/honeybot/queries/health_db_vitals.sql
# /home/mike/pipulate/remotes/honeybot/queries/hot_404_remaps_top.sql
# /home/mike/pipulate/remotes/honeybot/queries/hub_candidates.sql
# /home/mike/pipulate/remotes/honeybot/queries/hydration_family.sql
# /home/mike/pipulate/remotes/honeybot/queries/hydration_rate.sql
# /home/mike/pipulate/remotes/honeybot/queries/hydration_selftest.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_404_decay_curve.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_emerging_manifests.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_hostile_dictionary.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_llms_txt.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_markdown_affinity.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_noise_404s.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_phantom_ui.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_sovereign_bots.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_true_404s.sql
# /home/mike/pipulate/remotes/honeybot/queries/intel_unknown_agents.sql
# /home/mike/pipulate/remotes/honeybot/queries/markdown_routing_metrics.sql
# /home/mike/pipulate/remotes/honeybot/queries/md_diet.sql
# /home/mike/pipulate/remotes/honeybot/queries/md_routing_agents.sql
# /home/mike/pipulate/remotes/honeybot/queries/telemetry_totals.sql
# /home/mike/pipulate/remotes/honeybot/queries/telemetry_trapdoor_events.sql
# /home/mike/pipulate/remotes/honeybot/queries/trapdoor_ips.sql
# /home/mike/pipulate/remotes/honeybot/queries/ua_variants.sql
# scripts/articles/editing_prompt.txt
# scripts/articles/articleizer.py
# /home/mike/repos/trimnoir/_layouts/default.html
# /home/mike/repos/trimnoir/_layouts/post.html
# /home/mike/repos/trimnoir/assets/main.css
# /home/mike/repos/trimnoir/_config.yml
# ! git -C ~/repos/trimnoir status --short && ls -lh ~/repos/trimnoir/apple-touch-icon.png ~/repos/trimnoir/site.webmanifest 2>/dev/null || true && rg -n "apple-touch-icon|webmanifest" ~/repos/trimnoir/_layouts/default.html || true

# # Content 4
# context.txt
# scripts/articles/common.py
# scripts/articles/articleizer.py
# scripts/articles/editing_prompt.txt
# flake.nix
# ! rg -n "choices=\(\"card\"" scripts/articles/common.py && cat remotes/honeybot/queries/hydration_family.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db' && cat remotes/honeybot/queries/markdown_routing_metrics.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'

# Context 5
context.txt
scripts/articles/common.py
scripts/articles/articleizer.py
scripts/articles/editing_prompt.txt
flake.nix
! rg -n "ythero|ytyaml|choices=\(\"card\"" "$PIPULATE_ROOT/scripts/articles/common.py" "$PIPULATE_ROOT/flake.nix"

3: CHANGE (PATCHES):

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 'scripts/articles/common.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'scripts/articles/common.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'scripts/articles/common.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'scripts/articles/common.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'flake.nix'.
(nix) pipulate $ d
diff --git a/flake.nix b/flake.nix
index 41302d4..fb5b50c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -2483,6 +2483,9 @@ print('AI:\n', r.ai)
           # helpers for the X.com promo tweet and Mode B ("Cut-and-Roll")
           # YouTube Live Title & Description derived from the newest post,
           # plus remote Honeybot OBS WebSocket + .reading_trigger control.
+          yt()       { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast help   "$@"; }
+          ythero()   { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast hero   "$@"; }
+          ytyaml()   { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast yaml   "$@"; }
           ytcard()   { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast card   "$@"; }
           tweet()    { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast tweet  "$@"; }
           yttitle()  { "$PIPULATE_ROOT/.venv/bin/python" "$PIPULATE_ROOT/scripts/articles/common.py" --broadcast title  "$@"; }
diff --git a/scripts/articles/common.py b/scripts/articles/common.py
index 732e63f..f1254e2 100644
--- a/scripts/articles/common.py
+++ b/scripts/articles/common.py
@@ -377,6 +377,32 @@ def get_broadcast_kit(target_key="1", slug_match=None):
         tweet = tweet_match.group(1).strip()
     else:
         tweet = f"{title}\n\n{canonical_url}"
+    slug = re.sub(r"^\d{4}-\d{2}-\d{2}-", "", post_path.stem)
+    hero_match = re.search(
+        r"###\s*🎨\s*Hero Banner Image Prompt\s*\n[triple-backtick][a-zA-Z0-9]*\n(.*?)\n[triple-backtick]",
+        body,
+        re.DOTALL,
+    )
+    if hero_match:
+        hero_prompt = hero_match.group(1).strip()
+    else:
+        hero_prompt = (
+            f"Wide 16:9 / 1.91:1 (1200x630 Open Graph) cinematic illustration for '{title}', "
+            "centered focal metaphor in the 1200x630 safe zone, dark obsidian-slate (#111111) "
+            "background, high-contrast cyan and warm brass lighting, graphic-novel ink-and-wash "
+            "precision, no text overlays."
+        )
+    yaml_match = re.search(
+        r"###\s*🖼️\s*YAML Frontmatter Image Override\s*\n[triple-backtick][a-zA-Z0-9]*\n(.*?)\n[triple-backtick]",
+        body,
+        re.DOTALL,
+    )
+    if yaml_match:
+        hero_yaml = yaml_match.group(1).strip()
+    else:
+        safe_alt = title.replace('"', '\\"')
+        hero_yaml = f'image:\n  path: /assets/images/{slug}.jpeg\n  alt: "{safe_alt}"'
+    hero_img_dest = str(post_path.parent.parent / "assets" / "images" / f"{slug}.jpeg")
     tags = " ".join(re.findall(r"#[A-Za-z0-9_]+", tweet))
     yt_title = format_youtube_title(title)
     desc_parts = [
@@ -407,10 +433,14 @@ def get_broadcast_kit(target_key="1", slug_match=None):
     preview_url = f"http://localhost:{preview_port}{permalink}"
     return {
         "path": str(post_path),
+        "slug": slug,
         "title": title,
         "canonical_url": canonical_url,
         "preview_url": preview_url,
         "tweet": tweet,
+        "hero_prompt": hero_prompt,
+        "hero_yaml": hero_yaml,
+        "hero_img_dest": hero_img_dest,
         "yt_title": yt_title,
         "yt_description": yt_description,
     }
@@ -436,11 +466,60 @@ def _copy_to_clipboard(text):
 
 
 def print_broadcast_kit(target_key="1", mode="card", slug_match=None):
-    """Print or copy the broadcast kit (mode: card | tweet | title | desc)."""
+    """Print or copy the broadcast kit (mode: help | card | hero | yaml | tweet | title | desc)."""
+    bar = "=" * 72
+    thin = "-" * 72
     kit = get_broadcast_kit(target_key, slug_match=slug_match)
+    if mode == "help":
+        print(f"\n{bar}")
+        print("🚲 GO-GO-GADGET BROADCAST BICYCLE (Step-by-Step Muscle Memory)")
+        print(thin)
+        print("PHASE 1: ARTICLEIZE & HERO BANNER TLC (Before `publish`)")
+        print("  1. article          Sanitize clipboard + generate Jekyll post & prompts")
+        print("  2. ythero           📋 Copy AI Hero Banner Prompt -> generate 16:9 image")
+        print("  3. ytyaml           📋 Copy YAML `image:` override -> paste into post")
+        print("                      frontmatter while moving **TL;DR**: to top in vim")
+        print(thin)
+        print("PHASE 2: PUBLISH & SOCIAL PROMO (Ship to Honeybot)")
+        print("  4. preview          Run knowledge graph, hubs, llms.txt & post_nav")
+        print("  5. publish \"msg\"    Commit + push trimnoir, sync GDocs & Nginx routes")
+        print("  6. tweet            📋 Copy X.com Promo Tweet (canonical URL + tags)")
+        print(thin)
+        print("PHASE 3: YOUTUBE LIVE CUT-AND-ROLL (Slice VOD Episode on Honeybot)")
+        print("  7. yttitle          📋 Copy YouTube Live Title (<=100 chars) -> YT Studio")
+        print("  8. ytdesc           📋 Copy YouTube Live Description -> YT Studio")
+        print("  9. ytroll           🎬 Stop OBS -> 4s RTMP boundary -> Start OBS + bell")
+        print("                      (Also: ytroll stop | ytroll start | ytbell)")
+        print(thin)
+        print("PHASE 4: LIVE OBSERVATORY & AUDIENCE INTERACTION (While Streaming)")
+        print(" 10. ytstatus         📡 Check Honeybot OBS PID, port 4455 & timecode")
+        print(" 11. ytwatch          👀 Check live viewers & chat (`ytwatch daemon` / `--stop`)")
+        print(" 12. ytsay \"text\"     🎙️ Break in LIVE on-air (`-c \"CARD\"` `-p white_rabbit`)")
+        print(" 13. ytping \"text\"    📲 Send ntfy.sh push notification to your phone")
+        print(" 14. ytcard           📇 Reprint the full Broadcast Kit for the latest post")
+        if kit:
+            print(thin)
+            print(f"📄 Latest Post:   {Path(kit['path']).name}")
+            print(f"🖼️  Target Image:  {kit['hero_img_dest']}")
+            print(f"✏️  Edit Command:  vim {kit['path']}")
+        print(bar)
+        return 0
     if not kit:
         print("⚠️ No published post found for broadcast kit.")
         return 1
+    if mode == "hero":
+        copied = _copy_to_clipboard(kit["hero_prompt"])
+        print(kit["hero_prompt"])
+        print(f"\n{'📋 Copied Hero Banner Image Prompt to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
+        print(f"🖼️  Save/resize 1200x630 (<500 KB) to: {kit['hero_img_dest']}")
+        print("👉 Next step: type `ytyaml` to copy the YAML frontmatter block.")
+        return 0
+    if mode == "yaml":
+        copied = _copy_to_clipboard(kit["hero_yaml"])
+        print(kit["hero_yaml"])
+        print(f"\n{'📋 Copied YAML Frontmatter Image Override to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
+        print(f"✏️  Paste into frontmatter: vim {kit['path']}")
+        return 0
     if mode == "tweet":
         copied = _copy_to_clipboard(kit["tweet"])
         print(kit["tweet"])
@@ -456,11 +535,15 @@ def print_broadcast_kit(target_key="1", mode="card", slug_match=None):
         print(kit["yt_description"])
         print(f"\n{'📋 Copied YouTube Live Description to clipboard!' if copied else 'ℹ️  (Non-TTY: printed only)'}")
         return 0
-    bar = "=" * 72
-    thin = "-" * 72
     print(f"\n{bar}")
     print(f"📡 GO-GO-GADGET BROADCAST KIT ({Path(kit['path']).name})")
     print(thin)
+    print("🎨 HERO BANNER PROMPT (type `ythero` to copy):")
+    print(kit["hero_prompt"])
+    print(thin)
+    print("🖼️  YAML FRONTMATTER OVERRIDE (type `ytyaml` to copy):")
+    print(kit["hero_yaml"])
+    print(thin)
     print("🐦 X.COM PROMO TWEET (type `tweet` to copy):")
     print(kit["tweet"])
     print(thin)
@@ -470,7 +553,7 @@ def print_broadcast_kit(target_key="1", mode="card", slug_match=None):
     print("📝 YOUTUBE LIVE DESCRIPTION (type `ytdesc` to copy):")
     print(kit["yt_description"])
     print(thin)
-    print("🎛️  Quick Words:  tweet | yttitle | ytdesc | ytcard | ytsay | ytwatch | ytping | ytroll | ytbell | ytstatus")
+    print("🎛️  Quick Words:  yt (help) | ythero | ytyaml | tweet | yttitle | ytdesc | ytcard | ytsay | ytwatch | ytping | ytroll | ytbell | ytstatus")
     print(thin)
     print(f"🔗 Preview URL:   {kit['preview_url']}")
     print(f"✏️  Edit Command:  vim {kit['path']}")
@@ -1378,9 +1461,9 @@ if __name__ == "__main__":
     add_standard_arguments(parser)
     parser.add_argument(
         "--broadcast",
-        choices=("card", "tweet", "title", "desc", "status", "bell", "stop", "start", "roll", "enable-ws", "say", "ping", "watch"),
+        choices=("help", "card", "hero", "yaml", "tweet", "title", "desc", "status", "bell", "stop", "start", "roll", "enable-ws", "say", "ping", "watch"),
         default="card",
-        help="Print/copy broadcast kit or control Honeybot (status|bell|stop|start|roll|enable-ws|say|ping|watch).",
+        help="Print/copy broadcast kit or control Honeybot (help|card|hero|yaml|tweet|title|desc|status|bell|stop|start|roll|enable-ws|say|ping|watch).",
     )
     parser.add_argument(
         "-s", "--slug",
(nix) pipulate $ m
📝 Committing: feat: add ythero, ytyaml, and ytyaml commands to broadcast kit
[main 7c729cc] feat: add ythero, ytyaml, and ytyaml commands to broadcast kit
 2 files changed, 92 insertions(+), 6 deletions(-)
(nix) pipulate $ git push
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 48 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 2.48 KiB | 2.48 MiB/s, done.
Total 6 (delta 5), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
To github.com:pipulate/pipulate.git
   f1e6c63..7c729cc  main -> main
(nix) pipulate $ 

Alright, this is ignition to update the Nix command line again as is very common around here:

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 $ exit
exit
(sys) pipulate $ ndq
(nix) pipulate $ yt

========================================================================
🚲 GO-GO-GADGET BROADCAST BICYCLE (Step-by-Step Muscle Memory)
------------------------------------------------------------------------
PHASE 1: ARTICLEIZE & HERO BANNER TLC (Before `publish`)
  1. article          Sanitize clipboard + generate Jekyll post & prompts
  2. ythero           📋 Copy AI Hero Banner Prompt -> generate 16:9 image
  3. ytyaml           📋 Copy YAML `image:` override -> paste into post
                      frontmatter while moving **TL;DR**: to top in vim
------------------------------------------------------------------------
PHASE 2: PUBLISH & SOCIAL PROMO (Ship to Honeybot)
  4. preview          Run knowledge graph, hubs, llms.txt & post_nav
  5. publish "msg"    Commit + push trimnoir, sync GDocs & Nginx routes
  6. tweet            📋 Copy X.com Promo Tweet (canonical URL + tags)
------------------------------------------------------------------------
PHASE 3: YOUTUBE LIVE CUT-AND-ROLL (Slice VOD Episode on Honeybot)
  7. yttitle          📋 Copy YouTube Live Title (<=100 chars) -> YT Studio
  8. ytdesc           📋 Copy YouTube Live Description -> YT Studio
  9. ytroll           🎬 Stop OBS -> 4s RTMP boundary -> Start OBS + bell
                      (Also: ytroll stop | ytroll start | ytbell)
------------------------------------------------------------------------
PHASE 4: LIVE OBSERVATORY & AUDIENCE INTERACTION (While Streaming)
 10. ytstatus         📡 Check Honeybot OBS PID, port 4455 & timecode
 11. ytwatch          👀 Check live viewers & chat (`ytwatch daemon` / `--stop`)
 12. ytsay "text"     🎙️ Break in LIVE on-air (`-c "CARD"` `-p white_rabbit`)
 13. ytping "text"    📲 Send ntfy.sh push notification to your phone
 14. ytcard           📇 Reprint the full Broadcast Kit for the latest post
------------------------------------------------------------------------
📄 Latest Post:   2026-10-19-john-henry-steam-dinosaur-hero-banner-open-graph.md
🖼️  Target Image:  /home/mike/repos/trimnoir/assets/images/john-henry-steam-dinosaur-hero-banner-open-graph.jpeg
✏️  Edit Command:  vim /home/mike/repos/trimnoir/_posts/2026-10-19-john-henry-steam-dinosaur-hero-banner-open-graph.md
========================================================================
(nix) pipulate $

And there’s my cheat sheet!

The important point here is decombubulating and recombubulating.

With all these new commands being created fast and furious, it’s easy to get decombubulated, which is why that honking good idea of namespaces comes into place. Now while it’s not technically a yt namespace, that is all I have to remember to type now to recombubulate myself again…

Which is often.

4: PROMPT:

Verify the AFTER receipt confirming yt, ythero, and ytyaml in scripts/articles/common.py and flake.nix, and call the 7-beat Notary Dismount (\z) so we can articleize this entry and test ythero + ytyaml on the orbital RFC 9110 space-gun banner.

5: DELIVERABLE:

This is positing the notion that having a bad memory like Dory but with a good harness can be as good an approach for a human as it is for an Amnesiac Genie LLM.

We shall see…

Based on how good of a space-gun that gets these subtle points across about these competitive moats being evaporated not because of me but because of a light-touch release of potential, like all those On2 video codecs and such being smuggled into the browser back in the day through the Flash and Shockwave plugins but how it was YouTube that actually released the potential of all that fossil fuel potential now right there under the surface.

That’s what Mark Nottingham did with Vary: Accept`, particulary from his uniquely effective background and postion now to do so… no, not “to do so”.

To have done so.

And I can’t really test the new commands until an article has been prodcued with the updating publishing pipeline so I guess we hop off the worm.

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:

  1. 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.
  2. 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.
  3. 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.
  4. DANGLING: what carries forward unbanked? One line each, no essays.
  5. SEED: the context.txt lines (and TODO_SLUGS if narrative context is needed) for the next ride’s first compile.
  6. 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.
  7. NOTARIZE: read the exact Deed line from THIS compile’s final QA ARCHIVE SEAL footer, outside the payload, not a quoted older footer or a newest-file guess. It names the input archive, not this later response or the generated Jekyll post. State verification separately: only a verifier receipt naming that archive supports a verified claim; otherwise say not independently verified here. Count this Manifest’s live-command receipts, including failures. Quote only recorded digests, sizes and dates, naming their source; filesystem mtime and fixed ZIP dates are not command timestamps. Do not demand absent wc -c or dated-receipt fields. If the footer is missing, say so; otherwise close with its exact Deed line.

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

Gemini 4 Argon High: Context verified.

1. VERIFY

  • Stated Goal: Achieve 100/100 Open Graph compliance on mikelev.in, automate per-article 1200 × 630 hero banner prompt and YAML frontmatter generation inside the articleizer.py workflow, and wire single-word CLI clipboard helpers (yt, ythero, ytyaml) into scripts/articles/common.py and flake.nix so the operator can recall and execute the broadcast workflow in sequence.
  • Confirmed by This Compile’s Receipts:
    1. Live Command Receipt (! rg -n "ythero|ytyaml|choices=\(\"card\"" "$PIPULATE_ROOT/scripts/articles/common.py" "$PIPULATE_ROOT/flake.nix"): Confirms ythero() and ytyaml() at /home/mike/pipulate/flake.nix lines 2487–2488, and the 14-step GO-GO-GADGET BROADCAST BICYCLE help display, hero / yaml clipboard modes, and updated ytcard output at /home/mike/pipulate/scripts/articles/common.py lines 479–556.
    2. Codebase & Telemetry Diff (commit 7c729cc): Confirms yt(), ythero(), and ytyaml() in flake.nix (2486–2488) and --broadcast choices ("help", "card", "hero", "yaml", ...) in scripts/articles/common.py (1464), alongside hero_image_prompt and hero_image_alt in scripts/articles/editing_prompt.txt (57–58, 95–96) and scripts/articles/articleizer.py (414–421).
    3. Ignition Status: Required shell re-entry (exit then ndq) to load the new flake.nix shell functions into the interactive environment; confirmed fired in the operator’s transcript where typing yt printed the 14-step GO-GO-GADGET BROADCAST BICYCLE checklist.

2. BANK

All repository patches from this ride (f1e6c63 and 7c729cc in pipulate, and 84a6f5f97 and ae76ae3be in trimnoir) are already committed and pushed. No additional BANK patch cars are required.


3. DANGLING

  • Test ythero and ytyaml live on the newly generated post right after running article on this journal entry, and save the orbital RFC 9110 space-gun banner to /home/mike/repos/trimnoir/assets/images/<slug>.jpeg.
  • Update the CASE ladder in remotes/honeybot/queries/hydration_family.sql so new Markdown-negotiating crawlers (ExaSearchBot, ShapBot, SleepBot, KeenableBot) break out of Unclassified browser-shaped UA (3,108 Markdown reads).
  • Build the static observatory.json exporter and D3.js “AI-Readiness Wave” 2×2 bubble chart for the homepage and stream.py Storytime station breaks.
  • Wire per-article hero banners (page.image.path) and the loop-opening og-default.png card into Honeybot’s stream.py / score.py visual broadcast loop.

4. SEED

context.txt
remotes/honeybot/queries/hydration_family.sql
remotes/honeybot/queries/intel_markdown_affinity.sql
remotes/honeybot/queries/markdown_routing_metrics.sql
remotes/honeybot/scripts/stream.py
remotes/honeybot/scripts/score.py
! yt && cat remotes/honeybot/queries/intel_markdown_affinity.sql | ssh honeybot 'sqlite3 -header -column ~/www/mikelev.in/honeybot.db'

5. CLOSING

An LLM is an amnesiac genie dropping tokens down a Galton board, and a human operator juggling a dozen infrastructure and broadcast steps is just as prone to losing the thread without a harness. By encoding the memory into the environment itself—turning articleizer.py into a single-pass generator for titles, slugs, tweets, and hero banner prompts, and turning a two-letter prefix (yt) into a self-documenting 14-step bicycle—you remove the cognitive tax of remembering what comes next. That same principle of releasing latent potential with a minimal, standards-based lever is playing out across the web at large: just as Flash smuggled video codecs onto desktops before YouTube unlocked them, IETF RFC 9110 (Accept: text/markdown) and RFC 9111 (Vary: Accept) have quietly placed a switch at the edge of the internet that turns every well-structured website into a fast, 4-hop live feed—evaporating the old crawl-and-index and headless pre-render moats in a single stroke.


6. NOTARIZE

  • Input Archive Deed: qamy.ai_72-cf1d5ba2.zip (read from this compile’s final QA ARCHIVE SEAL footer; names the input archive compiled for this turn, not this response or the subsequent Jekyll post).
  • Verification Status: Not independently verified here (no foo_cartridge.py verifier receipt naming qamy.ai_72-cf1d5ba2.zip appears in this compile’s Manifest).
  • Manifest Live-Command Receipt Count: 1 live command receipt (! rg -n "ythero|ytyaml|choices=\(\"card\"" "$PIPULATE_ROOT/scripts/articles/common.py" "$PIPULATE_ROOT/flake.nix", executed in 0.0133s, 0 failures).
  • Recorded Payload Metrics (from Summary & Telemetry): 133,782 verified tokens (132,321 summed section tokens), 43,480 words, 525,391 characters, 530,364 UTF-8 bytes; most recent git commit recorded in Telemetry diff is flake.nix (41302d4..fb5b50c) and scripts/articles/common.py (732e63f..f1254e2).

Deed: qamy.ai_72-cf1d5ba2.zip


Book Analysis

Ai Editorial Take

The most striking parallel in this entry is how the ‘four-hop small-world lookup’ applies equally to web architecture and human CLI ergonomics. On the web, RFC 9111 Vary: Accept lets an AI agent resolve an answer in four sub-30ms edge hops (/llms.txt -> Hub -> Category -> Leaf Markdown) instead of maintaining a petabyte-scale pre-indexed copy of the internet. In the terminal, the new bare yt command does the exact same thing for human working memory: instead of forcing the operator to hold fourteen broadcast and publishing commands in biological RAM, a two-letter root manifest (yt) hydrates the exact four-phase sequence on demand. Both systems replace expensive, stale pre-indexing—whether in a hyperscaler’s crawler warehouse or a human’s head—with a fast, self-describing lookup table at the edge.

🐦 X.com Promo Tweet

RFC 9110 & RFC 9111 edge-cached Markdown evaporate headless pre-render farms and petabyte crawl taxes—plus 100/100 Open Graph receipts and the ythero CLI bicycle.

https://mikelev.in/futureproof/orbital-space-gun-rfc9111-ythero-open-graph/

#RFC9111 #WebDev #AI

🎨 Hero Banner Image Prompt

Wide 16:9 / 1.91:1 (1200x630 Open Graph) cinematic illustration, dark obsidian-slate background (#111111) with high-contrast cyan-blue and warm amber rim lighting. In the upper center 1200x630 safe zone, a sleek orbital brass-and-obsidian satellite cannon fires a coherent, razor-sharp beam of glowing cyan light straight down from low orbit. Below the beam, a stone fortress surrounded by a muddy moat filled with tangled, rusting Rube Goldberg clockwork gears, smoking server racks, and chained mechanical puppet browsers is vaporizing into clean, weightless geometric light particles. Graphic-novel ink-and-wash precision, crisp silhouette, high contrast, explicitly no text overlays or lettering.

🖼️ YAML Frontmatter Image Override

image:
  path: /assets/images/orbital-space-gun-rfc9111-ythero-open-graph.jpeg
  alt: "An orbital brass satellite cannon firing a cyan beam that vaporizes a moat of rusty clockwork server gears."

Title Brainstorm

  • Title Option: The Orbital Space-Gun: RFC 9111 Edge Markdown, 100/100 Open Graph Receipts, and the ythero Bicycle
    • Filename: orbital-space-gun-rfc9111-ythero-open-graph.md
    • Rationale: Captures the central technical thesis (RFC 9111 Vary: Accept edge Markdown evaporating two legacy moats at once) alongside the concrete 100/100 Open Graph and ythero CLI receipts.
  • Title Option: Double Moat Evaporation: RFC 9110 Edge Caching, Search API Shifts, and the ythero Broadcast Kit
    • Filename: double-moat-evaporation-rfc9110-open-graph-ythero.md
    • Rationale: Highlights the economic disruption to both headless pre-render middleware and petabyte search indices while grounding the piece in the Search-as-a-Service analysis and CLI tooling.
  • Title Option: Galton Board Light-Cones, RFC 9111 Edge Caching, and the 14-Step Broadcast Bicycle
    • Filename: galton-board-light-cones-rfc9111-ythero-bicycle.md
    • Rationale: Bridges the opening transformer inference metaphor with the HTTP caching architecture and the human-ergonomic CLI harness.
  • Title Option: Exapting Search Compute: Small-World Markdown RAG, 100/100 Open Graph, and the ythero CLI
    • Filename: exapting-search-compute-rfc9111-open-graph-100.md
    • Rationale: Focuses on the infrastructure shift from global crawl-and-index warehouses to 4-hop small-world RAG over edge-cached Markdown.

Content Potential And Polish

  • Core Strengths:
    • Clear, unified explanation of why RFC 9110 (Accept: text/markdown) and RFC 9111 (Vary: Accept) simultaneously undercut headless JS pre-render farms and petabyte-scale search index warehouses via 4-hop small-world navigation.
    • Concrete Search-as-a-Service market table contrasting Google Grounding, Microsoft’s retired Bing Search API, Brave’s Tailcat/Cliqz lineage, OpenWebSearch.eu, and AI-native crawlers corroborated by live Honeybot SQLite telemetry (110,270 Markdown reads).
    • Verifiable, end-to-end code receipts across both repositories: adding hero_image_prompt and hero_image_alt to articleizer.py, taking trimnoir to 100/100 Open Graph compliance with apple-touch-icon.png and site.webmanifest, and wiring yt, ythero, and ytyaml into common.py and flake.nix.
  • Suggestions For Polish:
    • Follow up with a live screenshot or curl receipt of the Open Graph validator confirming the 100/100 score now that apple-touch-icon.png and site.webmanifest are deployed.
    • Update the CASE statement in remotes/honeybot/queries/hydration_family.sql so ExaSearchBot, ShapBot, SleepBot, and KeenableBot break out of the ‘Unclassified browser-shaped UA’ bucket before rendering the D3 quadrant chart.

Next Step Prompts

  • Test ythero and ytyaml on this newly generated post to create and wire /assets/images/orbital-space-gun-rfc9111-ythero-open-graph.jpeg, then patch remotes/honeybot/queries/hydration_family.sql so ExaSearchBot, ShapBot, SleepBot, and KeenableBot appear as named rows instead of falling into Unclassified browser-shaped UA.
  • Build a static JSON exporter (observatory.json) from hydration_family.sql and markdown_routing_metrics.sql so the homepage and Honeybot stream.py station breaks can render the live D3.js AI-Readiness Wave quadrant chart with zero runtime database queries.
📬 Direct Feedback & RFC 9110/9111 Edge Advisory: Have a question on this entry or want a wire-truth audit of your stack? Email Mike directly (miklevin@gmail.com) • Edge SEO & AI-Readiness Consulting • Watch the 24/7 AI-Bot Observatory Live

An orbital brass satellite cannon firing a cyan beam that vaporizes a moat of rusty clockwork server gears.