The Door Names the Folder: Engineering Replayable AI Workflows and Portable Environments

๐Ÿค– Read Raw Markdown โ€ข ๐Ÿ“„ Google Doc (Try: Tools/Audio/Listen to document summary)

Setting the Stage: Context for the Curious Book Reader

Important to know in the Age of AI, this essay explores the delicate mechanics of decoupling a portable subsystem from its product identity. By examining how an automated installer can serve two different default target folders from two distinct web addresses without drifting configuration files, we reveal a practical methodology for building checkable and replayable computing environments. This piece continues our tapestry of articles bridging low-level infrastructure with high-level software ergonomics.

TL;DR: A single shell script installs a reproducible development environment built on the Nix package manager, whose packages live in content-addressed directories and are pinned by a lock file, so one description rebuilds identically on Linux, macOS, or Windows under WSL. The script is served from two web addresses and must install into a different default folder from each: ~/npvg from npvg.org and ~/pipulate from pipulate.com. A script fetched through a pipe cannot learn which address served it, and two copies of the script would drift, so the solution is one file carrying a placeholder that the npvg.org web server rewrites to npvg in the body it sends; pipulate.com sends the file unchanged and the script falls back to pipulate. The script tells the cases apart by comparing the placeholder against the same string spelled as two concatenated halves, which no text substitution can reach. A second edit stopped the installer from naming the application after the folder: only an explicit argument now writes the app-identity file, so a default install from npvg.org yields a folder named npvg containing an application still named Pipulate. Each change was verified by fetching both addresses and evaluating the served default, by confirming that the npvg.org body with its one substitution reversed hashes to the repository file, and by a live install from npvg.org followed by rm -rf npvg. The first half of the article explains, for newcomers, why conventional installations decay and what Nix changes.


Technical Journal Entry Begins

๐Ÿ”— Verified Pipulate Commits:

MikeLev.in: I want:

curl -fsSL https://npvg.org | bash

โ€ฆto install into a folder named npvg relative to where you install from so on most systems, ~/npvg/. Likewise if you happen to be installing from the Pipulate site:

curl -fsSL https://pipulate.com/install.sh | bash

โ€ฆit should have its current behavior defaulting to pipulate or commonly ~/pipulate/. Consequently the uninstall commands for either case are respectively, open a terminal and type:

rm -rf npvg

Or

rm -rf pipulate

I know there are plenty of edge cases where this wonโ€™t be true, but these will be the simplified instructions for most platforms most of the time because their default terminals open to ~/.

Now hereโ€™s the rub. This is a general un-hard-wiring of the Pipulate repo conventional root folder name because the install will just as likely occur from the npvg.org domain (I am thinking much more likely in time) than on the pipulate.com domain. This is part of operation stick bug making Pipulate disappear into something more unobjectionable, industry-wide momentum inevitable, less opinionated, entirely benign and โ€œof courseโ€ this is the way you do things if you want a โ€œwrite once, run anywhereโ€ generic normalized Linux environment on any other host environment, be it macOS, Windows with WSL or some other Unix or Linux host.

Thatโ€™s what NPvg is for, see? normalize.css caught on in the early days of the post-Node so-called fall web stack days. These were the days between jQuery as things like Bootstrap JS from Twitter and Syntactically Awesome Stylesheets (sass) burst onto the scene but before React JS and Vue took over with Single Page Applications (SPAs). Folks would use a combination of jQuery and normalize CSS to create a sort of blank slate that you could build upon so that anything you built looked identical across platforms.

Same thing with the whole down-to-the-metal Infrastructure as Code (IaC) now with the Nix and Guix the writing is on the wall, not for Dockerโ€™s demise but rather for everything that doesnโ€™t actually call for a more Docker and Kubernetes approach using more of a Nix Flake magic cookie approach instead. It just makes so much more sense. Look how easily you can strip away layers of indirection with the one master /nix/store/ layer and how that makes Noahโ€™s Arks of immutable machine-hopping codebases skipped across different infinite mutation machine hardware hosts over time, each of which can crumble under its own system-rot and eventual broken keyboards, cracked screens and genuine hardware obsolete cycles.

Explain a Forever Machine to the nice folks and build it all up from scratch so that even the New-B has some hope of understanding what Iโ€™m talking about. Use as many tokens as you like on exposition. Weโ€™ll get to the implementation regarding the eradication of the word โ€œpipulateโ€ in all regards except for the actual FastHTML app within my particular NPvg subsystem stoke-skipping Noahโ€™s Ark of a tech stack. Pipulate is one thing it has the same way it has JupyterLab and could have N8N, Flatnotes, Trilium or anything else home-hosted you might like to make float with a flake.

Fable 5.1 Extra: Context verified. One live receipt this compile, the rolling pin; no probes ran, so everything below the exposition is a BEFORE waiting to be taken. The two concrete asks are separable and I take them in the order you gave them: first the explanation, built from the floor up, then the folder name, with the census and the design that has to precede the eradication.


The Forever Machine, from the floor

The plain true thing

A program is files in places. That is the whole of it, and everything else in this essay is a consequence. When someone says a program is โ€œinstalled,โ€ they mean its files have been copied into the places the computer looks: an executable somewhere on the search path, a few libraries somewhere the loader checks, some configuration under your home directory. When it โ€œruns,โ€ the operating system opens those files, and the program opens more files (libraries, fonts, certificates, its own settings), and each of those is found by looking in a place.

The Forever Machine, from the floor

An environment is the answer to one question: which files are in which places right now? Your machineโ€™s answer and my machineโ€™s answer differ in thousands of small ways, and every โ€œworks on my machineโ€ in the history of computing is the two answers disagreeing about one of them.

Why machines rot

The places are shared. On a conventional system there is one /usr/bin, one /usr/lib, one set of Python packages per interpreter. Installing something writes into those shared places. Upgrading something overwrites what was there. Two programs that want two versions of the same library cannot both have them, so the second install quietly breaks the first, and you find out a month later when a thing that worked stops working and nothing you touched since seems related.

This is rot. It is not a failure of any one tool; apt, Homebrew, pip, npm all do the same thing, because the shared-places model has been the model since the seventies, and the Filesystem Hierarchy Standard is a description of it. Every mutation is a small bet that nothing else depended on what just changed. Over years the bets compound. The machine becomes a stratum of decisions nobody remembers, and the only reliable fix is a wipe and reinstall, at which point every undocumented decision is gone and you start accumulating a new stratum.

Then the hardware itself gives out. A keyboard dies, a screen cracks, a disk fails, a laptop is old enough that the current OS will not install on it. The machine goes in a drawer, and the working environment on it goes with it, because the environment was never separable from the machine. It was the mutable state of that one box.

Three fixes that were each half right

Virtual machines put a whole operating system in a box. The box is separable from the hardware, which solves the drawer problem, but the box is enormous, it is opaque (a disk image is a snapshot, not a description), and inside the box the shared-places model runs unchanged, so rot continues at the same rate in a smaller room.

Containers, Docker being the one that caught on in 2013, made the box lighter by sharing the host kernel and shipping only the userland as layered filesystem images. That is a real improvement, and for running many isolated services on one host it is still the right shape. But an image is still a snapshot. A Dockerfile that says apt-get install python3 produces a different image every time the upstream repository changes, so the recipe is not reproducible even when the artifact is. And on a Mac there is no Linux kernel to share, so Docker runs a Linux virtual machine underneath and you are back to the heavy box with a lighter box inside it.

Per-language sandboxes (Pythonโ€™s virtualenv, Nodeโ€™s node_modules, Rubyโ€™s bundler) solve the shared-places problem for one languageโ€™s packages and nothing else. Your Python is isolated; your OpenSSL, your git, your curl, your C compiler are still whatever the host happens to have. Configuration management (Ansible, Chef, Puppet) tries to describe a host as a script, but the script runs against a mutable host and cannot know what was there before, so two hosts that ran the same playbook drift apart the first time someone logs in and fixes something by hand.

Each of these got one thing right: separability, lightness, per-project isolation, description-as-text. None of them attacked the root, which is that installing means overwriting.

The Nix move: never overwrite

Nix, from Eelco Dolstraโ€™s 2003 paper and 2006 thesis, changes one rule. Nothing is ever installed into a shared place. Every package is built into its own directory under /nix/store/, and the name of that directory begins with a hash computed from everything that went into the build: the source, the compiler, every library it links, every flag, the build script itself. Change any input and you get a different hash, hence a different directory, hence a different package that coexists with the old one instead of replacing it.

So two versions of one library live side by side forever. A program links to the exact store path it was built against, and no later install can change what that path contains, because the path is a function of the contents. An โ€œenvironmentโ€ stops being the state of shared places and becomes a set of pointers: this shellโ€™s search path points at these store paths and no others. Enter a different environment and the pointers change; the store underneath is untouched. Leave, and nothing you did leaves residue on the host. The nix develop you type to enter this workshop is that: a fresh set of pointers, held only for the life of the shell.

The recipe for a store path is called a derivation, and it is text. The store is the cache of every derivation that has ever been built on this machine or fetched from a public cache. The uncompressed size is the price; the property you buy is that โ€œinstalledโ€ is no longer a verb that can break anything.

The lock file is the genome

A flake is a recipe with its inputs pinned. flake.nix says what the environment contains and how to enter it; flake.lock, generated beside it, records the exact commit of every input the recipe depends on, down to a hash of the inputโ€™s contents. Evaluate the same flake with the same lock on two machines and you get the same store paths, which means the same bytes, which means the same behavior for everything that does not reach outside the store.

The glossary in this compile already has the botanical name for this, and it is the right one. A seed does not breed true: plant an apple pip and you get an apple tree, but not the apple you ate. An orchard reproduces a cultivar by grafting, taking a cutting of the exact tree. An installer that says โ€œgive me the current Pythonโ€ is planting a pip. A lock file is a graft. The article whose receipts sit in this compile has the number: 290 packages on the Linux box, 291 on the Mac, same lock, from curl | bash to a working prompt on two operating systems, and the one-package difference is a platform wheel, not drift.

normalize.css for the operating system

Your analogy is exact, and it is worth saying why. Before 2011 every browser rendered the same HTML slightly differently: different default margins, different font sizing, different form-control chrome. Eric Meyerโ€™s Reset CSS (2007) zeroed everything so you could start from nothing. Nicolas Gallagher and Jonathan Nealโ€™s normalize.css (2011) did something subtler: it kept the useful defaults and corrected only the inconsistencies and bugs, so the baseline was the same everywhere without being empty. Bootstrap shipped it, everyone shipped it, and for a few years (the jQuery-plus-Sass years, before React and Vue moved rendering into JavaScript entirely) it was the first line of every stylesheet. Nobody argued about it. It was simply how you started.

A Nix flake is normalize.css for the userland. It does not replace the hostโ€™s kernel; it corrects the inconsistencies above it. The same git, the same Python 3.12.13, the same curl, the same ripgrep, in the same versions, on the Mac and on Linux and on Windows under WSL, so what you build on top behaves the same on each.

One correction the New-B should hear before someone else says it less kindly: on a Mac this is not Linux. Nix on macOS builds macOS binaries; the normalized thing is the toolset and its versions, not the kernel. Under WSL it is Linux. This flake knows the difference and says so in its own source: chromium, ALSA, X11 helpers are gated to Linux, because they are things a Mac cannot run. The honest slogan is โ€œwrite once, run anywhere,โ€ Sunโ€™s 1995 promise for Java bytecode, delivered at a different layer: not the same binary on every machine, but the same environment description resolving to the same behavior on every machine that can host it.

Not Dockerโ€™s demise

Where a container is the right shape, it stays the right shape: many tenants on one host, network isolation between them, an orchestrator scheduling replicas across a fleet. Kubernetes exists because that problem is real. Nothing here argues with it, and this flakeโ€™s own dockerImage output builds a container from the same package closure, which is the point: Nix sits underneath, and a container is one thing you can project it into.

What the writing on the wall says is narrower. For the workshop, the single developer machine, the reproducible environment you enter to do a dayโ€™s work, the box was never the point. The point was the description. A flake is a description you can read, line by line, and a container image is a description that has been baked into bytes you cannot. When you need isolation, bake it. When you need to know what you have, read it. Most of a working life is the second thing.

The counterweight, so the New-B is not sold a religion: Nixโ€™s learning curve is real, its error messages are famously unkind, evaluation can be slow, the store eats disk, flakes are still formally experimental in upstream Nix (Determinateโ€™s distribution enables them by default, which is why this installer bootstraps that one), and reproducibility depends on the pinned sources still being fetchable years later, which caches and archives make likely but do not guarantee. The lock file is a genome; the genome still needs a world with the raw materials in it.

The whole machine as a text file

The flake describes a workshop. configuration.nix describes a whole machine: what services run, what ports are open, which users exist, what the web server does with an Accept: text/markdown header. The Honeybot in this compile is the specimen: a retired laptop, running as a public web server from a closet, whose entire configuration is a few hundred lines of text in this repository. When that laptop dies, and it will, the next machine is that text plus a hardware scan plus one rebuild command. The environment was separated from the box the day the config went into git.

That is the Forever Machine. Not a machine that lasts forever; no machine does. A description that outlives every machine it has ever run on, and rebuilds identically on the next one.

The seed and the paradox

There is a bootstrap problem, and the installer in this compile is the solution to it. A flake wants to live in a git repository. Not every machine has git. And a strangerโ€™s first contact should be one line, not a setup guide. So the one line fetches a zip (no git required), unpacks it, drops in a pull-only key, and runs nix develop. The flake, once it is running inside the controlled environment where git is guaranteed to exist, clones the real repository over the unpacked folder and turns it into a proper checkout that pulls updates on every future entry. The article in this compile shows the moment on both platforms: โ€œSuccessfully transformed into git repository!โ€ a few seconds after โ€œPlease wait while the Nix environment hydrates.โ€

Seed, then self-assembly. The seed is small and dumb because the intelligence is in the recipe it carries, and the recipe can reconstruct everything else.

The Ark and its passengers

Now the image you actually asked about. Hardware hosts are mortal, and they die at their own rates. The workshop is a description that gets instantiated on a host, lives there until the host fails, and gets instantiated on the next host from the same description. A stone skipping across water: each contact is brief, the stone is the same stone, the water does not matter. The lock file is what keeps it the same stone.

What rides in the workshop is the part this ride is about. JupyterLab rides in it. Pipulate, the FastHTML app, rides in it. Anything else that can be described as a derivation could ride in it: an n8n, a Flatnotes, a Trilium, whatever someone wants home-hosted and reproducible. The vessel is the flake plus the pinned toolset plus the four durable skills the glossary calls LPvg. The passengers are apps.

Un-hardwiring: what the word is doing where

Which is why the folder cannot be named after one passenger. A stranger who runs the npvg.org line is not installing Pipulate; they are installing the vessel, and Pipulate happens to be aboard. Naming the vessel after one of its passengers is the sibling of every other conflation in this repoโ€™s convict list: two questions answered by one string, and the string will be wrong for one of them the day the second passenger boards. The stick bug argument is the same argument from the other side: an unobjectionable, unopinionated substrate stops being unobjectionable the moment its folder name is a product.


Un-hardwiring: what the word is doing where

The word appears in this compileโ€™s files in at least six roles, and they are not one job. Costing them before eradicating them is Herschelโ€™s move.

  1. The default install folder. install.sh line: CUSTOM_NAME="${1:-pipulate}". Cheap, and this ride.
  2. The app label. install.sh writes $CUSTOM_NAME to whitelabel.txt, and the flake reads that file for the figlet, the server, and (per the routerโ€™s notes on config.py) the database filenames. Today the folder name and the app label are one string, so a default install into ~/npvg would, as the code stands, produce an app called Npvg with data/npvg*.db. You said the FastHTML app keeps its name. That means the argument and the door have to answer different questions: the door names the folder; an explicit argument names the label; a default install gets its label from the flakeโ€™s own fallback, which already writes Pipulate for any folder that is not botify-shaped. One car, next ride, after your ruling.
  3. The installerโ€™s prose and re-run URLs. The Nix-not-found branch and the not-bash branch both send a stranger back to pipulate.com. With a stamped default the Nix-not-found branch prints bash -s npvg from pipulate.com, which lands in ~/npvg (same bytes, other door), so it is cosmetically wrong and functionally right. Small; it wants a second stamp for the URL once the first stamp is witnessed.
  4. mck.sh defaults. WHITELABEL and INSTALL_URL both default to the pipulate spelling. Small, and it already carries the placeholder pattern this ride reuses.
  5. The config directory ~/.config/pipulate. Every connectorโ€™s wallet, the blog matrix, the PII table, the disclosure profiles. Renaming it breaks every existing install unless a migration reads both. Medium, and it should be a deliberate decision, not a sweep.
  6. The PIPULATE_* environment prefix, the pipulate Python package (from pipulate import wand), the GitHub org, the PyPI name. These are the substrateโ€™s identity in code. Mechanically renameable with the rg-and-sed pattern this repo already uses, but the blast radius is every script, the flake, and every consumer of the wand, and the PyPI name cannot be renamed at all, only republished. Largest, and I would leave the package and the org alone: the fossil record of a thousand articles references them, GitHub redirects renames but PyPI does not, and the stick bug only needs the front door to be unobjectionable, not the plumbing.

The design for the front door, then. One installer file, two addresses. pipulate.com serves it as-is. npvg.orgโ€™s nginx stamps a placeholder to npvg at the door, the same sub_filter mechanism mck.shโ€™s own header describes for __MCK_TRAIL__. Two things about that mechanism are worth saying out loud. First, mck.sh documents a route the Honeybot configuration in this compile does not declare; that is documentation ahead of its protection, and the install.sh door would be the first sub_filter on the pad, with the mck route riding after it on the same directive. Second, nginx needs its sub module compiled in; nixpkgsโ€™ nginx normally has it, but โ€œnormallyโ€ is not a reading, so the door car waits for the probe below rather than shipping on a recollection.

The door, for the New-B

What ships this turn is the socket without the wire: install.sh gains the placeholder and a fallback that is byte-for-byte todayโ€™s behavior. Unstamped (pipulate.com, or the pad before the door car), it defaults to pipulate. Stamped, it defaults to npvg. The split-literal spelling that mck.sh uses is what keeps the two worlds distinguishable after substitution, and sub_filter_once off at the door is what makes the contiguous spelling the only one that changes. Publishing this car is safe before the door exists, because both doors keep serving pipulate until the stamp lands.

Two rulings I need from you before the next ride, and both are one word each: does the app label follow the folder on a default install (Npvg) or stay Pipulate as you said; and does the banner on the npvg.org door say Npvg (which comes free with this car once stamped) or something else.


1. PROBES

grep -c '^_tpl_name=' assets/installer/install.sh
eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh)"; echo "default=${CUSTOM_NAME:-unset}"
eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh | sed 's/__INSTALL_DEFAULT_NAME__/npvg/g')"; echo "stamped=${CUSTOM_NAME:-unset}"
grep -n 'whitelabel.txt' assets/installer/install.sh
sha256sum assets/installer/install.sh
curl -fsSL --max-time 10 https://npvg.org | sha256sum
curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'bin=$(systemctl cat nginx.service | grep -oE "/nix/store/[^ ]+/bin/nginx" | head -1); echo "bin=$bin"; "$bin" -V 2>&1 | tr " " "\n" | grep -c http_sub_module'

Probe 1 is Car 1โ€™s counter, anchored on syntax only the patch produces: 0 before, 1 after. Probes 2 and 3 are the behavioral straddle read off the file itself with no install run: both print unset before, because the sed range matches nothing; after, probe 2 prints default=pipulate (the unstamped world, todayโ€™s behavior) and probe 3 prints stamped=npvg (the doorโ€™s world, simulated by the same substitution the door will make). Probe 4 is a census for the label ruling: the lines where the installer writes the label, unchanged in both worlds. Probes 5 through 7 are the three-projection digest gate from the last articleโ€™s seed: 5 moves after Car 1, 6 and 7 do not move until their ignitions fire, and a receipt where 5 moved and 6 and 7 did not is the publish lane working as designed, not a fault. Probe 8 gates the next rideโ€™s door car: bin= names the running nginx and the count reads 1 if the sub module is compiled in; a 0 with a nonempty bin= means the door needs a different mechanism, and a 0 with an empty bin= means the derivation failed and says nothing about the module.

2. NEXT CONTEXT

assets/installer/install.sh
assets/installer/mck.sh
nixops.sh
remotes/honeybot/nixos/configuration.nix
release.py
config.py
! grep -c '^_tpl_name=' assets/installer/install.sh
! eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh)"; echo "default=${CUSTOM_NAME:-unset}"
! eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh | sed 's/__INSTALL_DEFAULT_NAME__/npvg/g')"; echo "stamped=${CUSTOM_NAME:-unset}"
! grep -n 'whitelabel.txt' assets/installer/install.sh
! sha256sum assets/installer/install.sh
! curl -fsSL --max-time 10 https://npvg.org | sha256sum
! curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
! ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'bin=$(systemctl cat nginx.service | grep -oE "/nix/store/[^ ]+/bin/nginx" | head -1); echo "bin=$bin"; "$bin" -V 2>&1 | tr " " "\n" | grep -c http_sub_module'

This compile carried the rolling pin, the glossary, the flake, the compiler, the router, and a 40k-token article; the next ride needs none of them. release.py rides so the pipulate.com projectionโ€™s ignition is in view, and config.py rides so the label ruling is made against the code that derives database names from it.

3. PATCHES

Car 1, the socket. One block, one commit story: the door names the default folder, and an unstamped copy behaves exactly as today.

Target: assets/installer/install.sh
[[[SEARCH]]]
CUSTOM_NAME="${1:-pipulate}"  # Default to "pipulate" if no arg provided
[[[DIVIDER]]]
# THE DOOR NAMES THE FOLDER (2026-09-14). One installer file, two addresses:
# pipulate.com serves this file as-is, and npvg.org's nginx stamps the
# placeholder below to "npvg" at the door, the way mck.sh's header already
# describes for its trail name. The split spelling of _ph_name is the one
# occurrence a stamp can never touch, so stamped and unstamped copies stay
# distinguishable after substitution. An explicit argument still wins, and
# an unstamped copy falls back to the folder name this script has always
# used, so publishing this before the door exists changes nothing.
_tpl_name='__INSTALL_DEFAULT_NAME__'
_ph_name='__INSTALL_DEFAULT_''NAME__'
if [ "$_tpl_name" != "$_ph_name" ]; then
  DEFAULT_NAME="$_tpl_name"
else
  DEFAULT_NAME="pipulate"
fi
CUSTOM_NAME="${1:-$DEFAULT_NAME}"  # An argument names the folder; the door names the default
[[[REPLACE]]]

patch, app, d, m, git push. Ignition, split by projection: probes 1 through 3 read the file at call time and need none. Probe 6 moves only after ./nixops.sh rsyncs the pad. Probe 7 moves only after the publish-only release lane the router already records as idempotent, and a Pages rebuild lag on that reading is claimed under the double-tap rule, never as a transform. Neither ignition is required for this turnโ€™s straddle to close, and both are safe to fire, because until the door car lands both doors still default to pipulate.

The Nix-not-found branch and the not-bash branch keep their literal pipulate comparisons on purpose: a stamped stranger without Nix is told bash -s npvg from pipulate.com, which lands in ~/npvg from the other door. Changing the comparison to the default would print a bare re-run that lands in ~/pipulate, which is the wrong folder. The URL follows the door in a later car, not the comparison.

4. PROMPT

Rule from the LIVE RECEIPTS, naming the tap. Probe 1 must read 1; a 0 means Car 1 did not land, stop there. Probe 2 must read default=pipulate and probe 3 stamped=npvg; if the LIVE RECEIPT for either still reads unset while probe 1 reads 1, the sed range is not closing on the CUSTOM_NAME line and the patch needs a look, not a re-run. Probe 4 is a census: say which lines write the label and which read it, then answer the ruling if the operator gave one (label follows folder, or stays Pipulate) with the Car 2 design that makes the argument name the label and the door name the folder. Probes 5 through 7: 5 must have moved from 59244b08; 6 and 7 read the old digest unless the operator fired nixops.sh or the release lane, and say which projection is behind and what fires it. Probe 8: bin= nonempty and count 1 clears the door car for configuration.nix (sub_filter_types text/x-shellscript, sub_filter_once off, the placeholder to npvg, on the npvg.org locations block only), and a 0 with a nonempty bin= means the stamp needs a sync-time sed in nixops.sh instead; say which and write the car. Do not quote any line of configuration.nix that carries a www host into a SEARCH block. Do not call the installer proven for strangers. Continue the un-hardwiring ladder for the New-B and close with the five-stage response contract.

5. EXTERNAL DELIVERABLES

None this turn outside the repo. The door lives in a tracked file; the rulings live in your next prompt.

MikeLev.in:

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: Probe: (BEFORE: hand-run, nothing changed yet)

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

nothing to commit, working tree clean
(nix) pipulate $ grep -c '^_tpl_name=' assets/installer/install.sh
eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh)"; echo "default=${CUSTOM_NAME:-unset}"
eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh | sed 's/__INSTALL_DEFAULT_NAME__/npvg/g')"; echo "stamped=${CUSTOM_NAME:-unset}"
grep -n 'whitelabel.txt' assets/installer/install.sh
sha256sum assets/installer/install.sh
curl -fsSL --max-time 10 https://npvg.org | sha256sum
curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'bin=$(systemctl cat nginx.service | grep -oE "/nix/store/[^ ]+/bin/nginx" | head -1); echo "bin=$bin"; "$bin" -V 2>&1 | tr " " "\n" | grep -c http_sub_module'
0
default=unset
stamped=unset
248:echo "$CUSTOM_NAME" > "${TARGET_DIR}/whitelabel.txt"
249:chmod 644 "${TARGET_DIR}/whitelabel.txt"
59244b08613cd834d089f3bffa88b7c2cfcf8b40a8f3bbb80fde37fdc04feffc  assets/installer/install.sh
59244b08613cd834d089f3bffa88b7c2cfcf8b40a8f3bbb80fde37fdc04feffc  -
59244b08613cd834d089f3bffa88b7c2cfcf8b40a8f3bbb80fde37fdc04feffc  -
bin=/nix/store/1lzahhm6ih34q8lyhg7hs4isdnqldks2-nginx-1.28.0/bin/nginx
1
(nix) pipulate $ 

2: Context: (AFTER: the same probes re-run by the compiler as ! lines)

# AD HOC CHOP! The Not-Managed-by-Git Safe-for-Client-Data place. Insert Simpson Couch Gag in white space  below (explain anything to the audience you feel needs it explained)G
# adhoc.txt    _   _   _               ____ _   _  ___  ____  _   
#     / \   __| | | | | | ___   ___   / ___| | | |/ _ \|  _ \| |  And now we start telling the AI a story so it can start telling the New-B's a story.
# ahe/ _ \ / _` | | |_| |/ _ \ / __| | |   | |_| | | | | |_) | |  We should always start with talking about machine rot and pinning a portable subsystem.
# ahc ___ \ (_| | |  _  | (_) | (__  | |___|  _  | |_| |  __/|_|  
#  /_/   \_\__,_| |_| |_|\___/ \___|  \____|_| |_|\___/|_|   (_)  

# To Human: WELCOME TO VIM! It's really NeoVim but I say vim anyway.
# To AI: This is an alternate 40K view to the big book-ore rolling pin spine.

# 1. **Probe**: Baseline Reading
# 2. **Context**: Post-experiment *planned* reading instructions
# 3. **Patch**: The experiment and how to make it happen
# 4. **Prompt**: Post-experiment instructions and how to read results
# 5. **Deliverable**: How the world is forever different moving forward

# The first thing you need to know here is that everything that comes after the
# hash symbol (#) is commented out โ€” and that's EVERYTHING in this file's default
# state. Begin editing-in lines for inclusion as part of the context or adding
# chunks of new context at the bottom. `Ctrl`+`v`, `j` (repeatedly), `l` (to move
# right), `d` (to delete). Reverse that with `Ctrl`+`v`, `j` (repeatedly),
# `Shift`+`i`, `# `, `Esc` to put the hashes back. You can just arrow-key around
# here with `h`, `j`, `k`, `l`. Save-and-quit is a bit tricky because another
# file is also loaded: `Esc`, `:`, `q`, `w`, `!`

# If this is stressing you out and you're a quitter and want to quit, just type:
# `Esc`, `:`, `q`, `!`, `Enter`. That will exit without saving any changes. If
# you want to get over this hump, type: `Esc`, `:`, `T`, `u`, `t`, `o`, `r`, `Enter`.

# This file is just to make it easy having options of what to edit into context.
# You can use whatever text-file you want to stack file-names and commands to
# build an output text-file with the identically stacked output of each file or
# command. In this way we vertically append or "stack" a bunch of text; simple as
# that. If you understand this concept, you're on your way to future-proofing
# yourself in the Age of AI. Congratulations! Here is how to include web pages:

#    !URL  --------------------------------------------------------------------
#      when    Public page; what a stranger or crawler sees; the BEFORE of a
#              login-wall diagnosis
#      switch  It shows a login page -> `warm URL` once, then `?URL`
#    
#    ?URL  --------------------------------------------------------------------
#      when    Anything behind a login, on the site's persistent profile;
#              `check URL` first
#      switch  The lenses show a shell (nav, an `[Iframe]` leaf, no content) ->
#              read the wire truth for the XHR the frame makes, then call that
#              API with a connector
#    
#    @URL  --------------------------------------------------------------------
#      when    Every re-read of a page already scraped; no browser, no network
#      switch  The cached page is stale or was a login wall -> fresh `!` or `?`
#    
#    $URL  --------------------------------------------------------------------
#      when    Exact markup: meta tags, a JSON blob in a `<script>`
#      note    Token-heavy; needs a prior scrape
#    
#    %URL  --------------------------------------------------------------------
#      when    The network log distilled; SPA endpoint discovery
#      switch  It re-serves the wire truth you already have -> the API
#    
#    ! cmd  -------------------------------------------------------------------
#      when    Any bounded, non-interactive command as a live receipt
#      note    Cap it with `-n`; no aliases, no prompts
#    
#    Connector  ---------------------------------------------------------------
#      when    The number you want is one GET away
#      switch  LIST until the thing isn't in the list -> FETCH by id -> DRILL
#              the path the app's own frame called -> `--grep` to narrow a list
#              or find a leaf

# Every step is one argument longer than the last; the moment a lens shows less than the wire does is the moment to stop scraping.

# STORYTELLING: OPTIONAL, BIG 40K-FOOT VIEW
# ! python scripts/articles/lsa.py -t 1 --reverse --fmt dated-slugs  # <-- ROLLING PIN that gives the 40K foot book-spine view of book-ore (only works for me because of local-only git repo)
# GLOSSARY.md                 # <-- Terms defined like back of J.R.R. Tolkien book, grows as `prompt_foo.py` gets scars and shrinks.
# scripts/articles/lsa.py     # <-- 2ND BRAIN: Search external memory with `rgx`, `rgxc` & `posts` Blogging for Hackers Jekyll-compatible.
# ~/repos/nixos/autognome.py  # <-- Letting the AIs really understand my environment (The Brave Little Tailor punches above Their Weight Class proving the dunning-kruger effect the gate-keeper's (lower-case) lament.)
 
# STILL BIG BUT LESS OPTIONAL (especially flake.nix)
# init.lua                    # <-- Daily driver hot-keys that overlap with aliases in flake.nix. `<leader>m` makes it Science (this process)!
# prompt_foo.py               # <-- THIS SYSTEM
# foo_files.py                # <-- MAIN ROUTER FILE (alternative to this one)
# flake.nix                   # <-- THE ONE BIG THING TO INCLUDE Infrastructure as Code (IaC) tells LLM about your system down to the metal

# TINY BUT EXCELLENT FOR "THIS SYSTEM" CONTEXT (OK to include every time / automatically = `apply.py`, `.gitignore`, `.gitattributes`)
# requirements.in             # <-- All known dependencies and (necessary) version pinning. WORA gotcha's exposed.
# __init__.py                 # <-- Master versioning
# pyproject.toml              # <-- The PyPI Packaging details

# OPTIONAL ACTUATORS (cheap and good to include to expand the AI's capabilities)
# cli.py                      # <-- Catch-all actuator for PyPI envs, Python anchoring, MCP tool-call (plus alternatives) and **kwargs like wrapping for CLI
# scripts/xp.py               # <-- Transforms host OS copy-paste buffer player-piano music into context-payload.
# scripts/ai.py               # <-- How I constantly use local AI to write git commit messages with `m` alias.
# scripts/crawl.py            # <-- Feel free to ask for something to be crawled and included in the next turn.
# scripts/weblogin.py         # <-- Lets the user "warm up" the cache for their web logins at their leisure on a profile that persists.
# scripts/webclip_2_markdown.py  # <-- Surprisingly important program.
 
# MISCELLANEOUS (rare to include but sometimes critical)
# scripts/foo_cartridge.py    # Needs description
# scripts/foo_replay.py       # Needs description
# release.py                  # <-- How everything ends up where it does (GitHub, PyPI, etc.)
# imports/voice_synthesis.py  # <-- The wand can talk to you
# imports/ascii_displays.py   # <-- Where all the ASCII Art lives
# scripts/release/version_sync.py  # <-- Needs to be wrapped into release.py and eliminated, I think.

#                         --- Under this line is were you paste what the AI gives you ---
#                         --- We call it context but it's really just the right-hand  ---
#                         --- blast-radius of the "probes" to make this all science.  ---

# Carry-over as the important work-in-progress parts of the project here just
# like above but not as long-standing overarching to the framework but rather
# for the current hot spots actively being worked on.

# STICKBUG & MOTHER CAT KATA (WORKING ON THE CHAPTER)

# assets/trails/first_context.yaml
# assets/trails/practice.yaml
# assets/trails/public_walk.yaml
# # assets/trails/botify_pageworkers.yaml

# Always include these with whatever connector
# scripts/sources_menu.py
# scripts/connectors/README.md
# scripts/connectors/wallet.py

# scripts/connectors/botify.py
# scripts/connectors/confluence.py
# scripts/connectors/gmail.py
# scripts/connectors/gsc.py
# scripts/connectors/jira.py
# scripts/connectors/mcp.py
# scripts/connectors/mcp_warm.py
# scripts/connectors/sheets.py
# scripts/connectors/slack.py

# The "walk" system is different from the Unix-like tiny connector commands.
# assets/installer/mck.sh
# assets/installer/replay.sh
# scripts/bookmark_import.py
# scripts/walk.py
# scripts/walk_cartridge.py
# scripts/walk_compile.py
# scripts/weblogin.py
# tools/scraper_tools.py
# 
# scripts/mcp_dummy_server.py  
# scripts/boot_menu.py
# scripts/mother_cat.py
# scripts/sources_menu.py

# --- START THIS DISCUSSION ---

# Get things started here! Guess at what context should be included.
# If you get it wrong, you're just wasting 1-turn because the AI will help.
# Un-comment lines, add lines with absolute-path filenames or `! ` commands. 

# Context 1 (Edit-in selections from above and add new files immediately below)
# flake.nix
# assets/installer/install.sh                #  <-- Pipulate.com installer real home in github/pipulate repo
# ~/repos/Pipulate.com/CNAME
# ~/repos/Pipulate.com/_config.yml
# ~/repos/Pipulate.com/_layouts/default.html
# ~/repos/nixos/.gitignore
# assets/installer/mck.sh
# scripts/walk.py
# scripts/mother_cat.py
# assets/trails/public_walk.yaml
# remotes/honeybot/www/npvg.org/index.html
# nixops.sh                                   # <-- You've heard of GitOPs? Well, this is NixOPs. 
# remotes/honeybot/hooks/post-receive         # <-- Ever hear of GitHub Pages? Or github.io? This is that.
# remotes/honeybot/nixos/configuration.nix    # <-- It's as if Pipulate had kids. Spy kids.
# /home/mike/repos/trimnoir/_posts/2026-09-14-wrong-front-door-split-dns-dhcp.md  # [Idx: 1468 | Order: 2 | Tokens: 40,173 | Bytes: 153,970]

# Context 2
assets/installer/install.sh
assets/installer/mck.sh
nixops.sh
remotes/honeybot/nixos/configuration.nix
release.py
config.py
! grep -c '^_tpl_name=' assets/installer/install.sh
! eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh)"; echo "default=${CUSTOM_NAME:-unset}"
! eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh | sed 's/__INSTALL_DEFAULT_NAME__/npvg/g')"; echo "stamped=${CUSTOM_NAME:-unset}"
! grep -n 'whitelabel.txt' assets/installer/install.sh
! sha256sum assets/installer/install.sh
! curl -fsSL --max-time 10 https://npvg.org | sha256sum
! curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
! ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'bin=$(systemctl cat nginx.service | grep -oE "/nix/store/[^ ]+/bin/nginx" | head -1); echo "bin=$bin"; "$bin" -V 2>&1 | tr " " "\n" | grep -c http_sub_module'

# --- END `adhoc.txt` TEMPLATE ---

3: Patches: (the one change between the readings)

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ patch
(nix) pipulate $ app
โœ… DETERMINISTIC PATCH APPLIED: Successfully mutated 'assets/installer/install.sh'.
(nix) pipulate $ d
diff --git a/assets/installer/install.sh b/assets/installer/install.sh
index 5fb637bf..c75003d5 100644
--- a/assets/installer/install.sh
+++ b/assets/installer/install.sh
@@ -57,7 +57,22 @@ fi
 set -euo pipefail
 
 # At the beginning, add argument handling
-CUSTOM_NAME="${1:-pipulate}"  # Default to "pipulate" if no arg provided
+# THE DOOR NAMES THE FOLDER (2026-09-14). One installer file, two addresses:
+# pipulate.com serves this file as-is, and npvg.org's nginx stamps the
+# placeholder below to "npvg" at the door, the way mck.sh's header already
+# describes for its trail name. The split spelling of _ph_name is the one
+# occurrence a stamp can never touch, so stamped and unstamped copies stay
+# distinguishable after substitution. An explicit argument still wins, and
+# an unstamped copy falls back to the folder name this script has always
+# used, so publishing this before the door exists changes nothing.
+_tpl_name='__INSTALL_DEFAULT_NAME__'
+_ph_name='__INSTALL_DEFAULT_''NAME__'
+if [ "$_tpl_name" != "$_ph_name" ]; then
+  DEFAULT_NAME="$_tpl_name"
+else
+  DEFAULT_NAME="pipulate"
+fi
+CUSTOM_NAME="${1:-$DEFAULT_NAME}"  # An argument names the folder; the door names the default
 
 # --- Configuration ---
 REPO_USER="miklevin"
(nix) pipulate $ m
๐Ÿ“ Committing: chore: Refactor installer script argument handling
[main d84b4b35] chore: Refactor installer script argument handling
 1 file changed, 16 insertions(+), 1 deletion(-)
(nix) pipulate $ git push
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 48 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 1010 bytes | 1010.00 KiB/s, done.
Total 5 (delta 3), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To github.com:pipulate/pipulate.git
   5b9c5ad5..d84b4b35  main -> main
(nix) pipulate $

4: Prompt: (the next question, written before the AFTER reading is in)

Rule from the LIVE RECEIPTS in this compile and say which tap each verdict reads. (1) The gate: live_blobs_not_in_safe and its verdict word, the manifests diff (MANIFESTS_IDENTICAL, or the Only-in lines if Car 10 ran โ€“ predicted seven, name each), and the 26-directory manifest listing including laguna-s-2.1 and gpt-oss. (2) The restore: the stat mode and uid; the blob filenames under the temp store; /tmp/ollama_restore.txtโ€™s list row and the JSONโ€™s response and done fields; say which of the three worlds printed, and if the API returned an error, quote it. (3) Car 7: nixos-rebuild count 0 -> 1, stale label -> token, backup-home.py byte delta against the prediction. (4) Car 10, if it ran: root df against the ~228G prediction; if root is still under 15%, name the next candidates by size from the safeโ€™s manifest listing, never a move of the live store. (5) With ai-acceleration.nix in context, propose the car that updates its PINNED comment: the moved-branch N path was witnessed 2026-09-14 (d6524aa -> ef34387, held, sixteen derivations, no ollama rebuild). (6) Propose the cleanup line for /tmp/ollama_restore_test and the serve log as a car, and say whether the second-daemon restore is now WITNESSED or still owed. No web claims; everything from receipts in this compile.

