fix(update,llm): retry failed extractions; surface claude-cli envelope errors; bump to 0.9.37 (#2543, #2554)

#2543 (adopts PR #2546, thanks @michaelxer): a failed extraction is no
longer stamped in the incremental manifest as up-to-date, so graphify
update retries it instead of skipping it forever; a manifest already
poisoned by the old behavior is healed on the next run; genuinely
unchanged files are not re-processed. Extended to the watch save_manifest
paths too.

#2554 (adopts PR #2555, thanks @annieyii): the claude-cli backend now
inspects the stdout envelope for an is_error result (e.g. a rate limit
returned with exit code 0) and raises it on both the zero and non-zero
exit paths, instead of parsing it as an empty success and bisecting
against a live rate limit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
safishamsi
2026-08-08 23:37:49 +01:00
co-authored by Claude Opus 4.8
parent cfc6a75c86
commit 09a34ad87a
11 changed files with 598 additions and 19 deletions
+22
View File
@@ -150,6 +150,28 @@ def test_stamped_manifest_excludes_partial_files():
assert out["code"] == ["x.py"]
def test_stamped_manifest_excludes_failed_ast_sources():
"""#2543: code files whose AST extract failed (missing extra) stay unstamped."""
from pathlib import Path
from graphify.cli import _stamped_manifest_files
files_by_type = {
"document": ["a.md"],
"code": ["/abs/ok.py", "/abs/schema.sql"],
}
sem_result = {
"nodes": [{"id": "1", "source_file": "a.md"}],
"edges": [], "hyperedges": [],
}
out = _stamped_manifest_files(
files_by_type, sem_result, Path("/abs"),
failed_ast_sources={"/abs/schema.sql"},
)
assert out["document"] == ["a.md"]
assert out["code"] == ["/abs/ok.py"]
assert "/abs/schema.sql" not in out["code"]
def test_group_has_partial_marker():
assert _group_has_partial_marker({"nodes": [{"_partial": True}]}) is True
assert _group_has_partial_marker({"edges": [{"_partial": True}]}) is True