Skip to content

Commit 8c0066f

Browse files
illeatmyhatclaude
andcommitted
fix(platform-integrations): guard non-dict chat JSON in Bob session-id + provenance locators
A valid-but-non-dict Bob chat file ([], null, scalar) made .get("sessionId") raise an uncaught AttributeError, crashing the whole audit run (audit_recall.py _bob_session_id, no uuid fallback) and the entire `provenance candidates` run (provenance.py bob step-4). Mirror the isinstance(data, dict) guard the codex branch already uses. Add regression tests seeding a non-dict chat file. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent e0e0681 commit 8c0066f

12 files changed

Lines changed: 89 additions & 10 deletions

File tree

platform-integrations/bob/evolve-lite/lib/evolve-lite/audit_recall.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ def _bob_session_id() -> str | None:
5757
chats.extend((Path.home() / ".bob" / "tmp" / project_hash / "chats").glob("session-*.json"))
5858
for chat in sorted(chats, key=lambda p: p.stat().st_mtime, reverse=True):
5959
try:
60-
sid = json.loads(chat.read_text(encoding="utf-8")).get("sessionId")
60+
data = json.loads(chat.read_text(encoding="utf-8"))
6161
except (OSError, json.JSONDecodeError):
6262
continue
63+
sid = data.get("sessionId") if isinstance(data, dict) else None
6364
if sid:
6465
return str(sid)
6566
except OSError:

platform-integrations/bob/evolve-lite/skills/evolve-lite-provenance/scripts/provenance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def locate_trajectory(session_id, evolve_dir, *, project_root=None, home=None):
177177
data = json.loads(chat.read_text(encoding="utf-8"))
178178
except (OSError, json.JSONDecodeError):
179179
continue
180-
if data.get("sessionId") == session_id:
180+
if isinstance(data, dict) and data.get("sessionId") == session_id:
181181
return chat
182182

183183
return None

platform-integrations/claude/plugins/evolve-lite/lib/evolve-lite/audit_recall.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ def _bob_session_id() -> str | None:
5757
chats.extend((Path.home() / ".bob" / "tmp" / project_hash / "chats").glob("session-*.json"))
5858
for chat in sorted(chats, key=lambda p: p.stat().st_mtime, reverse=True):
5959
try:
60-
sid = json.loads(chat.read_text(encoding="utf-8")).get("sessionId")
60+
data = json.loads(chat.read_text(encoding="utf-8"))
6161
except (OSError, json.JSONDecodeError):
6262
continue
63+
sid = data.get("sessionId") if isinstance(data, dict) else None
6364
if sid:
6465
return str(sid)
6566
except OSError:

platform-integrations/claude/plugins/evolve-lite/skills/evolve-lite/provenance/scripts/provenance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def locate_trajectory(session_id, evolve_dir, *, project_root=None, home=None):
177177
data = json.loads(chat.read_text(encoding="utf-8"))
178178
except (OSError, json.JSONDecodeError):
179179
continue
180-
if data.get("sessionId") == session_id:
180+
if isinstance(data, dict) and data.get("sessionId") == session_id:
181181
return chat
182182

183183
return None

platform-integrations/claw-code/plugins/evolve-lite/lib/evolve-lite/audit_recall.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ def _bob_session_id() -> str | None:
5757
chats.extend((Path.home() / ".bob" / "tmp" / project_hash / "chats").glob("session-*.json"))
5858
for chat in sorted(chats, key=lambda p: p.stat().st_mtime, reverse=True):
5959
try:
60-
sid = json.loads(chat.read_text(encoding="utf-8")).get("sessionId")
60+
data = json.loads(chat.read_text(encoding="utf-8"))
6161
except (OSError, json.JSONDecodeError):
6262
continue
63+
sid = data.get("sessionId") if isinstance(data, dict) else None
6364
if sid:
6465
return str(sid)
6566
except OSError:

platform-integrations/claw-code/plugins/evolve-lite/skills/evolve-lite/provenance/scripts/provenance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def locate_trajectory(session_id, evolve_dir, *, project_root=None, home=None):
177177
data = json.loads(chat.read_text(encoding="utf-8"))
178178
except (OSError, json.JSONDecodeError):
179179
continue
180-
if data.get("sessionId") == session_id:
180+
if isinstance(data, dict) and data.get("sessionId") == session_id:
181181
return chat
182182

183183
return None

platform-integrations/codex/plugins/evolve-lite/lib/evolve-lite/audit_recall.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ def _bob_session_id() -> str | None:
5757
chats.extend((Path.home() / ".bob" / "tmp" / project_hash / "chats").glob("session-*.json"))
5858
for chat in sorted(chats, key=lambda p: p.stat().st_mtime, reverse=True):
5959
try:
60-
sid = json.loads(chat.read_text(encoding="utf-8")).get("sessionId")
60+
data = json.loads(chat.read_text(encoding="utf-8"))
6161
except (OSError, json.JSONDecodeError):
6262
continue
63+
sid = data.get("sessionId") if isinstance(data, dict) else None
6364
if sid:
6465
return str(sid)
6566
except OSError:

platform-integrations/codex/plugins/evolve-lite/skills/evolve-lite/provenance/scripts/provenance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def locate_trajectory(session_id, evolve_dir, *, project_root=None, home=None):
177177
data = json.loads(chat.read_text(encoding="utf-8"))
178178
except (OSError, json.JSONDecodeError):
179179
continue
180-
if data.get("sessionId") == session_id:
180+
if isinstance(data, dict) and data.get("sessionId") == session_id:
181181
return chat
182182

183183
return None

plugin-source/lib/audit_recall.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ def _bob_session_id() -> str | None:
5757
chats.extend((Path.home() / ".bob" / "tmp" / project_hash / "chats").glob("session-*.json"))
5858
for chat in sorted(chats, key=lambda p: p.stat().st_mtime, reverse=True):
5959
try:
60-
sid = json.loads(chat.read_text(encoding="utf-8")).get("sessionId")
60+
data = json.loads(chat.read_text(encoding="utf-8"))
6161
except (OSError, json.JSONDecodeError):
6262
continue
63+
sid = data.get("sessionId") if isinstance(data, dict) else None
6364
if sid:
6465
return str(sid)
6566
except OSError:

plugin-source/skills/evolve-lite/provenance/scripts/provenance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def locate_trajectory(session_id, evolve_dir, *, project_root=None, home=None):
177177
data = json.loads(chat.read_text(encoding="utf-8"))
178178
except (OSError, json.JSONDecodeError):
179179
continue
180-
if data.get("sessionId") == session_id:
180+
if isinstance(data, dict) and data.get("sessionId") == session_id:
181181
return chat
182182

183183
return None

0 commit comments

Comments
 (0)