Say which check failed, and read a byte from either end

Their diagnosis came back and the radio end is faultless.  Every burst is
textbook: four sync pulses at 612 microseconds, then 216 and 403 microsecond
data pulses with gaps that complete each bit period, six of them a second,
sliced cleanly at the right lengths.  The pulses this had been failing to read
were being recovered perfectly all along and the fault is in the arithmetic
after them.

Two things follow from that, and neither is a guess about their sensors.

The first is that "nothing framed" is not a diagnosis, it is the absence of
one, and it was all this could say.  A message whose checksum holds and whose
parity fails is a different fault from one where neither holds, and both
differ again from a burst that never lined up on a byte boundary -- three
faults, three fixes, one message.  So the diagnosis now reports the closest
framing it found, which of its checks held, and the bytes themselves in
hexadecimal, which is what any question about a format is actually about and
saves asking somebody to read numbers off a screen.

The second is that this still assumed something it had no business assuming:
which end of a byte goes down the air first.  Both orders are tried now and
the checksums say which, like everything else here.  That one has a
fingerprint worth knowing and worth having said in the manual: reversing the
bits of a byte does not change how many of them are set, so odd parity
survives it and a checksum does not -- a message read from the wrong end shows
every parity holding and every sum failing, on every copy, which is a
signature rather than a coincidence.

Also fixed, and found by building their burst from the timings they sent: a
real transmitter closes the last bit with a terminating pulse, so a message of
fifty-six bits arrives as sixty-one pulses rather than sixty.  Nothing here
had ever seen one, the simulator not sending it, and every test in this file
was therefore one pulse short of what comes off the air.  It happens to be
handled correctly, which is luck rather than design, so it is now what the
tests are written against.

Full suite 2339 passed.  Sixty seconds of receiver noise still yields nothing,
and four hundred seconds of the invented garden still yields no sensor that is
not there, both rechecked after adding the second byte order.  Built as
2026-09-07_04.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PsWPTweCT6pwxKngvVxcg
This commit is contained in:
The Dust Council 2026-09-07 21:36:35 -07:00
parent 706c632f47
commit dfea5cb2f2
7 changed files with 275 additions and 36 deletions

View file

@ -1981,8 +1981,12 @@ block with one loud sensor in it yields exactly one sensor however many are out
there.
**Slicing the envelope into bits never measures anything against a clock**,
and assumes as little as it can about how a bit is drawn. Nor about how long
the silences in it are: the gaps inside one message range from 200 µs on the
and assumes as little as it can about how a bit is drawn — nor about which end
of a byte goes first, both orders being tried and the checksums saying which.
(There is a fingerprint for that one: reversing the bits of a byte does not
change how many are set, so parity survives it and a sum does not. A message
read from the wrong end shows every parity holding and every checksum failing.)
Nor about how long the silences in it are: the gaps inside one message range from 200 µs on the
newer sensors to 4000 µs on the oldest, so what belongs to one transmission is
settled from each burst's own widest gap rather than from a figure that would
have to suit every model at once. Anything that comes out longer than the
@ -2133,7 +2137,19 @@ transmitting over each other.
**Bursts with clean pulse lengths and `nothing framed`.** The radio is fine
and the message is from a model this does not read, or reads differently.
That line of pulse lengths is exactly what is needed to add it.
Under it comes the closest thing to a message that was found and which of its
checks held:
```
61 pulses pulses 216×36 403×21 612×4 gaps 209×21 395×35 601×4
nothing framed 8 ways of reading it tried
closest: 7 bytes at bit 4: ✓sum ✗parity ✓type ✗plausible DA 2B C4 B0 89 BF C1
```
Which check fails says what kind of fault it is. A sum that holds and a parity
that does not is a different thing from neither holding, and the bytes are
printed so the arithmetic can be done by hand. That line and the pulse lengths
above it are between them everything needed to add a format.
**`framed, but this model needs the same message twice`.** It was read
correctly and arrived once. The two older models are only believed on a second