# Cotton Balls, Pads & Swabs: research notes

Date: 2026-10-25. Scope: disposable (and a minority of reusable) absorbent-cotton
personal-care consumables shaped as loose balls, flat rounds/pads, or fiber
wrapped on a stick (swabs/buds/cotton-tip applicators), used for skincare and
makeup removal, general hygiene, baby care, and minor first aid (cleaning a
scrape, applying antiseptic, packing a nosebleed). Not in scope, and left to
siblings in `catalog.json` under `supplies > personal`: feminine hygiene pads
(`feminine-pads`), gauze, adhesive dressings and medical tape (`medical-tapes`),
assembled first-aid kits (`first-aid`), and makeup-application sponges/brushes
(`makeup-brushes`). Craft-grade polyester fiberfill balls sold for decor or
stuffing are also out of scope; they are a different fiber and a different
vertical (crafts), not personal care.

Quote labels: **verbatim** = I saw the exact sentence in raw text I fetched
myself (an API's JSON/XML field, or HTML I grepped after stripping tags).
**fetched excerpt** = the fetch tool returned a model's summary/paraphrase of
a page it actually loaded. **search excerpt** = from a search-engine summary,
page itself unseen. No search-excerpt-only numbers are in category.json.
WebSearch reported its session budget exhausted on the first three queries of
this run, before any query returned results, so this entire register was built
from direct fetches (WebFetch, curl), a REST API (Europe PMC, which returns raw
abstract/full-text JSON and XML, not a search summary), and one Internet
Archive availability lookup. Retail listings (Target, CVS, Amazon-style) and
several brand/manufacturer sites (Dukal, McKesson, Medline, Grainger, Puritan,
Q-tips/Unilever, Mayo Clinic, EUR-Lex, FDA, CDC, entnet.org, healthychildren.org,
Allure, Byrdie, Paula's Choice, two lash-supply sites) all returned 403/404 or
could not be reached; I could not confirm any field is present on a retail
listing in this run, so nothing is marked `source: listing` on that basis alone.

## Seed

Seed run (recorded verbatim from the script output):

```
=== Example entry (from an unrelated category) ===
category: bedsheets
what this shows: the expert split is often not the number everyone advertises.
Thread count is the generic trap here. Weave is what changes how the sheet
feels and sleeps.
[... weave facet JSON ...]
=== Persona ===
A pastry chef, who thinks in ratios, temperatures and why a recipe fails
```

1. What is the cotton-balls equivalent of the example? The generic number
   everyone advertises is "100% cotton" on the pack. The real split underneath
   it is construction, not purity: whether the fiber is left loose (soft,
   absorbent, sheds lint) or carded and bonded into a pad or a lint-free blend
   (holds together, sheds less), and separately whether the batch is sterile
   and individually wrapped or bulk and non-sterile. Two "100% cotton" products
   can behave completely differently depending on these, the same way two
   sheets at the same thread count feel different by weave.
2. What would the pastry chef notice first? A pastry chef thinks about process,
   not ingredient ratio alone: identical flour and sugar percentages still bake
   differently depending on how the batter was mixed. Applied here, they would
   ask how the cotton was processed and packaged, not what percentage of it is
   cotton, which is exactly the fiber-construction and sterility point above.

Kept: fiber construction (loose vs. bonded/lint-free) and sterile-vs-bulk as
the real axes, instead of a bare cotton-percentage claim. Dropped: no facet
called "cotton purity %" — no source gives this as a real spec, and it reads
as a label claim, not a behaviour difference, unless construction is also
known.

## Sources and what each supports

1. **Jatana et al., "Pediatric Cotton-Tip Applicator-Related Ear Injury Treated
   in United States Emergency Departments, 1990-2010"** (Journal of Pediatrics;
   PMID 28473166), read via the Europe PMC REST API (`resultType=core`), which
   returns the publisher's own abstract text as a JSON field — **verbatim**.
   Supports: 263,338 US children under 18 treated for cotton-tip-applicator ear
   injuries, 1990-2010; highest injury rate age 0-3 (32.2 per 100,000); ear
   cleaning was the documented circumstance in 73.2% of cases; the patient was
   handling the swab in 76.9%. Kind: academic.
2. **"Unpacking cerumen impaction: a systematic review of clinical practice
   guidelines... WHO package of ear and hearing care interventions"** (PMC
   13130458, 2025), read via Europe PMC's `fullTextXML` endpoint, raw XML text
   — **verbatim**. Supports: "over 90% of individuals engage in ear cleaning
   practices... such as inserting foreign objects (i.e., cotton-tipped swabs)";
   a guideline statement, "Advise adults not to remove earwax to clean their
   ears by inserting small objects, such as cotton buds, into the ear canal, as
   this could damage the eardrum and canal and push wax further down into the
   ear." Kind: academic.
