2026-09-04 - (/loop) The relations are testable where the numbers are not

6 measured relations asserted, none previously; 1 named as unreachable, not faked
suites 130   clippy/fmt/identity clean on both repos

Thirty-first cron tick, plan item (a): the 32 measured values that are not refusals.

A count is not a property

018-relational/mutex-handles-distinct recorded 0x6; event-flag-handles-distinct recorded 0x8. Those are counts of what the probe made, not handles - orbistoun's are host addresses, the console's are its own kernel's - so asserting either number would pin this project to how many objects a probe happened to allocate.

The check's name states something needing no number: handles are distinct, a thread's identity is stable, a mutex one thread holds excludes another. Six are exercisable in-process and all six hold, in tests/measured_relations.rs.

mutex-excludes-another-thread is both kinds at once: its 0x80020010 is EBUSY under the encoding D398 measured, so that test asserts the property and the code, read from the knowledge base. It is also the one that would matter most if wrong - a trylock that succeeded puts two guest threads inside one critical section.

Two things deliberately not asserted

event-flag-handles-reusable has two readings. That delete-then-create works is checkable; that the handle value comes back is not - these are host allocations, so a test of it would pass or fail on what the heap did that run (D535). If obSCEne's check means value-reuse, orbistoun's behaviour is undetermined rather than agreeing, and that is in the test.

file-position-tracks-reads needs a file and nothing opens in a bare service test - /app0, a host path and /dev/stdout all answer ENOENT, since the filesystem has no mounted title. Named as uncovered rather than replaced with something easier.

Breaking it taught what passing did not

D544's rule - break a multi-case guard in more than one place - paid immediately. Replacing sync::new_handle with a constant failed the condition variable assertion and left the mutex one green: mutexes do not use that allocator. They use sync::next_handle; breaking that failed the mutex assertion and the exclusion test. A third break, pthread_self returning a constant, failed the identity test that neither of the first two touched.

Without the second break the file would have looked verified while checking a third of what it claimed.

Where the axis stands

Of the 47 measured values quoted into knowledge entries: 14 refusal codes asserted (D544), 6 relations asserted (here), 1 recorded as a divergence (D543), 26 still unasserted because their meaning is genuinely in the check's source.

Decision: D545.