Task
Claude (cloud)
Local stack (GB10)
Gap
Architecture decisions
strong
inconsistent
large
Multi-file refactors
strong
loses context past ~4 files
large
Code generation (from clear spec)
strong
local LLM good
small
Debugging multi-step
strong
misses cross-file context
medium
Article writing
strong
local LLM usable + KB prompt
small
Quick Q and A / lookup
strong
competitive single-stream
small
Tool use (MCP)
strong
stdio + HTTP MCP working
small
Text-to-speech (podcast)
not available
self-hosted TTS, preset EN voices
n/a
Voice cloning
not available (text only)
encoder gated in open ckpt
n/a
Image generation
not available
self-hosted image model on-device
n/a
Local privacy
cloud API
on-device
n/a
Cost per session
per-token
electricity after setup
n/a
Availability
external API dependency
always on (one service at a time)
n/a
## Where the gap stays large
Architecture decisions and multi-file refactors are the two places I have not been able to fully migrate off Claude. The local model can produce a plausible architecture sketch, but it does not hold a sustained reasoning thread across half a dozen files and a config file for long enough to make consistent decisions. The failure mode is that it drifts: the third decision contradicts the first, the variable names introduced in step two get re-introduced under a different name in step five. For a one-shot single-file task this is fine; for "rewrite the deploy pipeline" it is not.
Claude holds the thread. That is the capability I am still paying for, and it is the capability the [self-hosted-ai vs cloud-apis cost article](/blog/self-hosted-ai-vs-cloud-apis-real-total-cost/) treats as the load-bearing column of the cost argument. Anyone who claims a 4-bit quant on a 35B parameter model gets you Claude-level architecture work in 2026 has not measured the same thing I have measured. The one wrinkle worth naming: you do not need a KYC Anthropic account to buy that thread. [ppq.ai](https://ppq.ai/invite/f763e458) resells the same frontier Claude per query over Bitcoin Lightning, which is how I wire it as the no-KYC fallback behind local Qwen ([the full accounting, pros and cons](/blog/frontier-ai-on-bitcoin-ppq-no-kyc-cloud-fallback/)).
## Where the gap is small
Article writing, code generation from a clear spec, quick lookups, and MCP tool calls all work fine on the local stack. The pipeline that drafts this blog (described in [how this blog actually gets built](/blog/how-this-blog-actually-gets-built/)) is end-to-end local for the drafting layer; Claude only enters when I am revising structure or shaping a new prompt. Per-token billing on Claude for this work would be measurable; per-electricity-hour on the local stack is negligible.
The implication for someone evaluating the same split: if your work is dominated by focused single-pass tasks, the local stack is a real option in 2026. If your work is dominated by sustained multi-file reasoning, you are paying for capability that the local stack does not yet match. The [Mistral vs Qwen vs GLM-5 comparison](/blog/mistral-small-4-vs-qwen3-6-vs-glm-5-dgx-spark/) goes into which local model handles which class of task best on GB10. The [coding-assistants article](/blog/vibe-vs-openclaw-vs-aider-vs-claude-code-2026/) goes into the agent layer (Claude Code, opencode, Aider, OpenClaw) one rung above the model.
## Where Claude has no answer
Three tasks do not appear on Claude at all and never will on this account: hero-image generation, podcast TTS, and on-device privacy. The first two are missing because the cloud Claude product is text-only by design; the third is structural, not a feature gap. If you need an image generated for an article, Claude is not the tool. If you need a 24 kHz mono voice rendering of a script for a podcast, Claude is not the tool. If you need the prompt to never cross a network boundary you control, no cloud service is the tool.
That is the part of the matrix that justifies running a local stack even when the cloud beats it everywhere else. The local layer earns its place not by competing with Claude on capability per task but by covering tasks Claude cannot do at all.
## What the matrix does not capture
Two things stay outside this table because they are not capability comparisons.
**Reliability of evaluation.** The "strong" rating for Claude on architecture decisions is averaged across a particular working pattern (mine, on the sovgrid codebase) and may not hold for a different codebase or a different working style. The "inconsistent" rating for the local stack is a verdict, not a measurement. A different operator with a different prompt design might get a different answer.
**Total cost.** Per-token Claude billing on light usage is cheap; the local stack at idle still costs electricity for the always-on inference daemon. The cost crossover depends on how heavy your usage actually is. The [real total-cost article](/blog/self-hosted-ai-vs-cloud-apis-real-total-cost/) is where the numbers live. This article is the capability lens; that article is the dollar lens. Both are needed before someone commits to the local side as the primary path.
## The decision rule that fell out of running both
After six months of running both sides daily, the rule I use is task-shaped, not provider-shaped:
- **Architecture, deep refactors, novel reasoning.** Claude.
- **Drafting, executing on a clear spec, single-file changes, tool calls.** Local.
- **TTS, image gen, anything privacy-sensitive.** Local.
- **Long-tail Q and A while reading docs.** Whichever is closer at hand.
The split is not 50/50 either way on cost: Claude tokens are the dominant line item on the months that contain a major refactor, and the local stack is the dominant line item on the months that contain a heavy article-drafting push. Both layers are tools. Both layers are paid for. The wisdom (if there is any) is in not pretending one side is universally better than the other. The matrix above is the one I keep updated; if the model that lands on GB10 in three months changes a row from large to medium, that row gets updated. The page that holds the snapshot of which local model is currently primary is [/stack/](/stack/); this article stays at the capability layer above that. One addition from June 2026: the per-task split above usually gets framed as a cost-and-quality call, but [the week a frontier vendor's models were switched off for non-US users](/blog/the-week-the-dependency-changed-its-mind/) added a third question to the rule, which is whether a given task can survive the cloud side being revoked without notice. The full sovereignty argument that frames this decision is in [What Sovereign Actually Means in 2026](/blog/what-sovereign-actually-means-2026/); the structured version is the [forthcoming book](/books/).
---
## [The Engineering Honesty Manifesto](https://sovgrid.org/blog/engineering-honesty-manifesto)
Tags: authority, voice | Date: 2026-05-27 | Words: 2264
> **Update (2026-06-19).** The "Qwen 3.6 PrismaQuant" references here predate the 2026-06-11 production switch to **AutoRound int4-mixed** (69.2 tok/s, 12.7 percent better on the coding gate, vision retained, PrismaQuant retired). The figures are kept as the engineering-log record; the live stack is on [/stack/](/stack/) and the switch is measured in [AutoRound int4 vs PrismaQuant](/blog/autoround-int4-vs-prismaquant-coding-quant-duel/).
The honesty is the product.
Everything else on this site is a packaging decision around that one commitment. The hardware, the model stack, the consulting practice, the book, the Lightning address in the footer, the engineering log of bugs I caused and bugs I fixed: all of them are downstream of the choice to write the operating reality as it happened, rather than the operating reality as it would have sold better.
This piece is the explicit version of that commitment. Six rules I hold myself to. Each rule has a receipt from the public log of this site that proves I am willing to keep the rule under load. If any of these rules is broken in a future post, the rule is being broken on purpose and the post will say so.
## Rule 1: Numbers I have not measured do not appear
If I write that the DGX Spark sustains around 71 tokens per second on Qwen 3.6 PrismaQuant under DFlash speculative decoding, it is because I have measured it, on this hardware, with a known prompt distribution, and I can point to the systemd unit and the log file that produced the number. (See [Spark Arena Rank 4 Made Me Add Qwen3.6](/blog/strategy-next-model-choices-dgx-spark/) for the original 45 tok/s baseline measurement on the same hardware, before DFlash was enabled. The number moved because the configuration moved; both numbers are real.)
If I write that the Spark draws "moderate" power under load, it is because I have not put a Kill-A-Watt on the input and I refuse to quote a wattage I cannot defend. The vendor's TDP is a public number; the lived behavior is my observation; the synthesis is honest because the parts are labelled. The cost of this rule is that I look less authoritative than writers who confidently cite numbers they pulled from a press release. The benefit is that when a reader builds a decision on my numbers, the decision is built on actual measurements.
The corollary: vendor benchmarks get cited with the configuration they were measured under, or not at all. "131 tokens per second peak" without "batched, throughput-optimized, parallel-request" is marketing, not data. The same rule applies to vendor SOTA claims (Z.ai's "8-hour autonomous execution" claim for GLM-5.1, for instance, gets a label that says "vendor-published claim, not operator-reproduced").
## Rule 2: Failures are first-class content
The site's `fixes/` archive is longer than its `setup/` archive. That is on purpose.
When I broke the loudnorm filter on the podcast pipeline, the postmortem went up the same week. (See [Fixes: ffmpeg volume filter eval frame](/blog/fixes-ffmpeg-volume-filter-eval-frame/).) When the SGLang restart kept hitting OOM at 95 GB because the kernel page cache was holding stale weights from the previous engine instance, the fix and the cause both got published. (See [Fixes: SGLang Restart OOM Fix](/blog/fixes-sglang-restart-oom-fix/); the one-line fix is `echo 3 > /proc/sys/vm/drop_caches` before every engine relaunch.) When the vLLM MoE backend defaulted to a kernel path that froze the desktop session, I wrote the debug log before I shipped the workaround. (See [Fixes: vLLM MoE Throughput sm121 Desktop Freeze](/blog/fixes-vllm-moe-throughput-sm121-desktop-freeze/); the env-var fix is `VLLM_FLASHINFER_MOE_BACKEND=latency`.)
The reason is not contrition theatre. The reason is that the failures are where the operational knowledge lives. A reader who is about to walk into the same wall benefits more from my postmortem than from a polished setup guide that pretends the wall does not exist. The page-cache hijack pattern is the canonical case: every Spark operator will hit it; the documented fix is one shell command; the cost of not knowing the fix is an unscheduled OOM at the worst possible time.
## Rule 3: Citations are positioning, not neutral sourcing
When I link to an author, I am saying "this person's broader work is consonant with the posture of this site." When I quote a public figure, I am saying "I will be associated with this person's reputation in the reader's mind." Both of those statements are positioning decisions, not neutral attribution.
The practical consequence is a small list of people whose work I will cite and a larger list of people whose work I will not, even when their technical content is good. The binding internal decision memo retired several response-article angles after I noticed I was about to position the site against its own audience, by citing a figure whose broader work points the opposite direction from where sovgrid sits. The rule cost me one article angle. The rule keeps the site readable to its audience.
## Rule 4: Hedging is honest; padding is not
There is a real difference between "I have not measured this and the published figure is X" and "industry experts agree that approximately Y." The first is a hedge, and it tells the reader exactly which part of the claim is mine to defend. The second is padding that performs authority without earning it.
The site uses hedges deliberately. "Per the vendor's published figure," "based on my own measured throughput on the same hardware," "the lived experience is," "this is observation-level, not instrumented." Each hedge is a small honest label. The reader can decide how much weight to give each labelled part.
The site does not use padding. No "industry experts agree." No "leading platforms support." No anonymous attribution where named attribution would do. If I cannot name the source, I do not need the claim. (For the inverse case, see [The Quality Gate That Rewards Fabrication](/blog/the-quality-gate-that-rewards-fabrication/), where I document a scorer pathology that incentivized exactly the padding pattern I am refusing here.)
## Rule 5: The customer's premises is not a metaphor
A real chunk of this site's revenue is "sovereign-AI consulting," which means I install AI on someone else's hardware and leave the keys with them. If I describe that work, the description has to be faithful to what actually happens in the engagement, not to a marketing version of it.
Concretely: I will not describe consulting outcomes I have not delivered. If a piece talks about "the typical engagement," it is referring to engagements I have run, with the customer's identity anonymized when needed. If a piece talks about "the case for sovereign AI in healthcare" or "the financial-services use case," I am explicit about which parts are deployed-and-measured and which parts are scoped-but-not-yet-shipped.
The temptation to imply more deployments than exist is real and constant. The discipline is to resist it, because the value of the consulting pipeline depends entirely on the customer believing that the engineer they are hiring is honest about what has and has not been done. As of May 2026, the consulting revenue is at the "scope-call SKU validation" phase, not at the "five enterprise engagements shipped" phase, and the writing reflects that.
The multi-agent operational discipline behind this rule lives in the AGENTS.md convention across all 16 Gitea repositories. Every commit carries an agent identifier in the trailer; every pipeline pathspec-commits rather than `git add -A`; every quarterly review walks the corpus for stale claims. The institutional honesty is what keeps the rule enforceable when multiple agents (Claude Code, opencode, and others) touch the same codebase.
## Rule 6: Self-correction is published, not silenced
When I am wrong in print, I write the correction in a follow-up post, not by stealth-editing the original. The post that documented my original assumption that the Mistral-to-Qwen swap would be a 2.5x slowdown contains the explicit line "Wrong direction entirely" once the Spark Arena measurement landed. (See [Spark Arena Rank 4 Made Me Add Qwen3.6](/blog/strategy-next-model-choices-dgx-spark/).) The Mistral article links forward to the correction. The two posts read as one honest arc.
The alternative pattern (silent edits that erase the original claim) is convenient and dishonest. It produces a site that always looks like it was right, which is indistinguishable from a site that is unwilling to be wrong in public. Sovgrid is willing to be wrong in public. The willingness is the substrate that makes the rest of the writing trustworthy.
The institutional version of this rule is the **memory-pending-audit-quarterly cadence** instituted on 2026-05-25. Every quarter, the operator walks the agent-memory corpus for "wartet auf X" / "blockiert" / "pending" claims and verifies each one against current reality. The cadence was instituted after a single session uncovered five stale blockers, including a two-day-stale claim that a Gitea token rotation needed physical Desktop access when it was actually a five-second `docker exec` command. The pattern is the same as Rule 6 at the operational level: do not let stale claims accumulate in memory or in print, because both audiences (future-self and future-reader) depend on the claims being current.
The next audits are scheduled for 2026-08-25, 2026-11-25, 2027-02-25, and 2027-05-25. Each one will publish whatever it finds.
## What this commits me to
Reading this list back, the practical commitments are concrete. The site is allowed to be slower than competitors that fabricate numbers, less authoritative than writers who quote anonymous "industry experts," less impressive than consultants who imply ten engagements when they have run three. Those are real costs. They are the cost of the honesty being the product.
The benefit is that the readership the site attracts is the readership that wants the honesty. A reader who comes to sovgrid expecting a hype piece bounces fast. A reader who comes to sovgrid expecting that the operational details will reflect what actually happened stays, and over time becomes the kind of reader who pays for a Stack Audit or buys the book in pre-order, because they have already decided that the engineer behind the writing is the kind of engineer they want in the room. The reading list that shaped this site's argument is at [/books/]; the best Bitcoin books are on [Konsensus](https://konsensus.net/?ref=SOVGRID)