Courtside Pro

Methodology

How Courtside Pro builds, scores, and surfaces hardwood maple sports floor intelligence. Updated .

Product Intelligence Score (PIS)

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)

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

User-supplied floor fields
InputDefaultRequired
Year installed—Yes (without it the floor is incomplete)
Times sanded0No
Thickness25/32"No
Multi-usefalseNo
Has covernot 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-roundtrueNo
Measured thickness—No (25/32" only)
Year last sandedunknownNo
Job history[]No

Branches

Deductions & caps

Health score deductions (starting score 100)
TierPointsCap / notes
Recoat overdue (>1 yr, exact date)−30Year-precision cap −15
Recoat due (>9 mo)−15—
Recoat approaching (>6 mo)−5—
Sand cycle overdue−20Requires 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 flagsvariableBucket cap −20
Photo documentationvariableBucket cap −10; scoring disabled in current app

Rounding

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.

Contractor structured-condition points (FLOOR_HEALTH_CONDITION_RULES in floor-life.js)
ObservationPointsWindow
Buckling / cupping8all history
Rotted / punky board8all history
Water damage7all history
Hot / humid coating conditions5all history (deduped against the HVAC risk deduction)
Cracked / broken boards4all history
Pre-existing peeling4since last sand/install
Recoat delamination4since last sand/install
Finish chipping / flaking3since last sand/install
Loss of sheen3since last sand/install
Scalloping / cup and crown3since last sand/install
Cover plate seating issue2all history
Prior repair / patch2all history
Rough / gritty cure2since last sand/install
Yellowing / ambering2since last sand/install
Maintenance film / residue2since last sand/install
Poly beads / extrusion1since last sand/install
Foreign material1since last sand/install
Marked ready to refinish5since 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).

Photo-evidence points, currently non-scoring (FLOOR_HEALTH_PHOTO_RULES in floor-life.js)
SignalPoints
Possible water-related change4
Board deformation3
Finish peeling3
Traffic wear2
Tape damage2
Uneven sheen1
Yellowing1
Finish texture issue1
Game-line degradation1

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.

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.

Floor Intelligence decisions (floor-intel-v4l-20260928)
Rules coveredStatusOwner, dateRecorded inReason
Recoat overdue after 365 days; Recoat overdue deduction (exact date) −30; Recoat due after 270 days −15; and 11 moreacceptedLogan, 2026-07-09docs/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 moreacceptedLogan, 2026-07-09docs/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) −15acceptedLogan, 2026-07-09docs/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 moreacceptedLogan, 2026-07-15docs/business-rules.md §1.1DOwner-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"acceptedLogan (by delegation), 2026-09-27outputs/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)acceptedLogan (by delegation), 2026-09-27outputs/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-interimLogan (by delegation), 2026-09-27outputs/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"pendingLogan, 2026-09-27outputs/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")pendingLogan, 2026-09-27outputs/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 moreacceptedLogan (by delegation), 2026-09-27outputs/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.

  1. Floor age: 2025 − 2000 = 25 years. Planning life cap for 25/32": 62 years (a planning assumption; see the decision record).
  2. Service recency: 4049 days since the last recorded service, over the 365-day threshold with an exact date, so −30.
  3. 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.
  4. 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.

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.

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)

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:

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)

Do not interpret the static manufacturer demo as evidence that subscriber aggregation or threshold enforcement is live.