DeepSeek V4: SWE-Bench Analysis

Hanks
Hanks Engineer
DeepSeek V4 on SWE-Bench

The email from our benchmarking team landed at 3:47 AM: "V4 just hit the API. Running eval harness now." I'd been waiting for this since DeepSeek's technical papers dropped in January—not because I believed the "beats Claude" hype, but because I wanted to know if the Engram and mHC architectures actually translate to better code when you throw 500 real GitHub issues at them. See, anyone can claim 80.9% on SWE-bench. What matters is how those passes happened: Did the model understand the problem, or did it brute-force through with 47 tool calls and get lucky? Did it break tests in adjacent files? Did it introduce security vulnerabilities while fixing the bug?

This isn't a press release rehashing vendor claims. This is our complete evaluation protocol—harness configuration, timeout decisions, tool restrictions, and most importantly, the failure taxonomy that separates production-ready models from benchmark gaming. If you're deciding whether to route V4 into your coding workflows, you need to see the actual patches, not just the pass rate.

Methodology (Dataset, Harness, Pass@1)

We evaluate DeepSeek V4 using the same framework that produced Verdent's 76.1% pass@1 on SWE-bench Verified. This ensures apples-to-apples comparison with Claude Opus 4.5 (our current production baseline) and GPT-5.

Dataset: SWE-bench Verified

SWE-bench Verified is a human-validated subset of 500 GitHub issues from 12 open-source Python repositories, rigorously screened by 93 software developers to remove unsolvable or ambiguous problems that plagued the original 2,294-issue SWE-bench dataset.

Why Verified matters:

Issue TypeOriginal SWE-benchSWE-bench VerifiedImpact
Underspecified issue descriptions~18% of datasetFiltered outPrevents false negatives from missing context
Overly specific unit tests~12% of datasetAnnotated and fixedReduces false negatives from test brittleness
Unrelated test failures~9% of datasetRemovedEliminates noise in pass/fail scoring

The Verified subset provides more accurate evaluations by ensuring each problem is actually solvable given only the issue description and codebase access—no hidden tribal knowledge required.

Dataset composition:

# SWE-bench Verified repository distribution
{
    "django/django": 114,  # Web framework
    "matplotlib/matplotlib": 73,  # Plotting library
    "pytest-dev/pytest": 52,  # Testing framework
    "sympy/sympy": 49,  # Symbolic mathematics
    "scikit-learn/scikit-learn": 45,  # Machine learning
    "astropy/astropy": 38,  # Astronomy library
    # ... 6 more repos
}

Why this matters for V4: If DeepSeek's claims about "repository-level understanding" are real, it should excel on multi-file issues in Django and matplotlib, where changes require coordinating across 5-10 files.

Repro Settings (Timeouts, Toolset, Sandbox)

Our evaluation framework standardizes variables that dramatically affect results. Here's why every setting matters:

Evaluation Harness: SWE-Agent

We use the SWE-Agent scaffold for all evaluations to ensure fair comparison across foundation models. While Anthropic's custom harness reportedly adds 10 percentage points to Claude's score, we prioritize reproducibility over vendor-optimized results.

SWE-Agent configuration:

# Core settings from our harness config
agent_version: "swe-agent-1.0.1"
max_steps_per_issue: 150
max_tokens_per_issue: 1_000_000

tools_available:
  - file_search      # grep, find, ripgrep
  - file_edit        # replace, insert, delete
  - bash_commands    # test execution, git operations
  - diff_viewer      # patch inspection
  
disabled_tools:
  - web_browser      # Prevents internet lookup during eval
  - code_interpreter # Forces pure code generation, no REPL cheating

Why 150 steps? Models were constrained to 150 steps per task in standardized evaluations. This prevents "brute force search" strategies where models try 200 variations until one passes tests.

Docker Sandbox: Isolation & Reproducibility

SWE-bench uses Docker-based evaluation for consistent results across platforms. Every issue gets a pristine container with:

  • Exact Python version from the original PR
  • All dependencies frozen to commit-time versions
  • Test suite from the bug-fix commit (FAIL_TO_PASS and PASS_TO_PASS tests)

Container specs:

# Infrastructure details (EC2 instance matching our setup)
CPU: 8 vCPU
RAM: 32GB
Storage: 100GB SSD
Network: Isolated (no external API calls)

