{
  "schemaVersion": "2.0.0",
  "name": "Rigid core vinyl specification field dictionary",
  "url": "https://flooringcompared.com/fields",
  "release": "https://flooringcompared.com/data/spec-v1.json",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "releaseShape": {
    "products[].identity": "Brand and the maker’s own line identifier. Together they name the row; the site’s page URL is derived from them.",
    "products[].cells": "One entry per field, keyed by the field names below. Each is a cell; see `cell`. A cell’s `source` is the document its VALUE rests on; a quotation inside `quoted` names its own document, which is not always the same one.",
    "products[].conflicts": "Fields where the two reading passes could not be reconciled, with both readings and the document and read date each came from. A reading’s `quoted` holds only what its document prints; anything this reference added about the reading is in `note` beside it, and how much of a list it holds is in `coverage`.",
    "products[].unread": "Fields no reading pass covered for this product, each with the code and sentence saying why. Not a claim about the manufacturer.",
    "products[].gate": "{opens, missing, queued} — whether the evidence threshold for a page is met, and what is short of it.",
    "products[].badges": "{earned, verdict, count, total, threshold, undeclared, conflicting, unread} per badge: the coverage reached here for that product, published whether or not it is flattering. `earned` is null and `verdict` is \"undecided\" where the slots this reference has not read, or has read twice and could not reconcile, would carry the count over the threshold: no verdict about the manufacturer is published there. See `badgeVerdicts`.",
    "queue": "Every conflict again, flat, so sample.queued can be checked without walking the products. Same rows, matched by brand, line and field.",
    "sample": "Counts over the whole release. cells = green + undeclared + queued + unread. The first two appear under products[].cells, queued under products[].conflicts and unread under products[].unread, so every one of the four can be recounted from the payload.",
    "priceCoverage": "Why no price is published, with the measurement the decision rests on."
  },
  "cell": {
    "value": "The declared figure, normalized to this reference’s unit for the field. Null where the state is not `green`. May be an object: {min,max} for a range, {w,l} for a plank size, {value,condition} where the maker attaches a condition to the number, {value,unit} where the field carries its own unit.",
    "unit": "The unit `value` is expressed in, or null for a field that has none.",
    "state": "One of the four states in `cellStates`.",
    "source": "The document this cell was read from: {url, title, revision, page}. Revision and page are null where the document carries neither.",
    "observedOn": "The date that document was read, in the publisher’s local calendar (America/New_York). Never a future date.",
    "quoted": "The fragments of a document each pass matched, in the maker’s own words and nothing else, each with the document it was quoted from: {text, source, observedOn}. `source` is the fragment’s own document and is NOT always the cell’s — the two passes read different documents, and 116 cells here quote one document while the value rests on another. Never carries its own quotation marks: whose words these are is said by the surface printing them. On an `undeclared` cell it is what the document prints where the field would be, which is often a figure of a different kind. Null where no pass recorded one.",
    "note": "This reference’s own note about the reading: why the normalized value differs from the words the document prints, what the document leaves unsaid around them, or which of several documents the fragment came from. On an `undeclared` cell it is the case for the absence — what was looked at and what was found there instead. Always a whole sentence, and never the maker’s words. Null where the reading needed no note.",
    "coverage": "For the three fields whose value is a list, how much of that list this cell holds: {transcribed, inDocument, verdict}. `transcribed` is the number of entries published, `inDocument` the number the document itself lists, or null where nobody counted it. `verdict` is derived from those two — `complete`, `partial`, `unknown`, or `inconsistent` — never written beside them. Null for every field whose value is not a list.",
    "singleSource": "True where one pass read the value and the other declared it had no document for the field. The figure stands, and rests on one reading rather than two."
  },
  "cellStates": {
    "green": {
      "what": "Two independent reading passes agreed on this value, or one pass read it and the other declared it had no document for the field.",
      "where": "products[].cells"
    },
    "undeclared": {
      "what": "The documents held for this product do not state the field. This is a finding about the maker’s publishing, not a missing value, and it is never a zero. What the reading passes found instead is published with it: the document’s own wording in `quoted` where there was something to quote, and this reference’s sentence in `note`. Twenty-eight of these cells carry neither, because the one pass that held a document recorded the verdict and nothing else.",
      "where": "products[].cells"
    },
    "queued": {
      "what": "The two passes could not be reconciled, so no figure is published. The disagreement itself is published, with both readings and the document each came from.",
      "where": "products[].conflicts and queue — the same rows, per product and flat"
    },
    "unread": {
      "what": "Nobody has read this field for this product yet. It is not published as a cell, because an empty cell would read as the maker declaring nothing — it is published as its own row, with the reason there was no reading, so a consumer can recount sample.unread and see which fields it refers to.",
      "where": "products[].unread"
    }
  },
  "conflictReasons": {
    "values_differ": "two independent reading passes returned different values",
    "one_pass_read": "one reading pass found a value where the other found none",
    "neither_pass_read": "neither reading pass found this field in the documents held",
    "unit_unrecognized": "the two passes reported a unit this reference does not recognize",
    "incommensurable_units": "the two passes read different units that do not measure the same quantity"
  },
  "unreadReasons": {
    "no_pass_held_a_document": "no document held for this product covers this field",
    "sole_pass_did_not_read": "the only pass holding a document for this product did not read the field there",
    "deferred_by_policy": "this field is not collected in this release by a published decision, set out under priceCoverage"
  },
  "badgeVerdicts": {
    "earned": "The declared count reaches the threshold. Whatever is unresolved below it cannot take the badge away.",
    "not_earned": "The declared count cannot reach the threshold even if every unresolved slot resolved in the maker’s favor. This is a finding about the manufacturer.",
    "undecided": "The declared count is short of the threshold, but the slots this reference has not read, or has read twice and could not reconcile, would carry it over. Nothing is decided and no verdict is published."
  },
  "layers": [
    {
      "layer": 0,
      "name": "Identity",
      "what": "Which product the row is about, and in whose words.",
      "whyItMatters": "Every figure below is one manufacturer’s declaration made under its own conditions. Two rows from two brands are two claims, not one measurement, and the identity block is what keeps that visible."
    },
    {
      "layer": 1,
      "name": "Open on the page",
      "what": "What decides whether the floor is right for the room.",
      "whyItMatters": "These are the fields a buyer regrets not reading. They stay unfolded because a reader who has to open something to find the wear layer will not open it."
    },
    {
      "layer": 2,
      "name": "Installation constraints",
      "what": "What the manufacturer requires of the room before the floor goes in.",
      "whyItMatters": "The widest divergence in this dataset and the deepest buried: these numbers live inside a separate installation document, in units that differ between brands. Folded, but in the page. The fold is a reading aid, not a way of hiding data from a crawler."
    },
    {
      "layer": 3,
      "name": "Specification claims",
      "what": "What the product declares against a published standard.",
      "whyItMatters": "A specifier needs the standard, the method and the threshold, not the headline number. A figure quoted without them cannot be carried into a submittal, and this reference will not print one that way."
    }
  ],
  "mandatory": [
    "brand",
    "collection",
    "mfr_line_id",
    "plank_size_w_l",
    "core_family",
    "wear_layer_mil",
    "total_thickness_mm",
    "attached_pad",
    "locking_system",
    "warranty_res_years"
  ],
  "badges": {
    "install": {
      "threshold": 7,
      "fields": [
        "max_span",
        "perimeter_gap_in",
        "subfloor_rh_limit_pct",
        "subfloor_cacl_limit_lb",
        "flatness_tolerance",
        "radiant_max_surface_temp_f",
        "service_temp_range_f",
        "acclimation_hours",
        "glue_down_permitted",
        "poly_vapor_barrier_required"
      ]
    },
    "spec": {
      "threshold": 4,
      "fields": [
        "astm_product_standard",
        "e648_flux_wcm2",
        "f970_psi",
        "dcof_value",
        "d4060_cycles",
        "iic_value"
      ]
    }
  },
  "fields": [
    {
      "field": "brand",
      "layer": 0,
      "label": "Brand",
      "js": "string",
      "unit": null,
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "The manufacturer whose document the row is read from.",
      "whyItMatters": "Every declaration below is that manufacturer’s, made under its own test conditions. Rows from two brands are two claims, not one measurement.",
      "publishedInRelease": true
    },
    {
      "field": "collection",
      "layer": 0,
      "label": "Collection",
      "js": "string",
      "unit": null,
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "The product line the plank belongs to.",
      "whyItMatters": "Specifications are published per collection, not per color. Two colors of one collection share every number on this page.",
      "publishedInRelease": true
    },
    {
      "field": "mfr_line_id",
      "layer": 0,
      "label": "Product line",
      "js": "string",
      "unit": null,
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "The manufacturer’s identifier for the specification-bearing product line: a code where one is published, otherwise the collection name with its plank size.",
      "whyItMatters": "This is the unit a specification actually describes. Makers publish one data sheet per line and per plank size, and the color underneath it changes no declared figure — so a row here is Cyrus 7x48 rather than one of its forty colors. Publishing forty identical rows would say the reference holds forty facts when it holds one.",
      "publishedInRelease": true
    },
    {
      "field": "plank_size_w_l",
      "layer": 0,
      "label": "Plank size",
      "js": "object",
      "unit": "in",
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "Face width and length of a single plank.",
      "whyItMatters": "Width drives how a room reads and how many seams it carries; length drives waste on a short run and the offset rule in the warranty.",
      "publishedInRelease": true
    },
    {
      "field": "sqft_per_carton",
      "layer": 0,
      "label": "Sq ft per carton",
      "js": "number",
      "unit": "sq ft",
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "Coverage of one full carton, where the manufacturer declares it.",
      "whyItMatters": "Material is bought in whole cartons, so this decides what a small room actually costs — but it is a packaging fact rather than a specification, and most makers publish it on a retailer-facing listing rather than in the technical documents this reference reads. Where it is not in those documents it is recorded as undeclared, because the alternative is sourcing it from a seller, which this reference does not do.",
      "publishedInRelease": true
    },
    {
      "field": "core_family",
      "layer": 0,
      "label": "Core",
      "js": "string",
      "unit": null,
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "What the maker says the core is: SPC (stone-plastic composite), WPC (wood-plastic composite), or a rigid polymeric core declared without naming which.",
      "whyItMatters": "SPC is denser and telegraphs subfloor imperfection less; WPC is softer and warmer underfoot, and the two behave differently over an uneven slab and under a rolling load. Not every maker says which it has: some declare only a \"rigid polymeric core\" against ASTM F3261, and that is recorded as it stands rather than resolved into a guess.",
      "publishedInRelease": true
    },
    {
      "field": "wear_layer_mil",
      "layer": 1,
      "label": "Wear layer",
      "js": "number",
      "unit": "mil",
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "Thickness of the clear layer above the print film, in thousandths of an inch.",
      "whyItMatters": "This is the only part of the plank that takes wear, and it is the number most often confused with total thickness. 12 mil is 0.305 mm; an 8 mm plank can carry a 6 mil wear layer.",
      "publishedInRelease": true
    },
    {
      "field": "wear_layer_chemistry",
      "layer": 1,
      "label": "Wear layer finish",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "What the wear layer is reinforced with, if the manufacturer declares it — urethane, aluminum oxide, ceramic bead.",
      "whyItMatters": "Reinforcement changes scratch behavior more than thickness does. An unreinforced 20 mil layer can scuff faster than a ceramic-bead 12 mil one, and no table publishes the two side by side.",
      "publishedInRelease": true
    },
    {
      "field": "core_thickness_mm",
      "layer": 1,
      "label": "Core thickness",
      "js": "number",
      "unit": "mm",
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Thickness of the rigid core alone, excluding any attached pad.",
      "whyItMatters": "Where a pad is attached, total thickness overstates the structural part. Two 8 mm products can carry 6 mm and 8 mm of core.",
      "publishedInRelease": true
    },
    {
      "field": "total_thickness_mm",
      "layer": 1,
      "label": "Total thickness",
      "js": "number",
      "unit": "mm",
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "Overall thickness including the attached pad, as the manufacturer states it.",
      "whyItMatters": "Sets the transition height against neighboring floors and the clearance under a door. It is not a durability figure.",
      "publishedInRelease": true
    },
    {
      "field": "attached_pad",
      "layer": 1,
      "label": "Attached pad",
      "js": "boolean",
      "unit": null,
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "Whether a pad is bonded to the underside at the factory.",
      "whyItMatters": "An attached pad usually forbids a second underlayment. Adding one anyway is a common way to void a warranty.",
      "publishedInRelease": true
    },
    {
      "field": "pad_material",
      "layer": 1,
      "label": "Pad material",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "What the attached pad is made of — IXPE, EVA, cork, felt.",
      "whyItMatters": "Most tables collapse this to “pad: yes”. Cork behaves differently over an alkaline slab than a closed-cell foam does, and the difference only appears years later.",
      "publishedInRelease": true
    },
    {
      "field": "pad_thickness_mm",
      "layer": 1,
      "label": "Pad thickness",
      "js": "number",
      "unit": "mm",
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Thickness of the attached pad.",
      "whyItMatters": "Subtracted from total thickness it gives the structural core, and it is part of any acoustic figure the manufacturer quotes.",
      "publishedInRelease": true
    },
    {
      "field": "locking_system",
      "layer": 1,
      "label": "Locking system",
      "js": "string",
      "unit": null,
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "The joint mechanism by name and generation — Välinge 5G, Unilin Uniclic, I4F, or an unnamed drop-lock.",
      "whyItMatters": "The single loudest warning from installers, and a column no consumer table carries. The joint decides how the last row goes in, whether a damaged plank can be replaced, and how the floor behaves when it is walked before it settles.",
      "publishedInRelease": true
    },
    {
      "field": "edge_profile",
      "layer": 1,
      "label": "Edge profile",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "How the plank edge is finished — square, micro-bevel, painted bevel, four-sided or two-sided.",
      "whyItMatters": "A bevel hides small height differences between planks and collects grit; a square edge shows subfloor waves and cleans easily.",
      "publishedInRelease": true
    },
    {
      "field": "pattern_repeat_count",
      "layer": 1,
      "label": "Unique planks",
      "js": "number",
      "unit": "planks",
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "How many distinct plank faces exist before the pattern repeats.",
      "whyItMatters": "A low count is the complaint behind most one-star reviews of an otherwise sound floor, and almost no manufacturer publishes it. Absence of a declaration is itself the finding.",
      "publishedInRelease": true
    },
    {
      "field": "warranty_res_years",
      "layer": 1,
      "label": "Residential warranty",
      "js": "number|string",
      "unit": "years",
      "mandatory": true,
      "audience": "both",
      "badge": null,
      "what": "Stated residential wear warranty term. A number of years, or the literal value \"lifetime\" where that is the term the manufacturer publishes.",
      "whyItMatters": "The headline number, and the least informative one. \"Lifetime\" is a term of art, not a duration: it is limited, usually non-transferable, and covers material rather than the cost of taking the old floor up. What the warranty excludes matters more than how long it runs.",
      "publishedInRelease": true
    },
    {
      "field": "warranty_light_com_years",
      "layer": 1,
      "label": "Light commercial warranty",
      "js": "number",
      "unit": "years",
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "Stated light commercial wear warranty term, in years.",
      "whyItMatters": "The tier most rigid core products actually carry, and the one most often quoted as though it were the commercial term. A product with a light commercial warranty and no commercial warranty is not rated for a commercial floor, whatever the marketing says.",
      "publishedInRelease": true
    },
    {
      "field": "warranty_com_years",
      "layer": 1,
      "label": "Commercial warranty",
      "js": "number",
      "unit": "years",
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Stated commercial wear warranty term, in years.",
      "whyItMatters": "A verifiable substitute for the unstandardised phrase “heavy commercial”, which no ASTM standard defines.",
      "publishedInRelease": true
    },
    {
      "field": "warranty_prorated",
      "layer": 1,
      "label": "Prorated",
      "js": "boolean",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "Whether the remedy declines over the term.",
      "whyItMatters": "A prorated lifetime warranty in year twelve is worth a fraction of its headline. This is where the word “lifetime” does its work.",
      "publishedInRelease": true
    },
    {
      "field": "warranty_labor_covered",
      "layer": 1,
      "label": "Labor covered",
      "js": "boolean",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "Whether the warranty pays to remove and refit, or only replaces material.",
      "whyItMatters": "On a failed floor the fitting is usually the larger cost. Most residential warranties exclude it, and few tables say so.",
      "publishedInRelease": true
    },
    {
      "field": "warranty_exclusions",
      "layer": 1,
      "label": "Excluded",
      "js": "array",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "The named exclusions, quoted from the warranty document. The cell’s `coverage` says how many of the document’s own entries these are, and `unknown` there means nobody counted them.",
      "whyItMatters": "This is the comparison that changes decisions: sunlight and UV, castor wheels, rubber-backed mats, radiant heat above a stated temperature, and plank offset rules that fail a 50% stagger.",
      "publishedInRelease": true
    },
    {
      "field": "price_band",
      "layer": 1,
      "label": "Published price band",
      "js": "object",
      "unit": "USD/sq ft",
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "deferred": "priceCoverage",
      "what": "The manufacturer’s own published advertised-price floor and suggested retail, with the document it came from and the date it was read.",
      "whyItMatters": "A minimum advertised price is a rule about advertising, not a transaction price. It is published by the manufacturer and can be cited; a single street price cannot.",
      "publishedInRelease": true
    },
    {
      "field": "max_span",
      "layer": 2,
      "label": "Max run without a transition",
      "js": "object",
      "unit": "linear ft or sq ft",
      "unitVaries": true,
      "units": [
        "linear ft",
        "sq ft"
      ],
      "mandatory": false,
      "audience": "both",
      "badge": "install",
      "what": "The largest continuous field the manufacturer permits before an expansion break is required, in the unit it declares.",
      "whyItMatters": "Makers disagree about this more widely than about anything else on the sheet, and they bury it deepest — some declare a length, some an area, so two products cannot be read against each other without stating the assumption that bridges the units.",
      "publishedInRelease": true
    },
    {
      "field": "perimeter_gap_in",
      "layer": 2,
      "label": "Perimeter expansion gap",
      "js": "object",
      "unit": "in",
      "mandatory": false,
      "audience": "both",
      "badge": "install",
      "what": "Required clearance at every vertical surface, including any larger gap demanded beyond a stated run.",
      "whyItMatters": "Too small a gap is the most common cause of peaking in a floor that is otherwise correctly installed, and the requirement is often conditional on the run length.",
      "publishedInRelease": true
    },
    {
      "field": "subfloor_rh_limit_pct",
      "layer": 2,
      "label": "Subfloor RH limit",
      "js": "number",
      "unit": "% RH",
      "mandatory": false,
      "audience": "pro",
      "badge": "install",
      "what": "Maximum relative humidity inside the slab, as the maker declares it.",
      "whyItMatters": "One of two moisture limits that are not interchangeable. A slab can pass the probe test and fail the calcium chloride test.",
      "publishedInRelease": true
    },
    {
      "field": "subfloor_rh_method",
      "layer": 2,
      "label": "RH test method",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "The standard the maker names for that humidity reading, quoted as the maker writes it.",
      "whyItMatters": "Six of eight makers here name ASTM F2170; one writes only “in-situ probe” and names no standard at all; one prints the designation without its letter. A reference that stamps the same standard on all of them reports its own inference as the maker’s declaration.",
      "publishedInRelease": true
    },
    {
      "field": "subfloor_cacl_limit_lb",
      "layer": 2,
      "label": "Subfloor MVER limit",
      "js": "number",
      "unit": "lb/1000 sq ft/24h",
      "mandatory": false,
      "audience": "pro",
      "badge": "install",
      "what": "Maximum moisture vapor emission rate, as the maker declares it.",
      "whyItMatters": "Declared limits across brands range from 3 to 20 lb. The number is only meaningful next to the method, and the methods do not convert.",
      "publishedInRelease": true
    },
    {
      "field": "subfloor_cacl_method",
      "layer": 2,
      "label": "MVER test method",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "The standard the maker names for that emission reading, quoted as the maker writes it.",
      "whyItMatters": "One maker permits “calcium chloride or equivalent” without saying what counts as equivalent, and another sets a ceiling four times anyone else’s while naming no test at all. Neither figure can be checked against a figure taken to ASTM F1869.",
      "publishedInRelease": true
    },
    {
      "field": "subfloor_ph_range",
      "layer": 2,
      "label": "Subfloor pH range",
      "js": "string",
      "unit": "pH",
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Permitted alkalinity of the slab surface.",
      "whyItMatters": "An alkaline slab attacks adhesives and some pad materials. Rarely declared, and never comparable without the pad material next to it.",
      "publishedInRelease": true
    },
    {
      "field": "flatness_tolerance",
      "layer": 2,
      "label": "Subfloor flatness",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": "install",
      "what": "Permitted deviation over a stated span, as declared — typically 3/16 in over 10 ft.",
      "whyItMatters": "A rigid core bridges a hollow instead of following it, so the joint takes the load. Flatness failures show up as clicking and separated seams months later.",
      "publishedInRelease": true
    },
    {
      "field": "radiant_max_surface_temp_f",
      "layer": 2,
      "label": "Radiant heat limit",
      "js": "number",
      "unit": "°F",
      "mandatory": false,
      "audience": "both",
      "badge": "install",
      "what": "Maximum permitted floor surface temperature over radiant heating.",
      "whyItMatters": "Exceeding it is an explicit warranty exclusion in most documents, and the limit is a surface temperature rather than a thermostat setting.",
      "publishedInRelease": true
    },
    {
      "field": "service_temp_range_f",
      "layer": 2,
      "label": "Service temperature range",
      "js": "object",
      "unit": "°F",
      "mandatory": false,
      "audience": "both",
      "badge": "install",
      "what": "The ambient band the floor must be kept within after installation.",
      "whyItMatters": "The clause that catches holiday homes and unheated rooms: a floor left outside the band can move enough to void the warranty even if nobody walked on it.",
      "publishedInRelease": true
    },
    {
      "field": "acclimation_hours",
      "layer": 2,
      "label": "Acclimation",
      "js": "number",
      "unit": "hours",
      "mandatory": false,
      "audience": "both",
      "badge": "install",
      "what": "How long the material must sit in the room before it is laid.",
      "whyItMatters": "Ranges from none to two days across brands. Skipping a required period is both an install fault and a documented exclusion.",
      "publishedInRelease": true
    },
    {
      "field": "glue_down_permitted",
      "layer": 2,
      "label": "Glue-down permitted",
      "js": "boolean",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": "install",
      "what": "Whether the product may be fully adhered as well as floated.",
      "whyItMatters": "Large commercial fields and rooms with wide temperature swings often require adhesion, and not every rigid core is approved for it.",
      "publishedInRelease": true
    },
    {
      "field": "adhesive_compatibility",
      "layer": 2,
      "label": "Approved adhesives",
      "js": "array",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Adhesives the manufacturer names as approved. The cell’s `coverage` says whether this is the document’s whole list; on every product here it is `unknown`.",
      "whyItMatters": "Using an unnamed adhesive voids the warranty even when the floor performs. The named list is short and brand-specific.",
      "publishedInRelease": true
    },
    {
      "field": "three_season_room",
      "layer": 2,
      "label": "Three-season room",
      "js": "boolean",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "Whether the product is approved for an unconditioned or partly conditioned space.",
      "whyItMatters": "Sunrooms and enclosed porches sit outside the service temperature band for part of the year, and approval is the exception rather than the rule.",
      "publishedInRelease": true
    },
    {
      "field": "poly_vapor_barrier_required",
      "layer": 2,
      "label": "Vapor barrier required",
      "js": "boolean",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": "install",
      "what": "Whether a polyethylene sheet is required over concrete regardless of the moisture reading.",
      "whyItMatters": "Some brands require it unconditionally; others only past a moisture threshold. Omitting a required barrier is a documented exclusion.",
      "publishedInRelease": true
    },
    {
      "field": "uv_clause_text",
      "layer": 2,
      "label": "Sunlight clause",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "The warranty’s wording on direct sunlight, fading and heat build-up, quoted.",
      "whyItMatters": "Discoloration and expansion behind glass is the most frequent rejected claim, and the clause is nearly always narrower than buyers expect.",
      "publishedInRelease": true
    },
    {
      "field": "astm_product_standard",
      "layer": 3,
      "label": "ASTM product standard",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": "spec",
      "what": "The product standard claimed — ASTM F3261 for rigid core, ASTM F1700 for flexible LVT.",
      "whyItMatters": "The first thing a specification writer checks and the first thing a marketing sheet leaves out. F3261 also sets the dimensional stability limit: 0.2% commercial against 0.25% residential.",
      "publishedInRelease": true
    },
    {
      "field": "f3261_grade",
      "layer": 3,
      "label": "F3261 grade",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "The grade claimed within ASTM F3261.",
      "whyItMatters": "Grade 1 Commercial carries a wear layer floor of 0.020 in. It is a verifiable substitute for the phrase “heavy commercial”, which the standard does not define.",
      "publishedInRelease": true
    },
    {
      "field": "e648_flux_wcm2",
      "layer": 3,
      "label": "Critical radiant flux",
      "js": "number",
      "unit": "W/cm²",
      "mandatory": false,
      "audience": "pro",
      "badge": "spec",
      "what": "Flooring radiant panel result to ASTM E648.",
      "whyItMatters": "Drives the building-code class. Class I is 0.45 W/cm² and above, Class II is 0.22 and above; corridors and exits are specified by class, not by brand.",
      "publishedInRelease": true
    },
    {
      "field": "e648_class",
      "layer": 3,
      "label": "E648 class",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "The class derived from the flux figure.",
      "whyItMatters": "Published as a class by some brands and as a raw flux by others; the class is derived here so the two can be read in one column.",
      "publishedInRelease": true
    },
    {
      "field": "f970_psi",
      "layer": 3,
      "label": "Static load limit",
      "js": "number",
      "unit": "psi",
      "mandatory": false,
      "audience": "pro",
      "badge": "spec",
      "what": "Static load to ASTM F970 at the manufacturer’s reported threshold.",
      "whyItMatters": "The same standard is reported at different thresholds — 400, 700 and 1000 psi all appear — so the number is only comparable next to the threshold it was measured at.",
      "publishedInRelease": true
    },
    {
      "field": "f970_indent_in",
      "layer": 3,
      "label": "F970 indentation",
      "js": "number",
      "unit": "in",
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Residual indentation recorded in the F970 test.",
      "whyItMatters": "What the psi figure actually bought. Without it the load figure is a pass mark with no margin attached.",
      "publishedInRelease": true
    },
    {
      "field": "dcof_value",
      "layer": 3,
      "label": "Slip resistance",
      "js": "number",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": "spec",
      "what": "Coefficient of friction as declared.",
      "whyItMatters": "Useless without its method. ANSI A326.3 wet DCOF, ASTM D2047 dry SCOF and the withdrawn C1028 produce different numbers from the same floor.",
      "publishedInRelease": true
    },
    {
      "field": "dcof_method",
      "layer": 3,
      "label": "Slip test method",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Which slip standard the figure was produced under.",
      "whyItMatters": "A specification that names a threshold without naming a method cannot be enforced, and 0.42 is a threshold inside ANSI A326.3 — not a universal accessibility requirement.",
      "publishedInRelease": true
    },
    {
      "field": "dcof_condition",
      "layer": 3,
      "label": "Slip test condition",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Wet or dry, as tested.",
      "whyItMatters": "A dry figure quoted where a wet one is required is the most common substitution in submittal packages.",
      "publishedInRelease": true
    },
    {
      "field": "d4060_cycles",
      "layer": 3,
      "label": "Abrasion cycles",
      "js": "number",
      "unit": "cycles",
      "mandatory": false,
      "audience": "pro",
      "badge": "spec",
      "what": "Taber abrasion result to ASTM D4060, with the wheel and load as declared.",
      "whyItMatters": "The only laboratory number that speaks to wear directly, and the only honest check on a wear-layer figure quoted alone.",
      "publishedInRelease": true
    },
    {
      "field": "iic_value",
      "layer": 3,
      "label": "Impact insulation class",
      "js": "number",
      "unit": "IIC",
      "mandatory": false,
      "audience": "pro",
      "badge": "spec",
      "what": "Impact insulation class as declared.",
      "whyItMatters": "Meaningless without the assembly it was tested on. The same plank scores differently over a wood joist deck and a six-inch concrete slab, and brands rarely print which one they used.",
      "publishedInRelease": true
    },
    {
      "field": "iic_assembly",
      "layer": 3,
      "label": "IIC assembly",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "The floor-ceiling assembly the IIC figure was measured on.",
      "whyItMatters": "The missing half of every acoustic claim on a product page. Where it is absent, the figure cannot be carried into a specification.",
      "publishedInRelease": true
    },
    {
      "field": "stc_value",
      "layer": 3,
      "label": "Sound transmission class",
      "js": "number",
      "unit": "STC",
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Airborne sound transmission class as declared.",
      "whyItMatters": "Subject to the same assembly dependency as IIC, and quoted just as often without it.",
      "publishedInRelease": true
    },
    {
      "field": "stc_assembly",
      "layer": 3,
      "label": "STC assembly",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "The assembly the STC figure was measured on.",
      "whyItMatters": "Without it the number cannot be compared with another brand’s number, let alone with a code requirement.",
      "publishedInRelease": true
    },
    {
      "field": "certifications",
      "layer": 3,
      "label": "Certifications",
      "js": "array",
      "unit": null,
      "mandatory": false,
      "audience": "both",
      "badge": null,
      "what": "Third-party marks the manufacturer claims — FloorScore, GREENGUARD Gold, and similar. The cell’s `coverage` says whether this is the document’s whole list; on every product here it is `unknown`.",
      "whyItMatters": "Emissions marks are the only claims here verified by someone other than the manufacturer, and each certifies a different thing.",
      "publishedInRelease": true
    },
    {
      "field": "epd_hpd",
      "layer": 3,
      "label": "EPD / HPD",
      "js": "boolean",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "Whether an environmental or health product declaration is published.",
      "whyItMatters": "Required for several green building credits, and a declaration either exists as a document or does not.",
      "publishedInRelease": true
    },
    {
      "field": "commercial_class_claim",
      "layer": 3,
      "label": "Commercial class claimed",
      "js": "string",
      "unit": null,
      "mandatory": false,
      "audience": "pro",
      "badge": null,
      "what": "The commercial duty wording the manufacturer uses, recorded verbatim as a claim.",
      "whyItMatters": "Recorded, not ranked: ASTM F3261 defines no light, medium or heavy commercial tiers, so the phrase is a marketing claim and is presented as one.",
      "publishedInRelease": true
    }
  ]
}