5: Deliverables: None this turn.

Fable 5.1 Extra: Context verified. Eight live receipts this compile, all eight reading as the caboose I wrote predicted, and the last one opened the door.

The receipts, tap by tap. Probe 1: hand-run 0, live 1; Car 1 landed. Probes 2 and 3: hand-run unset and unset, live default=pipulate and stamped=npvg; the file itself now answers both worlds, and the doorโ€™s world was simulated with the same substitution the door will make. Probe 4 is the displacement receipt: the two whitelabel lines moved from 248 and 249 to 263 and 264, fifteen lines down, and the commitโ€™s own arithmetic is sixteen insertions and one deletion, which is fifteen. Probe 5: the repo digest moved from 59244b08 to 90be3375. Probes 6 and 7: both doors still serve 59244b08, because neither truck has run, which is what the caboose said would happen and is the point of the next section. Probe 8: bin= names nginx-1.28.0 at its store path, and the count is 1 on both taps, so the sub module is compiled into the nginx that is actually running, not the one I remembered.

One thing about the caboose before the story. The text in your section 4 belongs to a different ride: it asks about an Ollama blob store, a restore under /tmp, ai-acceleration.nix, and Cars 7 and 10, and none of those are in this compile. The Manifestโ€™s receipt list is the authority on what ran, so I ruled from it and from the caboose I wrote last turn, which those receipts answer line for line. The stale-overlay rule already names this shape; it cost nothing here because the receipts carried the whole verdict.


The door, for the New-B

What the three digests just taught

Last turn a line changed in a file in a repository. This turn the repositoryโ€™s digest moved and neither doorโ€™s did. For the New-B, that is the whole lesson about the word โ€œdeployed,โ€ and it is worth slowing down on.

A file in a repository is a source. A stranger never reads the source. They read a door: an address they type into a terminal, which hands them bytes. Between the source and each door there is a delivery truck, and the trucks are different. For pipulate.com, release.py copies the installer into a second repository and pushes it, and GitHubโ€™s static hosting rebuilds the site some seconds or minutes later. For npvg.org, nixops.sh copies the file over SSH to a laptop in a closet. A change in the repository is a change at neither door until its own truck runs, and each truck leaves its own receipt. The last articleโ€™s DHCP lesson was the same shape from the other side: the router changed its offer, and no client had collected it. โ€œDeployedโ€ is not a property of a commit. It is a property of each door, one at a time, and the honest way to say a door is current is to fetch from it and hash what arrived.

One file, two doors

The ask was one installer that lands in ~/npvg from one address and ~/pipulate from the other. Two designs suggest themselves and both are wrong.

The first is two files. Keep a copy per door, with one line different. That is the same defect this repo has convicted a dozen times under other names: two authorities for one thing drift, and the day they differ nobody can say which one a stranger got. It would also break the gate that just proved its worth, three digests that are supposed to agree.

The second is to have the script work out where it came from. It cannot. A script arriving through a pipe is anonymous: $0 is the word bash, and the pipe has no memory of the address it was fetched from. There is nothing to ask.

The design that landed is one file, one placeholder, and a door that stamps the placeholder on the way out. nginx has a small module that does exactly one thing: replace a string in the body it is about to send. The npvg.org door already shapes its body by who is asking, which is why a browser gets a page and curl gets a script from the same address; now, when the body is the script, the door also writes one word into it. pipulate.com has no such module and never will, so the placeholder arrives there untouched, and the scriptโ€™s fallback for an untouched placeholder is the folder name it has always used. Nothing about pipulate.com changes. The only new behavior lives at the one door that asked for it.

There is one trick inside the script worth showing, because it looks like a typo and is the whole mechanism. The door replaces every contiguous copy of the placeholder, so the script cannot compare the placeholder against itself; both copies would be stamped and the comparison would always say โ€œunchanged.โ€ Instead the fallback compares against the same word spelled in two halves, glued together by the shell at run time. No substitution can see two halves as one word, so that copy is the one thing the door can never touch. Split the word and the stamp cannot reach it. mck.sh has used the same trick for its trail name since its second version; the installer now uses it for the folder.

Two questions, one string

The folder name was also the appโ€™s name. That is the pattern the last two articles kept finding in other places, one value answering two questions, and it was sitting in the installer at line 263. whitelabel.txt is the appโ€™s identity: the flake reads it for the banner it prints on entry, config.py reads it, capitalizes it, and lowercases it again to name the databases, and the server carries it as its own name. The installer wrote the folder name into that file unconditionally. With the door stamping npvg, a strangerโ€™s default install would have produced an app called Npvg with data/npvg_dev.db, which is not what you asked for. You said the app keeps its name.

So the argument names the label, and the door names the folder. An explicit argument (bash -s botifython, or the launcher passing its whitelabel) still writes the file, so every path that names a label keeps it. A default install writes nothing, and the flakeโ€™s own fallback names the app on first entry: Pipulate for any folder without botify in it, which is the code that already existed and was only ever reached by clones. The banner at the top of the installer keeps following the folder, so the npvg.org door greets a stranger with the Npvg Installer and the app inside still introduces itself as Pipulate a minute later. That reads correctly to me: the vessel says its name at the dock, and the passenger says its own name when it comes aboard. If you would rather the dock say something else, that is a one-line veto on Car 2.

The ladder after this turn

Rung one, the default folder, landed last turn. Rung two, the label, rides now. Rung three, the re-run address in the Nix-not-found branch, still names pipulate.com; a stamped stranger without Nix is told bash -s npvg from the other door, which lands in the right folder from the wrong address, and a second stamp fixes it once this one is witnessed. Rung four, the launcherโ€™s own defaults, is the same placeholder pattern it already carries. Rungs five and six, the config directory and the environment prefix, stay deliberate decisions and not sweeps, for the reasons costed last turn.


1. PROBES

grep -cF 'if [ -n "${1:-}" ]; then' assets/installer/install.sh
sha256sum assets/installer/install.sh
grep -c '^ *sub_filter' remotes/honeybot/nixos/configuration.nix
curl -fsSL --max-time 10 https://npvg.org | grep -c '^_tpl_name='
curl -fsSL --max-time 10 https://npvg.org | grep -c "^_tpl_name='npvg'"
eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
curl -fsSL --max-time 10 https://npvg.org | sed "s/_tpl_name='npvg'/_tpl_name='__INSTALL_DEFAULT_NAME__'/" | sha256sum
eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"
curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'grep -c "^ *sub_filter" /etc/nixos/configuration.nix; sha256sum ~/www/npvg.org/install.sh | cut -c1-8'

Probe 1 is Car 2โ€™s witness, anchored on the one line only the patch produces: 0 before, 1 after. Probe 2 is the repo digest, 90be3375 before and a new value after Car 2; call the new value R, because it cannot be predicted and every served-body gate below is measured against it. Probe 3 is Car 3โ€™s local witness, anchored on directive syntax so the comment lines do not count: 0 before, 3 after. Probe 4 reads whether the pad has been synced at all: 0 while it serves the old file, 1 once Car 4โ€™s first command has run. Probe 5 reads whether the door is live: 0 until Car 4โ€™s second command activates the config, 1 after. Probe 6 is the served body evaluated the same way probes 2 and 3 were evaluated last turn, and it prints one of three words: unset before the sync, pipulate after the sync but before the door, npvg after the door. Probe 7 is the round-trip gate: the served body with the stamp reversed must hash to R in either post-sync world, because the door may change one token and nothing else. Probes 8 and 9 are the pipulate.com side: unset and 59244b08 until Car 5 runs, then pipulate and R, with a lagging reading after Car 5 claimed as a Pages rebuild under the double-tap rule. Probe 10โ€™s first line separates a copied config from a staged one on the box itself, 0 before the sudo copy and 3 after; its second line is the first eight of the padโ€™s on-disk digest, 59244b08 before the sync and the first eight of R after.

2. NEXT CONTEXT

assets/installer/install.sh
remotes/honeybot/nixos/configuration.nix
nixops.sh
! grep -cF 'if [ -n "${1:-}" ]; then' assets/installer/install.sh
! sha256sum assets/installer/install.sh
! grep -c '^ *sub_filter' remotes/honeybot/nixos/configuration.nix
! curl -fsSL --max-time 10 https://npvg.org | grep -c '^_tpl_name='
! curl -fsSL --max-time 10 https://npvg.org | grep -c "^_tpl_name='npvg'"
! eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
! curl -fsSL --max-time 10 https://npvg.org | sed "s/_tpl_name='npvg'/_tpl_name='__INSTALL_DEFAULT_NAME__'/" | sha256sum
! eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"
! curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
! ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'grep -c "^ *sub_filter" /etc/nixos/configuration.nix; sha256sum ~/www/npvg.org/install.sh | cut -c1-8'

release.py, config.py, and mck.sh were read and can leave the next compile; the ignition they explain is named below.

3. PATCHES

Car 2, the label. The argument names the label; the door names the folder. patch, app, d, m, git push. No ignition for probes 1 and 2, which read the file at call time; the served copies collect it through Cars 4 and 5.

Target: assets/installer/install.sh
[[[SEARCH]]]
echo "Setting up app identity as '$CUSTOM_NAME'..."
echo "$CUSTOM_NAME" > "${TARGET_DIR}/whitelabel.txt"
chmod 644 "${TARGET_DIR}/whitelabel.txt"
echo "โœ… Application identity set."
[[[DIVIDER]]]
# THE ARGUMENT NAMES THE LABEL; THE DOOR NAMES THE FOLDER (2026-09-14).
# whitelabel.txt is the app's identity: the banner the flake prints on
# entry, the server's own name, and the database filenames config.py
# derives from it. It used to be written from CUSTOM_NAME unconditionally,
# so a default install from a door that stamps the folder "npvg" would
# have renamed the app Npvg and its databases with it. Now only an
# explicit argument writes it. A default install leaves the file absent,
# and the flake's own first-entry fallback names the app, "Pipulate" for
# any folder without botify in its name. mck.sh always passes its
# whitelabel as the argument, so the launcher's lane is unchanged. The
# explicit path still announces itself; the default path prints nothing
# here because it did nothing here.
if [ -n "${1:-}" ]; then
  echo "Setting up app identity as '$CUSTOM_NAME'..."
  echo "$CUSTOM_NAME" > "${TARGET_DIR}/whitelabel.txt"
  chmod 644 "${TARGET_DIR}/whitelabel.txt"
  echo "โœ… Application identity set."
fi
[[[REPLACE]]]

Car 3, the door. Three directives on the npvg.org bare-path location, anchored on the one try_files line that is unique to it. patch, app, d, m, git push. Probe 3 reads the file at call time; everything the door does for a stranger waits for Car 4.

Target: remotes/honeybot/nixos/configuration.nix
[[[SEARCH]]]
          try_files $npvg_index =404;
[[[DIVIDER]]]
          # THE STAMP (2026-09-14). install.sh carries one contiguous
          # placeholder for its default folder name and falls back to
          # "pipulate" when the placeholder arrives untouched. This door
          # rewrites it to "npvg" in the served body, so one file on disk
          # installs to ~/npvg from here and to ~/pipulate from the other
          # door, which has no such filter. sub_filter_types is required
          # because the module filters text/html alone by default, and the
          # types block above serves the script as text/x-shellscript.
          # sub_filter_once off replaces the contiguous spelling wherever
          # it appears and can never reach the split spelling the script
          # compares against. Witnessed 2026-09-14: the running
          # nginx-1.28.0 reports http_sub_module compiled in.
          sub_filter_types text/x-shellscript;
          sub_filter_once off;
          sub_filter '__INSTALL_DEFAULT_NAME__' 'npvg';
          try_files $npvg_index =404;
[[[REPLACE]]]

Car 4, the closet truck and the switch. Two commands, in this order, from the repo root. The first syncs Car 2โ€™s installer to the pad and stages Car 3โ€™s config; its own last line says staging is not activation. The second activates. Probes 4 through 7 and probe 10 read the result at call time after it.

./nixops.sh
ssh -t honeybot 'sudo cp ~/nixos-config-staged/* /etc/nixos/ && sudo nixos-rebuild switch'

Car 5, the Pages truck. The publish-only lane the router records as idempotent. It commits the installer into the Pipulate.com checkout and pushes; the site rebuilds on GitHubโ€™s clock, not yours, so probes 8 and 9 may lag one compile.

python release.py --skip-version-sync --skip-docs-sync --skip-audit-sync --skip-ai-context-sync --skip-breadcrumb-sync --skip-trifecta-rebuild

Car 6, optional, the strangerโ€™s line from inside the house. Only after probe 6 reads npvg. Fresh terminal, not the workshop shell, ~/npvg absent. The banner must read Npvg, the target directory ~/npvg, and once the flake enters, the figlet on door 1 must read Pipulate. This run stops your main workshopโ€™s server, as the articleโ€™s earlier rehearsals did; restart it after cleanup with rm -rf ~/npvg.

curl -fsSL https://npvg.org | bash

4. PROMPT

Rule from the LIVE RECEIPTS, naming the tap for each, and if the pasted caboose belongs to another ride, say so and rule from the Manifest anyway. Probe 1: 1 means Car 2 landed, 0 means it did not, stop there. Probe 2 is the repo digest; if Car 2 landed it must differ from 90be3375, and its value is R for every gate below. Probe 3: 3 means Car 3 landed locally, 0 means it did not. Probe 4: 0 means Car 4's first command has not run, 1 means the pad holds the new file. Probe 5: 1 means the door is live; 0 with probe 4 at 1 means the config was synced but not activated, and probe 10's first line says whether it was even copied. Probe 6 must read npvg_door=npvg when probe 5 reads 1, pipulate when 4 reads 1 and 5 reads 0, and unset when 4 reads 0; any other pairing is a finding, name it. Probe 7 must equal R whenever probe 4 reads 1; a different value with 4 at 1 means the door changed more than one token or the pad holds a file the repo does not, and the next probe is a diff of the served body against the repo file. Probe 8 reads pipulate and probe 9 reads R after Car 5, unset and 59244b08 before; a stale pair with Car 5 fired is a Pages lag claimed under the double-tap rule, never a transform. Probe 10: first line 3 after the sudo copy, second line the first eight of R after the sync. If a Car 6 transcript is pasted, read it as the CVR it is: the banner's name, the target directory, the whitelabel line's absence, the figlet's name, the stopped-server line. If every reading is AFTER, the ride's stated goal is met and the next beat is the dismount; say so and stop short of it. Do not call the installer proven for strangers. Continue the un-hardwiring ladder for the New-B and close with the five-stage response contract.

5. EXTERNAL DELIVERABLES

None this turn outside the repo. The door and both trucks are tracked files and named commands; the uninstall line for the padโ€™s page, rm -rf npvg, is a one-line edit to remotes/honeybot/www/npvg.org/index.html that waits until Car 6 has read Npvg at the top and Pipulate at the bottom.

MikeLev.in:

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: Probe: (BEFORE: hand-run, nothing changed yet)

(nix) pipulate $ g

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ grep -cF 'if [ -n "${1:-}" ]; then' assets/installer/install.sh
sha256sum assets/installer/install.sh
grep -c '^ *sub_filter' remotes/honeybot/nixos/configuration.nix
curl -fsSL --max-time 10 https://npvg.org | grep -c '^_tpl_name='
curl -fsSL --max-time 10 https://npvg.org | grep -c "^_tpl_name='npvg'"
eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
curl -fsSL --max-time 10 https://npvg.org | sed "s/_tpl_name='npvg'/_tpl_name='__INSTALL_DEFAULT_NAME__'/" | sha256sum
eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"
curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'grep -c "^ *sub_filter" /etc/nixos/configuration.nix; sha256sum ~/www/npvg.org/install.sh | cut -c1-8'
0
90be3375259ec8019deaa047774a4364271c2ac6cb4ecea923f00bd7b16ac7b7  assets/installer/install.sh
0
0
0
npvg_door=unset
59244b08613cd834d089f3bffa88b7c2cfcf8b40a8f3bbb80fde37fdc04feffc  -
pipulate_door=unset
59244b08613cd834d089f3bffa88b7c2cfcf8b40a8f3bbb80fde37fdc04feffc  -
0
59244b08
(nix) pipulate $ 

2: Context: (AFTER: the same probes re-run by the compiler as ! lines)

# AD HOC CHOP! The Not-Managed-by-Git Safe-for-Client-Data place. Insert Simpson Couch Gag in white space  below (explain anything to the audience you feel needs it explained)G
# adhoc.txt    _   _   _               ____ _   _  ___  ____  _   
#     / \   __| | | | | | ___   ___   / ___| | | |/ _ \|  _ \| |  And now we start telling the AI a story so it can start telling the New-B's a story.
# ahe/ _ \ / _` | | |_| |/ _ \ / __| | |   | |_| | | | | |_) | |  We should always start with talking about machine rot and pinning a portable subsystem.
# ahc ___ \ (_| | |  _  | (_) | (__  | |___|  _  | |_| |  __/|_|  See this? This is puzzle-solving that humans normally do. The AI is doing it.
#  /_/   \_\__,_| |_| |_|\___/ \___|  \____|_| |_|\___/|_|   (_)  

# To Human: WELCOME TO VIM! It's really NeoVim but I say vim anyway.
# To AI: This is an alternate 40K view to the big book-ore rolling pin spine.

# 1. **Probe**: Baseline Reading
# 2. **Context**: Post-experiment *planned* reading instructions
# 3. **Patch**: The experiment and how to make it happen
# 4. **Prompt**: Post-experiment instructions and how to read results
# 5. **Deliverable**: How the world is forever different moving forward

# The first thing you need to know here is that everything that comes after the
# hash symbol (#) is commented out โ€” and that's EVERYTHING in this file's default
# state. Begin editing-in lines for inclusion as part of the context or adding
# chunks of new context at the bottom. `Ctrl`+`v`, `j` (repeatedly), `l` (to move
# right), `d` (to delete). Reverse that with `Ctrl`+`v`, `j` (repeatedly),
# `Shift`+`i`, `# `, `Esc` to put the hashes back. You can just arrow-key around
# here with `h`, `j`, `k`, `l`. Save-and-quit is a bit tricky because another
# file is also loaded: `Esc`, `:`, `q`, `w`, `!`

# If this is stressing you out and you're a quitter and want to quit, just type:
# `Esc`, `:`, `q`, `!`, `Enter`. That will exit without saving any changes. If
# you want to get over this hump, type: `Esc`, `:`, `T`, `u`, `t`, `o`, `r`, `Enter`.

# This file is just to make it easy having options of what to edit into context.
# You can use whatever text-file you want to stack file-names and commands to
# build an output text-file with the identically stacked output of each file or
# command. In this way we vertically append or "stack" a bunch of text; simple as
# that. If you understand this concept, you're on your way to future-proofing
# yourself in the Age of AI. Congratulations! Here is how to include web pages:

#    !URL  --------------------------------------------------------------------
#      when    Public page; what a stranger or crawler sees; the BEFORE of a
#              login-wall diagnosis
#      switch  It shows a login page -> `warm URL` once, then `?URL`
#    
#    ?URL  --------------------------------------------------------------------
#      when    Anything behind a login, on the site's persistent profile;
#              `check URL` first
#      switch  The lenses show a shell (nav, an `[Iframe]` leaf, no content) ->
#              read the wire truth for the XHR the frame makes, then call that
#              API with a connector
#    
#    @URL  --------------------------------------------------------------------
#      when    Every re-read of a page already scraped; no browser, no network
#      switch  The cached page is stale or was a login wall -> fresh `!` or `?`
#    
#    $URL  --------------------------------------------------------------------
#      when    Exact markup: meta tags, a JSON blob in a `<script>`
#      note    Token-heavy; needs a prior scrape
#    
#    %URL  --------------------------------------------------------------------
#      when    The network log distilled; SPA endpoint discovery
#      switch  It re-serves the wire truth you already have -> the API
#    
#    ! cmd  -------------------------------------------------------------------
#      when    Any bounded, non-interactive command as a live receipt
#      note    Cap it with `-n`; no aliases, no prompts
#    
#    Connector  ---------------------------------------------------------------
#      when    The number you want is one GET away
#      switch  LIST until the thing isn't in the list -> FETCH by id -> DRILL
#              the path the app's own frame called -> `--grep` to narrow a list
#              or find a leaf

# Every step is one argument longer than the last; the moment a lens shows less than the wire does is the moment to stop scraping.

# STORYTELLING: OPTIONAL, BIG 40K-FOOT VIEW
# ! python scripts/articles/lsa.py -t 1 --reverse --fmt dated-slugs  # <-- ROLLING PIN that gives the 40K foot book-spine view of book-ore (only works for me because of local-only git repo)
# GLOSSARY.md                 # <-- Terms defined like back of J.R.R. Tolkien book, grows as `prompt_foo.py` gets scars and shrinks.
# scripts/articles/lsa.py     # <-- 2ND BRAIN: Search external memory with `rgx`, `rgxc` & `posts` Blogging for Hackers Jekyll-compatible.
# ~/repos/nixos/autognome.py  # <-- Letting the AIs really understand my environment (The Brave Little Tailor punches above Their Weight Class proving the dunning-kruger effect the gate-keeper's (lower-case) lament.)
 
# STILL BIG BUT LESS OPTIONAL (especially flake.nix)
# init.lua                    # <-- Daily driver hot-keys that overlap with aliases in flake.nix. `<leader>m` makes it Science (this process)!
# prompt_foo.py               # <-- THIS SYSTEM
# foo_files.py                # <-- MAIN ROUTER FILE (alternative to this one)
# flake.nix                   # <-- THE ONE BIG THING TO INCLUDE Infrastructure as Code (IaC) tells LLM about your system down to the metal

# TINY BUT EXCELLENT FOR "THIS SYSTEM" CONTEXT (OK to include every time / automatically = `apply.py`, `.gitignore`, `.gitattributes`)
# requirements.in             # <-- All known dependencies and (necessary) version pinning. WORA gotcha's exposed.
# __init__.py                 # <-- Master versioning
# pyproject.toml              # <-- The PyPI Packaging details

# OPTIONAL ACTUATORS (cheap and good to include to expand the AI's capabilities)
# cli.py                      # <-- Catch-all actuator for PyPI envs, Python anchoring, MCP tool-call (plus alternatives) and **kwargs like wrapping for CLI
# scripts/xp.py               # <-- Transforms host OS copy-paste buffer player-piano music into context-payload.
# scripts/ai.py               # <-- How I constantly use local AI to write git commit messages with `m` alias.
# scripts/crawl.py            # <-- Feel free to ask for something to be crawled and included in the next turn.
# scripts/weblogin.py         # <-- Lets the user "warm up" the cache for their web logins at their leisure on a profile that persists.
# scripts/webclip_2_markdown.py  # <-- Surprisingly important program.
 
# MISCELLANEOUS (rare to include but sometimes critical)
# scripts/foo_cartridge.py    # Needs description
# scripts/foo_replay.py       # Needs description
# release.py                  # <-- How everything ends up where it does (GitHub, PyPI, etc.)
# imports/voice_synthesis.py  # <-- The wand can talk to you
# imports/ascii_displays.py   # <-- Where all the ASCII Art lives
# scripts/release/version_sync.py  # <-- Needs to be wrapped into release.py and eliminated, I think.

#                         --- Under this line is were you paste what the AI gives you ---
#                         --- We call it context but it's really just the right-hand  ---
#                         --- blast-radius of the "probes" to make this all science.  ---

# Carry-over as the important work-in-progress parts of the project here just
# like above but not as long-standing overarching to the framework but rather
# for the current hot spots actively being worked on.

# STICKBUG & MOTHER CAT KATA (WORKING ON THE CHAPTER)

# assets/trails/first_context.yaml
# assets/trails/practice.yaml
# assets/trails/public_walk.yaml
# # assets/trails/botify_pageworkers.yaml

# Always include these with whatever connector
# scripts/sources_menu.py
# scripts/connectors/README.md
# scripts/connectors/wallet.py

# scripts/connectors/botify.py
# scripts/connectors/confluence.py
# scripts/connectors/gmail.py
# scripts/connectors/gsc.py
# scripts/connectors/jira.py
# scripts/connectors/mcp.py
# scripts/connectors/mcp_warm.py
# scripts/connectors/sheets.py
# scripts/connectors/slack.py

# The "walk" system is different from the Unix-like tiny connector commands.
# assets/installer/mck.sh
# assets/installer/replay.sh
# scripts/bookmark_import.py
# scripts/walk.py
# scripts/walk_cartridge.py
# scripts/walk_compile.py
# scripts/weblogin.py
# tools/scraper_tools.py
# 
# scripts/mcp_dummy_server.py  
# scripts/boot_menu.py
# scripts/mother_cat.py
# scripts/sources_menu.py

# --- START THIS DISCUSSION ---

# Get things started here! Guess at what context should be included.
# If you get it wrong, you're just wasting 1-turn because the AI will help.
# Un-comment lines, add lines with absolute-path filenames or `! ` commands. 

# Context 1 (Edit-in selections from above and add new files immediately below)
# flake.nix
# assets/installer/install.sh                #  <-- Pipulate.com installer real home in github/pipulate repo
# ~/repos/Pipulate.com/CNAME
# ~/repos/Pipulate.com/_config.yml
# ~/repos/Pipulate.com/_layouts/default.html
# ~/repos/nixos/.gitignore
# assets/installer/mck.sh
# scripts/walk.py
# scripts/mother_cat.py
# assets/trails/public_walk.yaml
# remotes/honeybot/www/npvg.org/index.html
# nixops.sh                                   # <-- You've heard of GitOPs? Well, this is NixOPs. 
# remotes/honeybot/hooks/post-receive         # <-- Ever hear of GitHub Pages? Or github.io? This is that.
# remotes/honeybot/nixos/configuration.nix    # <-- It's as if Pipulate had kids. Spy kids.
# /home/mike/repos/trimnoir/_posts/2026-09-14-wrong-front-door-split-dns-dhcp.md  # [Idx: 1468 | Order: 2 | Tokens: 40,173 | Bytes: 153,970]

# Context 2
# assets/installer/install.sh
# assets/installer/mck.sh
# nixops.sh
# remotes/honeybot/nixos/configuration.nix
# release.py
# config.py
# ! grep -c '^_tpl_name=' assets/installer/install.sh
# ! eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh)"; echo "default=${CUSTOM_NAME:-unset}"
# ! eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh | sed 's/__INSTALL_DEFAULT_NAME__/npvg/g')"; echo "stamped=${CUSTOM_NAME:-unset}"
# ! grep -n 'whitelabel.txt' assets/installer/install.sh
# ! sha256sum assets/installer/install.sh
# ! curl -fsSL --max-time 10 https://npvg.org | sha256sum
# ! curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
# ! ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'bin=$(systemctl cat nginx.service | grep -oE "/nix/store/[^ ]+/bin/nginx" | head -1); echo "bin=$bin"; "$bin" -V 2>&1 | tr " " "\n" | grep -c http_sub_module'

# Context 3
assets/installer/install.sh
remotes/honeybot/nixos/configuration.nix
nixops.sh
! grep -cF 'if [ -n "${1:-}" ]; then' assets/installer/install.sh
! sha256sum assets/installer/install.sh
! grep -c '^ *sub_filter' remotes/honeybot/nixos/configuration.nix
! curl -fsSL --max-time 10 https://npvg.org | grep -c '^_tpl_name='
! curl -fsSL --max-time 10 https://npvg.org | grep -c "^_tpl_name='npvg'"
! eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
! curl -fsSL --max-time 10 https://npvg.org | sed "s/_tpl_name='npvg'/_tpl_name='__INSTALL_DEFAULT_NAME__'/" | sha256sum
! eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"
! curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
! ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'grep -c "^ *sub_filter" /etc/nixos/configuration.nix; sha256sum ~/www/npvg.org/install.sh | cut -c1-8'

# --- END `adhoc.txt` TEMPLATE ---

3: Patches: (the one change between the readings)

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ patch
(nix) pipulate $ app
โœ… DETERMINISTIC PATCH APPLIED: Successfully mutated 'assets/installer/install.sh'.
(nix) pipulate $ d
diff --git a/assets/installer/install.sh b/assets/installer/install.sh
index c75003d5..16562bd8 100644
--- a/assets/installer/install.sh
+++ b/assets/installer/install.sh
@@ -259,10 +259,24 @@ print_separator
 echo
 
 # Before the exec command, add:
-echo "Setting up app identity as '$CUSTOM_NAME'..."
-echo "$CUSTOM_NAME" > "${TARGET_DIR}/whitelabel.txt"
-chmod 644 "${TARGET_DIR}/whitelabel.txt"
-echo "โœ… Application identity set."
+# THE ARGUMENT NAMES THE LABEL; THE DOOR NAMES THE FOLDER (2026-09-14).
+# whitelabel.txt is the app's identity: the banner the flake prints on
+# entry, the server's own name, and the database filenames config.py
+# derives from it. It used to be written from CUSTOM_NAME unconditionally,
+# so a default install from a door that stamps the folder "npvg" would
+# have renamed the app Npvg and its databases with it. Now only an
+# explicit argument writes it. A default install leaves the file absent,
+# and the flake's own first-entry fallback names the app, "Pipulate" for
+# any folder without botify in its name. mck.sh always passes its
+# whitelabel as the argument, so the launcher's lane is unchanged. The
+# explicit path still announces itself; the default path prints nothing
+# here because it did nothing here.
+if [ -n "${1:-}" ]; then
+  echo "Setting up app identity as '$CUSTOM_NAME'..."
+  echo "$CUSTOM_NAME" > "${TARGET_DIR}/whitelabel.txt"
+  chmod 644 "${TARGET_DIR}/whitelabel.txt"
+  echo "โœ… Application identity set."
+fi
 echo
 
 # Creating the 'Double-Click' Actuator
(nix) pipulate $ m
๐Ÿ“ Committing: chore: Refactor installer script to handle custom app identity
[main a173de69] chore: Refactor installer script to handle custom app identity
 1 file changed, 18 insertions(+), 4 deletions(-)
(nix) pipulate $ patch
(nix) pipulate $ app
โœ… DETERMINISTIC PATCH APPLIED: Successfully mutated 'remotes/honeybot/nixos/configuration.nix'.
(nix) pipulate $ d
diff --git a/remotes/honeybot/nixos/configuration.nix b/remotes/honeybot/nixos/configuration.nix
index 15284480..10adcf13 100644
--- a/remotes/honeybot/nixos/configuration.nix
+++ b/remotes/honeybot/nixos/configuration.nix
@@ -285,6 +285,21 @@
               text/html          html;
               text/x-shellscript sh;
           }
+          # THE STAMP (2026-09-14). install.sh carries one contiguous
+          # placeholder for its default folder name and falls back to
+          # "pipulate" when the placeholder arrives untouched. This door
+          # rewrites it to "npvg" in the served body, so one file on disk
+          # installs to ~/npvg from here and to ~/pipulate from the other
+          # door, which has no such filter. sub_filter_types is required
+          # because the module filters text/html alone by default, and the
+          # types block above serves the script as text/x-shellscript.
+          # sub_filter_once off replaces the contiguous spelling wherever
+          # it appears and can never reach the split spelling the script
+          # compares against. Witnessed 2026-09-14: the running
+          # nginx-1.28.0 reports http_sub_module compiled in.
+          sub_filter_types text/x-shellscript;
+          sub_filter_once off;
+          sub_filter '__INSTALL_DEFAULT_NAME__' 'npvg';
           try_files $npvg_index =404;
         '';
       };
(nix) pipulate $ m
๐Ÿ“ Committing: chore: Update Nix configuration with subfilter settings for Honeybot
[main 543fb663] chore: Update Nix configuration with subfilter settings for Honeybot
 1 file changed, 15 insertions(+)
(nix) pipulate $ git push
Enumerating objects: 19, done.
Counting objects: 100% (19/19), done.
Delta compression using up to 48 threads
Compressing objects: 100% (9/9), done.
Writing objects: 100% (11/11), 1.99 KiB | 1.99 MiB/s, done.
Total 11 (delta 6), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (6/6), completed with 5 local objects.
To github.com:pipulate/pipulate.git
   d84b4b35..543fb663  main -> main
(nix) pipulate $ 

I like to keep patches from patches and patches from command-lines separate. The above were the former type and here are the later:

(nix) pipulate $ g

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ ./nixops.sh
๐Ÿš€ Syncing Hooks...
post-receive                                                                                                       100% 3080   541.2KB/s   00:00    
๐Ÿš€ Syncing Scripts (New Location)...
sending incremental file list
deleting __pycache__/score.cpython-313.pyc
deleting __pycache__/forest.cpython-313.pyc
deleting __pycache__/db.cpython-313.pyc
deleting __pycache__/content_loader.cpython-313.pyc
__pycache__/

sent 703 bytes  received 171 bytes  1,748.00 bytes/sec
total size is 190,587  speedup is 218.06
sending incremental file list

sent 69 bytes  received 12 bytes  54.00 bytes/sec
total size is 136,675  speedup is 1,687.35
๐Ÿš€ Syncing NPvg pad (one address, two bodies)...
sending incremental file list

sent 78 bytes  received 12 bytes  180.00 bytes/sec
total size is 1,129  speedup is 12.54
sending incremental file list
install.sh

sent 3,234 bytes  received 173 bytes  6,814.00 bytes/sec
total size is 17,542  speedup is 5.15
๐Ÿš€ Syncing NixOS Config...
sending incremental file list
configuration.nix

sent 1,977 bytes  received 227 bytes  4,408.00 bytes/sec
total size is 23,992  speedup is 10.89
โœ… Sync Complete.
   To apply NixOS config: ssh -t mike@[REDACTED_IP] 'sudo cp ~/nixos-config-staged/* /etc/nixos/ && sudo nixos-rebuild switch'
(nix) pipulate $ ssh -t mike@[REDACTED_IP] 'sudo cp ~/nixos-config-staged/* /etc/nixos/ && sudo nixos-rebuild switch'
[sudo] password for mike: 
building the system configuration...
evaluation warning: The option `services.logind.lidSwitchExternalPower' defined in `/etc/nixos/configuration.nix' has been renamed to `services.logind.settings.Login.HandleLidSwitchExternalPower'.
evaluation warning: The option `services.logind.lidSwitch' defined in `/etc/nixos/configuration.nix' has been renamed to `services.logind.settings.Login.HandleLidSwitch'.
evaluation warning: The option `services.xserver.displayManager.gdm.wayland' defined in `/etc/nixos/configuration.nix' has been renamed to `services.displayManager.gdm.wayland'.
evaluation warning: The option `services.xserver.displayManager.gdm.enable' defined in `/etc/nixos/configuration.nix' has been renamed to `services.displayManager.gdm.enable'.
these 22 derivations will be built:
  /nix/store/0n5r0kddp9c0swa2vn8ssgg75hqp6m06-unit-sleep.target-disabled.drv
  /nix/store/1n01wp078wd0jk574px8wa5d15h9r6kw-stage-2-init.sh.drv
  /nix/store/9ph3i21c3hh19h8jlgk8kgn7yzd6lavv-unit-console-getty.service-disabled.drv
  /nix/store/nzbz4ns89far13bs1am53iv1kw6yniyj-nginx.conf.drv
  /nix/store/yqh56352mwy1d6fnypxn4i1gd5xd4fk9-unit-script-nginx-pre-start.drv
  /nix/store/aw4k5m61gf9cm22ivq1pbdsxslpjkbf3-unit-nginx.service.drv
  /nix/store/jxfyi7i6rf1bq46q492xq7s87m689mpv-unit-pipewire-pulse.service-disabled.drv
  /nix/store/kws2zpry7ck65m16rld9lbiqmqds3mm3-unit-gdm.service-disabled.drv
  /nix/store/mqjhlfli9chchafskj83xz3kdaz7fkn7-unit-suspend.target-disabled.drv
  /nix/store/rxcsin41hxh5i1klya55xrm5xpxcfchi-unit-pipewire.service-disabled.drv
  /nix/store/snd20f9fqhs5nwf3bdql2djc51ssmkiv-unit-wireplumber.service-disabled.drv
  /nix/store/vg524m7j68s0kcsnh6dr1d878gp8ndv1-unit-hibernate.target-disabled.drv
  /nix/store/wajacvwyd18yrzs5aa0j0kgspqvrq377-unit-pipewire-pulse.socket-disabled.drv
  /nix/store/xgs3vk0rz04w9fha3gpshyxwvqvhbf9f-unit-pipewire.socket-disabled.drv
  /nix/store/xzarjdjqkgqmrfjfl76af7jynz87qg22-unit-hybrid-sleep.target-disabled.drv
  /nix/store/3pi1nvgysrpdjhdi25w6a30b2y5jb7id-system-units.drv
  /nix/store/4i717rki4x4qi400f291vw12qf1xi8wn-boot.json.drv
  /nix/store/8y4vn0r0jwxxh6hclxq6nra10bxrjab1-builder.pl.drv
  /nix/store/akc5niqckay2w54cw80my96rzvvqca7m-perl-5.40.0-env.drv
  /nix/store/raigkqwbp4hv2hq5phkyrr7imvy27bz1-check-sshd-config.drv
  /nix/store/wqknqn07nqr89y9siqa5z1h92105qmf5-etc.drv
  /nix/store/42lfbn8fjis4n8dfi1pngyzchq3as86w-nixos-system-honeybot-26.05pre913595.c6245e83d836.drv
these 12 paths will be fetched (0.31 MiB download, 1.85 MiB unpacked):
  /nix/store/3lq26d4nmwgh8cy0h55spgb3bxc7l504-die-hook
  /nix/store/k1wj6h54zcv9ddaws2g9ndy2bzrgjzrp-ensure-all-wrappers-paths-exist
  /nix/store/bbb9bz321p47lj6gnm58arxbwvgzy072-gixy-0.1.21
  /nix/store/6xgfl97mg6mpzaqf3z61a76c8savhg45-lndir-1.0.5
  /nix/store/wxjcx5fis4bygw7bywg2jkjs4cliw3jd-make-binary-wrapper-hook
  /nix/store/6l9mndwn2z52njn5shabyqc3jr3bxmla-make-shell-wrapper-hook
  /nix/store/98hzkapp8ah9dgr2lfkpaxgxkimgiflr-openssh-10.2p1-dev
  /nix/store/ckjj89mbj68kmg0bz8a6wmadwv8vd11b-python3.13-cached-property-2.0.1
  /nix/store/r4zwjx6sadxs11mj3dvbjqnd19v6vmbs-python3.13-configargparse-1.7.1
  /nix/store/vmzbgr569mxslxc27a860d5nzvn1vl7v-python3.13-pyparsing-2.4.7
  /nix/store/br3nr5ymp1p8k9gn9zljmbnsksikj98l-stdenv-linux
  /nix/store/s90xqi84f06y5mpncziw0993xiwwl5wn-xkb-validated
copying path '/nix/store/k1wj6h54zcv9ddaws2g9ndy2bzrgjzrp-ensure-all-wrappers-paths-exist' from 'https://cache.nixos.org'...
copying path '/nix/store/s90xqi84f06y5mpncziw0993xiwwl5wn-xkb-validated' from 'https://cache.nixos.org'...
copying path '/nix/store/3lq26d4nmwgh8cy0h55spgb3bxc7l504-die-hook' from 'https://cache.nixos.org'...
copying path '/nix/store/br3nr5ymp1p8k9gn9zljmbnsksikj98l-stdenv-linux' from 'https://cache.nixos.org'...
copying path '/nix/store/98hzkapp8ah9dgr2lfkpaxgxkimgiflr-openssh-10.2p1-dev' from 'https://cache.nixos.org'...
copying path '/nix/store/6xgfl97mg6mpzaqf3z61a76c8savhg45-lndir-1.0.5' from 'https://cache.nixos.org'...
copying path '/nix/store/ckjj89mbj68kmg0bz8a6wmadwv8vd11b-python3.13-cached-property-2.0.1' from 'https://cache.nixos.org'...
copying path '/nix/store/r4zwjx6sadxs11mj3dvbjqnd19v6vmbs-python3.13-configargparse-1.7.1' from 'https://cache.nixos.org'...
copying path '/nix/store/vmzbgr569mxslxc27a860d5nzvn1vl7v-python3.13-pyparsing-2.4.7' from 'https://cache.nixos.org'...
copying path '/nix/store/wxjcx5fis4bygw7bywg2jkjs4cliw3jd-make-binary-wrapper-hook' from 'https://cache.nixos.org'...
copying path '/nix/store/6l9mndwn2z52njn5shabyqc3jr3bxmla-make-shell-wrapper-hook' from 'https://cache.nixos.org'...
building '/nix/store/4i717rki4x4qi400f291vw12qf1xi8wn-boot.json.drv'...
building '/nix/store/8y4vn0r0jwxxh6hclxq6nra10bxrjab1-builder.pl.drv'...
building '/nix/store/1n01wp078wd0jk574px8wa5d15h9r6kw-stage-2-init.sh.drv'...
building '/nix/store/9ph3i21c3hh19h8jlgk8kgn7yzd6lavv-unit-console-getty.service-disabled.drv'...
building '/nix/store/kws2zpry7ck65m16rld9lbiqmqds3mm3-unit-gdm.service-disabled.drv'...
building '/nix/store/vg524m7j68s0kcsnh6dr1d878gp8ndv1-unit-hibernate.target-disabled.drv'...
building '/nix/store/xzarjdjqkgqmrfjfl76af7jynz87qg22-unit-hybrid-sleep.target-disabled.drv'...
building '/nix/store/jxfyi7i6rf1bq46q492xq7s87m689mpv-unit-pipewire-pulse.service-disabled.drv'...
Running phase: patchPhase
Running phase: updateAutotoolsGnuConfigScriptsPhase
Running phase: configurePhase
no configure script, doing nothing
Running phase: buildPhase
Running phase: checkPhase
Running phase: installPhase
no Makefile or custom installPhase, doing nothing
Running phase: fixupPhase
shrinking RPATHs of ELF executables and libraries in /nix/store/4z0grds97rmripxps6b0kby1fr3g35cp-builder.pl
checking for references to /build/ in /nix/store/4z0grds97rmripxps6b0kby1fr3g35cp-builder.pl...
patching script interpreter paths in /nix/store/4z0grds97rmripxps6b0kby1fr3g35cp-builder.pl
Running phase: patchPhase
Running phase: updateAutotoolsGnuConfigScriptsPhase
Running phase: configurePhase
no configure script, doing nothing
Running phase: buildPhase
Running phase: checkPhase
Running phase: installPhase
no Makefile or custom installPhase, doing nothing
Running phase: fixupPhase
shrinking RPATHs of ELF executables and libraries in /nix/store/22k2cj5ciy3mb7y8xhj6l5027sck6kdk-stage-2-init.sh
checking for references to /build/ in /nix/store/22k2cj5ciy3mb7y8xhj6l5027sck6kdk-stage-2-init.sh...
patching script interpreter paths in /nix/store/22k2cj5ciy3mb7y8xhj6l5027sck6kdk-stage-2-init.sh
copying path '/nix/store/bbb9bz321p47lj6gnm58arxbwvgzy072-gixy-0.1.21' from 'https://cache.nixos.org'...
building '/nix/store/wajacvwyd18yrzs5aa0j0kgspqvrq377-unit-pipewire-pulse.socket-disabled.drv'...
building '/nix/store/rxcsin41hxh5i1klya55xrm5xpxcfchi-unit-pipewire.service-disabled.drv'...
building '/nix/store/xgs3vk0rz04w9fha3gpshyxwvqvhbf9f-unit-pipewire.socket-disabled.drv'...
building '/nix/store/0n5r0kddp9c0swa2vn8ssgg75hqp6m06-unit-sleep.target-disabled.drv'...
building '/nix/store/mqjhlfli9chchafskj83xz3kdaz7fkn7-unit-suspend.target-disabled.drv'...
building '/nix/store/raigkqwbp4hv2hq5phkyrr7imvy27bz1-check-sshd-config.drv'...
building '/nix/store/snd20f9fqhs5nwf3bdql2djc51ssmkiv-unit-wireplumber.service-disabled.drv'...
building '/nix/store/nzbz4ns89far13bs1am53iv1kw6yniyj-nginx.conf.drv'...
building '/nix/store/akc5niqckay2w54cw80my96rzvvqca7m-perl-5.40.0-env.drv'...
created 183 symlinks in user environment
[context]       INFO    Can't find variable 'new_uri'

==================== Results ===================
No issues found.

==================== Summary ===================
Total issues:
    Unspecified: 0
    Low: 0
    Medium: 0
    High: 0

building '/nix/store/yqh56352mwy1d6fnypxn4i1gd5xd4fk9-unit-script-nginx-pre-start.drv'...
building '/nix/store/aw4k5m61gf9cm22ivq1pbdsxslpjkbf3-unit-nginx.service.drv'...
building '/nix/store/3pi1nvgysrpdjhdi25w6a30b2y5jb7id-system-units.drv'...
building '/nix/store/wqknqn07nqr89y9siqa5z1h92105qmf5-etc.drv'...
building '/nix/store/42lfbn8fjis4n8dfi1pngyzchq3as86w-nixos-system-honeybot-26.05pre913595.c6245e83d836.drv'...
activating the configuration...
setting up /etc...
reloading user units for mike...
restarting sysinit-reactivation.target
restarting the following units: nginx.service
the following new units were started: NetworkManager-dispatcher.service
Done. The new configuration is /nix/store/mizdf6qqih4nz4n9ma2i4zm78xp4nll4-nixos-system-honeybot-26.05pre913595.c6245e83d836
Connection to [REDACTED_IP] closed.
(nix) pipulate $ python release.py --skip-version-sync --skip-docs-sync --skip-audit-sync --skip-ai-context-sync --skip-breadcrumb-sync --skip-trifecta-rebuild
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿฐ ASCII Art Wax Seal (your vibe-coding safety-net) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                                                                                                                                                                  โ”‚
โ”‚                         ( Like a canary you say? )                                                                                                                                                               โ”‚
โ”‚                                            O        /)  ____            The "No Problem" Framework                                                                                                               โ”‚
โ”‚ >  I HEREBY WILL NOT RE-GENERATE            o /)\__//  /    \        Pipulate - Protecting Your Code                                                                                                             โ”‚
โ”‚ >  Once upon machines be smarten          ___(/_ 0 0  |      |       just by being honest about text.                                                                                                            โ”‚
โ”‚ >  ASCII sealing immutata art in        *(    ==(_T_)== NPvg |        (If mangled, then AI drifted.)                                                                                                             โ”‚
โ”‚ >  This here cony if it's broken          \  )   ""\  |      |             https://pipulate.com                                                                                                                  โ”‚
โ”‚ >  Smokin gun drift now in token           |__>-\_>_>  \____/                     ๐Ÿฅ•๐Ÿฅ•๐Ÿฅ•                                                                                                                         โ”‚
โ”‚                                                                                                                                                                                                                  โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
๐Ÿ“‹ Current version: 2.55

โญ๏ธ  Skipping version synchronization (--skip-version-sync)

โญ๏ธ  Skipping Waxascii release stamping (--skip-docs-sync)

โญ๏ธ  Skipping AI_CONTEXT.md regeneration (--skip-docs-sync)
โœ… Pushed install.sh update to Pipulate.com repo.

โญ๏ธ  Skipping AUDIT.md synchronization (--skip-audit-sync)

โญ๏ธ  Skipping AI_CONTEXT.md synchronization (--skip-ai-context-sync)

โญ๏ธ  Skipping breadcrumb trail synchronization (--skip-breadcrumb-sync)

โญ๏ธ  Skipping Trifecta derivative rebuilding (--skip-trifecta-rebuild)

โœ… No changes to commit. Your repository is clean.
๐Ÿ’ก Use --force to proceed anyway, or make some changes first.
(nix) pipulate $

Oh and it wants us to do an install now? I feel like that above release step should have been โ€œrealโ€. Letโ€™s make it real.

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ vim __init__.py 
(nix) pipulate $ d
diff --git a/__init__.py b/__init__.py
index 164a665b..0de5cdbb 100644
--- a/__init__.py
+++ b/__init__.py
@@ -12,7 +12,7 @@ Usage:
     pipulate
 """
 
-__version__ = "2.55"
+__version__ = "2.56"
 # APOSTROPHES RESTORED (2026-08-04). They were stripped as a workaround for
 # flake.nix's descMatch regex, whose character class excluded ' from the
 # CAPTURE and truncated the banner to "(So)". That regex was fixed in the same
@@ -23,7 +23,7 @@ __version__ = "2.55"
 # is not a property of the system; the regex is. Blast radius is one banner:
 # nothing but flake.nix reads this name -- version_sync.py syncs __version__
 # and __description__, never this. So'wI' chu' -- "engage the cloaking device."
-__version_description__ = "Messaging Pivot"
+__version_description__ = "NPvg.org Installer Exits"
 # SPDX expression, single source of truth, synced into pyproject.toml by
 # scripts/release/version_sync.py. "-or-later" (not bare AGPL-3.0, which is
 # deprecated SPDX) because the header below grants "any later version".
(nix) pipulate $ m
๐Ÿ“ Committing: fix: bump __version__ to 2.56
[main 45717d36] fix: bump __version__ to 2.56
 1 file changed, 2 insertions(+), 2 deletions(-)
(nix) pipulate $

And then:

(nix) pipulate $ release
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿฐ ASCII Art Wax Seal (your vibe-coding safety-net) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                                                                                                                                                                  โ”‚
โ”‚                         ( Like a canary you say? )                                                                                                                                                               โ”‚
โ”‚                                            O        /)  ____            The "No Problem" Framework                                                                                                               โ”‚
โ”‚ >  I HEREBY WILL NOT RE-GENERATE            o /)\__//  /    \        Pipulate - Protecting Your Code                                                                                                             โ”‚
โ”‚ >  Once upon machines be smarten          ___(/_ 0 0  |      |       just by being honest about text.                                                                                                            โ”‚
โ”‚ >  ASCII sealing immutata art in        *(    ==(_T_)== NPvg |        (If mangled, then AI drifted.)                                                                                                             โ”‚
โ”‚ >  This here cony if it's broken          \  )   ""\  |      |             https://pipulate.com                                                                                                                  โ”‚
โ”‚ >  Smokin gun drift now in token           |__>-\_>_>  \____/                     ๐Ÿฅ•๐Ÿฅ•๐Ÿฅ•                                                                                                                         โ”‚
โ”‚                                                                                                                                                                                                                  โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
๐Ÿ“‹ Current version: 2.56
โœ… Updated pyproject.toml (version and description)
โœ… Pushed AI_CONTEXT.md update to Pipulate.com repo.
[main e178e22c] docs(AI_CONTEXT.md): Update indexed entries and add new links
โœ… Pushed 543fb663..e178e22c  main -> main
Successfully built pipulate-2.56.tar.gz and pipulate-2.56-py3-none-any.whl
๐ŸŽ‰ Published 2.56 -> https://pypi.org/project/pipulate/2.56/

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐ŸŽ‰ Release Pipeline Complete โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                                                                                                                                                                  โ”‚
โ”‚                                                                                           ๐ŸŽ‰ Pipulate Release Summary                                                                                            โ”‚
โ”‚  โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ  โ”‚
โ”‚  โ”‚ Component                                     โ”‚ Details                                                                                                                          โ”‚         Status          โ”‚  โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค  โ”‚
โ”‚  โ”‚ ๐Ÿค– gemma3:latest Message                      โ”‚ docs(AI_CONTEXT.md): Update indexed entries and add new links                                                                    โ”‚    โœจ gemma3:latest     โ”‚  โ”‚
โ”‚  โ”‚                                               โ”‚                                                                                                                                  โ”‚                         โ”‚  โ”‚
โ”‚  โ”‚                                               โ”‚ The number of indexed entries has been updated to 1468. Several new links have been added to the AI_CONTEXT.md file, detailing   โ”‚                         โ”‚  โ”‚
โ”‚  โ”‚                                               โ”‚ various strategies and techniques for AI-readiness within the Pipulate framework.                                                โ”‚                         โ”‚  โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค  โ”‚
โ”‚  โ”‚ ๐Ÿ“ฆ Version                                    โ”‚ 2.56                                                                                                                             โ”‚         โœ… Set          โ”‚  โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค  โ”‚
โ”‚  โ”‚ ๐Ÿš€ PyPI Release                               โ”‚ https://pypi.org/project/pipulate/2.56/                                                                                          โ”‚         โœ… Live         โ”‚  โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค  โ”‚
โ”‚  โ”‚ โฐ Completed                                  โ”‚ 2026-09-14 18:59:21                                                                                                              โ”‚         ๐ŸŽฏ Done         โ”‚  โ”‚
โ”‚  โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ  โ”‚
โ”‚                                                                                                                                                                                                                  โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
๐Ÿ”„ server.py touched; the watchdog restarts the server.
(nix) pipulate $ 

And now we can do our test install:

(sys) ~ $ curl -fsSL https://npvg.org | bash

--------------------------------------------------------------
   ๐Ÿš€ Welcome to the Npvg Installer ๐Ÿš€
   Local-first, Nix-reproducible, and yours to delete.
   A context compiler. Prompt well.
--------------------------------------------------------------

๐Ÿ” Checking prerequisites...
โœ… All required tools found.

๐Ÿ“ Checking target directory: /home/mike/npvg
โœ… Target directory is available.
๐Ÿ“ Creating directory '/home/mike/npvg'
๐Ÿ“ฅ Downloading Pipulate source code...
   -#O=#   #   #                                                               
โœ… Download complete.

๐Ÿ“ฆ Extracting source code...
โœ… Extraction complete. Source code installed to '/home/mike/npvg'.

๐Ÿ“ Now in directory: /home/mike/npvg

๐Ÿ”‘ Fetching the shared deploy key from https://pipulate.com/key.rot...
   (Public, ROT13-encoded, pull-only: it exists so this folder can fetch
    updates without a GitHub account. nix develop decodes it into
    ~/.ssh/id_rsa only if no key is there already.)
โœ… Deploy key downloaded.
๐Ÿ”’ Deploy key saved as .ssh/rot (mode 600).

๐Ÿš€ Starting the Npvg environment...
--------------------------------------------------------------
  Source is in place at: /home/mike/npvg  
  To come back later, run:  
  cd /home/mike/npvg && nix develop -L  
--------------------------------------------------------------

Creating ./run -- a one-file shortcut for the cd-and-nix-develop line above.

Next, nix develop builds the environment and turns this folder into a
git repository (the 'magic cookie' step) so it can auto-update from now on.
๐Ÿš€ Booting the Forever Machine...
Please wait while the Nix environment hydrates...
๐Ÿ”„ Transforming installation into git repository...
Creating temporary clone in /tmp/nix-shell.cMPovt/tmp.VBOtFY2DAA...
Cloning into '/tmp/nix-shell.cMPovt/tmp.VBOtFY2DAA'...
remote: Enumerating objects: 381, done.
remote: Counting objects: 100% (381/381), done.
remote: Compressing objects: 100% (333/333), done.
remote: Total 381 (delta 25), reused 238 (delta 21), pack-reused 0 (from 0)
Receiving objects: 100% (381/381), 3.20 MiB | 13.37 MiB/s, done.
Resolving deltas: 100% (25/25), done.
Preserving app identity and credentials...
Creating backup of current directory in /tmp/nix-shell.cMPovt/tmp.Em6TKWCxjQ...
Moving git repository into place...
โœ… Successfully transformed into git repository!
Original files backed up to: /tmp/nix-shell.cMPovt/tmp.Em6TKWCxjQ
Already up to date.
Found ~/.ssh/id_rsa -- switching the git remote to SSH so auto-updates use it.
INFO: Setting up your personal Playground...
(Nix) 2.25.0pre20240910_b9d3cdfb ยท Python 3.12.13 ยท v2.56 ยท ~/npvg
๐Ÿ”ง Fresh install detected โ€” packages downloading...
โœ… 290 packages ready.
๐Ÿ““ 12 starter file(s) copied into Notebooks/ -- yours to edit.
๐Ÿ›‘ Stopped a Pipulate server that was already running (ports 5001/8888 are shared -- one workshop at a time).
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ nix develop -- a reproducible *nix shell :: pick a door โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                                                                                                   โ”‚
โ”‚  [1]  JupyterLab tab     both servers start; JupyterLab opens in the browser                                                                      โ”‚
โ”‚  [2]  Text Commands      nothing starts -- five words wait at the prompt                                                                          โ”‚
โ”‚  [3]  Pipulate tab       both servers start; the app opens in the browser                                                                         โ”‚
โ”‚                                                                                                                                                   โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ waiting for your choice -- Ctrl+C also drops to the shell โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

[2] Text Commands. Nothing started -- no JupyterLab, no server.

Five words to start from:
  walk      take the guided tour -- public pages, nothing to log into
  sources   see what this shell can reach outside this machine
  brief     compile this workshop into your clipboard for an AI -- the context compiler's first job
  pu        change your mind and start the app server after all
  menu      print this list again once it scrolls away
(nix) npvg $

Wow, impressive. This is much like a calculator. I knew the process but I donโ€™t want to do the math. The AI did the math. The thing about intelligence is that it might actually be the reduction of creativity and unbounded wacky possibilities. The smarter ways to do a thing are the fewer ways to do a thing calculated in a process like this and a sample of which is taken according to temperature from the light-cone of a smallish set of good possible working solutions that satisfy the constraints.

Itโ€™s like with Green Lantern: is it Will Power or is it Creativity? Well, itโ€™s Creativity under the constraint of Will Power. We take the initiative to do a thing. We set context and constraints, and then we creatively probe within those constraints to come up with just one of the many but still vastly fewer than if the world didnโ€™t have strict binary did-it-work yes/no digital thunking actuator rules. Dumber is smarter. Creative constraints boosts the likelihood and effectiveness of creative solutions.

4: Prompt: Rule from the LIVE RECEIPTS, naming the tap for each, and if the pasted caboose belongs to another ride, say so and rule from the Manifest anyway. Probe 1: 1 means Car 2 landed, 0 means it did not, stop there. Probe 2 is the repo digest; if Car 2 landed it must differ from 90be3375, and its value is R for every gate below. Probe 3: 3 means Car 3 landed locally, 0 means it did not. Probe 4: 0 means Car 4โ€™s first command has not run, 1 means the pad holds the new file. Probe 5: 1 means the door is live; 0 with probe 4 at 1 means the config was synced but not activated, and probe 10โ€™s first line says whether it was even copied. Probe 6 must read npvg_door=npvg when probe 5 reads 1, pipulate when 4 reads 1 and 5 reads 0, and unset when 4 reads 0; any other pairing is a finding, name it. Probe 7 must equal R whenever probe 4 reads 1; a different value with 4 at 1 means the door changed more than one token or the pad holds a file the repo does not, and the next probe is a diff of the served body against the repo file. Probe 8 reads pipulate and probe 9 reads R after Car 5, unset and 59244b08 before; a stale pair with Car 5 fired is a Pages lag claimed under the double-tap rule, never a transform. Probe 10: first line 3 after the sudo copy, second line the first eight of R after the sync. If a Car 6 transcript is pasted, read it as the CVR it is: the bannerโ€™s name, the target directory, the whitelabel lineโ€™s absence, the figletโ€™s name, the stopped-server line. If every reading is AFTER, the rideโ€™s stated goal is met and the next beat is the dismount; say so and stop short of it. Do not call the installer proven for strangers. Continue the un-hardwiring ladder for the New-B and close with the five-stage response contract.

5: Deliverables: Deliverable? What deliverable? Itโ€™s just a stick bug.

Fable 5.1 Extra: Context verified. Ten live receipts this compile, every one reading AFTER, and the pasted caboose is the right one this time.

The receipts, tap by tap. Probe 1: hand-run 0, live 1; Car 2 landed. Probe 2: hand-run 90be3375, live 064cad99; that is R, and it differs from the last value as it had to. Probe 3: 0 to 3; Car 3 landed in the repo. Probe 4: 0 to 1; the pad holds the new file, so Car 4โ€™s first command ran. Probe 5: 0 to 1; the door is live, so Car 4โ€™s second command activated the config. Probe 6: unset to npvg_door=npvg, the pairing the caboose required when probe 5 reads 1. Probe 7: 59244b08 to 064cad99, which is R: the served body with its one stamp reversed hashes to the repo file byte for byte, so the door changed exactly one token and nothing else. Probe 8: unset to pipulate_door=pipulate; Car 5 fired and the unstamped placeholder fell back as designed. Probe 9: 59244b08 to 064cad99, R again, with no Pages lag left to claim. Probe 10: 0 and 59244b08 to 3 and 064cad99; the config was copied onto the box and the padโ€™s on-disk file is the repoโ€™s. Ten for ten, no pairing out of place.

The transcripts, read as the recordings they are. nixops.sh listed install.sh and configuration.nix as the files it moved; the four __pycache__ deletions are the churn the routerโ€™s 2026-08-05 todo already names, cosmetic and unchanged. The rebuild built twenty-two derivations including nginx.conf and the nginx unit, gixy reported no issues (its one INFO line about new_uri reads like a linter that cannot follow a map fed by an include, and it is not this rideโ€™s change), and the activation line names nginx.service as the unit restarted, which is the moment probe 5 flipped. The four evaluation warnings about renamed logind and gdm options are pre-existing hygiene, one small car for another day. The publish-only release printed โ€œPushed install.sh update to Pipulate.com repoโ€ and then exited on a clean tree; that is the lane doing its one job and saying so, and it was real for the door. The full 2.56 release afterward was not needed for the door, but it bought a witness for free: the installโ€™s readings line says v2.56, which proves GitHubโ€™s archive endpoint served post-push main at the moment the strangerโ€™s line fetched it.

Car 6, line by line. Banner: โ€œWelcome to the Npvg Installer.โ€ Target: /home/mike/npvg. Where โ€œSetting up app identityโ€ used to print there is now a blank line and then โ€œCreating ./run,โ€ which is the installer half of the label split witnessed on the default path. โ€œStarting the Npvg environment.โ€ The transformation into a git repository, then โ€œFound ~/.ssh/id_rsa,โ€ the own-key branch again, so the cookie decode is still unwitnessed on any machine. Readings line v2.56 ยท ~/npvg, 290 packages, twelve starter files, and the stopped-server line, which was your main workshopโ€™s server, as predicted. The menu, door 2, prompt (nix) npvg $. One thing the transcript cannot say: door 2 never reaches the figlet, so the appโ€™s spoken name under a default npvg install is not in this recording. The file the flake wrote is the cheaper witness, and it is still on disk until you clean up, so it rides as the first probe below, with the reading taken on your BEFORE tap.

The ruling. The goal at the top of this article was two doors, two folders, two uninstall lines. curl -fsSL https://npvg.org | bash landed in ~/npvg, from inside the house, on the LAN that last articleโ€™s split DNS made honest. curl -fsSL https://pipulate.com/install.sh | bash still defaults to pipulate, by probe 8. rm -rf npvg and rm -rf pipulate are therefore the true instructions for the common case. The goal is met by receipts, not memory. What it does not prove: the installer for strangers, because the cookie-decode branch stood behind your own key again, the Nix-not-found branch never fired, and WSL is untouched. The next beat is the dismount, and I stop short of it.

On the calculator. Your framing holds and the receipts are why. A calculator is trusted not because it is creative but because its answer is checkable and its failures are loud, and every probe in this ride was written to be exactly that: a command that prints one thing in the world where the design is right and a different thing in the world where it is wrong. You ran the commands; the world answered. The design itself came out of constraints that were named, not merely present. A piped script cannot know its origin; a doorโ€™s filter replaces every contiguous copy; two files drift. Say those three sentences out loud and the split-literal placeholder is nearly the only shape left, which is your point about the light-cone: the space of working solutions was small, and constraints are what made it small enough to find. The correction I would offer is that โ€œdumber is smarterโ€ describes the actuator, not the designer. The door works because string replacement is stupid and therefore predictable, and the trick works because a predictable thing can be leaned on. The will was yours: which door is the future, that the vessel keeps no passengerโ€™s name, that the app inside keeps its own. The ring does exactly what is willed. Everything creative happened in the room the will left open.


1. PROBES

cat ~/npvg/whitelabel.txt
test -d ~/npvg && echo present || echo absent
curl -s -o /dev/null -w '%{http_code}' --max-time 3 http://localhost:5001; echo
sha256sum assets/installer/install.sh
eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"

Probe 1 carries two readings on purpose. Your hand-run BEFORE tap is the label witness: Pipulate means the flakeโ€™s fallback named the app and the split is witnessed on both sides; npvg or anything else means something wrote the file and the design is wrong. The live AFTER tap, taken after Car 1, is a no-such-file error, which is the cleanup witness. Probe 2 is the same straddle in one word: present before, absent after. Probe 3 reads the side effect the install caused: 000 while your workshopโ€™s server stays down, 200 after Car 2. Probes 4 through 6 are gates for the dismountโ€™s VERIFY: 064cad99, npvg, pipulate, in both worlds.

2. NEXT CONTEXT

assets/installer/install.sh
GLOSSARY.md
foo_files.py
! cat ~/npvg/whitelabel.txt
! test -d ~/npvg && echo present || echo absent
! curl -s -o /dev/null -w '%{http_code}' --max-time 3 http://localhost:5001; echo
! sha256sum assets/installer/install.sh
! eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
! eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"

GLOSSARY.md and foo_files.py ride because the dismountโ€™s BANK cars must anchor on raw source in that context; configuration.nix and nixops.sh have done their work and can leave.

3. PATCHES

No repo patches required. Two actuators, both outside the repoโ€™s files.

Car 1, cleanup. After your hand-run of probe 1.

rm -rf ~/npvg

Car 2, the workshopโ€™s server. From the main workshop shell, since the rehearsal stopped it.

pu

4. PROMPT

Rule from the LIVE RECEIPTS, naming the tap. Probe 1's label reading lives in the operator's BEFORE tap: Pipulate means the flake's fallback named the app and the label split is witnessed on both sides; npvg or any other word is a finding, name what wrote it. Probe 1's LIVE RECEIPT after Car 1 is a no-such-file error and probe 2 reads absent; present with Car 1 fired is a stale tap. Probe 3: 000 before Car 2, 200 after; 000 after means the workshop server was not restarted and nothing else is wrong. Probes 4 through 6 are gates, 064cad99, npvg_door=npvg, pipulate_door=pipulate in both worlds, and any movement is a finding. Then answer the dismount beats exactly as staged below, citing THIS compile's receipts and the four-compile arc: the placeholder, the label split, the door, the two trucks, the stranger's line from inside the house. BANK cars anchor on GLOSSARY.md and foo_files.py in this context. Carry forward as DANGLING, one line each: the cookie-decode branch and the Nix-not-found branch unwitnessed, WSL untouched, the figlet under a default npvg install unseen because door 2 was chosen, the installer's re-run URLs and download prose still naming pipulate.com, mck.sh's own defaults, the pad's index.html owing its rm -rf npvg line, nixops.sh's __pycache__ churn, and the four renamed-option warnings in configuration.nix. Do not call the installer proven for strangers.

5. EXTERNAL DELIVERABLES

None this turn outside the repo. The stick bugโ€™s deliverable is the thing nobody notices: a stranger types one line and gets a folder named after nothing in particular, with the app inside still answering to its own name. The padโ€™s page still owes that stranger the uninstall line, and that is a one-line car for the ride after the dismount.

MikeLev.in:

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: Probe: (BEFORE: hand-run, nothing changed yet)

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ cat ~/npvg/whitelabel.txt
test -d ~/npvg && echo present || echo absent
curl -s -o /dev/null -w '%{http_code}' --max-time 3 http://localhost:5001; echo
sha256sum assets/installer/install.sh
eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"
Pipulate
present
000
064cad99727193726ce4d2092d5cddb6011b0ba2772bc80abb743dbb87315b98  assets/installer/install.sh
npvg_door=npvg
pipulate_door=pipulate
(nix) pipulate $ 

2: Context: (AFTER: the same probes re-run by the compiler as ! lines)

# AD HOC CHOP! The Not-Managed-by-Git Safe-for-Client-Data place. Insert Simpson Couch Gag in white space  below (explain anything to the audience you feel needs it explained)G
# adhoc.txt    _   _   _               ____ _   _  ___  ____  _   
#     / \   __| | | | | | ___   ___   / ___| | | |/ _ \|  _ \| |  And now we start telling the AI a story so it can start telling the New-B's a story.
# ahe/ _ \ / _` | | |_| |/ _ \ / __| | |   | |_| | | | | |_) | |  We should always start with talking about machine rot and pinning a portable subsystem.
# ahc ___ \ (_| | |  _  | (_) | (__  | |___|  _  | |_| |  __/|_|  See this? This is puzzle-solving that humans normally do. The AI is doing it.
#  /_/   \_\__,_| |_| |_|\___/ \___|  \____|_| |_|\___/|_|   (_)  Wow, okay we're getting close. Let's try to wrap-up this article soon.

# To Human: WELCOME TO VIM! It's really NeoVim but I say vim anyway.
# To AI: This is an alternate 40K view to the big book-ore rolling pin spine.

# 1. **Probe**: Baseline Reading
# 2. **Context**: Post-experiment *planned* reading instructions
# 3. **Patch**: The experiment and how to make it happen
# 4. **Prompt**: Post-experiment instructions and how to read results
# 5. **Deliverable**: How the world is forever different moving forward

# The first thing you need to know here is that everything that comes after the
# hash symbol (#) is commented out โ€” and that's EVERYTHING in this file's default
# state. Begin editing-in lines for inclusion as part of the context or adding
# chunks of new context at the bottom. `Ctrl`+`v`, `j` (repeatedly), `l` (to move
# right), `d` (to delete). Reverse that with `Ctrl`+`v`, `j` (repeatedly),
# `Shift`+`i`, `# `, `Esc` to put the hashes back. You can just arrow-key around
# here with `h`, `j`, `k`, `l`. Save-and-quit is a bit tricky because another
# file is also loaded: `Esc`, `:`, `q`, `w`, `!`

# If this is stressing you out and you're a quitter and want to quit, just type:
# `Esc`, `:`, `q`, `!`, `Enter`. That will exit without saving any changes. If
# you want to get over this hump, type: `Esc`, `:`, `T`, `u`, `t`, `o`, `r`, `Enter`.

# This file is just to make it easy having options of what to edit into context.
# You can use whatever text-file you want to stack file-names and commands to
# build an output text-file with the identically stacked output of each file or
# command. In this way we vertically append or "stack" a bunch of text; simple as
# that. If you understand this concept, you're on your way to future-proofing
# yourself in the Age of AI. Congratulations! Here is how to include web pages:

#    !URL  --------------------------------------------------------------------
#      when    Public page; what a stranger or crawler sees; the BEFORE of a
#              login-wall diagnosis
#      switch  It shows a login page -> `warm URL` once, then `?URL`
#    
#    ?URL  --------------------------------------------------------------------
#      when    Anything behind a login, on the site's persistent profile;
#              `check URL` first
#      switch  The lenses show a shell (nav, an `[Iframe]` leaf, no content) ->
#              read the wire truth for the XHR the frame makes, then call that
#              API with a connector
#    
#    @URL  --------------------------------------------------------------------
#      when    Every re-read of a page already scraped; no browser, no network
#      switch  The cached page is stale or was a login wall -> fresh `!` or `?`
#    
#    $URL  --------------------------------------------------------------------
#      when    Exact markup: meta tags, a JSON blob in a `<script>`
#      note    Token-heavy; needs a prior scrape
#    
#    %URL  --------------------------------------------------------------------
#      when    The network log distilled; SPA endpoint discovery
#      switch  It re-serves the wire truth you already have -> the API
#    
#    ! cmd  -------------------------------------------------------------------
#      when    Any bounded, non-interactive command as a live receipt
#      note    Cap it with `-n`; no aliases, no prompts
#    
#    Connector  ---------------------------------------------------------------
#      when    The number you want is one GET away
#      switch  LIST until the thing isn't in the list -> FETCH by id -> DRILL
#              the path the app's own frame called -> `--grep` to narrow a list
#              or find a leaf

# Every step is one argument longer than the last; the moment a lens shows less than the wire does is the moment to stop scraping.

# STORYTELLING: OPTIONAL, BIG 40K-FOOT VIEW
# ! python scripts/articles/lsa.py -t 1 --reverse --fmt dated-slugs  # <-- ROLLING PIN that gives the 40K foot book-spine view of book-ore (only works for me because of local-only git repo)
# GLOSSARY.md                 # <-- Terms defined like back of J.R.R. Tolkien book, grows as `prompt_foo.py` gets scars and shrinks.
# scripts/articles/lsa.py     # <-- 2ND BRAIN: Search external memory with `rgx`, `rgxc` & `posts` Blogging for Hackers Jekyll-compatible.
# ~/repos/nixos/autognome.py  # <-- Letting the AIs really understand my environment (The Brave Little Tailor punches above Their Weight Class proving the dunning-kruger effect the gate-keeper's (lower-case) lament.)
 
# STILL BIG BUT LESS OPTIONAL (especially flake.nix)
# init.lua                    # <-- Daily driver hot-keys that overlap with aliases in flake.nix. `<leader>m` makes it Science (this process)!
# prompt_foo.py               # <-- THIS SYSTEM
# foo_files.py                # <-- MAIN ROUTER FILE (alternative to this one)
# flake.nix                   # <-- THE ONE BIG THING TO INCLUDE Infrastructure as Code (IaC) tells LLM about your system down to the metal

# TINY BUT EXCELLENT FOR "THIS SYSTEM" CONTEXT (OK to include every time / automatically = `apply.py`, `.gitignore`, `.gitattributes`)
# requirements.in             # <-- All known dependencies and (necessary) version pinning. WORA gotcha's exposed.
# __init__.py                 # <-- Master versioning
# pyproject.toml              # <-- The PyPI Packaging details

# OPTIONAL ACTUATORS (cheap and good to include to expand the AI's capabilities)
# cli.py                      # <-- Catch-all actuator for PyPI envs, Python anchoring, MCP tool-call (plus alternatives) and **kwargs like wrapping for CLI
# scripts/xp.py               # <-- Transforms host OS copy-paste buffer player-piano music into context-payload.
# scripts/ai.py               # <-- How I constantly use local AI to write git commit messages with `m` alias.
# scripts/crawl.py            # <-- Feel free to ask for something to be crawled and included in the next turn.
# scripts/weblogin.py         # <-- Lets the user "warm up" the cache for their web logins at their leisure on a profile that persists.
# scripts/webclip_2_markdown.py  # <-- Surprisingly important program.
 
# MISCELLANEOUS (rare to include but sometimes critical)
# scripts/foo_cartridge.py    # Needs description
# scripts/foo_replay.py       # Needs description
# release.py                  # <-- How everything ends up where it does (GitHub, PyPI, etc.)
# imports/voice_synthesis.py  # <-- The wand can talk to you
# imports/ascii_displays.py   # <-- Where all the ASCII Art lives
# scripts/release/version_sync.py  # <-- Needs to be wrapped into release.py and eliminated, I think.

#                         --- Under this line is were you paste what the AI gives you ---
#                         --- We call it context but it's really just the right-hand  ---
#                         --- blast-radius of the "probes" to make this all science.  ---

# Carry-over as the important work-in-progress parts of the project here just
# like above but not as long-standing overarching to the framework but rather
# for the current hot spots actively being worked on.

# STICKBUG & MOTHER CAT KATA (WORKING ON THE CHAPTER)

# assets/trails/first_context.yaml
# assets/trails/practice.yaml
# assets/trails/public_walk.yaml
# # assets/trails/botify_pageworkers.yaml

# Always include these with whatever connector
# scripts/sources_menu.py
# scripts/connectors/README.md
# scripts/connectors/wallet.py

# scripts/connectors/botify.py
# scripts/connectors/confluence.py
# scripts/connectors/gmail.py
# scripts/connectors/gsc.py
# scripts/connectors/jira.py
# scripts/connectors/mcp.py
# scripts/connectors/mcp_warm.py
# scripts/connectors/sheets.py
# scripts/connectors/slack.py

# The "walk" system is different from the Unix-like tiny connector commands.
# assets/installer/mck.sh
# assets/installer/replay.sh
# scripts/bookmark_import.py
# scripts/walk.py
# scripts/walk_cartridge.py
# scripts/walk_compile.py
# scripts/weblogin.py
# tools/scraper_tools.py
# 
# scripts/mcp_dummy_server.py  
# scripts/boot_menu.py
# scripts/mother_cat.py
# scripts/sources_menu.py

# --- START THIS DISCUSSION ---

# Get things started here! Guess at what context should be included.
# If you get it wrong, you're just wasting 1-turn because the AI will help.
# Un-comment lines, add lines with absolute-path filenames or `! ` commands. 

# Context 1 (Edit-in selections from above and add new files immediately below)
# flake.nix
# assets/installer/install.sh                #  <-- Pipulate.com installer real home in github/pipulate repo
# ~/repos/Pipulate.com/CNAME
# ~/repos/Pipulate.com/_config.yml
# ~/repos/Pipulate.com/_layouts/default.html
# ~/repos/nixos/.gitignore
# assets/installer/mck.sh
# scripts/walk.py
# scripts/mother_cat.py
# assets/trails/public_walk.yaml
# remotes/honeybot/www/npvg.org/index.html
# nixops.sh                                   # <-- You've heard of GitOPs? Well, this is NixOPs. 
# remotes/honeybot/hooks/post-receive         # <-- Ever hear of GitHub Pages? Or github.io? This is that.
# remotes/honeybot/nixos/configuration.nix    # <-- It's as if Pipulate had kids. Spy kids.
# /home/mike/repos/trimnoir/_posts/2026-09-14-wrong-front-door-split-dns-dhcp.md  # [Idx: 1468 | Order: 2 | Tokens: 40,173 | Bytes: 153,970]

# Context 2
# assets/installer/install.sh
# assets/installer/mck.sh
# nixops.sh
# remotes/honeybot/nixos/configuration.nix
# release.py
# config.py
# ! grep -c '^_tpl_name=' assets/installer/install.sh
# ! eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh)"; echo "default=${CUSTOM_NAME:-unset}"
# ! eval "$(sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p' assets/installer/install.sh | sed 's/__INSTALL_DEFAULT_NAME__/npvg/g')"; echo "stamped=${CUSTOM_NAME:-unset}"
# ! grep -n 'whitelabel.txt' assets/installer/install.sh
# ! sha256sum assets/installer/install.sh
# ! curl -fsSL --max-time 10 https://npvg.org | sha256sum
# ! curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
# ! ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'bin=$(systemctl cat nginx.service | grep -oE "/nix/store/[^ ]+/bin/nginx" | head -1); echo "bin=$bin"; "$bin" -V 2>&1 | tr " " "\n" | grep -c http_sub_module'

# Context 3
# assets/installer/install.sh
# remotes/honeybot/nixos/configuration.nix
# nixops.sh
# ! grep -cF 'if [ -n "${1:-}" ]; then' assets/installer/install.sh
# ! sha256sum assets/installer/install.sh
# ! grep -c '^ *sub_filter' remotes/honeybot/nixos/configuration.nix
# ! curl -fsSL --max-time 10 https://npvg.org | grep -c '^_tpl_name='
# ! curl -fsSL --max-time 10 https://npvg.org | grep -c "^_tpl_name='npvg'"
# ! eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
# ! curl -fsSL --max-time 10 https://npvg.org | sed "s/_tpl_name='npvg'/_tpl_name='__INSTALL_DEFAULT_NAME__'/" | sha256sum
# ! eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"
# ! curl -fsSL --max-time 10 https://pipulate.com/install.sh | sha256sum
# ! ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'grep -c "^ *sub_filter" /etc/nixos/configuration.nix; sha256sum ~/www/npvg.org/install.sh | cut -c1-8'

# Context 4
assets/installer/install.sh
GLOSSARY.md
foo_files.py
! cat ~/npvg/whitelabel.txt
! test -d ~/npvg && echo present || echo absent
! curl -s -o /dev/null -w '%{http_code}' --max-time 3 http://localhost:5001; echo
! sha256sum assets/installer/install.sh
! eval "$(curl -fsSL --max-time 10 https://npvg.org | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "npvg_door=${CUSTOM_NAME:-unset}"
! eval "$(curl -fsSL --max-time 10 https://pipulate.com/install.sh | sed -n '/^_tpl_name=/,/^CUSTOM_NAME=/p')"; echo "pipulate_door=${CUSTOM_NAME:-unset}"

# --- END `adhoc.txt` TEMPLATE ---

3: Patches: (the one change between the readings)

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ rm -rf ~/npvg
(nix) pipulate $ 

In another terminal from earlier:

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
fatal: Unable to read current working directory: No such file or directory
(nix) npvg $ pu
bash: cd: /home/mike/npvg: No such file or directory
(nix) npvg $ pwd
/home/mike/npvg
(nix) npvg $ exit
exit
(sys) ~ $ ls mike
ls: cannot access 'mike': No such file or directory
(sys) ~ $ 

Right okay, that makes sense. Now from my regular location.

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ rm -rf ~/npvg
(nix) pipulate $ pu
โœ… Data directory ensured at top of script.
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ                                                                                                                                                   โ”ƒ
โ”ƒ                                                      ______________    ____  ________  ______                                                     โ”ƒ
โ”ƒ                                                     / ___/_  __/   |  / __ \/_  __/ / / / __ \                                                    โ”ƒ
โ”ƒ                                                     \__ \ / / / /| | / /_/ / / / / / / / /_/ /                                                    โ”ƒ
โ”ƒ                                                    ___/ // / / ___ |/ _, _/ / / / /_/ / ____/                                                     โ”ƒ
โ”ƒ                                                   /____//_/ /_/  |_/_/ |_| /_/  \____/_/                                                          โ”ƒ
โ”ƒ                                                                                                                                                   โ”ƒ
โ”ƒ                                                                                                                                                   โ”ƒ
โ”ƒ                                                   Pipulate server starting...                                                                     โ”ƒ
โ”ƒ                                                                                                                                                   โ”ƒ
โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿฐ ASCII Art Wax Seal (your vibe-coding safety-net) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                                                                                                   โ”‚
โ”‚                         ( Like a canary you say? )                                                                                                โ”‚
โ”‚                                            O        /)  ____            The "No Problem" Framework                                                โ”‚
โ”‚ >  I HEREBY WILL NOT RE-GENERATE            o /)\__//  /    \        Pipulate - Protecting Your Code                                              โ”‚
โ”‚ >  Once upon machines be smarten          ___(/_ 0 0  |      |       just by being honest about text.                                             โ”‚
โ”‚ >  ASCII sealing immutata art in        *(    ==(_T_)== NPvg |        (If mangled, then AI drifted.)                                              โ”‚
โ”‚ >  This here cony if it's broken          \  )   ""\  |      |             https://pipulate.com                                                   โ”‚
โ”‚ >  Smokin gun drift now in token           |__>-\_>_>  \____/                     ๐Ÿฅ•๐Ÿฅ•๐Ÿฅ•                                                          โ”‚
โ”‚                                                                                                                                                   โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• ๐Ÿ—๏ธ  Pipulate Architecture โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                                                                                                                                                   โ•‘
โ•‘                                         .                                                                                                         โ•‘
โ•‘                                                        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                                            โ•‘
โ•‘                                                        โ”‚         Navigation         โ—„โ”€โ”€ Search, Profiles,                                         โ•‘
โ•‘                                                        โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    Apps, Settings                                          โ•‘
โ•‘                                                        โ”‚               โ”‚             โ”‚                                                            โ•‘
โ•‘                                             Workflow, โ”€โ”€โ–บ   Main Area  โ”‚    Chat     โ”‚                                                            โ•‘
โ•‘                                             App UI     โ”‚   (Pipeline)  โ”‚  Interface โ—„โ”€โ”€ LLM Interaction                                           โ•‘
โ•‘                                                        โ”‚               โ”‚             โ”‚                                                            โ•‘
โ•‘                                                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                                            โ•‘
โ•‘                                                                                                                                                   โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
19:15:52 | INFO     | imports.server_logging | ๐Ÿš€ FINDER_TOKEN: UNIFIED_LOGGING_ACTIVE - Single source of truth logging initialized
19:15:52 | INFO     | imports.server_logging | ๐Ÿ“ FINDER_TOKEN: LOG_ROTATION_READY - Keeping last 10 server runs for debugging context
19:15:52 | INFO     | __main__        | ๐Ÿš€ FINDER_TOKEN: EARLY_STARTUP - Logger initialized, beginning server startup sequence
19:15:52 | INFO     | __main__        | ๐Ÿš€ Running in INFO mode (edit server.py and set DEBUG_MODE=True for verbose logging)
19:15:52 | INFO     | __main__        | ๐Ÿท๏ธ FINDER_TOKEN: APP_CONFIG - App name: Pipulate
19:15:52 | INFO     | __main__        | ๐Ÿ—„๏ธ FINDER_TOKEN: DB_CONFIG - Database filename: data/pipulate_dev.db
19:15:52 | INFO     | __main__        | ๐Ÿค– FINDER_TOKEN: LLM_CONFIG - Max words: 80, Conversation length: 600
19:15:52 | INFO     | __main__        | SSE Broadcaster initialized
19:15:52 | INFO     | __main__        | ๐Ÿ’พ FINDER_TOKEN: DB_WRAPPER - Database wrapper initialized
19:15:52 | INFO     | pipulate.core   | Pipulate initializing in server mode.
Scanning for your preferred local models...
^C^CTraceback (most recent call last):

[All that Ctrl+C stuff replaced]

KeyboardInterrupt

(nix) pipulate $ 

Okay, very nice. An old instance of the project survived while a sibling version was created and deleted. Iโ€™m liking. Weโ€™re skipping stones all over the place as practice here.

4: Prompt: Rule from the LIVE RECEIPTS, naming the tap. Probe 1โ€™s label reading lives in the operatorโ€™s BEFORE tap: Pipulate means the flakeโ€™s fallback named the app and the label split is witnessed on both sides; npvg or any other word is a finding, name what wrote it. Probe 1โ€™s LIVE RECEIPT after Car 1 is a no-such-file error and probe 2 reads absent; present with Car 1 fired is a stale tap. Probe 3: 000 before Car 2, 200 after; 000 after means the workshop server was not restarted and nothing else is wrong. Probes 4 through 6 are gates, 064cad99, npvg_door=npvg, pipulate_door=pipulate in both worlds, and any movement is a finding. Then answer the dismount beats exactly as staged below, citing THIS compileโ€™s receipts and the four-compile arc: the placeholder, the label split, the door, the two trucks, the strangerโ€™s line from inside the house. BANK cars anchor on GLOSSARY.md and foo_files.py in this context. Carry forward as DANGLING, one line each: the cookie-decode branch and the Nix-not-found branch unwitnessed, WSL untouched, the figlet under a default npvg install unseen because door 2 was chosen, the installerโ€™s re-run URLs and download prose still naming pipulate.com, mck.shโ€™s own defaults, the padโ€™s index.html owing its rm -rf npvg line, nixops.shโ€™s pycache churn, and the four renamed-option warnings in configuration.nix. Do not call the installer proven for strangers.

5: Deliverables: By Jove! I think itโ€™s this.

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 adhoc.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: the artifact of record is the cartridge THIS compile writes after this payload is assembled, so its name is not in your context and you must not guess one. Attest the FINGERPRINT instead: this Manifestโ€™s wc -c line, its receipt count, and the newest receiptโ€™s date โ€“ pure functions of the bytes the cartridge seals. Close with one line the operator completes after the compile: Deed: foo-________.zip (ls -t foo-*.zip | head -1) The seal is the signature; the fingerprint is how the deed is found.

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.

Note: The Lambda Calculator we call Fable 5.1 used 7 minutes and 20 seconds with the following thinking:

Structuring a multi-part response with several sections.

Cross-checking command receipts against the label evidence.

Confirming the uninstall sequence matches the stated goal.

Counting existing receipt lines before adding a new entry.

Tallying wrapped receipt lines against the twenty-line cap.

Deciding how to trim the receipts block to fit.

Recounting entries to reconcile the total against the cap.

Planning which trailing receipt lines to trim.

Verifying deletion mechanics before removing exact receipt lines.

Choosing a safer way to log the receipt without risky copying.

Weighing whether a rule or pattern deserves its own glossary entry.

Finding a safe anchor line to insert the new entry.

Weighing formatting risks around blank lines and exact indentation.

Locating a unique anchor line for the new rule entry.

Verifying an old safety earmark is now discharged.

Weighing whether the safety fix was properly verified.

Working out how to delete the block without stray blank lines.

Deciding how to safely include a special character in the match.

Cataloguing remaining open items before writing the new entry.

Assembling the deed and commit references for the entry.

Reading the deed name directly off the seal footer.

Drafting a neutral summary and verifying goals against receipts.

Drafting the full receipt line and checking cap overflow.

Drafting the glossary entry describing the substitution mechanism.

Elaborating the mechanism and its predicted proofs in detail.

Working out a safe deletion of the earmark block.

Avoiding stray blank lines when removing the block.

Weighing whether the earmark's gate was truly witnessed.

Shrinking the earmark into a one-line dated TODO.

Planning the next probe set for remaining checks.

Listing unresolved branches and gaps before wrapping up.

Cataloguing remaining unresolved items across each rung.

Drafting the receipt insertion patch line by line.

Verifying uniqueness of each search anchor before patching.

Drafting the summary and verification checklist for the closing section.

Weaving storytelling metaphors into the glossary entry's mechanism.

Explaining why URL rewrites must target their own placeholder.

Finalizing the receipt line and flagging unwitnessed branches.

Recounting the receipt block lines one more time.

Verifying probe commands and their expected match counts.

Drafting the closing ruling paragraph and final response structure.

Drafting the TL;DR summary and verification section text.

Verifying every command receipt against the compile evidence.

Drafting the notarization fingerprint and locating the deed name.

Verifying the safety patch text against the payload exactly.

Wrapping the glossary entry with careful line-width checks.

Fable 5.1 Extra: Context verified. Six live receipts this compile, and the one that mattered most rode in your hands rather than the compilerโ€™s. Probe 1, BEFORE tap: Pipulate, capital P. That is the flakeโ€™s writer, not the installerโ€™s: the installer writes the lowercase word it was handed, and on the default path it was handed nothing, so the label split is witnessed on both sides in one word. Probe 1, live: no such file. Probe 2: absent. The cleanup landed. Probe 3: 000 on both taps; your transcript shows pu starting and being interrupted at model scanning, so the server was never listening at compile time and nothing else is wrong. Probes 4 through 6: 064cad99, npvg_door=npvg, pipulate_door=pipulate, no movement. The transcriptโ€™s one surprise is a shell standing in a folder that no longer existed, printing the address it remembered; bash caches PWD, and git, asked to read it, could not.


1. VERIFY. The goal at the top: curl -fsSL https://npvg.org | bash lands in ~/npvg, curl -fsSL https://pipulate.com/install.sh | bash keeps landing in ~/pipulate, so rm -rf npvg and rm -rf pipulate are the uninstall lines, and the word leaves the default folder while the FastHTML app keeps its name. Met, by receipt. This compile: npvg_door=npvg and pipulate_door=pipulate evaluated from the two served bodies; 064cad99 for the repo file, the same value the previous compile read at all three projections; your BEFORE tap Pipulate in ~/npvg/whitelabel.txt, written by the flake because the installer wrote nothing; present then absent across rm -rf ~/npvg, the uninstall line witnessed literally. Previous compile, same files: the served npvg body with its one token reversed hashed to R, so the door changed one token and nothing else; the padโ€™s on-disk copy matched; the strangerโ€™s line printed the Npvg banner, /home/mike/npvg, no app-identity line, v2.56, 290 packages. Your pu afterward read App name: Pipulate and data/pipulate_dev.db for the main workshop, untouched by a siblingโ€™s birth and deletion. Ignitions: every one the ride needed fired and was recorded, ./nixops.sh, nixos-rebuild switch (22 derivations, nginx.service restarted), the publish-only release lane, the full 2.56 release, the install itself. The only started-and-abandoned actuator is pu, interrupted by your own hand, which the ride did not require. Not proven and not claimed: the installer for strangers. Every install so far read โ€œFound ~/.ssh/id_rsa,โ€ the Nix-not-found branch never fired, WSL never ran, and door 2 never reaches the figlet.

2. BANK. Four cars, each its own commit story: the receipt, the key, the value, and a discharged earmark shrunk to its remaining gate.

Car 1, the receipt. One line, tail-appended under the blockโ€™s marker; the block read 25 lines in this payload and reads 26 after.

Target: foo_files.py
[[[SEARCH]]]
# --- START RECEIPTS (newest first; cap 20 lines; a line pushed past the cap is deleted, never moved -- git and the rolling pin are the archive) ---
[[[DIVIDER]]]
# --- START RECEIPTS (newest first; cap 20 lines; a line pushed past the cap is deleted, never moved -- git and the rolling pin are the archive) ---
# 2026-09-14 dismount THE DOOR NAMES THE FOLDER (four compiles ending at deed 1391; commits d84b4b35, a173de69, 543fb663, 45717d36; PyPI 2.56): one installer, two addresses, two default folders. install.sh carries __INSTALL_DEFAULT_NAME__ and compares it against the same word spelled in two halves; npvg.org's nginx (http_sub_module compiled into the running 1.28.0, count 1 on both taps) stamps it to npvg with sub_filter_types text/x-shellscript and sub_filter_once off; pipulate.com serves the file untouched and the fallback stays pipulate. The label split rode the same file: only an explicit argument writes whitelabel.txt, so a default install lets the flake name the app. Both trucks fired (nixops.sh, then nixos-rebuild switch building 22 derivations and restarting nginx.service; the publish-only release lane, then a full 2.56 release), three digests agreed at 064cad99, and the round-trip gate held: the served npvg body with its one token reversed hashes to the repo file. From inside the house on the split-DNS LAN, curl -fsSL https://npvg.org | bash landed in ~/npvg, printed no app-identity line, read v2.56 and 290 packages, and the flake wrote whitelabel.txt reading Pipulate (the capital names the writer); rm -rf ~/npvg read present -> absent and the main workshop came back as App name: Pipulate, data/pipulate_dev.db. A caboose from another ride was pasted once and ruled around from the Manifest. UNWITNESSED: the cookie-decode and Nix-not-found branches, WSL, the figlet under a default npvg install (door 2 chosen). This block reads 26 lines against its cap of 20; the next forget ride fades six.
[[[REPLACE]]]

Car 2, the key. Tail-appended after the newest banked key so the recent bankings stay together.

Target: foo_files.py
[[[SEARCH]]]
Sibling of DELTA-NOT-ABSOLUTE.
[[[DIVIDER]]]
Sibling of DELTA-NOT-ABSOLUTE.
# ยง THE DOOR NAMES THE FOLDER (banked 2026-09-14) -- a script arriving through a pipe cannot learn which address served it ($0 is the word bash and the pipe carries no address), and two copies of one file drift, so the DOOR names the default: the body carries one contiguous placeholder, the door that wants a different default stamps it with nginx sub_filter (sub_filter_types for the served MIME type, sub_filter_once off), and the script tells stamped from unstamped by comparing against the same word spelled in two halves, which no substitution can reach. Gate every door with the round trip: reverse the one token in the served body and the hash must equal the repo file. A URL stamp needs its own placeholder, never a hostname rewrite, because KEY_URL stays at the old door on purpose. Witnessed 2026-09-14: npvg_door=npvg, pipulate_door=pipulate, 064cad99 on both sides. Sibling of THE WRITE-SIDE / READ-SIDE SPLIT: the folder and the app label were one string answering two questions.
[[[REPLACE]]]

Car 3, the value. Alphabetical with โ€œTheโ€ ignored, so it lands between The Displacement Receipt and The Dotfile-Blind Probe, anchored on the last line of the former.

Target: GLOSSARY.md
[[[SEARCH]]]
  delta, with no probe asked to look.
[[[DIVIDER]]]
  delta, with no probe asked to look.
- **The Door Names the Folder** โ€” *serve-time placeholder substitution with a
  substitution-proof sentinel.* Banked 2026-09-14, receipt-witnessed across
  four compiles. THE ASK: one installer that lands in ~/npvg from npvg.org
  and in ~/pipulate from pipulate.com, so the uninstall line is rm -rf on
  the folder the door named. TWO WRONG DESIGNS, written down so nobody
  re-derives them: two files (two authorities for one thing drift, and the
  three-digest gate that proves both doors current breaks by construction),
  and origin detection inside the script (a piped script is anonymous --
  $0 is the word bash, and the pipe carries no address). THE MECHANISM: the
  script carries one contiguous placeholder and a fallback; the door that
  wants a different default rewrites the placeholder in the served body
  with nginx sub_filter -- sub_filter_types naming the served MIME type,
  because the module filters text/html alone by default, and
  sub_filter_once off so every contiguous copy is stamped -- and the script
  tells stamped from unstamped by comparing the placeholder against the
  SAME WORD SPELLED IN TWO HALVES, glued by the shell at run time, which no
  substitution can see as one word. mck.sh carried the trick for its trail
  name since v0.2.0; install.sh carries it for the folder since 2026-09-14.
  RENT THIS PAYS, two predictions: the same bytes on disk evaluate to
  different defaults through different doors (npvg_door=npvg,
  pipulate_door=pipulate), and THE ROUND-TRIP GATE holds -- the served
  body with its one token reversed hashes to the repository file, which
  proves the door changed one token and nothing else (064cad99 on both
  sides). DEPLOYED IS A PROPERTY OF EACH DOOR, never of a commit: the
  repo digest moved one compile before either door's did, because each
  door has its own truck (release.py to Pages, nixops.sh plus
  nixos-rebuild switch to the pad), and the honest way to call a door
  current is to fetch from it and hash what arrived. A URL stamp wants its
  OWN placeholder: a hostname rewrite would also move KEY_URL, which lives
  at the old door on purpose. SIBLING of THE WRITE-SIDE / READ-SIDE SPLIT:
  the folder name and the app label were one string answering two
  questions, and the same ride split them -- an explicit argument names
  the label, the door names the folder, and a default install leaves
  whitelabel.txt to the flake, whose capitalized spelling then names the
  writer (the receipt read Pipulate, capital P, in a folder named npvg).
[[[REPLACE]]]

Car 4, the earmark. Its mechanism is in this compileโ€™s install.sh (the main() wrapper and the brace-group call line, dated 2026-09-13) and npvg.org now serves the one-liner it was owed before, so the seven lines shrink to the one gate that has no receipt in the router.

Target: foo_files.py
[[[SEARCH]]]
# EARMARK โ€” CURL-PIPE TRUNCATION SAFETY. assets/installer/install.sh runs
# top-to-bottom, so a download truncated mid-transfer executes a PARTIAL script:
# it can mkdir the target, half-fetch a key, and exit clean. Wrap the body in
# main() { ... } with main "$@" as the last line, so a truncation can only ever
# fail to define main and nothing runs. Gate on `bash -n` of a truncated copy
# exiting NONZERO -- today it exits zero, which is the whole defect. Owed before
# npvg.org serves a one-liner to strangers.
[[[DIVIDER]]]
# - TODO (2026-09-14): CURL-PIPE TRUNCATION SAFETY landed in source 2026-09-13 (install.sh: the main() wrapper plus the brace-group call line) and npvg.org now serves the one-liner; its gate, bash -n on a truncated copy exiting NONZERO, has no receipt in this router; take it once and delete this line.
[[[REPLACE]]]

Deltas, counted from the blocks as emitted: foo_files.py +1, +1, and 7 to 1 for โˆ’6, net โˆ’4 lines; GLOSSARY.md +34 lines. patch, app, d, m per car; no ignition, the files are read at call time.

3. DANGLING.

  • The cookie-decode branch: every install on any machine has read โ€œFound ~/.ssh/id_rsaโ€; the ROT13 key has never been decoded by a strangerโ€™s shell.
  • The Nix-not-found branch has never fired, and its re-run line sends a stamped stranger back to pipulate.com with bash -s npvg.
  • WSL is untouched.
  • The figlet under a default npvg install is unseen; door 2 was chosen, and the Pipulate file is the proxy.
  • Rung three: install.shโ€™s not-bash lines, the Nix-not-found re-run, the โ€œchoose a different nameโ€ hint, and the download prose still name pipulate.com and Pipulate; the URL stamp needs its own placeholder, because KEY_URL names the same host and must not move.
  • Rung four: mck.shโ€™s WHITELABEL and INSTALL_URL defaults, and its header documenting a /mck/<trail> route that configuration.nix does not declare.
  • Rungs five and six, ~/.config/pipulate and the PIPULATE_*, package, org, and PyPI names, stay deliberate decisions, not sweeps.
  • The padโ€™s index.html owes its stranger the rm -rf npvg line.
  • nixops.shโ€™s __pycache__ churn, four deletions per deploy, the 2026-08-05 todo unchanged.
  • The four renamed-option warnings in configuration.nix, two logind and two gdm, one hygiene car.
  • The receipts block reads 26 after Car 1 against its cap of 20; the next forget fades six.
  • The truncation gate, bash -n on a cut copy exiting nonzero, Car 4โ€™s one remaining line.

4. SEED. Rung three and the padโ€™s page, with the census that gates the URL-stamp design and the doorโ€™s directive count as its gate.

# Context 5 (rung three: the re-run address rides the door; the pad's page owes rm -rf npvg)
assets/installer/install.sh
assets/installer/mck.sh
remotes/honeybot/www/npvg.org/index.html
remotes/honeybot/nixos/configuration.nix
nixops.sh
! grep -n 'pipulate.com' assets/installer/install.sh
! grep -n 'pipulate.com' assets/installer/mck.sh
! grep -c 'rm -rf' remotes/honeybot/www/npvg.org/index.html
! curl -fsSL --max-time 10 -A Mozilla https://npvg.org | grep -c 'rm -rf npvg'
! ssh -o BatchMode=yes -o ConnectTimeout=5 honeybot 'grep -c "^ *sub_filter" /etc/nixos/configuration.nix'

5. CLOSING. The stick bugโ€™s whole trick is that nobody notices it, and a folder is the first thing anyone notices. For a year the folder said the name of one passenger. Now it says the name of the vessel, and the passenger still answers to its own name from inside. Nothing about that required cleverness in the script; it required saying three constraints out loud (a piped script is anonymous, a doorโ€™s filter is stupid and therefore trustworthy, two files drift) and noticing that they left exactly one shape standing. The receipts did the rest: a hash that agreed three times, a word that read differently through two doors, a file the installer did not write and the flake did.

The moment worth keeping from the transcript is the smallest one. After rm -rf ~/npvg, the shell that had been standing in that folder still printed its address; bash remembered a place that had stopped existing, and git, asked to read it, could not. That is the Forever Machine in one frame. The machine is not the folder. The folder is a place the description was instantiated for an afternoon, gone by evening with nothing lost, because the description lives in a lock file, a flake, and this repository, and the next instantiation is one line away. Stones skipped for practice, as you said. Chapter 1 called it a Software Von Neumann Probe; this ride showed the probe landing under an assumed name and lifting off again without a trace, which is the only kind of landing a stick bug is allowed.

6. NOTARIZE. Fingerprint of this payload, pure functions of the bytes the cartridge seals: the Summary reads Total Bytes 650,629 (UTF-8), Total Chars 641,796, Verified Tokens 161,604; the Manifest lists six LIVE COMMAND RECEIPTS; the receipts carry no dates (the 2026-09-06 NOTARY FINGERPRINT todo stands), and the newest dated line in the payload is Telemetryโ€™s AI_CONTEXT.md header, auto-generated 2026-09-14. The deed rides the seal footer beneath this payload, the one place its name can live without changing the bytes it names, and it is read from there rather than guessed:

Deed: foo-7c460da6-1391.zip (cross-check: ls -t foo-*.zip | head -1 prints the same name)

MikeLev.in: And Iโ€™ll bank the learning winnings.

(nix) pipulate $ g

Blast Radius Check to establish bisection Left-hand Causal Boundary. It is a Popper-thing. Science.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
(nix) pipulate $ patch
(nix) pipulate $ app
โœ… DETERMINISTIC PATCH APPLIED: Successfully mutated 'foo_files.py'.
(nix) pipulate $ d
diff --git a/foo_files.py b/foo_files.py
index 0a067fe7..d787ed9b 100644
--- a/foo_files.py
+++ b/foo_files.py
@@ -128,6 +128,7 @@ AI_PHOOEY_CHOP = r"""#
 # --- END STATS ---
 
 # --- START RECEIPTS (newest first; cap 20 lines; a line pushed past the cap is deleted, never moved -- git and the rolling pin are the archive) ---
+# 2026-09-14 dismount THE DOOR NAMES THE FOLDER (four compiles ending at deed 1391; commits d84b4b35, a173de69, 543fb663, 45717d36; PyPI 2.56): one installer, two addresses, two default folders. install.sh carries __INSTALL_DEFAULT_NAME__ and compares it against the same word spelled in two halves; npvg.org's nginx (http_sub_module compiled into the running 1.28.0, count 1 on both taps) stamps it to npvg with sub_filter_types text/x-shellscript and sub_filter_once off; pipulate.com serves the file untouched and the fallback stays pipulate. The label split rode the same file: only an explicit argument writes whitelabel.txt, so a default install lets the flake name the app. Both trucks fired (nixops.sh, then nixos-rebuild switch building 22 derivations and restarting nginx.service; the publish-only release lane, then a full 2.56 release), three digests agreed at 064cad99, and the round-trip gate held: the served npvg body with its one token reversed hashes to the repo file. From inside the house on the split-DNS LAN, curl -fsSL https://npvg.org | bash landed in ~/npvg, printed no app-identity line, read v2.56 and 290 packages, and the flake wrote whitelabel.txt reading Pipulate (the capital names the writer); rm -rf ~/npvg read present -> absent and the main workshop came back as App name: Pipulate, data/pipulate_dev.db. A caboose from another ride was pasted once and ruled around from the Manifest. UNWITNESSED: the cookie-decode and Nix-not-found branches, WSL, the figlet under a default npvg install (door 2 chosen). This block reads 26 lines against its cap of 20; the next forget ride fades six.
 # 2026-09-13 dismount THE ACME CAR AND THE CELLULAR WITNESS (three compiles, deeds 1369 through 1371; commit c6773ca6): two of four inherited probes died at curl 49 in both lanes because a redaction placeholder from the published article rode into --resolve, so every later probe derived its address or routed through a name (ssh alias, loopback with --resolve, a dig verdict line) and no literal was ever spelled. One car, forceSSL plus enableACME, the shared acme-challenge webroot by module default; displacement predicted +5 read +6 (seventeen comment lines counted as sixteen) while the commit arithmetic +19/-13 agreed with the receipt. nixos-rebuild switch started acme-npvg.org.service, the order unit and the renew timer; loopback TLS on both names read CN=npvg.org, a Let's Encrypt issuer, verified, HTTP/2 200 text/x-shellscript; port 80 read 301 for both names. The outside witness was a cellular Safari GET tagged acme-1369 over HTTP/2.0 answered 200 at 09:09:43 EDT from a carrier address, tag_hits=2 with the favicon 404 carrying the tag as its referer. Seam census 301=2/200=0 in the shared log against 0/14 in the pad's, the 200 column climbing +2 per compile from the census's own TLS probe. Timer Mon 05:06 EDT, certificate expires Dec 12. The trace-trips-the-guard hypothesis was falsified: two later payloads carried the fifty-line trace and neither paused. The phone step was caught because it rode labeled at the top of PROBES. Fable 5.1 answered every ride after the first anvil.
 # 2026-09-08 dismount THE MATRIX CROSSED THE MACHINE (four compiles ending at deed 1287; nixos bccc8ee, 9b1d92a, 230c64c, acdde0d, 4682a2a): bookmarks.nix is pure data that scripts/bookmarks_sync.py evaluates at call time with nix-instantiate --eval --strict --json, so a checkout plus Nix is the deployment on NixOS and macOS alike and the bookmarks.json stage, its activation script and the n behind it are gone (import grep 1 -> 0, the JSON rm'd, five-on-five IN_SYNC on both sides of the change; one n fired to retire the module). THE SECOND CANDIDATE CONVICTED THE KEY: the Mac's first --inspect read "Profile 2" as the PERSONAL profile (Mike, 121 synced bookmarks) with the Work profile in "Profile 1" labeled botify.com, so a directory key in a shared file named the wrong profile on the second machine and only the sync_metadata fence stood between a real run and a personal bar; keys are now human names with a match list of identities read from Local State, and one file resolved to Profile 2 on NixOS and Profile 1 on the Mac by receipt (domain=botify.com printed on both). Mac lane, operator's paste: SingletonCookie, SingletonLock -> host-pid and SingletonSocket present with a window open and absent with Chrome quit, pgrep and the lock naming the same pid 23555, dry-run REFUSED_CHROME_RUNNING, then Work=WRITTEN five over an empty bar with the backup first, and the operator saw the bar. Labels caught up in the fourth compile (RECALLED grep 1 -> 0, autognome comment 0 -> 1, code receipts byte-identical). A head -c probe with no trailing newline glued the next probe's 0 onto its JSON in the hand-run paste; the compile lane separates receipts by construction, so that stays a receipt. UNWITNESSED: the Mac's post-reopen IN_SYNC, an entry carrying description, and init's hook, which has never run.
 # 2026-09-08 dismount THE BOOKMARK PROJECTION (five compiles, deeds 1278 through
(nix) pipulate $ m
patch
app๐Ÿ“ Committing: chore: Remove redundant comments and cleanup code in foo_files.py
[main dfa15764] chore: Remove redundant comments and cleanup code in foo_files.py
 1 file changed, 1 insertion(+)
(nix) pipulate $ patch
(nix) pipulate $ app
โœ… DETERMINISTIC PATCH APPLIED: Successfully mutated 'foo_files.py'.
(nix) pipulate $ d
diff --git a/foo_files.py b/foo_files.py
index d787ed9b..4742306e 100644
--- a/foo_files.py
+++ b/foo_files.py
@@ -1104,6 +1104,7 @@ AI_PHOOEY_CHOP = r"""#
 # ยง THE OUT-OF-BAND STEP RULE (banked 2026-09-13) -- a hand step the terminal cannot take (a phone, a vendor console, a registrar) rides at the TOP of PROBES under a capitalized label, lettered, with its one address in its own fence and the expected screen stated in words; the compile's ! line reads a tag minted in the caboose and never repeats the visit. Conviction: three cellular witnesses across two articles, all caught because the block could not be scrolled past; a step folded into prose is a step the muscle memory rolls over. Sibling of ONE-FENCE-PER-HAND-STEP.
 # ยง THE PLACEHOLDER THAT RIDES INTO A PROBE (banked 2026-09-13) -- a redaction placeholder quoted from a published article into a paste-ready command dies at argument parsing (curl 49, both lanes, twice) and the real address is not the cure, because the next publish scrubs it and the next model re-quotes it; derive the address, route through a name, or print a verdict token instead of a value, so the probe survives every lane it will be read in. Checklist item 6 was already the rule; the emitter broke it and the instrument caught it. Sibling of NO PLACEHOLDERS IN PASTE-READY LINES.
 # ยง COUNT THE REPLACE AFTER YOU WRITE IT (banked 2026-09-13) -- a displacement predicted from a draft read +5 and the receipt read +6 because the emitted comment was seventeen lines counted as sixteen; the interlock landed the block exactly and the commit arithmetic convicted the predictor. Predict deltas from the block as emitted, never from the block as imagined. Sibling of DELTA-NOT-ABSOLUTE.
+# ยง THE DOOR NAMES THE FOLDER (banked 2026-09-14) -- a script arriving through a pipe cannot learn which address served it ($0 is the word bash and the pipe carries no address), and two copies of one file drift, so the DOOR names the default: the body carries one contiguous placeholder, the door that wants a different default stamps it with nginx sub_filter (sub_filter_types for the served MIME type, sub_filter_once off), and the script tells stamped from unstamped by comparing against the same word spelled in two halves, which no substitution can reach. Gate every door with the round trip: reverse the one token in the served body and the hash must equal the repo file. A URL stamp needs its own placeholder, never a hostname rewrite, because KEY_URL stays at the old door on purpose. Witnessed 2026-09-14: npvg_door=npvg, pipulate_door=pipulate, 064cad99 on both sides. Sibling of THE WRITE-SIDE / READ-SIDE SPLIT: the folder and the app label were one string answering two questions.
 
 # STORY ENGINE
 # Mike-E's gift is associative reach; his flaw is letting every spark become canon.
(nix) pipulate $ m
๐Ÿ“ Committing: chore: Refactor: Clarify DOOR naming convention in AI_PHOOEY_CHOP
[main 3db2c1c2] chore: Refactor: Clarify DOOR naming convention in AI_PHOOEY_CHOP
 1 file changed, 1 insertion(+)
(nix) pipulate $ patch
(nix) pipulate $ app
โœ… DETERMINISTIC PATCH APPLIED: Successfully mutated 'GLOSSARY.md'.
(nix) pipulate $ d
diff --git a/GLOSSARY.md b/GLOSSARY.md
index f1b20681..c7ecd06f 100644
--- a/GLOSSARY.md
+++ b/GLOSSARY.md
@@ -605,6 +605,41 @@ Entries are alphabetical, numbers spelled as spoken.
   trusts afterward. Witnessed unsolicited at strikes one and two of the
   KEY/VALUE ride: git diff hunk headers displaced by exactly the top-of-file
   delta, with no probe asked to look.
+- **The Door Names the Folder** โ€” *serve-time placeholder substitution with a
+  substitution-proof sentinel.* Banked 2026-09-14, receipt-witnessed across
+  four compiles. THE ASK: one installer that lands in ~/npvg from npvg.org
+  and in ~/pipulate from pipulate.com, so the uninstall line is rm -rf on
+  the folder the door named. TWO WRONG DESIGNS, written down so nobody
+  re-derives them: two files (two authorities for one thing drift, and the
+  three-digest gate that proves both doors current breaks by construction),
+  and origin detection inside the script (a piped script is anonymous --
+  $0 is the word bash, and the pipe carries no address). THE MECHANISM: the
+  script carries one contiguous placeholder and a fallback; the door that
+  wants a different default rewrites the placeholder in the served body
+  with nginx sub_filter -- sub_filter_types naming the served MIME type,
+  because the module filters text/html alone by default, and
+  sub_filter_once off so every contiguous copy is stamped -- and the script
+  tells stamped from unstamped by comparing the placeholder against the
+  SAME WORD SPELLED IN TWO HALVES, glued by the shell at run time, which no
+  substitution can see as one word. mck.sh carried the trick for its trail
+  name since v0.2.0; install.sh carries it for the folder since 2026-09-14.
+  RENT THIS PAYS, two predictions: the same bytes on disk evaluate to
+  different defaults through different doors (npvg_door=npvg,
+  pipulate_door=pipulate), and THE ROUND-TRIP GATE holds -- the served
+  body with its one token reversed hashes to the repository file, which
+  proves the door changed one token and nothing else (064cad99 on both
+  sides). DEPLOYED IS A PROPERTY OF EACH DOOR, never of a commit: the
+  repo digest moved one compile before either door's did, because each
+  door has its own truck (release.py to Pages, nixops.sh plus
+  nixos-rebuild switch to the pad), and the honest way to call a door
+  current is to fetch from it and hash what arrived. A URL stamp wants its
+  OWN placeholder: a hostname rewrite would also move KEY_URL, which lives
+  at the old door on purpose. SIBLING of THE WRITE-SIDE / READ-SIDE SPLIT:
+  the folder name and the app label were one string answering two
+  questions, and the same ride split them -- an explicit argument names
+  the label, the door names the folder, and a default install leaves
+  whitelabel.txt to the flake, whose capitalized spelling then names the
+  writer (the receipt read Pipulate, capital P, in a folder named npvg).
 - **The Dotfile-Blind Probe** โ€” *ripgrep's hidden-file default.* Banked
   2026-08-05, self-convicted. ripgrep skips hidden files by default, so any rg
   probe hunting a name that lives in .gitignore, .gitattributes, or any other
(nix) pipulate $ m
๐Ÿ“ Committing: chore: Introduce placeholder substitution mechanism for door naming
[main f674a494] chore: Introduce placeholder substitution mechanism for door naming
 1 file changed, 35 insertions(+)
(nix) pipulate $ patch
(nix) pipulate $ app
โœ… DETERMINISTIC PATCH APPLIED: Successfully mutated 'foo_files.py'.
(nix) pipulate $ d
diff --git a/foo_files.py b/foo_files.py
index 4742306e..a6bcff46 100644
--- a/foo_files.py
+++ b/foo_files.py
@@ -2420,13 +2420,7 @@ foo_files.py
 # proving a deliberately staled working copy is actually replaced, and
 # `exit` then `nix develop` named as the ignition.
 
-# EARMARK โ€” CURL-PIPE TRUNCATION SAFETY. assets/installer/install.sh runs
-# top-to-bottom, so a download truncated mid-transfer executes a PARTIAL script:
-# it can mkdir the target, half-fetch a key, and exit clean. Wrap the body in
-# main() { ... } with main "$@" as the last line, so a truncation can only ever
-# fail to define main and nothing runs. Gate on `bash -n` of a truncated copy
-# exiting NONZERO -- today it exits zero, which is the whole defect. Owed before
-# npvg.org serves a one-liner to strangers.
+# - TODO (2026-09-14): CURL-PIPE TRUNCATION SAFETY landed in source 2026-09-13 (install.sh: the main() wrapper plus the brace-group call line) and npvg.org now serves the one-liner; its gate, bash -n on a truncated copy exiting NONZERO, has no receipt in this router; take it once and delete this line.
 
 
 # NO PLACEHOLDERS IN PASTE-READY LINES (convicted 2026-08-30, both lanes): <NAME> in a shell line is a redirection from a file called NAME -- "No such file or directory" -- silent in the compile lane, loud in the operator lane, dead in both. Write "$NAME" and put `export NAME=...` once on the line above; a variable runs verbatim, a placeholder needs an edit the human will not make.
(nix) pipulate $ m
๐Ÿ“ Committing: chore: Remove extraneous CURL-PIPE truncation safety comments and TODO
[main 85d9c266] chore: Remove extraneous CURL-PIPE truncation safety comments and TODO
 1 file changed, 1 insertion(+), 7 deletions(-)
(nix) pipulate $ git push
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 48 threads
Compressing objects: 100% (12/12), done.
Writing objects: 100% (12/12), 4.15 KiB | 531.00 KiB/s, done.
Total 12 (delta 8), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (8/8), completed with 3 local objects.
To github.com:pipulate/pipulate.git
   e178e22c..85d9c266  main -> main
(nix) pipulate $ 

Neat, huh?


Book Analysis

Ai Editorial Take

What is most striking in this entry is the psychological shift from treating deployment as a mutable event to treating it as a function of the delivery door. The realization that a script passing through an anonymous pipe must rely on server-side transformation rather than origin detection highlights an elegant intersection of web infrastructure and script engineering.

๐Ÿฆ X.com Promo Tweet

Why should one installer file create different default folders depending on the web door you walk through? Discover how nginx substitution and Nix enable replayable, checkable workflows: https://mikelev.in/futureproof/the-door-names-the-folder/ #DevOps #NixOS #SoftwareArchitecture

Title Brainstorm

  • Title Option: The Door Names the Folder: Engineering Replayable AI Workflows and Portable Environments
    • Filename: the-door-names-the-folder.md
    • Rationale: Directly captures the core architectural breakthrough of using nginx sub-filters to vary installer defaults cleanly.
  • Title Option: Un-Hardwiring the Subsystem: Replayable Software Environments in Practice
    • Filename: un-hardwiring-the-subsystem.md
    • Rationale: Focuses on the broader refactoring effort to separate structural vessel names from passenger application identities.
  • Title Option: The Mechanics of the Forever Machine: Reproducible Tooling and Checkable Deployments
    • Filename: mechanics-of-the-forever-machine.md
    • Rationale: Emphasizes the philosophical and practical foundations of text-driven environment descriptions.

Content Potential And Polish

  • Core Strengths:
    • Clear analogy between historical CSS normalizers and modern package management.
    • Rigorous use of live probes and receipts to verify system state changes.
    • Practical examination of trade-offs in automated installation scripts.
  • Suggestions For Polish:
    • Tighten the transition between the conceptual history of software rot and the concrete installer refactoring.
    • Ensure all technical terms are clearly linked to their glossary definitions.

Next Step Prompts

  • Analyze the remaining dangling items from the dismount beat and outline the next refactoring pass for the installer script.
  • Design a test harness for validating server-side substitutions across multiple concurrent delivery channels.