feat: expand Phase 4b roadmap with full health clearance & genetics system

This commit is contained in:
2026-03-09 23:19:15 -05:00
parent cf2a5ba8d3
commit 286b9c9bd0

View File

@@ -114,7 +114,7 @@
- [x] `GET /api/breeding/heat-cycles` endpoint - [x] `GET /api/breeding/heat-cycles` endpoint
- [x] `GET /api/breeding/heat-cycles/:id/suggestions` endpoint - [x] `GET /api/breeding/heat-cycles/:id/suggestions` endpoint
- [x] **Projected Whelping Calendar Identifier***(March 9, 2026 v0.5.1)* - [x] **Projected Whelping Calendar Identifier***(March 9, 2026 v0.5.1)*
- [x] Gestation constants: earliest=58, expected=63, latest=65 days - [x] Gestation constants: earliest=58, expected=63, latest=65 days
- [x] `getWwhelpDates(cycle)` client-side helper (no extra API call) - [x] `getWwhelpDates(cycle)` client-side helper (no extra API call)
- [x] Indigo whelp window cells (days 5863) on calendar grid - [x] Indigo whelp window cells (days 5863) on calendar grid
@@ -129,7 +129,7 @@
--- ---
## ✅ Phase 4a: Champion & Settings (COMPLETE v0.6.0) ## ✅ Phase 4a: Champion & Settings (COMPLETE v0.6.0)
### Champion Bloodline Tracking ### Champion Bloodline Tracking
- [x] `is_champion INTEGER DEFAULT 0` column on `dogs` table - [x] `is_champion INTEGER DEFAULT 0` column on `dogs` table
@@ -145,48 +145,147 @@
- [x] `settings` table: `kennel_name`, `kennel_tagline`, `kennel_address`, `kennel_phone`, `kennel_email`, `kennel_website`, `kennel_akc_id`, `kennel_breed`, `owner_name` - [x] `settings` table: `kennel_name`, `kennel_tagline`, `kennel_address`, `kennel_phone`, `kennel_email`, `kennel_website`, `kennel_akc_id`, `kennel_breed`, `owner_name`
- [x] Safe `ALTER TABLE settings ADD COLUMN` migration loop for all kennel fields - [x] Safe `ALTER TABLE settings ADD COLUMN` migration loop for all kennel fields
- [x] Auto-seed default row (`kennel_name = 'BREEDR'`) if table is empty - [x] Auto-seed default row (`kennel_name = 'BREEDR'`) if table is empty
- [x] `GET /api/settings` returns single-row as flat JSON object - [x] `GET /api/settings` returns single-row as flat JSON object
- [x] `PUT /api/settings` partial update via `ALLOWED_KEYS` whitelist - [x] `PUT /api/settings` partial update via `ALLOWED_KEYS` whitelist
- [x] `SettingsProvider` / `useSettings` React context hook - [x] `SettingsProvider` / `useSettings` React context hook
- [x] Kennel name displayed in navbar from settings - [x] Kennel name displayed in navbar from settings
- [x] `SettingsPage` component for editing kennel info - [x] `SettingsPage` component for editing kennel info
### Build & Runtime Fixes (v0.6.0) ### Build & Runtime Fixes (v0.6.0)
- [x] `useSettings.js``useSettings.jsx` Vite build failed because JSX in `.js` file - [x] `useSettings.js``useSettings.jsx` Vite build failed because JSX in `.js` file
- [x] `server/index.js` `initDatabase()` called with no args (was passing `DB_PATH`, now path is internal) - [x] `server/index.js` `initDatabase()` called with no args (was passing `DB_PATH`, now path is internal)
- [x] `server/index.js` removed duplicate `app.get('/api/health')` inline route - [x] `server/index.js` removed duplicate `app.get('/api/health')` inline route
- [x] `server/index.js` `DATA_DIR` env var replaces `path.dirname(DB_PATH)` for directory creation - [x] `server/index.js` `DATA_DIR` env var replaces `path.dirname(DB_PATH)` for directory creation
- [x] `server/routes/settings.js` rewrote from double-encoded base64 + old key/value schema to correct single-row column schema - [x] `server/routes/settings.js` rewrote from double-encoded base64 + old key/value schema to correct single-row column schema
--- ---
## 📋 Phase 4b: Health & Genetics (NEXT UP) ## 📋 Phase 4b: Health & Genetics (NEXT UP v0.7.0)
### Health Records *(Priority 1)* 🚨 > **Context:** Golden Retriever health clearances follow GRCA Code of Ethics and OFA/CHIC standards.
- [ ] Health records list view per dog > This phase builds a structured, breed-aware health tracking system aligned with those requirements.
- [ ] Add/edit health test results
- [ ] Vaccination tracking with expiry alerts ### Tier 1 — OFA Health Clearances *(Priority 1)* 🩺
- [ ] Medical history timeline view
- [ ] Document uploads (PDFs, images) The four GRCA-required clearances that must be on record in the public OFA database before breeding.
- [ ] Health clearance status badges on dog cards
**Database (schema additions to `health_records` table):**
- [ ] Add `test_type` ENUM-style field: `hip_ofa`, `hip_pennhip`, `elbow_ofa`, `heart_ofa`, `heart_echo`, `eye_caer`, `thyroid_ofa`, `dna_panel`
- [ ] Add `result` field: `pass`, `fail`, `carrier`, `clear`, `excellent`, `good`, `fair`, `borderline`
- [ ] Add `ofa_number` VARCHAR — official OFA certification number
- [ ] Add `chic_number` VARCHAR — CHIC certification number (dog-level field on `dogs` table)
- [ ] Add `performed_by` VARCHAR — vet or specialist name
- [ ] Add `expires_at` DATE — for annually-renewed tests (eyes, heart)
- [ ] Add `document_url` VARCHAR — path to uploaded PDF/image
- [ ] Safe ALTER TABLE migration guards for all new columns
**API:**
- [ ] `GET /api/health/:dogId` — list all health records for a dog
- [ ] `POST /api/health` — create health record
- [ ] `PUT /api/health/:id` — update health record
- [ ] `DELETE /api/health/:id` — delete health record
- [ ] `GET /api/health/:dogId/clearance-summary` — returns pass/fail/missing for all 4 OFA tiers
- [ ] `GET /api/health/:dogId/chic-eligible` — returns boolean + missing tests
**UI Components:**
- [ ] `HealthRecordForm` modal — test type dropdown, result, OFA#, date, performed-by, expiry, document upload
- [ ] `HealthTimeline` component — chronological list of all health events per dog on DogDetail page
- [ ] `ClearanceSummaryCard` — shows OFA Hip / Elbow / Heart / Eyes status in a 2x2 grid with color badges (green=pass, yellow=expiring, red=missing/fail)
- [ ] `ChicStatusBadge` — amber badge on dog cards and DogDetail if CHIC number is on file
- [ ] Expiry alert: yellow badge on dog card if any annual test expires within 90 days; red if expired
- [ ] Document upload support (PDF/image) tied to individual health records
**Clearance Tiers Tracked:**
| Test | OFA Minimum Age | Renewal | Notes |
|---|---|---|---|
| Hip Dysplasia | 24 months | Once (final) | OFA eval or PennHIP |
| Elbow Dysplasia | 24 months | Once (final) | OFA eval |
| Cardiac (Heart) | 12 months | Annual recommended | Echo preferred over auscultation |
| Eyes (CAER) | 12 months | **Annual** | Board-certified ACVO ophthalmologist |
| Thyroid (OFA) | 12 months | Annual recommended | Bonus/Tier 2 |
**Complexity:** Medium | **Impact:** High | **User Value:** Excellent **Complexity:** Medium | **Impact:** High | **User Value:** Excellent
**Estimated Time:** 810 hours
**Why this is recommended:** ---
- Natural complement to existing dog profiles
- Vaccination expiry alerts are high day-to-day utility
- Clearance badges on dog cards improve trust at a glance
- Builds toward breeding decision support
**Estimated Time:** 6-8 hours ### Tier 2 — DNA Genetic Panel *(Priority 2)* 🧬
### Genetic Trait Tracking *(Priority 2)* Embark or equivalent panel results per dog. Allows carrier × clear pairing without producing affected offspring.
- [ ] Track inherited traits
- [ ] Color genetics calculator
- [ ] Health clearance status
- [ ] Link traits to ancestors
**Estimated Time:** 5-7 hours **Database:**
- [ ] `genetic_tests` table: `id`, `dog_id`, `test_provider` (embark/optigen/etc), `test_name`, `result` (clear/carrier/affected), `test_date`, `document_url`, `created_at`
- [ ] Safe `CREATE TABLE IF NOT EXISTS` guard
**Golden Retriever Panel — Key Markers:**
- [ ] PRA1 (Progressive Retinal Atrophy type 1)
- [ ] PRA2 (Progressive Retinal Atrophy type 2)
- [ ] prcd-PRA (Progressive Rod-Cone Degeneration)
- [ ] ICH1 / ICH2 (Ichthyosis — very common in Goldens)
- [ ] NCL (Neuronal Ceroid Lipofuscinosis — fatal neurological)
- [ ] DM (Degenerative Myelopathy)
- [ ] MD (Muscular Dystrophy)
- [ ] GR-PRA1, GR-PRA2 (Golden-specific PRA variants)
**API:**
- [ ] `GET /api/genetics/:dogId` — list all genetic test results
- [ ] `POST /api/genetics` — add genetic result
- [ ] `PUT /api/genetics/:id` — update
- [ ] `DELETE /api/genetics/:id` — delete
- [ ] `GET /api/genetics/pairing-risk?sireId=&damId=` — returns at-risk combinations for a trial pairing
**UI Components:**
- [ ] `GeneticTestForm` modal — provider, marker, result (clear/carrier/affected), date, upload
- [ ] `GeneticPanelCard` on DogDetail — color-coded grid of all markers (green=clear, yellow=carrier, red=affected, gray=not tested)
- [ ] Pairing risk overlay on Trial Pairing Simulator — flag if sire+dam are both carriers for same marker
- [ ] "Not Tested" indicator on dog cards when no DNA panel on file
**Complexity:** Medium | **Impact:** High | **User Value:** Excellent
**Estimated Time:** 68 hours
---
### Tier 3 — Cancer Lineage & Longevity Tracking *(Priority 3)* 📊
Golden Retrievers have ~60% cancer mortality rate. Lineage-based cancer history is a major differentiator for responsible breeders.
**Database:**
- [ ] `cancer_history` table: `id`, `dog_id`, `cancer_type`, `age_at_diagnosis`, `age_at_death`, `cause_of_death`, `notes`, `created_at`
- [ ] Add `age_at_death` and `cause_of_death` optional fields to `dogs` table
**API:**
- [ ] `GET /api/health/:dogId/cancer-history`
- [ ] `POST /api/health/cancer-history`
- [ ] `GET /api/pedigree/:dogId/cancer-lineage` — walks ancestors and returns cancer incidence summary
**UI:**
- [ ] Longevity section on DogDetail — age at death, cause of death
- [ ] Cancer lineage indicator on Trial Pairing Simulator — "X of 8 ancestors had cancer history"
- [ ] Optional cancer history entry on DogForm
**Complexity:** Low-Medium | **Impact:** Medium | **User Value:** High (differentiator)
**Estimated Time:** 45 hours
---
### Tier 4 — Breeding Eligibility Checker *(Priority 4)* ✅
Automatic litter eligibility gate based on health clearance status of sire and dam.
**Logic:**
- [ ] Dog is "GRCA eligible" if: Hip OFA ✅ + Elbow OFA ✅ + Heart ✅ + Eyes (non-expired) ✅ + age ≥ 24 months
- [ ] Dog is "CHIC eligible" if all four tests are in OFA public database (CHIC number on file)
- [ ] Warning flags in Trial Pairing Simulator if sire or dam is missing required clearances
- [ ] Block litter creation (with override) if either parent fails eligibility check
**UI:**
- [ ] Eligibility badge on dog cards: `GRCA Eligible` (green) / `Incomplete` (yellow) / `Not Eligible` (red)
- [ ] Eligibility breakdown tooltip on hover — shows which tests are missing
- [ ] Pre-litter warning modal when creating a litter with non-eligible parents
- [ ] CHIC number field + verification note on DogDetail
**Complexity:** Low | **Impact:** High | **User Value:** Excellent
**Estimated Time:** 34 hours
--- ---
@@ -266,9 +365,10 @@
- [ ] Export to Excel/CSV - [ ] Export to Excel/CSV
- [ ] Integration with kennel clubs - [ ] Integration with kennel clubs
- [ ] Backup to cloud storage - [ ] Backup to cloud storage
- [ ] OFA database lookup by registration number
### Advanced Genetics ### Advanced Genetics
- [ ] DNA test result tracking - [ ] DNA test result tracking (full Embark import)
- [ ] Genetic diversity analysis - [ ] Genetic diversity analysis
- [ ] Breed-specific calculators - [ ] Breed-specific calculators
- [ ] Health risk predictions - [ ] Health risk predictions
@@ -281,48 +381,58 @@
--- ---
## 📅 Current Sprint: v0.7.0 ## 🏃 Current Sprint: v0.7.0 (Phase 4b)
### ✅ Completed This Sprint (v0.6.0) ### ✅ Completed This Sprint (v0.6.0)
- [x] `is_champion` flag DB column, API, DogForm toggle, offspring badge, parent dropdown `✪` - [x] `is_champion` flag DB column, API, DogForm toggle, offspring badge, parent dropdown `✪`
- [x] Kennel Settings `settings` table with all kennel fields, `GET/PUT /api/settings`, `SettingsProvider`, navbar kennel name - [x] Kennel Settings `settings` table with all kennel fields, `GET/PUT /api/settings`, `SettingsProvider`, navbar kennel name
- [x] `useSettings.jsx` rename (Vite build fix) - [x] `useSettings.jsx` rename (Vite build fix)
- [x] `server/index.js` fix `initDatabase()` no-arg call, duplicate health route removed - [x] `server/index.js` fix `initDatabase()` no-arg, duplicate health route removed
- [x] `server/routes/settings.js` rewrite — fixed double-encoded base64 + wrong key/value schema - [x] `server/routes/settings.js` rewrite: double-encoded base64 + wrong schema fixed
### ✅ Previously Completed (v0.5.1) ### ✅ Previously Completed (v0.5.1)
- [x] Projected Whelping Calendar Identifier indigo whelp window cells, due label, active card range, jump-to-month button - [x] Projected Whelping Calendar Identifier indigo whelp window cells, due label, active card range, jump-to-month button
- [x] Live whelp preview in Cycle Detail modal (client-side, no save required) - [x] Live whelp preview in Cycle Detail modal (client-side, no save required)
- [x] Full-width whelping banner for months with projected whelps - [x] Full-width whelping banner for months with projected whelps
- [x] "Projected Whelp" legend entry + updated page subtitle - [x] "Projected Whelp" legend entry + updated page subtitle
### 🔜 Next Up (Priority Order) ### 🔜 Next Up — Phase 4b Build Order
#### Option 1: Health Records System (Recommended) 🚨 #### Step 1: DB Schema Extensions
**Complexity:** Medium | **Impact:** High | **User Value:** Excellent - [ ] Extend `health_records` table with OFA-specific columns (test_type, result, ofa_number, chic_number, expires_at, document_url)
- [ ] Create `genetic_tests` table (PRA, ICH, NCL, DM, MD, GR-PRA variants)
- [ ] Create `cancer_history` table
- [ ] Add `chic_number`, `age_at_death`, `cause_of_death` to `dogs` table
- [ ] All changes via safe ALTER TABLE / CREATE TABLE IF NOT EXISTS guards
**Tasks:** #### Step 2: API Layer
- Create `HealthRecordForm` component - [ ] `GET|POST|PUT|DELETE /api/health/:dogId` (OFA records)
- Health records list/timeline per dog on DogDetail page - [ ] `GET /api/health/:dogId/clearance-summary`
- Vaccination tracking with expiry date + alert badge - [ ] `GET /api/health/:dogId/chic-eligible`
- Health clearance status badges (OFA, CERF, etc.) - [ ] `GET|POST|PUT|DELETE /api/genetics/:dogId`
- Optional document/PDF upload - [ ] `GET /api/genetics/pairing-risk` (sire + dam carrier check)
- [ ] Cancer history endpoints
**Estimated Time:** 6-8 hours #### Step 3: Core UI — Health Records
- [ ] `HealthRecordForm` modal (test type, result, OFA#, expiry, doc upload)
- [ ] `HealthTimeline` on DogDetail page
- [ ] `ClearanceSummaryCard` 2×2 grid (Hip / Elbow / Heart / Eyes)
- [ ] `ChicStatusBadge` on dog cards
- [ ] Expiry alert badges (90-day warning, expired)
--- #### Step 4: Core UI — Genetics Panel
- [ ] `GeneticTestForm` modal
- [ ] `GeneticPanelCard` on DogDetail (color-coded markers)
- [ ] Pairing risk overlay on Trial Pairing Simulator
#### Option 2: Genetic Trait Tracking #### Step 5: Eligibility Checker
**Complexity:** Medium | **Impact:** Medium | **User Value:** Good - [ ] Eligibility logic (`grca_eligible`, `chic_eligible` computed fields)
- [ ] Eligibility badge on dog cards
- [ ] Pre-litter eligibility warning modal
**Tasks:** #### Step 6: Cancer / Longevity (Stretch)
- Trait entry form (coat color, pattern, carried traits) - [ ] Cancer history form + lineage summary on Trial Pairing page
- Display traits on dog detail page - [ ] Age at death / cause of death on DogDetail
- Predicted trait calculator for trial pairings
**Estimated Time:** 5-7 hours
---
### Testing Needed ### Testing Needed
- [x] Add/edit dog forms with litter selection - [x] Add/edit dog forms with litter selection
@@ -335,13 +445,15 @@
- [x] Brand logo display and sizing - [x] Brand logo display and sizing
- [x] Gradient title rendering - [x] Gradient title rendering
- [x] Static asset serving in prod and dev - [x] Static asset serving in prod and dev
- [ ] Champion toggle DogForm save/load round-trip - [ ] Champion toggle DogForm save/load round-trip
- [ ] Champion badge offspring card display - [ ] Champion badge offspring card display
- [ ] Kennel settings save + navbar name update - [ ] Kennel settings save + navbar name update
- [ ] Trial pairing simulator (end-to-end) - [ ] Trial pairing simulator (end-to-end)
- [ ] Heat cycle calendar (start cycle, detail modal, whelping) - [ ] Heat cycle calendar (start cycle, detail modal, whelping)
- [ ] Projected whelping calendar identifier (whelp cells, due label, banner) - [ ] Projected whelping calendar identifier (whelp cells, due label, banner)
- [ ] Health records - [ ] Health records — OFA clearance CRUD
- [ ] Genetic panel — DNA marker entry and display
- [ ] Eligibility checker — badge and litter gate
### Known Issues ### Known Issues
- None currently - None currently
@@ -358,6 +470,12 @@
## Version History ## Version History
- **v0.7.0** (In Progress) - Phase 4b: Health & Genetics
- OFA clearance tracking (Hip, Elbow, Heart, Eyes + CHIC number)
- DNA genetic panel (PRA, ICH, NCL, DM, MD variants)
- Cancer lineage & longevity tracking
- Breeding eligibility checker (GRCA + CHIC gates)
- **v0.6.0** (March 9, 2026) - Champion Bloodline, Settings, Build Fixes - **v0.6.0** (March 9, 2026) - Champion Bloodline, Settings, Build Fixes
- `is_champion` flag on dogs table with ALTER TABLE migration guard - `is_champion` flag on dogs table with ALTER TABLE migration guard
- Champion toggle in DogForm; `✪` suffix in parent dropdowns; offspring badge - Champion toggle in DogForm; `✪` suffix in parent dropdowns; offspring badge