stemedb/uat/consumer-health/glp1-muscle-loss-contradiction.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

3.6 KiB

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

# Start StemeDB
cargo run --bin stemedb-api &

# Wait for startup
sleep 2

Test Commands

Step 1: Ingest Study A (muscle loss = true)

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)

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

curl "http://localhost:18180/v1/skeptic?subject=Semaglutide:MuscleMass&predicate=muscle_sparing_effect"

Expected:

{
  "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: