reading time : 18 minutes

The battle of LLMs also plays out in a developer’s terminal. Not on sterile academic benchmarks. In real life: a 30,000‑token prompt, an agent governance in AsciiDoc, Gradle Kotlin DSL plugins to debug, and sessions that chain over three weeks. I tested for you DeepSeek‑V4‑Pro, Kimi K2.6 and GLM‑5.1. Here is the verdict, backed by technical evidence.

knock

[]

Context: not a test bench, a worksite

Three weeks ago, I was working on`codebase-gradle`, my meta-build system that centralizes the YAML configuration of four projects: a PlantUML README generator, an AsciiDoc slide builder, a JBake static site, and an LLM chatbot. The Opencode agent, governed by my agent-files methodology in AsciiDoc, loaded ~30K tokens of EAGER context at the start of each session — absolute rules, backlog, history of the last 10 sessions.

It’s on this field that I confronted three models:

  • Kimi K2.6(Moonshot AI, 1T params / 32B activated, 256K max context, MLA) - GLM-5.1(Zhipu AI/Tsinghua, 744B params / DSA, 200K max context) - DeepSeek-V4-Pro(DeepSeek, 1.6T parameters / 49B activated, 1M max context, CSA+HCA)

All served via Ollama on cloud server, all in thinking mode (reasoning phase activated). The challenge: produce correct code, maintain consistency over long sessions, and avoid hallucination when the context exceeds 80K tokens.

My test environment

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam wrapWidth 220

title Test Environment — Opencode Sessions × 3 LLMs
left to right direction

package "️ Developer Terminal" #E8F5E9 {
  rectangle "AGENT.adoc\n(rules, backlog)" as AG
  rectangle "RESUMPTION_PROMPT\n(mission)" as PR
  rectangle "INDEX.adoc\n(roadmap)" as IDX
}

package "☁️ Ollama Cloud" #BBDEFB {
  rectangle "DeepSeek-V4-Pro\n1.6T / CSA+HCA" as DV4
  rectangle "Kimi K2.6\n1T / MLA" as KIMI
  rectangle "GLM-5.1\n744B / MLA+DSA" as GLMG
}

package "⚙️ Gradle Codebase" #FFF9C4 {
  folder "buildSrc/" {
    file "codebase.kt"
    file "readme.kt"
    file "site.kt"
    file "slider.kt"
    file "snapshot.kt"
  }
  file "build.gradle.kts\n(947 lines)"
  file "embeds.yml"
}

AG --> DV4 : Sessions 1-8 ✅
AG --> KIMI : Sessions 9-10 ⚠️
AG --> GLMG : Sessions 11-13 ⚠️

DV4 --> "Codebase" : "TDD, refactoring,\nsnapshot"
KIMI --> "Codebase" : "Degradation\nstarting at 60K tokens"

note bottom of GLMG
  Meilleur que Kimi
  mais latence +
  DSA moins robuste
  que CSA+HCA
end note

@enduml

Each session started with about 30K tokens of EAGER context:`AGENT.adoc`(287 lines)PROMPT_REPRISE.adoc(51 lines),.agents/INDEX.adoc(218 lines),LAZY_EAGER_ESSENTIALS.adoc(50 lines). The context grew quickly with the exchanges — a typical session of 10 messages added 15-20K tokens to the cumulative prompt.

The Evaluation Grid

I evaluated each model on four critical axes for assisted software development:

Axis

Concrete criterion

Long context coherence

Does the agent remember the conventions decided 40 messages ago?

Quality of the produced code

Does the code compile on the first try? Does it respect existing patterns?

Architectural reasoning

Does the agent understand the relationships between modules without me having to re‑explain them?

Resistance to hallucinations

From how many tokens does the agent start to invent nonexistent APIs or classes?

And a home-made synthetic metric: therecovery coefficient(how much time I spend correcting the agent instead of coding with him).

Round 1 : Kimi K2.6 — The False Start

Kimi K2.6 was my first choice. Its benchmarks on SWE-Bench Verified (80.2) and Terminal-Bench 2.0 (66.7) are excellent. Its MLA architecture promises good efficiency on long sequences.

Session 9: the improvement

First session with Kimi. Task: implement the method`resolveActiveKey()in`codebase.kt— an API key resolution function with CLI fallback. The context is 30K tokens, Kimi reasons quickly, produces clean code with key expiration handling.

fun resolveActiveKey(
    cfg: CodebaseConfiguration,
    logger: Logger,
    cliProvider: String? = null,
    cliAccount: String? = null,
    cliKey: String? = null
): NamedApiKey? {
    // Résolution provider → compte → clé avec CLI override
    // Kimi a parfaitement compris la chaîne de priorité
}

The code compiles. The 7 test cases pass. I am optimistic.

Session 10 : the silent shipwreck

Second session. The context climbs to ~90K tokens with the exchanges. I ask Kimi to add an AsciiDoc snapshot mechanism that anonymizes secrets before writing.

That’s where it derails. Kimi starts to invent classes that don’t exist. He offers me`AnonymizedObjectMapper`— a fictitious class. He confuses`ReadmeYmlAnonymizer` et CodebaseYmlAnonymizer. He suggests that I import`com.fasterxml.jackson.anonymize.*`— a package that never existed.

Worse: in his thinking phase, I see that he is building arguments on false premises. He "remembers" that`GitConfig`has a field`anonymizedToken`— no, it’s`resolvedToken(). It attributes to`SiteYmlAnonymizer`a method`maskSupabaseCredentials()— which does not exist.

__ It wasn’t a bug. It was a gradual dissolution of coherence. As if each token added to the context diluted a little more the memory of the first 30,000. </think>

I stop Kimi after two sessions. The diagnosis is clear: MLA compresses the KV cache well, but without a fine-grained sparse selection mechanism, attention dilutes mechanically beyond 60K tokens. Each token "sees" the distant context less and less well — and starts filling the gaps with noise.

Round 2: GLM-5.1 — The Honorable Fighter

GLM-5.1 arrives with a different architecture: MLA for the base model, then a continued pre-training with DSA (DeepSeek Sparse Attention) — a lightweight indexer that dynamically selects the top-2048 relevant tokens from the entire history.

Architecture: the DSA against the pure MLA

The difference is fundamental. Where Kimi compresses history into a single latent space (and gradually loses the ability to discriminate relevant information), GLM grafts a post‑training indexer that makes an explicit sparse selection.

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center

title Attention Architectures — MLA vs MLA+DSA
left to right direction

rectangle "**Kimi K2.6 — pure MLA**" as MLA #FFCDD2 {
  rectangle "KV Cache\ncomplete" as KV1
  rectangle "Latent compression" as CL1
  rectangle "Decoding\non latent space" as DL1
  KV1 --> CL1
  CL1 --> DL1
  note bottom of DL1
    ⚠️ Au-delà de 60K tokens :
    perte de discrimination
  end note
}

rectangle "**GLM-5.1 — MLA + DSA**" as DSA #C8E6C9 {
  rectangle "KV Cache\ncomplete" as KV2
  rectangle "Latent compression (MLA)" as CL2
  rectangle "Lightweight indexer\n(DSA, top-k=2048)" as IL
  rectangle "Decoding\non selected tokens" as DL2
  KV2 --> CL2
  CL2 --> IL
  IL --> DL2
  note bottom of DL2
    ✅ "Lossless by construction"
    Sélection explicite
    des tokens pertinents
  end note
}

MLA --> DSA : "Gain: sparse selection\nthat avoids dilution"

@enduml

The technical report explicitly states: DSA is "lossless by construction" — unlike alternatives such as SWA (pattern search), Gated DeltaNet, or SimpleGDN, which lose up to 5.69 points on RULER@128K.

Sessions 11-13: solid but frustrating

GLM-5.1 holds distance better. During session 11 (~60K tokens), it remains coherent. It produces a`SnapshotManager`functional with correct management of the four anonymizers

But latency is a problem. DSA reasoning phases are heavier than pure MLA — the indexer must rescan the history at each step. A response that took 8 seconds with Kimi takes 15 with GLM. In a 30‑message session, it’s felt.

And then there are the subtle errors. GLM doesn’t hallucinate like Kimi — but it makes naming errors. He calls`toAnonymizedYaml()the method that should be called`anonymize(). It reverses`loadReadmeConfiguration()` et loadCodebaseConfiguration()`in the`renderFileSection(). These are not hallucinations, they are superficial confusions — but in production, a superficial confusion can break a build.

I held three sessions with GLM. It is better than Kimi, without a doubt. But three sessions of manual correction on naming details are exhausting.

Round 3 : DeepSeek-V4-Pro — The War Machine

DeepSeek-V4-Pro arrives with the most ambitious architecture of the three: a hybrid system that combines two complementary attention mechanisms.

Architecture: CSA + HCA, the double net

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam wrapWidth 180

title DeepSeek-V4-Pro — Hybrid CSA + HCA Architecture
left to right direction

