stemedb/uat/consumer-health/glp1-semantic-decay.md
jordan 8f6506b70a feat: Aphoria scan modes + stemedb-ontology crate + consumer health UAT
Major additions:
- Staged scanning modes (working tree, staged, committed) with git integration
- Drift detection for baseline vs current state comparisons
- Hosted API handlers for policy CRUD operations via StemeDB API
- stemedb-ontology crate with domain definitions and medical extractors
- Consumer health vertical UAT scenarios (GLP-1, gastroparesis, etc.)
- Aphoria development skill documentation

Code organization:
- Split large files into focused modules to stay under 500-line limit
- Extracted config tests, episteme helpers/drift/aliases, API helpers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:57:33 -07:00

177 lines
4.6 KiB
Markdown

# UAT: Semantic Decay (Knowledge Half-Life)
**Date:** YYYY-MM-DD
**Feature:** Source-Aware Decay
**Status:** [ ] PASS / [ ] FAIL / [ ] BLOCKED
## Scenario
Medical knowledge decays at different rates based on source class:
- **Regulatory (Tier 0):** Never decays
- **Clinical (Tier 1):** 730-day half-life (2 years)
- **Anecdotal (Tier 5):** 30-day half-life
A 200-day-old Clinical study should have effective confidence ~0.45x original.
A 200-day-old Reddit post should have effective confidence ~0.01x original (essentially expired).
## Acceptance Criteria
| Criterion | Expected | Met? |
|-----------|----------|------|
| Regulatory never decays | conf unchanged at 200 days | [ ] |
| Clinical decay correct | ~0.45x at 200 days | [ ] |
| Anecdotal decay correct | ~0.01x at 200 days | [ ] |
| Decay applied at query | Not at write time | [ ] |
## Test Matrix
| Step | Action | Expected | Actual | Status |
|------|--------|----------|--------|--------|
| 1 | Ingest Regulatory assertion | Hash returned | | [ ] |
| 2 | Ingest Clinical assertion | Hash returned | | [ ] |
| 3 | Ingest Anecdotal assertion | Hash returned | | [ ] |
| 4 | Query with decay (200 days) | Decayed confidences | | [ ] |
| 5 | Verify Regulatory unchanged | 0.95 | | [ ] |
| 6 | Verify Clinical decayed | ~0.43 | | [ ] |
| 7 | Verify Anecdotal expired | ~0.01 | | [ ] |
## Decay Formula
Confidence decay follows exponential half-life:
```
effective_conf = original_conf * (0.5 ^ (age_days / half_life_days))
```
| Source Class | Half-Life (days) | 200-day decay factor |
|--------------|------------------|----------------------|
| Regulatory | Infinite | 1.0 |
| Clinical | 730 | 0.826 |
| Observational | 365 | 0.682 |
| Expert | 180 | 0.464 |
| Community | 90 | 0.214 |
| Anecdotal | 30 | 0.010 |
## Setup Commands
```bash
# Start StemeDB
cargo run --bin stemedb-api &
sleep 2
```
## Test Commands
### Step 1: Ingest Regulatory Assertion (FDA)
```bash
# Use a timestamp 200 days ago
TIMESTAMP_200_DAYS_AGO=$(($(date +%s) - 17280000))
curl -X POST http://localhost:18180/v1/assertions \
-H "Content-Type: application/json" \
-d "{
\"subject\": \"Semaglutide\",
\"predicate\": \"approved_for\",
\"object\": {\"Text\": \"Type2Diabetes\"},
\"confidence\": 0.95,
\"source_class\": \"Regulatory\",
\"timestamp\": $TIMESTAMP_200_DAYS_AGO
}"
```
**Expected:** Hash returned
**Actual:**
**Status:** [ ]
### Step 2: Ingest Clinical Assertion
```bash
curl -X POST http://localhost:18180/v1/assertions \
-H "Content-Type: application/json" \
-d "{
\"subject\": \"Semaglutide\",
\"predicate\": \"hba1c_reduction_percent\",
\"object\": {\"Number\": 1.5},
\"confidence\": 0.95,
\"source_class\": \"Clinical\",
\"timestamp\": $TIMESTAMP_200_DAYS_AGO
}"
```
**Expected:** Hash returned
**Actual:**
**Status:** [ ]
### Step 3: Ingest Anecdotal Assertion (Reddit)
```bash
curl -X POST http://localhost:18180/v1/assertions \
-H "Content-Type: application/json" \
-d "{
\"subject\": \"Semaglutide\",
\"predicate\": \"user_experience\",
\"object\": {\"Text\": \"Lost 20 lbs in 3 months\"},
\"confidence\": 0.95,
\"source_class\": \"Anecdotal\",
\"timestamp\": $TIMESTAMP_200_DAYS_AGO
}"
```
**Expected:** Hash returned
**Actual:**
**Status:** [ ]
### Step 4: Query with Decay Lens
```bash
# Query all Semaglutide assertions with decay applied
curl "http://localhost:18180/v1/query?subject=Semaglutide&lens=decay"
```
**Expected:** Three assertions with decayed effective_confidence values
**Actual:**
**Status:** [ ]
### Step 5: Verify Regulatory Unchanged
From Step 4 response, find the `approved_for` assertion.
**Expected:** effective_confidence = 0.95 (unchanged)
**Actual:**
**Status:** [ ]
### Step 6: Verify Clinical Decayed
From Step 4 response, find the `hba1c_reduction_percent` assertion.
**Expected:** effective_confidence ~ 0.79 (0.95 * 0.826)
**Actual:**
**Status:** [ ]
### Step 7: Verify Anecdotal Expired
From Step 4 response, find the `user_experience` assertion.
**Expected:** effective_confidence ~ 0.01 (essentially expired)
**Actual:**
**Status:** [ ]
## Sign-Off Checklist
- [ ] All three source classes ingested
- [ ] Decay applied at query time (not write time)
- [ ] Regulatory sources never decay
- [ ] Clinical sources decay correctly
- [ ] Anecdotal sources expire quickly
- [ ] Decay factors match documented half-lives
## Notes
*The "73-day half-life" mentioned in the GLP-1 Living Review use case refers to the overall effective knowledge decay for mixed-source queries. Individual source classes have different rates.*
---
**Tester:**
**Date:**
**Result:**