Files
breakpilot-compliance/ai-compliance-sdk/internal/iace/minimum_distances_test.go
T
Benjamin Admin 6846ca6b28 feat(iace): wire OSHA minimum-distance library into measures + endpoint
The May-built OSHA distance library (minimum_distances.go, 29 CFR 1910,
US public domain) was dead code — zero callers, no route, no test, while
the mm values that actually appear in measures are independent hand-prose
(some carrying ISO 13854/13857 values, not OSHA).

This surfaces it without touching the measures response contract:
- GET /iace/minimum-distances (+ ?measure_id=) returns the distances, the
  curated measure→distance link table and the licensing note.
- AllMeasureDistanceLinks/MinimumDistancesForMeasure resolve only the
  defensible links (M600 value_source; M254/M065 public-domain crossref to
  ISO), with the relation made explicit so the join stays honest.
- architecture.go lists the OSHA library so it shows in the audit explainer.
- Tests: inch→mm conversion + license completeness, link integrity, and a
  consistency test pinning that a value_source measure's prose still
  matches the OSHA source (codifies the audit finding as a regression gate).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 11:17:56 +02:00

136 lines
4.2 KiB
Go

package iace
import (
"math"
"strconv"
"strings"
"testing"
)
// These tests codify the May-built-but-never-verified OSHA minimum-distance
// library: that its public-domain values convert correctly, that the
// measure→distance links point at real measures and real distances, and that
// a "value_source" link's OSHA figure actually appears in the measure prose
// (the consistency the audit asked for).
const inchToMM = 25.4
func TestOSHAMinimumDistances_ConversionAndLicense(t *testing.T) {
dists := GetOSHAMinimumDistances()
if len(dists) == 0 {
t.Fatal("OSHA minimum-distance library is empty")
}
seen := map[string]bool{}
for _, d := range dists {
if seen[d.ID] {
t.Errorf("duplicate distance ID %q", d.ID)
}
seen[d.ID] = true
if d.License == "" || d.SourceCFR == "" || d.Context == "" {
t.Errorf("%s: missing license/source/context: %+v", d.ID, d)
}
// Inch → mm conversions must be mathematically exact (within rounding).
if d.OriginalUnit == UnitInch {
checkConv := func(label string, orig, exact float64) {
if orig == 0 && exact == 0 {
return
}
if math.Abs(orig*inchToMM-exact) > 0.05 {
t.Errorf("%s: %s conversion off: %.3f in → %.3f mm (expected %.3f)",
d.ID, label, orig, exact, orig*inchToMM)
}
}
checkConv("value", d.OriginalValue, d.ExactMM)
checkConv("min", d.OriginalMin, d.ExactMinMM)
checkConv("max", d.OriginalMax, d.ExactMaxMM)
}
// Safe-side rounding must stay near the exact value (≤5 mm grid).
if d.ExactMM > 0 && d.RecommendedMM > 0 {
if math.Abs(float64(d.RecommendedMM)-d.ExactMM) > 5 {
t.Errorf("%s: recommended %d mm too far from exact %.2f mm",
d.ID, d.RecommendedMM, d.ExactMM)
}
}
}
}
func TestMeasureDistanceLinks_Integrity(t *testing.T) {
measures := map[string]ProtectiveMeasureEntry{}
for _, m := range GetProtectiveMeasureLibrary() {
measures[m.ID] = m
}
links := AllMeasureDistanceLinks()
if len(links) == 0 {
t.Fatal("no measure→distance links declared")
}
for _, l := range links {
if _, ok := measures[l.MeasureID]; !ok {
t.Errorf("link references unknown measure %q", l.MeasureID)
}
if l.Relation != LinkValueSource && l.Relation != LinkCrossRef {
t.Errorf("link %q has invalid relation %q", l.MeasureID, l.Relation)
}
if len(l.DistanceIDs) == 0 {
t.Errorf("link %q has no distance IDs", l.MeasureID)
}
for _, id := range l.DistanceIDs {
if _, ok := GetMinimumDistanceByID(id); !ok {
t.Errorf("link %q references unknown distance %q", l.MeasureID, id)
}
}
// The resolver must return exactly the linked distances.
if got := len(MinimumDistancesForMeasure(l.MeasureID)); got != len(l.DistanceIDs) {
t.Errorf("resolver for %q returned %d, expected %d", l.MeasureID, got, len(l.DistanceIDs))
}
}
}
func TestMeasureDistanceLinks_ValueSourceProseConsistency(t *testing.T) {
measures := map[string]ProtectiveMeasureEntry{}
for _, m := range GetProtectiveMeasureLibrary() {
measures[m.ID] = m
}
for _, l := range AllMeasureDistanceLinks() {
if l.Relation != LinkValueSource {
continue // cross-refs legitimately use an EU value in prose
}
m := measures[l.MeasureID]
text := strings.ToLower(m.Name + " " + m.Description + " " + strings.Join(m.Examples, " "))
text = strings.ReplaceAll(text, ".", "") // "1.600" → "1600"
for _, id := range l.DistanceIDs {
md, _ := GetMinimumDistanceByID(id)
if !proseMentionsDistance(text, md) {
t.Errorf("value_source measure %q does not mention any value of linked distance %q "+
"— prose has drifted from the OSHA source", l.MeasureID, id)
}
}
}
}
// proseMentionsDistance reports whether the (dot-stripped, lowercased) measure
// text contains a numeric form of the distance's value, formula or recommended mm.
func proseMentionsDistance(text string, md MinimumDistance) bool {
candidates := []int{}
if md.FormulaMMPerSecond > 0 {
candidates = append(candidates, int(math.Round(md.FormulaMMPerSecond)))
}
if md.RecommendedMM > 0 {
candidates = append(candidates, md.RecommendedMM)
}
if md.RecommendedMinMM > 0 {
candidates = append(candidates, md.RecommendedMinMM)
}
for _, n := range candidates {
if strings.Contains(text, strconv.Itoa(n)) {
return true
}
}
return false
}