# UAT: Layered Consensus (Per-Tier Positions)

**Date:** YYYY-MM-DD
**Feature:** LayeredLens Resolution
**Status:** [ ] PASS / [ ] FAIL / [ ] BLOCKED

## Scenario

Different source tiers may hold different positions on the same question. The Layered Consensus lens should show:
1. What each tier says (per-tier winners)
2. Within-tier conflict (do sources within a tier agree?)
3. Cross-tier conflict (do tiers agree with each other?)
4. Overall winner (from highest authority tier)

## Acceptance Criteria

| Criterion | Expected | Met? |
|-----------|----------|------|
| Per-tier breakdown | All populated tiers shown | [ ] |
| Within-tier conflict | Calculated per tier | [ ] |
| Cross-tier conflict | Calculated across tiers | [ ] |
| Overall winner | From highest authority | [ ] |
| Empty tiers omitted | Not in response | [ ] |

## Test Matrix

| Step | Action | Expected | Actual | Status |
|------|--------|----------|--------|--------|
| 1 | Ingest Clinical assertions (conflicting) | 2 hashes | | [ ] |
| 2 | Ingest Anecdotal assertions (unanimous) | 50 hashes | | [ ] |
| 3 | Query layered consensus | Per-tier breakdown | | [ ] |
| 4 | Check Tier 1 conflict | > 0.5 (contested) | | [ ] |
| 5 | Check Tier 5 conflict | ~ 0.0 (unanimous) | | [ ] |
| 6 | Check overall conflict | > 0 (tiers disagree) | | [ ] |

## Setup Commands

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

## Test Commands

### Step 1: Ingest Conflicting Clinical Assertions (Tier 1)

```bash
# Study A: Weight loss causes muscle loss
curl -X POST http://localhost:18180/v1/assertions \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Semaglutide:BodyComposition",
    "predicate": "lean_mass_preserved",
    "object": {"Boolean": false},
    "confidence": 0.85,
    "source_class": "Clinical",
    "source_hash": "0000000000000000000000000000000000000000000000000000000000000030"
  }'

# Study B: Lean mass preserved with exercise
curl -X POST http://localhost:18180/v1/assertions \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Semaglutide:BodyComposition",
    "predicate": "lean_mass_preserved",
    "object": {"Boolean": true},
    "confidence": 0.82,
    "source_class": "Clinical",
    "source_hash": "0000000000000000000000000000000000000000000000000000000000000031"
  }'
```

**Expected:** 2 hashes returned
**Actual:**
**Status:** [ ]

### Step 2: Ingest Unanimous Anecdotal Assertions (Tier 5)

```bash
# 50 Reddit users saying lean mass NOT preserved
for i in $(seq 1 50); do
  HASH=$(printf '%064d' $((2000 + i)))
  curl -s -X POST http://localhost:18180/v1/assertions \
    -H "Content-Type: application/json" \
    -d "{
      \"subject\": \"Semaglutide:BodyComposition\",
      \"predicate\": \"lean_mass_preserved\",
      \"object\": {\"Boolean\": false},
      \"confidence\": 0.75,
      \"source_class\": \"Anecdotal\",
      \"source_hash\": \"$HASH\"
    }" > /dev/null
done
echo "Created 50 anecdotal assertions"
```

**Expected:** 50 assertions created
**Actual:**
**Status:** [ ]

### Step 3: Query with Layered Consensus Lens

```bash
curl "http://localhost:18180/v1/query?subject=Semaglutide:BodyComposition&predicate=lean_mass_preserved&lens=layered-consensus"
```

**Expected:**
```json
{
  "tiers": [
    {
      "tier": 1,
      "source_class": "Clinical",
      "candidates_count": 2,
      "conflict_score": 0.88,      // Contested within tier
      "winner": {"object": {"Boolean": false}, ...}
    },
    {
      "tier": 5,
      "source_class": "Anecdotal",
      "candidates_count": 50,
      "conflict_score": 0.0,       // Unanimous within tier
      "winner": {"object": {"Boolean": false}, ...}
    }
  ],
  "overall_winner": {...},         // From Tier 1 (Clinical)
  "overall_conflict_score": 0.0,   // Tier winners agree (both say false)
  "total_candidates": 52
}
```
**Actual:**
**Status:** [ ]

### Step 4: Check Tier 1 (Clinical) Conflict

From Step 3 response, find the tier with `tier: 1`.

**Expected:** `conflict_score > 0.5` (two studies disagree)
**Actual:**
**Status:** [ ]

### Step 5: Check Tier 5 (Anecdotal) Conflict

From Step 3 response, find the tier with `tier: 5`.

**Expected:** `conflict_score ~ 0.0` (all 50 agree)
**Actual:**
**Status:** [ ]

### Step 6: Check Cross-Tier Conflict

In this case, both tier winners say `lean_mass_preserved: false`, so cross-tier conflict should be low.

**Expected:** `overall_conflict_score ~ 0.0` (tier winners agree)
**Actual:**
**Status:** [ ]

### Bonus: Create Cross-Tier Disagreement

```bash
# Add a Regulatory assertion that says lean mass IS preserved
curl -X POST http://localhost:18180/v1/assertions \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Semaglutide:BodyComposition",
    "predicate": "lean_mass_preserved",
    "object": {"Boolean": true},
    "confidence": 0.95,
    "source_class": "Regulatory",
    "source_hash": "0000000000000000000000000000000000000000000000000000000000000032"
  }'

# Query again
curl "http://localhost:18180/v1/query?subject=Semaglutide:BodyComposition&predicate=lean_mass_preserved&lens=layered-consensus"
```

**Expected:** `overall_conflict_score > 0.5` (Tier 0 says true, others say false)
**Actual:**
**Status:** [ ]

## Sign-Off Checklist

- [ ] Layered lens returns per-tier breakdown
- [ ] Within-tier conflict calculated correctly
- [ ] Cross-tier conflict calculated correctly
- [ ] Overall winner from highest authority tier
- [ ] Empty tiers not included in response

## Notes

*Layered consensus is the foundation for "disagreement dashboards" - showing users WHERE the disagreement is, not just WHETHER there's disagreement.*

---

**Tester:**
**Date:**
**Result:**
