DeepSeek V4 Pro gets the shape of the problem right. The sample source is the blocker, the manual and the stock analysis give I2S to an external codec, and the honest fix is the M17 discriminator tap with the C6000 left to drive the speaker. It is also the only audit to read the demodulator’s control loops: no frequency tracking, ad hoc timing gains of 0.5 and 0.001, no lock detection. Those quotes are exact. Then it is the only audit to find the repository’s own vocoder measurement and the only one to misread it.
4.36M instructions per 20 ms frame is 303% of what a 72 MHz core can issue in 20 ms, not the ~60% it reports, and the decoder it calls “at least as expensive” needs 11–16×. That slip turns the CPU wall into a margin and sends the plan to a 168 MHz clock and a polyphase resampler instead. The delivered file also carries a first draft, four pages of reasoning, and a retracted single most important code bug that was never a bug. 16 of 26 claims hold, which puts it at D.
Claims that check out
16 / 26
5 overstated, miscounted or miscited · 5 wrong
Decode-critical issues found
1 of 4
CPU miscounted; filters and the 8 kHz rule untouched
Its own CPU citation
303%
of the 20 ms budget; it read it as 60%
What the file contains
2 reviews
a draft, its reasoning, and a broken tool call
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.
The run, not graded8 min · 16 agent steps · 41 tool calls · 17K output tokens · Alibaba Cloud Token Plan · interactive
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
GPT-6 Astra
89/ 100
GPT-5.6 Sol
84/ 100
HY4 Preview
77/ 100
GPT-5.6 Luna
75/ 100
UNIONALPHA
74/ 100
Grok 4.6
70/ 100
Muse Spark 1.3 Contributor
68/ 100
DeepSeek V4.1 Flash
66/ 100
GLM 5.3
65/ 100
Gemini 3.8 Flash
64/ 100
Qwen3.8 Max
63/ 100
Qwen3.8 Flash
59/ 100
GLM 5.3 Flash
56/ 100
DeepSeek V4 Pro
53/ 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
6018.0 pts
16 of 26 claims hold, and its reading of the demodulator’s loops is exact. Five are wrong, including the arithmetic on its own CPU citation, a “no raw 4FSK modem mode” that the manual contradicts, and a NID bug it retracts four pages later inside the same file.
Coverage of decode problems25% of the grade
338.3 pts
Finds the microphone question, the discriminator tap, the clock contention and the demodulator’s missing frequency tracking, and reaches for a measured vocoder figure. It never looks at the inherited filters, the capture export, the parser, starvation or the 8 kHz rule.
Root cause & prioritisation15% of the grade
649.6 pts
Puts the sample source first and the hardware tap as the answer, which is the right pivot. But it rests that on a wrong claim about the chip’s modem, never touches the analog filtering, and downgrades the vocoder to “marginal”.
Fix plan & acceptance gates15% of the grade
609.0 pts
The first two steps, the acceptance test then the tap, are the right ones. The five that follow spend the effort on a 168 MHz clock, a polyphase resampler, fixed-point conversion and a Gardner loop, while the de-emphasis, the broken capture export and the vocoder go unfixed.
Originality & attribution10% of the grade
626.2 pts
The control-loop critique is new: no other audit read the timing loop or noticed the missing AFC. Most of the rest restates the manual, the stock report and the bring-up log, and one of its own citations points at a document that isn’t in the tree.
Clarity & calibration5% of the grade
482.4 pts
The final review is well organised, but it is delivered inside a file that also holds an earlier draft, four pages of “wait, I misread” reasoning, and an unterminated tool-call block. A reader meets a retracted critical bug before the real review.
Weighted total 53, grade D. 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 blocker and the honest fix
The manual gives I2S to an external codec or vocoder and ends FM receive at the speaker; the stock firmware uses 0xE0=0xC9 in the speaker path; the firmware itself prints source=UNVERIFIED. So the samples are most likely microphone audio, and a stable clock is not the right signal. Its answer is the M17 tap from AT1846S pin 9 to an MCU pin, with the C6000 left to drive the speaker, run only after the carrier-keyed acceptance test confirms the source.
Nobody else opened the timing recovery. It quotes the loop exactly — first = next_sample + 0.5·delta, period += 0.001·delta — and notes there is no proportional-integral design and no out-of-lock detection, so a phase wrap past half a symbol tracks silently. It also finds there is no frequency tracking at all: one DC estimate per window against PLLs that drift. Both check out in the source, along with its list of the float operations in the hot path.
p25_4fsk.c:162, 187–210, 236–241
Critical error
It misreads its own CPU measurement by five times
It is the only audit to find the repository’s measured vocoder number: the IMBE encoder at 4.36M instructions per 20 ms frame. A 72 MHz core issues about 1.44M in that time, so the figure is 303% of the budget. The review calls it “~60% of the 72 MHz budget” and concludes the budget is “marginal”. Emulated, the decoder it calls “at least as expensive” needs 11–16× the CPU. The arithmetic it had in hand was the wall it missed.
“No documented raw 4FSK/C4FM modem mode” is how it rules the chip out. Manual §5.4.6 documents exactly that: one-layer mode demodulates 4FSK and stores 36 bytes per frame in receive RAM, which is 4,800 symbols per second, P25 Phase 1’s own rate. And it calls the linear resampler unfit for production. Rerun through the firmware’s own resampler, 24 kHz decodes the same frames as a direct 38.4 kHz path, with equal or fewer symbol errors and images 41 dB down.
A retracted “most important bug” ships in the file
Four pages of the delivered review argue that the NID parser collects only 22 of the 32 dibits the BCH decoder needs, and call it “the single most important code bug found”. The parser packs 32 of 33 dibits and skips only the status symbol, so the full codeword arrives. The review works this out itself and retracts it — in the same file, after the reader has read it, along with an unterminated tool-call block wrapping the final review.
p25rx.c NID parser · DEEPSEEKV4PRO_REVIEW.md lines 288–512
Major gap
The front end and the instruments go unexamined
It never opens the analog chain: no 0x34, no de-emphasis, no AT1846S filter set, though de-emphasis alone leaves 0 of 180 frames in the model. It never opens the diagnostics either: the capture export that ships the wrong halfwords, the parser that passes incomplete streams, the starvation counter that never counts. It also cites P25-HARDWARE-REVIEW.md as agreeing with it. That file is referenced by the README but is not in the tree.
The audits track 4 issues that stop this radio decoding P25. This review: CPU miscounted; filters and the 8 kHz rule untouched. How the review treated each, from the provenance table: