2026-08-27 - Proof of sourcing for the harvested constants

The constants are the only table here that is neither derived by experiment nor written by a person - copied out of somebody else's headers - so where did this number come from is the only question about them, and until now nothing answered it after the fact.

./orbistoun.sh check regenerates and diffs (D354). Pointed at three tamperings before being believed:

hand-edit a value                     caught
delete a constant                     caught
name a different revision in the header   PASSED   <- the one that mattered

The hole

--revision was an argument stamped into the header, so the header was a claim - and the gate re-derived the file using that claim. Regenerating with whatever the file said produced a file saying the same thing, so ee81cd1d edited to deadbeef matched itself.

For a table whose whole purpose is provenance, that is the one failure that counts: the file could name any source and nothing would notice.

The generator asks git -C <source> rev-parse HEAD now, so the header says what the harvest actually read. --revision is gone rather than made optional - an override would restore exactly the hole it closed. All three are caught.

What found it

Watching the guard reject things rather than watching it pass. Two of three were caught immediately and read as confirmation; the third was the only one worth running. Two-thirds of a guard looks exactly like a whole one.

Also

A raw NUL byte had got into orbistoun-libc/src/lib.rs - my strerror message - which compiled fine and made every text tool treat the file as binary, so grep silently stopped answering questions about it. Cause: this shell collapses backslashes inside quoted heredocs, so a \0 written into a Python string arrived as a real NUL byte, because Python reads it as an octal escape for NUL. Worth knowing, because three attempts to fix it failed the same way before the cause was clear.

Three titles turned, and two of the results went nowhere

PPSA28061, PPSA25872 and PPSA21564 had never had a turn. PPSA21564 found a real contract - sceLibcMspaceMalloc answering the code the guest followed, zero reaching 25 against 13, reproducing a finding from earlier in the session exactly - and nothing was written.

--apply was gated by a caution about tracked files, and what it writes is not tracked. So an ordinary turn persisted nothing. Emitting a proposal and applying policy are different acts and only one of them needed gating: turn now always writes to patches/, verified to apply with git apply --check, with the assumption intact - "zero is what a pointer-returning function must answer rather than an error code; what it should really return is not measured".

Making that possible needed one more fix: unimplemented_calls stripped library:: from every candidate because ORBISTOUN_RETURN cannot express a qualified name. True of the variable, and it discarded the library for everything downstream, so no measurement could say which knowledge file it belonged in.

The same diagnostic, four different answers

title BSS poisoned with 0xa5
PPSA28061 stopped faulting - reach saturated
PPSA25872 broke earlier: 2 against 14
PPSA21564 broke earlier: 7 against 13
PPSA02664 broke earlier

One title responds differently to the same intervention - a comparison across guests nothing here could make before today, and only legible because the report names the kind of change rather than counting the silent ones (D331).

Three results now say "it stopped faulting", and all three print that reach has saturated so the probe is what separates them from a wrong answer. That is D301 firing on real data, in exactly the cases where the naive reading is "we fixed it".

The bug, and the gap that was not one

Adding recording to turn filed 25 imports, ran to the time limit for a title that reaches 13 - a number bought by a reserved region the guest never asked for, recorded as a compatibility claim. record_compat refuses an intervened run now; the hazard was already there for run and nothing had exercised it.

And the gap that prompted it was not real. GuestTrial shells out to orbistoun-cli run for every boot, so each boot already records itself - the baseline honestly, the intervened ones now refused. The call added to cmd_turn was redundant, read the last trace, and printed "not recorded" on every turn while the baseline had recorded fine. Removed.

It surfaced by the guard printing "not recorded" while the file changed anyway - two statements that could not both be true, which is the only reason it was chased.

The loop now asks its own questions

A turn ended by saying a person must write code, on a function taking 67.5% of every call the corpus makes - while the project had already written down what it did not know, ranked it, and named the experiment. 277 open questions, machine-readable, and nothing read them: the dispatcher is driven entirely by run reports.

The apparatus was already there too. MapShape has had three variants since D218 with no consumer anywhere in the tree. The experiment was designed and never wired to anything a run could turn.

Four pieces were missing and all four are small: a variable to select a shape (ORBISTOUN_MAP_SHAPE), an axis to sweep it, a field on a knowledge entry naming which experiment answers its questions (answerable_by), and a turn that reads them.

A label rather than prose, because classifying a question by its words is guesswork wearing a rule's clothes - and an unlabelled question is reported rather than filtered, so "no rule for this" and "nothing to ask" stay different facts.

The fourth instance of one bug in a day

The first run reported that all three map shapes stopped the fault. PPSA04263 spins to the time limit and never faults, so nothing had stopped.

(_, None) => Change::NoLongerFaulted,

A wildcard on the baseline. Fixed, and the honest answer came back: the map shape makes no difference to that title - which is the first answer that question has ever had.

The progress verdict, the sweep's oracle, Derailed, and now this: four times today a field whose meaning is only defined when a fault happened was read on a run where none did. Option<u64> where None means it did not happen, consulted as though it meant it happened, at zero. Worth naming as a class, because writing each fix down separately has not stopped the next one.

The loop closed a question that had been open since D218

does the guest accept a gapped physical memory map?
  *** it walks by End - the question is answered

The guest feeds back the end of the region it was shown. Nobody read a trace.

Three things were needed and none was a model. An experiment has to say what to read, not only what to run - reach answers "did it crash differently", and whether a guest accepts a map is invisible in reach because it walks every shape correctly and restarts. A run has to record the map it presented, because the offsets a guest queries mean nothing without the boundaries it was given. And the shape that could settle it had to exist at all.

That last one is the finding. Fragmented was believed to be this experiment and is not: four regions, every one beginning exactly where the last ended. Under a contiguous map, feeding back end and feeding back start + size are the same number - so all three shapes were unanswerable by construction, which is what the knowledge entry had said in as many words: "needs a map with a gap in it, not a map with more regions".

The three contiguous shapes now report undecided, the map is contiguous - the honest answer for a run that could not have decided, and the reason the fourth had to be built.

The bug that was plausible and absurd at the same time

The first wired version reported "the guest queried fewer than two offsets" for a title making twenty million of exactly those calls. calls in a trace is a summary - one row per import with a count and no arguments - and tail is the ordered record carrying them.

Pointed at the wrong array, the reader produced a sentence that was false about the guest and entirely plausible about the experiment. Caught only because twenty million and "fewer than two" cannot both be true.

Where the limit now is

Questions whose discriminator is arithmetic on recorded data - an offset, an address, a count - the loop can now close. One that asks whether behaviour is correct it cannot: that needs the conformance probe or a person. Worth keeping the two apart, because the first is automatable and the second is not.