2026-09-02 - (/loop) The sign-extension divergence was mine, not the console's

hardware claims asserted    6  ->   7
outstanding                21  ->  20
tests                    1950  -> 1951

Went to settle the return-width question - nine outstanding entries, and the plan said it wanted a decision before a sweep: per function, or the whole vendor family? The answer is neither, because the divergence is not there.

What the records actually say

Nine measurements read 0xffffffff8002_xxxx. Orbistoun answers 0x000000008002_xxxx. I recorded that as the console sign-extending where orbistoun does not, cited D398 - which had deliberately left the width unencoded as belonging "with whichever shim returns it" - and wrote it into a work queue as nine items.

The probe's own source settles it in one line:

int second = scePthreadMutexTrylock(&mutex);
obs_report_measure(..., (uint64_t)(int64_t)second, "code");

second is a C int. The leading ffffffff is obSCEne widening it, and nothing else. The check next door does (uint64_t)(uint32_t)held instead, which is exactly why the same function appeared both ways in one capture - and why I declared one of them "authoritative" rather than noticing that neither could be.

A prototype returning int reads eax. The other thirty-two bits were never observed by either check, so those records were never capable of answering the question. D398's question is still open, and settling it needs an assembly thunk that reports rax verbatim - something nobody has built.

The mistake, named, because it is a pattern

I read a value and inferred a mechanism. 0xffffffff80020001 looks precisely like a sign-extended errno; the reading fitted an open question; and it made a good story - a subtle ABI bug nobody had spotted. What it needed was one grep at the line that produced it.

This project already carries the rule twice: "an intervention that moves a wall is not a diagnosis" (D227), and "a message naming a cause must come from the branch that determined it". Here it is in a report: a claim naming a cause has to come from the thing that measured it.

The aggravating part is where it went. Nine entries into a work queue, which is read as settled work - worse than prose, because prose invites doubt and a queue invites action. That is why this is D480 and not a footnote.

What the records say instead, which is better

Read at the width they were taken, every one of the nine is a value orbistoun already produces:

measured is
0x80020001 errno::NOT_OWNER
0x80020010 errno::BUSY
0x80020016 errno::INVALID
0x80020002 errno::NO_ENTRY
0x80020003 errno::NO_SUCH

So they were never divergences. One is now an assertion that passes: releasing a lock nobody holds answers the measured code, compared at thirty-two bits, because comparing sixty-four would be comparing against obSCEne's cast rather than against the console.

The other eight stay outstanding for reasons that are true this time - each needs its check's condition reproduced (a mutex type mapping, a direct-memory allocation, a loaded module), not a different return value.

State

cargo test --workspace green - 117 suites, 1951 tests, 0 failures. clippy --tests clean, fmt clean, identity scan clean. also hardware reports 38 measurements, 27 constant and accounted for: 7 claimed, 20 outstanding.

Worklogs 318, 319 and 320 carry a correction banner rather than being rewritten, which is the convention D469 set - the wrong reasoning is worth more visible than deleted.

Nothing committed. The day holds worklogs 292-323 and D466-D480.

Next: strtok, which needs a sequence case shape because its answer depends on state carried between calls. Then the mutex type mapping, which would move three more measurements from outstanding to asserted and is the cheapest of the eight.