3. **AAO-HNS, "Clinical Practice Guideline (Update): Earwax (Cerumen
   Impaction)"** (PMID 28045591), abstract via Europe PMC — **verbatim**
   abstract text, but the abstract itself (as returned) names ear hygiene
   education as a recommendation without naming cotton swabs specifically; I
   did not get the full guideline body, which the 2025 systematic review above
   quotes as containing the "advise... not to insert... cotton buds" line. Used
   only to support that a standards body (AAO-HNS) has an active cerumen
   guideline that the 2025 review is summarising; the specific wording is
   attributed to source 2, not read directly in source 3's own text. Kind:
   academic.
4. **European Commission, "Single-use plastics" topic page**
   (environment.ec.europa.eu), fetched live — **fetched excerpt** (WebFetch
   summary of the live page). Supports: "Cotton bud sticks" is listed as the
   first of the "10 single-use plastic items" targeted by the EU Single-Use
   Plastics Directive; "3 July 2021 - EU no longer allows certain SUP items to
   be placed on Member States' markets." The page's own text, as returned, did
   not explicitly re-confirm that cotton bud sticks are among the items that
   specific date applies to (it names the date for "certain SUP items"
   generally); I treat the date as applying to cotton bud sticks on the
   strength of source 5 below, not from this page's wording alone. Kind:
   regulator.
5. **Wikipedia, "Cotton swab"** (redirects from "Q-tips"), fetched live twice
   (same article both times) — **fetched excerpt** both times, consistent.
   Supports: medical swabs run longer and single-tipped, packaged sterile one
   or two to a sleeve, because paper/wood sticks survive autoclaving and
   plastic would melt; home swabs run shorter, double-tipped, sold non-sterile
   in packs of 100+; several countries (Italy 2019, Monaco 2020, England/
   Scotland/Wales/Isle of Man 2019-2021) restricted plastic-stem swabs ahead of
   or alongside the EU-wide rule. The specific centimetre/inch figures and the
   country-by-country dates are **single-sourced to this one encyclopedia
   article** (fetched twice is not two sources) and are therefore described in
   category.json only in relative, non-numeric terms ("longer", "shorter"),
   never as a sourced range. Kind: primer.
6. **Wikipedia, "Cotton pad"**, fetched live — **fetched excerpt**. Supports:
   cotton pads are used medically to control bleeding from punctures,
   injections and blood draws, and for infant hygiene, alongside cosmetic
   makeup use; a 1965 industry concern that "synthetic puffs" were being sold
   labelled as cotton balls. Used only for the qualitative uses and as evidence
   that fibre content has been a real point of concern in this market before;
   the market-size dollar figures in this article are not used anywhere in
   category.json (single-sourced, and not load-bearing for any facet). Kind:
   primer.
7. **Wikipedia, "Nonwoven fabric"**, fetched live — **fetched excerpt**.
   Supports only the general manufacturing fact that "rayon used to be a common
   fibre in nonwovens, now greatly replaced by polyethylene terephthalate (PET)
   and polypropylene," i.e., that bonded/blended cotton-alternative nonwovens
   are a real, named manufacturing category. Did not yield a lint or wet-
   strength comparison; I dropped that line of claim rather than assert it
   unsourced. Kind: primer.
8. **Swisspers**, brand site, fetched live — **fetched excerpt**. Supports: the
   brand sells a separate "Ultra-Luxe Cotton Round" line marketed as "100%
   cotton, lint-free," distinct from, and more expensive than, its standard
   round; and a "Premium Exfoliating Cotton Round" that is dual-sided, one
   smooth face and one textured face for light exfoliation. This is the only
   source for both the lint-free-as-a-separate-line claim and the dual-texture
   claim; both are flagged medium/low confidence in judgements and the
   `fiber_material` and `pad_texture` facets below for that reason. Kind:
   spec_sheet.
