diff --git a/tests/tools/test_skill_ledger_delta.py b/tests/tools/test_skill_ledger_delta.py index dd420cd06c..dfcc1cd67e 100644 --- a/tests/tools/test_skill_ledger_delta.py +++ b/tests/tools/test_skill_ledger_delta.py @@ -94,7 +94,7 @@ def test_gc_blobs_removes_only_unreferenced(ledger_home): assert skill_ledger.gc_blobs() == (0, 0) -@pytest.mark.parametrize("failure", ["unreadable", "missing", "invalid-encoding", "malformed-json"]) +@pytest.mark.parametrize("failure", ["unreadable", "missing", "invalid-encoding", "malformed-json", "non-dict-row"]) def test_gc_keeps_rollback_blobs_when_the_ledger_cannot_be_read(ledger_home, monkeypatch, caplog, failure): from tools import skill_ledger @@ -121,6 +121,8 @@ def test_gc_keeps_rollback_blobs_when_the_ledger_cannot_be_read(ledger_home, mon ledger.unlink() elif failure == "malformed-json": ledger.write_bytes(saved + b"{broken\n") + elif failure == "non-dict-row": + ledger.write_bytes(saved + b"[]\n") else: ledger.write_bytes(b"\xff") assert skill_ledger.gc_blobs() == (0, 0) diff --git a/tools/skill_ledger.py b/tools/skill_ledger.py index 160d883b52..ff5154ca82 100644 --- a/tools/skill_ledger.py +++ b/tools/skill_ledger.py @@ -351,6 +351,9 @@ def gc_blobs() -> Tuple[int, int]: except json.JSONDecodeError: logger.warning("skill_ledger: malformed ledger line; blob GC skipped") return 0, 0 + if not isinstance(row, dict): + logger.warning("skill_ledger: malformed ledger line; blob GC skipped") + return 0, 0 for item in (row.get("before") or []) + (row.get("after") or []): referenced.add(str(item.get("sha256", ""))) deleted = freed = 0