Skip to content

diffctx hangs unbounded (no output, OOM/SIGKILL) on large repos for trivial diffs; 300s timeout ineffective #70

Description

@nikolay-e

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions