From 8cee776cee7d5dc3279085797bde2d2dcce21e36 Mon Sep 17 00:00:00 2001 From: safishamsi Date: Fri, 17 Jul 2026 14:56:22 +0100 Subject: [PATCH] docs: cut 0.9.18 changelog and document the incomplete-build refusal (--allow-partial) Stamp the 0.9.18 release date and add a README troubleshooting entry for the new #1951 behavior: an incomplete extraction refuses to overwrite a larger existing graph, with --allow-partial as the escape hatch. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 +- README.md | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4500e9b3..87fe4b20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Full release notes with details on each version: [GitHub Releases](https://github.com/safishamsi/graphify/releases) -## 0.9.18 (unreleased) +## 0.9.18 (2026-07-17) - Fix: an incomplete extraction no longer force-writes a partial graph over a complete one (#1951, thanks @TPAteeq). A crashed AST/semantic pass, a some-chunks-failed run, or a walk that couldn't fully enumerate the corpus (permission-denied subtree) produced a smaller graph that the `to_json(force=True)` path wrote anyway, bypassing the #479 shrink guard; the `--no-cluster` raw dump had no guard at all. Both paths now refuse to overwrite a larger existing graph when the run was incomplete (exit 1, nothing written) unless `--allow-partial` is passed, and a present-but-unparseable existing graph fails closed (a corrupt/mid-write file could be hiding a complete graph). `detect()`'s `walk_errors` now count as incomplete too. - Fix: `graph.json`, `manifest.json`, and the other JSON artifacts are now written atomically (#1952, thanks @TPAteeq). A kill, OOM, or ENOSPC mid-write used to leave a truncated file — and a truncated `graph.json` then wedged every later run via the shrink guard's fail-safe. Writes now go to a temp file in the same directory and `os.replace` into place (writing *through* a symlink so shared-store setups keep working); the writers the original change missed (the `--no-cluster` dump, `merge-graphs`/`merge-chunks`/`merge-semantic`, the analysis/labels sidecars, and the global graph/manifest) are routed through it too. diff --git a/README.md b/README.md index 81685cf7..c4fd30da 100644 --- a/README.md +++ b/README.md @@ -553,6 +553,9 @@ PowerShell treats a leading `/` as a path separator. Use `graphify .` (no slash) **Graph has fewer nodes after `--update` or rebuild** If a refactor deleted files, the old nodes linger. Pass `--force` (or set `GRAPHIFY_FORCE=1`) to overwrite even when the rebuild has fewer nodes. +**`extract` exits with "extraction was incomplete ... refusing to overwrite"** +When an extraction pass crashes or a walk can't fully read the corpus, the run would be smaller than a complete one, so `graphify extract` refuses to overwrite a larger existing graph with the partial result (protecting your `graph.json`). Fix the underlying failure and re-run, or pass `--allow-partial` to overwrite anyway. + **Graph has duplicate nodes for the same entity (ghost duplicates)** Ghost duplicates (same symbol appearing twice — once from AST extraction with a source location, once from semantic extraction without) are now automatically merged at build time. If you see this in a graph built before v0.8.33, run a full re-extract to clean up: ```bash