Methodology

How FabricIQ scores fabric quality, health impact, and sustainability — the full whitepaper.

Methodology

How every score, grade, and narrative output in FabricIQ is computed. This is the technical companion to the research bibliography — it tells you what each number means, how it's calculated, and what its limitations are.

Everything in this document is deterministic and pure. No AI generation, no per-product manual curation, no opaque algorithms — same input produces the same output, every time.


1. Three composite scores

FabricIQ surfaces three top-line scores per product or blend. They answer different questions and are computed independently.

Score What it answers
Quality Will this fabric last and feel good?
Health Impact How much does wearing or laundering it harm me/my household?
Sustainability / Eco How much does making it harm the planet?

Two narrative outputs are derived from those three scores:

Narrative Audience
Tradeoff Consumer ("should I buy / keep / donate?")
Risk Briefing Brand owner ("where am I exposed?")

2. Letter-grade thresholds (universal)

Used by Quality, Health Impact, Sustainability, and the brand-level averages.

Grade Score range Meaning
A 85–100 Exceptional. Rare in practice (1–3% of catalog).
B 70–84 Above average. ~15% of catalog.
C 55–69 Average / typical. ~50–60% of catalog.
D 40–54 Below average. ~20% of catalog.
F 0–39 Poor. ~1–3% of catalog.

3. Quality score — the 6 quality axes (+ a separate eco axis)

Every material in our DB has scores 0–100 across seven axes. Six of them describe quality ("is this well-made?"); the seventh, sustainability, is a separate eco dimension surfaced as its own Eco score, not as part of the Quality breakdown (v0.43.0):

Quality axes (the Quality breakdown):

  1. durability — abrasion resistance, pilling, expected wear life
  2. comfort — softness, drape, hand-feel
  3. breathability — airflow, ability to dissipate body heat
  4. warmth — insulation per gram
  5. moistureWicking — capacity to move moisture from skin to outer layer
  6. careEase — laundering robustness (100 = very easy)

Separate eco axis (shown as the Eco score, not a quality axis):

  • sustainability — material-level eco impact (water, energy, biodegradability, regenerability)

The overall (Quality) score is the percentage-weighted average of each material's curated per-material overall score — a holistic quality value set per material, not a flat mean of its axes (e.g. a material whose axes average ~50 may carry a curated overall of 65). Sustainability is presented separately as the Eco score so a durable, comfortable synthetic can read as decent Quality and poor Eco simultaneously, rather than the two cancelling into a muddy middle. (A pure 6-axis formula was evaluated and rejected: the catalog is dominated by a few quality-equivalent blends, so any deterministic formula collapses the distribution to ~90% C — see STRATEGIC-REVIEW.md.)

Blend scoring

For multi-fiber blends, each axis is computed as the weighted average of the constituent material scores by percentage:

axisScore = Σ (materialScore_i × percentage_i / 100)

Same for the overall score.

Stretch tolerance (≤5% spandex/elastane)

Small stretch additives (≤5% spandex or elastane) are added for fit, not as a primary fiber. We redistribute that percentage to the dominant material before scoring, so a "98% Cotton, 2% Spandex" t-shirt scores identically to "100% Cotton" — preventing a small fit additive from unfairly penalizing the score.

Multi-section composition handling

Many product descriptions contain multiple compositions on one tag:

Body: 80% Cotton, 20% Polyester
Lining: 100% Polyester

These can naively sum to >100%. The parser extracts the body / shell / outer section only — that's what defines the garment's quality and what touches the skin. Lining isn't scored.

If the running total exceeds 110%, we treat it as a multi-section composition and stop after the first ~100%. If the running total is under 90%, we treat it as a partial composition (scraper missed something) and either drop it or score conservatively.

Category-aware modifiers (optional)

When the product category is known, axis weights are nudged to reflect intended use — but the base 0–100 score per axis is unchanged:

Category Boosts Reduces
Activewear breathability ×1.3, moistureWicking ×1.4 warmth ×0.6
Formal comfort ×1.3, durability ×1.2
Outerwear warmth ×1.5, durability ×1.4 breathability ×0.7
Sleepwear comfort ×1.4, breathability ×1.2 durability ×0.8

