Scope: craft/hobby paints (acrylic, watercolor/gouache, oil, tempera/poster, hobby enamel, spray), craft/calligraphy/stamp/alcohol inks, and fabric/tie-dyes sold for decorating fabric, paper/canvas, wood, glass/ceramic/metal or plastic/model surfaces — not architectural/automotive paint, cosmetics, or office/printer ink cartridges.

Seed:
1. Paint equivalent of harvest_date: dye_class (fiber-reactive/acid/disperse/direct) — like harvest date, it's barely ever a listing field but is the single fact that predicts whether the product works at all on the buyer's fiber.
2. A pharmacist (concentration, delivery form, interactions) would notice first: that "paint" isn't one delivery mechanism — binder vs. dye bonding is a different "route of administration" onto the surface, and the colorant/binder pairing (pigment_load_grade, colorant_type) is the "concentration" that most listings never disclose.

Sources:
[acmi_safety] https://www.acmiart.org/materials-safety — AP/CL seal defs, ASTM D-4236, toxicologist testing — fetched excerpt (curl, raw HTML, confirmed via grep)
[wiki_pigment] https://en.wikipedia.org/wiki/Pigment — pigment insoluble vs dye soluble — fetched excerpt
[wiki_dye] https://en.wikipedia.org/wiki/Dye — acid dye -> wool/silk/polyamide; dye class taxonomy — fetched excerpt
[wiki_reactive_dye] https://en.wikipedia.org/wiki/Reactive_dye — bonds to cellulose; Procion MX = cold-fix dichlorotriazine — fetched excerpt
[wiki_disperse_dye] https://en.wikipedia.org/wiki/Disperse_dye — made for polyester/hydrophobic fiber — fetched excerpt
[wiki_direct_dye] https://en.wikipedia.org/wiki/Direct_dye — substantive dye colors cellulose (cotton) — fetched excerpt
[wiki_lightfastness] https://en.wikipedia.org/wiki/Lightfastness — ASTM D4303, Blue Wool Scale — fetched excerpt
[wiki_gouache] https://en.wikipedia.org/wiki/Gouache — gum arabic/dextrin binder, opaque — fetched excerpt
[wiki_tempera] https://en.wikipedia.org/wiki/Tempera — egg/casein/PVA binders, poster paint — fetched excerpt
[wiki_oilpaint] https://en.wikipedia.org/wiki/Oil_paint — linseed oil binder, slow-dry, waterproof — fetched excerpt
[wiki_watercolor] https://en.wikipedia.org/wiki/Watercolor_painting — gum binder, transparency mechanism — fetched excerpt
[wiki_indiaink] https://en.wikipedia.org/wiki/India_ink — carbon + shellac/gelatin, waterproof when dry — fetched excerpt
[wiki_acrylicpaint] https://en.wikipedia.org/wiki/Acrylic_paint — acrylic polymer emulsion, water-based, fast-dry — fetched excerpt
[wiki_ink] https://en.wikipedia.org/wiki/Ink — dye-based vs pigment-based ink tradeoff — fetched excerpt
[wiki_aerosolpaint] https://en.wikipedia.org/wiki/Aerosol_paint — propellant+paint structure — fetched excerpt
[wiki_enamelpaint] https://en.wikipedia.org/wiki/Enamel_paint — alkyd resin, hard glossy, spray overlap — fetched excerpt
[wiki_textileprinting] https://en.wikipedia.org/wiki/Textile_printing — pigment print fixed by steam/heat; mordant dyeing — fetched excerpt

Branches:
- product_type -> paint/ink/dye: "Paint and ink sit a binder-held film on top... dye bonds into the fiber itself" (mechanism, wiki_acrylicpaint + wiki_reactive_dye).
- surface_or_fiber -> fabric routes to heat_set_required: textile printing is "fixed... with steam or hot air (for pigments)" (wiki_textileprinting).
- paint_medium -> enamel/spray routes to solvent_base: "Most enamel paints are alkyd resin based" and spray is propellant+solvent (wiki_enamelpaint, wiki_aerosolpaint).
- product_type=dye -> dye_class + fiber_compatibility: reactive dye bonds cellulose, disperse dye needs polyester, acid dye needs wool/silk/nylon (wiki_reactive_dye, wiki_disperse_dye, wiki_dye) — three distinct, non-overlapping fiber targets, so class and fiber must be asked together.

Noise (rows seen but not made facets):
- Brand/price/size/color-name/net-volume — excluded per rule (price, brand never facets; color name is catalog data, not expertise).
- Exact lightfastness numeric scale (1-8 Blue Wool, I-IV ASTM) — kept as categorical excellent/good/fair/poor rather than a sourced numeric range, since no two listing-level sources give the raw scale position per product.
- Exact dye fixation temperature/time (30°C/80°C from wiki_reactive_dye) — true but a brand-process detail, not a buyer-facing facet; left out to avoid an unsourced-for-listings numeric field.
- Shelf life / expiration — not consistently documented across media; left out.

Corrections: none (single clean build).

Corrections (2026-10-26):
- Added facet `heavy_metal_pigment_free` (cadmium/heavy-metal content) — confirmed as a standing Dick Blick filter ("Cadmium Free Acrylic Paint"/"Cadmium Free Gouache"), distinct from the ACMI AP/CL seal; sourced to dickblick_cadmium_free + wiki_cadmium_pigments.
- Added facet `wash_colorfastness` for the dye branch — fastness-to-laundering is a separate standardized scale from lightfastness (wiki_colourfastness) and tracks dye_class (reactive vs. direct) per wiki_reactive_dye; added to the dye branch's then_ask.
- Reclassified `health_safety_label` and `opacity` from `source: listing` to `researched` — their own backfill_notes already say the field is often absent/rarely stated on the listing.
- Added vocabulary entries for PVA, Casein, Dextrin, Gelatin (all used in `binder_type` values/definition) and Direct/substantive dye and Wash fastness (used in `dye_class`/new facet without a gloss).
- Narrowed `surface_or_fiber`: added a skip_if_known entry and added it to the dye branch's `makes_irrelevant`, since dye is fabric-only and `fiber_compatibility` already asks the real question.
- Softened the Procion MX reference claim — removed the invented "cold-water" gloss, kept only the sourced fact (30°C, the lowest fixation temperature in wiki_reactive_dye's own comparison table).
