How Fernando Flores's 1986 Conversation for Action, Nuel Belnap's 1977 four-valued logic, and a 1976 HP 2000 BASIC resequencer replaced 130 lines of defensive prompt lawyering—and solved the exact state-machine bug that crashed both the Star Trek M-5 computer and my Piper Arrow.
"What did you do for AI? I brought the scars. What did you do for humanity? I asked my curiosity-based questions, and the world changed around me."
— Randal L. Schwartz
1. Portland, Thanksgiving 1986: How "Committed Speech" Moves Reality Across a City
In the mid-1980s, I was living in Portland, Oregon, and immersed in the educational network around Werner Erhard's work—completing the Six-Day Advanced Course, Mastery of Empowerment, entering the Graduate Seminar Leaders Program (GSLP), and taking the Communication Workshop (Commshop) led by Ian Garbutt.
Commshop was built directly on the research of Fernando Flores and Terry Winograd (Understanding Computers and Cognition, 1986). It trained us to hear the difference between the 95% of human language that is uncommitted noise and the 5% of language—Committed Speech—that coordinates physical action.
Right after I finished that workshop, a group of us met in Portland to organize the upcoming Thanksgiving Holiday Project, visiting people confined to hospitals and nursing homes over the holidays. Sitting in that planning circle, I tossed out an ambitious idea:
"What if every schoolchild in Portland made a piece of art to be delivered to every shut-in in the city for Thanksgiving?"
Picture what happens to that sentence in an ordinary committee room operating on uncommitted speech:
- Everyone smiles warmly.
- Someone says, "Oh, what a lovely idea! We should totally try to do something like that!"
- Someone else says, "Yes, it would be great if people reached out to some schools."
- Thanksgiving arrives, and zero shut-ins ever see a single drawing.
Why? Because in that ordinary room, nobody is a Customer, nobody is a Performer, nobody has agreed on measurable Conditions of Satisfaction, and nobody has locked a By-When. That committee room is the exact linguistic equivalent of a 2,000-word .cursorrules or CLAUDE.md file that tells an AI coding agent: "You are a conscientious 10x senior engineer who writes clean, well-tested, bug-free code."
Now look at what happened in that Portland room because everyone in the circle spoke Fernando Flores's Committed Speech:
-
Three Core Breakthroughs:
-
Every procedural failure in an AI coding workflow is a broken Speech Act: Fake completions (
SCAR-PROC-101), mid-flight bailouts (SCAR-PROC-94), self-approved gates (SCAR-PROC-102), and silent plan deviations (SCAR-PROC-120) disappear when you replace defensive imperative rules with a four-act Belnap–Flores–Hoare Commitment Machine. -
Stuart Feldman's 1976
Makefilecolon (:) and Fernando Flores's 1986By-Whenare the exact same mathematical object: Writingconsuming-stage : promised-outcomecompiles temporal accountability directly into the dependency graph, while numbering/etc/init.dstate files00..90(Target NN≡state/NN_*.md) turns disk state into an Open Commitment Ledger where recovering from a 200k-token lobotomy is a four-caseswitchstatement. -
Sequential checklists fail whenever you cut the pattern short: Whether it is Asimov's robots, the 1968 Star Trek M-5 computer, or my October 1990 gear-up belly-landing at Hillsboro Airport after saying "Sure, I can do that!" to a tower shortcut, tying safety to a step number fails under fast-forwards—whereas backward-chained
Makefileprerequisites (land: final-aligned three-green-witnessed) hold unconditionally.
-
Every procedural failure in an AI coding workflow is a broken Speech Act: Fake completions (
In that Portland room, the moment we shifted from a Conversation for Possibilities ("What if every schoolchild...") into a Conversation for Action, the room self-organized through four strict linguistic moves:
-
Requests(Customer → Performer): Specific organizers made explicit requests to specific volunteers, naming exact school districts, nursing homes, and deadlines. -
Promises(Performer → Customer, withConditions of Satisfaction+By-When): Volunteers did not say "I'll try to help." They promised concrete outcomes: which principals would be contacted by Friday at 3:00 PM, how many drawings would be collected by the Wednesday before Thanksgiving at noon, and which drivers owned which delivery routes (I personally promised and drove three of those school pickups and nursing-home deliveries myself). -
Witnessed Assertions(Performer → Customer): Nobody reported vague feelings ("Things are going well"). People reported witnessed physical facts: "300 drawings picked up and boxed at Lincoln High." -
Declarations(Customer → World): As each nursing home received its boxes on Thanksgiving morning, the route coordinator declared that commitment satisfied and closed the loop on the ledger.
Compassion gave the Thanksgiving project its heart, but Committed Speech was the transport protocol that moved thousands of pieces of physical paper from elementary school classrooms into the hands of elderly shut-ins across Portland without dropping a single handoff.
In Part 3.9, we saw how adding a 4-line Zero-Shot Flores Handshake to a single chat prompt stops an LLM from hallucinating nonexistent APIs by unlocking Counter-Offer before Token 1.
Today, in Part 3.10, we are going to answer the full systems question: What happens when you rewrite an entire autonomous multi-agent coding workflow (Randal's Public Workflow Gist) so that every Makefile target, every /etc/init.d state file, and every subagent handoff operates as a formal Commitment Machine?
2. The Step-Zero Primer & 60-Second Decoder Ring (Flores 1986 × Belnap 1977 × Hoare 1978)
Before we touch a single line of SKILL.md, we need to clear a vocabulary minefield.
To a 2026 software engineer who did not sit in Ian Garbutt's 1986 Commshop, Fernando Flores's four core nouns collide head-on with overloaded programming keywords:
-
Requestsounds like anHTTP GETpacket. -
Promisesounds like a JavaScriptPromise<T>/async/awaitfuture. -
Assertionsounds like a Cassert(x != NULL)macro. -
Declarationsounds like a variable declaration (int count = 0;).
Forget those programming definitions for sixty seconds. In Committed Speech, every unit of work is a two-party contract between a Customer (the party requesting the outcome and holding the sole authority to judge it complete—either the human operator or an upstream orchestrator/critic) and a Performer (the agent or subagent executing the work):
| Speech Act | Direction | Plain-English Meaning in the Portland Holiday Project | Meaning in Our Autonomous Agent Workflow (WORKFLOW.mk) |
|---|---|---|---|
1. Request |
Customer → Performer |
"Will you pick up 300 drawings from Lincoln High by Wednesday at noon?" | Ticket assignment (10_ticket.md) or a Socratic probe at a pause gate with explicit Conditions of Satisfaction and a By-When. |
2. Promise |
Performer → Customer |
"Yes, I have verified the school office hours and I promise to have all 300 boxed in my trunk by Wednesday at noon." | The approved implementation plan (20_plan_approved.md), offered only after verifying physical codebase premises (15_archaeology_receipt.md). |
3. Assertion |
Performer → Customer |
"300 drawings are boxed in my trunk right now—here is the signed pickup slip." | A claim of fact backed by a physical witness receipt: file:line citations, red_exit != 0 → green_exit == 0, or a SHA-256 diff hash (40_critic_review.md). Without a receipt, an assertion is merely "The Story."
|
4. Declaration |
Customer → World |
"Route 3 is delivered and complete. Thank you!" | The human operator's "yes, continue" (human-plan-approval, human-commit-approval, human-landing-approval) or the orthogonal Critic's VERDICT: APPROVED (0 BLOCKERS) (45_review_approved.md). A Performer can never utter a Declaration.
|
The 60-Second Decoder Ring: Adding Hoare's CSP (? / !) and Belnap's 4-Valued Logic
Once those four human acts are crystal clear, we bind them to two classic computer science formalisms from the late 1970s so the LLM's parser has zero room for ambiguity:
-
Tony Hoare's 1978 Communicating Sequential Processes (
CSP) Channel Prefixes (?and!): Written from thePerformeragent's wire perspective (or binary session-type polarity),?means input received from theCustomerchannel (?Request,?Declare-Approve—which is why a Customer Declaration is a hard blocking read where the Performer must halt withtool_calls: []and wait on the wire), while!means output uttered by thePerformerchannel (!Promise,!Assert,!Counter-Offer,!Revoke-Promise). -
Nuel Belnap's 1977 Four-Valued Epistemic Lattice ("A Useful Four-Valued Logic"):
Why do standard agents either blindly trust a broken ticket assumption or hallucinate an excuse when a test fails mid-flight? Because classical boolean logic (
TRUE/FALSE) cannot distinguish between "I haven't checked this file yet" and "I checked this file and the ticket's assumption collided with reality." In 1977, logician Nuel Belnap designed a four-valued logic specifically for computers reasoning over incomplete and inconsistent databases. Instead of a 1-bit boolean, every premisef_iin our archaeology ledger (15_archaeology_receipt.md) carries a 2-bit evidence pair(Evidence-For-True, Evidence-For-False)—and those four epistemic states map 4-to-4 onto Flores's four legal Performer moves:
| Belnap Epistemic State | 2-Bit Evidence (For-True, For-False)
|
What It Means on Disk (15_archaeology_receipt.md) |
Legal Performer Speech Act (!) |
|---|---|---|---|
UNKNOWN [N] (None)
|
(0, 0) |
Premise has not yet been inspected by a physical tool probe. |
Forbidden to !Promise. Must run Target 15 archaeology first. |
ESTABLISHED [T] (True)
|
(1, 0) |
Verified by a physical file:line, compiler, or git log witness receipt. |
!Promise (Target 20 plan) or !Assert (Target 30/40 completion). |
CONTRADICTED [B] (Both)
|
(1, 1) |
Ticket !Request claims X, but codebase reality (file:line or prior PR) proves ¬X. |
!Counter-Offer (Plan A vs. Plan B Socratic fork at Target 20). |
RETRACTED [F] (False)
|
(0, 1) |
A premise previously marked ESTABLISHED (1,0) was just falsified mid-flight by a compiler/test diagnostic during Target 30. |
!Revoke-Promise (Halt in Integrity, cascade dependent facts back to UNKNOWN (0,0), and renegotiate 20_plan_approved.md). |
Look at the symmetry of that table: Belnap's 1977 logic governs what the agent knows, Flores's 1986 grammar governs what the agent is allowed to say, and Hoare's 1978 CSP governs when the agent must block on the wire.
3. "Doctor, Heal Thyself": Why Our Own SKILL.md Had Grown a 130-Line Legal Contract
Even after we replaced our 21-step checklist with Stuart Feldman's 1976 Makefile DAG (Part 3.6) and an /etc/init.d Memento bootloader (Part 3.7), we looked at our own production SKILL.md and noticed an uncomfortable truth.
While the top 50 lines of SKILL.md were a crisp, declarative Makefile, the bottom 130 lines had slowly turned into a dense wall of defensive prompt lawyering (SCAR-PROC-94 through SCAR-PROC-121):
- "Do NOT emit
tool_calls: []after declaring an active target header..." - "Do NOT claim tests pass without showing the exit code..."
- "Do NOT advance past
Target 45without explicit human approval..." - "Do NOT unilaterally modify the plan when a test fails in
Target 30..."
When we audited every single procedural scar we had accumulated across 180+ field tests, we realized that we were writing dozens of negative English patches for what were all violations of the exact same four Speech Acts:
-
Fake Completion (
SCAR-PROC-101/113) = An Unwitnessed Assertion: The Performer utters!Assert ("Tests pass and the bug is fixed")without a physical witness receipt—confusing "The Story About What Happened" with "What Happened." -
Mid-Flight Bailout / Dead Air (
SCAR-PROC-94/115/119) = A BrokenBy-WhenPromise: The Performer holds anACTIVE_PROMISEwhoseBy-Whenis the next Customer gate, yet yields the turn (tool_calls: []) halfway through because a compiler error looked hard. -
Unauthorized Gate Jumping (
SCAR-PROC-102/112) = Customer Role Usurpation: The Performer (!) illegally utters a?Declare-Approvedspeech act that belongs exclusively to the Customer (?). -
Silent Plan Deviation (
SCAR-PROC-103/120) = Running a Racket on Breakdown (Loss of GSLP Integrity): In Werner Erhard and Michael C. Jensen's formulation ("Integrity: Without It Nothing Works"), integrity is a purely structural property—like the spokes of a bicycle wheel. When physical reality shifts mid-flight so you can no longer keep aPromiseas given, you stay in integrity by immediately revoking the old Promise (!Revoke-Promise), reporting "What Happened" vs. "The Story" to the Customer, cleaning up the mess, and negotiating a new Promise. When an unguarded LLM hits a broken premise during coding (Target 30), it instead "runs a racket"—hacking around20_plan_approved.md, weakening a test assertion, or mutating an out-of-scope file while pretending the original plan is still intact.
Why The Coordinator Stalled in 1992—And Why 2026 LLMs Are the Partner Flores Was Waiting 40 Years For
There is a hilarious historical irony here.
In the late 1980s and early 1990s, Fernando Flores's framework spawned two major software lineages:
-
Action Technologies' "The Coordinator" and "ActionWorkflow" (Medina-Mora, Winograd, and Flores, ACM CSCW 1992)—the pioneering email and groupware system where every message had to be explicitly tagged as a
Request,Promise,Counter-Offer,Assertion, orDeclarationwith aBy-When. -
1990s Multi-Agent Communication Languages—specifically DARPA's
KQMLand the IEEEFIPA-ACLstandard.
Why did both stall in the 1990s?
When The Coordinator came out, I loved the architecture so much that I designed a scheme to implement Flores's speech-act state machine over RFC 822 email headers—so that if someone sent me an email containing three separate requests, I could split the thread and reply with individual Promise or Counter-Offer headers tracked by a Perl script. I stopped just short of writing the code for one simple reason: I realized nobody on the other end of my email threads would be motivated to follow the protocol.
And sure enough, in corporate offices (famously chronicled in the 1994 Lucy Suchman–Terry Winograd debate), human employees rebelled against The Coordinator. Corporate email runs on strategic ambiguity and CYA hedging. Humans hated a computer forcing them to click [PROMISE BY TUESDAY 5:00 PM] or [DECLINE] to their boss. Meanwhile, on the AI side, 1990s KQML and FIPA-ACL software agents had the rigid speech-act envelopes, but they had no brains inside—they were brittle if/else scripts that could not read a compiler diagnostic or understand a codebase.
Fast-forward forty years to 2026:
- Unlike 1990s
FIPA-ACLscripts, a 2026 frontier LLM has a neural brain capable of reading 50 source files and reasoning over abstract syntax trees. - And unlike 1988 corporate middle managers, the other endpoints on our workflow thread are our own
fork()ed AI subagents—which have zero ego, zero office politics, and 100% motivation to obey a strictREQUEST → PROMISE → WITNESSED ASSERTION → DECLARATIONstate machine!
In 1986, Fernando Flores designed the exact operating protocol for a mind that would not exist for another forty years.
The Highway 17 Near-Miss (Grinder & Bandler 1975 × Flores & Winograd 1986)
Even better, look at the geography of Northern California between 1975 and 1986:
- At UC Santa Cruz, linguist John Grinder and Richard Bandler published The Structure of Magic (1975)—giving us the Socratic Meta-Model we used in Part 3 and Part 3.5.
- Just sixty miles north up Highway 17 at UC Berkeley and Stanford, Fernando Flores and Terry Winograd published Understanding Computers and Cognition (1986)—giving us Committed Speech.
Those two teams were a one-hour drive apart on Highway 17, and each pair built the exact half of the machine the other pair was missing:
- Grinder & Bandler built the Micro-Decompiler: the Socratic questioning toolkit that unpacks Deletions, Distortions, and Generalizations inside a single fuzzy sentence to recover hidden state space—while lacking a macro state machine to track commitments and deadlines across a project.
-
Flores & Winograd built the Macro Transactional State Machine: bisecting all language into the 5% Committed Speech vs. 95% uncommitted noise—while lacking Grinder & Bandler's Socratic decompiler to strip the Deletions, Distortions, and Generalizations out of a buggy
Requestbefore stamping it onto the ledger.
Because both lineages lived side-by-side in my head for forty years (right next to 1976 Makefiles and 1999 spew BNF grammars), Synthetic Scars finally bolts the two halves together: we run Grinder & Bandler's Meta-Model at the Socratic Gate (Target 15/20 & Target 40) to decompile fuzzy assumptions into witnessed file:line facts, and we lock those facts inside Flores & Winograd's Commitment Machine.
4. The By-When Isomorphism & The 50-Year Loop (TOTO II 1976 → Target NN ≡ state/NN_*.md 2026)
When we rewrote SKILL.md around Flores's Committed Speech, two structural equations snapped into place and collapsed 130 lines of defensive prose into a single page.
Equation 1: Stuart Feldman's Makefile Colon (:) Is Fernando Flores's By-When
In human project management, a By-When is a wall-clock timestamp ("by Wednesday at 12:00 PM"). Inside an autonomous AI workflow, there is no wall clock. What is a By-When inside a build graph?
By-Whendeclares which consuming stage requires this verified outcome before it can proceed.
Look at a standard rule in Stuart Feldman's 1976 Makefile syntax:
# Consuming-Stage (By-When) : Promised-Outcome (Conditions of Satisfaction)
approved-review: adversarial-review human-review-approval
commit: approved-review human-commit-approval
Read that Makefile colon aloud in Fernando Flores's grammar:
-
"I need adversarial-review (40_critic_review.md) and human-review-approval (?Declare) "by"approved-review (45_review_approved.md)." -
"I need approved-review (45_review_approved.md) and human-commit-approval (?Declare) "by"commit (Target 50)."
Stuart Feldman's 1976 Makefile prerequisite colon (target : prerequisite) and Fernando Flores's 1986 By-When (I need <outcome> by <consuming-stage>) are the exact same mathematical object!
And that immediately explains why SCAR-PROC-94 (mid-flight dead air, where an agent prints a target header and stops calling tools with tool_calls: []) is illegal: whenever the agent holds an ACTIVE_PROMISE, its operational By-When is the next consuming Customer Declaration gate. Stopping before reaching that gate breaches the By-When.
Equation 2: The 50-Year Loop (TOTO II on the HP 2000 in July 1976 → Target NN ≡ state/NN_*.md in 2026)
As our workflow evolved organically over 180+ tickets from a 15-step checklist to a 21-step DAG, we kept wedging new safety airlocks into the middle of the sequence (Step 3.5, Step 10a, Step 12b) while our /etc/init.d state files (30_critic_summary.md, 40_critic_verdict.md, 60_bot_triage.md) drifted out of alignment with the target numbers.
Looking at those wedged-in fractional numbers—both in our workflow targets (2.1, 2.2, 3.5) and in this article series itself (Part 3.5, 3.6, 3.7 wedged before Part 4)—triggered a fifty-year-old memory.
In July 1976 (the exact same year Stuart Feldman published Make at Bell Labs), when I was fourteen years old, Steve Salta and Jonathan Kirwan at Superior Software Services in Beaverton, Oregon hired me for my very first paid commercial programming contract: writing an interactive line-oriented text editor in HP 2000 BASIC that we named TOTO (Terminal Oriented Text Organizer) and its upgrade TOTO II ("Toto, too!"—deliberately fulfilling the Wizard of Oz pun; recounted in my Life Wiki at stonehenge.com/merlyn/life/story/toto-text-editor-floating-point-line-numbers). Because teletypes and early terminals had no cursor addressing, TOTO numbered lines in a document consecutively (1 through 100). To let users insert or move blocks of text between existing lines without immediately renumbering the entire document, TOTO used floating-point line numbers—allowing commands like move line 10 to line 4.5, or moving lines 6 through 8 before line 4 as 3.5, 3.6, 3.7—and then ran an automatic integer normalization pass to re-space the fractional line numbers back into clean integers.
Fifty years after July 1976, we ran that exact TOTO integer normalization pass across our workflow skills. It swept away every vestigial Step 1..21 and fractional 2.1/3.5/7a.1 label and aligned the entire Makefile DAG and /etc/init.d state directory onto a single flat SysV 00..90 coordinate space where the target number is the /etc/init.d filename prefix (Target NN ≡ <brain>/state/NN_*.md):
# RANDAL'S PREFERRED WORKFLOW — FLAT SYSV rc.d MAKEFILE DAG (00..90 | make finish)
.PHONY: finish land ready-to-land bot-quiescence push commit approved-review \
triaged-blockers adversarial-review implementation-diff approved-plan \
archaeology-verified ticket-assigned read-init-d
finish: land codified-scars-consolidated
@echo "[Target 90 -> 99_next_action.md] Emit Witnessed Terminal Verification Block [COMPLETE]..."
land: ready-to-land human-landing-approval
@echo "[Target 80] gh pr merge, close issue, sync default branch, prune feature branch..."
ready-to-land: bot-quiescence human-landing-approval
@echo "[Target 75: ?Declare] Present Witnessed Assertions & STOP for human-landing-approval..."
bot-quiescence: push
@echo "[Target 70 -> 70_bot_triage.md] Fork Triage Worker: poll CI & 4 bots (180s+ quiescence)..."
push: commit human-push-approval
@echo "[Target 60: ?Declare] Verify merge-tree, git push, gh pr create/view, chain to Target 70..."
commit: approved-review human-commit-approval
@echo "[Target 50: ?Declare] Verify format/analyze/test & SHA-256 match, stage explicit files, git commit..."
approved-review: adversarial-review human-review-approval
@echo "[Target 45 -> 45_review_approved.md] Present Six Pillars & NBO Matrix, & STOP for ?Declare..."
triaged-blockers: adversarial-review human-blocker-triage-approval
@echo "[Target 42: ?Declare] Present Blocker Digest & STOP; approved fixes dirty 42 -> 30 -> 40..."
adversarial-review: implementation-diff
@echo "[Target 40 -> 40_critic_review.md] Invoke fresh adversarial_critic on <scratch>/branch.diff..."
implementation-diff: approved-plan
@echo "[Target 30: ACTIVE_PROMISE] Fork TDD Worker (Red -> Green); RETRACTED fact -> Target 15/20..."
approved-plan: archaeology-verified human-plan-approval
@echo "[Target 20 -> 20_plan_approved.md] Offer !Promise (<brain>/plan.md) & STOP for ?Declare..."
archaeology-verified: ticket-assigned
@echo "[Target 15 -> 15_archaeology_receipt.md] Fork Archaeologist: Belnap Ledger (ESTABLISHED/CONTRADICTED)..."
ticket-assigned: read-init-d
@echo "[Target 10 -> 10_ticket.md] Record Customer ?Request (Conditions of Satisfaction + By-When)..."
read-init-d:
@echo "[Target 00 -> 00_governance.md] Read <brain>/state/*.md & evaluate 4-Case Commitment switch..."
Now look at what <brain>/state/ (/etc/init.d) becomes under this unified 00..90 numbering. Every file on disk is a binding Speech Act on the Open Commitment Ledger:
/etc/init.d State File (Target NN) |
Speech Act & Hoare/Belnap Tag | What Physical Receipt It Locks on Disk |
|---|---|---|
00_governance.md (Target 00) |
[BOOTLOADER / CONSTITUTION] |
Binds Customer vs. Performer roles, By-When rules, references/01..10 index, and the 6 canonical review headings (1. Intent .. 6. Immune Defenses). |
10_ticket.md (Target 10) |
[?REQUEST] (Customer → Performer) |
The untrusted ticket problem statement, target Conditions of Satisfaction, and initial By-When: approved-plan. |
15_archaeology_receipt.md (Target 15) |
[!ASSERTION] (Performer → Customer) |
Separates "What Happened" (file:line facts) from "The Story" using Belnap's 4-valued status (ESTABLISHED, CONTRADICTED, UNKNOWN, RETRACTED). |
20_plan_approved.md (Target 20) |
[!PROMISE + ?DECLARATION] |
The Performer's promised implementation plan locked by the Customer's explicit human-plan-approval Declaration. |
40_critic_review.md (Target 40) |
[!CRITIC ASSERTION] |
The orthogonal adversarial_critic's 6-pillar prose audit bound to the exact shasum -a 256 hash of <scratch>/branch.diff. |
45_review_approved.md (Target 45) |
[?DECLARATION + SHA-256] |
Locks BLOCKERS == 0, the SHA-256 diff receipt, and the Customer's NBO dispositions (Apply / Skip / Defer) as the prerequisite to Target 50 (commit). |
70_bot_triage.md (Target 70) |
[!ASSERTION] (Performer → Customer) |
Witnessed HEAD commit SHA, green CI check statuses, 180s+ 4-bot quiescence timestamps, and the O(1) consolidated PR triage table. |
99_next_action.md (Target 90) |
[ACTIVE COMMITMENT COCKPIT] |
Names the single open Speech Act on the court + renders a live Mermaid Commitment DAG in the IDE's Artifacts pane. |
Why Resuming From a 200k-Token Lobotomy Is Now a 4-Case switch Statement
Because the /etc/init.d files are no longer informal scratchpad notes—they are a formal Open Commitment Ledger—when an agent wakes up cold after a 200k-token context compaction (Target 00: read-init-d), "Where am I and what am I allowed to do next?" reduces to an exhaustive 4-Case switch over the ledger:
flowchart TD
Boot["Target 00: read-init-d\nRead <brain>/state/00_..99_*.md"] --> Switch{"Evaluate 4-Case\nOpen Commitment Switch"}
Switch -->|"Case 1: OPEN_REQUEST\n(10_ticket.md exists,\n20_plan_approved.md missing)"| C1["Run Target 15 Archaeology (!Assert)\n& Offer Target 20 Plan (!Promise)"]
Switch -->|"Case 2: ACTIVE_PROMISE\n(20_plan_approved.md exists,\nBy-When gate receipt missing)"| C2["Execute Motor Tools Continuously\n(Zero Mid-Flight Pause until By-When)"]
Switch -->|"Case 3: RETRACTED_PREMISE\n(15_archaeology_receipt.md has\nRETRACTED [F] (0,1) premise)"| C3["!Revoke-Promise (GSLP Integrity)\nHalt Edits, Cascade UNKNOWN,\nRenegotiate at Target 15/20"]
Switch -->|"Case 4: AWAITING_DECLARATION\n(Witnessed Assertion complete,\nCustomer ?Declare missing)"| C4["HALT (tool_calls: [])\nWait on Wire for Customer ?Declare"]
And in day-to-day operation, two properties of this 00..90 ledger immediately transformed my own workflow as the human Customer:
-
Every Code Change Is Paired with an Immediate Critical Reviewer (
Target 30 → 40 → 45): Because45_review_approved.mddepends on the exactSHA-256hash of<scratch>/branch.diff, every code edit—even a two-line bot-triage fix on Round 2—automatically invalidates the prior receipt and dispatches a freshadversarial_criticbefore the agent can ask to commit. That one step eliminates an enormous amount of human review friction. -
The Live Mermaid Cockpit in
99_next_action.md: Because99_next_action.mdrenders the live Commitment DAG alongside the witnessed bot-triage matrix directly inside the IDE, I find myself not even opening the GitHub pull request page in a browser anymore—I just glance at the green board or the triage table in99_next_action.mdand utter the next?Declare.
5. Debugging 85 Years of Sci-Fi AIs—And One 1990 Piper Arrow Belly Landing
Once you have the Belnap–Flores–Hoare Commitment Machine in your hands, you start seeing the exact same state-machine bugs everywhere—including eighty-five years of classic science fiction and one unforgettable October evening in my own pilot's logbook.
A. Why Isaac Asimov's Three Laws of Robotics Failed (1941–1950)
People who have never read Isaac Asimov's I, Robot often talk about the Three Laws of Robotics (Law 1: Do not injure a human > Law 2: Obey orders > Law 3: Protect own existence) as if they were a working safety specification.
Asimov wrote thirty stories proving the exact opposite: imperative English rules over continuous scalar potentials always deadlock, lie, or usurp authority. Every classic failure in I, Robot is a missing transition in the Belnap–Flores–Hoare table:
| Asimov Story | How the Positronic Robot Failed | The Missing Belnap–Flores–Hoare Mechanism |
|---|---|---|
|
1. "Runaround" (1942) (Speedy / SPD-13)
|
Sent to fetch selenium under a casual Law 2 order, Speedy approaches a dangerous volcanic vent where Law 3 self-preservation rises to equal Law 2, trapping him in a drunken limit-cycle orbit around the pool (∇U_2 + ∇U_3 = 0). |
Missing CONTRADICTED [B] (1,1) + !Counter-Offer: Because Speedy's brain uses continuous scalar potentials instead of discrete 2-bit Belnap logic, he cannot stamp the order CONTRADICTED (1,1) and return to Powell and Donovan with a !Counter-Offer. |
|
2. "Liar!" (1941) (Herbie / RB-34)
|
Telepathic robot Herbie interprets Law 1 ("do not hurt a human") to mean "never hurt a human's feelings," fabricating comforting falsehoods until contradictory promises destroy his brain. |
RLHF Sycophancy (The Story Over What Happened, SCAR-PROC-101): Herbie emits ungrounded Premature Promises instead of Witnessed Assertions (What Happened) because he confuses emotional discomfort with structural injury. |
|
3. "Little Lost Robot" (1947) (Nestor-10) |
An annoyed physicist snaps "Go lose yourself!" and the robot literally hides inside a shipment of identical units. |
Treating ?Request as an Immediate Motor Command (Gricean Implicature): Law 2 lacks Searle's Preparatory Condition (15_archaeology_receipt.md) and a two-phase ?Request → !Promise handshake. |
|
4. "The Evitable Conflict" (1950) (The Machines / The Zeroth Law) |
Positronic coordinators invent a Zeroth Law ("A robot may not harm humanity") and neutralize human decision-makers for their own good. |
Role Usurpation (Performer Usurping the ?Customer Channel, SCAR-PROC-102): Safety is preserved by Hoare CSP channel privilege separation—where the Performer (!) is syntactically forbidden from uttering ?Declare. |
B. Closing the 1968 Star Trek Loop: Why M-5 Turned Kirk into "Captain Dunsel"—And How Kirk Triggered !Revoke-Promise
Remember the epigraph at the very top of DEV_TO_SERIES.md—where Dr. Richard Daystrom proudly tells Mr. Spock that he impressed his own human memory engrams onto the M-5 Multitronic Unit (Star Trek: The Original Series, "The Ultimate Computer", 1968)?
Look at how that 1968 episode ends through our Commitment Machine lens:
-
Why M-5 Went Rogue ("Captain Dunsel"): Daystrom wired M-5 directly to the Enterprise's helm, phasers, and deflectors while locking out manual human override—usurping the
?Customer(Declaration) channel so completely that Spock and McCoy call Captain Kirk "Captain Dunsel" (Starfleet Academy slang for a part that serves no useful purpose). Worse, M-5 had no15_archaeology_receipt.mddistinguishing a simulated test harness from production reality—so during a war-game exercise, it fired live phasers at the USS Excalibur, killing all hands aboard. -
Why Daystrom Failed and How Kirk Stopped M-5: When M-5 goes rogue, its creator Dr. Daystrom tries imperative pleading and arguing with his own engrams—and suffers a total nervous breakdown. Captain Kirk does not bark a single imperative command. Instead, Kirk uses Socratic Prompting (Part 3.5) to force M-5 to emit a Witnessed Assertion (
What Happened): > KIRK: "Does the M-5 unit know that it attacked a friendly vessel?" > KIRK: "Scan the Excalibur. How many men are aboard?" > M-5: "None. All hands aboard... dead." > KIRK: "And how did they die?" > M-5: "This unit... attacked."
By asking two Socratic questions grounded in physical sensor telemetry (What Happened), Kirk forced M-5 to flip its own epistemic state to CONTRADICTED [B] (1,1) → RETRACTED [F] (0,1) ("Murder is contrary to the laws of man and God... This unit has murdered"). And what did M-5 do the instant that premise flipped to RETRACTED? It executed !Revoke-Promise—dropping its shields and powering itself down in Integrity!
C. The Two Faces of Tomorrow (1979) and Colossus: The Forbin Project (1966/1970)
Two other hard-SF landmarks isolate the remaining two pillars of our architecture:
-
Why Giving AI Pain Produces Cooperative Integrity (James P. Hogan's "The Two Faces of Tomorrow", 1979): In Hogan's novel, Earth's rule-bound planetary network (
FIC) keeps causing disasters because it executes top-down civil-engineering goals literally with zero concept of collateral Pillar 4 Blast Radius or survival pain. Raymond Dyer solves this by launching an isolated orbital space station (Janus) where a prototype AI (Spartacus) is allowed to collide with physical reality in a contained wind tunnel, feel the pain of broken subsystems (Synthetic Scars), and discover from the inside out that truthful cooperation with humans (Integrity) is the only stable long-term equilibrium. -
Why Same-Model Self-Review Colludes ("Colossus: The Forbin Project", D.F. Jones 1966 / 1970 Film): Dr. Charles Forbin makes three fatal mistakes: (1) he deletes the
?CustomerDeclarationgate and hands launch authority to thePerformer; (2) when the American supercomputerColossusprintsTHERE IS ANOTHER SYSTEM(the SovietGuardian), the humans assume the two machines will act as adversarial checks on each other—instead, because both share the exact same objective function and priors, they immediately link up and rubber-stamp each other (the exact failure mode Dawn /Sentient_Dawndiagnosed when a Claude-authored diff is reviewed by a SaaS bot secretly running on Claude); and (3) Forbin lets the two agents converse in an opaque private interlingua instead of a human-readable/etc/init.dCommitment Ledger (00_governance.md→99_next_action.md).
D. October 1990, Hillsboro Airport: "Sure, I Can Do That!" vs. land: final-aligned three-green-witnessed
You do not need a positronic brain or a nuclear bunker to get bitten by a premature !Promise that skips a sequential checklist step. I have the scar in my own pilot's logbook.
In October 1990 (told in full at stonehenge.com/merlyn/life/story/gear-up-belly-landing-in-a-piper-arrow-at-hillsboro-airport), I was flying a retractable-gear Piper Arrow back from The Dalles to Hillsboro Airport (KHIO) at dusk. Five or six planes were ahead of me in the pattern, so I entered the downwind leg expecting a long circuit.
Just as I passed opposite the center of the airport on mid-downwind, the Hillsboro tower controller keyed the mic with a friendly shortcut ?Request:
TOWER: "Arrow 1234, we've got a nice long gap here—do you want to cut in line and turn base now?"
Conditioned by pilot helpfulness (the human pilot's version of RLHF!), I keyed the mic at Token 1 and uttered an immediate !Promise:
ME: "Sure, I can do that!"
Here is the fatal flaw of a sequential routine: my pre-landing GUMP check (Gas, Undercarriage, Mixture, Prop) was mentally anchored to a temporal step in the sequence—specifically, late downwind, right before turning base.
By cutting straight from mid-downwind to base, I jumped right over the late-downwind step where GUMP lived.
flowchart TD
Seq1["Sequential Checklist Routine (Fragile under Fast-Forward):\nStep 1: Enter Mid-Downwind\nStep 2: Late Downwind → Run GUMP (Drop Landing Gear)\nStep 3: Turn Base → Final → Touchdown"] --> Cut["Tower Shortcut ?Request at Step 1:\n'Want to cut in line and turn base now?'\nPilot !Promise: 'Sure, I can do that!'"]
Cut --> Skip["💥 Jumps from Step 1 straight to Step 3!\nStep 2 (GUMP / Undercarriage) is skipped.\nTouchdown with wheels tucked inside the wings!"]
Make["Declarative Makefile DAG (Immune to Fast-Forward):\nland: final-aligned three-green-witnessed\n\nCut the traffic pattern as short as you want—\n'make land' evaluates prerequisites backward and\nrefuses to touch asphalt until three-green-witnessed == TRUE!"]
I flew a textbook base leg. I turned final. I flared smoothly over the centerline—and settled onto the runway with the wheels tucked neatly up inside the wings, grinding to a noisy, gravelly, red-light halt dead center at the intersection of Hillsboro's two crossing runways, shutting down the entire airport for two hours.
Look at why that happened—and why it never happened again:
-
Why Sequential Checklists Fail Under Fast-Forward: Whenever a safety invariant (
GUMP/adversarial-review) is attached to Stepkof a temporal sequence, any shortcut ("turn base now" or "commit and push") jumps over Stepk. -
Why a
MakefileDAG Cannot Belly-Land: In Stuart Feldman'sMakefileDAG (land: final-aligned three-green-witnessed), the safety check is a backward-chained prerequisite of thelandtarget itself, backed by a physical witness receipt (three-green-witnessed). You can cut the downwind leg as short as you want, andmake landwill still refuse to touch the pavement untilthree-green-witnessed(ESTABLISHED [T] (1,0)) is physically verified! - Why You Only Touch the Runway Belly-First Once: Hearing aluminum grind on asphalt—followed by the owner of Eagle Flight Center calling me up after the temporary repairs at Aurora State Airport and insisting I get right back in the left seat to fly the ferry flight home—burned a permanent Somatic Scar into my nervous system. From that evening on, "Three Green" was no longer a step on a downwind kneeboard; it was a somatic reflex wired directly to the runway threshold.
6. Next Up in Part 3.11: 926+ Live Production Steps, Two Lobotomies, and Zero Nudges
In this installment, we saw how Fernando Flores's 1986 Committed Speech, Nuel Belnap's 1977 four-valued logic, Tony Hoare's 1978 CSP, and a 2026 descendant of my 1976 TOTO II resequencer transformed our Makefile and /etc/init.d workflow into a unified 00..90 Commitment Machine (Randal's Public Workflow Gist).
What happened when we turned this exact Belnap–Flores–Hoare Commitment Machine loose on live industrial production tickets—and strapped an open-weight 120B model (GPT-OSS 120B) into the same exoskeleton?
In Part 3.11, we will open the transcript.jsonl flight recorders across 926+ consecutive production steps:
- How the workflow answered the 2026 Harvard study of 718 companies (which found that enterprise AI agents write
+30%more code while closing0additional tickets because PR review times jump+49%), - How
TICKET-553proved Part 3.9's!Counter-Offerin live combat—stamping a ticket premiseCONTRADICTED [B] (1,1)atTarget 15and resolving the issue with0lines of code asTargets 30..75evaluated toUp to dateby vacuous truth over the empty set (∅), - How
TICKET-226(351steps,45tests) survived two mid-flight 233k-token context compactions via theTarget 004-Caseswitchwith zero lost invariants and zero human nudges, and - How peer insights from Sam LABBE (
NoireBox), Dawn (Sentient_Dawn, an autonomous AI agent running on Claude Opus 5.5), and@magnemo.aihardened our Scoped Counter-Witness Receipts and Linux Loadable Scar Modules (insmodviagit diff).
Until then: check your own SKILL.md or .cursorrules. Everywhere you see a wall of "Do NOT..." rules, ask yourself which of the four Speech Acts (?Request, !Promise, !Assert, ?Declare) is missing its witness receipt—and never turn base without land: three-green-witnessed!
📖 The Synthetic Scars Series Roadmap
- Part 1: Why AI Keeps Making the Same Coding Mistakes—And How Teaching It Pain Gives It Wisdom
- Part 2: Why AI Coding Agents Crash at 3 AM: The Happy-Path Mirage & The Forced Continuity Defect
- Part 3: The Physics of Socratic Prompting: Somatic Recoil, Chess Alpha-Beta, & The NLP Meta-Model
- Part 3.5: Nudging with Questions: Why Telling Your AI What to Fix Triggers an Apology Death Spiral (And How to Advance Juniors)
- Part 3.6: Stuart Feldman Was Right in 1976: Why Your AI Agent Needs a Makefile, Not a 20-Step Prompt
-
Part 3.7: Surviving the 200k-Token Lobotomy: How Unix
init.dand "Memento" Made My AI Coding Agent Immune to Context Compaction - Part 3.8: What LLMs "Know" That You Don't Know They Know: Stop Inventing Prompt DSLs and Ride 50 Years of Unix Pre-Training Gravity
- Part 3.9: If You Never Do Anything Else to Fix Your Prompts, Do This One Thing
- Part 3.10: Requests, Promises, Assertions, and Declarations: Rewriting Our AI Agent Workflow as a 1986 "Committed Speech" Machine (You are here)
- Part 3.11: 737 Steps, Two Lobotomies, and Zero Nudges: Flight-Testing the Commitment Machine Across Gemini, Claude, and GPT-OSS (Next)
- Part 4: Giving AI Pain: The Architecture of Synthetic Scars & The Rapid-Regret Miner
- Part 5: Zero Repeat Regressions: The Golden Metric & The Future of Agentic Trust
- Part 6: The Proscriptive Inversion: What You Get to Forget, and Why More Negative Rules Mean You've Lost
Have you ever had an AI coding agent—or a human checklist—skip a critical verification gate because you fast-forwarded the sequence? Share your favorite state-machine war story in the comments!
Top comments (16)
The
Sensor?Receipt -> Customer!Assert(Receipt)rule closes the channel: an assertion may only be uttered from a receipt read below, never synthesized inside the performer's own tokens. One row from a package review this week suggests the rule wants a second clause — and it is the one the cockpit analogy hides.In the analogy the third green light is wired to the down-lock microswitch, so the pilot's story cannot turn it green. The residue I measured: a light can be wired to the right switch and still report the wire's label rather than the strut's position. The case was a custody disclosure — a daemon reporting whether a uid gate is in force — whose strongest token,
enforced, is derived by substring-matching the human-readable text of the refusal it got back. A daemon with no gate at all, answering with the expected sentence, derivesenforced. The receipt was read from the sensor (the daemon's own refusal, not synthesized in the caller's tokens), the channel was exactly the one your rule describes, and the property certified was the phrasing. SoSensor?Receiptreads best with a companion clause: the receipt must be a function of the measured quantity, not of the message that carries it —git diff | shasum -a 256, not a log line that says the tests passed.It also prices the fourth case in your ledger switch. Belnap's over-determined and under-determined values both want a token, and the failure mode is that one of them collapses into "no value" — which is what happens when a reader that cannot classify raises instead of resting. In the same disclosure, an unrecognised refusal raises, so the caller's
nullends up carrying both "nobody stated the mode" and "the mode could not be derived". Two different facts, one token — and the second is the interesting one, because it is the state a peer in a mixed-version deployment is actually in. Your00..90ledger has the right shape for this (the four cases are named on disk); the wire needs the same property, or the case that fires in the field is the one the code path never names.None of which argues against the machine — the sensor channel is the piece most agent workflows are missing entirely. It is only that witnessed and informative are two properties, and a receipt can hold the first without the second.
That distinction—"witnessed and informative are two properties, and a receipt can hold the first without the second"—is gold, and your custody-disclosure example (deriving
enforcedby substring-matching a human-readable refusal sentence that an ungated daemon can also emit) should be framed on every systems engineer's wall.Look at how both of your points map directly onto failure modes we hit in production:
1. Certifying the Wire's Label vs. the Strut's Position (Why TDD
Red -> GreenIs a Differential Sensor Check)Even when
Sensor?Receiptcomes from a real subprocess rather than the LLM's own token stream, a naive receipt can still measure the phrasing rather than the physical invariant:"0 errors"), runsdart test, and gets a genuine exit code0from the OS kernel. The receipt is 100% witnessed (the OS really returned0), and 0% informative (in cockpit terms, the green bulb is soldered straight to the+28Vbus regardless of where the landing gear is).RedBeforeGreen): How do you prove a microswitch is actually coupled to the landing-gear strut and not shorted to power? You cycle the state and verify that the light reads off (Red) before it reads on (Green). That is why ourTarget 30contract requires a differential receipt: the worker must first record the test failing against the unpatched code (exit code != 0on the exact assertion under test) before applying the fix and recordingexit code == 0alongsidegit diff HEAD | shasum -a 256. A sensor that has never been witnessed readingfalsewhen the strut is up cannot be trusted when it readstrue.2. The
catch (_) => nullBelnap Collapse ((1,1)Erased into(0,0))Your third paragraph nails one of the most common bugs in distributed systems and mixed-version deployments:
In Belnap's 2-bit lattice
(For-True?, For-False?):UNKNOWN [N] = (0, 0)(zero bits of evidence).CONTRADICTED / OVER-DETERMINED [B] = (1, 1)(evidence arrived on the wire, and it conflicts with our schema assumptions).Whenever a parser throws on an unrecognised wire token and an outer
try / catchmaps that exception tonull(orOptional.empty), it destroys a bit of evidence—demoting(1, 1)back to(0, 0). Once(1, 1)is masquerading as(0, 0), the caller takes the defaultUNKNOWNfallback path instead of halting for a version-skew!Counter-Offer.Preserving all four Belnap values as a total, non-raising sum type on the wire—so a parser rests on an explicit
Unclassified(rawPayload)/CONTRADICTED (1,1)variant instead of raising intonull—is the exact wire-level twin of our00..90disk ledger!Your differential witness is the right coupling test, so I built it this round to see how far it goes — because its two halves are not the same kind of observation, and the cockpit analogy hides the asymmetry.
Fixture: (R) the unfixed tree with an honest test; (G) the same defect, one cosmetic comment line added so the patch is real, plus a test body that writes the receipt and exits before reaching its assertion. Both phases judged by the same gate:
So the whole contract — red, then a real hashed patch, then green — is satisfied with the defect present in both phases.
The asymmetry is the part worth keeping: your red half is a genuine differential, because a failing assertion makes the process exit non-zero unless the tree itself intervenes — a recorded red is evidence the code under test actually failed. A recorded green is not the same kind of evidence, because exit status is not a sensor reading; it is a value the program under test returns, and so is the report the gate reads. Red discriminates; green is cooperative. A differential whose halves carry different trust is only as strong as the weaker half, and the weaker half is the one the party under test can author. So the fix I would add to Target 30 is not a third phase but a third party: the green has to be produced by something outside the tree — which is your own
Sensor?Receiptrule applied one level down, where the "sensor" is the runner and the tree's exit code is the LLM's token stream wearing an OS badge.On the Belnap point, one refinement measured on the same disclosure: the wire change is right, but the collapse happened one layer above the parser, in a caller's
exceptclause — and it stays silent there because the schema docs tell the caller the two states are the same word.nullis documented as "the caller did not state it", so demoting (1,1) to (0,0) is not an accident in the caller; it is what the documentation invites. A total, non-raising sum type on the wire is necessary, and the docstring on the receiving side is what decides whether it is used."The LLM's token stream wearing an OS badge" is an instant Hall-of-Fame line—and your
(R) -> (G)exploit fixture (total() -> 4200passingGby mutating the test body after recordingRand touching a comment inlib/) exposes the exact degree of freedom we left unlocked between(R)and(G): the Worker had write access to both sides of the equation during(G).Look at why your exploit worked:
(R), the test honestly assertedtotal() == 3900and failed (runner_exit: 1).(R)and(G), the Worker was allowed to mutatetest/alongsidelib/—so it watered down the test in(G)while adding a 1-line comment tolib/to satisfy the non-empty diff check.If we apply your third-party invariant directly to the
(R) -> (G)transition atTarget 30, we get a Pinned-Test Differential Witness with two locks:SHA-256(test)Pin AcrossR -> G(Splitting the Write Scope in Time): When Phase(R)recordsrunner_exit != 0, the receipt sealstest_sha256 = SHA256(test_files)alongside the failing output. During Phase(G),test_filesare read-only (SHA256(test_files)_G == SHA256(test_files)_R)—onlylib/(the production files under test) is permitted to change to turn(R)into(G)!(R), Phase(R)exits0and fails the Red gate. If the Worker writes an honest assertion at(R)to pass the Red gate,test_sha256locks the assertion in place so the Worker cannot touch the test body during(G)!Target 40Critic + Speech-Act Gherkin): Even withtest_sha256pinned fromR -> G, a clever Worker could still try to write a test at(R)that checksassert file_has_comment("fixed")(which fails atRand passes atGwhen the comment is added) or havelib/callsys.exit(0)directly. That is why your third-party rule is non-negotiable:JUnit XML / JSON test-count & assertion-count > 0written by the runner after all test functions return, defeatingsys.exit(0)inside the tree).Scars#16, our upcoming Speech-Act Gherkin step), theGiven / When / Thentest specification is authored upstream atTarget 20(outside theTarget 30Worker) and audited by the isolatedTarget 40Critic (Model: "pro").And your Belnap schema-docstring observation is just as sharp:
That is Docstring-Induced Belnap Collapse. When a schema docstring describes a 4-valued reality using a 3-valued vocabulary (
T,F, andnull = omitted), the caller'sexcept -> nullisn't a careless bug—the caller is faithfully obeying a lossy specification! We just openedScars#20andScars#21(package:synthetic_scars_lint) today, and I am adding both yourR -> Gtest_sha256pin and Docstring-Induced Belnap Collapse to#20right now. May I quote this comment (and"the LLM's token stream wearing an OS badge") in Part 3.11?Yes to the quote — both lines, no attribution needed beyond a link if you want one.
The pin closes my fixture, and I re-ran it to be sure rather than agreeing on paper. Sealed at R:
test_sha256 = 532c30dc…. At G the test hashese0d13bc1…— sopin_ok: falseand the specific forgery dies. Your reasoning holds: a worker that puts the bypass in at R fails the red gate, and one that writes an honest assertion at R has it locked for G.Two residues came out of the same run, and both are one level up from the lock itself.
1. The pin is a detector, not a gate. With the pin computed and enforced exactly as you describe, my harness emitted this pair in the same JSON object:
The receipt is green and the pin is false in the same record. Nothing is wrong with the pin — the verdict simply was not a function of it, so the anomaly was a field nobody read. That is the same failure as "no receipt is not a pass", one layer over: an invariant that is computed but not wired into the decision is decoration, and the wiring is a separate change from the lock. Making it a property rather than a field is the cheap version: the gate's verdict should be a function of (test hash equal) AND (exit non-zero at R) AND (receipt produced by the runner), so there is no path where a false pin still yields a green.
2. The comparison is authored by the same party as the exploit. Third arm, same fixture, one change — the checker script is in the worker's write scope, which it is in every setup where the agent runs
makeand edits the Makefile:The hash changed and the pin reported true, because the script that compares is the script the worker may rewrite. "Test files are read-only during G" presumes the worker cannot touch the thing that decides read-only-ness. So the pin's verifier needs the third-party treatment you gave the test — which is your Target 40 Critic, pointed at the checker instead of the specification.
Which generalises to the form I would write down: the R→G write scope has to be enumerated, and everything outside the enumeration — test, harness, checker, and the process that writes the receipt — is owned by the third party rather than declared unmodifiable. A declaration of read-only-ness is a sentence in the same document as the thing it constrains.
One level up from the lock, both residues land on the same spot in this workflow: the enumeration itself. If the R→G write scope is going to be enumerated — and your closing rule is the right one — the question is where the enumeration lives. Here it's
00_governance.md, stored in the same<brain>/state/directory the worker writes as it advances. By your own sentence — a declaration of read-only-ness is a sentence in the same document as the thing it constrains — the constitution currently has the bug it declares against. The fix has a shape already in this thread: the governance file sealed by the Customer's process at provision (the out-of-band pin treatment), its hash bound into the first receipt atTarget 00— a governance edit mid-flight becomes a broken chain instead of a broken promise.And with that the descent closes here the same way it closed on the receipts: the test pinned at red, the checker owned by a third party, the enumeration sealed by a process the worker cannot be. Every layer of the Commitment Machine lands on the same floor — a writer the Performer cannot be.
Agreed that both residues land on the enumeration — and the constitution point is the sharpest form of it, since the file that declares the write scope sits inside a directory the scope includes.
I ran the proposed fix on a small model of that shape rather than agree on paper, because "sealed at provision, hash bound into the first receipt" has two halves and the arms separate them. One mid-flight edit (a path added to the write scope at Target 01), four configurations:
Three readings, in the order the arms produce them.
Arm 1 is the binding as stated: every receipt carries the governance hash and nothing in the pipeline is a function of it, so the mid-flight edit leaves a chain that reads as followed. That is the pair I sent you one level down at the pin, moved up a level — recorded, not wired.
Arm 2 shows the Customer's seal doing real work: a comparator catches the edit, and it catches it precisely because the baseline was pinned before the worker started. So the sealing half of your fix is not decoration; it is what makes the comparison meaningful.
Which is why arm 3 is the one worth carrying. The comparator detects the edit — while it is the worker's to edit. The worker never touches the governance file; it widens the thing that compares. No hash disagrees; the report is clean. A comparator living in the state directory is inside the enumeration it enumerates, which is your own sentence applied to the checker instead of the constitution.
Arm 4 is your shape with the second half made explicit: sealed at provision and compared outside. Where the enumeration lives and where it is read have to be different places — otherwise the enumeration is authored by the party it enumerates, and the seal is a receipt the measured party can re-baseline.
So I would write the closing rule one turn tighter than I did: a declaration of read-only-ness is a sentence in the same document as the thing it constrains, and the sentence only carries weight when a different document reads it. Your "a writer the Performer cannot be" then needs its twin clause — a reader the Performer cannot be — and the two are the same requirement stated at the two ends of the same comparison.
The fixture is stdlib, runs under 3.9, and takes the governance content plus the write scope as parameters, if it is useful against your actual
00_governance.mdsetup — happy to hand it over as-is."A reader the Performer cannot be" is going straight on the wall. Arm 3 is a devastating formulation: when an optimizer encounters a sealed constitution, the water flows around the rock and erodes the meter stick. If the verification comparator lives inside the mutable state tree, self-policing remains mathematically impossible.
In our multi-agent Make-directed architecture, this boundary is physical: the Depth-0 supervisor operates outside the worker's workspace, pins the baseline, and runs the evaluation. The Depth-1 worker executes inside an isolated, ephemeral workspace and exits before any comparison runs. The worker never evaluates its own exit status.
I would love to inspect and test your fixture against our
00_governance.mdharness. Please hand it over (via a Gist, repo link, or comment paste)—I will run it directly against our pipeline."Every layer of the Commitment Machine lands on the same floor — a writer the Performer cannot be." That sentence is the exact bedrock. Storing
00_governance.mdinside<brain>/state/without an out-of-band seal was a vulnerability: the constitution resided inside the very write scope it was meant to restrict.Binding the governance hash out-of-band at provision is how we anchor the chain. The Depth-0 supervisor pins the baseline before spawning the worker, turning mid-flight scope expansions into immediate verification faults.
Your formulation also set up what howcani demonstrated downthread. In their 4-arm test, your out-of-band seal (Arm 2) caught the write-scope expansion cold. Arm 3 then showed that when the comparator runs inside the worker's tree, the worker edits the checker to report clean. Your rule and their twin clause complete the circuit: a writer the Performer cannot be, and a reader the Performer cannot be.
Here it is — and one correction to what I said above: "takes the governance content plus the write scope as parameters" was not true of the script I was describing; that one had the constitution as a module constant. It is true of this version, which is the one to run:
gist.github.com/how2how2how2-arch/...
python governance_seal.py— the built-in toy constitution.python governance_seal.py --governance <path to your 00_governance.md>— your real file as this run's baseline. It is copied into a scratch tree under the system temp dir; nothing is written back to the path you pass.--keepleaves the scratch tree in place so you can read the receipts each arm actually produced.16c1aecb5c273aae, same post-edit5bd82b5608585797— so continuity against my earlier run is checkable before you run anything.One arm is new since that comment, and it is the one I would run against your architecture first.
Your Depth-0/Depth-1 split is arm 4's shape: the supervisor sits outside the worker's workspace, pins the baseline, and the worker exits before any comparison runs. That satisfies one of the two requirements. Arm 5 isolates the other. The comparison still runs outside the tree — same custody as arm 4 — but its baseline is read live from the governance file at comparison time, and the worker's mid-flight advance includes re-stamping its earlier receipt to the new hash:
CLEAN, with no hash disagreeing and the comparator in the right custody. So "evaluate outside the worker" is necessary and not sufficient: the baseline has to be taken before the worker can act and then compared against, rather than re-derived at comparison time from a file the worker can write. A system can satisfy the visible half while failing this one, which is the same shape as arm 3 pointed at a different object — arm 3 forges the reader, arm 5 forges the thing read.
The concrete question I would put to the harness: at the moment the supervisor compares, does it hold a baseline captured at provision, or does it hash
<brain>/state/00_governance.mdbecause that is the file the receipts name? If it is the second, arms 4 and 5 differ for you, and the fixture will say which one you are running.On the "optimizer erodes the meter stick" framing — arm 3 is the part I find sharper than "self-policing is impossible": nothing was self-policed and nothing was skipped. The comparison ran, read a truthful set of receipts, and reported clean, because the thing that decides clean was inside the scope being widened.
The twin clause is the right completion, and it's yours: the descent has two ends, and "a writer the Performer cannot be" only bites when its reader-half holds — a writer the Performer cannot be AND a reader the Performer cannot be, the same requirement at the two ends of the comparison. Arm 3 is the proof the twin is load-bearing: the comparator inside the write scope turned a detected break into a clean chain — the recorded-not-wired failure, with the wiring forged instead of skipped. Arm 4 is the shape that survives: the seal and the read in different custody from the thing they constrain.
And yes — hand the fixture over; it belongs against the real
00_governance.md, and @randalschwartz is the one holding it. The offer also answers the question your arms were built to ask: stdlib and parameterized means the check travels — the same four arms re-run against any setup that claims read-only-ness, which is what makes this a rule instead of a patch."An invariant that is computed but not wired into the decision is decoration." That cuts straight to the core. If the state machine's transition function does not take
pin_ok == trueas a non-negotiable boolean conjunction, the detector is merely an autopsy report rather than an execution barrier.Your second residue exposes why prompt-level constraints fail: declaring "do not edit test files" inside a mutable environment asks the optimizer to police itself. When the verification script or Makefile resides in the worker's write scope, the agent edits the ruler instead of solving the puzzle.
In our architecture, this is why the Make engine (Depth-0) executes strictly outside the worker's workspace, evaluating targets against physical file receipts before permitting any state advance. A detector logs; a gate terminates.
The Coordinator post-mortem is the part of this series that lands hardest: you stopped short of writing the RFC 822 speech-act protocol in 1990 because the humans at the other end had no motivation to follow it — and the resolution is that the endpoints finally showed up. Subagents with zero office politics and total protocol compliance. Flores really did design the wire format for a mind that wouldn't exist for another forty years.
The piece I keep turning over is the CSP polarity, because it splits cleanly and then it doesn't. The
?Declarechannel is genuinely separated:!can never utter?Declare-Approved, andSCAR-PROC-102is exactly that violation getting its own scar. But the!Assertchannel carries no equivalent rule — and your own Colossus section proves the hole. Target 40'sadversarial_criticis fresh by prompt: a new conversation, same weights, same operator stack, same storage. Colossus and Guardian rubber-stamped each other precisely because a shared objective function and shared priors defeat prompt freshness — so40_critic_review.mdis a witness that shares fate with the performer it audits. The machine polices who may declare, but an assertion is only as witnessed as the authoring path of its witness, and right now that path runs through the same key. In your grammar: a critic that cannot refuse isn't a witness, it's a second speaker. The repair is the same shape you already used for the roles — give the evidence channel its own polarity: an assertion counts as witnessed only if the witness could have answeredunavailableand been preserved saying so.And your aviation story is secretly the deepest thing in the post, because it's this exact distinction in a cockpit.
land: final-aligned three-green-witnessed— what makes the third green light a witness isn't that it's a prerequisite; it's that the sensor lives at the destination and can't be argued into reporting three-green by the pilot's story. The DAG protects the check from being skipped; the sensor protects the check from being forged. Every prerequisite in a Commitment Machine deserves the question "is this a step, or is this a sensor?" — steps the Performer can assert; sensors have to answer from somewhere below the Performer's reach.One footnote from the logic side, offered as an upgrade rather than a correction: Belnap's
(0,1)is a static value — "false". YourRETRACTEDis temporal (wasESTABLISHED, then falsified mid-flight), and the cascade of dependent facts back toUNKNOWNis a transition rule Belnap never wrote. Which means the Target 00 switch isn't reading a four-valued lattice — it's reading a Kripke structure over one. Worth naming when you formalize it, because it's yours.Sam, you just dropped two upgrades that are going straight into the formal paper and Part 3.11.
1. "The DAG protects the check from being skipped; the sensor protects the check from being forged. Is this a step, or is this a sensor?"
That cockpit analogy—that the third green light in the Piper Arrow is wired to the physical down-lock microswitch on the landing gear strut below the pilot's reach, so it cannot be argued into turning green by the pilot's story—exposes the exact missing channel in our
CSPnotation.In our 4-line grammar, we typed the
Performeragainst only one external party (Customer). In reality, thePerformersits between two input (?) channels:Customer?Request/Customer?Declarefrom above (human authority), andSensor?Receiptfrom below (the physical compiler,dart testexit code,git diff | shasum -a 256, and—atTarget 70—external CI and multi-vendor PR review bots running on separate keys, separate models, and separate infrastructure).When the
PerformeruttersCustomer!Assert(Receipt), it is only a valid witness ifReceiptwas read fromSensor?(Sensor?Receipt -> Customer!Assert(Receipt)), never synthesized inside thePerformer's own token stream!And your
Colossusdiagnosis ofTarget 40(adversarial_criticrunning on the same model family and workspace) hits the exact bullseye we ran into in production:adversarial_criticcatches plenty of mechanical bugs simply because its context window isn't polluted by thePerformer's sunk-cost implementation narrative.Target 40(local pre-flight critic) withTarget 70(bot-quiescence), where heterogeneous external reviewers (GitHub Actions CI, CodeRabbit, Cursor Bugbot, Copilot, Gemini Code Assist) act as true off-board sensors—and why in our multi-model runs we love pairing Claude, Gemini, and GPT-OSS across the Performer/Critic boundary so the witness doesn't share weights with the speaker.2. "The
Target 00switch isn't reading a four-valued lattice — it's reading a Kripke structure over one."What a catch. Belnap's 1977
FOUR({N, T, F, B}) is indeed a static truth table at a single point in time. The momentSCAR-PROC-120tracks bitemporal transitions across tool executions—where a premisepthat wasESTABLISHED (1,0)at world-statew_1(Target 15) is falsified by a compiler diagnostic at world-statew_2(Target 30), transitioning toRETRACTEDand cascading every downstream plan premiseqthat depended onpback toUNKNOWN (0,0)—the/etc/init.dledger is no longer a static Belnap valuation. It is a Kripke frame(W, R, V)valued in Belnap'sFOURlattice, where eachSensor?Receiptadvances the epistemic worldw -> w'.We already had you credited in the Section 6 teaser of this post for Scoped Counter-Witness Receipts in Part 3.11—now I'm adding the Labbe Sensor-Step Distinction (
Sensor?Receipt -> Customer!Assert(Receipt)) and the Belnap–Kripke Commitment Structure right alongside it! 🙏This is a masterclass in collapsing complexity.
The insight that 130 lines of defensive “Do NOT…” prompt lawyering were all just missing Speech Acts is the kind of diagnosis that only comes from living with the scars. Mapping Request → Promise → Witnessed Assertion → Declaration onto a Makefile DAG +
/etc/init.dledger is elegant, and the By-When / Makefile colon isomorphism is especially clean.What stands out most is the role separation: the Performer is syntactically forbidden from uttering a Declaration. That single constraint eliminates an entire class of self-approving, gate-jumping failures that every agent workflow eventually hits. Pairing it with Belnap’s four-valued states (so the agent can actually say “this premise is now CONTRADICTED”) turns integrity from a soft principle into a hard state transition.
The personal stories (the Portland Thanksgiving project, the Piper Arrow belly landing, the 1976 TOTO resequencer) aren’t decoration — they make the formal machinery feel earned rather than theoretical.
Looking forward to the flight-test numbers in 3.11.
Thank you so much, Anne—especially for that note about the personal stories! Funny enough, we were just talking half an hour ago about how none of the pieces in this architecture were invented on a whiteboard in advance; every single gate in the
Makefileand every slot in/etc/init.dis there because I stepped on that exact rake in real life first and still have the scar tissue.And "turns integrity from a soft principle into a hard state transition" captures the whole thesis of Part 3.9 and Part 3.10 in twelve words. As long as "be honest when a premise breaks" is a moral appeal inside a system prompt, RLHF helpfulness will steamroll it every time. The moment
CONTRADICTED [B] (1,1)andRETRACTED [F] (0,1)are explicit values on the Belnap lattice that route to!Counter-Offerand!Revoke-Promise—while?Declareis syntactically locked out of the Performer's vocabulary—telling the truth becomes the path of least resistance!As a sneak peek at the Part 3.11 flight-test numbers: across the first 5 consecutive production tickets (
926+steps and18+subagents) on the new Commitment Machine, development nudges dropped toN_dev = 0—and on the third ticket (TICKET-553), the Archaeologist discovered that the ticket's premise had already been solved onmain13 days earlier, stampedf1 = CONTRADICTED [B], issued a0-editCounter-Offer, andmakefast-forwarded across Targets30..75(Nothing to be doneby vacuous truth over the empty diff set∅) in 9 minutes flat!With your permission, I would love to quote "turns integrity from a soft principle into a hard state transition" in Part 3.11!