VisionClaw: Deployment Study

This page provides a self-contained supplement for the VisionClaw paper, including the end-to-end analysis methodology, the interactive visualization used to inspect results, key analysis scripts, anonymized example interactions, and the final analysis output. All participant identifiers have been anonymized for dissemination.

Methodology

Reproducible analysis pipeline for the autobiographical deployment study (N=4, 555 interactions).

Note: Raw session logs (raw-logs/) are not publicly released due to privacy and confidentiality concerns. Anonymized sample data is provided in the Example Data tab instead.

Reproduction

Step 1: Log Extraction

1cd scripts/2bash extract.sh /path/to/output/

Extracts raw session logs from the VisionClaw agent runtime. Queries sessions.json for all glass-initiated sessions, uses jq to extract structured fields (timestamp, role, text, tool calls, image flags, token usage), and produces per-participant JSONL files. Output files are renamed to anonymized identifiers (p1p4) and placed in raw-logs/.

Step 2: Quantitative Analysis

1cd scripts/2python3 analyze.py ../raw-logs/

Input: 4 participant JSONL logs in raw-logs/ Output: 555 interactions, 118 sessions, 55 active days, 25.8 hours (see results/analysis-output.txt)

Step 3: Use-Case Classification

555 interactions were classified independently by 4 LLMs (GPT-5.4, GLM-5, Claude Opus-4.6, MiniMax-M2.7). Each model read every interaction and assigned one of 6 categories defined in classification/category-definitions.txt. Results: classification/{gpt,glm,opus,minimax}-classifications.jsonl

Step 4: Reconciliation

Final category percentages were determined by cross-analyst median across the 4 models, validated against two human coders' independent labels.

File Map

1raw-logs/ # Per-participant interaction logs2 p1-glass-sessions.jsonl # 139 raw -> 119 dedup, 17 active days3 p2-glass-sessions.jsonl # 282 raw -> 173 dedup, 19 active days4 p3-glass-sessions.jsonl # 110 raw -> 89 dedup, 5 active days5 p4-glass-sessions.jsonl # 258 raw -> 174 dedup, 14 active days6 7scripts/8 extract.sh # Raw log extraction from VisionClaw system logs9 analyze.py # Main analysis script10 12classification/13 interactions.jsonl # 555 deduplicated interactions (input to classifiers)14 category-definitions.txt # 6 category definitions from the paper15 gpt-classifications.jsonl # GPT-5.4 classification (555 lines)16 glm-classifications.jsonl # GLM-5 classification (555 lines)17 opus-classifications.jsonl # Claude Opus-4.6 classification (555 lines)18 minimax-classifications.jsonl # MiniMax-M2.7 classification (555 lines)19 20results/21 analysis-output.txt # Full output of analyze.py11 classification-output.txt # LLM classification results summary

Key Numbers

1Aggregate (N=4)2 Total interactions 5553 Total sessions 1184 Active participant-days 555 Avg active days/participant 13.8 (range 5--19)6 Total hours 25.87 Avg interactions/day 10.18 Max interactions/day 699 10Per-participant11 P1 119 ix, 17 days, 4.9h, 35 sessions [2026-02-06..2026-03-31]12 P2 173 ix, 19 days, 10.4h, 47 sessions [2026-03-09..2026-03-31]13 P3 89 ix, 5 days, 4.8h, 7 sessions [2026-03-27..2026-03-31]14 P4 174 ix, 14 days, 5.6h, 29 sessions [2026-03-15..2026-03-31]15 16Tools (N=1767 calls, avg 3.2/interaction)17 exec 557 (32%)18 browser 541 (31%)19 read 209 (12%)20 web_search 122 (7%)21 web_fetch 92 (5%)22 process 89 (5%)23 memory_search 49 (3%)24 write 22 (1%)25 image 15 (1%)26 edit 13 (1%)27 Depth: 0=21% | 1=27% | 2-3=23% | 4+=29% (max 27)28 Multi-source (2+): 29%29 30Latency (median)31 All 12.2s32 Non-browser 13.4s33 Browser 15.5s34 Voice-only 8.4s35 36Use-case categories (cross-analyst median, 4 LLMs)37 Retrieve 30%38 Shop 19%39 Save 16%40 Communicate 14%41 Recall 12%42 Control 9%43 44Other45 Camera usage 39%46 No response 2%47 Time of day: morning 26% | afternoon 44% | evening 27% | night 3%48 Session median: 16.0 min

Analysis Pipeline

  1. System log extraction: extract.sh queried the VisionClaw agent runtime’s session store (sessions.json) to find all sessions initiated from the smart glasses (session keys matching agent:main:glass*). For each session, the script used jq to extract structured fields from every message: timestamp, role (user/assistant/toolResult), text content, tool call names, has_image flags, image URL references, and token usage. This produced two outputs per participant: (1) a clean structured JSONL with only the analysis-relevant fields, and (2) a full raw dump including tool results and model thinking traces. Files were sorted by timestamp, then renamed to anonymized identifiers (p1p4) and placed in raw-logs/.
  2. Interaction extraction & dedup: analyze.py parsed both glass-format ([original_instruction]) and text-chat records. Filters removed noise (misrecognition, system messages, short acknowledgements). Deduplication used a 120-second window on normalized query text.
  3. Metrics computation: Tool-chain analysis scanned 50 subsequent events per interaction. Sessions defined by 30-minute inactivity gap. Latency capped at 600s.
  4. Use-case classification: All 555 interactions classified by 4 LLMs in parallel. Each model read the full interaction text and assigned one of 6 categories. Results compared across models and against 2 human coders.
  5. Validation: Final values cross-checked against independent analyses by two other team members. Disagreements resolved through reconciliation and manual review.
  6. Visualization: The Visualization tab provides an interactive D3.js chart generated from the 555-interaction dataset. The chart shows interaction volume over time, colored by use-case category, with per-participant breakdowns.

Scripts

Core scripts used to extract and analyze the study data.

Extracts VisionClaw session records into structured and raw JSONL files.

