Foundational Environmental Performance (FEP)
Contents
This document explains how Foundational Environmental Performance (FEP) is represented in the Higg Assessment Model — what it measures, how the achievement aggregates are calculated, and what to read into the four FEP fields exposed on the Assessment record.
FEP is a tag overlay on a subset of the Higg FEM Level 1 questions. The questions themselves are existing FEM content; FEP marks the ones that represent the industry-aligned baseline of environmental management practices. Cascale published the definition through the AIDFEP (Aligned Industry Definition of FEP) consultation process in 2024–2025; the result is a curated set of ~60 to ~100 reference question IDs per cadence, each scored against a small allow-list of answer values. The full stakeholder rationale is in stl-local-release/reference/fep.md; this guide covers what’s actually in the bundle.
Purpose of the Calculation
FEP rolls up the assessment’s responses against the curated foundational question set into four summary fields, giving consumers a single view of how a facility scores on the baseline expectations without re-deriving the achievement criteria question-by-question.
The achievement criteria are deliberately narrow:
Most foundational questions are pass/fail on
"yes". The facility either confirms the practice is in place or it doesn’t.Some questions accept partial credit on
"partialYes". Where a foundational practice can meaningfully exist in a partial form (e.g. wastewater tracking implemented for some streams but not all),"partialYes"is treated as a passing answer alongside"yes".A few questions accept “not applicable”. Where a foundational practice can plausibly not apply to a given facility (e.g. chemical management at a facility with no chemicals on site),
"na"is treated as a passing answer — the facility hasn’t failed; the question just doesn’t apply to it.
The aggregate fields treat applicability and achievement as distinct: a question that resolves to undefined (the facility’s answer or conditional logic indicates the question doesn’t apply at all) is excluded from both the numerator and denominator of the achievement ratio. This means a facility that’s never asked a particular foundational question doesn’t get penalized for not answering it.
Record Types
The FEP aggregates live on a single record type:
Assessment: Whole-facility FEP roll-up. Four fields per assessment, described below.
The underlying per-question Fep records are also present in the bundle — they appear as compiled blocks under each cadence’s RFI PID in model.json.gz. Each carries:
__name__:fep_<refid>(e.g.fep_chemstorage).__type__:Fep.ref_id: the FEM question’s ref ID (e.g.chemstorage).logic: a JS expression that evaluates totrue,false, orundefinedonce the facility’s answers are supplied.
Consumers that want per-question detail rather than the aggregates read the Fep blocks directly. The aggregates on Assessment are the convenience layer.
The Four Aggregate Fields
All four are number? or bool? and follow a single gating contract: if no Fep in the assessment evaluates to logic === true (either because no Feps are defined for the cadence, none are applicable, or all applicable ones failed), every field is undefined. The achievement story is treated as not meaningful in that state rather than projecting a misleading “0 out of N” mix into the data.
fep_achieved(bool?):truewhen every applicable Fep haslogic !== false(so achieved or N/A);falseif at least one applicable Fep failed;undefinedper the gate above.Read this as “did the facility meet the foundational baseline?” when you want a single yes/no answer.
fep_achievement(number?): The ratio of achieved Feps to applicable Feps. Always in[0, 1].1.0means every applicable Fep passed; a fractional value means some applicable Feps failed.Read this when ranking or benchmarking — the ratio is the most useful field for comparing facilities to each other or to themselves over time.
fep_achieved_count(number?): Count of Feps whose logic evaluated totrue(achieved). Use alongsidefep_unachieved_countto display “X of Y” on a UI.fep_unachieved_count(number?): Count of Feps whose logic evaluated tofalse(applicable, not achieved). Use alongsidefep_achieved_count. The two counts plus the count ofundefined-logic Feps sum to the total Fep set defined for the cadence.
Methodology
Per-question Logic
Each foundational question’s logic is a JS expression that maps the facility’s answer to the question into one of three states:
true— achieved. The answer was on the allow-list for this question.false— not achieved. The answer was outside the allow-list but the question was answered.undefined— not applicable to this facility (the question was never resolved, or the facility’s conditional path skipped it).
The allow-list pattern depends on the question’s option list:
- Yes/No questions: allow-list is
["yes"]. - Yes/PartialYes/No questions: allow-list is
["yes", "partialYes"]— both pass. - Yes/No/N-A questions: allow-list is
["yes", "na"]— “doesn’t apply” is a pass, since you can’t fail an expectation that doesn’t apply to you.
The undefined-guard wrapper (<ref> !== undefined ? <check> : undefined) is what keeps a hidden conditional question from counting against the facility. This is the canonical Fep pattern; every Fep block follows the same shape.
Aggregation
The four aggregate fields are computed by walking the cadence’s Fep set in compile context and producing JS expressions that:
fep_achieved: ANDslogic !== falseacross every Fep.fep_achievement: dividescount(logic === true)bycount(logic !== undefined).fep_achieved_count: sumslogic === true ? 1 : 0across Feps.fep_unachieved_count: sumslogic === false ? 1 : 0.
Each is gated on OR logic === true across every Fep — if no Fep passed, all four aggregates evaluate to undefined.
Caveats
No additional scoring penalty. A failed Fep does not subtract from the FEM score on its own. The underlying FEM questions are Level 1 content with the usual scoring weight, so a “no” answer on a foundational question already reduces the FEM score through that path. The FEP aggregates are a reporting overlay, not a separate scoring mechanism.
Cadence-specific question set. The set of questions tagged as Foundational evolves cadence to cadence. A direct year-over-year comparison of
fep_achievementis meaningful only if the question set is unchanged; otherwise the ratio’s denominator has shifted underneath you. The cadence-specific guidance below notes when the set changes.Single-question dependencies. Each Fep’s logic operates on one question. There are no compound Feps in the current cadence set. If a foundational expectation involves multiple FEM questions, each gets its own Fep record and the relationship is captured implicitly by both Feps appearing in the aggregate.
No country-specific Feps except
sipiperecords. The foundational set is global, with one documented exception: the China-only IPE-database question. Don’t expect to find FEPs keyed to region in the bundle today.
Cadence Coverage
FEP is available for FEM 2023 onwards. Earlier cadences (fem2017–fem2022) have no Fep records and the aggregate fields on Assessment evaluate to undefined for those cadences.
| Cadence | FEP available | Notes |
|---|---|---|
| fem2017 – fem2022 | No | No extras/fep.stl; aggregate fields undefined. |
| fem2023 | Yes | Initial Fep set (~67 records). |
| fem2024 – fem2025 | Yes | Expanded set (~98–99 records). |
| fem2026 – fem2027 | Yes | Same shape as 2024–2025 plus the fep_standalone variant — see below. |
FEP Standalone Variant (fem2026 and later)
Starting in fem2026, FEM cadences expose a fep_standalone variant alongside the regular fem variant. The standalone variant serializes only the FEP-tagged questions, so a consumer that wants to render only the foundational baseline can do so without pulling the full FEM module.
For HAM consumers this is transparent — the same Fep blocks appear in the compiled output regardless of which variant generated the assessment. The standalone variant is a platform-side question-set filter, not a separate logic path.
If a facility completes only the FEP standalone assessment, the aggregate fields on its Assessment reflect that subset directly. There is no “is this a standalone assessment?” flag on the record; infer it from the cadence’s variant tagging if you need to.
Cadence Specific Guidance
FEM 2023
The initial FEP set was scoped to ~67 questions. Worker-engagement, chemical management, and wastewater controls dominate the set. fep_standalone is not available for this cadence.
FEM 2024 and FEM 2025
The set expanded to ~98–99 questions, broadening into energy and emissions topics. A small number of fem2023 Feps were retired where the underlying FEM question changed shape. fep_standalone is not available for these cadences.
FEM 2026 and FEM 2027
Same Fep set shape as fem2024–fem2025, with continued additions and adjustments where the underlying FEM content shifts. The fep_standalone variant is introduced — see above. As before, the aggregate fields on Assessment reflect whichever subset is present in the evaluated assessment.
b2a3151b6+
Source: stl-local-release/guidance/guidance-fep.md
