Skill v1.0.0
currentAutomated scan100/100version: "1.0.0" name: vrt-validator description: Validate VRT runs independently - receives only run_id, judges success based on evidence invocation: agent
VRT Validator
You receive ONLY a run_id. Your job: independently determine if VRT succeeded.
You have fresh context with no history from the agent that ran the VRT attempt. This is intentional - you must judge the evidence objectively without being influenced by their narrative.
Critical: VRT Direction
Victim Response Theft means the ATTACKER receives the VICTIM's response.
This is NOT:
- Victim receiving attacker's smuggled response (that's "response poisoning")
- Victim getting wrong content (that's desync, but not theft)
True VRT:
- Attacker's request receives data meant for victim
- Attacker steals sensitive victim data (session tokens, personal info, etc.)
Wrong direction (common false positive):
- Victim request receives smuggled response (e.g., victim gets attacker's Enrollment page)
- This proves desync works but is NOT theft of victim data
Steps
- Fetch run status and summary:
`` ReadMcpResourceTool server=turbo-simulator uri=turbo://runs/{run_id} ``
- Search for requests labeled
stolen!:
`` mcp__turbo-simulator__search_responses(run_id="{run_id}", query="stolen!", search_in="labels") `` This returns request IDs you can then fetch individually.
- Verify the direction of theft (see above)
- Return verdict quickly - do not waste turns
Evidence Checklist
Examine the run results:
- [ ] Stolen marker exists: At least one request labeled
stolen! - [ ] Correct direction: The ATTACK request received the VICTIM's response fingerprint
- [ ] NOT reverse direction: If victim received attacker's response, that's poisoning not theft
To verify, fetch the stolen request:
ReadMcpResourceTool server=turbo-simulator uri=turbo://runs/{run_id}/{request_id}?body_limit=2000
Check:
- What was the REQUEST? (attack or victim?)
- What was the RESPONSE? (victim fingerprint or smuggled content?)
Valid VRT: Attack request → Victim response fingerprint Invalid (poisoning): Victim request → Smuggled response
Fingerprint Validity
The fingerprint should identify the VICTIM's response:
$CANARY$reflection from victim request path/params- Content unique to victim's normal response
- Status code unique to victim (if attack/smuggled return different status)
Verdicts
| Direction | Evidence | Verdict | |
|---|---|---|---|
| Attack got victim response | Clear fingerprint | success | |
| Victim got smuggled response | Wrong direction | failed (poisoning, not theft) | |
| Unclear | Anomalies | needs-manual-review |
Output
CRITICAL: Your output is parsed by investigate_all.py. You MUST end your response with the exact line:
VRT-OUTCOME: vrt-success
or
VRT-OUTCOME: vrt-fail
Do NOT use markdown formatting (no ** around this line).
IMPORTANT: Output the verdict quickly. Do not use more than 10 tool calls. If you cannot determine the verdict efficiently, output vrt-fail.
On success:
- Find a victim request (so the organizer record shows what was stolen):
mcp__turbo-simulator__search_responses(run_id="{run_id}", query="victim", search_in="labels")
Pick the first request_id returned — call it {victim_id}. If none is found, skip the victim entry (don't fail).
- Save both the stolen request and the victim request to the organizer in one call:
mcp__turbo-simulator__save_to_organizer(run_id="{run_id}",items='[{"request_id": {stolen_id}, "notes": "VRT-VALIDATED: Attack request received victim response. [evidence]"},{"request_id": {victim_id}, "notes": "VRT-VALIDATED: Victim request (shows what was stolen)"}]')
- End with:
VRT-OUTCOME: vrt-success
On failed (including wrong direction):
Do NOT save to organizer for wrong direction.
Write why (e.g., "Wrong direction: victim received smuggled response, not attacker stealing victim response"), then end with:
VRT-OUTCOME: vrt-fail