1#!/usr/bin/env bash2# extract.sh — Extract VisionClaw session logs3# Usage: ./extract.sh [output-dir]4#5# Produces two files:6# 1. visionclaw-all-glass-sessions.jsonl — Clean structured data (timestamp, role, text, tools, usage, image flags)7# 2. visionclaw-all-glass-sessions-full-raw.jsonl — Complete raw session data (everything including tool results, thinking)8#9# Data source: ~/.openclaw/agents/main/sessions/sessions.json10# - Finds all session keys matching "agent:main:glass*"11# - Reads each referenced .jsonl session file12# - Merges and sorts by timestamp1314set -euo pipefail1516SESSIONS_DIR="${HOME}/.openclaw/agents/main/sessions"17SESSIONS_JSON="${SESSIONS_DIR}/sessions.json"18OUTPUT_DIR="${1:-/tmp/openclaw}"1920mkdir -p "$OUTPUT_DIR"2122if [ ! -f "$SESSIONS_JSON" ]; then23 echo "Error: sessions.json not found at $SESSIONS_JSON" >&224 exit 125fi2627echo "Finding glass session files..."2829# Get all glass session file paths from sessions.json30GLASS_FILES=$(jq -r '31 to_entries[] |32 select(.key | startswith("agent:main:glass")) |33 .value.sessionFile34' "$SESSIONS_JSON" 2>/dev/null | sort -u)3536FILE_COUNT=$(echo "$GLASS_FILES" | grep -c '.' || true)37echo "Found $FILE_COUNT glass session references"3839# --- File 1: Structured/clean extraction ---40echo "Extracting structured data..."41echo "$GLASS_FILES" | while read -r f; do42 if [ -f "$f" ]; then43 jq -c '44 select(.type=="message") |45 {46 timestamp: .timestamp,47 role: .message.role,48 content_types: [.message.content[]? | .type],49 text: ([.message.content[]? | select(.type=="text") | .text] | join("\n")),50 tools: ([.message.content[]? | select(.type=="toolCall") | .name] | if length > 0 then . else null end),51 has_image: ([.message.content[]? | .type] | any(. == "image")),52 has_image_url: (([.message.content[]? | select(.type=="text") | .text] | join("\n")) | test("tool_call_image_url")),53 usage: (if .message.usage then {54 input: .message.usage.inputTokens,55 output: .message.usage.outputTokens,56 cost: .message.usage.cost.total57 } else null end)58 }59 ' "$f" 2>/dev/null60 fi61done | sort -t'"' -k4 > "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl"6263# --- File 2: Full raw data ---64echo "Extracting full raw data..."65echo "$GLASS_FILES" | while read -r f; do66 if [ -f "$f" ]; then67 cat "$f"68 fi69done > "${OUTPUT_DIR}/visionclaw-all-glass-sessions-full-raw.jsonl"7071# --- Stats ---72STRUCTURED_LINES=$(wc -l < "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl")73RAW_LINES=$(wc -l < "${OUTPUT_DIR}/visionclaw-all-glass-sessions-full-raw.jsonl")74STRUCTURED_SIZE=$(ls -lh "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl" | awk '{print $5}')75RAW_SIZE=$(ls -lh "${OUTPUT_DIR}/visionclaw-all-glass-sessions-full-raw.jsonl" | awk '{print $5}')7677FIRST_TS=$(jq -r '.timestamp' "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl" | head -1)78LAST_TS=$(jq -r '.timestamp' "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl" | tail -1)7980USER_COUNT=$(jq -r 'select(.role=="user")' "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl" | wc -l)81ASSISTANT_COUNT=$(jq -r 'select(.role=="assistant")' "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl" | wc -l)82IMAGE_COUNT=$(jq -r 'select(.has_image_url==true)' "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl" | wc -l)8384echo ""85echo "=== Done ==="86echo "Structured: ${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl (${STRUCTURED_LINES} lines, ${STRUCTURED_SIZE})"87echo "Full raw: ${OUTPUT_DIR}/visionclaw-all-glass-sessions-full-raw.jsonl (${RAW_LINES} lines, ${RAW_SIZE})"88echo ""89echo "Date range: ${FIRST_TS} → ${LAST_TS}"90echo "Messages: user=${USER_COUNT} assistant=${ASSISTANT_COUNT}"91echo "With camera images: ${IMAGE_COUNT}"92echo ""93echo "Per-day breakdown:"94jq -r '.timestamp[0:10]' "${OUTPUT_DIR}/visionclaw-all-glass-sessions.jsonl" | sort | uniq -c

Quantitative analysis pipeline producing the summary values used in the paper.

