dataforth(datasheet): Fix 2 — emulate QB single-precision rounding (26 -> 9 dirty)

formatMeasuredExact now applies Math.fround to the parsed value before toFixed.
The DOS QuickBASIC computed/stored these as single-precision floats, so the
last-digit rounding at the .5 boundary follows single, not double, precision.
Without it, double-precision toFixed flipped boundaries (9.9995 -> "9.999" vs
golden "10.000"; 46.85 -> "46.9" vs "46.8"; .45 -> "0.5" vs "0.4"; 3.3325 ->
"3.333" vs "3.332"). Verified each against the staged golden.

STAGE 3 re-validation: FINAL-TEST CLEAN models 68 -> 85 (+17), mismatches
26 -> 9, cert matches 2123 -> 2206. Zero regression — every remaining dirty
model was already dirty pre-fix; no previously-clean model flipped.

The 9 remaining are NOT rounding:
- 4 models (DSCA38-05/-1793/-19C/-19E): Supply Current retest data-vintage — the
  staged .TXT is an older test run than the DB latest-wins record; not a render
  bug, can't reconcile against an older sheet.
- 5 models (DSCA39-01/02/05/07/1950): STAGE 1 template artifact — the footer note
  "Standard output load for test is 250 ohms." was mis-captured as a truncated
  parameter row. A renderer-side fix was attempted but emitted the note for all
  current-output models (regressed 24 clean -C models), so it was reverted; needs
  a targeted STAGE 1 extractor fix instead.

Renamed dsca-clean68-models.json -> dsca-clean-models.json (now 85 models).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 07:21:10 -07:00
parent 4d9ca2b0f7
commit acee9be6d9
4 changed files with 27 additions and 128 deletions

View File

@@ -7,126 +7,38 @@ Corpus: 2806 staged DSCA originals across 126 models.
SUMMARY
models with staged originals: 126
models FINAL-TEST CLEAN (>=1 compared, 0 mismatch): 68
models with FINAL-TEST mismatches: 26
models FINAL-TEST CLEAN (>=1 compared, 0 mismatch): 85
models with FINAL-TEST mismatches: 9
certs compared: 2316
Final-Test match: 2123
Final-Test mismatch: 193
Final-Test match: 2206
Final-Test mismatch: 110
(certs with accuracy-section diffs: 1337 — informational)
staged serials not in DB: 40
in DB but not rendered (skipped/null): 450
MODELS WITH FINAL-TEST CONTENT MISMATCHES (investigate before re-push):
DSCA30-02 compared=54 ftMatch=53 ftMismatch=1
[finaltest L7] SN 177588-4
render: "Frequency Response 46.9 dB 44+/- 7 dB PASS"
golden: "Frequency Response 46.8 dB 44+/- 7 dB PASS"
DSCA31-12C compared=4 ftMatch=3 ftMismatch=1
[finaltest L9] SN 179182-4
render: "Output Noise 0.5 uArms <= 3 uArms PASS"
golden: "Output Noise 0.4 uArms <= 3 uArms PASS"
DSCA31-1918 compared=8 ftMatch=7 ftMismatch=1
[finaltest L9] SN 180333-1
render: "Output Noise 0.5 uArms <= 3 uArms PASS"
golden: "Output Noise 0.4 uArms <= 3 uArms PASS"
DSCA34-05C compared=55 ftMatch=54 ftMismatch=1
[finaltest L10] SN 180006-6
render: "Output Noise 0.5 uArms <= 3 uArms PASS"
golden: "Output Noise 0.4 uArms <= 3 uArms PASS"
DSCA38-02 compared=105 ftMatch=93 ftMismatch=12
[finaltest L5] SN 180163-2
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 180163-5
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 178886-15
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-05 compared=129 ftMatch=83 ftMismatch=46
[finaltest L5] SN 180224-13
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-05 compared=129 ftMatch=97 ftMismatch=32
[finaltest L3] SN 180257-1
render: "Supply Current 19.8 mA < 30 mA PASS"
golden: "Supply Current 20.0 mA < 30 mA PASS"
[finaltest L3] SN 180257-10
render: "Supply Current 19.6 mA < 30 mA PASS"
golden: "Supply Current 20.3 mA < 30 mA PASS"
DSCA38-07 compared=3 ftMatch=2 ftMismatch=1
[finaltest L5] SN 180238-1
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-08C compared=56 ftMatch=50 ftMismatch=6
[finaltest L13] SN 177088-1
render: "Output Noise 1.4 uArms <= 6 uArms PASS"
golden: "Output Noise 1.5 uArms <= 6 uArms PASS"
[finaltest L5] SN 177088-6
render: "Excitation Voltage 3.333 V 3.33+/-.001 V PASS"
golden: "Excitation Voltage 3.332 V 3.33+/-.001 V PASS"
[finaltest L13] SN 177088-9
render: "Output Noise 1.6 uArms <= 6 uArms PASS"
golden: "Output Noise 1.5 uArms <= 6 uArms PASS"
DSCA38-09 compared=4 ftMatch=3 ftMismatch=1
[finaltest L5] SN 179236-4
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-12C compared=8 ftMatch=5 ftMismatch=3
[finaltest L5] SN 178024-4
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 178024-6
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 178024-8
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-12E compared=8 ftMatch=7 ftMismatch=1
[finaltest L5] SN 176970-1
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-1468 compared=11 ftMatch=10 ftMismatch=1
[finaltest L5] SN 178595-2
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-16C compared=43 ftMatch=37 ftMismatch=6
[finaltest L5] SN 178655-14
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 178655-5
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 179039-3
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L3] SN 180257-11
render: "Supply Current 20.1 mA < 30 mA PASS"
golden: "Supply Current 19.8 mA < 30 mA PASS"
DSCA38-1793 compared=33 ftMatch=32 ftMismatch=1
[finaltest L3] SN 176923-11
render: "Supply Current 22.3 mA < 25 mA PASS"
golden: "Supply Current 23.1 mA < 25 mA PASS"
DSCA38-19 compared=8 ftMatch=7 ftMismatch=1
[finaltest L5] SN 177084-3
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-19C compared=248 ftMatch=223 ftMismatch=25
[finaltest L5] SN 1055-20
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 177302-15
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 178001-1
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-19E compared=28 ftMatch=23 ftMismatch=5
[finaltest L5] SN 179698-15
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 179698-16
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 179698-18
render: "Excitation Voltage 10.001 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA38-19C compared=248 ftMatch=247 ftMismatch=1
[finaltest L4] SN 180036-8
render: "Supply Curr. w/ EXC Load 54.5 mA < 100 mA PASS"
golden: "Supply Curr. w/ EXC Load 55.0 mA < 100 mA PASS"
DSCA38-19E compared=28 ftMatch=27 ftMismatch=1
[finaltest L3] SN 179698-16
render: "Supply Current 42.7 mA < 60 mA PASS"
golden: "Supply Current 45.7 mA < 60 mA PASS"
DSCA39-01 compared=4 ftMatch=0 ftMismatch=4
[finaltest L12] SN 177576-1
render: "Standard output load for te PASS"
@@ -177,28 +89,9 @@ MODELS WITH FINAL-TEST CONTENT MISMATCHES (investigate before re-push):
[finaltest L12] SN 178236-14
render: "Standard output load for te PASS"
golden: "Standard output load for test is 250 ohms."
DSCA43-10 compared=16 ftMatch=15 ftMismatch=1
[finaltest L5] SN 177827-12
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA43-20E compared=4 ftMatch=2 ftMismatch=2
[finaltest L5] SN 177947-2
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
[finaltest L5] SN 177947-3
render: "Excitation Voltage 9.999 V 10+/-.003 V PASS"
golden: "Excitation Voltage 10.000 V 10+/-.003 V PASS"
DSCA47N-15 compared=48 ftMatch=47 ftMismatch=1
[finaltest L7] SN 177823-20
render: "Open Thermocouple Resp. 12.88 V > 10.7 V PASS"
golden: "Open Thermocouple Resp. 12.89 V > 10.7 V PASS"
DSCA47T-06 compared=76 ftMatch=75 ftMismatch=1
[finaltest L7] SN 177044-5
render: "Open Thermocouple Resp. 12.96 V > 11 V PASS"
golden: "Open Thermocouple Resp. 12.97 V > 11 V PASS"
FINAL-TEST CLEAN MODELS (68):
DSCA30-01, DSCA30-03, DSCA30-06, DSCA30-07, DSCA30-08, DSCA30-08C, DSCA30-09, DSCA30-09C, DSCA30-1944, DSCA30-1945, DSCA30-1946, DSCA31-02, DSCA31-03, DSCA31-06, DSCA31-07, DSCA31-11, DSCA31-12, DSCA31-1273, DSCA31-13, DSCA31-13C, DSCA31-15, DSCA32-01, DSCA32-01C, DSCA32-01E, DSCA34-01, DSCA34-02C, DSCA34-04, DSCA34-04C, DSCA34-05, DSCA34-1858, DSCA36-01, DSCA36-02, DSCA36-03, DSCA36-04, DSCA36-04C, DSCA36-1949, DSCA38-03, DSCA38-09E, DSCA38-1544, DSCA38-15C, DSCA38-16, DSCA38-18C, DSCA40-03, DSCA40-05, DSCA40-05C, DSCA40-06, DSCA40-1951, DSCA40-1952, DSCA41-01, DSCA41-02, DSCA41-03, DSCA41-05C, DSCA41-06, DSCA41-09, DSCA41-13, DSCA41-14, DSCA41-15, DSCA41-15E, DSCA42-01, DSCA42-01C, DSCA42-02, DSCA47E-08C, DSCA47J-01C, DSCA47J-03, DSCA47K-05, DSCA47K-13, DSCA47K-14, DSCA47T-1928
FINAL-TEST CLEAN MODELS (85):
DSCA30-01, DSCA30-02, DSCA30-03, DSCA30-06, DSCA30-07, DSCA30-08, DSCA30-08C, DSCA30-09, DSCA30-09C, DSCA30-1944, DSCA30-1945, DSCA30-1946, DSCA31-02, DSCA31-03, DSCA31-06, DSCA31-07, DSCA31-11, DSCA31-12, DSCA31-1273, DSCA31-12C, DSCA31-13, DSCA31-13C, DSCA31-15, DSCA31-1918, DSCA32-01, DSCA32-01C, DSCA32-01E, DSCA34-01, DSCA34-02C, DSCA34-04, DSCA34-04C, DSCA34-05, DSCA34-05C, DSCA34-1858, DSCA36-01, DSCA36-02, DSCA36-03, DSCA36-04, DSCA36-04C, DSCA36-1949, DSCA38-02, DSCA38-03, DSCA38-07, DSCA38-08C, DSCA38-09, DSCA38-09E, DSCA38-12C, DSCA38-12E, DSCA38-1468, DSCA38-1544, DSCA38-15C, DSCA38-16, DSCA38-16C, DSCA38-18C, DSCA38-19, DSCA40-03, DSCA40-05, DSCA40-05C, DSCA40-06, DSCA40-1951, DSCA40-1952, DSCA41-01, DSCA41-02, DSCA41-03, DSCA41-05C, DSCA41-06, DSCA41-09, DSCA41-13, DSCA41-14, DSCA41-15, DSCA41-15E, DSCA42-01, DSCA42-01C, DSCA42-02, DSCA43-10, DSCA43-20E, DSCA47E-08C, DSCA47J-01C, DSCA47J-03, DSCA47K-05, DSCA47K-13, DSCA47K-14, DSCA47N-15, DSCA47T-06, DSCA47T-1928
MODELS WITH NO COMPARABLE CERT (no staged serial in DB, or all skipped/null):
DSCA31-1947(null), DSCA33-01(null), DSCA33-01A(null), DSCA33-02(null), DSCA33-02C(null), DSCA33-03(null), DSCA33-03A(null), DSCA33-03C(null), DSCA33-04(null), DSCA33-04C(null), DSCA33-05(null), DSCA33-05C(null), DSCA33-07C(null), DSCA33-1917(null), DSCA33-1919(null), DSCA33-1948(null), DSCA45-01(null), DSCA45-01C(null), DSCA45-02(null), DSCA45-03(null), DSCA45-03C(null), DSCA45-04(null), DSCA45-04C(null), DSCA45-05C(null), DSCA45-06(null), DSCA45-07(null), DSCA45-08(null), DSCA47N-15C(null), DSCA49-04(null), DSCA49-05(null), DSCA49-1601(null), DSCA49-1895(null)

