Validation log¶
Which objects are certified, and what their certification currently says.
Object Validation is the process page — the order of work, the sabotage rule, the report's five sections, the two gates. This page is its running record: one row per object that has been through it, with a link straight to that object's evidence.
How to read a row¶
Each row is derived from the object's own results.md, which is generated
from the C implementation through its own binding — nothing here is
transcribed by hand.
| column | means |
|---|---|
limits |
how many of the certified envelope's claims hold, out of the total |
findings |
every judgement the review phase recorded, of any verdict |
still open |
of those, the ones with verdict GAP or CONFIRMED, named so you can find them |
A findings count is not a defect count, and a high one is not a bad
sign — BY DESIGN and FIXED are the common verdicts, so an object that was
looked at hard has more of them.
Nor does an open finding mean the object failed. Every object in the
table below holds all of its limits while carrying open findings, and the
two say different things: a limit is a claim a caller may rely on, and a
failing one is a regression; an open finding is a gap in what has been
established, or a defect that is understood and documented but not yet
fixed. Certification means the envelope is measured and holds — not that
nothing is left to do. Only limits is bolded when it is short of its
total, because that is the cell that would mean something is broken.
What the numbers are worth¶
The chain from code to table is gated at every link:
make validateregenerates eachresults.mdby measuring the C;make validate-checkfails if a committed report is stale — so a report cannot drift from the code it describes;- this page's table is generated from those reports by
scripts/gen_validation_log.py, andmake docs-drift-checkfails if it is stale — so the table cannot drift from the reports.
What that chain does not prove is that a limit is the right limit, or that it would fail if the behaviour regressed. Only the sabotage step in Object Validation establishes that, and no amount of regeneration substitutes for it — a report that regenerates faithfully from a vacuous assertion is faithfully vacuous.
Rows are sorted by module, then by object, so the table reads as a map of
the library rather than as a history — arrival order is what the git log
is for. Discovery is a glob of
src/doppler/*/tests/validation/*/results.md, the same one make validate
uses, so a newly certified object is listed the moment its folder exists.
There is no list here to update.
Certified objects¶
34 objects certified — 23 of the 82 objects/*.toml jm fragments, plus 11 with no object manifest at all (ccsds_tm, conv, detection, ema, mpsk, resamp, rs, wfm_compose, wfm_frame, wfm_plan, wfmgen): a function primitive, or a core declared another way. Not every fragment is a DSP object with an envelope worth certifying, so read the denominator as a ceiling rather than a target — and note the two counts are different populations, not a percentage.
| object | module | limits | findings | still open |
|---|---|---|---|---|
| AGC | agc |
18/18 | 6 | 2 — F4, F6 |
| Interleaver | coding |
20/20 | 8 | 2 — F7, F8 |
| detection | detection |
24/24 | 6 | 1 — F5 |
| LockDet | detection |
22/22 | 6 | none |
| acq | dsss |
17/17 | 7 | 3 — F3, F6, F7 |
| BurstAcquisition | dsss |
17/17 | 4 | none |
| BurstCapture | dsss |
22/22 | 6 | 1 — F6 |
| BurstDemod | dsss |
15/15 | 5 | none |
| BurstDespreader | dsss |
15/15 | 5 | none |
| DsssBurstReceiver | dsss |
32/32 | 11 | none |
| PolynomialPhaseEstimator | dsss |
15/15 | 5 | none |
| M-PSK constellation | mpsk |
24/24 | 5 | 1 — F3 |
| resamp | resample |
14/14 | 9 | none |
| LO | source |
26/26 | 9 | none |
| NCO | source |
18/18 | 9 | none |
| Corr2D | spectral |
18/18 | 6 | none |
| CorrDetector2D | spectral |
15/15 | 5 | none |
| CarrierNda | track |
43/43 | 12 | 6 — F4, F5, F6, F7, F8, F9 |
| LoopFilter | track |
26/26 | 10 | none |
| MpskReceiver | track |
63/63 | 8 | 2 — F6, F7 |
| RateSync | track |
36/36 | 17 | 2 — F7, F17 |
| EMA | util |
15/15 | 6 | none |
| Gold | wfm |
17/17 | 4 | 1 — F4 |
| PN | wfm |
16/16 | 4 | none |
| Composer | wfm |
15/15 | 4 | none |
| Frame | wfm |
16/16 | 4 | 1 — F2 |
| Plan | wfm |
17/17 | 4 | 2 — F1, F2 |
| Reader | wfm |
16/16 | 4 | 2 — F2, F3 |
| Synth | wfm |
19/19 | 6 | 2 — F2, F5 |
| Writer | wfm |
16/16 | 5 | 2 — F1, F5 |
| ccsds_tm | — (C only) |
12/12 | 5 | 1 — F2 |
| conv | — (C only) |
7/7 | 3 | none |
| rs | — (C only) |
11/11 | 4 | none |
| wfmgen | — (C only) |
11/11 | 5 | 1 — F4 |
Not yet certified¶
Everything else. The campaign works through objects deliberately rather than in bulk, because the expensive part is not writing the report — it is enumerating a header's prose claims and proving each new C test by sabotage. An object's absence from the table above means no certification has been attempted, not that it is known to be sound.