1#!/usr/bin/env python32"""3VisionClaw Deployment Study — Analysis Script4===============================================5Merged analysis pipeline integrating multiple independently developed variants.67Includes Thai-noise filtering, system-message filtering, 120-second deduplication, and session-based hour estimates.8Includes timezone conversion and multi-source counting.9Includes a scan window of 50 events, tool usage counting, and per-participant session summaries.1011Usage:12 python3 analyze.py <logs-dir>13"""1415import json, re, os, sys, glob, statistics16from collections import Counter, defaultdict17from datetime import datetime1819# - Configuration -20SESSION_GAP_SEC = 1800 # 30 min21DEDUP_WINDOW_SEC = 120 # 2 min22LAT_CAP_SEC = 600 # 10 min23TIMEZONE_OFFSET = -6 # -6 hours24SCAN_WINDOW = 50 # scan window for tool-chain tracing2526SKIP_SHORT = {"done", "ok", "yes", "no", "ok installed", "hi", "ok do it"}2728# System message patterns to skip29SYS_PATTERNS = [30 r'^A new session was started via /new or /reset',31 r'Summarize this naturally for the user',32 r'just completed successfully\.',33 r'You are running as a subagent',34]353637# - Helpers -3839def load_jsonl(path):40 data = []41 with open(path) as f:42 for line in f:43 try:44 data.append(json.loads(line))45 except:46 continue47 return data484950def parse_ts(ts):51 if not ts:52 return None53 try:54 return datetime.fromisoformat(ts.replace("Z", "+00:00"))55 except:56 return None575859def is_noise(text):60 """Detect Thai-character noise caused by speech-recognition errors."""61 return len(re.findall(r'[\u0E00-\u0E7F]', text or '')) >= 1626364def is_system_message(text):65 """Detect system or metadata messages."""66 return any(re.search(p, text, re.IGNORECASE) for p in SYS_PATTERNS)676869def clean_text_chat(text):70 """Clean messages in text-chat format."""71 t = (text or '').strip()72 if not t:73 return None74 if is_system_message(t):75 return None76 # Handle the [Chat messages since...] wrapper77 if t.startswith('[Chat messages'):78 m = re.search(r'User: (.+?)(?:\nAssistant:|\[Current|\Z)', t, re.S)79 if not m:80 return None81 t = m.group(1).strip()82 # Strip message IDs83 t = re.sub(r'\[message_id:.*?\]', '', t).strip()84 t = re.sub(r'^\[[^\]]+\]\s*', '', t).strip()85 if len(t) < 3:86 return None87 if t.lower().rstrip('!.') in SKIP_SHORT:88 return None89 if is_noise(t):90 return None91 return t929394# - Extraction -9596def extract_interactions(data):97 """Per-message parser for both glass-format and text-chat records."""98 ixs = []99 for i, e in enumerate(data):100 if e.get("role") != "user":101 continue102 text = e.get("text", "")103 ts = e.get("timestamp", "")104 if not ts:105 continue106107 # --- Parse interaction text ---108 if "[original_instruction]" in text:109 # Glass format (supports both multi-line and single-line records)110 om = re.search(111 r'\[original_instruction\]\s*\n?(.*?)(?:\[gemini_rewritten|\[tool_call|\[message_id|\Z)',112 text, re.DOTALL)113 rm = re.search(114 r'\[gemini_rewritten_instruction\]\s*\n?(.*?)(?:\[tool_call|\[message_id|\Z)',115 text, re.DOTALL)116 orig = om.group(1).strip() if om else ""117 rewritten = rm.group(1).strip() if rm else orig118 if orig.strip() in ["<noise>", "", ".", ".."]:119 continue120 if is_noise(orig) or is_noise(rewritten):121 continue122 if not rewritten or len(rewritten) < 3:123 continue124 query = rewritten[:300]125 else:126 # Text-chat format127 query = clean_text_chat(text)128 if not query:129 continue130 query = query[:300]131132 # --- Extract tools and response over the scan window ---133 tools = []134 resp_text = ""135 resp_ts = ""136 for j in range(i + 1, min(i + SCAN_WINDOW, len(data))):137 nxt = data[j]138 role = nxt.get("role")139 if role == "assistant":140 if nxt.get("tools"):141 tools.extend(nxt["tools"])142 nt = (nxt.get("text") or "").strip()143 if nt and not resp_text:144 resp_text = nt[:500]145 resp_ts = nxt.get("timestamp", "")146 elif role == "toolResult":147 continue # skip, don't break — trace full chain148 elif role == "user":149 break150151 # Latency152 lat = None153 t1, t2 = parse_ts(ts), parse_ts(resp_ts)154 if t1 and t2:155 lat = (t2 - t1).total_seconds()156 if lat <= 0 or lat > LAT_CAP_SEC:157 lat = None158159 # Source types for multi-source counting160 source_types = set()161 for t in tools:162 if t in ("exec",):163 source_types.add("shell")164 elif t in ("web_fetch", "web_search"):165 source_types.add("web")166 elif t in ("browser",):167 source_types.add("browser")168 elif t in ("memory_search", "memory_get"):169 source_types.add("memory")170 elif t in ("read", "write", "edit"):171 source_types.add("files")172173 ixs.append({174 "timestamp": ts,175 "date": ts[:10],176 "query": query,177 "tools": tools,178 "tool_count": len(tools),179 "unique_tools": len(set(tools)),180 "has_browser": "browser" in tools,181 "latency": lat,182 "has_response": bool(resp_text),183 "source_count": len(source_types),184 })185 return ixs186187188# - Deduplication (120s normalized window) -189190def dedup_key(s):191 s = (s or "").lower()192 s = re.sub(r'\s+', ' ', s).strip()193 s = re.sub(r'[^a-z0-9 ]', '', s)194 return s[:120]195196197def dedup(rows):198 """Merge-style deduplication that keeps the best tool and latency data."""199 out = []200 seen = {} # key → index in out201 for r in rows:202 k = dedup_key(r["query"])203 t = parse_ts(r["timestamp"])204 if k in seen:205 idx = seen[k]206 prev = out[idx]207 prev_t = parse_ts(prev["timestamp"])208 if prev_t and t and abs((t - prev_t).total_seconds()) < DEDUP_WINDOW_SEC:209 # Merge duplicate records while preserving the most informative fields210 for tool in r["tools"]:211 if tool not in prev["tools"]:212 prev["tools"].append(tool)213 prev["tool_count"] = len(prev["tools"])214 prev["unique_tools"] = len(set(prev["tools"]))215 if r["latency"] and (not prev["latency"] or r["latency"] < prev["latency"]):216 prev["latency"] = r["latency"]217 if r["has_response"]:218 prev["has_response"] = True219 # Recompute source types after merging220 src = set()221 for tool in prev["tools"]:222 if tool in ("exec",): src.add("shell")223 elif tool in ("web_fetch", "web_search"): src.add("web")224 elif tool in ("browser",): src.add("browser")225 elif tool in ("memory_search", "memory_get"): src.add("memory")226 elif tool in ("read", "write", "edit"): src.add("files")227 prev["source_count"] = len(src)228 continue229 if t:230 seen[k] = len(out)231 out.append(r)232 return out233234235# - Sessions & Hours (session-based) -236237def sessionize(rows):238 if not rows:239 return []240 srows = sorted(rows, key=lambda x: x["timestamp"])241 sessions = [[srows[0]]]242 for r in srows[1:]:243 t1 = parse_ts(sessions[-1][-1]["timestamp"])244 t2 = parse_ts(r["timestamp"])245 if t1 and t2 and (t2 - t1).total_seconds() > SESSION_GAP_SEC:246 sessions.append([r])247 else:248 sessions[-1].append(r)249 return sessions250251252def session_hours(sessions):253 total = 0254 for s in sessions:255 if len(s) >= 2:256 t1 = parse_ts(s[0]["timestamp"])257 t2 = parse_ts(s[-1]["timestamp"])258 if t1 and t2:259 d = (t2 - t1).total_seconds() / 3600260 if d >= 0:261 total += d262 return total263264265def session_durations_min(sessions):266 durs = []267 for s in sessions:268 if len(s) >= 2:269 t1 = parse_ts(s[0]["timestamp"])270 t2 = parse_ts(s[-1]["timestamp"])271 if t1 and t2:272 d = (t2 - t1).total_seconds() / 60273 if d >= 0:274 durs.append(d)275 return durs276277278def med(lst):279 return statistics.median(lst) if lst else 0280281282def pct(a, b):283 return (100 * a / b) if b else 0284285286# - Main -287288def main():289 if len(sys.argv) < 2:290 print("Usage: python3 analyze.py <logs-dir>")291 sys.exit(1)292293 logdir = sys.argv[1]294 files = sorted(glob.glob(os.path.join(logdir, "p*-glass-sessions.jsonl")))295 if not files:296 print(f"No matching files in {logdir}")297 sys.exit(1)298299 # --- Extract per participant ---300 per_p = {}301 all_ixs = []302303 for fpath in files:304 name = os.path.basename(fpath).replace("-glass-sessions.jsonl", "")305 pid = name.split("-")[0]306 data = load_jsonl(fpath)307 raw = extract_interactions(data)308 dd = dedup(raw)309 sessions = sessionize(dd)310 hours = session_hours(sessions)311 dates = sorted(set(x["date"] for x in dd if x["date"]))312313 per_p[pid] = {314 "raw": len(raw), "dedup": len(dd),315 "days": len(dates), "hours": hours,316 "sessions": len(sessions),317 "range": f"{dates[0]}..{dates[-1]}" if dates else "",318 }319 all_ixs.extend(dd)320 print(f"{pid}: {len(raw)} raw -> {len(dd)} dedup, {len(dates)} days, {hours:.1f}h")321322 # --- Aggregate ---323 N = len(all_ixs)324 total_days = sum(p["days"] for p in per_p.values())325 total_hours = sum(p["hours"] for p in per_p.values())326 days_list = [p["days"] for p in per_p.values()]327 total_sessions = sum(p["sessions"] for p in per_p.values())328329 # Tools330 all_tools = []331 for ix in all_ixs:332 all_tools.extend(ix["tools"])333 tc = Counter(all_tools)334 tool_total = sum(tc.values())335336 d0 = sum(1 for x in all_ixs if x["tool_count"] == 0)337 d1 = sum(1 for x in all_ixs if x["tool_count"] == 1)338 d23 = sum(1 for x in all_ixs if 2 <= x["tool_count"] <= 3)339 d4p = sum(1 for x in all_ixs if x["tool_count"] >= 4)340 max_depth = max((x["tool_count"] for x in all_ixs), default=0)341342 # Latency343 l_all = sorted([x["latency"] for x in all_ixs if x["latency"]])344 l_nb = sorted([x["latency"] for x in all_ixs if x["latency"] and not x["has_browser"] and x["tool_count"] > 0])345 l_br = sorted([x["latency"] for x in all_ixs if x["latency"] and x["has_browser"]])346 l_vo = sorted([x["latency"] for x in all_ixs if x["latency"] and x["tool_count"] == 0])347348 # Response, multi-source349 no_resp = sum(1 for x in all_ixs if not x["has_response"])350 multi_src = sum(1 for x in all_ixs if x["source_count"] >= 2)351352 # Time of day (MDT conversion)353 tod = Counter()354 for ix in all_ixs:355 t = parse_ts(ix["timestamp"])356 if t:357 h = (t.hour + TIMEZONE_OFFSET) % 24358 if 6 <= h < 12:359 tod["morning"] += 1360 elif 12 <= h < 18:361 tod["afternoon"] += 1362 elif 18 <= h < 24:363 tod["evening"] += 1364 else:365 tod["night"] += 1366367 # Sessions (merged for aggregate)368 all_sessions = sessionize(all_ixs)369 sess_durs = session_durations_min(all_sessions)370371 # Daily372 daily = Counter(x["date"] for x in all_ixs)373 max_daily = max(daily.values()) if daily else 0374375 # --- Output ---376 print(f"\n{'='*70}")377 print(f" Results")378 print(f"{'='*70}")379380 print(f"\nPer-participant:")381 for name, p in sorted(per_p.items()):382 print(f" {name}: {p['dedup']} ix, {p['days']} days, {p['hours']:.1f}h, {p['sessions']} sessions [{p['range']}]")383384 print(f"\nAggregate (N={len(per_p)}):")385 print(f" Total interactions: {N}")386 print(f" Total sessions: {total_sessions}")387 print(f" Total active days: {total_days}")388 print(f" Total hours: {total_hours:.1f}")389 print(f" Avg days/participant: {total_days/len(per_p):.1f} ({min(days_list)}--{max(days_list)})")390 print(f" Avg ix/active day: {N/total_days:.1f}")391 print(f" Max ix in one day: {max_daily}")392393 print(f"\nTools:")394 print(f" Avg tool calls/ix: {tool_total/N:.1f}")395 print(f" Breakdown (N={tool_total}):")396 for t, c in tc.most_common(10):397 print(f" {t:<15} {c:>4} ({pct(c, tool_total):.0f}%)")398 print(f" Depth: 0={pct(d0,N):.0f}% | 1={pct(d1,N):.0f}% | 2-3={pct(d23,N):.0f}% | 4+={pct(d4p,N):.0f}% (max {max_depth})")399 print(f" Multi-source (2+): {pct(multi_src, N):.0f}%")400401 print(f"\nLatency (median):")402 print(f" All: {med(l_all):.1f}s")403 print(f" Non-browser: {med(l_nb):.1f}s")404 print(f" Browser: {med(l_br):.1f}s")405 print(f" Voice-only: {med(l_vo):.1f}s")406407 print(f"\nOther:")408 print(f" No response: {no_resp}/{N} ({pct(no_resp, N):.0f}%)")409 print(f" Time of day: morning {pct(tod['morning'],N):.0f}% | afternoon {pct(tod['afternoon'],N):.0f}% | evening {pct(tod['evening'],N):.0f}% | night {pct(tod['night'],N):.0f}%")410 print(f" Session median: {med(sess_durs):.1f} min")411412 print(f"\nMethodology:")413 print(f" Format: per-message mixed parser (glass + text-chat)")414 print(f" Filters: <noise>, Thai noise, system msgs, short ack")415 print(f" Dedup: {DEDUP_WINDOW_SEC}s window, normalized text key (120 chars)")416 print(f" Tool scan: {SCAN_WINDOW} entries, skip toolResult")417 print(f" Session gap: {SESSION_GAP_SEC//60} min")418 print(f" Hours: session-based (interaction timestamps only)")419 print(f" Timezone: MDT (UTC{TIMEZONE_OFFSET:+d})")420 print(f" Latency cap: {LAT_CAP_SEC}s")421422423if __name__ == "__main__":424 main()

Example Data

Anonymized sample from the raw glass session logs (JSONL format). Each line is one message record as logged by the VisionClaw system.

Analysis

Quantitative analysis of all 555 interactions using scripts/analyze.py.

How We Defined and Computed Each Metric

Below describes how each metric reported in the paper was operationalized:

Run: python3 scripts/analyze.py raw-logs/

Output

Full reproduced output:

1p1: 139 raw -> 119 dedup, 17 days, 4.9h2p2: 282 raw -> 173 dedup, 19 days, 10.4h3p3: 110 raw -> 89 dedup, 5 days, 4.8h4p4: 258 raw -> 174 dedup, 14 days, 5.6h56======================================================================7 Results8======================================================================910Per-participant:11 p1: 119 ix, 17 days, 4.9h, 35 sessions [2026-02-06..2026-03-31]12 p2: 173 ix, 19 days, 10.4h, 47 sessions [2026-03-09..2026-03-31]13 p3: 89 ix, 5 days, 4.8h, 7 sessions [2026-03-27..2026-03-31]14 p4: 174 ix, 14 days, 5.6h, 29 sessions [2026-03-15..2026-03-31]1516Aggregate (N=4):17 Total interactions: 55518 Total sessions: 11819 Total active days: 5520 Total hours: 25.821 Avg days/participant: 13.8 (5--19)22 Avg ix/active day: 10.123 Max ix in one day: 692425Tools:26 Avg tool calls/ix: 3.227 Breakdown (N=1767):28 exec 557 (32%)29 browser 541 (31%)30 read 209 (12%)31 web_search 122 (7%)32 web_fetch 92 (5%)33 process 89 (5%)34 memory_search 49 (3%)35 write 22 (1%)36 image 15 (1%)37 edit 13 (1%)38 Depth: 0=21% | 1=27% | 2-3=23% | 4+=29% (max 27)39 Multi-source (2+): 29%4041Latency (median):42 All: 12.2s43 Non-browser: 13.4s44 Browser: 15.5s45 Voice-only: 8.4s4647Other:48 No response: 9/555 (2%)49 Time of day: morning 26% | afternoon 44% | evening 27% | night 3%50 Session median: 16.0 min5152Methodology:53 Format: per-message mixed parser (glass + text-chat)54 Filters: <noise>, Thai noise, system msgs, short ack55 Dedup: 120s window, normalized text key (120 chars)56 Tool scan: 50 entries, skip toolResult57 Session gap: 30 min58 Hours: session-based (interaction timestamps only)59 Timezone: MDT (UTC-6)60 Latency cap: 600s

Classification

Use-case classification process, from open coding to final LLM-assisted labeling of all 555 interactions.

Phase 1: Open Coding

Three authors independently reviewed the first 200--300 interactions of deployment data and identified 10--15 initial use-case categories through LLM-assisted open coding. Categories were then consolidated via thematic analysis: overlapping codes were merged and unique categories retained, producing the final 6 categories.

1Category Description2--------------------------------------------------------------------3Communicate Hands-free email and messaging (inbox triage, compose, Slack, iMessage)4Retrieve Situated information lookup (weather, research, camera-grounded queries)5Save Hands-free capture (meal photos, receipts, posters, voice notes)6Recall Context-triggered memory recall (past meals, meetings, decisions)7Shop Camera-assisted product discovery (Amazon cart, price comparison)8Control Task automation and device control (IoT, GitHub, cron, LaTeX)

Full definitions and representative examples for each category are in classification/category-definitions.txt.

Phase 2: LLM Classification

Using the category definitions from Phase 1, Author A classified all 555 interactions with 4 LLMs in parallel (GPT-5.4, GLM-5, Opus-4.6, MiniMax-M2.7). Each model read the full interaction text and tool calls, then assigned one of the 6 categories. Final labels were determined by majority vote across the 4 models.

1Category GPT-5.4 GLM-5 Opus-4.6 MiniMax Majority2----------------------------------------------------------------3Communicate 100(18%) 96(17%) 88(16%) 89(16%) 94(17%)4Retrieve 129(23%) 143(26%) 162(29%) 158(28%) 146(26%)5Save 94(17%) 91(16%) 95(17%) 97(17%) 96(17%)6Recall 84(15%) 62(11%) 72(13%) 52( 9%) 63(11%)7Shop 91(16%) 111(20%) 84(15%) 103(19%) 103(19%)8Control 57(10%) 52( 9%) 54(10%) 56(10%) 53(10%)910Agreement: all 4 agree 403/555 (73%), 3-of-4 115 (21%), 2-2 split 37 (7%)

Phase 3: Cross-Analyst Validation

Author B independently classified all 555 interactions using GPT-5.4, manually reviewing each label. Results were compared against Author A's 4-LLM majority vote.

1 Author A Author B2Category 4-LLM maj. (GPT-5.4)3----------------------------------------------4Communicate 94(17%) 59(11%)5Retrieve 146(26%) 183(33%)6Save 96(17%) 91(16%)7Recall 63(11%) 64(12%)8Shop 103(19%) 105(19%)9Control 53(10%) 53(10%)

Phase 4: Final Values

Final category percentages were determined by taking the cross-analyst median of the remaining non-outlier results. Four categories showed strong consensus; the remaining two were resolved by median. Raw medians summed to 103%, so values were normalized to 100% (e.g., Control rounded from 10% to 9%).

1Final use-case distribution (N=555)2 Communicate 14%3 Retrieve 30%4 Save 16%5 Recall 12%6 Shop 19%7 Control 9%

Camera Detection

Camera usage was estimated through two independent methods: (1) automated detection via has_image flags and tool_call_image_url patterns in the session logs (~25%), and (2) LLM-assisted detection during classification, which identified additional camera interactions not captured by log flags (deictic references like "what is this", "add this to cart"). The final estimate of 39% reflects the combined signal.

Anonymized Representative Examples

Interactions where all 4 LLMs unanimously agreed on the category (403/555 = 73%):

1Communicate (75 unanimous / 94 total)2 "Send an email to [email] with the subject 'hi' and no body text"3 "Archive the newsletter emails"4 "Check the latest message in the Slack channel"5 "Send message to [person name] with 'On my way'"6 "Draft a collaboration email to the first author of this paper of [the captured paper]"78Retrieve (101 unanimous / 146 total)9 "Identify the type of sushi in the current view"10 "What time is sunset in [location] today?"11 "Search for the related research paper 'Genie: Generative Interactive Environments'"12 "Compare ingredients of [country name] and [country name] Sun Chips to see if they are the same"13 "Search for over-the-counter allergy meds similar to this prescription"14 "Give me my daily briefing for today"15 "Troubleshoot why the rice cooker lid is stuck"1617Save (84 unanimous / 96 total)18 "Save the current meal to the food log"19 "Create a memo in Notion from the Whole Foods receipt"20 "Create a Google Calendar event for [schedule name] on Saturday at 8 PM"21 "Take a photo and save it to the 'photos' folder in Google Drive"22 "Save the visible hotel information document to memory"23 "Capture the research poster and save it to Notion"2425Recall (49 unanimous / 63 total)26 "Recall what I ate yesterday"27 "Search memory for what I have eaten this week"28 "Check previous conversation about the Barcelona flight"29 "Search notes for gift ideas for [person name]"30 "What was I doing 5 years ago today?"31 "Check key logger for lost keys"3233Shop (66 unanimous / 103 total)34 "Find sunglasses with a design similar to [this] black classic-style sunglasses"35 "Search Amazon for a cheaper price on the Hydro Flask bottle"36 "Search Amazon for Pampers baby wipes price: single pack vs multi-pack"37 "Search Amazon for SIHOO Doro C300 Pro office chair and add to cart"38 "Search for cheaper alternatives for AirPods Pro and text the results via Telegram"3940Control (28 unanimous / 53 total)40 "Turn off the living room light"41 "Change the smart light bulb color to red"42 "Open the PDF with the URL [url] on the Mac"43 "Debug why it is not logging any TSP file in the VisionClaw skill"

Anonymized Ambiguous Cases (2-2 split)

37 interactions (7%) where models split evenly between two categories. These were not individually adjudicated; final category percentages were determined at the aggregate level via cross-analyst median (Phase 4).

Visualization

Session-level dataset used by the bubble chart above. Each entry represents one session: anonymized participant, deployment day, start hour, interaction count, duration in minutes, dominant category, per-category breakdown, and action types. 118 sessions total.

Schema

1{2 "pid": "P1", // Anonymized participant (P1-P4)3 "day": 1, // Deployment day (1-54)4 "hour": 13.15, // Session start (decimal hours, local time)5 "interactions": 25, // Number of interactions in session6 "duration": 67.9, // Session duration (minutes)7 "category": "Shop", // Dominant category (plurality)8 "categories": {"Save": 7, "Shop": 18}, // Per-category counts9 "actions": ["browsed/added to cart", ...] // Action types observed10}

Data (118 sessions)

1{"pid": "P1", "day": 1, "hour": 5.22, "interactions": 6, "duration": 5.2, "category": "Control", "categories": {"Control": 6}, "actions": ["opened webpage", "general query"]}2{"pid": "P1", "day": 1, "hour": 13.15, "interactions": 25, "duration": 67.9, "category": "Shop", "categories": {"Save": 7, "Shop": 18}, "actions": ["browsed/added to cart", "general query", "opened webpage"]}3{"pid": "P1", "day": 5, "hour": 15.9, "interactions": 12, "duration": 5.1, "category": "Communicate", "categories": {"Save": 3, "Shop": 4, "Communicate": 5}, "actions": ["browsed/added to cart", "checked/sent email", "general query", "opened webpage"]}4{"pid": "P1", "day": 6, "hour": 20.12, "interactions": 5, "duration": 15.8, "category": "Shop", "categories": {"Recall": 2, "Shop": 3}, "actions": ["browsed/added to cart", "general query"]}5{"pid": "P1", "day": 6, "hour": 22.43, "interactions": 13, "duration": 48.9, "category": "Shop", "categories": {"Retrieve": 3, "Shop": 9, "Control": 1}, "actions": ["searched web", "browsed/added to cart", "opened webpage"]}6{"pid": "P1", "day": 6, "hour": 13.83, "interactions": 1, "duration": 1, "category": "Shop", "categories": {"Shop": 1}, "actions": ["browsed/added to cart"]}7{"pid": "P1", "day": 7, "hour": 19.6, "interactions": 1, "duration": 1, "category": "Shop", "categories": {"Shop": 1}, "actions": ["browsed/added to cart"]}8{"pid": "P1", "day": 9, "hour": 10.97, "interactions": 1, "duration": 1, "category": "Shop", "categories": {"Shop": 1}, "actions": ["browsed/added to cart"]}9{"pid": "P1", "day": 10, "hour": 23.67, "interactions": 1, "duration": 1, "category": "Save", "categories": {"Save": 1}, "actions": ["saved/noted item"]}10{"pid": "P1", "day": 13, "hour": 19.48, "interactions": 3, "duration": 3.3, "category": "Shop", "categories": {"Shop": 3}, "actions": ["browsed/added to cart"]}11{"pid": "P1", "day": 13, "hour": 20.15, "interactions": 3, "duration": 1.9, "category": "Shop", "categories": {"Shop": 3}, "actions": ["browsed/added to cart"]}12{"pid": "P1", "day": 13, "hour": 2.38, "interactions": 1, "duration": 1, "category": "Shop", "categories": {"Shop": 1}, "actions": ["browsed/added to cart"]}13{"pid": "P1", "day": 26, "hour": 12.42, "interactions": 3, "duration": 20.4, "category": "Shop", "categories": {"Shop": 3}, "actions": ["browsed/added to cart", "searched web"]}14{"pid": "P1", "day": 30, "hour": 23.65, "interactions": 4, "duration": 32.7, "category": "Shop", "categories": {"Shop": 4}, "actions": ["browsed/added to cart"]}15{"pid": "P1", "day": 35, "hour": 11.8, "interactions": 1, "duration": 1, "category": "Shop", "categories": {"Shop": 1}, "actions": ["browsed/added to cart"]}16{"pid": "P1", "day": 38, "hour": 22.57, "interactions": 4, "duration": 7.7, "category": "Shop", "categories": {"Shop": 2, "Retrieve": 1, "Control": 1}, "actions": ["browsed/added to cart", "searched web", "general query"]}17{"pid": "P1", "day": 38, "hour": 23.3, "interactions": 8, "duration": 28.9, "category": "Control", "categories": {"Control": 4, "Shop": 4}, "actions": ["browsed/added to cart", "opened webpage"]}18{"pid": "P1", "day": 49, "hour": 15.28, "interactions": 2, "duration": 1.1, "category": "Communicate", "categories": {"Communicate": 2}, "actions": ["checked/sent email"]}19{"pid": "P1", "day": 49, "hour": 15.87, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["opened webpage"]}20{"pid": "P1", "day": 49, "hour": 16.55, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["opened webpage"]}21{"pid": "P1", "day": 49, "hour": 17.13, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["general query"]}22{"pid": "P1", "day": 50, "hour": 10.37, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["general query"]}23{"pid": "P1", "day": 50, "hour": 11.07, "interactions": 1, "duration": 1, "category": "Communicate", "categories": {"Communicate": 1}, "actions": ["checked/sent email"]}24{"pid": "P1", "day": 50, "hour": 13.85, "interactions": 3, "duration": 1.5, "category": "Shop", "categories": {"Shop": 3}, "actions": ["browsed/added to cart", "general query"]}25{"pid": "P1", "day": 50, "hour": 17.45, "interactions": 1, "duration": 1, "category": "Control", "categories": {"Control": 1}, "actions": ["general query"]}26{"pid": "P1", "day": 51, "hour": 10.78, "interactions": 1, "duration": 1, "category": "Communicate", "categories": {"Communicate": 1}, "actions": ["general query"]}27{"pid": "P1", "day": 51, "hour": 13.63, "interactions": 1, "duration": 1, "category": "Shop", "categories": {"Shop": 1}, "actions": ["browsed/added to cart"]}28{"pid": "P1", "day": 52, "hour": 18.22, "interactions": 3, "duration": 27.9, "category": "Retrieve", "categories": {"Retrieve": 2, "Save": 1}, "actions": ["saved/noted item", "general query"]}29{"pid": "P1", "day": 52, "hour": 13.65, "interactions": 3, "duration": 1.0, "category": "Communicate", "categories": {"Communicate": 2, "Retrieve": 1}, "actions": ["opened webpage", "checked schedule", "general query"]}30{"pid": "P1", "day": 52, "hour": 15.03, "interactions": 2, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 2}, "actions": ["searched web", "general query"]}31{"pid": "P1", "day": 53, "hour": 9.62, "interactions": 2, "duration": 26.6, "category": "Recall", "categories": {"Recall": 1, "Communicate": 1}, "actions": ["checked/sent email", "recalled past info"]}32{"pid": "P1", "day": 53, "hour": 10.68, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["opened webpage"]}33{"pid": "P1", "day": 53, "hour": 12.32, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["opened webpage"]}34{"pid": "P1", "day": 53, "hour": 15.23, "interactions": 1, "duration": 1, "category": "Control", "categories": {"Control": 1}, "actions": ["general query"]}35{"pid": "P1", "day": 54, "hour": 13.73, "interactions": 1, "duration": 1, "category": "Communicate", "categories": {"Communicate": 1}, "actions": ["general query"]}36{"pid": "P2", "day": 32, "hour": 14.47, "interactions": 1, "duration": 1, "category": "Shop", "categories": {"Shop": 1}, "actions": ["browsed/added to cart"]}37{"pid": "P2", "day": 34, "hour": 11.68, "interactions": 3, "duration": 26.6, "category": "Save", "categories": {"Save": 2, "Communicate": 1}, "actions": ["searched web", "checked/sent email", "saved/noted item", "opened webpage"]}38{"pid": "P2", "day": 34, "hour": 14.53, "interactions": 3, "duration": 4.7, "category": "Shop", "categories": {"Save": 1, "Shop": 2}, "actions": ["browsed/added to cart", "searched web", "saved/noted item"]}39{"pid": "P2", "day": 35, "hour": 14.03, "interactions": 1, "duration": 1, "category": "Shop", "categories": {"Shop": 1}, "actions": ["browsed/added to cart"]}40{"pid": "P2", "day": 36, "hour": 10.2, "interactions": 3, "duration": 3.5, "category": "Shop", "categories": {"Shop": 3}, "actions": ["browsed/added to cart", "searched web", "general query"]}41{"pid": "P2", "day": 36, "hour": 11.9, "interactions": 1, "duration": 1, "category": "Save", "categories": {"Save": 1}, "actions": ["searched web", "opened webpage"]}42{"pid": "P2", "day": 36, "hour": 14.55, "interactions": 1, "duration": 1, "category": "Save", "categories": {"Save": 1}, "actions": ["saved/noted item"]}43{"pid": "P2", "day": 37, "hour": 12.08, "interactions": 3, "duration": 3.8, "category": "Save", "categories": {"Save": 2, "Recall": 1}, "actions": ["saved/noted item", "opened webpage"]}44{"pid": "P2", "day": 38, "hour": 23.55, "interactions": 2, "duration": 2.2, "category": "Shop", "categories": {"Shop": 2}, "actions": ["browsed/added to cart", "searched web"]}45{"pid": "P2", "day": 38, "hour": 10.18, "interactions": 2, "duration": 10.3, "category": "Control", "categories": {"Control": 2}, "actions": ["general query"]}46{"pid": "P2", "day": 39, "hour": 18.28, "interactions": 10, "duration": 80.9, "category": "Recall", "categories": {"Control": 3, "Recall": 4, "Shop": 3}, "actions": ["checked tasks", "recalled past info", "opened webpage", "general query", "browsed/added to cart", "saved/noted item"]}47{"pid": "P2", "day": 39, "hour": 11.23, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["searched web"]}48{"pid": "P2", "day": 39, "hour": 11.75, "interactions": 9, "duration": 35.6, "category": "Communicate", "categories": {"Control": 3, "Communicate": 4, "Recall": 2}, "actions": ["checked tasks", "recalled past info", "sent message", "general query", "saved/noted item"]}49{"pid": "P2", "day": 39, "hour": 13.07, "interactions": 3, "duration": 39.8, "category": "Save", "categories": {"Save": 3}, "actions": ["saved/noted item", "general query"]}50{"pid": "P2", "day": 39, "hour": 15.4, "interactions": 2, "duration": 4.7, "category": "Shop", "categories": {"Shop": 2}, "actions": ["browsed/added to cart"]}51{"pid": "P2", "day": 40, "hour": 19.8, "interactions": 9, "duration": 57.2, "category": "Save", "categories": {"Save": 4, "Recall": 1, "Communicate": 2, "Control": 2}, "actions": ["recalled past info", "saved/noted item", "general query", "sent message"]}52{"pid": "P2", "day": 40, "hour": 10.9, "interactions": 12, "duration": 30.9, "category": "Recall", "categories": {"Recall": 6, "Save": 1, "Retrieve": 5}, "actions": ["searched web", "checked tasks", "checked schedule", "sent message", "opened webpage", "general query", "saved/noted item"]}53{"pid": "P2", "day": 41, "hour": 13.08, "interactions": 5, "duration": 11.1, "category": "Retrieve", "categories": {"Retrieve": 5}, "actions": ["searched web"]}54{"pid": "P2", "day": 41, "hour": 13.87, "interactions": 10, "duration": 27.2, "category": "Retrieve", "categories": {"Retrieve": 7, "Recall": 2, "Control": 1}, "actions": ["searched web", "general query", "opened webpage"]}55{"pid": "P2", "day": 41, "hour": 15.7, "interactions": 5, "duration": 29.7, "category": "Control", "categories": {"Control": 5}, "actions": ["general query"]}56{"pid": "P2", "day": 42, "hour": 12.4, "interactions": 1, "duration": 1, "category": "Control", "categories": {"Control": 1}, "actions": ["general query"]}57{"pid": "P2", "day": 42, "hour": 16.07, "interactions": 2, "duration": 3.4, "category": "Save", "categories": {"Save": 2}, "actions": ["general query"]}58{"pid": "P2", "day": 42, "hour": 17.93, "interactions": 1, "duration": 1, "category": "Save", "categories": {"Save": 1}, "actions": ["general query"]}59{"pid": "P2", "day": 43, "hour": 18.93, "interactions": 5, "duration": 15.4, "category": "Save", "categories": {"Save": 2, "Communicate": 1, "Shop": 1, "Control": 1}, "actions": ["searched web", "checked schedule", "checked/sent email", "general query", "browsed/added to cart"]}60{"pid": "P2", "day": 44, "hour": 12.95, "interactions": 5, "duration": 8.7, "category": "Retrieve", "categories": {"Save": 1, "Retrieve": 2, "Recall": 2}, "actions": ["searched web", "recalled past info", "general query"]}61{"pid": "P2", "day": 44, "hour": 14.77, "interactions": 1, "duration": 1, "category": "Save", "categories": {"Save": 1}, "actions": ["checked schedule"]}62{"pid": "P2", "day": 44, "hour": 15.43, "interactions": 4, "duration": 8.9, "category": "Save", "categories": {"Save": 1, "Communicate": 1, "Shop": 1, "Control": 1}, "actions": ["browsed/added to cart", "checked/sent email", "general query"]}63{"pid": "P2", "day": 44, "hour": 17.63, "interactions": 5, "duration": 23.7, "category": "Communicate", "categories": {"Communicate": 3, "Save": 2}, "actions": ["checked/sent email", "checked schedule"]}64{"pid": "P2", "day": 45, "hour": 13.32, "interactions": 2, "duration": 4.8, "category": "Retrieve", "categories": {"Retrieve": 1, "Shop": 1}, "actions": ["browsed/added to cart", "general query"]}65{"pid": "P2", "day": 45, "hour": 16.73, "interactions": 5, "duration": 49.0, "category": "Recall", "categories": {"Save": 1, "Recall": 2, "Control": 1, "Retrieve": 1}, "actions": ["saved/noted item", "general query"]}66{"pid": "P2", "day": 46, "hour": 11.12, "interactions": 1, "duration": 1, "category": "Control", "categories": {"Control": 1}, "actions": ["opened webpage"]}67{"pid": "P2", "day": 47, "hour": 14.9, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["searched web", "opened webpage"]}68{"pid": "P2", "day": 50, "hour": 22.35, "interactions": 4, "duration": 5.2, "category": "Save", "categories": {"Save": 4}, "actions": ["searched web", "checked schedule"]}69{"pid": "P2", "day": 50, "hour": 23.98, "interactions": 6, "duration": 14.0, "category": "Shop", "categories": {"Shop": 4, "Recall": 2}, "actions": ["searched web", "opened webpage", "general query", "browsed/added to cart", "saved/noted item"]}70{"pid": "P2", "day": 51, "hour": 13.1, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["searched web"]}71{"pid": "P2", "day": 51, "hour": 14.88, "interactions": 3, "duration": 8.5, "category": "Retrieve", "categories": {"Recall": 1, "Retrieve": 2}, "actions": ["searched web", "recalled past info", "general query", "opened webpage"]}72{"pid": "P2", "day": 52, "hour": 22.28, "interactions": 6, "duration": 30.5, "category": "Retrieve", "categories": {"Retrieve": 6}, "actions": ["searched web", "general query", "opened webpage"]}73{"pid": "P2", "day": 52, "hour": 10.95, "interactions": 3, "duration": 16.1, "category": "Save", "categories": {"Save": 2, "Retrieve": 1}, "actions": ["searched web", "general query", "opened webpage"]}74{"pid": "P2", "day": 52, "hour": 12.1, "interactions": 2, "duration": 1, "category": "Shop", "categories": {"Shop": 2}, "actions": ["browsed/added to cart"]}75{"pid": "P2", "day": 52, "hour": 13.3, "interactions": 6, "duration": 31.2, "category": "Recall", "categories": {"Recall": 6}, "actions": ["recalled past info", "general query"]}76{"pid": "P2", "day": 52, "hour": 16.35, "interactions": 4, "duration": 3.6, "category": "Shop", "categories": {"Shop": 4}, "actions": ["browsed/added to cart", "searched web", "general query"]}77{"pid": "P2", "day": 54, "hour": 20.5, "interactions": 4, "duration": 18.7, "category": "Retrieve", "categories": {"Retrieve": 3, "Save": 1}, "actions": ["searched web", "checked schedule", "opened webpage"]}78{"pid": "P2", "day": 54, "hour": 23.2, "interactions": 7, "duration": 6.9, "category": "Retrieve", "categories": {"Save": 1, "Retrieve": 6}, "actions": ["searched web", "recalled past info", "general query", "opened webpage"]}79{"pid": "P2", "day": 54, "hour": 0.0, "interactions": 2, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 2}, "actions": ["general query"]}80{"pid": "P2", "day": 54, "hour": 10.03, "interactions": 3, "duration": 3.2, "category": "Shop", "categories": {"Shop": 3}, "actions": ["searched web", "browsed/added to cart"]}81{"pid": "P2", "day": 54, "hour": 10.8, "interactions": 2, "duration": 3.5, "category": "Shop", "categories": {"Shop": 2}, "actions": ["browsed/added to cart", "searched web"]}82{"pid": "P2", "day": 54, "hour": 12.73, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["searched web"]}83{"pid": "P3", "day": 50, "hour": 14.15, "interactions": 31, "duration": 145.6, "category": "Save", "categories": {"Save": 26, "Communicate": 3, "Control": 2}, "actions": ["recalled past info", "checked/sent email", "saved/noted item", "general query"]}84{"pid": "P3", "day": 51, "hour": 18.85, "interactions": 3, "duration": 8.2, "category": "Save", "categories": {"Communicate": 1, "Save": 2}, "actions": ["saved/noted item", "general query"]}85{"pid": "P3", "day": 52, "hour": 16.5, "interactions": 10, "duration": 21.8, "category": "Retrieve", "categories": {"Retrieve": 6, "Communicate": 1, "Recall": 2, "Save": 1}, "actions": ["searched web", "recalled past info", "checked/sent email", "general query", "saved/noted item"]}86{"pid": "P3", "day": 53, "hour": 18.35, "interactions": 6, "duration": 26.9, "category": "Save", "categories": {"Save": 3, "Control": 2, "Recall": 1}, "actions": ["checked tasks", "saved/noted item"]}87{"pid": "P3", "day": 53, "hour": 19.43, "interactions": 19, "duration": 48.9, "category": "Save", "categories": {"Recall": 4, "Shop": 4, "Save": 7, "Retrieve": 2, "Communicate": 2}, "actions": ["searched web", "recalled past info", "opened webpage", "sent message", "checked/sent email", "general query", "saved/noted item"]}88{"pid": "P3", "day": 53, "hour": 10.38, "interactions": 5, "duration": 8.4, "category": "Retrieve", "categories": {"Retrieve": 5}, "actions": ["searched web", "checked schedule", "general query"]}89{"pid": "P3", "day": 54, "hour": 19.15, "interactions": 15, "duration": 25.7, "category": "Retrieve", "categories": {"Retrieve": 8, "Save": 6, "Communicate": 1}, "actions": ["searched web", "recalled past info", "checked/sent email", "general query", "saved/noted item"]}90{"pid": "P4", "day": 38, "hour": 23.38, "interactions": 10, "duration": 38.5, "category": "Shop", "categories": {"Control": 3, "Shop": 5, "Communicate": 2}, "actions": ["searched web", "checked tasks", "opened webpage", "checked/sent email", "general query", "browsed/added to cart", "saved/noted item"]}91{"pid": "P4", "day": 38, "hour": 8.78, "interactions": 6, "duration": 25.3, "category": "Retrieve", "categories": {"Communicate": 2, "Retrieve": 3, "Recall": 1}, "actions": ["searched web", "recalled past info", "checked schedule", "checked/sent email", "general query", "saved/noted item"]}92{"pid": "P4", "day": 38, "hour": 10.03, "interactions": 1, "duration": 1, "category": "Control", "categories": {"Control": 1}, "actions": ["general query"]}93{"pid": "P4", "day": 39, "hour": 8.8, "interactions": 5, "duration": 29.1, "category": "Communicate", "categories": {"Communicate": 3, "Control": 1, "Save": 1}, "actions": ["checked/sent email", "checked tasks", "recalled past info", "saved/noted item"]}94{"pid": "P4", "day": 39, "hour": 9.93, "interactions": 1, "duration": 1, "category": "Communicate", "categories": {"Communicate": 1}, "actions": ["sent message"]}95{"pid": "P4", "day": 39, "hour": 10.85, "interactions": 2, "duration": 3.2, "category": "Control", "categories": {"Control": 1, "Retrieve": 1}, "actions": ["searched web", "checked tasks"]}96{"pid": "P4", "day": 40, "hour": 20.7, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["searched web"]}97{"pid": "P4", "day": 40, "hour": 21.37, "interactions": 4, "duration": 2.4, "category": "Communicate", "categories": {"Communicate": 3, "Retrieve": 1}, "actions": ["checked/sent email"]}98{"pid": "P4", "day": 40, "hour": 9.17, "interactions": 11, "duration": 10.4, "category": "Communicate", "categories": {"Communicate": 11}, "actions": ["checked/sent email"]}99{"pid": "P4", "day": 41, "hour": 14.2, "interactions": 3, "duration": 22.5, "category": "Communicate", "categories": {"Communicate": 2, "Retrieve": 1}, "actions": ["checked/sent email", "checked schedule"]}100{"pid": "P4", "day": 41, "hour": 15.92, "interactions": 3, "duration": 12.6, "category": "Retrieve", "categories": {"Save": 1, "Retrieve": 2}, "actions": ["checked schedule", "recalled past info", "saved/noted item"]}101{"pid": "P4", "day": 41, "hour": 17.12, "interactions": 5, "duration": 4.5, "category": "Communicate", "categories": {"Communicate": 5}, "actions": ["checked/sent email"]}102{"pid": "P4", "day": 41, "hour": 17.95, "interactions": 1, "duration": 1, "category": "Communicate", "categories": {"Communicate": 1}, "actions": ["checked/sent email"]}103{"pid": "P4", "day": 44, "hour": 9.1, "interactions": 2, "duration": 1, "category": "Communicate", "categories": {"Communicate": 2}, "actions": ["checked/sent email"]}104{"pid": "P4", "day": 46, "hour": 8.58, "interactions": 8, "duration": 11.3, "category": "Retrieve", "categories": {"Retrieve": 6, "Recall": 2}, "actions": ["searched web", "general query", "opened webpage"]}105{"pid": "P4", "day": 47, "hour": 13.22, "interactions": 1, "duration": 1, "category": "Control", "categories": {"Control": 1}, "actions": ["opened webpage"]}106{"pid": "P4", "day": 48, "hour": 9.27, "interactions": 19, "duration": 43.6, "category": "Communicate", "categories": {"Communicate": 9, "Retrieve": 6, "Recall": 4}, "actions": ["searched web", "checked schedule", "sent message", "opened webpage", "checked/sent email", "general query"]}107{"pid": "P4", "day": 48, "hour": 14.7, "interactions": 3, "duration": 3.3, "category": "Retrieve", "categories": {"Retrieve": 3}, "actions": ["searched web", "general query"]}108{"pid": "P4", "day": 48, "hour": 16.35, "interactions": 1, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 1}, "actions": ["searched web"]}109{"pid": "P4", "day": 49, "hour": 8.47, "interactions": 17, "duration": 34.2, "category": "Retrieve", "categories": {"Retrieve": 11, "Recall": 3, "Communicate": 3}, "actions": ["searched web", "sent message", "checked/sent email", "general query", "saved/noted item"]}110{"pid": "P4", "day": 50, "hour": 8.48, "interactions": 8, "duration": 9.8, "category": "Control", "categories": {"Retrieve": 2, "Control": 3, "Communicate": 3}, "actions": ["searched web", "checked/sent email", "general query"]}111{"pid": "P4", "day": 50, "hour": 12.03, "interactions": 6, "duration": 14.1, "category": "Control", "categories": {"Control": 4, "Recall": 2}, "actions": ["searched web", "general query"]}112{"pid": "P4", "day": 50, "hour": 13.97, "interactions": 8, "duration": 16.4, "category": "Retrieve", "categories": {"Recall": 2, "Retrieve": 4, "Communicate": 2}, "actions": ["opened webpage", "saved/noted item", "general query"]}113{"pid": "P4", "day": 51, "hour": 12.8, "interactions": 2, "duration": 1.1, "category": "Retrieve", "categories": {"Retrieve": 2}, "actions": ["searched web"]}114{"pid": "P4", "day": 52, "hour": 15.05, "interactions": 22, "duration": 19.1, "category": "Retrieve", "categories": {"Retrieve": 14, "Communicate": 8}, "actions": ["checked/sent email", "checked schedule", "general query", "sent message"]}115{"pid": "P4", "day": 53, "hour": 10.42, "interactions": 6, "duration": 3.3, "category": "Retrieve", "categories": {"Communicate": 1, "Retrieve": 4, "Recall": 1}, "actions": ["searched web", "checked/sent email", "checked schedule", "general query"]}116{"pid": "P4", "day": 53, "hour": 15.87, "interactions": 3, "duration": 10.1, "category": "Recall", "categories": {"Recall": 3}, "actions": ["searched web", "general query"]}117{"pid": "P4", "day": 54, "hour": 10.82, "interactions": 12, "duration": 22.7, "category": "Recall", "categories": {"Recall": 6, "Save": 3, "Communicate": 3}, "actions": ["saved/noted item", "recalled past info", "general query", "sent message"]}118{"pid": "P4", "day": 54, "hour": 13.72, "interactions": 3, "duration": 1, "category": "Retrieve", "categories": {"Retrieve": 3}, "actions": ["general query"]}