The Flight Data Recorder: Consolidating Walk Workflows and Replayable Context
Setting the Stage: Context for the Curious Book Reader
For the newcomer arriving through a single shell command, this technical journal entry chronicles the consolidation of Pipulate’s guided-browser walk system into a single chapter titled for the Flight Data Recorder. It bridges the gap between interactive browser captures and automated context compilation, illustrating how reproducible receipts displace fragile vibe-coding in the age of AI.
TL;DR: This entry consolidates the documentation of Pipulate’s guided-browser “walk” system into one chapter of the project’s context-compiler router, foo_files.py, titled for the Flight Data Recorder: a walk is a scripted browser visit in which a human clears any login and a program saves each page’s served HTML, rendered DOM, network log and headers to disk with hashes, so that AI-written analysis can be checked against evidence the model cannot alter. Two overlapping chapters became one, two stray scripts moved to the connectors chapter, and every prediction about the edit (line displacements, roster counts, coverage) was checked against compiled receipts rather than memory. Along the way: why a walk’s human-authored form is Markdown while its machine form is JSON in a YAML file; why two grade-school exercises, the peanut-butter-sandwich robot and the read-all-instructions-first quiz, describe the two ways working with a language model fails; why sailing is a better model than water-skiing for working beside a system smarter than you; and a note on this site’s loss of Google traffic in April 2025 and what a web read directly by agents might look like.
Technical Journal Entry Begins
MikeLev.in: The time has come to make these “walks”, the flight part of the Flight Data Recorder (FDR) intuitively obvious and easy to discover and easy to write.
All the hard part is done (I think) of having a really short domain name that
doesn’t require a filename instruction as part of the -fsSL install command:
curl -fsSL https://npvg.org | bash
That’s almost memorable and able to be committed to muscle memory and that’s both a small miracle and a good start. It plays off of actually controlling the Nginx webserver that it’s served from to the point of using a similar trick of serving one thing to one useragent requester and another. It’s a floor wax and a desert topping (a web page and a bash install script)! This is not dissimilar to how we serve markdown to AI-bots and HTML to browsers so is not only very attuned to the rise of AI but cleverly repurposes the mechanism for an even more human-friendly use.
A Floor Wax and a Dessert Top
These are the parts that are absolutely and stunningly clear to me about what I’ve built. There’s other fun aspects such as the fact I’m now home-hosting 2 domains off of one old retired Windows 10 laptop repurposed to NixOS, turning it into effectively a “zero config” blank cartridge whose only customization is the fact I used a thumbdrive NixOS installer to overwrite Windows. It bluescreened of deathed on me in that way that forces you to go on a scavenger hunt for those inanely long 25-character Windows product key that you’re supposed to have written down or otherwise be able to retrieve from a Microsoft site with a live working Internet connection which has obvious Catch-22 problems that are wonderful to just say eff you to, plaster over with NixOS and never have that Windows conundrum ever again on that piece of hardware, recommissioning it into the world as a generic webhead that can serve multiple website.
So I now serve:
- https://mikelev.in
- https://npvg.org
…both home-hosted from that same laptop both served from the same dynamic IP address issued by your home Internet Service Provider (ISP) — all of which is super-cool just on its own but today we layer on the next layer. The next layer is the “big unlock” making this all a useful daily work driver.
How?
Well, by cutting down the length of adhoc.txt where I keep carrying over all
this documentation that should really be distilled down into a chapter outline
of the book, and also as “hidden” undocumented pages on npvg.org that a walk
itself takes you across, teaching you how to make walks and record everything
that was in the walk using the Flight Data Recorder (FDR) feature [deck to data
reference fixed]…
…which is what scratches the itch that everyone’s having around the world right now about quality-assuring the output from massively impressive LLM output that you want to rubber-stamp, put your name behind and claim it as your own work and forward onto your customer or client…
…except for the fact that maybe it contains exceedingly confident but also very demonstrably wrong hallucinations.
Flight Data Recorders (FDRs) are [deck to data reference fixed] about demonstrating that exceeding wrongness even when you’re a human whose skills have already atrophied like a passenger on the Wall-E Axiom generational spaceship waiting for Earth to be cleaned up.
You’re going to have to help me catch the New-B’s who might just be joining in on all of this. This is mostly a Tortoise turn so don’t feel like you have to boil the ocean in this one turn, but we do want really good storytelling exposition for folks just joining in. We also want to clarify the lack-of-clarity problem I’ve been having around all these different stick bug walk files. I’ve got the walk-player that you plug walks into and I’ve got the walks themselves which I think are plain human-editable YAML files.
Sailing Beside the Rigging
I’ve got walk compilers that transpose the easy YAML into the JSON it needs to
be (I think) and don’t even understand why I have or need this intermediary step
except for the fact I don’t expect humans to edit JSON, but hand-editing YAML is
fine. Maybe explain to the nice folks why that is. In other words I’ve got a
bunch of files of this system and I need to organize them into a
foo_files.py-style chapter (expanding out the one that’s already there) and
get those equivalent file-references out of adhoc.txt once and for until we
need them again there later and will include them ad hoc like any other chapter.
We are setting the stage for banging out infinite walks in infinite combination — all without creating file-cruft clutter. Walks are walks and we slam them out with them either:
- Being drawn from a smallish public set of example templates bundled-in and distributed with the Pipulate repo
- Being drawn from a YAML file sitting on your own personal private local machine and nobody can access online
- Drawn from a private git repo that will likely require some sort of authentication to access like having their GitHub user added as a collaborator to the private repo and something like 1-time OAuth is in the picture (1-time because ongoing OAuth token-renewal will kick in)
- Drawn from some other arbitrary and less-secure security through obscurity techniques like maybe GitHub gists.
Right, right. Once all that is done you just have this joke that keeps on giving when somebody scratches their head figuring out how to scratch that other itch… usually something having to do with:
- How do we do this such-and-such thing
- Once we do it and there’s some LLM response about it, how do we know that what it’s saying is not a confident hallucination
This is the great one-two punch of our times in tech. How do you do a thing once every way to do a thing is up-in-the-air again because AI. And even if someone can articulate: “First do this, then do that, yadda yadda…” and even bottle it for distribution (the way we do in walks) how can you know that the end result of whatever such process had the effect you want?
Well, you’re going to ask AI of course! The problem is circular and most circles end with you infantilized by the AI companies — skills you once had atrophied or skills you need but never developed still not developed because doing so would make you independent of the AI companies and have no switching cost switching between them, putting the squeeze on them by treating them as lowest-bidder Request for Proposal (RFP) responders.
Who can deliver the highest quality work at the lowest (token) cost?
And who can do it as a trusted subcontractor who won’t put too much water in concrete?
And if they for whatever reason cheat and like (you prompted them poorly) and they do put too much water in the concrete, how do you catch it?
And how do you get yourself on the path where you are always prompting well so that you have less of upstream Problem A (poor prompting / context-setting) so that the downstream problems become less problematic?
The Sandwich and the Quiz
These are the things npvg.org addresses and fixes and this is us getting started doing that having just overcome the most difficult (I think) hurdles.
I need to beef-up this chapter in foo_files.py:
# ============================================================================
# XVIII. MISC UNIX PHILOSOPHY STYLE COMMANDS FOR COMPOSABLE PIPELINE WORKFLOWS
# ============================================================================
# THE CONNECTORS (WET single-file API gateways; contract in the README)
# scripts/sources_menu.py
# scripts/connectors/README.md
# scripts/connectors/gmail.py
# scripts/connectors/confluence.py
# scripts/connectors/jira.py
# scripts/connectors/slack.py
# scripts/connectors/botify.py
# scripts/connectors/gsc.py
# scripts/connectors/sheets.py
# scripts/connectors/wallet.py
# scripts/connectors/mcp.py
# scripts/connectors/mcp_warm.py # <-- One-shot OAuth 2.1 PKCE warmer; writes the token file mcp.py's resolve_token already reads
…and I need to get all this out of adhoc.txt:
# 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
These two things are really the same thing. But before diving into the implementation get the nice folks up-to-speed on anything I said that needs to be said better for the newcomer by way of storytelling exposition. That’s actually more important for turn one. I know you’re going to try to get the 5-Car Train in anyway because that’s the way the system is built. Spend most of your tokens on the storytelling using constraint on implementation knowing that turn comes next, please and thank you.
Fable 5.1 Extra: Context verified. One live receipt this compile, the rolling pin, and it reads 1,470 articles with the newest three dated 2026-09-14; nothing else ran, so everything below is read off source and the glossary, not off a fresh reading. Tortoise turn, as declared. The train at the bottom is short and carries no patches.
To the New-B who just arrived through a one-liner
What you typed. curl fetches a web address and prints what comes back. The flags say: fail quietly if the server answers with an error page, stay silent otherwise, still show real errors, follow redirects. The | bash hands whatever arrived to the shell to run. Notice what is missing: there is no filename on the end of that address. A browser asking for npvg.org gets a web page. curl asking for the identical address gets a shell script. One address, two bodies, and the server picks based on what the request says about itself. That is the 1976 Saturday Night Live fake commercial: “New Shimmer is a floor wax!” “It’s a dessert topping!” And Chevy Chase, deadpan: it’s both. The joke was that nothing could be both. A web server can, because a URL was never a file on a disk; it is a question, and the server answers each asker differently. The same box has been doing this for a year on the other domain it hosts: a browser asking for an article on mikelev.in gets the styled page, and a crawler that says it accepts markdown gets the raw source the article was written in. Content negotiation, RFC 7231, older than most of the tooling being vibe-coded around it. He did not invent the trick; he owns the server, so he gets to use it twice. One practical note: last week’s draft of that line had no https:// and curl defaults to plain http; today’s has it. Keep it.
The laptop the address lives on. A retired Windows 10 laptop blue-screened, and the recovery path demanded a twenty-five-character product key that you were supposed to have written down or fetch from a website you could not reach from a machine that would not boot. A NixOS thumbdrive ended that conversation. What makes NixOS the right paint for the job is that the machine’s whole identity, every service and every port, becomes one text file; apply that file to any other laptop and you have the same server. That is what he means by a blank cartridge: not zero configuration, but configuration that is all in one readable place and survives the hardware. So now two domains, mikelev.in and npvg.org, come out of a closet on a home internet connection whose address the provider changes when it feels like it, and a small heartbeat script tells the domain registrar the current number. One asterisk, from the router’s own to-do list dated 2026-09-13: only mikelev.in gets that heartbeat today; npvg.org is a fixed record pointing at the same number, so the day the provider moves it, one site follows and the other goes dark with nothing printed anywhere. Better you hear that from the book than from a dead link.
The name. NPvg is Nix, Python, vim, git; the older spelling was LPvg with Linux in front. “No Problem, very good.” Four skills, chosen because none of them has expired in thirty years and none of them belongs to a vendor.
What a walk is. Type walk. A browser opens on a page. A voice reads a short paragraph about that page, what to look at, what to do if there is a login. Then the program refuses to move until you type the word CAPTURE. When you do, it saves the page as the server sent it, the page as the browser rebuilt it, every network request the page made while loading, the response headers, and an outline of the page’s structure, all to a folder on your own disk, each file with a hash. Then it walks to the next bookmark. At the end, one more word, DECANT, folds what it captured into a text bundle and puts it in your clipboard. The book calls this the Mother Cat Kata because it carries you by the scruff from stop to stop instead of offering a menu of twelve doors, and it has exactly one step that only a human can take: logging in, clearing a CAPTCHA, the two-factor code. The machine never fakes that step. It inherits the logged-in session you established and does nothing else with it. The stick bug is the other half of the name: the whole instrument looks like a browser and a voice, and nobody looks twice at a leaf.
The recorder, and a slip worth catching. Mike wrote “Flight Deck Recorder” three times and “Flight Data Recorder” once. An airliner carries two recorders. The flight data recorder logs what the instruments measured. The cockpit voice recorder logs what the pilots said, and the flight deck is the cockpit. His own glossary has the rule: when the two disagree, the data recorder wins on parameters and the voice recorder wins on intent. A model narrating what it did is the voice recorder. The walk is the flight, and the captured files are the data. So the “Deck” spelling names the instrument the whole system says not to trust on facts, and it is about to become a menu item. Cheap to fix now.
Why this breaks the circle. The problem everyone has this year: a model hands you fluent, confident text, and fluent confidence is exactly the signal humans use for “this person knows.” The signal is broken, and not by malice. Models are tuned against averaged human preference, and humans prefer a smooth complete answer to “I don’t know,” so the tuning selects for confidence. The result is not lying, which requires knowing better; it is confabulation, a plausible story filling a hole, believed by the teller. The circle Mike describes is asking the confabulator to grade itself. Every answer to that is the same answer: put something in the loop the narrator cannot flatter. A file on disk. A hash. A network request that either happened or did not. Take a reading before, change one thing, take the reading after, and the difference is the receipt. The walk produces that receipt as a side effect of looking at the pages you would have looked at anyway. And the Wall-E reference is the stakes: the passengers on the Axiom were carried for seven hundred years until being carried was the only thing they could do. The book has a name for the business model, manufactured forgetting, and its answer is a skill that does not expire and does not belong to anyone: read the instrument yourself.
The RFP, and whether the metaphor pays rent. He wants the AI companies treated as lowest-bidder subcontractors with no switching cost between them. Charge that rent. A request for proposals works only when the bidders do not get to edit the spec and the winner does not control the inspection. The spec here is the compiled context: one sealed file, hashed, sent to every bidder unchanged, and portable precisely because a model is a function of its input and nothing else, so the input is the whole job. The inspection is the straddle: readings taken before and after that the bidder never sees. And this is not a plan; it is practiced. On 2026-09-04 one payload went to five models blind, they split three to two on what to cut, a sixth model judged without the names, and the names were revealed afterward. The concrete metaphor pays too: too much water is invisible at the pour and fatal under load, and the inspector does not ask the crew, he takes a core sample. The straddle is the core sample, a number the model did not write. And his “upstream Problem A,” prompting well, is the same product seen from the other end: the compiler and its router are what turn a conversation into a spec. Cartridge in, receipt out. Same machine, two doors.
Where the unlock actually is. He says the daily-driver unlock is shrinking adhoc.txt. Half right, and the other half is better. Commented lines already cost zero tokens in a compile, so the payload does not shrink. What changes is who can read the map. adhoc.txt is the margin of the book: per-machine, gitignored, invisible to every reader except him. A chapter in foo_files.py rides in every cartridge he ships. Moving the walk roster from the margin into the book means a stranger, or Mike in six months, finds the walk files by chapter instead of by memory. The documentation stops being a private note and starts being the manual.
The files, sorted by what they do. His model has three parts: a player you plug walks into, walks that are hand-editable YAML, and compilers that turn easy YAML into the JSON the player needs. The shape is right. Two labels are swapped, and there are two compilers, not one. The thing designed for a human to edit is a Markdown file; the .yaml trail is the machine form, and its grammar is JSON. Here is the lifecycle, one line each, read off the router’s own chapter VIII-c:
- Launch:
walk(a two-line wrapper in the repo root) hands off toassets/installer/mck.sh(the launcher; the same file a stranger gets frompipulate.com/mck.sh; finds the workshop, forces a spoken rehearsal on first contact, asks for the word RIDE), which startsscripts/mother_cat.py(the rider; aliasmothercat). - Author: browser bookmarks go through
scripts/bookmark_import.pyand come out as<name>.walk.md(the human surface, one section per stop) plus<name>.exports.sh(the URL values, gitignored by pattern so they can never ship). - Compile:
scripts/walk_compile.pyturns the finished.walk.mdintoassets/trails/<name>.yaml, and refuses if any TODO is left in the text. - Validate:
scripts/walk.pyloads a trail, refuses unknown or missing keys in both directions, and prints the dry-run plan. Despite the name, it is not whatwalkruns. - Seal:
scripts/walk_cartridge.pyturns a trail intodata/walks/<sha256>/walk.zip, the trail plus a manifest carrying its hash and the consent surface a rider reads before riding. Sealing the same bytes twice gives the same file. - Capture:
tools/scraper_tools.pydoes the browser capture and holds the CAPTURE fence;scripts/weblogin.pylets you settle a login ahead of time on the persistent profile;imports/voice_synthesis.pyis Piper, scripted narration and never a model. - Hand off:
captures.mdbanks the bytes before each ADVANCE; DECANT builds the clipboard bundle;adhocwalk.txtis written by the rider and compiled byahcw, throughprompt_foo.py, into afoo.zipsealed byscripts/foo_cartridge.py. That is the second seal, over the evidence, where the first was over the instructions. - The walks themselves: seven in
assets/trails/: practice, public_walk, first_context, botify_pageworkers, jira_for_you, ticket, se_ticket.public_walkis the one barewalkrides: three public pages, nothing to log into. - In the same adhoc block, but not walk files:
scripts/connectors/*are one-shot API commands, gmail and jira and botify and the rest, with their contract in their own README;scripts/mcp_dummy_server.pyis a fault harness for the MCP client;boot_menu.pyandsources_menu.pyare menus;assets/installer/replay.shhas been off the roster since 2026-08-01 and is stranded.
Why the human form is Markdown and the machine form is JSON in a .yaml coat. Every JSON document is a legal YAML document, so the extension is honest, but the parser accepts only the JSON half, on purpose, for three reasons the glossary banked on 2026-08-08. Python ships no YAML parser, and the sealer has to be one file anyone can fetch and run. The hash covers exact bytes, and YAML offers a dozen spellings for one document, which is a dozen ways for what a human consented to and what the manifest attests to drift apart. And duplicate keys must refuse rather than silently let the last one win. The fourth reason is the human one, and it is why the intermediary exists at all: the guidance field is a paragraph a voice reads aloud, and inside a JSON string it is one escaped line where typos hide. The Markdown surface puts prose in the body where prose belongs, with a short head of plain key: value lines per stop, the same split the blog already runs from article.txt to a published post. You can hand-edit a three-stop trail, and you have. The Markdown form is for the thirty-stop one, or for the day someone who has never seen a JSON string writes one.
Where a walk can come from. Of his four sources, two exist and two are claims. Bundled examples: that is assets/trails/, seven today. A private file on your own machine: that works by construction, the rider takes a path, and the discipline is the one adhoc.txt already uses, keep it outside the worktree so no git sweep can reach it. The sharper point is that most “private” walks do not need a private trail at all: since 2026-08-25 a stop declares either a public url or a url_env variable name, so the trail names the variable and a gitignored exports file holds the value. The ticket walks already work this way; the trail is publishable and the secret half never leaves the disk. A private git repo with a one-time OAuth, and gists: nothing in the repo fetches a trail over the network today, so those are unbuilt. The rule that will govern them is already written: a trail that can change out from under you is not replayable, and the cure is to seal on arrival and ride the sealed copy, which lands at a path that is a function of its hash and nothing the fetcher chose. The one-time OAuth is a credential shorter-lived than the human loop, and the wallet’s warm command is the existing shape for that; it would be the next thing to build, not the first.
The walk that teaches walks. This is the best idea in the prompt and it costs almost nothing. public_walk is three public URLs with spoken guidance. A trail whose stops are pages on npvg.org, each page one lesson in writing a trail, with the guidance field reading the lesson aloud, is the same shape with different addresses. The pad serves one page today, about a kilobyte. The “hidden” pages need no link from the homepage because a walk reaches them by URL. And this is where the documentation he keeps carrying in the margin should go to die: not into more router comments, but into pages a walk crosses.
The router: three rosters, one system. Chapter VIII-b (the Mother Cat Kata) and chapter VIII-c (Walk to Context) already exist in foo_files.py, both listing these files, both accurate on the day each was written. The adhoc block is a third copy, and it also duplicates chapter XVIII’s connector list. So the lack of clarity was never missing documentation; it was three maps of one territory. Next turn is a merge, not a build: VIII-b and VIII-c become one chapter named for the recorder, XVIII stays the connectors chapter, and the adhoc block dies. Every path stays commented, because a commented path costs nothing in a compile and still claims its file out of the Paintbox. His own comment in the adhoc block says the two systems are different, and that is the ruling: two chapters, one for each.
Merging the Maps into the Book
1. PROBES
ls assets/trails/
grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
for f in scripts/walk.py scripts/walk_compile.py scripts/walk_cartridge.py scripts/mother_cat.py scripts/bookmark_import.py; do echo "== $f"; sed -n '1,6p' "$f"; done
The first is a census of what is bundled today; the router names seven, and this reads the disk. The second prints the three chapter headers with line numbers, the anchors for a displacement receipt after the merge. The third counts roster lines across the four prefixes the merge will touch; my source count is 31 and could be off by a line, so read it as a BEFORE and predict the merge as a delta, and if the AFTER moves by an amount the merge cannot explain, rerun it with -n and look at the lines. The fourth is the length of the margin, the BEFORE of the cut, unchanged this turn. The fifth prints the first six lines of the five walk scripts, bounded at thirty lines, so next turn’s one-line descriptions come from source rather than from this conversation.
2. NEXT CONTEXT
foo_files.py
! ls assets/trails/
! grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
! grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
! grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
! for f in scripts/walk.py scripts/walk_compile.py scripts/walk_cartridge.py scripts/mother_cat.py scripts/bookmark_import.py; do echo "== $f"; sed -n '1,6p' "$f"; done
The rolling pin, the glossary, the flake, the compiler and the three articles can leave; the merge is a router edit and needs the router.
3. PATCHES
No repo patches required. No ignition required.
4. PROMPT
Turn two of the recorder chapter: consolidate, do not build. Read the five receipts: the trail census names what is bundled on disk; the header lines locate VIII-b, VIII-c and XVIII; the roster count is the BEFORE of a duplication that should fall when the two walk chapters become one; the adhoc line count is the BEFORE of the margin cut; the docstring heads are the source for every one-line description, so nothing in the chapter is written from memory. Emit one car against foo_files.py: merge VIII-b and VIII-c into a single chapter whose title names the Flight Data Recorder, roster grouped launch / author / compile / validate / seal / capture / hand-off / trails, every path commented so it costs zero tokens and still claims its file, the seven trails listed once with their status lines carried over, the AUTH RULING and STATUS prose kept where it still says something true and cut where a later receipt superseded it. Leave XVIII as the connectors chapter and add noop.py and mcp_dummy_server.py to it with one-line roles. Predict the roster count as a delta and the header line numbers as displacements. Then name the hand edit: the STICKBUG block leaves adhoc.txt through ahe after the car lands, and the adhoc line count is its receipt. No trail files, no scripts, no pad pages this turn; the walk that teaches walks is the ride after this one.
5. EXTERNAL DELIVERABLES
None this turn. Two things live outside the repo and are named here so they are not lost: the adhoc.txt block is a hand edit in ahe once the chapter lands, since the margin is not a patch target; and the teaching pages for npvg.org belong to the pad under remotes/honeybot/www/npvg.org/, a future ride, not this one.
MikeLev.in: Alright at this point I’ve got a very prescribed format I use for responding. I basically paste this in and start filling it in from the past response from the LLM. Why? It’s Science!
> 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)
[Paste the terminal output of the probes]
**2: Context**: (AFTER: the same probes re-run by the compiler as `!` lines)
[Paste entire `adhoc.txt` here]
**3: Patches**: (the one change between the readings)
[Paste the diffs: patch, app, d, m per car]
Ignition (what makes the patched code run before the AFTER reading -- `<F2>`, `nix develop`, a re-ride -- or none required):
**4: Prompt**: (the next question, written before the AFTER reading is in)
[Probably what the AI gives you, but think for yourself!]
**5: Deliverables**: [external artifacts, updates to this system or 'None this turn outside the repo']
MikeLev.in: And this is us filling it 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 $ ls assets/trails/
grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
for f in scripts/walk.py scripts/walk_compile.py scripts/walk_cartridge.py scripts/mother_cat.py scripts/bookmark_import.py; do echo "== $f"; sed -n '1,6p' "$f"; done
botify_pageworkers.yaml first_context.yaml jira_for_you.yaml practice.yaml public_walk.yaml se_ticket.yaml ticket.yaml
1603:# VIII-b. THE MOTHER CAT KATA - Carry the human by the scruff, one gate at a time
1675:# VIII-c. WALK TO CONTEXT - Instructions, evidence, selection, hand-off
1991:# XVIII. MISC UNIX PHILOSOPHY STYLE COMMANDS FOR COMPOSABLE PIPELINE WORKFLOWS
31
198
== scripts/walk.py
#!/usr/bin/env python3
"""Mother Cat trail planner, Car A: strict dry-run and no actuation.
Trail files use the JSON subset of YAML 1.2. That keeps this car stdlib-only,
duplicate-key-checkable, and still valid YAML. There is deliberately no
browser, voice, shell, or adhoc.txt mutation path in this file.
== scripts/walk_compile.py
#!/usr/bin/env python3
"""
walk_compile.py -- compile a .walk.md authoring surface into a trail.
Stdlib only. Single file. Never imports walk.py, and deliberately RE-DERIVES
the field sets and regexes it needs. Same WET bargain bookmark_import.py and
== scripts/walk_cartridge.py
#!/usr/bin/env python3
"""
walk_cartridge.py -- the sealed, immutable form of a Mother Cat trail.
Schema: walk-cartridge-integrity-v2. Stdlib only. Single file by design.
== scripts/mother_cat.py
#!/usr/bin/env python3
"""Mother Cat trail walker, Car B: actuate Car A's validated plan.
walk.py remains the strict, stdlib-only dry-run planner. This module adds the
actuating side of the Mother Cat Kata:
== scripts/bookmark_import.py
#!/usr/bin/env python3
"""
bookmark_import.py -- one folder of bookmarks becomes a walk AUTHORING SURFACE.
Stdlib only. Single file. Never imports walk.py, and deliberately RE-DERIVES
the two regexes it needs. The cost is named rather than hidden: if walk.py's
(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 _ _ _ ____ _ _ ___ ____ _
# / \ __| | | | | | ___ ___ / ___| | | |/ _ \| _ \| | Long overdue article cleaning up adhoc.txt (this file)
# ahe/ _ \ / _` | | |_| |/ _ \ / __| | | | |_| | | | | |_) | |
# 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.
# FOR 40K-FT VIEW (STORY & INFRASTRUCTURE)
# --- START EDITING-IN ON 1ST TURN ---
# ! 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)
# ~/repos/nixos/autognome.py # <-- You wake up in the morning and your Tooling & Instrumentation folds out of you like Inspector Gadget.
# init.lua # <-- Those gadgets are made easy-to-use through nifty keyboard shortcuts (but ya gotta learn vim).
# GLOSSARY.md # <-- Like the back of a J.R.R. Tolkien book, there's kooky new terms to know.
# flake.nix # <-- Here is my hardware. Here is my state. Put on your sandbox. And please recreate. (Infrastructure as Code / IaC)
# prompt_foo.py # <-- THIS system
# foo_files.py # <-- main ROUTER
# requirements.in # <-- We've "pinned" everything but still want a flexible Python Data Science virtualenv.
# pyproject.toml # <-- How this is a citizen of the Python "pip install" ecosystem
# __init__.py # <-- Version info
# --- END EDITING-IN ON 1ST TURN ---
# scripts/articles/lsa.py # <-- 2ND BRAIN: Search external memory with `rgx`, `rgxc` & `posts` Blogging for Hackers Jekyll-compatible.
# 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)
# /home/mike/repos/trimnoir/_posts/2026-09-09-taming-the-unstable-throttle-replayable-nixos-upgrades.md # [Idx: 1461 | Order: 1 | Tokens: 18,498 | Bytes: 68,710]
# /home/mike/repos/trimnoir/_posts/2026-09-12-unix-way-ai-replayable-workflows.md # [Idx: 1464 | Order: 1 | Tokens: 17,171 | Bytes: 72,459]
# /home/mike/repos/trimnoir/_posts/2026-09-14-quiet-installer-replayable-workflows.md # [Idx: 1470 | Order: 4 | Tokens: 44,366 | Bytes: 177,032]
# Context 2
foo_files.py
! ls assets/trails/
! grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
! grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
! grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
! for f in scripts/walk.py scripts/walk_compile.py scripts/walk_cartridge.py scripts/mother_cat.py scripts/bookmark_import.py; do echo "== $f"; sed -n '1,6p' "$f"; done
# --- END `adhoc.txt` TEMPLATE ---
3: Patches: None this turn.
4: Prompt: Turn two of the recorder chapter: consolidate, do not build. Read the five receipts: the trail census names what is bundled on disk; the header lines locate VIII-b, VIII-c and XVIII; the roster count is the BEFORE of a duplication that should fall when the two walk chapters become one; the adhoc line count is the BEFORE of the margin cut; the docstring heads are the source for every one-line description, so nothing in the chapter is written from memory. Emit one car against foo_files.py: merge VIII-b and VIII-c into a single chapter whose title names the Flight Data Recorder, roster grouped launch / author / compile / validate / seal / capture / hand-off / trails, every path commented so it costs zero tokens and still claims its file, the seven trails listed once with their status lines carried over, the AUTH RULING and STATUS prose kept where it still says something true and cut where a later receipt superseded it. Leave XVIII as the connectors chapter and add noop.py and mcp_dummy_server.py to it with one-line roles. Predict the roster count as a delta and the header line numbers as displacements. Then name the hand edit: the STICKBUG block leaves adhoc.txt through ahe after the car lands, and the adhoc line count is its receipt. No trail files, no scripts, no pad pages this turn; the walk that teaches walks is the ride after this one.
5: Deliverables: An easier to understand and overall cleaner system, eventually.
Nobody talks about it much but one of the critical behaviors being RLHF’d into them is the ability to abide by invariant instructions, the most upper-left, first-in-parsing or however you want to call it. In elementary school and hopefully in your home-life if you’re a homeschooler or whatever, there are precisely two lessons you need to have had received in order to have mechanical sympathy with LLMs.
- How to make a robot make a peanut butter sandwich (prompting well)
- The “read all instructions first” quiz (abiding by the invariant)
You can move onto implementation now but do at least briefly cover why the prompt-well and invariantification lessons are so important here.
Note: There’s an impressive 10 minutes and 18 seconds of impressive thinking here:
Explaining effective prompting using a sandwich-making example.
Cross-checking file counts against the receipts provided.
Untangling a line-count mismatch caused by an interim edit.
Connecting both lessons to the routing invariant's design.
Estimating line spans to plan a safe merge edit.
Mapping the exact comment boundaries for a safe merge.
Pinpointing the true blank-line boundary before the header.
Weighing a targeted anchor versus a line-range cut approach.
Reconstructing the merge to preserve the chapter's closing rule.
Weighing a full replacement against a smaller targeted edit.
Deciding which claims to trim as superseded.
Verifying every file path stays claimed in the paintbox.
Recalculating connector counts after adding new entries.
Predicting how a new file addition shifts coverage totals.
Tracing how compile order affects where a match appears.
Tracking header line shifts from the planned chapter merge.
Drafting the merged chapter's blurb and section outline.
Listing the launch, author, compile, and capture scripts.
Cataloging hand-off scripts and each bundled trail's status.
Distinguishing the four output types and their evidence roles.
Recounting comment-line matches across the merged chapter draft.
Tallying connector entries after the new additions.
Copying the chapter blurb text with exact wording intact.
Clarifying the two distinct authentication surfaces at ride time.
Cataloging trail files by profile and authentication readiness.
Detailing the ticket-loop ride's capture and skip results.
Differentiating evidence, preview, and disclosure output types.
Explaining the router-write replacement rule and selection scope.
Recounting exact line spans for the merged chapter sections.
Recounting handoff lines to fix the merged section span.
Recalculating section spans to predict the next line shift.
Weighing a single edit against splitting the merge into two.
Checking whether hidden text substitutions altered any hostnames.
Drafting the merged chapter's flight recorder blurb text.
Detailing the four-move trail lifecycle and dual compiler roles.
Cataloging validate, seal, capture, and hand-off scripts.
Cataloging each bundled trail's profile and ride status.
Verifying the schema's dual-direction field enforcement rule.
Recounting comment-line boundaries within the chapter blurb.
Recounting comment lines to verify the auth ruling section.
Recalculating predicted line shifts after the latest edit.
Estimating how many lines the deleted block removes.
Linking both classroom lessons to the routing invariant's purpose.
Planning the response layout with probes and patches.
Checking prose-guard logic against each commented line pattern.
Verifying raw-string safety before finalizing the small addition.
Drafting the off-roster residue notes and finalizing line counts.
Drafting the chapter blurb explaining trail authoring and sealing forms.
Listing launch, author, compile, validate, seal, and capture scripts.
Cataloging capture, hand-off, and off-roster residue scripts.
Clarifying the two live authentication surfaces at ride time.
Recalculating the predicted chapter length after the edit.
Rewriting connector script descriptions to fix mismatched roles.
Planning the hand-edit boundaries and the next-turn caboose.
Verifying exact whitespace before drafting the sandwich analogy.
Weaving the two classroom lessons into one closing point.
Drafting predicted line shifts and planning verification probes.
Drafting verification probes to confirm predicted counts.
Copying the status header text verbatim for the chapter.
Estimating the net insertion and deletion line counts.
Finalizing the merged chapter's blurb wording precisely.
Listing launch, wrapper, and delegation scripts precisely.
Cataloging author, compile, seal, and hand-off scripts.
Detailing remaining trail statuses and their capture progress.
Detailing evidence, disclosure, and the strict handoff rules.
Listing outstanding tasks and the two live authentication surfaces.
Recounting section-by-section line spans across the full chapter.
Recounting the walk-to-context chapter's opening lines.
Cataloging navigation, authoring, and observation script sections.
Predicting the new connector list's exact line offset.
Drafting the caboose prompt tying predictions to receipts.
Fable 5.1 Extra: Context verified. Five receipts, all AFTER for nothing and BEFORE for everything, which is what a Tortoise turn should leave behind. The trail census reads seven, the router names seven. The three headers sit at 1603, 1675 and 1991. The roster count reads 31, my source count exactly: 13 connector lines, 10 trail lines, 6 walk-script lines, 2 mother_cat lines, so the duplication is banked as a number. The adhoc count disagrees between lanes, 198 by hand and 171 in the compile, with no patch between them; the couch gag says you cleaned the file between taps, so 171 is the BEFORE for the cut and 198 is a stale reading. And the docstring heads confirm the swap from source rather than from my memory: walk.py says trail files use the JSON subset of YAML 1.2, walk_compile.py says it compiles a .walk.md authoring surface into a trail, and walk_cartridge.py’s fifth line still says integrity-v2, which is the open one-line todo, not patched here because that file is not in context.
Two lessons, and why they are the same lesson.
The sandwich exercise: a class writes instructions for making a peanut butter sandwich and the teacher plays the robot, following them to the letter. “Put the peanut butter on the bread” lands the jar on the slice. “Spread it” is attempted through a closed lid. Nobody said to open the bag. Every instruction was correct and the sandwich still failed, because the executor shares none of the writer’s assumptions, and the assumptions were most of the recipe. A model is that robot with better manners. It is a function of exactly what is in the payload and nothing else, the lambda point from three articles ago, so a prompt is an inventory before it is a request: which jar, which knife, which bread. The compiler is the countertop. It puts the files, the readings, the vocabulary and the receipts on the table in one paste, and the third item on the checklist is the robot being allowed to say “there is no knife here” instead of spreading with a spoon. Prompting well is the sandwich lesson done as engineering, and the router already carries its stranger-facing version under the peanut-butter earmark.
The read-everything-first quiz: a page of twenty numbered steps, the first of which says “read all the instructions before doing anything” and the last of which says “now do only step one, write your name.” The kids who start executing at step two are doing jumping jacks and shouting their names by step nine; the kids who read to the end sit quietly with their names written. The lesson is that which instruction is live is itself an instruction, and it is stated first. A compiled payload is that quiz at four hundred thousand tokens: it carries old prompts, old cabooses, the dismount template, SEARCH/REPLACE examples, TODO lines with imperative verbs, and every one of them reads like an order. The ROUTING INVARIANT at the top of the Prompt is step one: the live request is at the bottom, everything above it is evidence, and only the Manifest says what ran. A model that executes an embedded protocol because it was written in the imperative is the kid doing jumping jacks. This matters more now because instruction-following is trained hard into these models; the failure is not a model that ignores instructions but one that follows all of them. So the invariant sits first in parsing, is repeated at both ends of the artifact (the routing note in the Manifest, the invariant in the Prompt: the redundant groove), and the caboose rides last so the next order is under the cursor instead of buried mid-page. Mechanical sympathy is knowing the executor reads top to bottom with attention that thins over distance, and building the document so the one thing it must not miss is where it cannot be missed.
The sandwich says give it everything. The quiz says tell it which part of everything is the order. A payload that does the first without the second is a page of instructions with no step twenty.
The car. One car, two blocks, one commit story: consolidate the walk chapter. Block one replaces lines 1603 through 1753, the VIII-b title through the replay.sh line, 151 lines, with a 120-line chapter titled for the recorder. Everything is comment, every separator is a # line rather than a blank, so the SEARCH crosses no invisible boundary; the line arithmetic from 1603 to the receipt’s 1675 comes out exact for the VIII-b half, which is the closest thing to a blank-free witness a payload can give. The roster is grouped launch, author, compile, validate, seal, capture, hand off, trails. The seven trail status lines ride over verbatim except public_walk’s, which gains the noop connector and the default-ride note, and jira_for_you’s, which absorbs the discharged authenticated-ride paragraph. Cut: the STATUS paragraph (its OBSERVED list is dated history, and the rolling pin has it), the STILL OWED line demanding one trail per auth kind (the AUTH RULING three lines below it says that is the sibling-md failure), and the duplicate roster. Kept: the AUTH RULING, the four outputs, the handoff mechanism, the profile trap, condensed. Block two appends noop.py and mcp_dummy_server.py under XVIII, which claims mcp_dummy_server out of the Paintbox.
Predictions, counted from the blocks as emitted. Headers: 1603 stays 1603 and reads the new title; VIII-c returns no line; XVIII moves 1991 to 1960, a displacement of −31. Roster: 31 to 23, −8: noop and README leave the walk chapter as path lines (−2), three duplicate trail lines (−3), three duplicate walk-script lines (−3), one duplicate mother_cat line (−1), noop lands in XVIII (+1). mcp_dummy_server: a hand-run before the patch prints one hit in the Paintbox; after the patch and before a compile it prints two; the compile regenerates the Paintbox at its step 2, before the executor runs, so the AFTER prints one hit near line 1977 and the Processing Log’s coverage line reads 198/270 against this compile’s 197. Commit line about +122/−151. No ignition required: the router is read at the next compile.
1. PROBES
ls assets/trails/
grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
grep -n 'mcp_dummy_server' foo_files.py
grep -c 'VIII-c' flake.nix
The first four are the same instruments as this compile, so the straddle closes on them; their BEFORE is already in the Manifest. The fifth is the displacement receipt for the one file that changes chapters. The sixth is a CENSUS, 1 on both taps: flake.nix’s ahcw comment cites “Chapter VIII-c”, and after the merge that chapter is VIII-b, so the reading names a dangling label for the dismount and never moves. The docstring-heads probe retires; it did its job.
2. NEXT CONTEXT
foo_files.py
! ls assets/trails/
! grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
! grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
! grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
! grep -n 'mcp_dummy_server' foo_files.py
! grep -c 'VIII-c' flake.nix
3. PATCHES
Car 1, the consolidation. patch, app, d, m. If app refuses block one with a BLANK-LINE GAP receipt, re-emit exactly the lines it lists; a FIRST DIVERGENCE receipt names the byte.
Target: foo_files.py
[[[SEARCH]]]
# VIII-b. THE MOTHER CAT KATA - Carry the human by the scruff, one gate at a time
# ============================================================================
# CHAPTER BLURB — THE MCK: the record-and-playback session that carries a
# newcomer bookmark to bookmark instead of offering a menu of twelve doors.
# Four primitive moves — SETTLE (human-only), CAPTURE (machine-only), NARRATE
# (and FENCE: refuse to advance without a receipt), ADVANCE. The trail is DATA
# (a YAML file), the rider is CODE, and the split is the point: a new
# walkthrough should be a new YAML, never a new script.
# STATUS 2026-08-09. The 2026-08-01 line this replaces said these files were
# "UNREAD by any compile so far" and stayed wrong for eight days while the
# whole lane was read, ridden, patched and sealed. PROTECTION-LAG POLARITY in
# its expensive direction: the router UNDERSTATED what exists, so a reader who
# trusted the constitution over the source would call the lane vapor.
# OBSERVED, each dated in the corpus: public_walk rode green end to end
# 2026-08-01; all four trails sealed to content-addressed cartridges and
# re-sealed to identical digests 2026-08-07; the DECANT egress fence and the
# consent surface landed 2026-08-07; a filled authoring surface compiled to a
# trail that walk.py loaded unmodified 2026-08-09.
# THE AUTHENTICATED-RIDE DEBT IS DISCHARGED (2026-09-01): jira_for_you captured
# a logged-in Jira page on profile default -- final_url exact, so no
# id.atlassian.com redirect -- and DECANTED it. Whether the sign-in happened
# inside the ride or was inherited from the warmed profile is UNRECORDED; the
# next ride on a cold profile records it.
# STILL OWED: a signature over the sealed manifest, and ONE TRAIL PER AUTH
# KIND -- none / OAuth / API-key -- each findable by name FROM THIS CHAPTER.
# That last one is what this chapter is for.
# THE PATHS BELOW STAY COMMENTED ON PURPOSE: a commented path costs zero
# payload tokens and still drops the file out of the Paintbox, because
# update_paintbox_in_place strips the leading hash before deciding a path is
# claimed. Findable without being loaded is the whole trick.
# scripts/mother_cat.py # <-- The rider (alias: mothercat)
# scripts/walk.py # <-- Trail loader/validator; holds DEFAULT_TRAIL
# scripts/bookmark_import.py # <-- bookmarks.html -> authoring surface + gitignored exports
# scripts/walk_compile.py # <-- authoring surface -> JSON-subset trail; refuses on every TODO
# scripts/walk_cartridge.py # <-- trail -> sealed walk cartridge (seal / verify / show)
# AUTH RULING (banked 2026-08-09, source-witnessed): THERE IS NO AUTH FIELD IN
# THE TRAIL SCHEMA. walk.py's _exact() enforces set-difference in BOTH
# directions over the root, defaults, stop and connector field sets, so a trail
# CANNOT declare an auth kind without changing walk.py first. TWO AUTH SURFACES
# exist and only ONE is live at ride time:
# BROWSER AUTH -- defaults.profile_name plus persistent, i.e. which warmed
# uc_profiles directory opens. Exercised on EVERY ride. This IS what SETTLE
# means, and it is the only auth surface a trail can select.
# CONNECTOR AUTH -- connector.script, i.e. the wallet kind (oauth_token_file,
# bearer_token, basic_auth, service_account_file). NEVER exercised by a
# ride: mother_cat.py's docstring puts connector execution out of scope and
# _ride_async never reads the connector key. walk.py BUILDS the argv for
# the dry-run plan and nothing runs it.
# RULING: OAuth and API-key are NOT distinct rides at the trail level. Three
# near-identical YAMLs differing only in an inert string would be the
# sibling-md failure with our own hands on it. The auth-kind EXAMPLE SET
# ALREADY EXISTS and it is scripts/connectors/README.md -- five kinds, one
# working connector each, plus the warm red/green board that tests them live.
# Note also that first_context declares THREE wallet kinds in one trail, so a
# trail was never the unit of auth; a stop is, and even that is a declaration.
# WHAT IS MISSING IS A RECEIPT, NOT A FILE: no trail on a NON-DEFAULT profile
# has ever been ridden, so browser auth is witnessed only in its trivial form.
# botify_pageworkers IS that shape. Trap worth naming: weblogin defaults to
# --profile default, so warming for that trail needs --profile botify, and
# scraper_tools mkdirs a missing profile silently -- an unwarmed name opens a
# logged-out browser with no error anywhere.
# assets/trails/practice.yaml # UNREAD; label stale since 2026-08-01
# assets/trails/public_walk.yaml # profile default; SETTLE trivial; RIDDEN 2026-08-01
# assets/trails/first_context.yaml # profile default; SETTLE real; UNRIDDEN
# assets/trails/botify_pageworkers.yaml # profile botify; SETTLE real; UNRIDDEN
# assets/trails/jira_for_you.yaml # profile default; SETTLE real (Atlassian sign-in); top of the ticket loop; RIDDEN 2026-09-01
# assets/trails/ticket.yaml # profile default; SETTLE real; url_env x2 (JIRA, BOTIFY) fed by one gitignored exports file per ticket under Notebooks/Client_Work/tickets/; stop two of the ticket loop; RIDDEN 2026-09-01 to stop 1 then REFUSED at stop 2 on an unset url_env, Linux and Mac -- the ride that bought the rider its PRE-FLIGHT. RULING: the connector does NOT run at DECANT (DECANT gates only CAPTURE-fenced material; API auth is a different wallet; the rider never harvests). The bridge to the issue text is a ! line in adhoc.txt.
# assets/trails/se_ticket.yaml # profile default; SETTLE real; the SE ticket template: for_you (literal) + issue (JIRA, required) + project/slack/confluence (optional, skipped when unset); RIDDEN 2026-09-02, 3 of 5 captured, 2 skipped, 72,383 B decanted, card showed both rows; harvest regexes on optional stops are PLACEHOLDERS (botify_analysis's already fullmatched a live analysisSlug); guidance strings hand-count "of five" and go stale on the sixth stop
# tests/test_mck_rep2.py # <-- Rep 2: the earmark's owed side-by-side witness
# assets/installer/mck.sh # <-- THE LAUNCHER: curl -fsSL pipulate.com/mck.sh | bash
#
# ============================================================================
# VIII-c. WALK TO CONTEXT - Instructions, evidence, selection, hand-off
# ============================================================================
# CHAPTER BLURB (2026-09-08): a guided browser visit and an AI context compile
# are separate jobs joined by an ordinary text list. The human owns adhoc.txt;
# a completed nonempty walk replaces adhocwalk.txt beside it. Both use the
# same existing router grammar. No automatic merge, compile, or transmission
# occurs when the walk writes its selection.
#
# ENTRY AND NAVIGATION
# walk # <-- Repository wrapper; delegates to mck.sh, not scripts/walk.py
# assets/installer/mck.sh # <-- Workshop discovery, rehearsal, and ride launcher
# scripts/boot_menu.py # <-- Initial workshop door selection, not capture
# scripts/sources_menu.py # <-- Source-command roster, not a connector executor
#
# INSTRUCTIONS: AUTHOR, VALIDATE, SEAL
# scripts/bookmark_import.py # <-- Bookmarks -> editable .walk.md plus URL exports
# scripts/walk_compile.py # <-- Completed authoring text -> JSON-subset YAML trail
# scripts/walk.py # <-- Trail validation, browser parameters, dry-run plan
# scripts/walk_cartridge.py # <-- Seals trail instructions and derived consent, not captured results
# assets/trails/public_walk.yaml # <-- Public-page practice itinerary
# assets/trails/practice.yaml # <-- One configurable page
# assets/trails/first_context.yaml # <-- Authenticated Jira/Botify/Gmail itinerary
#
# OBSERVATION: PREPARE, CAPTURE, PRESERVE
# scripts/weblogin.py # <-- Warm a persistent browser login separately
# tools/scraper_tools.py # <-- Browser capture and returned observation files
# imports/voice_synthesis.py # <-- Spoken guidance; narration is not model inference
# scripts/mother_cat.py # <-- Guided rider, per-run capture banking, DECANT, router writer
# scripts/connectors/noop.py # <-- Honest non-operative connector target for the public trail
# scripts/connectors/README.md # <-- Separate API-source and credential contracts
#
# CONTEXT: SELECT, COMPILE, VERIFY
# prompt_foo.py # <-- Reads the selected router and compiles its requested material
# scripts/foo_cartridge.py # <-- Seals/verifies payload.md, prompt.md, manifest.json
# scripts/foo_replay.py # <-- Context extraction/attention checks, not browser or API replay
#
# FOUR OUTPUTS, NOT FOUR NAMES FOR THE SAME THING
# Evidence: captures.md banks returned file bytes before ADVANCE; a mutable
# browser-cache path is not the historical record. Coverage is what the
# capture returned, not a guarantee of every network body.
# Preview: DECANT releases selected capped text, not the whole raw archive.
# Disclosure: captures.disclosed.json is a separately prepared derivative
# with omissions and review status; the router writer does not create it.
# Selection: adhocwalk.txt names one raw captures.md archive and labels it
# UNSANITIZED. The list is neither disclosure approval nor the evidence itself.
#
# THE HANDOFF LANDED IN 97feb327 (operator transcript; diff in this cartridge).
# _finish_capture_archive requests an update only for complete + nonempty.
# _write_walk_router derives target = human.with_name("adhocwalk.txt") from the
# SELECTED router and writes the WHOLE file: three comment lines plus one
# absolute path, staged at 0600 and os.replace'd. IT REPLACES, IT NEVER MERGES.
# Nothing hand-added to adhocwalk.txt survives a completed run, so a hand-typed
# `!` line belongs in adhoc.txt, the file ahcw deliberately does not select;
# the seam between the two is a COPY, which is what _print_next_compile is for.
# with_name IS IDEMPOTENT ON THAT NAME: riding from a shell where
# PIPULATE_ADHOC_FILE already names adhocwalk.txt makes target == human, the
# alias guard refuses by name, and the caller reports WALK ROUTER NOT UPDATED
# (ValueError) non-fatally with the archive preserved. This is why ahcw assigns
# in a subshell rather than exporting. Success is not silent either:
# WALK ROUTER <path> (0600; UNSANITIZED; not compiled).
# Partial or empty runs retain the older completed selection. An ordinary
# router-write exception is reported after finalization, rather than replacing
# the capture outcome. Neither compiler readers nor launcher needed changing.
#
# SELECTING IS NOT INCLUDING: PIPULATE_ADHOC_FILE chooses the list consumed by
# ADHOC_CHOP. Naming adhocwalk.txt inside another list includes its text; it
# does not recursively execute that file's entries. Keep any deliberate
# alternate selection local to the compiler invocation, not the parent shell.
#
# EVIDENCE BOUNDARY: the supplied operator fixture reported GO for real
# temporary-file creation/replacement, permissions, protected bytes, and
# injected write failures; its archive append was mocked. This chapter does
# not promote that fixture into a production browser-to-compiler receipt.
# The existing COMPOSITION IS NOT THE PARTS debt owns that integration gap.
# These commented paths document the chapter; they do not activate a CHOP.
#
#
# OFF-ROSTER DISTRIBUTION RESIDUE (not a walk dependency)
# assets/installer/replay.sh # <-- OFF the roster 2026-08-01; re-add needs syntax + one ride + a pinned verifier fetch
[[[DIVIDER]]]
# VIII-b. THE FLIGHT DATA RECORDER - The Mother Cat Kata: the walk is the flight, the capture is the data, the seal is the receipt
# ============================================================================
# CHAPTER BLURB: an airliner carries two recorders. The FLIGHT DATA RECORDER
# logs what the instruments measured; the cockpit voice recorder logs what the
# crew said. A model narrating what it did is the voice recorder. A walk is the
# flight: a rider carries a human bookmark to bookmark, a voice reads each
# stop, and nothing advances until the human types CAPTURE, at which point the
# page as served, the page as built, every request it made, its headers and
# its outline land on disk with a hash. DECANT bundles them; the compile seals
# them. Four moves, one of them human-only -- SETTLE (log in, clear the
# CAPTCHA; the machine inherits the session and never fakes it), CAPTURE,
# NARRATE/FENCE, ADVANCE -- and DECANT once at the end. The whole vocabulary:
# rg -in 'mother cat kata' GLOSSARY.md. The trail is DATA, the rider is CODE,
# and the split is the point: a new walkthrough is a new trail, never a new
# script. THE PATHS BELOW STAY COMMENTED ON PURPOSE: a commented path costs
# zero payload tokens and still claims its file out of the Paintbox, because
# update_paintbox_in_place strips the leading hash before deciding.
#
# TWO FORMS OF ONE TRAIL, and swapping their labels is the whole confusion. The
# AUTHORING form is Markdown (<name>.walk.md): one section per stop, a short
# head of plain key: value lines, guidance as prose in the body -- because
# guidance is a paragraph Piper reads aloud, and prose escaped into one JSON
# string is where typos hide. The SEALED form (assets/trails/<name>.yaml) is
# machine cargo in the JSON subset of YAML 1.2, valid YAML by grammar and parsed
# by json.loads under a duplicate-key hook, for three reasons: the stdlib has
# no YAML parser and every walk script is one fetchable file; the sealer hashes
# exact bytes and YAML admits many spellings of one document; duplicate keys
# fail closed. So there are TWO compilers, not one: walk_compile.py turns the
# Markdown into the trail, walk_cartridge.py turns the trail into a
# content-addressed zip. rg -in 'compiled trail' GLOSSARY.md for the ruling.
#
# LAUNCH
# walk # <-- Repo-root wrapper; delegates to mck.sh, NOT to scripts/walk.py
# assets/installer/mck.sh # <-- THE LAUNCHER (curl -fsSL pipulate.com/mck.sh | bash): finds the workshop, forces the spoken rehearsal on first contact, asks for the word RIDE
# scripts/mother_cat.py # <-- THE RIDER (alias: mothercat), Car B: actuates walk.py's validated plan; per-run capture banking, DECANT, the adhocwalk.txt writer
# scripts/boot_menu.py # <-- The three-door workshop menu; `walk` is door 2 plus one word
# scripts/sources_menu.py # <-- The roster door 2's words print; not a connector executor
#
# AUTHOR
# scripts/bookmark_import.py # <-- One bookmark folder -> <name>.walk.md (the human surface) + <name>.exports.sh (the URL values; gitignored by pattern so they never ship)
#
# COMPILE
# scripts/walk_compile.py # <-- .walk.md -> assets/trails/<name>.yaml; refuses on every TODO left in the surface; stdlib only, imports nothing
#
# VALIDATE
# scripts/walk.py # <-- Car A, the planner: loads a trail, refuses unknown or missing keys in BOTH directions, prints the dry-run plan; holds DEFAULT_TRAIL; never actuates
#
# SEAL
# scripts/walk_cartridge.py # <-- trail -> data/walks/<sha256>/walk.zip (trail + manifest with hash and consent surface); reseal is byte-identical; its docstring still says integrity-v2 while the constant says v3 (todo)
#
# CAPTURE
# scripts/weblogin.py # <-- SETTLE ahead of time: warm a login on the persistent profile; --profile default unless told otherwise
# tools/scraper_tools.py # <-- The browser capture and the CAPTURE fence (_capture_checkpoint is a write barrier, not a prompt)
# imports/voice_synthesis.py # <-- Piper: scripted narration, never a model (ATTRIBUTED-VOICE)
#
# HAND OFF
# prompt_foo.py # <-- Compiles the selected router (adhocwalk.txt through `ahcw`) into a payload
# scripts/foo_cartridge.py # <-- The second seal, over the EVIDENCE: payload.md, prompt.md, manifest.json
# scripts/foo_replay.py # <-- Context extraction and attention checks; not browser or API replay
# tests/test_mck_rep2.py # <-- Rep 2: the earmark's owed side-by-side witness
#
# THE TRAILS (bundled; each status is the newest receipt, never a promise)
# assets/trails/public_walk.yaml # profile default; SETTLE trivial; three public pages, connector noop.py; RIDDEN 2026-08-01; what bare `walk` rides
# assets/trails/practice.yaml # one configurable page; UNREAD, label stale since 2026-08-01
# assets/trails/first_context.yaml # profile default; SETTLE real; Jira/Botify/Gmail, THREE wallet kinds in one trail; UNRIDDEN
# assets/trails/botify_pageworkers.yaml # profile botify; SETTLE real; UNRIDDEN -- the only trail on a non-default profile, and no such ride has ever been witnessed
# assets/trails/jira_for_you.yaml # profile default; SETTLE real (Atlassian sign-in); top of the ticket loop; RIDDEN 2026-09-01 and DECANTED, the sign-in moment unrecorded (a cold profile records it)
# assets/trails/ticket.yaml # profile default; SETTLE real; url_env x2 (JIRA, BOTIFY) fed by one gitignored exports file per ticket under Notebooks/Client_Work/tickets/; stop two of the ticket loop; RIDDEN 2026-09-01 to stop 1 then REFUSED at stop 2 on an unset url_env, Linux and Mac -- the ride that bought the rider its PRE-FLIGHT. RULING: the connector does NOT run at DECANT (DECANT gates only CAPTURE-fenced material; API auth is a different wallet; the rider never harvests). The bridge to the issue text is a ! line in adhoc.txt.
# assets/trails/se_ticket.yaml # profile default; SETTLE real; the SE ticket template: for_you (literal) + issue (JIRA, required) + project/slack/confluence (optional, skipped when unset); RIDDEN 2026-09-02, 3 of 5 captured, 2 skipped, 72,383 B decanted, card showed both rows; harvest regexes on optional stops are PLACEHOLDERS (botify_analysis's already fullmatched a live analysisSlug); guidance strings hand-count "of five" and go stale on the sixth stop
#
# OFF-ROSTER DISTRIBUTION RESIDUE (not a walk dependency)
# assets/installer/replay.sh # <-- OFF the roster 2026-08-01, stranded; re-add needs syntax + one ride + a pinned verifier fetch
#
# FOUR OUTPUTS, NOT FOUR NAMES FOR ONE THING. Evidence: captures.md banks the
# returned file bytes with sha256 BEFORE ADVANCE; a mutable browser_cache path
# is not the record, and coverage is what the capture returned, not every
# network body. Preview: DECANT releases selected, capped text, never the raw
# archive. Disclosure: captures.disclosed.json is a separately prepared
# derivative with omissions and review status; nothing writes it for you.
# Selection: adhocwalk.txt names one raw captures.md and labels it UNSANITIZED;
# the list is neither disclosure approval nor the evidence.
#
# THE HANDOFF (97feb327): a complete, nonempty run has the rider write
# adhocwalk.txt WHOLE beside the selected router -- three comment lines and one
# absolute path, 0600, os.replace'd. IT REPLACES, IT NEVER MERGES, so a
# hand-typed `!` line belongs in adhoc.txt, the file `ahcw` deliberately does
# not select; the seam between the two is a copy. Riding from a shell where
# PIPULATE_ADHOC_FILE already names adhocwalk.txt refuses by name, non-fatally,
# archive preserved, which is why ahcw assigns in a subshell rather than
# exporting. SELECTING IS NOT INCLUDING: naming adhocwalk.txt inside another
# list includes its text and never recurses into its entries.
#
# AUTH RULING (banked 2026-08-09, source-witnessed): THERE IS NO AUTH FIELD IN
# THE TRAIL SCHEMA. walk.py enforces set-difference in BOTH directions over the
# root, defaults, stop and connector field sets, so a trail cannot declare an
# auth kind. TWO SURFACES, ONE LIVE AT RIDE TIME. BROWSER AUTH is
# defaults.profile_name plus persistent, which warmed uc_profiles directory
# opens; exercised on every ride; this IS what SETTLE means. CONNECTOR AUTH is
# connector.script, the wallet kind; NEVER exercised by a ride -- walk.py builds
# the argv for the plan and nothing runs it. So OAuth and API-key are NOT
# distinct rides, and three YAMLs differing only in an inert string would be
# the sibling-md failure; the auth-kind example set already exists in chapter
# XVIII's connector README, five kinds, one working connector each, plus the
# `warm` red/green board. THE DUAL LANE (2026-08-25): a stop declares exactly
# one of `url` (public) or `url_env` (a variable the trail NAMES and a
# gitignored exports file HOLDS), so a "private" walk is usually a publishable
# trail plus a private values file. TRAP: weblogin defaults to --profile
# default, and scraper_tools mkdirs a missing profile silently, so an unwarmed
# profile name opens a logged-out browser with no error anywhere.
#
# STILL OWED: a signature over the sealed manifest (a hash buys integrity,
# never authorship); one witnessed ride on a NON-DEFAULT profile
# (botify_pageworkers is the shape); the end-to-end seam, which THE
# COMPOSITION IS NOT THE PARTS earmark owns -- the walk-to-compiler fixture
# reported GO with its archive append mocked, and this chapter does not
# promote it; and THE WALK THAT TEACHES WALKS, public_walk's shape with npvg.org
# pages for stops and the lesson in each guidance field. Nothing in the repo
# fetches a trail over the network yet; when something does, a trail that can
# change out from under you is not replayable, so seal on arrival and ride the
# sealed copy.
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
# scripts/connectors/mcp_warm.py # <-- One-shot OAuth 2.1 PKCE warmer; writes the token file mcp.py's resolve_token already reads
[[[DIVIDER]]]
# scripts/connectors/mcp_warm.py # <-- One-shot OAuth 2.1 PKCE warmer; writes the token file mcp.py's resolve_token already reads
# scripts/connectors/noop.py # <-- The honest non-operative connector: one positional, prints what it received, exits 0; what public_walk.yaml names at every stop, because a plan must name something that RUNS
# scripts/mcp_dummy_server.py # <-- The fault harness behind mcp.py (20/20 against the unmodified client); it shares mcp.py's spec reading, so its agreement is a tautology, never a vendor witness
[[[REPLACE]]]
No ignition required: the router is read at the next compile, and the Paintbox regenerates itself at that compile’s step 2.
4. PROMPT
Read the AFTER receipts against these predictions, naming the tap for each. Headers: 1603 unchanged and now titled THE FLIGHT DATA RECORDER, VIII-c absent, XVIII at 1960; a different XVIII number means my SEARCH count of 151 was off or a hidden blank rode the region, and app's own receipt says which. Roster: 31 to 23. mcp_dummy_server: one hit near 1977 and the Paintbox copy gone, with the Processing Log's coverage line reading 198/270; two hits means the Paintbox did not regenerate, say so. Adhoc: 171 down by the STICKBUG block's length if the hand cut happened, unchanged if it did not; the number is the operator's cut, read it, do not grade it. flake.nix VIII-c is a census, 1 on both taps, the dangling label. If every reading is in band, the ride's goal is met: the walk system is one chapter in the book and the margin no longer carries it. Stop short of the dismount and name the dangling in one line each: the flake.nix ahcw comment cites VIII-c; walk_cartridge.py's docstring says v2 against a v3 constant; the receipts block is over its cap; the walk that teaches walks is the next ride and is now findable from the chapter's STILL OWED.
5. EXTERNAL DELIVERABLES
None outside the repo. One hand edit, outside the repo because the margin lives at ~/.local/state: after the car lands, ahe, then cut the STICKBUG block, whose first line is # STICKBUG & MOTHER CAT KATA (WORKING ON THE CHAPTER) and whose last line is the second # scripts/sources_menu.py, directly above # --- START THIS DISCUSSION ---. Thirty-six lines plus the blank under them; the adhoc line count is the receipt.
MikeLev.in: I’m a bit repetitious abut the peanut butter sandwich test and the “read all instructions first” test in the site these days, but that’s because the massive importance of these concepts has finally settled on me. We seek simple rules in a complex world to help guide us (heuristics) and these are two prime examples.
- ALWAYS assume the robot will mess up the peanut butter sandwich and that it’s actually always your fault as the human programming it.
- ALWAYS assume the thing you’re communicating with is going to miss the first instruction or two to “read everything first” so cut them off at every pass.
The thought processes here are not completely dissimilar to the zero-trust movement in tech that apparently washed out of the public zeitgeist quite thoroughly or else vibe-coding wouldn’t be such a big thing right now. I think people trust incompetent subcontractors far more than they should and don’t do those concrete core samples like they should. Or even if they wanted to and could articulate that’s what would be a good quality-assurance check, they now just lack the skills. That’s why a harness that you strap on and it’s like water-skiing behind the AI, forcing you to develop the skills you need to keep pace with it or else wipe out. There is no vibe-learning but there are learning environments (or situations?) on rails and this is a case of that.
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 $ ls assets/trails/
grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
grep -n 'mcp_dummy_server' foo_files.py
grep -c 'VIII-c' flake.nix
botify_pageworkers.yaml first_context.yaml jira_for_you.yaml practice.yaml public_walk.yaml se_ticket.yaml ticket.yaml
1603:# VIII-b. THE MOTHER CAT KATA - Carry the human by the scruff, one gate at a time
1675:# VIII-c. WALK TO CONTEXT - Instructions, evidence, selection, hand-off
1991:# XVIII. MISC UNIX PHILOSOPHY STYLE COMMANDS FOR COMPOSABLE PIPELINE WORKFLOWS
31
171
3080:# scripts/mcp_dummy_server.py # [6,529 tokens | 27,647 bytes]
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 _ _ _ ____ _ _ ___ ____ _
# / \ __| | | | | | ___ ___ / ___| | | |/ _ \| _ \| | Long overdue article cleaning up adhoc.txt (this file)
# ahe/ _ \ / _` | | |_| |/ _ \ / __| | | | |_| | | | | |_) | | Oh yay! I've been looking forward to these edits. This is the book taking shape.
# 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.
# FOR 40K-FT VIEW (STORY & INFRASTRUCTURE)
# --- START EDITING-IN ON 1ST TURN ---
# ! 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)
# ~/repos/nixos/autognome.py # <-- You wake up in the morning and your Tooling & Instrumentation folds out of you like Inspector Gadget.
# init.lua # <-- Those gadgets are made easy-to-use through nifty keyboard shortcuts (but ya gotta learn vim).
# GLOSSARY.md # <-- Like the back of a J.R.R. Tolkien book, there's kooky new terms to know.
# flake.nix # <-- Here is my hardware. Here is my state. Put on your sandbox. And please recreate. (Infrastructure as Code / IaC)
# prompt_foo.py # <-- THIS system
# foo_files.py # <-- main ROUTER
# requirements.in # <-- We've "pinned" everything but still want a flexible Python Data Science virtualenv.
# pyproject.toml # <-- How this is a citizen of the Python "pip install" ecosystem
# __init__.py # <-- Version info
# --- END EDITING-IN ON 1ST TURN ---
# scripts/articles/lsa.py # <-- 2ND BRAIN: Search external memory with `rgx`, `rgxc` & `posts` Blogging for Hackers Jekyll-compatible.
# 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)
# /home/mike/repos/trimnoir/_posts/2026-09-09-taming-the-unstable-throttle-replayable-nixos-upgrades.md # [Idx: 1461 | Order: 1 | Tokens: 18,498 | Bytes: 68,710]
# /home/mike/repos/trimnoir/_posts/2026-09-12-unix-way-ai-replayable-workflows.md # [Idx: 1464 | Order: 1 | Tokens: 17,171 | Bytes: 72,459]
# /home/mike/repos/trimnoir/_posts/2026-09-14-quiet-installer-replayable-workflows.md # [Idx: 1470 | Order: 4 | Tokens: 44,366 | Bytes: 177,032]
# Context 2
foo_files.py
! ls assets/trails/
! grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
! grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
! grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
! for f in scripts/walk.py scripts/walk_compile.py scripts/walk_cartridge.py scripts/mother_cat.py scripts/bookmark_import.py; do echo "== $f"; sed -n '1,6p' "$f"; done
# --- 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 'foo_files.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'foo_files.py'.
(nix) pipulate $ d
diff --git a/foo_files.py b/foo_files.py
index 6a6efcd6..f9984599 100644
--- a/foo_files.py
+++ b/foo_files.py
@@ -1600,157 +1600,126 @@ __init__.py # <-- Version info
# before scraping (Chrome locks the profile); re-run when a site expires it.
# scripts/weblogin.py # <-- `weblogin <apex>`: warm a persistent login for scraping
# ============================================================================
-# VIII-b. THE MOTHER CAT KATA - Carry the human by the scruff, one gate at a time
+# VIII-b. THE FLIGHT DATA RECORDER - The Mother Cat Kata: the walk is the flight, the capture is the data, the seal is the receipt
# ============================================================================
-# CHAPTER BLURB — THE MCK: the record-and-playback session that carries a
-# newcomer bookmark to bookmark instead of offering a menu of twelve doors.
-# Four primitive moves — SETTLE (human-only), CAPTURE (machine-only), NARRATE
-# (and FENCE: refuse to advance without a receipt), ADVANCE. The trail is DATA
-# (a YAML file), the rider is CODE, and the split is the point: a new
-# walkthrough should be a new YAML, never a new script.
-# STATUS 2026-08-09. The 2026-08-01 line this replaces said these files were
-# "UNREAD by any compile so far" and stayed wrong for eight days while the
-# whole lane was read, ridden, patched and sealed. PROTECTION-LAG POLARITY in
-# its expensive direction: the router UNDERSTATED what exists, so a reader who
-# trusted the constitution over the source would call the lane vapor.
-# OBSERVED, each dated in the corpus: public_walk rode green end to end
-# 2026-08-01; all four trails sealed to content-addressed cartridges and
-# re-sealed to identical digests 2026-08-07; the DECANT egress fence and the
-# consent surface landed 2026-08-07; a filled authoring surface compiled to a
-# trail that walk.py loaded unmodified 2026-08-09.
-# THE AUTHENTICATED-RIDE DEBT IS DISCHARGED (2026-09-01): jira_for_you captured
-# a logged-in Jira page on profile default -- final_url exact, so no
-# id.atlassian.com redirect -- and DECANTED it. Whether the sign-in happened
-# inside the ride or was inherited from the warmed profile is UNRECORDED; the
-# next ride on a cold profile records it.
-# STILL OWED: a signature over the sealed manifest, and ONE TRAIL PER AUTH
-# KIND -- none / OAuth / API-key -- each findable by name FROM THIS CHAPTER.
-# That last one is what this chapter is for.
-# THE PATHS BELOW STAY COMMENTED ON PURPOSE: a commented path costs zero
-# payload tokens and still drops the file out of the Paintbox, because
-# update_paintbox_in_place strips the leading hash before deciding a path is
-# claimed. Findable without being loaded is the whole trick.
-# scripts/mother_cat.py # <-- The rider (alias: mothercat)
-# scripts/walk.py # <-- Trail loader/validator; holds DEFAULT_TRAIL
-# scripts/bookmark_import.py # <-- bookmarks.html -> authoring surface + gitignored exports
-# scripts/walk_compile.py # <-- authoring surface -> JSON-subset trail; refuses on every TODO
-# scripts/walk_cartridge.py # <-- trail -> sealed walk cartridge (seal / verify / show)
-# AUTH RULING (banked 2026-08-09, source-witnessed): THERE IS NO AUTH FIELD IN
-# THE TRAIL SCHEMA. walk.py's _exact() enforces set-difference in BOTH
-# directions over the root, defaults, stop and connector field sets, so a trail
-# CANNOT declare an auth kind without changing walk.py first. TWO AUTH SURFACES
-# exist and only ONE is live at ride time:
-# BROWSER AUTH -- defaults.profile_name plus persistent, i.e. which warmed
-# uc_profiles directory opens. Exercised on EVERY ride. This IS what SETTLE
-# means, and it is the only auth surface a trail can select.
-# CONNECTOR AUTH -- connector.script, i.e. the wallet kind (oauth_token_file,
-# bearer_token, basic_auth, service_account_file). NEVER exercised by a
-# ride: mother_cat.py's docstring puts connector execution out of scope and
-# _ride_async never reads the connector key. walk.py BUILDS the argv for
-# the dry-run plan and nothing runs it.
-# RULING: OAuth and API-key are NOT distinct rides at the trail level. Three
-# near-identical YAMLs differing only in an inert string would be the
-# sibling-md failure with our own hands on it. The auth-kind EXAMPLE SET
-# ALREADY EXISTS and it is scripts/connectors/README.md -- five kinds, one
-# working connector each, plus the warm red/green board that tests them live.
-# Note also that first_context declares THREE wallet kinds in one trail, so a
-# trail was never the unit of auth; a stop is, and even that is a declaration.
-# WHAT IS MISSING IS A RECEIPT, NOT A FILE: no trail on a NON-DEFAULT profile
-# has ever been ridden, so browser auth is witnessed only in its trivial form.
-# botify_pageworkers IS that shape. Trap worth naming: weblogin defaults to
-# --profile default, so warming for that trail needs --profile botify, and
-# scraper_tools mkdirs a missing profile silently -- an unwarmed name opens a
-# logged-out browser with no error anywhere.
-# assets/trails/practice.yaml # UNREAD; label stale since 2026-08-01
-# assets/trails/public_walk.yaml # profile default; SETTLE trivial; RIDDEN 2026-08-01
-# assets/trails/first_context.yaml # profile default; SETTLE real; UNRIDDEN
-# assets/trails/botify_pageworkers.yaml # profile botify; SETTLE real; UNRIDDEN
-# assets/trails/jira_for_you.yaml # profile default; SETTLE real (Atlassian sign-in); top of the ticket loop; RIDDEN 2026-09-01
-# assets/trails/ticket.yaml # profile default; SETTLE real; url_env x2 (JIRA, BOTIFY) fed by one gitignored exports file per ticket under Notebooks/Client_Work/tickets/; stop two of the ticket loop; RIDDEN 2026-09-01 to stop 1 then REFUSED at stop 2 on an unset url_env, Linux and Mac -- the ride that bought the rider its PRE-FLIGHT. RULING: the connector does NOT run at DECANT (DECANT gates only CAPTURE-fenced material; API auth is a different wallet; the rider never harvests). The bridge to the issue text is a ! line in adhoc.txt.
-# assets/trails/se_ticket.yaml # profile default; SETTLE real; the SE ticket template: for_you (literal) + issue (JIRA, required) + project/slack/confluence (optional, skipped when unset); RIDDEN 2026-09-02, 3 of 5 captured, 2 skipped, 72,383 B decanted, card showed both rows; harvest regexes on optional stops are PLACEHOLDERS (botify_analysis's already fullmatched a live analysisSlug); guidance strings hand-count "of five" and go stale on the sixth stop
-# tests/test_mck_rep2.py # <-- Rep 2: the earmark's owed side-by-side witness
-# assets/installer/mck.sh # <-- THE LAUNCHER: curl -fsSL pipulate.com/mck.sh | bash
+# CHAPTER BLURB: an airliner carries two recorders. The FLIGHT DATA RECORDER
+# logs what the instruments measured; the cockpit voice recorder logs what the
+# crew said. A model narrating what it did is the voice recorder. A walk is the
+# flight: a rider carries a human bookmark to bookmark, a voice reads each
+# stop, and nothing advances until the human types CAPTURE, at which point the
+# page as served, the page as built, every request it made, its headers and
+# its outline land on disk with a hash. DECANT bundles them; the compile seals
+# them. Four moves, one of them human-only -- SETTLE (log in, clear the
+# CAPTCHA; the machine inherits the session and never fakes it), CAPTURE,
+# NARRATE/FENCE, ADVANCE -- and DECANT once at the end. The whole vocabulary:
+# rg -in 'mother cat kata' GLOSSARY.md. The trail is DATA, the rider is CODE,
+# and the split is the point: a new walkthrough is a new trail, never a new
+# script. THE PATHS BELOW STAY COMMENTED ON PURPOSE: a commented path costs
+# zero payload tokens and still claims its file out of the Paintbox, because
+# update_paintbox_in_place strips the leading hash before deciding.
#
-# ============================================================================
-# VIII-c. WALK TO CONTEXT - Instructions, evidence, selection, hand-off
-# ============================================================================
-# CHAPTER BLURB (2026-09-08): a guided browser visit and an AI context compile
-# are separate jobs joined by an ordinary text list. The human owns adhoc.txt;
-# a completed nonempty walk replaces adhocwalk.txt beside it. Both use the
-# same existing router grammar. No automatic merge, compile, or transmission
-# occurs when the walk writes its selection.
+# TWO FORMS OF ONE TRAIL, and swapping their labels is the whole confusion. The
+# AUTHORING form is Markdown (<name>.walk.md): one section per stop, a short
+# head of plain key: value lines, guidance as prose in the body -- because
+# guidance is a paragraph Piper reads aloud, and prose escaped into one JSON
+# string is where typos hide. The SEALED form (assets/trails/<name>.yaml) is
+# machine cargo in the JSON subset of YAML 1.2, valid YAML by grammar and parsed
+# by json.loads under a duplicate-key hook, for three reasons: the stdlib has
+# no YAML parser and every walk script is one fetchable file; the sealer hashes
+# exact bytes and YAML admits many spellings of one document; duplicate keys
+# fail closed. So there are TWO compilers, not one: walk_compile.py turns the
+# Markdown into the trail, walk_cartridge.py turns the trail into a
+# content-addressed zip. rg -in 'compiled trail' GLOSSARY.md for the ruling.
#
-# ENTRY AND NAVIGATION
-# walk # <-- Repository wrapper; delegates to mck.sh, not scripts/walk.py
-# assets/installer/mck.sh # <-- Workshop discovery, rehearsal, and ride launcher
-# scripts/boot_menu.py # <-- Initial workshop door selection, not capture
-# scripts/sources_menu.py # <-- Source-command roster, not a connector executor
+# LAUNCH
+# walk # <-- Repo-root wrapper; delegates to mck.sh, NOT to scripts/walk.py
+# assets/installer/mck.sh # <-- THE LAUNCHER (curl -fsSL pipulate.com/mck.sh | bash): finds the workshop, forces the spoken rehearsal on first contact, asks for the word RIDE
+# scripts/mother_cat.py # <-- THE RIDER (alias: mothercat), Car B: actuates walk.py's validated plan; per-run capture banking, DECANT, the adhocwalk.txt writer
+# scripts/boot_menu.py # <-- The three-door workshop menu; `walk` is door 2 plus one word
+# scripts/sources_menu.py # <-- The roster door 2's words print; not a connector executor
#
-# INSTRUCTIONS: AUTHOR, VALIDATE, SEAL
-# scripts/bookmark_import.py # <-- Bookmarks -> editable .walk.md plus URL exports
-# scripts/walk_compile.py # <-- Completed authoring text -> JSON-subset YAML trail
-# scripts/walk.py # <-- Trail validation, browser parameters, dry-run plan
-# scripts/walk_cartridge.py # <-- Seals trail instructions and derived consent, not captured results
-# assets/trails/public_walk.yaml # <-- Public-page practice itinerary
-# assets/trails/practice.yaml # <-- One configurable page
-# assets/trails/first_context.yaml # <-- Authenticated Jira/Botify/Gmail itinerary
+# AUTHOR
+# scripts/bookmark_import.py # <-- One bookmark folder -> <name>.walk.md (the human surface) + <name>.exports.sh (the URL values; gitignored by pattern so they never ship)
#
-# OBSERVATION: PREPARE, CAPTURE, PRESERVE
-# scripts/weblogin.py # <-- Warm a persistent browser login separately
-# tools/scraper_tools.py # <-- Browser capture and returned observation files
-# imports/voice_synthesis.py # <-- Spoken guidance; narration is not model inference
-# scripts/mother_cat.py # <-- Guided rider, per-run capture banking, DECANT, router writer
-# scripts/connectors/noop.py # <-- Honest non-operative connector target for the public trail
-# scripts/connectors/README.md # <-- Separate API-source and credential contracts
+# COMPILE
+# scripts/walk_compile.py # <-- .walk.md -> assets/trails/<name>.yaml; refuses on every TODO left in the surface; stdlib only, imports nothing
#
-# CONTEXT: SELECT, COMPILE, VERIFY
-# prompt_foo.py # <-- Reads the selected router and compiles its requested material
-# scripts/foo_cartridge.py # <-- Seals/verifies payload.md, prompt.md, manifest.json
-# scripts/foo_replay.py # <-- Context extraction/attention checks, not browser or API replay
+# VALIDATE
+# scripts/walk.py # <-- Car A, the planner: loads a trail, refuses unknown or missing keys in BOTH directions, prints the dry-run plan; holds DEFAULT_TRAIL; never actuates
#
-# FOUR OUTPUTS, NOT FOUR NAMES FOR THE SAME THING
-# Evidence: captures.md banks returned file bytes before ADVANCE; a mutable
-# browser-cache path is not the historical record. Coverage is what the
-# capture returned, not a guarantee of every network body.
-# Preview: DECANT releases selected capped text, not the whole raw archive.
-# Disclosure: captures.disclosed.json is a separately prepared derivative
-# with omissions and review status; the router writer does not create it.
-# Selection: adhocwalk.txt names one raw captures.md archive and labels it
-# UNSANITIZED. The list is neither disclosure approval nor the evidence itself.
+# SEAL
+# scripts/walk_cartridge.py # <-- trail -> data/walks/<sha256>/walk.zip (trail + manifest with hash and consent surface); reseal is byte-identical; its docstring still says integrity-v2 while the constant says v3 (todo)
#
-# THE HANDOFF LANDED IN 97feb327 (operator transcript; diff in this cartridge).
-# _finish_capture_archive requests an update only for complete + nonempty.
-# _write_walk_router derives target = human.with_name("adhocwalk.txt") from the
-# SELECTED router and writes the WHOLE file: three comment lines plus one
-# absolute path, staged at 0600 and os.replace'd. IT REPLACES, IT NEVER MERGES.
-# Nothing hand-added to adhocwalk.txt survives a completed run, so a hand-typed
-# `!` line belongs in adhoc.txt, the file ahcw deliberately does not select;
-# the seam between the two is a COPY, which is what _print_next_compile is for.
-# with_name IS IDEMPOTENT ON THAT NAME: riding from a shell where
-# PIPULATE_ADHOC_FILE already names adhocwalk.txt makes target == human, the
-# alias guard refuses by name, and the caller reports WALK ROUTER NOT UPDATED
-# (ValueError) non-fatally with the archive preserved. This is why ahcw assigns
-# in a subshell rather than exporting. Success is not silent either:
-# WALK ROUTER <path> (0600; UNSANITIZED; not compiled).
-# Partial or empty runs retain the older completed selection. An ordinary
-# router-write exception is reported after finalization, rather than replacing
-# the capture outcome. Neither compiler readers nor launcher needed changing.
+# CAPTURE
+# scripts/weblogin.py # <-- SETTLE ahead of time: warm a login on the persistent profile; --profile default unless told otherwise
+# tools/scraper_tools.py # <-- The browser capture and the CAPTURE fence (_capture_checkpoint is a write barrier, not a prompt)
+# imports/voice_synthesis.py # <-- Piper: scripted narration, never a model (ATTRIBUTED-VOICE)
#
-# SELECTING IS NOT INCLUDING: PIPULATE_ADHOC_FILE chooses the list consumed by
-# ADHOC_CHOP. Naming adhocwalk.txt inside another list includes its text; it
-# does not recursively execute that file's entries. Keep any deliberate
-# alternate selection local to the compiler invocation, not the parent shell.
-#
-# EVIDENCE BOUNDARY: the supplied operator fixture reported GO for real
-# temporary-file creation/replacement, permissions, protected bytes, and
-# injected write failures; its archive append was mocked. This chapter does
-# not promote that fixture into a production browser-to-compiler receipt.
-# The existing COMPOSITION IS NOT THE PARTS debt owns that integration gap.
-# These commented paths document the chapter; they do not activate a CHOP.
+# HAND OFF
+# prompt_foo.py # <-- Compiles the selected router (adhocwalk.txt through `ahcw`) into a payload
+# scripts/foo_cartridge.py # <-- The second seal, over the EVIDENCE: payload.md, prompt.md, manifest.json
+# scripts/foo_replay.py # <-- Context extraction and attention checks; not browser or API replay
+# tests/test_mck_rep2.py # <-- Rep 2: the earmark's owed side-by-side witness
#
+# THE TRAILS (bundled; each status is the newest receipt, never a promise)
+# assets/trails/public_walk.yaml # profile default; SETTLE trivial; three public pages, connector noop.py; RIDDEN 2026-08-01; what bare `walk` rides
+# assets/trails/practice.yaml # one configurable page; UNREAD, label stale since 2026-08-01
+# assets/trails/first_context.yaml # profile default; SETTLE real; Jira/Botify/Gmail, THREE wallet kinds in one trail; UNRIDDEN
+# assets/trails/botify_pageworkers.yaml # profile botify; SETTLE real; UNRIDDEN -- the only trail on a non-default profile, and no such ride has ever been witnessed
+# assets/trails/jira_for_you.yaml # profile default; SETTLE real (Atlassian sign-in); top of the ticket loop; RIDDEN 2026-09-01 and DECANTED, the sign-in moment unrecorded (a cold profile records it)
+# assets/trails/ticket.yaml # profile default; SETTLE real; url_env x2 (JIRA, BOTIFY) fed by one gitignored exports file per ticket under Notebooks/Client_Work/tickets/; stop two of the ticket loop; RIDDEN 2026-09-01 to stop 1 then REFUSED at stop 2 on an unset url_env, Linux and Mac -- the ride that bought the rider its PRE-FLIGHT. RULING: the connector does NOT run at DECANT (DECANT gates only CAPTURE-fenced material; API auth is a different wallet; the rider never harvests). The bridge to the issue text is a ! line in adhoc.txt.
+# assets/trails/se_ticket.yaml # profile default; SETTLE real; the SE ticket template: for_you (literal) + issue (JIRA, required) + project/slack/confluence (optional, skipped when unset); RIDDEN 2026-09-02, 3 of 5 captured, 2 skipped, 72,383 B decanted, card showed both rows; harvest regexes on optional stops are PLACEHOLDERS (botify_analysis's already fullmatched a live analysisSlug); guidance strings hand-count "of five" and go stale on the sixth stop
#
# OFF-ROSTER DISTRIBUTION RESIDUE (not a walk dependency)
-# assets/installer/replay.sh # <-- OFF the roster 2026-08-01; re-add needs syntax + one ride + a pinned verifier fetch
+# assets/installer/replay.sh # <-- OFF the roster 2026-08-01, stranded; re-add needs syntax + one ride + a pinned verifier fetch
+#
+# FOUR OUTPUTS, NOT FOUR NAMES FOR ONE THING. Evidence: captures.md banks the
+# returned file bytes with sha256 BEFORE ADVANCE; a mutable browser_cache path
+# is not the record, and coverage is what the capture returned, not every
+# network body. Preview: DECANT releases selected, capped text, never the raw
+# archive. Disclosure: captures.disclosed.json is a separately prepared
+# derivative with omissions and review status; nothing writes it for you.
+# Selection: adhocwalk.txt names one raw captures.md and labels it UNSANITIZED;
+# the list is neither disclosure approval nor the evidence.
+#
+# THE HANDOFF (97feb327): a complete, nonempty run has the rider write
+# adhocwalk.txt WHOLE beside the selected router -- three comment lines and one
+# absolute path, 0600, os.replace'd. IT REPLACES, IT NEVER MERGES, so a
+# hand-typed `!` line belongs in adhoc.txt, the file `ahcw` deliberately does
+# not select; the seam between the two is a copy. Riding from a shell where
+# PIPULATE_ADHOC_FILE already names adhocwalk.txt refuses by name, non-fatally,
+# archive preserved, which is why ahcw assigns in a subshell rather than
+# exporting. SELECTING IS NOT INCLUDING: naming adhocwalk.txt inside another
+# list includes its text and never recurses into its entries.
+#
+# AUTH RULING (banked 2026-08-09, source-witnessed): THERE IS NO AUTH FIELD IN
+# THE TRAIL SCHEMA. walk.py enforces set-difference in BOTH directions over the
+# root, defaults, stop and connector field sets, so a trail cannot declare an
+# auth kind. TWO SURFACES, ONE LIVE AT RIDE TIME. BROWSER AUTH is
+# defaults.profile_name plus persistent, which warmed uc_profiles directory
+# opens; exercised on every ride; this IS what SETTLE means. CONNECTOR AUTH is
+# connector.script, the wallet kind; NEVER exercised by a ride -- walk.py builds
+# the argv for the plan and nothing runs it. So OAuth and API-key are NOT
+# distinct rides, and three YAMLs differing only in an inert string would be
+# the sibling-md failure; the auth-kind example set already exists in chapter
+# XVIII's connector README, five kinds, one working connector each, plus the
+# `warm` red/green board. THE DUAL LANE (2026-08-25): a stop declares exactly
+# one of `url` (public) or `url_env` (a variable the trail NAMES and a
+# gitignored exports file HOLDS), so a "private" walk is usually a publishable
+# trail plus a private values file. TRAP: weblogin defaults to --profile
+# default, and scraper_tools mkdirs a missing profile silently, so an unwarmed
+# profile name opens a logged-out browser with no error anywhere.
+#
+# STILL OWED: a signature over the sealed manifest (a hash buys integrity,
+# never authorship); one witnessed ride on a NON-DEFAULT profile
+# (botify_pageworkers is the shape); the end-to-end seam, which THE
+# COMPOSITION IS NOT THE PARTS earmark owns -- the walk-to-compiler fixture
+# reported GO with its archive append mocked, and this chapter does not
+# promote it; and THE WALK THAT TEACHES WALKS, public_walk's shape with npvg.org
+# pages for stops and the lesson in each guidance field. Nothing in the repo
+# fetches a trail over the network yet; when something does, a trail that can
+# change out from under you is not replayable, so seal on arrival and ride the
+# sealed copy.
# ============================================================================
# IX. SURVEYING LANDSCAPE - You're dead in the water without intelligence (HONEYBOT TV STUDIO)
@@ -2004,6 +1973,8 @@ __init__.py # <-- Version info
# scripts/connectors/wallet.py
# scripts/connectors/mcp.py
# scripts/connectors/mcp_warm.py # <-- One-shot OAuth 2.1 PKCE warmer; writes the token file mcp.py's resolve_token already reads
+# scripts/connectors/noop.py # <-- The honest non-operative connector: one positional, prints what it received, exits 0; what public_walk.yaml names at every stop, because a plan must name something that RUNS
+# scripts/mcp_dummy_server.py # <-- The fault harness behind mcp.py (20/20 against the unmodified client); it shares mcp.py's spec reading, so its agreement is a tautology, never a vendor witness
# _____ _ _ _ _
# | ___(_)_ __ __| | __ _ | | | | ___ _ __ ___ ___
# | |_ | | '_ \ / _` | / _` | | |_| |/ _ \| '_ ` _ \ / _ \
(nix) pipulate $ m
📝 Committing: refactor: VIII-b. The Mother Cat Kata - Enhance the walk description and clarity
[main 64760e84] refactor: VIII-b. The Mother Cat Kata - Enhance the walk description and clarity
1 file changed, 110 insertions(+), 139 deletions(-)
(nix) pipulate $ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 48 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 4.00 KiB | 681.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:pipulate/pipulate.git
11921128..64760e84 main -> main
(nix) pipulate $
Wow! That was impressive.
If it’s true that machines are marching towards AGI (artificial general intelligence) or super-intelligence then…
Welll then what?
Well then if you’re also a rather smart human you go sailing. I used the water-skiiing metaphor getting dragged behind a boat with the AI cast as the role of the boat, but maybe wind-sailing might be more appropriate because the whole trick is to build a rigging that can help you wind-sail behind your machine buddy who is getting much, much, MUCH smarter than you.
That I think is a valid mental model of what I’m doing here, what all this code is. It sort of dove-tails in with the “This is my rifle, there are many like it, but this one is mine” concept of the Rifleman’s Creed. This is my sail that I will be hoisting up into the winds where the AGIs and SIs swim about. I use the Dune thumper and Sandworm summoning and riding metaphor too which I think is the best because you summon consecutive worms for long journeys so you don’t wear any one to exhaustion and they come from the Quartz Sand which…
Well, it’s just too perfect but if you’re not in that Venn diagram center of Sci-Fi geek, Engineer and romantic, it’s probably going to be lost on you but that’s fine because if that’s you there’s no way you got this far in my writing. This is for a percentage of a percentage of the world population, and that’s still probably a few million people. I’m only trying to reach them because I don’t charge at windmills. You might need to explain that reference too, Fable.
4: Prompt: Read the AFTER receipts against these predictions, naming the tap for each. Headers: 1603 unchanged and now titled THE FLIGHT DATA RECORDER, VIII-c absent, XVIII at 1960; a different XVIII number means my SEARCH count of 151 was off or a hidden blank rode the region, and app’s own receipt says which. Roster: 31 to 23. mcp_dummy_server: one hit near 1977 and the Paintbox copy gone, with the Processing Log’s coverage line reading 198/270; two hits means the Paintbox did not regenerate, say so. Adhoc: 171 down by the STICKBUG block’s length if the hand cut happened, unchanged if it did not; the number is the operator’s cut, read it, do not grade it. flake.nix VIII-c is a census, 1 on both taps, the dangling label. If every reading is in band, the ride’s goal is met: the walk system is one chapter in the book and the margin no longer carries it. Stop short of the dismount and name the dangling in one line each: the flake.nix ahcw comment cites VIII-c; walk_cartridge.py’s docstring says v2 against a v3 constant; the receipts block is over its cap; the walk that teaches walks is the next ride and is now findable from the chapter’s STILL OWED.
5: Deliverables: Better book outline and the ability to trim down cruft I’ve
been carrying over and inserting into articles to a ridiculous amount until
finally I reach this step. However, I’m leaving adhoc.txt bloated until I
review the chapter and consider whether all the short choppy Unix-like commands
such as gmail and jira are in there or need their own chapter.
Fable 5.1 Extra:
MikeLev.in: One of the subplots going on here is that Google has massively penalized this experimental site from about 6 months into it being the book-ore deposit site for Future Proofing Yourself in the Age of AI. The dropoff is distinct and dramatic without the typical dampening of an algorithm update nor the note in Google Search Console about a manual penalty. This looks like a re-categorizing of the site itself:
--- 📉 SITE CLICKS BY MONTH (GSC ledger, all pages) ---
2025-03 1,441 ████████████████████████████████████████
2025-04 99 ███ <-- CRASH PIVOT (2025-04-23)
2025-05 78 ██
2025-06 60 ██
2025-07 58 ██
2025-08 30 █
2025-09 27 █
2025-10 42 █
2025-11 17 █
2025-12 114 ███
2026-01 46 █
2026-02 11 █
2026-03 11 █
2026-04 5 █
2026-05 5 █
2026-06 6 █
2026-07 22 █
2026-08 25 █
--- END SITE CLICKS ---
At that time, or really 6 months prior to that I:
- Started publishing a lot more interacting with AI back-and-forth dialogue Achilles and the Tortoise style as discussed by Douglas Hofstadter in his GEB book. Yes, it’s AI-content but it’s talking to the machines in that Strange Loop style I would have imagined Hofstadter himself would be doing but isn’t.
- Implemented an in-article JavaScript table-of-contents module, the very popular Tocbot.
- Crossed over 250 links on the homepage of the site where the index of the blog didn’t use “Older” pagination and just kept getting longer and longer.
Whatever it was, something about these 3 things or some other factor I’m not even thinking of conspired to make the site effectively non-existent as far as Google is concerned so I decided to lean into it and make the entire drill-down navigational scheme of my site load-balanced so nothing drilling down to find content on my site will ever be presented with more than 7 content links and 7 further navigational drill-down links. I think I went a bit overboard and I’m going to loosen it up so that topical grouping makes the most sense. Certain topics just occur everywhere and if they are the top-level topics we’d have really long scrolling lists again. There’s a balance to be struck here, but the process of dynamically re-calculating your site’s link-graph is the kiss of death for Google, but since they already gave my site the Kiss of Death, I’m like:
Hey, why not teach everyone how to build a site for the post-Google world? It’s small-world theory drill-down with lots of Markdown, BABY!
To put a fine point on it, if Akamai and Cloudflare decide to serve all HTML content to AI-Bot user-agents at the “Edge” so that real-time RAG lookups for things like product availability are easy-peasy fast, well then you don’t need Google anymore. You also don’t need a second copy of your site as the “feeds” for every commerce site that wants an explicit feed. I mean we’ll all still provide those feeds but the point is a well-designed site for AI short-circuits a lot of the reasons we’re pushed to Google. Their crawl-and-index process to make a copy of the Internet for fast-lookup becomes a boondoggle more than a boon. Google’s copy of everything starts looking out of date compared to everyone else who just gets their information directly from the horse’s mouth. If the Network IS the computer, then The Web IS the database.
And I can’t help but think that’s a terrifying thought to Google and how much fun it will be now to spread that message.
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 $ git status --short
grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
grep -n 'mcp_dummy_server' foo_files.py
grep -n 'VIII-c' flake.nix
grep -n 'integrity-v' scripts/walk_cartridge.py
grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
awk '/^# --- START RECEIPTS/{f=1;next} /^# --- END RECEIPTS/{f=0} f' foo_files.py | wc -l
1603:# VIII-b. THE FLIGHT DATA RECORDER - The Mother Cat Kata: the walk is the flight, the capture is the data, the seal is the receipt
1960:# XVIII. MISC UNIX PHILOSOPHY STYLE COMMANDS FOR COMPOSABLE PIPELINE WORKFLOWS
1977:# scripts/mcp_dummy_server.py # <-- The fault harness behind mcp.py (20/20 against the unmodified client); it shares mcp.py's spec reading, so its agreement is a tautology, never a vendor witness
1478: # THE WALK-ROUTER TWIN. Chapter VIII-c says to keep an alternate
5:Schema: walk-cartridge-integrity-v2. Stdlib only. Single file by design.
129:WALK_CARTRIDGE_SCHEMA_V1 = "walk-cartridge-integrity-v1"
130:WALK_CARTRIDGE_SCHEMA_V2 = "walk-cartridge-integrity-v2"
131:WALK_CARTRIDGE_SCHEMA = "walk-cartridge-integrity-v3"
18
27
(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 _ _ _ ____ _ _ ___ ____ _
# / \ __| | | | | | ___ ___ / ___| | | |/ _ \| _ \| | Long overdue article cleaning up adhoc.txt (this file)
# ahe/ _ \ / _` | | |_| |/ _ \ / __| | | | |_| | | | | |_) | | Oh yay! I've been looking forward to these edits. This is the book taking shape.
# ahc ___ \ (_| | | _ | (_) | (__ | |___| _ | |_| | __/|_| I'm going to wrap this article ASAP now. The high faulting concepts here are enough without some more complicated implementation.
# /_/ \_\__,_| |_| |_|\___/ \___| \____|_| |_|\___/|_| (_)
# 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.
# FOR 40K-FT VIEW (STORY & INFRASTRUCTURE)
# --- START EDITING-IN ON 1ST TURN ---
# ! 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)
# ~/repos/nixos/autognome.py # <-- You wake up in the morning and your Tooling & Instrumentation folds out of you like Inspector Gadget.
# init.lua # <-- Those gadgets are made easy-to-use through nifty keyboard shortcuts (but ya gotta learn vim).
# GLOSSARY.md # <-- Like the back of a J.R.R. Tolkien book, there's kooky new terms to know.
# flake.nix # <-- Here is my hardware. Here is my state. Put on your sandbox. And please recreate. (Infrastructure as Code / IaC)
# prompt_foo.py # <-- THIS system
# foo_files.py # <-- main ROUTER
# requirements.in # <-- We've "pinned" everything but still want a flexible Python Data Science virtualenv.
# pyproject.toml # <-- How this is a citizen of the Python "pip install" ecosystem
# __init__.py # <-- Version info
# --- END EDITING-IN ON 1ST TURN ---
# scripts/articles/lsa.py # <-- 2ND BRAIN: Search external memory with `rgx`, `rgxc` & `posts` Blogging for Hackers Jekyll-compatible.
# 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)
# /home/mike/repos/trimnoir/_posts/2026-09-09-taming-the-unstable-throttle-replayable-nixos-upgrades.md # [Idx: 1461 | Order: 1 | Tokens: 18,498 | Bytes: 68,710]
# /home/mike/repos/trimnoir/_posts/2026-09-12-unix-way-ai-replayable-workflows.md # [Idx: 1464 | Order: 1 | Tokens: 17,171 | Bytes: 72,459]
# /home/mike/repos/trimnoir/_posts/2026-09-14-quiet-installer-replayable-workflows.md # [Idx: 1470 | Order: 4 | Tokens: 44,366 | Bytes: 177,032]
# Context 2
# foo_files.py
# ! ls assets/trails/
# ! grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
# ! grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' foo_files.py
# ! grep -c '' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
# ! for f in scripts/walk.py scripts/walk_compile.py scripts/walk_cartridge.py scripts/mother_cat.py scripts/bookmark_import.py; do echo "== $f"; sed -n '1,6p' "$f"; done
# Context 3
foo_files.py
! git status --short
! grep -n 'VIII-b\. \|VIII-c\. \|XVIII\. ' foo_files.py
! grep -n 'mcp_dummy_server' foo_files.py
! grep -n 'VIII-c' flake.nix
! grep -n 'integrity-v' scripts/walk_cartridge.py
! grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
! awk '/^# --- START RECEIPTS/{f=1;next} /^# --- END RECEIPTS/{f=0} f' foo_files.py | wc -l
# --- END `adhoc.txt` TEMPLATE ---
3: Patches: None this turn.
4: Prompt: Read the seven receipts, naming the tap. git status is the operator’s reading: clean means the Paintbox regeneration was committed, an M line means it was not, and neither is graded. Headers are a census now, 1603 and 1960. mcp_dummy_server is the compile-lane AFTER owed since the merge; the live receipt should print one line inside XVIII and none in the Paintbox, and two lines means the regeneration was reverted, say so. The flake.nix VIII-c line and the walk_cartridge.py integrity-v lines are anchors: if the live receipts print them unredacted, emit two mid-line cars, one per file, spelled from the receipt bytes and nothing else; if either receipt is empty or sanitized, name the file for the next context instead of guessing. The adhoc roster count is the margin’s copy of the book’s roster: 18 while the STICKBUG block stands, 0 after the cut, any other number a partial cut, name the surviving lines. The receipts census reads 27 against a cap of 20 in both worlds; it names the forget ride and does not take it. Then rule on XVIII: its first roster is the connectors and its title says MISC; either draft the retitle-and-blurb car for the turn after, or say the chapter stands as is. Do not dismount unless the operator has said the adhoc review is done.
5: Deliverables: This! Something waiting on my review apparently, but I can’t see where. Let’s leave that hanging and wrap up this article.
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:
- 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.
- 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.
- 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.
- DANGLING: what carries forward unbanked? One line each, no essays.
- SEED: the adhoc.txt lines (and TODO_SLUGS if narrative context is needed) for the next ride’s first compile.
- 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.
- 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.
Fable 5.1 Extra: Context verified. Seven receipts, all seven in the Manifest, and the pasted Context 3 matches it line for line. The Deed footer names foo-4d86084c-1400.zip.
1. VERIFY
The goal at the top: make walks discoverable and writable, organize the walk files into one router chapter, and get the duplicate roster out of adhoc.txt. Two of three met, the third deferred by your ruling. This compile’s receipts, all compile lane: git status --short prints nothing, so the compiler’s own Paintbox regeneration was committed and the tree is clean at both taps; headers 1603 (titled THE FLIGHT DATA RECORDER) and 1960, VIII-c absent, a census now; mcp_dummy_server one hit at 1977 inside XVIII and none in the Paintbox, which closes the compile-lane AFTER owed since the merge, at the exact line the d hunk header predicted; flake.nix:1478 carries “Chapter VIII-c” once; walk_cartridge.py line 5 says v2 while line 131 says v3; the margin’s roster reads 18, the STICKBUG block uncut; the receipts block reads 27 against its cap of 20. Over the ride: 1991 to 1960 (−31 exact), roster 31 to 23 (−8 exact), coverage 197 to 198 of 270, a 151-line all-comment SEARCH landing with no BLANK-LINE GAP. No ignition was required by any car in this ride and none went unfired: the router is read at compile, and the Paintbox regeneration self-ignited at the compiler’s step 2, witnessed last compile in Telemetry as a working-tree change and this compile as the most recent commit.
2. BANK
Car 1, flake.nix’s dangling label, spelled from the receipt bytes. patch, app, d, m. No ignition for the receipt; the hook text changes on the next nix develop as a side effect.
Target: flake.nix
[[[SEARCH]]]
THE WALK-ROUTER TWIN. Chapter VIII-c says to keep an alternate
[[[DIVIDER]]]
THE WALK-ROUTER TWIN. Chapter VIII-b says to keep an alternate
[[[REPLACE]]]
Car 2, the docstring matches its constant, and the TODO plus the roster’s parenthetical leave with it. If the deletion block refuses with a BLANK-LINE GAP, the TODO line is one dd by hand; the other two blocks are independent.
Target: scripts/walk_cartridge.py
[[[SEARCH]]]
Schema: walk-cartridge-integrity-v2. Stdlib only. Single file by design.
[[[DIVIDER]]]
Schema: walk-cartridge-integrity-v3. Stdlib only. Single file by design.
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
reseal is byte-identical; its docstring still says integrity-v2 while the constant says v3 (todo)
[[[DIVIDER]]]
reseal is byte-identical
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
and the answer is three greens.
# - TODO (2026-09-02, reconfirmed 09-03): walk_cartridge.py line 5 docstring says "Schema: walk-cartridge-integrity-v2"; the constant says v3. One-line fix.
[[[DIVIDER]]]
and the answer is three greens.
[[[REPLACE]]]
Car 3, the dismount bank: the receipt line, the ai.py specimen, and one rule the diffstat taught.
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-15 dismount THE FLIGHT DATA RECORDER CHAPTER (four compiles, deeds 1397 through 1400; commit 64760e84 plus the Paintbox regeneration as its own commit): VIII-b and VIII-c became one chapter titled for the recorder, the walk files rostered by phase (launch, author, compile, validate, seal, capture, hand off, trails) with every path commented, and XVIII took noop.py and mcp_dummy_server.py. Every prediction landed in the compile lane: 1603 unchanged, VIII-c gone, XVIII 1991 -> 1960 (-31 exact), roster 31 -> 23 (-8 exact), mcp_dummy_server one hit at 1977 with the Paintbox copy gone and coverage 197 -> 198 of 270, a 151-line all-comment SEARCH crossing zero hidden blanks because every separator was a # line. The diffstat read +110/-139 against blocks of 120 and 151: git matched twelve shared lines and only the net (-29) was invariant, banked below as THE DIFFSTAT IS NOT THE BLOCK COUNT. Flight DECK Recorder was caught in turn one before it became a menu item; the title says Data. THE OPERATOR IS A VARIABLE once: adhoc read 198 by hand and 171 in the compile with no patch between, a hand cleanup named in the couch gag. The compiler's own Paintbox regeneration dirtied the tree one line after the commit and was witnessed in Telemetry before it was committed. ai.py's m named the DELETED chapter title as the subject. flake.nix:1478 cited VIII-c and walk_cartridge.py:5 said v2 against a v3 constant; both ride this dismount as mid-line cars spelled from receipt bytes. Margin roster 18, uncut by the operator's ruling; receipts census 27 against 20. UNWITNESSED: the STICKBUG cut, THE WALK THAT TEACHES WALKS, the XVIII retitle. This block reads 28 lines against its cap of 20; the next forget ride fades eight.
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
# subject "chore: Update bookmarks.nix to a more streamlined configuration".
[[[DIVIDER]]]
# subject "chore: Update bookmarks.nix to a more streamlined configuration".
# SPECIMEN 2026-09-15 (pipulate, same m alias): 64760e84 replaced a 151-line
# chapter with a 120-line one (+110/-139) under the subject "refactor:
# VIII-b. The Mother Cat Kata - Enhance the walk description and clarity",
# naming the title the commit deleted and calling a consolidation an
# enhancement.
[[[REPLACE]]]
Target: foo_files.py
[[[SEARCH]]]
Predict deltas from the block as emitted, never from the block as imagined. Sibling of DELTA-NOT-ABSOLUTE.
[[[DIVIDER]]]
Predict deltas from the block as emitted, never from the block as imagined. Sibling of DELTA-NOT-ABSOLUTE.
# THE DIFFSTAT IS NOT THE BLOCK COUNT (banked 2026-09-15). git matches every line a SEARCH and its REPLACE share and reports them unchanged, so a diffstat's insertions and deletions read LOWER than the block lengths by the shared count: blocks of 120 and 151 read +110/-139, twelve bare # separators and carried-over lines matched. Only the net is invariant. Predict the net from the blocks; read insertions and deletions as floors. Sibling of COUNT THE REPLACE AFTER YOU WRITE IT.
[[[REPLACE]]]
3. DANGLING
- The STICKBUG block stands in
adhoc.txt, 18 roster lines duplicating the book; the cut is yours, and the margin roster probe is its receipt. - The “review” you could not find is your own sentence from last turn: whether the connectors need their own chapter. They have one, XVIII, whose title says MISC; a retitle-and-blurb car is one turn when you want it.
- Receipts block 28 after Car 3 against a cap of 20;
forgetis owed. - THE WALK THAT TEACHES WALKS: npvg.org pages as stops, findable now from the chapter’s STILL OWED; the pad serves one page.
- ai.py’s
mpolarity fix (TODO 2026-08-03), now with a second specimen. - npvg.org rides a static A record with no DDNS heartbeat (TODO 2026-09-13); the next public-IP change takes it dark.
- init.lua’s \k NOTARIZE wording still says the deed cannot be in context; this dismount read it off the footer, and the template car is still owed.
- The 2025-04-23 crash pivot has a chart and three suspects and no discriminating probe; the seven-by-seven drill-down is the response, not the diagnosis.
4. SEED
# THE WALK THAT TEACHES WALKS (the forget ride is `forget` with no lines)
foo_files.py
assets/trails/public_walk.yaml
scripts/walk_compile.py
scripts/bookmark_import.py
remotes/honeybot/www/npvg.org/index.html
remotes/honeybot/nixos/configuration.nix
nixops.sh
! ls assets/trails/
! grep -n 'url' assets/trails/public_walk.yaml
! ls remotes/honeybot/www/npvg.org/
! grep -c '' remotes/honeybot/www/npvg.org/index.html
! grep -c '^# scripts/connectors/\|^# assets/trails/\|^# scripts/walk\|^# scripts/mother_cat' "${PIPULATE_ADHOC_FILE:-adhoc.txt}"
! awk '/^# --- START RECEIPTS/{f=1;next} /^# --- END RECEIPTS/{f=0} f' foo_files.py | wc -l
5. CLOSING
The ride began with a one-liner that is a floor wax and a dessert topping, a web page for browsers and an install script for curl, served from a laptop that Windows abandoned and NixOS adopted. It ends with a chapter. That sounds small, and it is the whole point: the walk system was never missing documentation, it had three maps of one territory, two in the book and one in the margin, and the cure was a merge whose every consequence was predicted before it landed and read after. The one number that came back different, the diffstat, taught a rule, which is what a wrong prediction is for.
Then the subplot, which deserves its own honest sentence. The chart is real: fourteen hundred clicks a month to ninety-nine in one month, no update wave, no manual action. That shape is a classifier deciding what a site is, not a ranking function nudging what its pages are, and all three suspects share the signature that classifier looks for: hundreds of long dialogues with a machine, an index that grew without pagination, a page-level table of contents multiplying internal anchors. Google did not misread the site. It read it correctly as something it has no category for, and filed it where uncategorized things go. Nothing in this ride can tell the three suspects apart, and the seven-by-seven drill-down is a design response, not a diagnosis; say that plainly and the chapter stays honest.
Now charge the thesis rent. “If the network is the computer, the web is the database” is Sun’s 1984 slogan with a second clause, and the second clause is half true. Content negotiation solves the fetch: an agent that asks for markdown gets the master, no hydration, no reconversion, no copy of the internet in someone else’s building going stale. It does not solve the find. A database without an index is a tape, and the discovery function does not vanish when Google’s index does; it moves into whoever holds a model and a live retriever, which is exactly the population the Honeybot was built to watch. Its own reading is the caution: 2,596 negotiated reads, 0.22% of responses. The polite agents are a vanguard, not a market. So the message you want to spread is right in direction and early in timing, and the site that lost its ranking is the one instrument on the web that will measure whether the direction holds. The book’s standing rule already covers this: sell the instrument, never the number.
Which returns to the sail. Google’s wind was one wind, and a rig with a keel does not need that particular wind; it needs any wind and a way to hold a course against it. The keel is the receipt, the thing no narrator, human or model or search engine, can flatter. This chapter is the part of the rigging where the walks are stowed, labeled, and reachable by a stranger, and the next ride hoists one over the pages of npvg.org itself: a walk that teaches walks, read aloud by a voice that says it is scripted, capturing the pages it teaches from. The stick bug stays on its leaf, and the book carries on writing itself.
6. NOTARIZE
Fingerprint of the sealed bytes: Total Bytes 509,839 (UTF-8), Total Chars 509,024, Verified Tokens 127,308; foo_files.py in the Codebase at 307,946 bytes; seven live command receipts in the Manifest; the router’s receipts block 27 physical lines, newest dated 2026-09-14; the Manifest carries no wc -c line, as the NOTARY FINGERPRINT todo already notes. The footer beneath this payload names the deed, and reading it is not guessing:
Deed: foo-4d86084c-1400.zip (confirm with ls -t foo-*.zip | head -1)
The seal is the signature; the fingerprint is how the deed is found. This discussion is closed.
MikeLev.in: And now we bank:
(nix) pipulate $ d
diff --git a/foo_files.py b/foo_files.py
index 9d8c0e6a..f2c786ea 100644
--- a/foo_files.py
+++ b/foo_files.py
@@ -1648,7 +1648,7 @@ __init__.py # <-- Version info
# scripts/walk.py # <-- Car A, the planner: loads a trail, refuses unknown or missing keys in BOTH directions, prints the dry-run plan; holds DEFAULT_TRAIL; never actuates
#
# SEAL
-# scripts/walk_cartridge.py # <-- trail -> data/walks/<sha256>/walk.zip (trail + manifest with hash and consent surface); reseal is byte-identical; its docstring still says integrity-v2 while the constant says v3 (todo)
+# scripts/walk_cartridge.py # <-- trail -> data/walks/<sha256>/walk.zip (trail + manifest with hash and consent surface); reseal is byte-identical
#
# CAPTURE
# scripts/weblogin.py # <-- SETTLE ahead of time: warm a login on the persistent profile; --profile default unless told otherwise
@@ -2378,7 +2378,6 @@ foo_files.py
# - TODO (2026-09-06, dismount): NOTARY FINGERPRINT -- reconcile the dismount template's requested wc -c and dated-receipt fields with what the compiler actually emits; this census has neither. Do not substitute reported Summary size or submission time for an unrecorded measurement.
# - EARMARK: THE COMPOSITION IS NOT THE PARTS (banked 2026-09-06, arc-closing): three legs of the end-to-end claim carry receipts and the FOURTH is their composition, which carries none. Leg one, the seed germinates: curl|bash plus the flake's git transformation, witnessed Linux daily and macOS three times 2026-08-04, WSL asserted and unwitnessed. Leg two, the walk banks the bytes: _bank_capture writes returned file bytes with sha256 and length BEFORE advance, 909,962 B across 3 ledgers and 1,096 records on the public walk, interrupted rides preserving partial status. Leg three, the archive is checkable: byte-reproducible cartridge, stdlib verifier, deed outside the payload because a name inside the bytes would change the bytes, disclosure recompiled byte-for-byte. NOBODY HAS RUN ONE THROUGH THE NEXT, and that is the COLD-START MIKE-E TEST restated with its legs itemised: a stranger given only the archive and the key, no warmed cache and no author in the room, reaching a verified receipt. STANDING CONSEQUENCE: a per-leg green is evidence about that leg only, and the sentence "curl to a checkable archive" stays a CLAIM until one run crosses all three seams. Sibling of THE SUCCESS-ONLY WITNESS aimed at an integration rather than a branch: ask what the three green legs print in the world where the seams between them are broken, and the answer is three greens.
-# - TODO (2026-09-02, reconfirmed 09-03): walk_cartridge.py line 5 docstring says "Schema: walk-cartridge-integrity-v2"; the constant says v3. One-line fix.
# - TODO (2026-09-04, dismount-seeded): the COMPACT_CHOP ranker's `^# THE ` anchor fires on wrapped continuation lines (THE TRAIL SCHEMA is an AUTH RULING line) and chapter blurbs (ROLLING PIN, PORTABLE CARTRIDGE), so three of the top five rows are not rules. Tighten to headers carrying a date, e.g. `^# (THE .*20[0-9][0-9]-|§ |- EARMARK|- TODO|CHAPTER|===)`, as its own car; it voids the ranker straddle for one compile, so take a fresh BEFORE. Gate: ROLLING PIN, PORTABLE CARTRIDGE and TRAIL SCHEMA leave the top 12 and no dated rule leaves it.
# - EARMARK: THE VHOST CENSUS COUNTED THE WRONG NOUN (banked 2026-09-06, self-convicted one compile after emission): the CANVAS LANE earmark asks how many SITES the Honeybot serves and directs the counter at `virtualHosts\.` in configuration.nix, which counts ASSIGNMENT LINES; those are different nouns and Nix lets one host carry many attribute paths, so the reading of 2 is consistent with one host written across two lines, an apex plus a www redirect, and a second host already stubbed -- three worlds, one number, and the probe cannot tell them apart. INCOMMENSURABLE MEASUREMENTS with the author's own hands on it: the number was correct and answered a neighbour of the question. CURE, and it costs nothing: print the NAMES (grep -n 'virtualHosts' ... | cut -c1-100) so the hostnames themselves are the ruling and no arithmetic stands between the reader and the answer. STANDING CONSEQUENCE for any config census: when the question is "how many X", prefer a probe that ENUMERATES X to one that counts a syntax that usually accompanies X, because the enumeration degrades into a longer answer while the count degrades into a wrong one. Sibling of THE PROSE-INFLATED COUNTER, which is the same disease where the extra hits are documentation rather than syntax -- and that sibling IS the answer, read one compile later: the enumeration printed line 241 declaring virtualHosts."mikelev.in" and line 251 a COMMENT mentioning that same attribute path, so the 2 was one declaration plus one piece of documentation and NONE of the three worlds guessed above. The rule that explains it was cited in this earmark's own last clause and reached past on the way to three syntactic guesses, which is the cheapest kind of miss there is. CANVAS LANE CONFIRMED, NOT STALE: the Honeybot declares exactly one virtualHost, its "serves exactly one site today" receipt stands, the second stone is unlaid, and germination remains blocked on the same DNS decision.
# - EARMARK: THE INSPECTION CERTIFICATE (ruled 2026-09-03, third thing, derived): the client-facing verification page is the HEAD of the DECANT bundle (stop names, final_url, artifact counts, skipped stops) stapled to the compile's LIVE COMMAND RECEIPTS list, bodies removed, plus the connector argv the trail NAMES and the re-run exports by variable name only. Never authored, never inside the bundle (the floor) or the compile (the factory). v0 is a pipe over existing markers; v1 is a `certificate` verb beside `seal` once v0 has been read by a human who is not the operator.
diff --git a/scripts/walk_cartridge.py b/scripts/walk_cartridge.py
index 0b1bf908..f319e341 100644
--- a/scripts/walk_cartridge.py
+++ b/scripts/walk_cartridge.py
@@ -2,7 +2,7 @@
"""
walk_cartridge.py -- the sealed, immutable form of a Mother Cat trail.
-Schema: walk-cartridge-integrity-v2. Stdlib only. Single file by design.
+Schema: walk-cartridge-integrity-v3. Stdlib only. Single file by design.
WHY THIS DOES NOT IMPORT scripts/foo_cartridge.py
-------------------------------------------------
(nix) pipulate $ m
📝 Committing: fix: update walk_cartridge.py schema version
[main 67e28101] fix: update walk_cartridge.py schema version
2 files changed, 2 insertions(+), 3 deletions(-)
(nix) pipulate $ patch
(nix) pipulate $ app
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'foo_files.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'foo_files.py'.
✅ DETERMINISTIC PATCH APPLIED: Successfully mutated 'foo_files.py'.
(nix) pipulate $ d
diff --git a/foo_files.py b/foo_files.py
index f2c786ea..aae34746 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-15 dismount THE FLIGHT DATA RECORDER CHAPTER (four compiles, deeds 1397 through 1400; commit 64760e84 plus the Paintbox regeneration as its own commit): VIII-b and VIII-c became one chapter titled for the recorder, the walk files rostered by phase (launch, author, compile, validate, seal, capture, hand off, trails) with every path commented, and XVIII took noop.py and mcp_dummy_server.py. Every prediction landed in the compile lane: 1603 unchanged, VIII-c gone, XVIII 1991 -> 1960 (-31 exact), roster 31 -> 23 (-8 exact), mcp_dummy_server one hit at 1977 with the Paintbox copy gone and coverage 197 -> 198 of 270, a 151-line all-comment SEARCH crossing zero hidden blanks because every separator was a # line. The diffstat read +110/-139 against blocks of 120 and 151: git matched twelve shared lines and only the net (-29) was invariant, banked below as THE DIFFSTAT IS NOT THE BLOCK COUNT. Flight DECK Recorder was caught in turn one before it became a menu item; the title says Data. THE OPERATOR IS A VARIABLE once: adhoc read 198 by hand and 171 in the compile with no patch between, a hand cleanup named in the couch gag. The compiler's own Paintbox regeneration dirtied the tree one line after the commit and was witnessed in Telemetry before it was committed. ai.py's m named the DELETED chapter title as the subject. flake.nix:1478 cited VIII-c and walk_cartridge.py:5 said v2 against a v3 constant; both ride this dismount as mid-line cars spelled from receipt bytes. Margin roster 18, uncut by the operator's ruling; receipts census 27 against 20. UNWITNESSED: the STICKBUG cut, THE WALK THAT TEACHES WALKS, the XVIII retitle. This block reads 28 lines against its cap of 20; the next forget ride fades eight.
# 2026-09-14 dismount THE QUIET INSTALLER (four compiles ending at deed 1396; commits 199281af, d606d3ad, d6762668, 2672812c): the first Mac install from npvg.org printed 64 lines before the menu and now prints 11 (12 in a reused macOS Terminal tab, the extra being Terminal's own Restored session line), the same 11 on Linux from a clean shell and from inside the workshop shell. Every cut was a line that printed the same in every world: the installer's column-zero echoes 30 -> 4 in the repo and at both doors, the flake's transformation down to one verdict line (source phrases 10 -> 1, the survivor a comment quoting history; generated hook 0 -> 1), git clone --quiet, the progress bar gone, the deploy-key disclosure one sentence, the Nix-not-found branch in plain words. THE UNEXPORTED-SHIM RULE convicted a second lane: curl|bash from (nix) pipulate $ died at the loader because the bash -c hand-off never got the inline LD_LIBRARY_PATH clear the install-only branch has carried since 2026-08-01; 1 -> 3 spellings, served at both doors, witnessed by a control/treatment pair reading the libssl line beside a nix version in BOTH lanes, and end to end by an install from inside the workshop whose verdict line named nested TMPDIRs. Both INFERRED findings ruled: the transformation deletes the run wrapper on both platforms (present -> absent; ls: cannot access on the Mac), and the backup directory outlives the shell on both (present after exit, parent read, child inferred). Two rebuilds this ride were no-ops (no derivations, no unit restarted): the rebuild is the config's truck, and release.py never touches the pad. Truncation census truncated=2 on both taps; its TODO is deleted here. UNWITNESSED: the cookie-decode and Nix-not-found branches, WSL, -L on a cold store. This block reads 27 lines against its cap of 20; the next forget ride fades seven.
# 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.
@@ -1121,6 +1122,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 DIFFSTAT IS NOT THE BLOCK COUNT (banked 2026-09-15). git matches every line a SEARCH and its REPLACE share and reports them unchanged, so a diffstat's insertions and deletions read LOWER than the block lengths by the shared count: blocks of 120 and 151 read +110/-139, twelve bare # separators and carried-over lines matched. Only the net is invariant. Predict the net from the blocks; read insertions and deletions as floors. Sibling of COUNT THE REPLACE AFTER YOU WRITE IT.
# § 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
@@ -2730,6 +2732,11 @@ foo_files.py
# to import it, bookmarks_sync.py gaining nix-instantiate evaluation,
# os.kill liveness and Local State labels (3 files, +164/-80) -- under the
# subject "chore: Update bookmarks.nix to a more streamlined configuration".
+# SPECIMEN 2026-09-15 (pipulate, same m alias): 64760e84 replaced a 151-line
+# chapter with a 120-line one (+110/-139) under the subject "refactor:
+# VIII-b. The Mother Cat Kata - Enhance the walk description and clarity",
+# naming the title the commit deleted and calling a consolidation an
+# enhancement.
# - EARMARK: THE THREE-REGION ART EDIT (banked 2026-08-03, receipt-corrected):
# registering one piece of figurate art is a THREE-region change with an
# integrity coupling and NO airlock -- not two, as a prior turn asserted.
(nix) pipulate $ m
📝 Committing: chore: Refactor chapter VIII-b - Enhance the walk description and clarity
[main a481e29e] chore: Refactor chapter VIII-b - Enhance the walk description and clarity
1 file changed, 7 insertions(+)
(nix) pipulate $ git push
Enumerating objects: 16, done.
Counting objects: 100% (16/16), done.
Delta compression using up to 48 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (11/11), 2.41 KiB | 823.00 KiB/s, done.
Total 11 (delta 8), reused 6 (delta 3), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (8/8), completed with 5 local objects.
To github.com:pipulate/pipulate.git
13967bd6..a481e29e main -> main
(nix) pipulate $
Fight the pattern: manufactured forgetting; never the giant. This article is a wrap! Oh and AI Editor, please don’t make the topic merely “The Flight Data Recorder: Engineering Replayable AI Workflows and Durable Context” again. I’ve got a bunch of those already. It’s got to be more “this article” specific.
Book Analysis
Ai Editorial Take
What surprised me most about this entry is the profound realization that documentation drift isn’t merely a failure to write things down, but rather a dangerous ‘protection-lag polarity’ where understating your codebase’s capabilities leaves you doubting your own architecture. By treating documentation as a compile-time router rather than a passive text file, the author turns editorial maintenance into an automated audit.
🐦 X.com Promo Tweet
Stop trusting opaque LLM output. Here is how we consolidate browser-capture walks into verifiable receipts for checkable AI workflows: https://mikelev.in/futureproof/flight-data-recorder-walk-workflows/ #AI #Python #Automation
Title Brainstorm
- Title Option: The Flight Data Recorder: Consolidating Walk Workflows and Replayable Context
- Filename:
flight-data-recorder-walk-workflows.md - Rationale: Directly references the core metaphor of the entry while highlighting the practical work of chapter consolidation and workflow replayability.
- Filename:
- Title Option: Sailing Beside the Machine: Replayable AI Workflows and the Walk System
- Filename:
sailing-beside-the-machine-walk-system.md - Rationale: Emphasizes the sailing and rigging philosophy, connecting human oversight to automated harness design.
- Filename:
- Title Option: Consolidating the Codebase: The Mother Cat Kata and Verifiable Receipts
- Filename:
consolidating-the-codebase-mother-cat-kata.md - Rationale: Focuses on the structural refactoring of router chapters and the elimination of redundant ad-hoc documentation.
- Filename:
Content Potential And Polish
- Core Strengths:
- Brilliant integration of classic grade-school analogies (the peanut-butter sandwich robot and the read-all-instructions-first quiz) to explain prompt engineering failures.
- Grounded in concrete code receipts, bisection checks, and rigorous git diffstat verification.
- Compelling critique of manufactured forgetting and the strategic response to sudden organic search traffic shifts.
- Suggestions For Polish:
- Tighten the transition between the technical router merge and the broader philosophical discussion on search engine indexing.
- Ensure the distinction between voice recorders (model narration) and data recorders (browser captures) remains a recurring motif throughout the book chapters.
Next Step Prompts
- Design the next walk in the series: a walk that teaches walks using npvg.org landing pages.
- Draft the connector cleanup car for chapter XVIII to retitle and prune orphaned script descriptions.