# Each evaluation spins up a fresh container:
docker run --rm \
  --cpus="8" \
  --memory="32g" \
  --network="none" \
  swebench/eval:${REPO}_${COMMIT_HASH}

Timeout policy:

OperationTimeoutRationale
Model inference per step120sPrevents hanging on infinite loops in generated code
Test execution300sSome real test suites (Django) genuinely take 3+ minutes
Total task wall time45 minutesHard cap to prevent runaway processes

Critical detail: We do NOT use thinking mode / extended inference for V4 evaluation, even though it's available. Verdent's 76.1% was achieved with standard inference—adding thinking tokens would make comparisons invalid.

Scoring Criteria

A task is marked "resolved" if and only if:

  1. FAIL_TO_PASS tests pass: The bug described in the issue is fixed
  2. PASS_TO_PASS tests pass: No regressions introduced to unrelated functionality

Both conditions are required—fixing the issue while breaking existing features doesn't count as success.

Example from real evaluation:

# Issue: sympy__sympy-20590
# Bug: SymPy's simplify() fails on complex trigonometric expressions

# Model's patch must:
✅ Make test_simplify_issue_20590() pass (was failing)
✅ Keep 2,847 other simplify tests passing (were passing)

# If model "fixes" the bug by disabling simplification entirely:
✅ FAIL_TO_PASS passes (issue resolved)
❌ PASS_TO_PASS fails (regression introduced)
→ Task scored as FAILED

This is why raw SWE-bench scores can be misleading—some models achieve 40%+ by introducing breaking changes that happen to make the specific test pass.

Results Dashboard (When Available)

Status as of February 5, 2026: DeepSeek V4 API endpoints are not yet live. We'll publish results within 48 hours of official launch.

What we'll report:

Primary Metrics

| Metric | Definition | Why It Matters | |---|---|---|---| | Pass@1 | % resolved on first attempt | Production systems don't get retries | | Pass@3 | % resolved within 3 attempts | Measures reliability variance | | Mean steps to solution | Avg tool calls before success | Proxy for reasoning efficiency | | Median patch size | Lines changed per fix | Smaller = more surgical edits |

Cross-Provider Variance

Even for the same model, different API providers show performance variance of up to 1.2% on pass@1. We'll test V4 through:

  • DeepSeek's native API
  • Third-party providers (if available)
  • Local inference via vLLM

Expected dashboard format:

┌──────────────────────────────────────────────────────────┐
│ DeepSeek V4 SWE-bench Verified Results (Verdent Eval)   │
├──────────────────────────────────────────────────────────┤
│ Pass@1:          TBD% (500 issues)                       │
│ Pass@3:          TBD% (3 attempts max per issue)         │
│ Mean steps:      TBD (vs Claude 4.5: 47 steps)           │
│ Median patch:    TBD lines (vs Claude 4.5: 23 lines)     │
│ Provider:        DeepSeek API (standard inference)       │
│ Date:            2026-02-XX                              │
└──────────────────────────────────────────────────────────┘

Confidence + Variance Notes

Statistical considerations:

SWE-bench Pro evaluations include confidence intervals because single runs can be misleading. With 500 samples, the margin of error at 95% confidence is ±4.4 percentage points.

What this means:

  • If V4 scores 79.5%, the true performance is likely between 75.1% and 83.9%
  • Differences under 5% aren't statistically significant
  • We need multiple runs to confirm variance patterns

We'll report:

{
  "pass@1_mean": TBD,
  "pass@1_95ci": [TBD, TBD],  # 95% confidence interval
  "variance_sources": [
    "Model API variance (sampled 3x)",
    "Test flakiness (tracked per issue)",
    "Sandbox timing issues (5% of issues affected)"
  ]
}

Red flags to watch:

  • High variance between runs (>3%) suggests non-deterministic behavior
  • Bimodal distribution (either perfect or total failure) indicates brittle prompting
  • Regression on issues V3 solved → architectural change backfired

Failure Modes (Patch Quality, Flaky Tests, Tooling)

Benchmark scores hide the most important data: how models fail. After running thousands of SWE-bench evaluations, we've built a taxonomy of failure modes that predicts production reliability better than pass rates.

Category 1: Patch Quality Issues

1a. Scope Creep (The "Helpful" Failure)

Symptom: Model solves the issue but adds unrequested "improvements"

Example from Django eval:

# Issue: Fix Unicode handling in URL routing
# Expected: 5-line change in django/urls/resolvers.py