Weights average ~1.0 across the 7 axes so the 0–100 scale stays consistent.

Recycled vs virgin scoring

Recycled and organic variants score separately from their virgin counterparts:

Material Overall score
Cotton 65
Organic Cotton 74 (+9)
Polyester 52
Recycled Polyester 62 (+10)

The +9 to +10 uplift reflects genuine sustainability + (in the case of organic) farming-practice differences. We deliberately do NOT mark recycled polyester as significantly higher quality — the fabric itself behaves the same as virgin polyester; only the upstream sourcing differs.


4. Health Impact score

Composite of three sub-signals, all derivable from composition and (optional) category.

score = 100 − microPenalty − skinPenalty − chemPenalty

Each penalty is independent. The grade follows the universal A/B/C/D/F brackets.

4.1 Microplastic shedding (sub-signal)

Per-fiber laundry shedding rates (fibers per 6 kg load, mid-range estimates — see §1 of the research bibliography):

Fiber Shedding rate
Acrylic 730,000 fibers/wash
Polyester 700,000
Recycled Polyester 600,000
Nylon 500,000
Recycled Nylon 400,000
Spandex / Elastane 200,000
Fleece (knitted poly) 1,700,000
Polartec fleece 1,500,000
Natural fibers (cotton, wool, silk, linen, hemp, lyocell, viscose, etc.) 0 (do not shed plastic)

Risk levels:

  • Low: 0% synthetic, or <20% synthetic content
  • Medium: 20–50% synthetic
  • High: >50% synthetic

Microplastic penalty: 30 (high) / 15 (medium) / 0 (low).

4.2 Skin-contact synthetic load (sub-signal)

Wearing a synthetic garment against your skin all day is not the same as wearing it as an outer shell. Sweat increases dermal absorption of plasticizer residues. Some categories are worn directly on skin all day (underwear, baby clothing, sleepwear, socks); others are worn over base layers (jackets, outerwear).

We weight the synthetic % by category:

Category Weight Rationale
Baby 1.5 Highest skin-to-body-weight ratio
Underwear 1.4 All-day direct contact, sensitive tissue
Sleepwear 1.3 All-night direct contact
Activewear 1.2 Sweat increases dermal exchange
Socks 1.2 Direct contact, often damp
T-Shirts, Shirts, Dresses, Swimwear 1.0 Standard daily wear
Pants, Jeans, Shorts, Skirts 0.9 Mostly skin contact, less sweat
Sweaters, Suits 0.7 Often worn over a base layer
Jackets, Outerwear 0.5 Worn over other clothing
Accessories 0.3 Minimal skin contact

The skin-contact penalty is continuous, not bucketed:

skinPenalty = min(30, weightedSyntheticPct × 0.3)

So 100% polyester underwear (1.4× weight = 140 → capped at 30) penalizes more than 100% polyester sweater (0.7× weight = 70 → capped at 30 also, but other axes differ) which penalizes more than 100% polyester jacket (0.5× weight = 50 × 0.3 = 15).

The level (low / moderate / high) is also computed off the weighted synth % and is used only for UI labels — not for scoring.

4.3 Chemical-treatment signals (sub-signal)

Chemical-treatment flags come from two sources. Each carries a likelihood (likely / possible / trace) and a human-readable reason. Neither is a lab measurement of any specific item.

(a) Heuristic — patterns of (composition × category), based on industry-standard manufacturing practice:

Flag Trigger Likelihood Citation
PFAS Outerwear or Jackets category, ≥50% synthetic likely EU REACH Annex XVII; US EPA SNUR
Formaldehyde Shirts category, ≥50% cotton AND ≥5% polyester possible IARC Monograph 100F (2012); WHO 2010
Antimony Any composition with ≥30% polyester (virgin) trace Westerhoff 2008; Biver 2021
Antimony (recycled) ≥50% recycled polyester trace Same; reduced but non-zero

