# UAT: Guidance Change Propagation ("What Changed Since?") **Date:** YYYY-MM-DD **Feature:** Incremental Change Tracking **Status:** [ ] PASS / [ ] FAIL / [ ] BLOCKED ## Scenario A downstream application queried StemeDB at time T1. Now at T2, they want to know: "What changed since my last query?" This is critical for: - Keeping derived data in sync - Audit trails - Real-time dashboards ## Acceptance Criteria | Criterion | Expected | Met? | |-----------|----------|------| | Initial query at T1 | Returns baseline | [ ] | | New assertion added | Stored with timestamp | [ ] | | `since=T1` query | Returns only new assertion | [ ] | | Changes array format | Includes operation type | [ ] | | No false positives | Old assertions not returned | [ ] | ## Test Matrix | Step | Action | Expected | Actual | Status | |------|--------|----------|--------|--------| | 1 | Query at T1 | Baseline returned | | [ ] | | 2 | Add new assertion | Hash returned | | [ ] | | 3 | Query with since=T1 | Only new assertion | | [ ] | | 4 | Add another assertion | Hash returned | | [ ] | | 5 | Query with since=T1 | Both new assertions | | [ ] | | 6 | Query with since=T2 | Only most recent | | [ ] | ## Setup Commands ```bash # Start StemeDB cargo run --bin stemedb-api & sleep 2 ``` ## Test Commands ### Step 1: Establish Baseline at T1 ```bash # Record the current timestamp T1=$(date +%s) # Create initial assertion curl -X POST http://localhost:18180/v1/assertions \ -H "Content-Type: application/json" \ -d '{ "subject": "Semaglutide", "predicate": "approved_indications", "object": {"Text": "Type 2 Diabetes"}, "confidence": 1.0, "source_class": "Regulatory" }' # Query baseline curl "http://localhost:18180/v1/query?subject=Semaglutide&predicate=approved_indications" ``` **Expected:** Returns Type 2 Diabetes assertion **Actual:** **Status:** [ ] ### Step 2: Add New Assertion After T1 ```bash # Wait a moment to ensure different timestamp sleep 1 # FDA approves new indication curl -X POST http://localhost:18180/v1/assertions \ -H "Content-Type: application/json" \ -d '{ "subject": "Semaglutide", "predicate": "approved_indications", "object": {"Text": "Chronic Weight Management"}, "confidence": 1.0, "source_class": "Regulatory" }' ``` **Expected:** Hash returned **Actual:** **Status:** [ ] ### Step 3: Query with since=T1 ```bash curl "http://localhost:18180/v1/changes?subject=Semaglutide&since=$T1" ``` **Expected:** ```json { "changes": [ { "operation": "insert", "subject": "Semaglutide", "predicate": "approved_indications", "object": {"Text": "Chronic Weight Management"}, "timestamp": ..., "hash": "..." } ], "query_timestamp": ..., "since_timestamp": T1 } ``` **Actual:** **Status:** [ ] ### Step 4: Add Another Assertion ```bash T2=$(date +%s) sleep 1 # Third indication approved curl -X POST http://localhost:18180/v1/assertions \ -H "Content-Type: application/json" \ -d '{ "subject": "Semaglutide", "predicate": "approved_indications", "object": {"Text": "Cardiovascular Risk Reduction"}, "confidence": 1.0, "source_class": "Regulatory" }' ``` **Expected:** Hash returned **Actual:** **Status:** [ ] ### Step 5: Query with since=T1 (All Changes) ```bash curl "http://localhost:18180/v1/changes?subject=Semaglutide&since=$T1" ``` **Expected:** Returns BOTH new assertions (Weight Management AND Cardiovascular) **Actual:** **Status:** [ ] ### Step 6: Query with since=T2 (Most Recent Only) ```bash curl "http://localhost:18180/v1/changes?subject=Semaglutide&since=$T2" ``` **Expected:** Returns ONLY Cardiovascular Risk Reduction **Actual:** **Status:** [ ] ## Sign-Off Checklist - [ ] Baseline query works - [ ] New assertions timestamped correctly - [ ] `since=` filter returns only newer assertions - [ ] Changes include operation type - [ ] Timestamp precision is sufficient (second or better) ## Notes *The `/changes` endpoint is separate from `/query` to distinguish between "current state" and "what changed" semantics.* --- **Tester:** **Date:** **Result:**