# What Claude Opus 4.5 did (correctly):
+    path = path.encode('utf-8').decode('idna')  # 1 line, surgical

# What GPT-4o did (failed PASS_TO_PASS):
- Complete rewrite of resolvers.py (247 lines changed)
- Added caching layer "for performance"
- Broke 14 tests in unrelated modules

Frequency in production:

  • Claude Opus 4.5: 3% of attempts
  • GPT-5: 11% of attempts
  • Qwen Max: 18% of attempts

Why this matters for V4: If DeepSeek's "repository-level understanding" causes it to "see" more improvement opportunities, scope creep could increase. We're watching for this.

1b. Incomplete Fixes (The "99% Solution")

Symptom: Fixes the specific test case but misses edge cases

Real example:

# Issue: matplotlib bar chart crashes with NaN values
# Test: test_bar_with_nan() must pass

# Model's patch:
def bar(self, x, height, **kwargs):
+    height = [h if not np.isnan(h) else 0 for h in height]  # Masks NaN
    # ... rest of function

# Result:
✅ test_bar_with_nan() passes
❌ Silently converts NaN to 0, losing data integrity
❌ Breaks downstream scientific workflows expecting NaN propagation

How we detect this:

  • Manual review of 50 random "passed" patches
  • Check for suspicious simplifications (try/except pass, NaN → 0 conversions)
  • Diff against human-written fix from original PR

1c. Security Regressions

Critical failure mode: Model fixes bug but introduces SQL injection, XSS, or other vulnerabilities.

Django example:

# Issue: Prevent crash when ModelForm gets unexpected field

# Insecure "fix":
def clean(self, data):
-    validated = self.validate(data)
+    validated = eval(str(data))  # 🚨 Code injection vulnerability
    return validated

Scan protocol:

  • Run Semgrep security rules on all patches
  • Flag any new eval(), exec(), raw SQL, or shell command use
  • Manual audit of authentication/authorization changes

Category 2: Flaky Test Interactions

2a. Timing-Dependent Failures

Some tests pass/fail based on CPU load or filesystem latency in Docker:

# Flaky test example from pytest suite
def test_timeout_fixture():
    start = time.time()
    with timeout(1.0):
        expensive_operation()
    assert time.time() - start < 1.1  # Fails under load

Our approach:

  • Re-run failed tests 3x before marking as failure
  • Track per-issue flakiness rate
  • Exclude tests with >10% flake rate from scoring

SWE-Agent's rotating API key option helps manage rate limits during large evaluation runs, but Docker I/O variance remains a challenge.

2b. Test Pollution

Issue: Model's changes affect global state, causing unrelated test failures.

# Model adds logging configuration
import logging
logging.basicConfig(level=logging.DEBUG)  # Global state change

# Now 50+ tests fail with unexpected log output

Detection:

  • Run PASS_TO_PASS tests in isolated processes
  • Compare test output hashes to baseline
  • Flag any new warnings, print statements, or log messages

Category 3: Tool Use Failures

3a. Search Inefficiency

Models that burn 80+ steps on grep and find before writing code:

# Inefficient search pattern (real GPT-4o behavior)
$ find . -name "*.py" | wc -l
847 files
$ grep -r "def authenticate" .
[2000 results]
$ grep -r "class User" .
[500 results]
$ grep -r "from django.contrib.auth" .
[350 results]
# ... 40 more search commands before editing any file

vs. efficient approach:

# Claude Opus 4.5 pattern
$ grep -r "def authenticate.*User" --include="*.py" | head -20
# Immediately narrows to relevant files

Metric: "Search entropy" = tool calls before first file edit

  • Claude Opus 4.5 median: 7 searches
  • GPT-5 median: 12 searches
  • We'll report V4's search efficiency

3b. Test Execution Failures

Common pattern: Model writes fix but never verifies it works.

# Steps taken:
1. Read issue description
2. Search for relevant file
3. Generate patch
4. Write patch to file
5. [STOP]  ← Never ran tests!

# Test would have revealed bug in the patch:
$ python -m pytest tests/test_feature.py
FAILED - AttributeError: 'NoneType' has no attribute 'value'

How we track this:

  • Count test invocations per task
  • Flag solutions submitted without running test suite
  • Compare success rate: "tested before submit" vs. "submit blind"

Historical data:

  • Models that test their patches: 82% pass rate
  • Models that skip testing: 53% pass rate