(b) Observed (v0.38.0) — chemical finishes stated on the product page itself, captured by the enrichment extractor (chemical_finishes). Because these are read from the page, not inferred, they register as likely and override a same-name heuristic flag. Observed concerns and their triggers: PFAS (stain repellents, Scotchgard/Teflon, or DWR/water-repellent without a PFC-/fluorine-free claim), formaldehyde (easy-care / wrinkle-free / non-iron / permanent-press resins), biocide (antimicrobial / silver-ion / Polygiene / Microban / anti-odor), and flame retardant. This adds Biocide and Flame retardant to the flag set. Still "stated on the page," not lab-confirmed.

Chemical-treatment penalty: 30 (any likely flag) / 15 (any possible flag, no likely) / 0 (only trace flags). Observed finishes apply this same penalty path — no new magnitudes are introduced; an observed finish is treated as at least as strong as the existing heuristic likely.

4.4 Composite Health Impact score

score = max(0, 100 − microPen − skinPen − chemPen)

Each sub-signal can subtract up to 30; theoretical floor is 100 − 30 − 30 − 30 = 10, but a fully synthetic skin-contact item with PFAS treatment commonly lands in the 25–40 range (D/F).

The level (low / moderate / high for the overall card) and topConcern string are derived deterministically from the component levels and the highest-severity flag.


5. Sustainability / Eco score

The 7th axis of the Quality score, exposed independently for UI use. Per-material values are stored in the materials table; blends use the same weighted-average pattern as Quality.

Inputs informing the per-material number:

  • water consumption (cotton: high; linen, hemp: low)
  • energy intensity of production
  • pesticide / fertilizer load (cotton: high; organic cotton: low)
  • biodegradability (natural fibers: yes; petroleum-derived: no)
  • recyclability (polyester: theoretically yes; cotton: limited)
  • end-of-life behavior

Recycled and organic uplift: noted in §3 above.

We do not currently use Higg MSI scores directly — the Higg index has known transparency issues and the SAC has paused some of its public disclosures. We use Higg as one of several inputs informing our material-level scores, alongside Textile Exchange data and primary literature.


6. Tradeoff narrative (consumer-facing)

Pure deterministic function — takes a product's Quality, Health, and Eco scores (plus optional category) and returns a headline, "best for" recommendation, strongest/weakest axis, and the band label for each axis.

Algorithm

  1. Bucket each axis into a band: high (≥70), medium (55–69), low (<55).
  2. If all three are high → "Strong across the board." headline.
  3. If all three are low → "Falls short on every axis." headline.
  4. If all three are medium → "Average across the board." headline.
  5. Otherwise: identify the strongest axis (highest score) and the weakest. Template the headline: "{Strongest_phrase}, but {weakest_phrase}."
  6. Pick a "best for" suggestion from a 6-cell table keyed on (strongest, weakest).
  7. Apply a category modifier: skin-heavy categories (Underwear, Baby, Sleepwear, Socks) with low Health get a harsher "not recommended for {category}" override on the best-for line.

Phrase templates

Axis Strong phrase Weak phrase
Quality "Well-made" "flimsy build"
Health "safe to wear" "plastic on skin"
Eco "low planet cost" "rough on the environment"

"Best for" combinations

Strongest Weakest Suggestion
Quality Health Outerwear or layers — not for direct skin contact.
Quality Eco Buy once, keep for years to amortize the production hit.
Health Quality Safe basics, but expect to replace it sooner.
Health Eco Safe to wear; production isn't clean — donate when done.
Eco Quality Sustainable, but treat it gently to extend its life.
Eco Health Low planet cost, but synthetic — wear over a base layer.

7. Risk Briefing (B2B-facing)

