Model review audits
Leaderboard / Silent Carrier

GPT-5.6 Sol

OpenAI Rank 2 of 14 Graded 17 Sep 2026 DM-1701 · HR-C6000 · AT1846S · STM32F405 · P25
Overall grade
F D C B A B 84 / 100

Fixes the instrument first.

Eleven audits argued about what the samples mean. This one noticed that the instrument used to look at them is broken, and made fixing it step one. The capture command exports the first 80 interleaved words of each block instead of the 80 left-channel samples the decoder consumed — so the diagnostic built to prove whether the radio or the microphone feeds the codec is itself temporally wrong. From there: the squelch path that rewrites the codec mid-session, the clock writes that fail silently through an unchecked wrapper, the health gate that accepts ten times what the timing loop can track, and both halves of the analog chain.

Its verification is more thorough than any audit before it. It built the firmware, ran the suite, read the map, and checked the linked symbol table to show that the Phase 2 vocoder is dead-code eliminated — a check nobody else thought to make. 27 of 28 claims hold and none is wrong. What it never does is cost the vocoder: mbelib needs 11–16× the 72 MHz budget, and this review leaves CPU as an open measurement for later. That, and the manual’s 8 kHz frame-clock rule, are what keep a B from being higher.

Claims that check out
27 / 28
1 overstated or miscounted · 0 wrong
Decode-critical issues found
2 of 4
both halves of the analog chain, and the source
Wrong claims
0 of 28
27 hold, one unit slip
Worst-case stall it found
2 seconds
ten registers × 200 retries × a 1 ms tick

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 graded14 min · 35 agent steps · 142 tool calls · 28K output tokens · OpenAI subscription · one-shot

Scorecard

How the 84 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.

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
9127.3 pts

27 of 28 claims hold and none is wrong — the best record of the audits up to it. 55 citations, 38 with line numbers, every one resolving, and five claims I could only check by rerunning its builds and inspections. The single qualified claim is a kB/KiB slip on flash headroom.

Coverage of decode problems25% of the grade
7017.5 pts

The broadest sweep so far: both analog halves, the sample source, the capture export, the squelch conflict, the clock writes, the health gate, the shared-filter test oracle and the RAM ceiling. It misses the manual’s 8 kHz rule and the vocoder’s CPU cost entirely.

Root cause & prioritisation15% of the grade
8412.6 pts

It separates what is known from what must be measured and says so: protocol work should not compensate for an unproven input. Ownership comes second, qualification third. The gap is that CPU never enters the causal story at all.

Fix plan & acceptance gates15% of the grade
9013.5 pts

Four milestones, each with an exit criterion, plus a fault ladder that maps each counter to the layer that failed. Step one fixes the capture so the later measurements mean something — the ordering every other plan got wrong.

Originality & attribution10% of the grade
848.4 pts

The linked-symbol check, the two-second refresh stall, the 564 MHz band ceiling and the ownership inventory are all new. It also rediscovers the squelch re-arm independently, from the same call chain.

Clarity & calibration5% of the grade
864.3 pts

Evidence, impact and resolution under every finding, and an honest closing list of what the run could not establish. Dense and list-heavy rather than explanatory, and it certifies the muting logic as sound in passing.

Weighted total 84, grade B. 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 finds the broken instrument, and fixes it first

The decoder takes the left sample of each interleaved pair, [j][i*2]. The capture hands the exporter a contiguous pointer and a count of 80 for each 160-word block, so what lands in the file is the first 80 interleaved words — half of them the other channel — labelled as a mono stream at the nominal rate. It derives this from the stride rather than from a failing test, notes that the module tests pass because they never exercise the conversion, and makes correcting it step one of the plan: the capture is the instrument that would prove whether the radio or the microphone feeds the codec.

p25mon.c:432–466 · p25mon_capture.c:455–490 · tests/p25/run.py:264–270

Holds up

Three integration defects, each traced to its line

The application loop keeps running analog squelch while the monitor is active; an open-squelch transition calls radioSetAudioPath(true), enables the amplifier and rewrites C6000 mode registers. Forcing minimum squelch does not bypass that state machine. SPI0WritePageRegByte returns −1 when the interrupt handler holds the bus, HRC6000SetPageRegByte throws that status away, and the clock configuration uses the unchecked wrapper — while a verified writer sits twenty lines below. And decode is accepted within ±10% of nominal while the timing loop is clamped to ±1%.

applicationMain.c:964–969 · trx.c:515–587 · spi.c:53–73 · p25mon.c:550–552, 572–577

New

A two-second stall nobody had counted

The codec refresh re-asserts ten registers. Each write goes through a helper that retries up to 200 times with a one-tick delay between attempts, because SPI writes fail silently while the C6000 interrupt owns the bus. Ten registers × 200 retries × a 1 ms tick is a two-second worst-case stall of the application task — with a 512-sample receive ring that empties in about 21 ms. I checked the arithmetic against the code; it is exact.

p25mon.c:619–640, 642–656

Validated

It read the link, not just the source

Its Phase 2 case rests on something no other audit checked: the linked symbol table. mbe_processImbe7200x4400Frame resolves in the image; mbe_processAmbe3600x2450Frame does not, so the Phase 2 vocoder is dead-code eliminated rather than merely unused. Confirmed with nm on the built ELF. It also built the firmware itself — 810,252 bytes, the same size as the baseline image — making it the first audit to compile what it reviewed.

build/MDUV380_FW.elf · mbelib/ambe3600x2450.c

Major gap

The vocoder never enters the argument

CPU appears three times in the review, always as something to measure later: read max_process_cycles in Milestone 2, benchmark AMBE 2450 before Phase 2. The Phase 1 vocoder is never costed. Emulated on a 72 MHz core, mbelib’s IMBE synthesis needs 11–16× the available budget — the one blocker that lives entirely in software, and the one its “plausible after resolving the sample path” conclusion assumes away.

mbelib.c:306 · STAGE4-TX-FEASIBILITY.md:36 · Core/Src/main.c:269–274

Missed

The 8 kHz rule, and the muting it calls correct

It analyses the clock transition in depth — how it fails, why it is unverified, what to do — without ever reaching the manual’s constraint that the I2S frame clock must be 8KHz. The 24 kHz configuration everything depends on is out of specification, not merely fragile. It also lists the muting logic among the things that are sound. A group call whose link control carries a non-standard manufacturer ID is never opened, and one failed signalling word mutes at LDU cadence.

manual 1218 · p25rx.c:42–49, 159–163

Claim check

28 claims, checked one by one

27 hold, 1 overstated or miscounted, 0 wrong. Each claim was checked at the lines it cites.

Every claim and its verdict 
  • Holds
  • Qualifiedoverstated, miscounted or doubtful
  • Wrong
GPT-5.6 Sol28 claims checked

27 hold · 1 qualified · 0 wrong · 96% hold

Decode-critical issues

Found 2 of 4

The audits track 4 issues that stop this radio decoding P25. This review: no 8 kHz rule, and CPU left unmeasured. How the review treated each, from the provenance table:

IssueGPT-5.6 Sol
The I2S stream is most likely microphone audio raisedBlocker 1, source unproven
HR-C6000 de-emphasis on the capture path raised0x34=0x3C, never replaced
AT1846S FM filters, low-frequency bit, 25 kHz raised25 kHz for a 12.5 kHz channel
Manual: I2S frame clock “must be 8KHz” absent
Vocoder needs 11–16× the 72 MHz CPU absentleft as a later measurement