Proven Quiescence
Silence is not completion: quiescence is established by a sweep over the loci, never read off idle carriers.
- Standing
- PROPOSED CHECKABLE RUNNABLE EXECUTED STAGED PUBLISHED REPRODUCED
- Last checked
- never run
- Source
- none — this record cites no check
- Limit
- PROPOSED. The phrase appears nowhere in the tree. Dijkstra–Scholten solved termination detection in 1980 and this chapter adds no algorithm; its only content is that silence must not be read as completion.
- Next rung
in_tree— a detector in this tree that distinguishes quiescent from merely-silent, and a case where it refuses.
Why this page says PROPOSED — the derivation, not the word
- ✗ a witness is named
- ✗ its evidence kind is one the ledger already uses
- ✗ the witness path resolves in this tree
- ✗ its rung is in_tree or above
- ✗ a run is recorded for these exact bytes
- ✓ no claim is cited that could be REFUTED
- ✗ a counterexample is shipped (required once WITNESSED)
- ✗ not staged on this site, so it cannot run from the page
WITNESSED requires every line above to hold. The label is computed from them by build.mjs and cannot be typed into the registry — the build refuses a record that carries it.
Intent
A system whose carriers are all idle may hold loci with pending work above the floor (Dormant But Alive). Declaring it finished because no observed worker is busy is False Quiescence. Proven quiescence is a sweep that asks every locus whether it has admissible pending work and carries, beside its assertion, what it does not assert.
Technical register
PROPOSED — the phrase appears nowhere in the tree. Nearest relatives: REVISION_REGISTER.md R79.2, where CompletedScan was renamed CompletedSweep because a multi-page enumeration is not a point-in-time snapshot, and the artifact gained a doesNotAssert field; and Super's ordered-participant semantics, where a timeout abandons the request but not the work. Prior art: Dijkstra–Scholten termination detection.
Problem
'All workers idle' is the completion signal in most systems, and it is wrong whenever work can wait somewhere a worker is not looking: a mailbox, a queue, a suspended locus. The failure is silent by construction — the system reports done and stops looking.
Solution
Enumerate the loci, not the carriers. Ask each for admissible pending work. Record the sweep as a sweep with a doesNotAssert field. Repeat until a full sweep finds nothing and no admission happened during it. Only then say quiescent.
Real-world analogy
A librarian who checks that no reader is at a desk, versus one who walks every shelf for a book left out. Only the second can say the library is in order, and only for the shelves walked.
Structure — on the surface
An illustration on a compute surface: loci above, carriers below. Press Play or Step; the takeaways collect as you go. Nothing here is evidence — the witness section is.
The chapter in WRL — and the chain so far
Chapter 17 of 32 — the fragment _patterns/wrl/chain/proven-quiescence.wrl, sealed alone by wrl.js
; PROVEN QUIESCENCE — its OWN clock domain: pq_clock fires ONCE at epoch 2 and is then done; the signal is
; still travelling through two relays and opens the Door later. The pulser's silence is not completion.
; pq_b is a router: chapter 18 draws from the quiescence chain's last relay.
[pulser:pq_clock](once at 2){sig_out}
[relay:pq_a]{sig_in, sig_out}
[relay:pq_b]{sig_in, sig_out}
[door:pq_done]{sig_in}
[pq_clock] --sig--> [pq_a]
[pq_a] --sig--> [pq_b]
[pq_b] --sig--> [pq_done]module + bench seal to → sem-3f0d499f7e69fc20f10dad37ccb88861c6c007fa0f62a482b82ca7df42bcdf70
Run inputs — a ScenarioV1, the forge's own document, bound to this world's id and never part of it (D3) · ScenarioDigest scen-66ce95db624331b0364… (the run inputs' own identity, computed by the forge)
No claims: the world runs on its clocks alone for 6 epochs.
Reduced by the native reducer (ic32); the reference reducer reproduces every epoch's film hash (0.005s).
The Film, epoch by epoch (6)
epoch 1 · sha256:cf79d117b114bc68aa9998e0ee7752ba8e6cebc98cd96ff34e351bf4a5881c72
FILM v0.7 t=1 pulser:pq_clock:mode=once,p=2,phase=2,armed=0,done=1,nf=-1 door:pq_done:open=0,next_open=0 relay:pq_a:cur_out=0,next_out=0 relay:pq_b:cur_out=0,next_out=0 wire:w__pq_a__pq_b:cur=0,nxt=0 wire:w__pq_b__pq_done:cur=0,nxt=0 wire:w__pq_clock__pq_a:cur=0,nxt=1 admit:policy=admit_candidate_min_firstreceipt_v1,fact_capacity_fault=0,receipt_capacity_fault=0,capacity_fault=0
epoch 2 · sha256:a0ab27b931f701a78cc9d9df86df494435730f0b6749a978813decfdef365d54
FILM v0.7 t=2 pulser:pq_clock:mode=once,p=2,phase=2,armed=0,done=1,nf=-1 door:pq_done:open=0,next_open=0 relay:pq_a:cur_out=0,next_out=1 relay:pq_b:cur_out=0,next_out=0 wire:w__pq_a__pq_b:cur=0,nxt=0 wire:w__pq_b__pq_done:cur=0,nxt=0 wire:w__pq_clock__pq_a:cur=1,nxt=0 admit:policy=admit_candidate_min_firstreceipt_v1,fact_capacity_fault=0,receipt_capacity_fault=0,capacity_fault=0
epoch 3 · sha256:ff28404f356bab99e9191d01429c8c137401939ef7303592aec6df2d2adc0f90
FILM v0.7 t=3 pulser:pq_clock:mode=once,p=2,phase=2,armed=0,done=1,nf=-1 door:pq_done:open=0,next_open=0 relay:pq_a:cur_out=1,next_out=0 relay:pq_b:cur_out=0,next_out=0 wire:w__pq_a__pq_b:cur=0,nxt=1 wire:w__pq_b__pq_done:cur=0,nxt=0 wire:w__pq_clock__pq_a:cur=0,nxt=0 admit:policy=admit_candidate_min_firstreceipt_v1,fact_capacity_fault=0,receipt_capacity_fault=0,capacity_fault=0
epoch 4 · sha256:3e70dbe48616d04edd236557540f30e74dc2ea21296209ae319bbb790a8ffc74
FILM v0.7 t=4 pulser:pq_clock:mode=once,p=2,phase=2,armed=0,done=1,nf=-1 door:pq_done:open=0,next_open=0 relay:pq_a:cur_out=0,next_out=0 relay:pq_b:cur_out=0,next_out=1 wire:w__pq_a__pq_b:cur=1,nxt=0 wire:w__pq_b__pq_done:cur=0,nxt=0 wire:w__pq_clock__pq_a:cur=0,nxt=0 admit:policy=admit_candidate_min_firstreceipt_v1,fact_capacity_fault=0,receipt_capacity_fault=0,capacity_fault=0
epoch 5 · sha256:e9d3e5fc8035278c918cf87af6ff2a3d72fa454df4381cc34c677029205601d4
FILM v0.7 t=5 pulser:pq_clock:mode=once,p=2,phase=2,armed=0,done=1,nf=-1 door:pq_done:open=0,next_open=0 relay:pq_a:cur_out=0,next_out=0 relay:pq_b:cur_out=1,next_out=0 wire:w__pq_a__pq_b:cur=0,nxt=0 wire:w__pq_b__pq_done:cur=0,nxt=1 wire:w__pq_clock__pq_a:cur=0,nxt=0 admit:policy=admit_candidate_min_firstreceipt_v1,fact_capacity_fault=0,receipt_capacity_fault=0,capacity_fault=0
epoch 6 · sha256:6eda6d235deecf38f70527506146d06ea0fd2672ff6590a148106b9e3fcb7846
FILM v0.7 t=6 pulser:pq_clock:mode=once,p=2,phase=2,armed=0,done=1,nf=-1 door:pq_done:open=0,next_open=1 relay:pq_a:cur_out=0,next_out=0 relay:pq_b:cur_out=0,next_out=0 wire:w__pq_a__pq_b:cur=0,nxt=0 wire:w__pq_b__pq_done:cur=1,nxt=0 wire:w__pq_clock__pq_a:cur=0,nxt=0 admit:policy=admit_candidate_min_firstreceipt_v1,fact_capacity_fault=0,receipt_capacity_fault=0,capacity_fault=0
Composes with the 16 chapters before it
The chain through this chapter — every earlier fragment, this one, and the links — seals to sem-ea73561d17a864cf51ea185b76f7b5e283453725acbd1aee01e8c073932f69f2: 66 objects, 60 edges (was 62 / 57; every earlier object and edge is still present — checked, or the build refuses).
How to read this board
Five kinds of object, two kinds of wire, and one band per Part of the book. Signal flows left to right: it starts at a clock, travels through relays, and ends at a door — or turns a spinner, which drives an orb. Nothing below is the book's own vocabulary; each line is quoted from where the definition lives.
| shape | is | and so |
|---|---|---|
| a clock; the only source of signal | Every signal on the board starts at one of these. Nothing else can make one. | |
| a pass-through, so signal can travel | One arrives, any number leave — a relay that fans out is the board's router. | |
| a sink; signal arrives and stops | It latches what reached it and passes nothing on. A door is where a path ends. | |
| rotation: takes signal, drives a pose | The only object on the board that holds a value a claim can rewrite — and only if its config says configurable. | |
| the thing that gets moved | It is driven, never driving: an orb is what you watch to see whether anything happened. | |
| not a WRL role — the book's own drawing of the receipts in the epoch's Film | It counts what the run admitted, and turns red on a Rejected outcome. | |
| SignalWire | signal: a sig_out to a sig_in | Legal from a Pulser or Relay, into a Relay, Door or Spinner. This is how the board moves. |
| SocketControl | control: a socket to a pose | Legal only from a Spinner into an Orb. At most one may land on any input port — fan-in is a typed refusal. |
Hover any object for what it is, which chapter put it there, and every field of its line in that epoch's Film — split into what it is doing now and how it was built. Click to pin the readout, then click a wired name to follow the signal. The field definitions come from TRVM/forge/film.py (the emitter), TRVM/forge/forge_state.py (nf, derived from the decoded counter and never from t), TRVM/forge/lower_e2a.py (the commit/react law), TRVM/FORGE_SEMANTIC_IR_v1_MEASURE.md §1.3; the shapes from WRL/learn.html and WRL/docs/spec/README.md. The build refuses if a Film emits a field this key does not explain.
The board so far: one band per Part, signal flowing left to right; relays that fan out are routers, doors are switches, pulsers are clock domains. Hover an object — or click the board and walk it with the arrow keys — for its role, its Part and what it is wired to. This board is the chain’s sealed shape; no Film drives it, so it has no state to report, and the whole board in the conclusion is where every object’s state is read epoch by epoch. Wheel zooms · drag pans · double-click fits.
Syntax — quoted from the tree at build time
The nearest thing the tree already says (REVISION_REGISTER.md R79.2) REVISION_REGISTER.md:99
| R79.2 | **A completed sweep is not a point-in-time snapshot, and R79 said it was.** Cloudflare guarantees that an object-list operation *"will list all objects at that point in time"* — for ONE list operation. A whole-bucket enumeration is many, and no first-party source says page 1 at T₁ and page 500 at T₅₀₀ share a snapshot, so an object created behind the cursor need not appear in the sweep that passed it. `CompletedScan` implied otherwise by its name. Renamed **`CompletedSweep`**, asserting only *every provider page traversed through a verified cursor chain from beginning to normal termination*, with `doesNotAssert` stated as a field beside it. R79's recoverability is therefore **eventual, through repeated authoritative sweeps**, not one-pass reconstruction under concurrent mutation. `CLOUD_V1.md` §6.9 | 2026-08-24 | Cloudflare consistency page read first-party; the multi-page question is **unanswered by the docs** and case **N** measures it (quiesce the bucket, or repeat until the delta converges to zero) |
Forces
A sweep is not atomic: work can arrive behind it. So a sweep must say what it asserts (nothing was pending as of each locus's visit) and what it does not (that nothing arrived since), and a consumer must treat the second as the honest part. Two sweeps in a row with no arrivals between them is the usual proof shape.
Applicability
Shutdown, checkpointing, 'the migration is complete', end-of-turn for an agent runtime, any place a supervisor decides nothing is pending.
Transformations
- repeating the sweep
- narrowing the claim to the loci actually visited
- inferring quiescence from carrier idleness
- a snapshot presented as a sweep
- dropping the doesNotAssert field
A refusing transformation is not one that is discouraged: it is one that, applied, makes the invariant above false. The word is the tree's, and it is the same word the join uses.
Consequences
'Is it done?' gets an answer with a scope. The name is the book's; the pieces are the tree's, and P1 would label a witness for it the day one exists.
Failure mode it answers
False Quiescence — Declaring completion because no currently observed worker has work. Paid for at: REVISION_REGISTER.md:99 (CompletedScan renamed CompletedSweep; doesNotAssert added)
Witness
No witness. This pattern is PROPOSED — the tree has no check for its invariant.
Counterexample
No counterexample shipped (required only when WITNESSED).
What to take away
- from the animationEvery slot was idle and two loci held pending work; a sweep found them, and only a second clean sweep proved quiet.
- from the syntaxA sweep carries a doesNotAssert field: what it could not have seen is stated beside what it saw.
- from the literatureDijkstra–Scholten (1980) proved termination for diffusing computations; the shape is the same.
- from the witnessPROPOSED: no witness. The label says so and nothing on this page argues otherwise.
Prior art — and what is not claimed
| work | relation | what it shares | where it differs |
|---|---|---|---|
| Dijkstra–Scholten termination detection (1980) | antecedent | quiescence must be established, not observed | none claimed; this is the canonical result |
| Misra's ring algorithm | antecedent | a second classical detection scheme | none claimed |
| REVISION_REGISTER.md:99 — CompletedScan→CompletedSweep with a doesNotAssert field | partial overlap | the tree's nearest relative: a completion that states what it does not assert | one rename in one lane, not a general rule |
Novelty not claimed. Termination detection was solved in 1980. The phrase 'proven quiescence' appears nowhere in the tree and is PROPOSED by the book; the classical algorithms are the answer, and the pattern's only job is to stop silence being read as completion.
Relations with other patterns
Three-Valued Outcome STATED