rectangle "KV Cache\n1M tokens" as KV #E3F2FD

rectangle "CSA\nCompressed Sparse Attention" as CSA #C8E6C9 {
  rectangle "Compression\nm tokens → 1" as CC
  rectangle "Sparse Attention\n(DSA, top-k)" as SA
  CC --> SA

  note bottom of SA
    Attention locale fine
    + sélection sparse
  end note
}

rectangle "HCA\nHeavily Compressed Attention" as HCA #BBDEFB {
  rectangle "Extreme compression\nm' >> m → 1" as ECC
  rectangle "Dense\nresidual attention" as EDA
  ECC --> EDA

  note bottom of EDA
    Contexte global
    + connexions longue distance
  end note
}

rectangle "Fusion\nHybrid" as FUSION #FFF9C4
rectangle "Coherent\ndecoding" as DEC #FFE0B2

KV --> CSA : Précision locale
KV --> HCA : Vision globale

CSA --> FUSION
HCA --> FUSION
FUSION --> DEC

@enduml

Two levels of compression, two attention granularities:

  • CSAcompress the KV cache all the`m`tokens, then applies a sparse attention (DeepSeek Sparse Attention) — only the top-k of the compressed entries is consulted. Precise, local, efficient. - HCAextreme compression (factor`m'`much larger than`m`), but pay attention to the dense attention on the compressed residue — keep the global connections without quadratic explosion.

Result: at 1M tokens, DeepSeek-V4-Pro consumes only27% of inference FLOPs et 10% of the size of the KV cachecompared to DeepSeek-V3.2. The previous model.

And most importantly, the technical report (Figure 9) states: "_Retrieval performance remains highly stable within a 128K context window."".

Sessions 1-8: relief

I spent eight sessions with DeepSeek-V4-Pro on`codebase-gradle`. Eight sessions without a single hallucination, without a single invented class, without a single naming confusion.

Session 1: implementation of`CodebaseYmlConfig` et CodebaseYmlAnonymizer. 350 lines of Kotlin, inline tests, all compiles. Session 4 : adding the`SnapshotManager`with tree view, file collection, AsciiDoc rendering per file. 279 lines, zero error. Session 7: debug of the`renderFileSection()`who had to handle four different types of anonymisers without resolution ambiguity. Resolved in three messages.

The latency is higher than Kimi — about 10-12 seconds per response in thinking mode. But the correction rate is almost zero. I don’t spend my time fixing the agent’s errors. I code with him.

The decisive test: refactoring at 100K tokens

At session 8, the cumulative context exceeds 100K tokens. I request a heavy refactoring: extract the four inline verification tasks of`build.gradle.kts`toward JUnit5 test files in`buildSrc/src/test/`.

The agent proposes a three-phase plan:

  1. Create the test classes with migration of existing cases

  2. Add the JUnit5 and Kotest dependencies in`buildSrc/build.gradle.kts`

  3. Remove the inline code of`build.gradle.kts`

The plan is correct. The execution is clean. It even identifies an edge case I had missed: duplicate Jackson dependencies between`buildscript {}` et `buildSrc/build.gradle.kts`which must be unified during the migration.

100K tokens of context, and the agent remembers that`CodebaseYmlAnonymizer.TOKEN_MASK`is`"*"`, that`GitConfig.resolvedToken()is an extension function defined in`readme.kt, and that`SnapshotManager.PRUNED_DIRS`excludes`build`, .gradle et .git.

That’s the difference.

Face-to-face: Comparative Metrics

Criterion Kimi K2.6 GLM-5.1 DeepSeek-V4-Pro

Context max

256K

200K

1M

attention mechanism

pure MLA

MLA + DSA

Hybrid CSA + HCA

Total parameters

1T

744B

1.6T

Enabled settings

32B

not published

49B

Observed degradation threshold

[No French text was provided for translation]

[Translation will appear here once French text is provided]

~128K tokens

Behavior beyond

Massive hallucinations

Surface confusions

Slow progressive degradation

Stability NIAH

not published

100% at 128K (DSA)

stable up to 128K (Figure 9)

MRCR @128K

unpublished

unpublished

superior to Gemini 3.1 Pro

Sessions held before abandonment

2

3

8 (and continues)

Correction time / coding time

60%

30%

<5%

Average latency (think mode)

8 s

15 s

11 s

Confidence coefficient*

2/10

6/10

9/10

*Confidence coefficient = subjective measure of my ability to take the agent’s code and commit without line-by-line review.

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center

