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):
- durability — abrasion resistance, pilling, expected wear life
- comfort — softness, drape, hand-feel
- breathability — airflow, ability to dissipate body heat
- warmth — insulation per gram
- moistureWicking — capacity to move moisture from skin to outer layer
- 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
- Bucket each axis into a band:
high(≥70),medium(55–69),low(<55). - If all three are
high→ "Strong across the board." headline. - If all three are
low→ "Falls short on every axis." headline. - If all three are
medium→ "Average across the board." headline. - Otherwise: identify the strongest axis (highest score) and the
weakest. Template the headline:
"{Strongest_phrase}, but {weakest_phrase}." - Pick a "best for" suggestion from a 6-cell table keyed on
(strongest, weakest). - 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:
- PFAS — regulatory clock (EU REACH 2025–2027). Threshold: ≥5% of catalog.
- Formaldehyde — WHO Group 1 carcinogen, growing US consumer-suit volume. Threshold: ≥5% of catalog.
- Microplastic shedding — mainstream consumer narrative. Threshold: ≥30% of catalog flagged high.
- Synthetic skin contact — worst-case dermal exposure. Threshold: ≥30% of catalog flagged high.
- 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:
- Multi-section extraction — pulls only the body/shell section if the tag has multiple compositions.
- Material name normalization — strips marketing modifiers ("ring-spun", "pre-shrunk", "Turbo", "carded", "bio-washed", "chino twill", "moisture-wicking", etc.).
- 3-layer matching — exact alias match → fuzzy match against the material DB → base material fallback for unknown variants.
- 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.