9. **LastObject, "LastSwab"**, brand site, fetched live — **fetched excerpt**.
   Supports: a reusable, washable swab product exists and is marketed
   specifically as a replacement for single-use cotton swabs. The brand's own
   multiplier and cost-per-use figures ("1,000+ cotton swabs," "8.3x less
   environmental impact," "$0.01 per use") are single-sourced marketing claims
   from the seller and are not used anywhere in category.json. Kind:
   spec_sheet.
10. **EcoRoots, reusable cotton rounds**, brand site, fetched live — **fetched
    excerpt**. Supports: a washable organic-cotton-and-bamboo round exists and
    is marketed as a replacement for disposable cotton pads, is not pre-washed
    (shrinks on first wash), and is reusable over "a couple of years" per one
    quoted customer review (anecdotal, not a controlled wash-count, so no wash
    count appears in category.json). Kind: spec_sheet.

Sources tried and not reachable, listed because the brief asks what source
types I could not reach: ASTM (D4391 catalogue page, 403), the FDA consumer
page on cotton-tip applicators (the exact URL could not be found; FDA's own
site returned 404 for every guessed slug and has no public search I could
fetch), CDC, Mayo Clinic, healthychildren.org, entnet.org (all 404/403), EUR-Lex
itself (returns HTTP 202 with an empty body to this tool, twice, both direct
and via archive.org's availability check, which found no snapshot), Dukal,
McKesson, Medline, Grainger, Puritan Medical Products (medical-supply spec
sheets, all 403/blocked), Q-tips/Unilever's own brand page (403), Target and
CVS retail listings (404/403), Allure, Byrdie, Paula's Choice, NAILS Magazine
(no usable content returned), and two lash-supply sites that failed DNS
resolution entirely. USP's own "Purified Cotton" / "Absorbent Cotton" monograph
was searched for via Europe PMC and not found as a fetchable, citable text; I
did not put any USP-specific number in category.json as a result, and the
sterile-vs-bulk distinction is sourced to source 5 (Wikipedia, for swabs) and
extended to balls and pads by stated analogy in judgement 2 below, not
independently confirmed for balls/pads.

## Data points used for derived metrics

None. I considered a price-per-unit or cost-per-use metric, but it is the same
arithmetic (price divided by count) a shopper would do for any multi-pack
commodity, and reads unchanged for paper towels, battery packs or diapers — it
fails the generic test and is not expertise, so `derived_metrics` is omitted
rather than padded with a non-metric.

## Against the existing add-on schema

Add-on read: `supplies/personal/add-ons/cotton_ball.jsonc`, which is empty
(`{}` under a comment naming the category) — there is no field to compare
against. Composed with `personal-standard.jsonc` (`replacement_compatibility_raw`,
`sizing.weight_capacity`, both inapplicable: nothing here is "replaced" and
nothing bears weight) and `supplies-standard.jsonc` (`high_signal_markdown`,
`sizing.size_stated`, `sizing.pack_count`, `sizing.dimensions`,
`sizing.capacity`, `sizing.weight`), which already cover pack count, size
label and dimensions generically, so none of this register's facets duplicate
them.

Applying AGENTS.md rule 1 (visually-derived fields stay out of the schema)
turns out to cut most of the candidate facets below from the add-on, because
this is a visually simple product: a ball, a flat pad, a dual-texture pad and
a double- vs single-tipped swab are all things a photo answers as well as text
does, so they belong to the image pipeline, not a new schema field, even
though they are real facets in the register below (the register is about what
the assistant should ask or show, not only what the text pipeline extracts).

| Facet in this doc | In add-on today | Proposed kind under AGENTS.md | Note |
|---|---|---|---|
| format (ball / pad / swab) | no (add-on is empty) | none — cut, photo-derivable | A listing photo shows a ball, a flat pad or a stick as reliably as any bullet does; the taxonomy leaf itself already separates the product type at the catalog level. Not a new field. |
| sterile_or_medical_grade | no | hard filter (boolean) | Not visible in a photo reliably; "sterile," "individually wrapped" is a text claim on the package and the listing bullet. Worth a real field. Researched, low backfill cost (brand/medical-supply pages state it plainly; I could not confirm it is reliably in retail-listing titles in this run). |
| fiber_material (100% cotton vs. lint-free blend) | no | high_signal_markdown, not a filterable enum yet | Only one brand (Swisspers) was confirmed to market this as a named, separate line; too thin an evidence base to commit to as a dense, backfill-worthy enum today. Belongs in the markdown line until more brand pages confirm the pattern. |
| stick_material (paper/wood vs. plastic, swabs only) | no | hard filter (enum), swab rows only | Null for ball/pad rows. A real buyer filter in the EU (plastic-stick swabs cannot be newly sold there since 3 July 2021) and for anyone avoiding plastic. Researched; brand/manufacturer pages state it, not confirmed on retail listings here. |
| tip_count (single vs. double, swabs only) | no | none — cut, photo-derivable | Visibly countable from the product photo. |
| pad_texture (smooth vs. dual-sided textured, pads only) | no | none — cut, photo-derivable | The waffle/ridge texture is visible in the product photo; also single-sourced (Swisspers only) in this run, so even as a markdown line it should wait for a second source. |
| reusable_or_disposable | no | none — cut, photo-derivable | A terrycloth round or a silicone swab looks obviously different from a disposable one in the product photo; the taxonomy/title ("reusable," "washable") also carries it, so no new structured field earns its keep here. |

Nothing in today's add-on is called out as noise, because today's add-on holds
nothing. The risk this register flags for whoever fills `cotton_ball.jsonc`
next is the opposite one: most of the obvious-looking facets for this category
are exactly the kind AGENTS.md rule 1 says to leave to the image pipeline, so
the temptation to add format/texture/tip-count columns should be resisted; the
two fields actually worth adding are `sterile_or_medical_grade` and
`stick_material`.

## Branches

Each leg names the sentence in the register or these notes it follows from.
The `when` values on `format` are its three facet values, worded to match the
split question's three answers 1:1 ("cotton balls" -> `cotton ball`, "flat
pads" -> `round or square pad`, "swabs on a stick" -> `swab on a stick`). The
`when` values on `sterile_or_medical_grade` are `yes` / `no`, per the schema's
boolean convention.

**Split 1, format ("Cotton balls, flat pads, or swabs on a stick?")**

- when `cotton ball`: makes_irrelevant `stick_material`, `tip_count`,
  `pad_texture`. "A loose ball has no stick and no second flat face" (format,
  definition) — there is nothing for those three facets to describe on this
  branch.
- when `round or square pad`: then_ask `pad_texture`, `reusable_or_disposable`;
  makes_irrelevant `stick_material`, `tip_count`. "A pad's two faces can be
  smooth or one can be textured" (pad_texture, definition), so the question
  applies here and nowhere else; "a washable terrycloth round... replaces
  disposables" (reusable_or_disposable, why_experts_care) names pads by name.
  Sticks and tip count do not exist on a flat pad.
- when `swab on a stick`: then_ask `stick_material`, `tip_count`,
  `reusable_or_disposable`; makes_irrelevant `pad_texture`. The stick and tip
  facets are definitionally about the stick format; "a reusable, washable
  swab... replace[s] single-use cotton swabs" (reusable_or_disposable
  why_experts_care, sourced to LastSwab) also names swabs by name. A stick
  format has no second textured face, so `pad_texture` does not apply.

**Split 2, sterile_or_medical_grade ("For a wound or baby's skin, or just
toiletries?")**

- when `yes`: makes_irrelevant `reusable_or_disposable`, `fiber_material`.
  Chain: sterility is what the "for a wound or baby's skin" answer is buying
  (facet definition); "it must be laundered between uses... is never sold
  sterile" is stated of the reusable facet's `why_experts_care`, so a reusable
  item cannot satisfy the sterile answer and the question stops being useful
  once sterile is required. Separately, `fiber_material`'s own
  `why_experts_care` says lint only matters for cosmetic precision tasks
  ("wet nail polish, lash glue and camera lenses"), none of which applies once
  the buyer needs sterile wound/baby-skin cotton, so lint stops being a
  reason to ask or filter on that branch too (added 2026-10-25, see
  Corrections below).
- when `no`: then_ask `fiber_material`, `reusable_or_disposable`. Nothing
  about everyday toiletry use forces either answer, so both remain open
  questions — this leg exists to say they are still worth asking, not to
  narrow anything, matching the house convention (e.g. power-bank's "no branch
  for `none`" leg) of recording a no-op leg rather than omitting it silently.

No branch on `fiber_material`, `stick_material`, `tip_count`,
`pad_texture` or `reusable_or_disposable` downstream, because none of them is
a split and nothing in the register states that any of their values changes
what else gets asked.

## Trimmed detail

- The Wikipedia "Cotton pad" US market-size figures ($343.1M in 1999 to
  $177.7M in 2014; brands Swisspers, Swiss Beauty, Cotton Cloud in 2016) and
  the 1937 Joseph A. Voss pad-cutting machine are real but single-sourced and
  not load-bearing for any facet or judgement; kept only here for colour.
- LastSwab's own multiplier and cost claims ("1,000+ cotton swabs," "8.3x less
  environmental impact," ISO-certified LCA, "$0.01 per use") are a single
  seller's marketing figures. `reusable_or_disposable`'s `why_experts_care`
  says only that it "replace[s] hundreds of disposables," not the seller's
  specific multiple.
- The precise swab lengths from Wikipedia (medical ~10 cm/4 in single-tipped;
  home ~6.5 cm/2.5 in double-tipped) are single-sourced to one article fetched
  twice. `tip_count`'s facet text keeps the single/double distinction (which
  is also what actually matters for the child-safety story) and drops the
  centimetre figures.
- Country-by-country plastic-swab ban dates (Italy 2019, Monaco 2020, England/
  Scotland/Wales/Isle of Man 2019-2021) are from the same single Wikipedia
  source; `stick_material` cites only the EU-wide, two-source date (3 July
  2021).

## Corrections

First pass; no blind check has run against this register yet. Flagging two
things for a checker to look at first, since I could not fully resolve them
in this run: (1) `fiber_material` and `pad_texture` both rest on one brand's
site (Swisspers) and should be checked against a second cosmetic-cotton brand
before being trusted at more than low/medium confidence; (2) the
`sterile_or_medical_grade` facet's claim that bulk toiletry cotton balls/pads
are generally non-sterile is extended by analogy from the swab-specific
Wikipedia sentence, not independently confirmed for balls and pads, and should
be checked against a medical-supply brand page (Dukal/McKesson/Medline all
blocked this run) if one becomes fetchable.

## Corrections after the blind check (2026-10-25)

1. Added `fiber_material` to `sterile_or_medical_grade`'s `yes` branch
   `makes_irrelevant` list in `category.json`, alongside `reusable_or_disposable`.
   Fixes required-fix #1: the facet's own `why_experts_care` says lint only
   matters for cosmetic precision tasks (nail polish, lash glue, camera
   lenses), none of which applies once sterile wound/baby-skin cotton is
   needed, so a sterile-branch flow had no stated reason to still ask or
   filter on fiber material. Updated the matching leg in this file's
   "Branches" trace for Split 2, `when: yes`.
2. Added a sentence to `tip_count`'s and `pad_texture`'s `backfill_note` in
   `category.json` naming the product photo as a cheaper backfill route than
   brand-page text research. Fixes required-fix #2: `category.json` alone
   (the file the pipeline consumes) previously sent a reader hunting brand
   pages when the photo route, already worked out in this file's "Against
   the existing add-on schema" table, is cheaper and reliable. Did not add a
   fourth `source` enum value ("derivable from image") because `schema.json`
   is outside `cotton-balls/` and out of scope for this fix; flagging here
   that the schema change the checker suggested as a possible next step is
   still open.
3. Added the clause "the directive's general application date" to
   `stick_material`'s `why_experts_care` next to the "3 July 2021" date.
   Fixes required-fix #3: the fetched EC page never prints "cotton bud
   sticks" and "3 July 2021" in the same sentence; the day comes from the
   Single-Use Plastics Directive's general application date (confirmed by
   source 4 in this file), not from text naming the item on that date. The
   hedge keeps the date (true and two-source-backed at the year level, per
   Part A claim #2 of `check.md`) while flagging its exact-day provenance so
   a future checker does not have to re-derive the chain.
4. No change made for required-fix #4 (the 1965 "nylon puffs labelled as
   cotton balls" single-source line). The checker marked this informational
   only: it is not cited by any facet, split, branch or judgement, so it
   carries no risk today. Rejected as a fix target for that reason; left in
   `category.json`'s `mechanism` evidence and `wikipedia_cotton_pad`'s
   `supports` line unchanged, with this note as the flag against future
   promotion to a load-bearing claim without a second source.

No new web research was needed for any of the four fixes; all were textual
corrections to claims and backfill notes already sourced elsewhere in this
register.

## Build notes

`validate.py`, `render.py` and `viewer.py` ran clean on the first attempt with
no script misbehaviour to report.