title Comparative Radar — 3 LLMs in Assisted Software Development
legend right
  |= Couleur |= Modèle |
  | <#FF5252> | Kimi K2.6 |
  | <#FFC107> | GLM-5.1 |
  | <#4CAF50> | DeepSeek-V4-Pro |
endlegend

rectangle " " as space #FFFFFF

rectangle "Consistency\n80K+ tokens" as coh #F5F5F5
rectangle "Quality\ncode" as qual #F5F5F5
rectangle "Architectural\nreasoning" as arch #F5F5F5
rectangle "Resistance\nhallucinations" as hall #F5F5F5
rectangle "Speed\n(dev experience)" as speed #F5F5F5
rectangle "Knowledge\nGradle/Kotlin" as kg #F5F5F5
rectangle "Correction rate" as corr #F5F5F5

coh --> qual
qual --> arch
arch --> hall
hall --> speed
speed --> kg
kg --> corr

note top of coh
  Kimi      ████░░░░░░ 4/10
  GLM       ██████░░░░ 6/10
  DeepSeek  █████████░ 9/10
end note

note top of qual
  Kimi      ███████░░░ 7/10 (sous 60K)
  GLM       ████████░░ 8/10
  DeepSeek  █████████░ 9/10
end note

note top of arch
  Kimi      █████░░░░░ 5/10
  GLM       ███████░░░ 7/10
  DeepSeek  █████████░ 9/10
end note

note top of hall
  Kimi      ██████░░░░ 6/10 → ██░░░░░░░░ 2/10 (> 60K)
  GLM       ███████░░░ 7/10
  DeepSeek  █████████░ 9/10
end note

note top of speed
  Kimi      █████████░ 9/10
  GLM       ██████░░░░ 6/10
  DeepSeek  █████░░░░░ 5/10
end note

note top of kg
  Kimi      ███████░░░ 7/10
  GLM       ███████░░░ 7/10
  DeepSeek  █████████░ 9/10
end note

note top of corr
  Kimi      ██░░░░░░░░ 2/10 (beaucoup de corrections)
  GLM       █████░░░░░ 5/10
  DeepSeek  ██████████ 10/10 (presque rien à corriger)
end note

@enduml

Why DeepSeek-V4-Pro Wins in Software Development

The superiority of DeepSeek-V4-Pro is not due to a single factor—it is a convergence:

1. The CSA+HCA architecture is tailored for code

Assisted software development is an extreme use case for long-context attention. You need: - Local precision (what does this class inherit from? where is this method defined?) →CSA - Global vision (Why does this module exist? How do the four anonymizers interact?) →HCA

Kimi with MLA alone handles local precision but loses global vision beyond 60K. GLM with DSA improves global vision but remains single‑level. DeepSeek combines both explicitly.

2. The EAGER context is its comfort zone

My governance system loads ~30K tokens of rules and backlog at startup. With a stable window up to 128K, DeepSeek has ~100K tokens of margin for session exchanges. This is 3 to 4 times more than what Kimi can handle without degradation.

_ The 128K window of perfect stability exactly matches my needs: 30K of EAGER + 70K of exchanges = a productive session of 20-30 messages without ever leaving the green zone. _

3. The quality/latency ratio is optimal for the flow

Yes, DeepSeek-V4-Pro is slower than Kimi (11s vs 8s). But the total time for a task is much lower because I don’t spend 20 minutes correcting the agent’s hallucinations.

The developer does not measure the latency of a response. He measures the time between "I ask the question" and "the code is in my repo and it works". On this metric, DeepSeek-V4-Pro is the fastest of the three.

Lessons Learned: How to Choose Your LLM for Vibe Coding

Beyond the punctual ranking, this experience taught me to evaluate an LLM for assisted software development on criteria that are not found in any benchmark:

  1. Look at the architecture, not the announced context size.—A model that claims 256K of context but only has an MLA will end up like Kimi: theoretically capable, practically unusable beyond 60K.

  2. Test on YOUR context, not on a generic benchmark— My initial 30K token AsciiDoc prompt with absolute rules and backlog has nothing to do with the HLE or AIME questions.

  3. Latency is not the enemy if quality follows— A slow model that produces correct code is faster than a fast model that produces incorrect code.

  4. Beware of the models without technical report public— If the team does not document its attention architecture, it’s because it lacks confidence in its long-context performance.

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam wrapWidth 260

title Decision Tree — Choosing your LLM for Assisted Development
start

:Contexte initial\n> 20K tokens ?;

if (Oui) then
  :Architecture d'attention\nhybride ou multi-niveau ?;

  if (CSA+HCA) then
    :DeepSeek-V4-Pro
    Fenetre stable 128K
    Ideal pour gouvernance EAGER;
    stop
  elseif (MLA + DSA) then
    :GLM-5.1
    Correct jusqu'a ~120K
    Latence elevee;
    stop
  else (MLA seul)
    :Kimi K2.6 (sessions courtes)
    ou eviter pour long contexte
    Chercher un modele avec
    sparse attention;
    stop
  endif
else (Contexte < 20K)
  :N'importe lequel fonctionne.
  Privilegier la latence.;
  stop
endif

@enduml

And the Governance Agent in all that?

This experience validates a point I’ve been defending since my article on Eager/Lazy governance:the quality of the LLM and the quality of governance are multiplicative, not additive.

With Kimi K2.6, my governance was impeccable — but the model diluted the information. Result: perfect governance × hallucination = zero.

With DeepSeek-V4-Pro, the EAGER governance (30K tokens of rules) + LAZY (session archives, technical references) + Hot/Warm/Cold (rotating backup) forms an ecosystem where each layer amplifies the other. The agent has the rules in view (EAGER), can consult the history (LAZY), and the context never saturates (backup rotation).

_ A good LLM without governance is like a Ferrari engine without a steering wheel. Good governance without a good LLM is like a steering wheel without an engine. DeepSeek-V4-Pro + my agent governance = the first time I feel like I’m driving. _

The rotating backup mechanism (rotation every 10 sessions or >500 EAGER lines) makes full sense with a model that holds 128K of context: the sliding window of 10 active sessions keeps the context fresh without ever exceeding the degradation zone.

Technical Sources

I cross-referenced my empirical experience with the official technical reports to validate my observations:

  1. DeepSeek-V4 Technical Report — PDF retrieved fromhttps://huggingface.co/deepseek-ai/DeepSeek-V4-Flash[HuggingFace]. Figure 9 : "Retrieval performance remains highly stable within a 128K context window. While a performance degradation becomes visible beyond the 128K mark, the model’s retrieval capabilities at 1M tokens remain remarkably strong." Documented CSA+HCA architecture section 2.3.

  2. GLM-5 Technical Report —https://arxiv.org/abs/2602.15763[arXiv:2602.15763]. DSA introduced via continued pre‑training, "lossless by construction". Max context 202,752 tokens. Tables 3/5/6 document long‑context performance against alternatives (SWA, Gated DeltaNet, SimpleGDN).

  3. Kimi K2.6 Model Card —https://huggingface.co/moonshotai/Kimi-K2.6[HuggingFace]. MLA, 256K max context. Discard-all strategy beyond the threshold on agentic tasks (implicitly confirming the practical limit of MLA in long context).

  4. Kimi K2 Technical Report —https://arxiv.org/abs/2507.20534[arXiv:2507.20534]. Architecture MoE, MuonClip optimizer, agentic performances (HLE, BrowseComp, Terminal-Bench).

The most revealing point: in their own evaluation, Moonshot applies a discard-all strategy (deleting old context) as soon as the context window is exceeded. This exactly confirms what I observed: MLA alone cannot maintain coherence across the entire 256K window. The architecture cannot keep up.

Conclusion : The Choice of the Artisan

After three weeks and thirteen sessions of real development, the verdict is indisputable:

Kimi K2.6

GLM-5.1

DeepSeek-V4-Pro

Excellent under 60K

Solid up to 120K

Dominates everywhere

Unusable beyond

Surface confusions

Stable up to 128K

2 sessions, abandoned

3 sessions, abandoned

8 sessions, adopted

DeepSeek-V4-Pro has become my default LLM for all software development sessions assisted with Opencode. Not because it’s the newest. Not because it has the best academic benchmarks. But because in the real life of a developer pushing Gradle Kotlin DSL plugins with a 30K token agent context, it’s the only one that doesn’t betray me when the context expands.

CSA+HCA is an architectural game changer. Double-level compression + sparsification is not an implementation detail — it’s what makes the difference between a coding assistant and a reliable teammate.

_ I chose DeepSeek-V4-Pro because it is the only one of the three that transforms my agent governance from a defensive constraint ("how to prevent the agent from forgetting?") into an offensive advantage ("what can we build now that the agent remembers everything?"). _


This article is the result of 13 real development sessions on the project`codebase-gradle`, documented in`.agents/sessions/`according to my governance agent Eager/Lazy/Hot/Warm/Cold methodology. The cited technical sources are publicly accessible on HuggingFace and arXiv.

Related articles