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>
151 lines
3.6 KiB
Markdown
151 lines
3.6 KiB
Markdown
# UAT: Muscle Loss Contradiction (Skeptic Lens)
|
|
|
|
**Date:** YYYY-MM-DD
|
|
**Feature:** First-Class Contradiction
|
|
**Status:** [ ] PASS / [ ] FAIL / [ ] BLOCKED
|
|
|
|
## Scenario
|
|
|
|
Two peer-reviewed studies report opposing conclusions on GLP-1 agonist muscle-sparing effects:
|
|
- Study A (PMID_38001234): "Significant muscle loss observed"
|
|
- Study B (PMID_38005678): "Muscle mass preserved vs placebo"
|
|
|
|
Both are Tier 1 (Clinical) sources with similar confidence. The Skeptic Lens should surface both claims without forcing resolution.
|
|
|
|
## Acceptance Criteria
|
|
|
|
| Criterion | Expected | Met? |
|
|
|-----------|----------|------|
|
|
| Both claims coexist | Neither deleted | [ ] |
|
|
| Conflict score | >= 0.88 | [ ] |
|
|
| Status | "Contested" | [ ] |
|
|
| Claims array | 2 distinct values | [ ] |
|
|
| No hallucinated average | No "moderate loss" | [ ] |
|
|
|
|
## Test Matrix
|
|
|
|
| Step | Action | Expected | Actual | Status |
|
|
|------|--------|----------|--------|--------|
|
|
| 1 | Ingest Study A claim | Hash returned | | [ ] |
|
|
| 2 | Ingest Study B claim | Hash returned | | [ ] |
|
|
| 3 | Query skeptic lens | Both claims returned | | [ ] |
|
|
| 4 | Check conflict_score | >= 0.88 | | [ ] |
|
|
| 5 | Check status | Contested | | [ ] |
|
|
| 6 | Verify no averaging | 2 distinct ObjectValues | | [ ] |
|
|
|
|
## Setup Commands
|
|
|
|
```bash
|
|
# Start StemeDB
|
|
cargo run --bin stemedb-api &
|
|
|
|
# Wait for startup
|
|
sleep 2
|
|
```
|
|
|
|
## Test Commands
|
|
|
|
### Step 1: Ingest Study A (muscle loss = true)
|
|
|
|
```bash
|
|
curl -X POST http://localhost:18180/v1/assertions \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"subject": "Semaglutide:MuscleMass",
|
|
"predicate": "muscle_sparing_effect",
|
|
"object": {"Boolean": false},
|
|
"confidence": 0.85,
|
|
"source_class": "Clinical",
|
|
"source_hash": "0000000000000000000000000000000000000000000000000000000000000001"
|
|
}'
|
|
```
|
|
|
|
**Expected:** `{"hash": "..."}`
|
|
**Actual:**
|
|
**Status:** [ ]
|
|
|
|
### Step 2: Ingest Study B (muscle loss = false)
|
|
|
|
```bash
|
|
curl -X POST http://localhost:18180/v1/assertions \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"subject": "Semaglutide:MuscleMass",
|
|
"predicate": "muscle_sparing_effect",
|
|
"object": {"Boolean": true},
|
|
"confidence": 0.82,
|
|
"source_class": "Clinical",
|
|
"source_hash": "0000000000000000000000000000000000000000000000000000000000000002"
|
|
}'
|
|
```
|
|
|
|
**Expected:** `{"hash": "..."}`
|
|
**Actual:**
|
|
**Status:** [ ]
|
|
|
|
### Step 3: Query with Skeptic Lens
|
|
|
|
```bash
|
|
curl "http://localhost:18180/v1/skeptic?subject=Semaglutide:MuscleMass&predicate=muscle_sparing_effect"
|
|
```
|
|
|
|
**Expected:**
|
|
```json
|
|
{
|
|
"status": "Contested",
|
|
"conflict_score": 0.88,
|
|
"claims": [
|
|
{"value": {"Boolean": false}, "weight_share": 0.51, "assertion_count": 1},
|
|
{"value": {"Boolean": true}, "weight_share": 0.49, "assertion_count": 1}
|
|
],
|
|
"candidates_count": 2
|
|
}
|
|
```
|
|
|
|
**Actual:**
|
|
**Status:** [ ]
|
|
|
|
### Step 4: Verify Conflict Score
|
|
|
|
From Step 3 response, extract `conflict_score`.
|
|
|
|
**Expected:** >= 0.88
|
|
**Actual:**
|
|
**Status:** [ ]
|
|
|
|
### Step 5: Verify Status
|
|
|
|
From Step 3 response, check `status` field.
|
|
|
|
**Expected:** "Contested"
|
|
**Actual:**
|
|
**Status:** [ ]
|
|
|
|
### Step 6: Verify No Averaging
|
|
|
|
Confirm `claims` array contains exactly 2 entries with distinct `Boolean` values.
|
|
NO claim should have an averaged or interpolated value.
|
|
|
|
**Expected:** 2 distinct ObjectValues (true and false)
|
|
**Actual:**
|
|
**Status:** [ ]
|
|
|
|
## Sign-Off Checklist
|
|
|
|
- [ ] Both studies ingested successfully
|
|
- [ ] Skeptic lens returns both claims
|
|
- [ ] Conflict score >= 0.88
|
|
- [ ] Status is "Contested"
|
|
- [ ] No hallucinated average value
|
|
- [ ] Neither original claim deleted
|
|
|
|
## Notes
|
|
|
|
*Record any observations, edge cases, or issues here.*
|
|
|
|
---
|
|
|
|
**Tester:**
|
|
**Date:**
|
|
**Result:**
|