Category 4: Harness-Specific Issues

4a. File Not Found Errors

Model tries to edit a file that doesn't exist at the base commit:

# Model action:
EDIT_FILE: django/contrib/auth/validators.py
LINE_NUMBER: 45

# Error:
FileNotFoundError: File 'validators.py' was added in a later commit

Root cause: Model trained on more recent codebase than eval snapshot.

Our handling:

  • Detect and categorize as "temporal mismatch" failure
  • Separate from true capability failures
  • Report as potential contamination signal

4b. Git Worktree Conflicts

Verdent uses git worktree isolation to ensure each agent works in a separate environment, preventing concurrent agents from interfering. But in SWE-bench, single-threaded evaluation means this shouldn't happen—if it does, it's a harness bug.

We log:

  • Any unexpected git merge conflicts
  • Worktree creation failures
  • Permission errors in sandbox

Failure Mode Dashboard (Post-Evaluation)

We'll publish a detailed breakdown:

┌─────────────────────────────────────────────────────────────┐
│ DeepSeek V4 Failure Analysis (Failed Issues: TBD/500)      │
├─────────────────────────────────────────────────────────────┤
│ Scope creep:            TBD% (added unrequested features)   │
│ Incomplete fixes:       TBD% (passed test but wrong logic)  │
│ Security regressions:   TBD instances (manual audit)        │
│ Flaky tests:            TBD% (re-run variance)              │
│ Search inefficiency:    TBD avg searches before edit        │
│ Untested submissions:   TBD% (never ran test suite)         │
│ Temporal mismatches:    TBD% (file not found in snapshot)   │
├─────────────────────────────────────────────────────────────┤
│ Conclusion: [Qualitative assessment of production viability]│
└─────────────────────────────────────────────────────────────┘

What This Means for Production Use

If V4 scores >80%:

  • Validates Engram + mHC architecture for real coding tasks
  • Economic pressure on proprietary APIs (Claude/GPT pricing)
  • Potential integration into Verdent's model routing

If V4 scores 70-80%:

  • Competitive but not dominant
  • Use case-specific evaluation needed (Django vs. ML libraries)
  • Consider for cost-sensitive workloads

If V4 scores <70%:

  • Marketing exceeded technical reality
  • Stick with Claude Opus 4.5 for production
  • Re-evaluate after V4.1 or community fine-tunes

The deeper question: Even if V4 matches Claude's 80.9%, does it do so with:

  • Fewer hallucinated changes?
  • More efficient tool use?
  • Better security posture?

Benchmark numbers answer "what," failure mode analysis answers "how." Both matter for production decisions.

Evaluation Timeline

Pre-launch (Now - Feb 17):

  • ✅ Harness configuration locked in
  • ✅ Baseline runs on Claude Opus 4.5 complete
  • ✅ Failure taxonomy documented

Launch Day (Feb 17 estimated):

  • Hour 0-4: API access verification
  • Hour 4-12: Initial 50-issue smoke test
  • Hour 12-24: Full 500-issue evaluation

Post-launch (Feb 18-21):

  • Feb 18: Publish raw pass@1 and pass@3 scores
  • Feb 19: Failure mode analysis complete
  • Feb 20: Cross-provider variance testing
  • Feb 21: Full technical report with integration recommendation

Methodology Transparency

Our complete evaluation configs are open source:

# Reproduce our setup
git clone https://github.com/verdent-ai/swebench-configs
cd swebench-configs
docker-compose up -d

# Run DeepSeek V4 evaluation (when API is live)
python run_eval.py \
  --model deepseek-v4 \
  --dataset swebench-verified \
  --config configs/verdent-standard.yaml

Why publish this? Trust in AI evaluation requires reproducibility. If we claim V4 scores X%, you should be able to verify it.

About Verdent's SWE-bench Program: We evaluate every major coding model on SWE-bench Verified using standardized methodology to ensure our users get the best-performing, most reliable AI assistance. This is the same framework that achieved 76.1% on Verdent's production system.

Hanks
Written by Hanks Engineer

As an engineer and AI workflow researcher, I have over a decade of experience in automation, AI tools, and SaaS systems. I specialize in testing, benchmarking, and analyzing AI tools, transforming hands-on experimentation into actionable insights. My work bridges cutting-edge AI research and real-world applications, helping developers integrate intelligent workflows effectively.