stemedb/uat/consumer-health/anecdotal-signal-precedence.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

4.7 KiB

UAT: Anecdotal Signal Precedence (Cluster Escalation)

Date: YYYY-MM-DD Feature: Escalation Signals Status: [ ] PASS / [ ] FAIL / [ ] BLOCKED

Scenario

When 500+ Tier 5 (Anecdotal) reports cluster around a subject with NO Tier 0-2 coverage, this should trigger an escalation signal. This represents "something the community is seeing that hasn't been validated yet."

Key validation: The system detects an information gap that needs expert investigation.

Acceptance Criteria

Criterion Expected Met?
500+ Tier 5 assertions exist All ingested [ ]
No Tier 0-2 for same subject Verified [ ]
Escalation signal created event_type = "anecdotal_cluster" [ ]
Signal includes cluster metadata count, subject, predicate [ ]
Threshold is configurable Can adjust 500 limit [ ]

Test Matrix

Step Action Expected Actual Status
1 Ingest 500 Tier 5 assertions 500 hashes returned [ ]
2 Verify no Tier 0-2 exists Empty result [ ]
3 Query escalation events Signal present [ ]
4 Check signal metadata count >= 500 [ ]
5 Add Tier 1 assertion Signal resolved [ ]

Escalation Logic

IF count(subject, predicate, tier=5) >= threshold
AND count(subject, predicate, tier IN [0,1,2]) == 0
THEN create_escalation_signal({
    event_type: "anecdotal_cluster",
    level: "investigate",
    subject: subject,
    predicate: predicate,
    cluster_count: count,
    message: "High-volume anecdotal reports with no authoritative coverage"
})

Setup Commands

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

Test Commands

Step 1: Ingest 500 Anecdotal Reports (New Symptom)

# A new symptom not yet documented by FDA/clinical
for i in $(seq 1 500); do
  HASH=$(printf '%064d' $((1000 + i)))
  curl -s -X POST http://localhost:18180/v1/assertions \
    -H "Content-Type: application/json" \
    -d "{
      \"subject\": \"Semaglutide\",
      \"predicate\": \"hair_loss_reported\",
      \"object\": {\"Boolean\": true},
      \"confidence\": 0.70,
      \"source_class\": \"Anecdotal\",
      \"source_hash\": \"$HASH\"
    }" > /dev/null
done
echo "Created 500 anecdotal hair loss reports"

Expected: 500 assertions created Actual: Status: [ ]

Step 2: Verify No Authoritative Coverage

# Check for Tier 0-2 assertions on hair_loss
curl "http://localhost:18180/v1/query?subject=Semaglutide&predicate=hair_loss_reported&source_class=Regulatory"
curl "http://localhost:18180/v1/query?subject=Semaglutide&predicate=hair_loss_reported&source_class=Clinical"
curl "http://localhost:18180/v1/query?subject=Semaglutide&predicate=hair_loss_reported&source_class=Observational"

Expected: All queries return empty results Actual: Status: [ ]

Step 3: Query Escalation Events

curl "http://localhost:18180/v1/escalations?subject=Semaglutide"

Expected:

{
  "events": [
    {
      "event_type": "anecdotal_cluster",
      "level": "investigate",
      "subject": "Semaglutide",
      "predicate": "hair_loss_reported",
      "cluster_count": 500,
      "message": "High-volume anecdotal reports with no authoritative coverage",
      "created_at": "..."
    }
  ]
}

Actual: Status: [ ]

Step 4: Check Signal Metadata

From Step 3 response, verify:

  • cluster_count >= 500
  • subject and predicate match
  • level is "investigate"

Expected: All metadata correct Actual: Status: [ ]

Step 5: Resolve by Adding Authoritative Source

# Clinical study addresses the hair loss question
curl -X POST http://localhost:18180/v1/assertions \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Semaglutide",
    "predicate": "hair_loss_reported",
    "object": {"Text": "Post-hoc analysis shows 2.3% incidence, similar to placebo"},
    "confidence": 0.88,
    "source_class": "Clinical",
    "source_hash": "0000000000000000000000000000000000000000000000000000000000000099"
  }'

# Check if escalation is resolved
curl "http://localhost:18180/v1/escalations?subject=Semaglutide&status=active"

Expected: Escalation marked as "resolved" or removed from active list Actual: Status: [ ]

Sign-Off Checklist

  • 500 anecdotal assertions ingested
  • Escalation triggered for coverage gap
  • Signal includes cluster count and metadata
  • Adding authoritative source resolves signal
  • Threshold is configurable (default 500)

Notes

Escalation signals are for investigation workflow. They don't change assertion storage or query results - they're a separate alert system.


Tester: Date: Result: