Methodology
How Courtside Pro builds, scores, and surfaces hardwood maple sports floor intelligence. Updated .
Product Intelligence Score (PIS)
- Current illustrative demo uses
m=7as the category shrinkage strength. - Trust weight can reach
1.75through the configured base and evidence flags. - Evidence bonuses are additive and capped at
0.23; the final score is capped at5.0. - The current demo renders product scores from illustrative inputs, not a live subscriber dataset.
- Job linkage is represented in current data but is not a current eligibility gate in this demo.
PIS is a deterministic demonstration of shrinkage toward a category prior. It should not be read as a verified field or subscriber score. Stronger field-scoring controls and subscriber scoring are not live.
Floor Life Index (FLI)
- The 62 / 80-year lifespan caps by thickness are Courtside internal planning assumptions, not MFMA or NWFA maximums. MFMA's public pages describe longer lives: typically over 75 years for a well-maintained 25/32" floor, and over 100 years is not uncommon for 33/32" (see Sources).
- The only publisher figures the model uses are MFMA's up to six sandings for 25/32" maple and its limit of no more than 1/32" removed per sanding.
- Deterministic calculation from thickness, sanding history, and environmental factors
- Two-population lifecycle model remains a deterministic research visualization, not a live fleet forecast.
FLI returns remaining-years estimates and a maintenance trajectory. The two-population model assumes that most maple floors are replaced for non-wear reasons (water, demolition, deferred maintenance) long before they wear out. MFMA states that "less than one percent of replacement floors are necessitated by depleted wear surface" (MFMA Open Letter, checked September 28, 2026); MFMA publishes no sample or method for that statistic, so the page treats it as MFMA's stated position.
Floor Intelligence model (floor-intel-v4l-20260928)
The Floor Health Score and Floor Life Index share one versioned model constant (FLOOR_INTEL_MODEL_VERSION). Worked examples are generated from the production scorer into scripts/fixtures/model-reproducibility-v1/; contract tests fail if scoring constants change without a version bump.
Inputs & defaults
| Input | Default | Required |
|---|---|---|
| Year installed | — | Yes (without it the floor is incomplete) |
| Times sanded | 0 | No |
| Thickness | 25/32" | No |
| Multi-use | false | No |
| Has cover | not recorded: no no-cover deduction, and a multi-use floor gets the 10-year sand interval (8 years only when recorded as no cover) | No |
| HVAC year-round | true | No |
| Measured thickness | — | No (25/32" only) |
| Year last sanded | unknown | No |
| Job history | [] | No |
Branches
- Thickness: 33/32" → max 10 sandings, 80-year lifespan cap (both internal planning assumptions); 25/32" → max 6 sandings (MFMA guidance, conditional on proper maintenance and skilled sanding), 62-year lifespan cap (internal planning assumption).
- Usage sand interval (internal planning assumption): heavy (multi-use, no cover) = 8 yr; medium (multi-use + cover) = 9 yr; light = 10 yr. The values sit inside MFMA's 8–12-year sanding example; the mapping to use level is Courtside's.
- Year-precision dates: legacy January 1 records anchor to July 1; recoat-overdue deduction capped at 15 points.
- Measured thickness (25/32" only): remaining sandings from a 0.578" minimum serviceable thickness (internal planning assumption derived from secondary research on NWFA wear-layer geometry; NWFA's guidelines are member publications and were not verified) and 0.03125" (1/32") removal per sand (MFMA: subsequent sandings should remove no more than 1/32").
- Unknown sand/service history (4.A): missing history is unknown evidence — overdue tiers apply only when a date is recorded. A floor with no sand on record is never counted as sand-due, and its next sand is shown as unknown rather than left blank or estimated.
- Floor-cover risk text (2.F,
floor-intel-v4l-20260928): the no-cover risk no longer tells users to check "cover/finish compatibility guidance"; MFMA publishes no such guidance. It keeps MFMA's cure-time check and its caution against leaving covers down for long. No score, threshold or weight changed. - Year last sanded without a recoat year (4.A,
floor-intel-v4k-20260928): a year entered for the last sanding is evidence of that sanding only. It drives the sand-cycle tiers, but it is not evidence that nothing was done since, so it does not start the recoat-freshness clock; last service stays a missing input, confidence stays below high, and a planning range is shown. A recoat year or a crew-logged job restores the recoat tiers. A projected next-sand year already in the past is shown as overdue, never as a projection.
Deductions & caps
| Tier | Points | Cap / notes |
|---|---|---|
| Recoat overdue (>1 yr, exact date) | −30 | Year-precision cap −15 |
| Recoat due (>9 mo) | −15 | — |
| Recoat approaching (>6 mo) | −5 | — |
| Sand cycle overdue | −20 | Requires recorded sand date |
| Sand cycle due soon | −12 | — |
| Sand cycle approaching | −5 | — |
| No / 1 / 2 sandings remaining | −15 / −10 / −5 | — |
| HVAC not year-round | −12 | — |
| No cover for multi-use | −8 | — |
| Tape damage history | −5 | — |
| Floor age >40 yr (25/32") | −3 | — |
| Contractor condition flags | variable | Bucket cap −20 |
| Photo documentation | variable | Bucket cap −10; scoring disabled in current app |
Rounding
- Health score: clamp to 0–100 after summing deductions.
- Sand due in months:
max(0, round((interval − yearsSinceLastSand) × 12)). - Measured sandings:
floor((measured − 0.578) / 0.03125), capped by nominal remaining. - FLI remaining years:
max(0, min(pathA_years, maxLife − floorAge)). - Planning range (thin evidence): center ±4 / +6 years on remaining life; health band 45–95.
Constants and behavior not previously documented on this page
Audited 2026-09-15 against app.jsx; the model block now lives in floor-life.js. These exist in the shipped model block (covered by the constants hash above) but were missing from this page before this update.
| Observation | Points | Window |
|---|---|---|
| Buckling / cupping | 8 | all history |
| Rotted / punky board | 8 | all history |
| Water damage | 7 | all history |
| Hot / humid coating conditions | 5 | all history (deduped against the HVAC risk deduction) |
| Cracked / broken boards | 4 | all history |
| Pre-existing peeling | 4 | since last sand/install |
| Recoat delamination | 4 | since last sand/install |
| Finish chipping / flaking | 3 | since last sand/install |
| Loss of sheen | 3 | since last sand/install |
| Scalloping / cup and crown | 3 | since last sand/install |
| Cover plate seating issue | 2 | all history |
| Prior repair / patch | 2 | all history |
| Rough / gritty cure | 2 | since last sand/install |
| Yellowing / ambering | 2 | since last sand/install |
| Maintenance film / residue | 2 | since last sand/install |
| Poly beads / extrusion | 1 | since last sand/install |
| Foreign material | 1 | since last sand/install |
| Marked ready to refinish | 5 | since last sand/install (contractor-reported refinish_due) |
Rationale (floor-life.js, comment above FLOOR_HEALTH_CONDITION_RULES): "Structural/moisture observations survive a refinish; finish, wear, and process observations reset after the newest sand/install." Individual point weights per observation were approved by the owner in business-rules §1.1C (2026-07-09) as a scoring design; they are not calibrated to measured outcomes (see the decision record).
| Signal | Points |
|---|---|
| Possible water-related change | 4 |
| Board deformation | 3 |
| Finish peeling | 3 |
| Traffic wear | 2 |
| Tape damage | 2 |
| Uneven sheen | 1 |
| Yellowing | 1 |
| Finish texture issue | 1 |
| Game-line degradation | 1 |
These weights are inert: FLOOR_HEALTH_PHOTO_SCORING_ENABLED = false (floor-life.js) keeps every photo deduction at 0 regardless of the table above. Eligibility gates it would need once enabled — severity ≥ 3, model confidence ≥ 0.85, capture quality ≥ 0.75, analysis confidence ≥ 0.75, at least 2 corroborating photos (floor-life.js) — approved by the owner in business-rules §1.1D (2026-07-15); scoring stays off until it is enabled deliberately (see the decision record).
Sand-cycle urgency ratio thresholds (computeFloorIntel in floor-life.js): the table above names the tiers; the exact ratio is yearsSinceLastSand / sandInterval against >1.0 (overdue, −20), >0.8 (due soon, −12), >0.6 (approaching, −5). Owner-approved baseline (business-rules §1.1C, 2026-07-09); a scoring design, not a published standard.
Recoat-freshness day thresholds (computeFloorIntel in floor-life.js): exactly daysSinceService > 365 / > 270 / > 180, matching the ">1 yr / >9 mo / >6 mo" prose above. No separate rationale beyond the deduction comment.
Confirmed-service precedence (computeFloorIntel in floor-life.js, business-rules §1.1C/§1.1E): when a non-superseded confirmed-service event is on file, the effective "days since service" used for the recoat-freshness deduction is the NEWER of the contractor-reported job date and the confirmed event date — recency can only improve, never worsen, the score. This is production behavior that materially changes deduction inputs and was not previously named on this page.
Methodology classes
Every numeric floor-intelligence rule is mapped to exactly one class in the committed registry (scripts/floor-intel-methodology-registry.js). Contract tests fail if a nonzero numeric literal or numeric-only string in the model's scoring block is not registered, or is registered twice. The literal zero and numbers inside descriptive text are not checked.
- Outside guidance — a figure a publisher states on a public page, cited below with its scope: MFMA's up to six sandings for 25/32" maple and its 1/32" per-sanding removal limit. Nothing else in the model is outside guidance.
- User fact — values supplied by the facility or contractor (year installed, times sanded, thickness, use, cover, HVAC, measured thickness, job history).
- Planning assumption — Courtside-owned lifecycle bounds: the 62 / 80-year lifespan caps, the 33/32" sanding count, the usage sanding intervals, the 0.578" minimum serviceable thickness, and the thin-evidence planning ranges.
- Chosen weight — Courtside-chosen scoring weights and thresholds: every deduction, bucket cap, day and ratio threshold, photo-evidence gate, risk trigger, and health-state band. These are product scoring choices with a recorded owner decision (below), not published standards, and not calibrated to measured floor outcomes.
- Calculated — outputs derived from the rules above (health score, remaining years, projected sand and replacement years, measured sandings). A calculated output has a formula, not a chosen value.
Decision record for planning assumptions and chosen weights
Every planning assumption, chosen weight, and publisher figure the model uses as a value has one recorded decision: its status, accountable owner, where it was recorded, and why. Accepted means the owner approved it as a Courtside scoring or planning choice, not that it is a published standard or calibrated to measured floor outcomes. Accepted-interim means a later decision replaces it once implemented. Pending means an open question for the owner; the value stays in the model, labeled a planning assumption, until it is answered. Generated from scripts/floor-intel-methodology-registry.js.
| Rules covered | Status | Owner, date | Recorded in | Reason |
|---|---|---|---|---|
| Recoat overdue after 365 days; Recoat overdue deduction (exact date) −30; Recoat due after 270 days −15; and 11 more | accepted | Logan, 2026-07-09 | docs/business-rules.md §1.1C, "Baseline (v1)" | Owner-approved v1 health-score baseline: recoat-freshness, sand-cycle-urgency and remaining-sandings tiers plus the HVAC, cover, tape and 40-year age deductions, codified from the implementation. Magnitudes are a scoring design, not calibrated to measured floor outcomes. |
| Contractor condition bucket cap −20; Buckling / cupping; Rotted / punky board; and 16 more | accepted | Logan, 2026-07-09 | docs/business-rules.md §1.1C, "Change 1 — Condition-flag deductions" | Owner-approved contractor condition weights by class (structural and moisture over all history; finish, wear and process since the last sand) with a −20 bucket cap. |
| January 1 dates treated as year-only records; Year-only dates anchored to July 1; Recoat overdue deduction (year-only date) −15 | accepted | Logan, 2026-07-09 | docs/business-rules.md §1.1C, "Change 2 — Date-precision semantics" | January 1 dates are year-only backfill; they anchor at July 1 and cap recoat freshness at the −15 tier. Known cost (a genuine January 1 job is treated as year-only) accepted in the record. |
| Photo documentation bucket cap −10 (scoring disabled); Photo capture quality ≥ 0.75; Photo analysis confidence ≥ 0.75; and 11 more | accepted | Logan, 2026-07-15 | docs/business-rules.md §1.1D | Owner-approved bounded photo-evidence bucket (−10 cap) and eligibility gates. Scoring stays disabled (FLOOR_HEALTH_PHOTO_SCORING_ENABLED = false). The code omits §1.1D's strong single-photo branch (severity ≥ 4, confidence ≥ 0.90), which is stricter than the record. |
| Lifespan cap 25/32"; Lifespan cap 33/32" | accepted | Logan (by delegation), 2026-09-27 | outputs/courtside-81-external-actions-packet.md §1, row "2.E / 4.E" (2026-09-27) | Q1: keep the 62- and 80-year planning caps. Both sit below MFMA's published typical lifespans (over 75 years for 25/32"; over 100 years "not uncommon" for 33/32"), so remaining-life projections err short. A planning cap, not a claim about how long floors last. |
| Sand interval heavy / medium / light (8 / 9 / 10 yr) | accepted | Logan (by delegation), 2026-09-27 | outputs/courtside-81-external-actions-packet.md §1, row "2.E / 4.E" (2026-09-27) | Q3: the 8 / 9 / 10-year intervals sit inside MFMA's 8–12-year sanding example; mapping them to heavy / medium / light use is Courtside's choice. |
| Max sandings 25/32"; Removal per sand (1/32") | accepted-interim | Logan (by delegation), 2026-09-27 | outputs/courtside-81-external-actions-packet.md §1, row "2.E / 4.E" (2026-09-27) | Q4: use MFMA's public figures as point values (up to six sandings for 25/32"; each sanding removes the full 1/32" limit). These are the optimistic endpoints: MFMA's "The Use of 33/32 Material" statement says a 25/32" floor "will provide four to six additional sandings after installation", and NWFA's technical VP writes that "A traditional sand job will remove 1/32” to 1/16”" (Hardwood Floors, 2025). Superseded when implemented by: Banded FLI decision of 2026-07-29 (docs/backlog.md, "Banded FLI remaining-sandings display"): low bound 4 sandings at 1/16" drives phase and risk. Direction decided, not implemented. |
| Max sandings 33/32" | pending | Logan, 2026-09-27 | outputs/courtside-81-external-actions-packet.md §1, row "2.E / 4.E" (2026-09-27) | Q2: is 10 sandings realistic for 33/32" maple? No current public MFMA page states a 33/32" sanding count. MFMA's earlier "The Use of 33/32 Material" statement (maplefloor.org press release, archived 2019; reproduced live by a flooring contractor) says a 33/32" floor "will provide eight to ten normal sandings and has a life span of 60 years or more". The model uses the top of that range; needs field confirmation. |
| Minimum serviceable thickness 25/32" (0.578") | pending | Logan, 2026-09-27 | outputs/courtside-81-external-actions-packet.md §1, row "2.E / 4.E" (2026-09-27) | Q5: is 0.578" the minimum serviceable thickness for 25/32" maple? It is Courtside's derivation (G17) from NWFA wear-layer geometry and is not stated by any public source; NWFA guidelines are member publications. |
| Planning range low spread (−4 yr); Planning range high spread (+6 yr); Planning health band low (45, or 30 with no remaining life); and 7 more | accepted | Logan (by delegation), 2026-09-27 | outputs/courtside-81-external-actions-packet.md §1, row "2.E / 4.E" (2026-09-27) | Q6: planning ranges and health bands, phase and risk thresholds, health-state bands and the 40-year planning threshold are product scoring design, published as internal planning assumptions. Not calibrated to measured floor outcomes. |
Worked example: one floor, start to finish
This is the pinned reproducibility scenario sand-cycle-overdue, computed on 2025-08-01 by the same code the app runs. The test suite recomputes it on every build and fails if any number below drifts.
Inputs. Installed 2000, 25/32" maple, sanded 3 times, last sand & refinish 2014-07-01, multi-use, no floor cover, HVAC year-round.
- Floor age: 2025 − 2000 = 25 years. Planning life cap for 25/32": 62 years (a planning assumption; see the decision record).
- Service recency: 4049 days since the last recorded service, over the 365-day threshold with an exact date, so −30.
- Sand cycle: about 11.1 years since the last sand against an 8-year planning interval (multi-use with no cover; 9 with a cover, 10 otherwise), a ratio above 1.0, so −20.
- Risk: multi-use floor with no cover, so −8.
Score. 100 − 30 − 20 − 8 = 42, clamped to 0–100. Phase: sand_due. Every deduction and interval above is a Courtside chosen weight or planning assumption; its owner, date and reason are in the decision record.
Sources for lifespan and sanding figures
Public pages checked on and re-checked on . No member-only or purchased publication was used.
- MFMA — Life Cycle of Flooring: a properly maintained 25/32" maple floor, sanded by a skilled contractor, can withstand up to six sandings; with sandings every 8 to 12 years the typical lifespan can exceed 75 years. Scope: conditional on maintenance, workmanship, and no environmental damage or abuse.
- MFMA — Open Letter on 33/32" Flooring: it is not uncommon for a 33/32" floor to last more than 100 years. Scope: no 33/32" sanding count and no absolute maximum is stated.
- MFMA — Sanding & Sealing: subsequent sandings by experienced contractors should remove no more than 1/32". Scope: a per-sanding limit; the model treats each sanding as removing the full 1/32".
- MFMA — Annual Maintenance/Refinishing: most gymnasium floors should be recoated annually. Courtside's 6 / 9 / 12-month recoat thresholds and their deductions are its own chosen weights, not an MFMA rule.
- MFMA — Floor Surface Protection: floor covers are not always needed in multipurpose rooms but offer extra protection. The no-cover deduction is a Courtside chosen weight, not an MFMA requirement.
- MFMA — The Use of 33/32 Material (archived 2019 capture): a properly maintained 25/32" floor "will provide four to six additional sandings after installation" with "a life span of at least 30-40 years or more"; a 33/32" floor "will provide eight to ten normal sandings and has a life span of 60 years or more". Scope: no longer on maplefloor.org; lower bounds, not maximums.
- Hardwood Floors magazine — How Many Times Can a Wood Floor Be Sanded? (April 2025): "A traditional sand job will remove 1/32” to 1/16” of actual material", and most solid wood floors "can be sanded six to eight times". Scope: a general hardwood article, not maple-gym specific.
Not supported by any public source checked: a 62-year or 80-year maximum life, a 10-sanding limit for 33/32" maple (the archived MFMA statement above gave "eight to ten normal sandings" as a typical count, not a limit), a mapping of use levels to 8 / 9 / 10-year sanding intervals, or an "MFMA OM-2" publication. The NWFA Technical Guidelines index points to member publications and supplies none of these numbers. These figures stay in the model as Courtside planning assumptions; the decision record gives each one's status and owner, including the two still open.
Floor Health Score
The Floor Health Score is a 0–100 maintenance decision-support score when required installation history is present. It applies transparent deductions for service timing, sand-cycle urgency, remaining sandings, documented risk factors, and structured contractor observations. A floor without an installation year is shown as incomplete rather than assigned a score.
- Contractor evidence: each structured condition is counted once. Structural and moisture observations remain relevant across the floor's history; finish-failure, wear, and process observations reset after the latest sand-and-refinish or installation. This bucket is capped at a 20-point deduction.
- Date precision: legacy dates stored as January 1 are treated as year-only records and anchored to July 1 for elapsed-time math. Their recoat-freshness deduction cannot exceed 15 points.
- Photo documentation: photos, stage tags, and AI findings are reviewable documentation only in the current product. They do not change the Floor Health score or product score.
Photo findings can carry purpose and stage context for review. They remain neutral to scoring in the current app, including when an analysis is pending, failed, stale, or unavailable.
Documentation boundary: a photo can preserve context for human review, but it cannot establish moisture source, active decay, repair scope, or structural safety. Contractor notes remain visible provenance and are not keyword-scored.
Manufacturer Accountability Score (MAS)
- Response Rate: 25%
- Response Speed: 20%
- Resolution Effectiveness: 25%
- Contractor Satisfaction: 15%
- Recurrence Rate: 15%
MAS is a planned weighted composite for manufacturer issue-response activity. The current manufacturer scores are illustrative demo outputs; subscriber scoring and live manufacturer issue aggregation are not active.
Confidence & Data Labels
The implementation has provenance-label concepts so users can weigh examples appropriately. Universal labels are not yet rendered on every public intelligence card:
- Real Field Data — derived from contractor job logs and structured reviews
- Public Research — drawn from public MFMA pages and the other sources linked in the lifespan and sanding sources section above; no ASBA publication or peer-reviewed study is cited
- Spec-Only — manufacturer-published specifications without field corroboration
- Pending Threshold — insufficient sample for confident publication
- Demo/Seed — illustrative data shown in demo mode only
Some product-score details display low / medium / high confidence. The current public manufacturer dashboard does not yet apply confidence tiers universally, so absence of a tier must not be read as high confidence.
Privacy & Anonymization (design target)
- A
k≥10view threshold is built as a design target for future aggregate views, not active subscriber output. - Geographic and temporal bucketing are planned controls, not a claim about the current demo.
- Terms allow eligible anonymized aggregates; live manufacturer aggregation is not active.
- Ordinary app-user organization scoping is part of the product design; this page does not reverify runtime RLS isolation.
Do not interpret the static manufacturer demo as evidence that subscriber aggregation or threshold enforcement is live.