D195 - prosper is the sixth loader, the only headless one, and the first to have ground truth to check us against
boot_trace takes a game directory and runs it with no
window at all. That matters beyond convenience: every other loader in
the sweep opens a window on the user's desktop, and a run long enough to
be minimised is a run whose screenshot fails - while the screenshot
is the report for any loader whose text channel does not work.
prosper has neither problem, so it can be run as often as wanted.
scripts/prosper-run.sh.
obSCEne boots under it and the resume mechanism converges as designed, each blocker costing two rounds under D191's two-consecutive-failures rule:
round 1 118 records last=015-sync/semaphore
round 2 165 last=018-relational/semaphore-counts
round 3 165 last=018-relational/semaphore-counts
round 4 180 last=018-relational/semaphore-state-is-per-object
round 5 180 last=018-relational/semaphore-state-is-per-object
round 6 181 last=018-relational/handle-fits-its-out-parameter
The result that could not be got anywhere else
hle_registry_dump prints prosper's own registry: 1,201
real implementations, 6 placeholder, and
anything absent is unimplemented and logged as such at run time.
The loader states its own answer.
007-responsive guesses that answer from behaviour alone
- give a function two inputs whose results must differ, and call it a
stub if both come back the same. Plausible, and until now never checked
against anything that knew. Checked now, over every function the section
tests:
| obSCEne's verdict | prosper's registry | count | agreed |
|---|---|---|---|
responds |
real | 45 | 45 |
silent |
absent | 9 | 9 |
54 of 54, no disagreements in either direction. No false stub, no missed one. That is the first independent evidence the heuristic measures what it claims to, and it is the kind of positive result principle 7 asks for: it proves the section works, where a negative check would only have proved it rejects bad input.
The SIGSEGV is prosper's, and the announcement said so first
Round 6 died with a fault report naming a host frame:
RUN ENDED: kind=2 SIGSEGV at addr=0x1af22510 rip=... (mapped/host)
backtrace: eboot +0x442695 / eboot +0x46252d / mapped/host +0x1
rip is in host code with obSCEne frames only as callers,
so obSCEne called into prosper's HLE and that faulted dereferencing its
first argument. The five semaphore entries are all real in
the registry, so this is a real implementation crashing, not a missing
one. The check that provoked it holds a guard word beside its handle and
never dereferences a handle at all.
obSCEne's contribution was the dangling try with no
res, which named the call before it was made. That is
announce-before-attempting working on a loader it had never met, first
run.
What it does not establish
Nothing about hardware. prosper is a fourth reader agreeing with us about module layout and a sixth loader running our code; it is not a console. The responsive result is evidence about the heuristic, measured against one implementation's idea of its own completeness.
Status: derived - 54/54 measured against a registry the loader publishes about itself.