SP-perio PG-C Task 1: the Cairo 2011 recession-TYPE classification,
DERIVED purely from the already-charted per-site CAL (getToothCal)
plus the buccal gingival margin (perio.gm.get("B")) — never stored, no
new state/payload/FHIR axis (parity byte-identical). Pure + read-only:
this is the single source of truth for a tooth's RT, mirroring how
getToothCal is the single source of truth for CAL.
Cairo classifies BUCCAL recession by comparing it to the WORSE (deeper) of
the two adjacent interproximal (mesio-/disto-buccal) attachment losses:
"none": no buccal recession — gm.B is <= 0 (the margin is at/
coronal to the CEJ, i.e. a pseudopocket, not recession) OR the buccal
site simply isn't charted (gm.B undefined). Absence is treated the
same as "no recession", not "unknown", since RT is a display-only
derivation with no "uncharted" state of its own to represent.
"rt1": buccal recession present, but the interproximal CAL
(max(CAL[MB], CAL[DB])) is below CAIRO_RT1_INTERPROX_THRESHOLD_MM
— essentially no interproximal attachment/papilla loss. An uncharted
MB/DB site contributes 0 to that max (the most conservative/least
severe reading), so "buccal recession + nothing charted
interproximally" also reads as RT1.
"rt2": interproximal CAL loss is <= the buccal CAL loss — the
papilla still reaches (or nearly reaches) the contact point.
"rt3": interproximal CAL loss EXCEEDS the buccal CAL loss — severe
papilla loss, apical to the buccal margin.
SP-perio PG-C Task 1: the Cairo 2011 recession-TYPE classification, DERIVED purely from the already-charted per-site CAL (getToothCal) plus the buccal gingival margin (
perio.gm.get("B")) — never stored, no new state/payload/FHIR axis (parity byte-identical). Pure + read-only: this is the single source of truth for a tooth's RT, mirroring how getToothCal is the single source of truth for CAL.Cairo classifies BUCCAL recession by comparing it to the WORSE (deeper) of the two adjacent interproximal (mesio-/disto-buccal) attachment losses:
"none": no buccal recession —gm.Bis <= 0 (the margin is at/ coronal to the CEJ, i.e. a pseudopocket, not recession) OR the buccal site simply isn't charted (gm.Bundefined). Absence is treated the same as "no recession", not "unknown", since RT is a display-only derivation with no "uncharted" state of its own to represent."rt1": buccal recession present, but the interproximal CAL (max(CAL[MB], CAL[DB])) is below CAIRO_RT1_INTERPROX_THRESHOLD_MM — essentially no interproximal attachment/papilla loss. An uncharted MB/DB site contributes0to that max (the most conservative/least severe reading), so "buccal recession + nothing charted interproximally" also reads as RT1."rt2": interproximal CAL loss is <= the buccal CAL loss — the papilla still reaches (or nearly reaches) the contact point."rt3": interproximal CAL loss EXCEEDS the buccal CAL loss — severe papilla loss, apical to the buccal margin.