Files
hoopscout-v2/docs/adr/0005-scouting-search-domain.md

111 lines
7.6 KiB
Markdown

# ADR-0005: Scouting Search Domain Baseline
## Status
Accepted
## Context
HoopScout v2 is moving from technical foundation decisions to product-domain decisions required before model, filter, and UI implementation. The next implementation prompts need a stable and explicit scouting search vocabulary so we do not conflate objective statistics with internal scouting interpretation.
The product intent is a scouting-first player search engine where users combine multiple dimensions to discover players. This is not a generic basketball encyclopedia.
## Decision
### 1. Search purpose
The search system is defined as a player scouting search engine. Search dimensions are selected to support scouting workflows and shortlist creation, not comprehensive historical/statistical browsing.
### 2. Domain vocabulary and separation of concerns
Search dimensions are separated into distinct layers that must not be conflated:
- Position: standard on-court category (`PG`, `SG`, `SF`, `PF`, `C`).
- Role: tactical/scouting classification (for example `playmaker`, `3-and-D`, `point forward`, `rim protector`, `6th man`).
- Specialty: scouting tag layer (for example `ball handling`, `off ball`, `defense`, `intangibles`, `clutch`, `post`, `dunk`).
Position is a categorical descriptor, role is tactical interpretation, and specialty is a flexible tagging layer. Future implementation must preserve this separation in model semantics, filtering semantics, and UI wording.
### 3. Data classification by search dimension
The following classification defines ownership and data realism.
| Dimension | Classification | MVP handling |
|---|---|---|
| Position (`PG`/`SG`/`SF`/`PF`/`C`) | Hybrid: often source-derived, may need normalization; can be manually overridden when source is inconsistent | In MVP; filterable |
| Role (listed tactical roles) | App-defined/internal taxonomy; assigned via internal scouting judgment; may be inferred from data but not treated as source-native fact | Deferred as mandatory filter; optional/manual enrichment in MVP |
| Specialty tags | App-defined/internal taxonomy; manually curated and optionally inference-assisted; not source-native | Deferred as mandatory filter; optional/manual enrichment in MVP |
| Age | Derived from source date-of-birth and reference date | In MVP; filterable |
| Height | Source-derived objective attribute; normalized units required | In MVP; filterable |
| Weight | Source-derived objective attribute; normalized units required | In MVP; filterable |
| Wingspan | Optional source-derived or manually curated enrichment; sparse in public sources | Not required in MVP; optional if present |
| Points per game | Source-derived objective per-game metric | In MVP; filterable |
| Assists per game | Source-derived objective per-game metric | In MVP; filterable |
| Steals per game | Source-derived objective per-game metric | In MVP; filterable |
| Turnovers per game | Source-derived objective per-game metric | In MVP; filterable |
| Blocks per game | Source-derived objective per-game metric | In MVP; filterable |
| eFG% | Source-derived if provided, otherwise calculated from source box score totals (derived but objective) | In MVP if available/computable |
| TS% | Source-derived if provided, otherwise calculated from source totals (derived but objective) | In MVP if available/computable |
| Plus/minus | Optional source-derived metric with context variance across competitions/sources | Deferred from MVP baseline; include only where source quality is acceptable |
| Offensive rating | Optional source-derived metric; not universally available/consistent | Deferred from MVP baseline |
| Defensive rating | Optional source-derived metric; not universally available/consistent | Deferred from MVP baseline |
### 4. MVP search scope decision
MVP search filters include:
- position
- per-game metrics: points, assists, steals, turnovers, blocks
- objective personal/physical attributes with practical availability: age, height, weight
- advanced percentages when available or reliably computable: eFG%, TS%
MVP does not require role, specialty, wingspan, plus/minus, offensive rating, or defensive rating as baseline filters.
These deferred dimensions are allowed as optional enrichment fields in MVP data ingestion/storage if available, but they are not required for a player to be searchable.
### 5. Data realism decisions for risk-prone dimensions
- Role: public source coverage is inconsistent and mostly interpretive; treat as internal/manual scouting classification in MVP.
- Specialty: public source coverage is not standardized; treat as internal/manual tagging in MVP.
- Wingspan: public coverage is sparse and uneven across leagues; treat as optional enrichment, not a required MVP field.
### 6. Flexibility for future taxonomy growth
Role and specialty taxonomies are repository-owned domain vocabularies. They must be extensible so new role labels and specialty tags can be added without changing the conceptual model.
Future implementation should assume:
- position remains a bounded standard set;
- role remains an app-defined tactical taxonomy that can expand;
- specialty remains an app-defined tag taxonomy that can expand.
### 7. Implementation guidance for future prompts
Future model/filter/UI prompts must assume:
- Search filters are split by semantic layer: position, role, specialty, objective metrics, physical characteristics.
- Position filters operate on normalized categorical values.
- Role and specialty are internal taxonomy-owned dimensions and may be absent for many players in early phases.
- Objective metrics and physical fields remain source-driven (or objectively derived from source stats) and should be treated differently from scouting classifications.
- Optional dimensions must not block ingestion or search eligibility when missing.
- UI wording should avoid presenting role/specialty as objective source facts.
## Alternatives considered
### A. Treat role and specialty as source-native fields in MVP
Rejected. This overstates source objectivity and creates data quality risk because these are primarily scouting interpretations.
### B. Require all listed dimensions in MVP filters
Rejected. This increases delivery risk and couples MVP to low-availability fields (especially wingspan and certain advanced metrics).
### C. Ignore role/specialty until much later
Rejected. Even if deferred as mandatory filters, role/specialty must be conceptually defined now to avoid model ambiguity and rework.
## Trade-offs
- Pros: clear semantic boundaries, realistic MVP scope, lower ingestion risk, explicit taxonomy ownership.
- Cons: initial MVP filter set is narrower than full scouting ambition, and some high-value scouting dimensions are manual/optional at first.
## Consequences
- Near-term implementation can proceed with objective, reliably available filters first.
- Role/specialty workflows will require internal curation processes and possibly reviewer/admin UX later.
- Data pipelines must support missing optional fields without breaking search.
- Future ADRs can refine role/specialty governance and metric computation standards without replacing this baseline separation.
## Follow-up decisions needed
1. Role taxonomy governance: who can define, merge, rename, or deprecate roles.
2. Specialty taxonomy governance: naming rules, hierarchy policy (if any), and duplicate-tag handling.
3. Normalization standards for height/weight units and age reference-date semantics.
4. Metric computation and rounding policy for derived advanced stats (eFG%, TS%).
5. Source quality policy for optional advanced metrics (plus/minus, offensive/defensive rating).
6. Curation workflow for manual scouting classifications and auditability requirements.