Summary
diffctx . --diff HEAD~1 hangs indefinitely (no output, eventually OOM/SIGKILL,
rc=137/142) on large real-world repos for a trivial diff. The documented
300s pipeline timeout does not bound total runtime.
Repro (diffctx 1.10.0, pipx binary)
Real-world test repos, each diffctx . --diff HEAD~1:
| repo |
diff size |
result |
| gitpod (Go/TS monorepo) |
11 files, 12+/12- (24 lines) |
>200s, 0 bytes output, killed (rc=142 at a hard 200s cap; rc=137 after ~8000s unbounded) |
| pytorch |
7 files |
~1848s then SIGKILL (rc=137), 0 output |
| react-native (similar monorepo) |
5 files |
rc=0 in 2s ✓ |
| elasticsearch |
1 file |
rc=0 in 37s ✓ |
| sentry / numpy / llama.cpp / … |
1–5 files |
rc=0, seconds ✓ |
So it is repo-specific (size/shape), not diff-size driven: a 24-line gitpod diff
never completes while a 5-file react-native diff is instant.
Notable
- The cost is repo-size-proportional, not diff-proportional — points at the
candidate-discovery / parse / graph-build phase scanning the whole tree, not
the (tiny) diff.
- The pipeline
timeout (default 300s, DEFAULT_PIPELINE_TIMEOUT) does not
abort it — gitpod ran ~8000s in one run. The timeout does not cover the
hanging phase (or isn't enforced over total wall-clock). A bounded run should
fail fast with the actionable-error contract, not hang for hours.
Expected
Either complete in seconds for a trivial diff (like react-native), or the
timeout aborts with a clear error well before SIGKILL. Hanging unbounded +
OOM is the bug.
Likely related
Same family as #65 (the engine pulls in / scans far more of the repo than the
diff warrants); here it crosses from over-selection into non-termination on the
largest repos.
Summary
diffctx . --diff HEAD~1hangs indefinitely (no output, eventually OOM/SIGKILL,rc=137/142) on large real-world repos for a trivial diff. The documented300s pipeline timeout does not bound total runtime.
Repro (diffctx 1.10.0, pipx binary)
Real-world test repos, each
diffctx . --diff HEAD~1:So it is repo-specific (size/shape), not diff-size driven: a 24-line gitpod diff
never completes while a 5-file react-native diff is instant.
Notable
candidate-discovery / parse / graph-build phase scanning the whole tree, not
the (tiny) diff.
timeout(default 300s,DEFAULT_PIPELINE_TIMEOUT) does notabort it — gitpod ran ~8000s in one run. The timeout does not cover the
hanging phase (or isn't enforced over total wall-clock). A bounded run should
fail fast with the actionable-error contract, not hang for hours.
Expected
Either complete in seconds for a trivial diff (like react-native), or the
timeout aborts with a clear error well before SIGKILL. Hanging unbounded +
OOM is the bug.
Likely related
Same family as #65 (the engine pulls in / scans far more of the repo than the
diff warrants); here it crosses from over-selection into non-termination on the
largest repos.