component.esd_rated

the part carries a datasheet ESD rating at or above the credit floor (needs --params)

What it is

component.esd_rated(ref_des) yields one row per component whose joined datasheet spec declares an ESD tolerance at or above the credit floor. It is a datasheet-tier fact: presence of a row means the part’s stub carries a machine-comparable ESD rating high enough to count as protection, absence means it does not (or that no datasheet is joined). It carries no value, only the ref-des, because the question it answers is boolean: does this part have a creditable ESD rating.

For hardware engineers

ESD protection on a connector-facing signal can come from a dedicated clamp or from a part that is itself rated to survive the strike (a transceiver rated to IEC contact levels). This relation marks the parts that carry that rating on their datasheet, so a protection review can credit a signal whose only ESD survivability is the endpoint part’s own spec. The floor is deliberately conservative (2 kV), so a row means a genuinely rated part, not a marginal one.

For software engineers

This is a boolean predicate over the datasheet join (see ANALOGY.md): resolve the component to its part-number stub, read the ESD rating rows, and admit the ref-des only if a comparable row clears the floor. It is keyed by ref-des precisely so a rule joins it against structural relations (component-on-net, component.class, pin.net) to ask “an ESD-rated part sitting on this signal”. Rows are 1:1 with qualifying components; absence is the normal case, not an error.

Go projector

esdRatedFacts in check/facts.go walks Model.Components(), looks up each part’s spec via Model.PartSpec(ref), and emits a row when esdRatingLimits(spec) returns at least one qualifying rating. esdRatingLimits is the same extractor the esd-protection Go rule uses: it keeps only absolute-max ESD rows that are machine-comparable and at or above icEsdFloorVolts (2 kV). The citation on the row is the datasheet ESD row, the real evidence, not the component’s schematic site.

This is a datasheet-tier relation, so it is silent by construction without seeded parameters: PartSpec is nil for every ref when the model was built without a params set, and the relation is empty. Run agni with --params <dir> to seed the datasheet corpus. Empty is skip, never a false pass: no row means “no evidence of a rated part”, not “the part is unprotected”.

Datalog

Every component carrying a creditable datasheet ESD rating:

component.esd_rated(?r) => ?r

The ESD-rated parts that are also TVS clamps (join the datasheet fact to a class family tag):

component.esd_rated(?r), component.class(?r, "tvs") => ?r