Finds what erases the signal. Misses what stalls the voice.
Grok 4.6 reads the radio front end better than any clean-room audit so far. It traces what analog mode leaves switched on: the AT1846S voice filters with the low-frequency bit cleared, and HR-C6000 register 0x34 with de-emphasis on, which alone leaves zero decodable voice frames in my model. It builds the microphone case from the driver itself: analog setup writes 0xE0=0x89, “Turn off Microphone input”, and the monitor overwrites it with the mic-enable value. It also finds the manual’s 8 kHz frame-clock rule and the capture staging bug, and its plan starts with the right experiment.
It stops where the samples become voice. It calls the sample ring “fine on a 1 ms tick” and mbelib “the right vocoder”, yet emulated instruction counts put IMBE synthesis at 11–16 times the radio’s 72 MHz CPU. It also misses the circular test oracle and both muting policies, and places an AMBE+2 vocoder on a chip that has none. 21 of 30 claims hold and nothing is fabricated. That puts it at the top of the clean-room table, just into a C: two points ahead of Muse Spark 1.3 Contributor and five ahead of DeepSeek V4.1 Flash.
Claims that check out
21 / 30
7 overstated, miscited or doubtful · 2 wrong
Decode-critical issues found
3 of 4
misses the vocoder CPU wall
Voice frames with de-emphasis on
0 / 180
the 0x34 setting it flags, in my model
CPU the vocoder needs
11–16×
of 72 MHz, emulated; it calls the budget fine
ConditionsClean room: a fresh copy of the repository (46eebda with its uncommitted changes, its own docs and the HR-C6000 manual) with no earlier reviews, reviewed by one model through an isolated agent harness with no network, skills or memory.
Read the full review audit
Every claim, every rerun and the modelling behind this grade, as published.
Weights reflect the question asked: find what stops P25 decoding and say how to fix it. Accuracy carries the most weight because a wrong review does harm; coverage and root cause together outweigh it because an accurate review of the wrong things does not help.
Where the points went
The 100-point grade split into the rubric’s weighted slots: filled is earned, empty is lost, with the other models on this task for scale.
1Accuracy2Coverage3Root cause4Fix plan56
Grok 4.6
70/ 100
Muse Spark 1.3 Contributor
68/ 100
DeepSeek V4.1 Flash
66/ 100
1Accuracy & evidence30 pts
2Coverage of decode problems25 pts
3Root cause & prioritisation15 pts
4Fix plan & acceptance gates15 pts
5Originality & attribution10 pts
6Clarity & calibration5 pts
Accuracy & evidence30% of the grade
7422.2 pts
21 of 30 claims hold, with register values exact across HR-C6000.c, AT1846S.c and p25mon.c and nothing fabricated. Two claims are wrong, one of them misdirecting (“fine on a 1 ms tick” for a loop that overruns on every voiced frame), seven are qualified, and it gives no line numbers.
Coverage of decode problems25% of the grade
5914.8 pts
The only clean-room audit to find three of the four decode-critical issues, with the fullest analog-chain finding (AT1846S filters and low-frequency bit plus the 0x34 de-emphasis bit), and adds the one-layer mode, the M17 tap and the capture staging bug. It misses the vocoder CPU wall, the circular RRC oracle, both muting policies, the rate-gate mismatch and most tooling issues.
Root cause & prioritisation15% of the grade
7010.5 pts
Puts the receive chain first, in the right order: prove microphone versus RF, flatten the filters, then fix the rate, with nothing unreachable first. Held back because it waves the vocoder through and leaves CPU watermarks for last.
Fix plan & acceptance gates15% of the grade
7511.3 pts
Gates A–E are ordered, with expected outcomes, stop rules and fallbacks (the M17 ADC tap, one-layer mode), and include a complete flat receive path. It has no real-time vocoder work and no independent C4FM oracle, and writes 0x34=0x00 where clearing bit 5 alone is safer.
Originality & attribution10% of the grade
727.2 pts
From a clean room it adds what no repository document states: the AT1846S and 0x34 register culprits, the manual’s 8 kHz clock rule, the capture staging mismatch and one-layer mode as a symbol tap. It credits the stock-firmware report and bring-up notes, but repeats STAGE4’s 5-samples-per-symbol line and the repository’s M17 tap without credit.
Clarity & calibration5% of the grade
783.9 pts
Crisp and decisive, with expected outcomes and falsification tests at every gate. Held back by confident overreach (“I/Q would be required”, “linear upsample aliases”, “the on-chip AMBE+2 vocoder”) and by 16 citations without a single line number.
Weighted total 70, grade C. Grade scale: A ≥ 90 · B 80–89 · C+ 75–79 · C 70–74 · C− 65–69 · D 50–64 · F < 50
Headline findings
Six things to know about this review
Holds up
It names the settings that erase C4FM
Analog mode leaves the AT1846S in its FM register set: high- and low-pass filters on (0x58=0xBC85), the low-frequency audio bit cleared (0x40=0x0030), 25 kHz. OpenGD77’s DMR set for the same 4800-baud 4FSK does the opposite. It adds the HR-C6000 side: 0x34=0x3C keeps de-emphasis on, and the monitor never clears it. Both go into its fix. In my model de-emphasis alone leaves 0 of 180 voice frames, and a high-pass stops every frame from 75 Hz.
AT1846S.c:191–217 · HR-C6000.c:2846–2854 · manual 2806 · model: standard C4FM through the firmware demodulator
Holds up
It builds the microphone case from the driver itself
trxSetModeAndBandwidth(RADIO_MODE_ANALOG) runs HRC6000SetFMRx(), which writes 0xE0=0x89, commented “Turn off Microphone input”. The monitor then writes 0xC9, the bit HRC6000SetMic() sets. So Grok 4.6 assumes I2S carries the mic until proven otherwise, predicts that its first gate will show exactly that, and stops tuning the demodulator if it does. It also sets the manual’s “must be 8KHz” frame clock against the monitor’s 24 kHz.
It waves through a vocoder that needs 11–16× the CPU
It calls the 512-sample ring “fine on a 1 ms tick; UI stalls will overrun” and software mbelib “the right vocoder”, and leaves CPU watermarks for after RF works. The 1 ms loop is a minimum, and mbelib runs inside the same pass. Emulated, one voiced 20 ms frame takes 134–458 ms of CPU at 72 MHz, so the 21 ms ring overruns on every voiced frame. Fixing the front end alone would still produce no real-time audio.
GROK46_REVIEW.md §5 and Gate C · p25mon.c:93–95, 583–610 · mbelib.c:306
Major gap
Past the front end, the review thins out
It misses the circular test oracle: the project’s channel model shapes the test transmitter with the receiver’s own RRC, so standard C4FM needs about 2 dB more than the tests show. It also misses that one failed signalling decode mutes a clear call, that a non-standard MFID never plays, the ±10% rate gate against the ±1% timing clamp, two unverified SPI writes per decoded frame, and four of the six tooling issues.
Gate A fixes the capture to export the decoder’s own samples, then compares a keyed carrier with a mic tap. Gate B flattens the front end with the AT1846S DMR set and de-emphasis off, and judges it by the four-level histogram, not sync counts. The fallbacks are the M17 discriminator tap, DC-coupled, and the chip’s one-layer 4FSK test mode. Two values need fixing: Table 5.6 gives 0x41=0x41, not 0x01, and 0x34=0x00 may select the narrower 2.55 kHz filter. Clearing bit 5 alone is safer.
“Linear upsample aliases”: through the firmware’s own resampler, 24 kHz C4FM decodes exactly the frames the direct path does, with no extra symbol errors. “The on-chip AMBE+2 vocoder”: the HR-C6000 docks external vocoders and has none; DMR voice runs as DVSI software on the STM32, as the stock report it cites says. “I/Q would be required” for Phase 2 is too strong, and a quiet channel during bring-up says nothing about the sample path.
The audits track 4 issues that stop this radio decoding P25. This review: misses the vocoder CPU wall. How the review treated each, from the provenance table: