From d53acf53f41124c0288543045874b101e4bd2704 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 17 Jul 2026 20:56:42 +0000 Subject: [PATCH] fix(data-quality): recover speed_gbps for 339 transceivers via part-number token Re-run of sql/125 Remediation C against the current v_transceiver_speed_errors gap (596 as of 2026-07-17, mostly Cisco Systems 230 + Juniper Networks 220). Same high-confidence-only logic: part-number speed token, capped at the form factor physical max, no blind updates. 339/596 recovered mechanically, 257 genuinely need datasheet work (GE/FE/OC-rate parts with no G-token). Verified the new switch-side (141) and transceiver-side (138) drift guards handled the 339 speed changes correctly: v_compat_speed_errors stayed at 0 throughout. --- sql/142-speed-recovery-rerun.sql | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 sql/142-speed-recovery-rerun.sql diff --git a/sql/142-speed-recovery-rerun.sql b/sql/142-speed-recovery-rerun.sql new file mode 100644 index 0000000..f96c347 --- /dev/null +++ b/sql/142-speed-recovery-rerun.sql @@ -0,0 +1,44 @@ +-- sql/142-speed-recovery-rerun.sql +-- Re-run of sql/125's Remediation C (part-number speed token recovery) against +-- the current genuine-optics speed gap (v_transceiver_speed_errors, 596 rows as +-- of 2026-07-17). Same exact logic, same high-confidence-only design: derives +-- speed_gbps from the manufacturer's standardized speed token in the part +-- number, applied ONLY when it is <= the form factor's physical maximum. Parts +-- whose token exceeds the form-factor cap or that have no speed token are left +-- for datasheet work (596 -> ~248 after this, per the 2026-07-17 gap analysis: +-- 348/596 had a regex-recoverable G-token, mostly Cisco Systems + Juniper). +-- Idempotent, safe to re-run (no-ops on rows that already have a plausible +-- speed). + +with cand as ( + select id, + case + when part_number ~* '([0-9]+)X([0-9]+)G' + then (regexp_match(part_number,'([0-9]+)X([0-9]+)G','i'))[1]::numeric + * (regexp_match(part_number,'([0-9]+)X([0-9]+)G','i'))[2]::numeric + when part_number ~* '([0-9]+)SFP([0-9]+)G' + then (regexp_match(part_number,'([0-9]+)SFP([0-9]+)G','i'))[1]::numeric + * (regexp_match(part_number,'([0-9]+)SFP([0-9]+)G','i'))[2]::numeric + when part_number ~* '([0-9]+)G' + then (regexp_match(part_number,'([0-9]+)G','i'))[1]::numeric + end as derived, + case upper(coalesce(form_factor,'')) + when 'SFP' then 1 when 'SFP+' then 16 when 'SFP28' then 32 when 'SFP56' then 56 + when 'XFP' then 10 when 'QSFP+' then 40 when 'QSFP28' then 100 when 'QSFP56' then 200 + when 'QSFP-DD' then 800 when 'QSFP-DD800' then 800 + when 'OSFP' then 1600 when 'OSFP224' then 1600 + when 'CFP' then 100 when 'CFP2' then 400 when 'CFP4' then 100 when 'CPAK' then 100 + else 99999 end as ff_cap + from transceivers + where id in (select id from v_transceiver_speed_errors)) +update transceivers t + set speed_gbps = c.derived, + updated_at = now() + from cand c + where t.id = c.id + and c.derived is not null and c.derived > 0 + and c.derived <= c.ff_cap; + +insert into _migrations (filename, applied_at) +select '142-speed-recovery-rerun.sql', now() +where not exists (select 1 from _migrations where filename = '142-speed-recovery-rerun.sql');