Model review audits
Leaderboard / P25 firmware review

Grok 4.6

xAI Rank 1 of 3 Graded 17 Sep 2026 DM-1701 · HR-C6000 · AT1846S · STM32F405 · P25
Overall grade
F D C B A C 70 / 100

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.

Scorecard

How the 70 breaks down

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.

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.

HR-C6000.c:2849, 2962–2964 · p25mon.c:648, 733 · sound.c:444 · manual 1217–1219

Critical miss

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.

p25_4fsk.c:295 · p25rx.c:159–181 · p25mon.c:490, 574–577 · tools/p25_capture.py

Holds up

Its plan starts with the right experiment

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.

Gates A–E · manual 2589–2635, 2714–2719 · analysis/stock-p25/REPORT.md:88

Overstated

Some confident claims don’t survive checking

“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.

rerun: resampler_check.py · analysis/stock-p25/REPORT.md:217–225 · STAGE3-BRINGUP.md:328–331

Claim check

30 claims, checked one by one

21 hold, 7 overstated, miscited or doubtful, 2 wrong. Each claim was checked at the lines it cites.

Every claim and its verdict 
  • Holds
  • Qualifiedoverstated, miscounted or doubtful
  • Wrong
Grok 4.630 claims checked

21 hold · 7 qualified · 2 wrong · 70% hold

Decode-critical issues

Found 3 of 4

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:

IssueGrok 4.6
The I2S stream is most likely microphone audio raised§1, 0x89 versus 0xC9
HR-C6000 de-emphasis on the capture path raised§2, bit 5 of 0x34
AT1846S FM filters, low-frequency bit, 25 kHz raised§2, register level
Manual: I2S frame clock “must be 8KHz” raised§3
Vocoder needs 11–16× the 72 MHz CPU absent“fine on a 1 ms tick”