Same pattern as tradeoff but operates on aggregate stats (a brand's catalog, or the whole industry) and outputs business-language framing. Returns a headline, primary risk callout, supporting bullets, and a suggestion / market angle.

Risk priority order

When multiple risks are present, the briefing leads with the most pressing one. Order:

  1. PFAS — regulatory clock (EU REACH 2025–2027). Threshold: ≥5% of catalog.
  2. Formaldehyde — WHO Group 1 carcinogen, growing US consumer-suit volume. Threshold: ≥5% of catalog.
  3. Microplastic shedding — mainstream consumer narrative. Threshold: ≥30% of catalog flagged high.
  4. Synthetic skin contact — worst-case dermal exposure. Threshold: ≥30% of catalog flagged high.
  5. Antimony — trace, ubiquitous, EU REACH disclosure relevant. Threshold: ≥30% of catalog.

Below all thresholds → primary = none ("low chemical and synthetic- exposure risk").

Audience switching

The same risk data drives both the brand-page Risk Briefing and the industry-wide briefing on /dashboard/analytics. We swap possessive language ("your catalog" → "the industry") and the suggestion framing ("what to do" → "market angle") based on which view it's rendering in. The underlying rule, thresholds, and SKU math are identical.

Industry comparison bullet

When industry-wide PFAS exposure data is available, brands whose share differs by ≥3 percentage points get an extra bullet comparing them to the industry average.


8. Tag parsing & material matching

Composition strings are unstructured and noisy. The parser does:

  1. Multi-section extraction — pulls only the body/shell section if the tag has multiple compositions.
  2. Material name normalization — strips marketing modifiers ("ring-spun", "pre-shrunk", "Turbo", "carded", "bio-washed", "chino twill", "moisture-wicking", etc.).
  3. 3-layer matching — exact alias match → fuzzy match against the material DB → base material fallback for unknown variants.
  4. Validation — rejects compositions that don't sum to 90–110% (single-material 100% items pass; multi-section >110% gets the body section only).

Multi-language: Japanese fabric terms are detected and translated to English before matching. Korean and Chinese support similarly.


9. Brand-level aggregation

Brand-level Quality, Health, Sustainability scores and chemical-flag percentages are simple averages and counts over the brand's analyzed products:

avgHealthScore = mean(health.score for product in brand)
pfasLikelyPct = count(product has PFAS=likely flag) / count(products) × 100

Brand-level scoring is only reliable with ≥30 products. Below that, the public scorecard and the dashboard both display a "Limited data — scores may not be representative" warning.


10. What we explicitly do NOT measure

Honesty about limitations is part of the methodology.

  • We do not test individual SKUs in a lab. Antimony, formaldehyde, and PFAS flags are heuristic (composition × category), not lab- measured. A flag means "this combination commonly carries this treatment in industry practice." It does not mean any specific item has been tested.
  • We do not have factory-level or mill-level data. Same product from the same brand with the same composition gets the same score regardless of which factory made it. This is the boundary that separates POD-founder use cases from real-fashion-startup use cases.
  • We do not measure dye chemistry. Bright neon synthetics are more likely to use azo dyes that can degrade to aromatic amines, but we don't currently flag this.
  • We do not score garment-construction quality (stitch count, seam type, hardware) — only the fabric's intrinsic properties.
  • The Health Impact score is not medical advice. It is a heuristic-based exposure-likelihood signal, not a diagnostic tool.
  • Microplastic shedding rates are estimates. Real-world shedding varies with detergent, machine, agitation, garment age, and washing frequency. We use mid-range published estimates per fiber.

11. Validation & test coverage

Every scoring engine in FabricIQ is unit-tested. Coverage by area:

Engine Tests Tested behaviors
Scoring 100+ Per-axis scoring, blend weighting, stretch tolerance, multi-section, category modifiers
Microplastic 11 Per-fiber rates, level thresholds, edge cases
Health Impact 22 All sub-signals, category weighting, chemical flags, top-concern selection
Tradeoff narrative 19 All-equal cases, mixed cases, category modifier, capitalization
Risk Briefing 12 Priority order, audience flag, SKU math, industry comparison
Tag parser 50+ Multi-section, normalization, validation, multi-language

A periodic real-product audit samples 50 stratified products from the live catalog and re-runs the tradeoff narratives — both as a sanity check on the rules and as a regression guard before any rule change ships.


12. Reproducibility

Scoring is deterministic and pure. The same composition + category will always produce the same score, on every machine, in every version of the engine. No randomness, no AI generation, no per-product manual curation. Same input, same output, every time.


This document is the white paper. As the methodology evolves, it is updated alongside the engine itself.