View File

@@ -327,8 +327,14 @@ function formatMeasuredExact(statusStr) {
// char at index 4 is either a space (positive) or '-' (negative); start there
// so negative signs survive (e.g. "PASS-4.2424060" -> "-4", not "4").
const valueStr = statusStr.substring(4, statusStr.length - 1).trim();
const value = parseFloat(valueStr);
if (isNaN(value)) return { passFail, valStr: valueStr, value: NaN };
const parsed = parseFloat(valueStr);
if (isNaN(parsed)) return { passFail, valStr: valueStr, value: NaN };
// The DOS QuickBASIC stored/computed these as single-precision floats, so the
// value at the half-rounding boundary rounds the way single precision rounds,
// not double. Recover the single (Math.fround) before formatting — without it,
// double-precision toFixed flips last-digit boundaries (e.g. 9.9995 -> "9.999"
// here but "10.000" in the original; 46.85 -> "46.9" vs "46.8").
const value = Math.fround(parsed);
const d = parseInt(decimalDigit, 10);
const valStr = isNaN(d) ? value.toFixed(1) : value.toFixed(d);
return { passFail, valStr, value };

View File

@@ -0,0 +1 @@
["DSCA30-01","DSCA30-02","DSCA30-03","DSCA30-06","DSCA30-07","DSCA30-08","DSCA30-08C","DSCA30-09","DSCA30-09C","DSCA30-1944","DSCA30-1945","DSCA30-1946","DSCA31-02","DSCA31-03","DSCA31-06","DSCA31-07","DSCA31-11","DSCA31-12","DSCA31-1273","DSCA31-12C","DSCA31-13","DSCA31-13C","DSCA31-15","DSCA31-1918","DSCA32-01","DSCA32-01C","DSCA32-01E","DSCA34-01","DSCA34-02C","DSCA34-04","DSCA34-04C","DSCA34-05","DSCA34-05C","DSCA34-1858","DSCA36-01","DSCA36-02","DSCA36-03","DSCA36-04","DSCA36-04C","DSCA36-1949","DSCA38-02","DSCA38-03","DSCA38-07","DSCA38-08C","DSCA38-09","DSCA38-09E","DSCA38-12C","DSCA38-12E","DSCA38-1468","DSCA38-1544","DSCA38-15C","DSCA38-16","DSCA38-16C","DSCA38-18C","DSCA38-19","DSCA40-03","DSCA40-05","DSCA40-05C","DSCA40-06","DSCA40-1951","DSCA40-1952","DSCA41-01","DSCA41-02","DSCA41-03","DSCA41-05C","DSCA41-06","DSCA41-09","DSCA41-13","DSCA41-14","DSCA41-15","DSCA41-15E","DSCA42-01","DSCA42-01C","DSCA42-02","DSCA43-10","DSCA43-20E","DSCA47E-08C","DSCA47J-01C","DSCA47J-03","DSCA47K-05","DSCA47K-13","DSCA47K-14","DSCA47N-15","DSCA47T-06","DSCA47T-1928"]

View File

@@ -1 +0,0 @@
["DSCA30-01","DSCA30-03","DSCA30-06","DSCA30-07","DSCA30-08","DSCA30-08C","DSCA30-09","DSCA30-09C","DSCA30-1944","DSCA30-1945","DSCA30-1946","DSCA31-02","DSCA31-03","DSCA31-06","DSCA31-07","DSCA31-11","DSCA31-12","DSCA31-1273","DSCA31-13","DSCA31-13C","DSCA31-15","DSCA32-01","DSCA32-01C","DSCA32-01E","DSCA34-01","DSCA34-02C","DSCA34-04","DSCA34-04C","DSCA34-05","DSCA34-1858","DSCA36-01","DSCA36-02","DSCA36-03","DSCA36-04","DSCA36-04C","DSCA36-1949","DSCA38-03","DSCA38-09E","DSCA38-1544","DSCA38-15C","DSCA38-16","DSCA38-18C","DSCA40-03","DSCA40-05","DSCA40-05C","DSCA40-06","DSCA40-1951","DSCA40-1952","DSCA41-01","DSCA41-02","DSCA41-03","DSCA41-05C","DSCA41-06","DSCA41-09","DSCA41-13","DSCA41-14","DSCA41-15","DSCA41-15E","DSCA42-01","DSCA42-01C","DSCA42-02","DSCA47E-08C","DSCA47J-01C","DSCA47J-03","DSCA47K-05","DSCA47K-13","DSCA47K-14","DSCA47T-1928"]