[{"data":1,"prerenderedAt":710},["ShallowReactive",2],{"category:skeptics-toolbox":3},{"category":4,"index":10,"total":15,"others":16,"posts":61},{"id":5,"description":6,"extension":7,"label":8,"meta":9,"order":10,"post_count":11,"slug":12,"stem":13,"__hash__":14},"categories\u002Fcategories\u002Fskeptics-toolbox.json","The cases against default narratives; what doesn't hold up under scrutiny.","json","Skeptic's Toolbox",{},1,3,"skeptics-toolbox","categories\u002Fskeptics-toolbox","hPOh22rNWxW_dewYrYcLgnrEDIv_sY17XJAlLjRxTe4",6,[17,26,35,43,52],{"id":18,"description":19,"extension":7,"label":20,"meta":21,"order":22,"post_count":10,"slug":23,"stem":24,"__hash__":25},"categories\u002Fcategories\u002Fcraft.json","Close-read posts on the daily work of shipping software.","Craft",{},0,"craft","categories\u002Fcraft","bAfaerFLn5gKJyzXQLTEy95inz6saFE03vKNGDNWwNw",{"id":27,"description":28,"extension":7,"label":29,"meta":30,"order":31,"post_count":31,"slug":32,"stem":33,"__hash__":34},"categories\u002Fcategories\u002Fbuild-log.json","Field notes from building specific systems, in progress.","Build Log",{},2,"build-log","categories\u002Fbuild-log","_YPWw94FFI3NAi5oP4e4Z_N0AcFBLoywskvd-MT0les",{"id":36,"description":37,"extension":7,"label":38,"meta":39,"order":11,"post_count":10,"slug":40,"stem":41,"__hash__":42},"categories\u002Fcategories\u002Fml-journal.json","Learning ML in public. Failures, diagnoses, partial wins.","ML Journal",{},"ml-journal","categories\u002Fml-journal","0PP-FTOq2_F3lMsfbjdhi3q9TqLm3ajKZCqt9kXAXCM",{"id":44,"description":45,"extension":7,"label":46,"meta":47,"order":48,"post_count":10,"slug":49,"stem":50,"__hash__":51},"categories\u002Fcategories\u002Fknowledge-architecture.json","How knowledge is structured, captured, retrieved, transmitted.","Knowledge Architecture",{},4,"knowledge-architecture","categories\u002Fknowledge-architecture","acvknIIMKZMnFb9-VBtiSIDksRlzGbGMQUpyFX-SMns",{"id":53,"description":54,"extension":7,"label":55,"meta":56,"order":57,"post_count":10,"slug":58,"stem":59,"__hash__":60},"categories\u002Fcategories\u002Fpeople.json","Stories about humans in the work — collaborators, clients, collaborators in absentia.","People",{},5,"people","categories\u002Fpeople","9rpzEOrRX1WY5EmvqmKGOyGuAwvs2IXaPT9IfCoJfn4",[62,216,635],{"id":63,"title":64,"body":65,"category_label":8,"category_slug":12,"date_created":204,"dek":205,"description":199,"directus_id":206,"extension":207,"is_promoted":208,"meta":209,"navigation":208,"path":210,"published_at":204,"seo":211,"slug":212,"status":213,"stem":214,"__hash__":215},"posts\u002Fposts\u002Fharnesses-matter-as-much-as-models.md","Your harness is half the model",{"type":66,"value":67,"toc":198},"minimark",[68,88,93,96,99,118,163,166,170,185,189,192,195],[69,70,71],"blockquote",{},[72,73,74,75,79,80,83,84,87],"p",{},"I was cleaning up the scratch script I used to draft this post (one ",[76,77,78],"code",{},"rm \u002Ftmp\u002Fpush-raw-posts.py",") and the subprocess hung on ",[76,81,82],{},"remove regular file '\u002Ftmp\u002Fpush-raw-posts.py'?",". The exact ",[76,85,86],{},"rm -i"," contamination the post is about. The recursion is too clean to leave alone.",[89,90,92],"h2",{"id":91},"the-harness-is-not-a-shell-around-the-model","The harness is not a shell around the model",[72,94,95],{},"I thought the harness was a shell around the model. Type prompt, get output, done. The model writes the code, the harness is plumbing.",[72,97,98],{},"Running an actual benchmark with four coder-bricks through their officially-recommended harnesses disabused me of that in the worst way. MiniMax via Claude Code (MiniMax's own first-recommended path, Anthropic-compat endpoint, \"just set ANTHROPIC_BASE_URL and you're done\" per the docs) gave wall-time blowups of 100×. A task that should have taken 107 seconds took 10,682.",[72,100,101,102,105,106,109,110,113,114,117],{},"Root cause was maximally unglamorous. Claude Code's tool-use subprocess sources the parent shell's interactive snapshot. On my Fedora + prezto setup, that snapshot re-establishes ",[76,103,104],{},"alias rm='nocorrect rm -i'",". Model-issued ",[76,107,108],{},"rm \u003Cexisting> && cat > \u003Csame>"," tool calls (a very common pattern for rewriting test files) then block forever on the ",[76,111,112],{},"-i"," confirmation prompt. The subprocess captures stdout and stderr but doesn't route stdin back, so the prompt hangs indefinitely. ",[76,115,116],{},"--bare"," mode doesn't disable shell-snapshot loading. It only gates CLAUDE.md, hooks, plugin sync, and keychain reads.",[72,119,120,121,124,125,128,129,132,133,132,136,132,139,142,143,146,147,132,150,132,153,132,156,132,159,162],{},"The fix is an operational contract. Strip all ",[76,122,123],{},"ANTHROPIC_*"," env vars from the subprocess, strip ",[76,126,127],{},"CLAUDE_CODE_OAUTH_TOKEN"," to avoid credential leaks, set ",[76,130,131],{},"SHELL=\u002Fbin\u002Fbash",", ",[76,134,135],{},"BASH_ENV=\u002Fdev\u002Fnull",[76,137,138],{},"ENV=\u002Fdev\u002Fnull",[76,140,141],{},"ZDOTDIR=\u003Cfresh empty dir>",", and (here's the fun one) set all five ",[76,144,145],{},"ANTHROPIC_*_MODEL"," aliases (",[76,148,149],{},"MODEL",[76,151,152],{},"DEFAULT_OPUS_MODEL",[76,154,155],{},"DEFAULT_SONNET_MODEL",[76,157,158],{},"DEFAULT_HAIKU_MODEL",[76,160,161],{},"SMALL_FAST_MODEL",") to the same value, because Claude Code's internal Opus\u002FSonnet\u002FHaiku routing otherwise breaks with \"unknown model.\"",[72,164,165],{},"None of that is in the official setup guide. You find it by running your own benchmark.",[89,167,169],{"id":168},"sibling-surprise","Sibling surprise",[72,171,172,173,176,177,180,181,184],{},"Cline CLI 2.0 went headless in February 2026. I missed it by two months in my research and confidently wrote that \"Cline is VS Code only, DS-via-Cline from an HL session isn't viable.\" It is viable. ",[76,174,175],{},"-y"," for yolo, ",[76,178,179],{},"--json"," for structured output, scoped ",[76,182,183],{},"--config"," dir so you don't pollute the user's IDE state. The second-biggest harness ecosystem in the Anthropic-adjacent world added headless mode and I hadn't noticed. Nobody I'd read had noticed either. The earlier writeups I'd scraped were still pitching the VS Code framing.",[89,186,188],{"id":187},"two-lessons-same-insight","Two lessons, same insight",[72,190,191],{},"First: an official harness recommendation is where you start. The company that made the model picks the harness that shows their model at its best. They don't necessarily pick the harness that runs without contamination on your specific dev box. The gap between \"vendor says works\" and \"actually works on my machine\" is where hours go.",[72,193,194],{},"Second: the harness moves your numbers, and your model capability comparison will credit the movement to the wrong variable. If I'd compared MiniMax to Qwen3.6 based on wall time alone, with that 100× contamination un-caught, I'd have concluded MM is impossibly slow. It isn't. My environment was making it wait on an interactive shell prompt that should never have existed.",[72,196,197],{},"You catch this by running your own benchmark against your own infra. Not someone else's SWE-bench numbers or the vendor's marketing deck. Your tasks, your harness, your subprocess, your shell. That's where the operational contract writes itself.",{"title":199,"searchDepth":31,"depth":31,"links":200},"",[201,202,203],{"id":91,"depth":31,"text":92},{"id":168,"depth":31,"text":169},{"id":187,"depth":31,"text":188},"2026-04-21T00:27:58.944Z","I ran four coder models through their officially-recommended harnesses and one came out 100x slower. The cause was my shell's rm -i alias leaking into Claude Code's tool subprocess. Your model comparison will credit that slowdown to the wrong variable.","1f690bb4-436a-4ddb-a080-607f30465052","md",true,{},"\u002Fposts\u002Fharnesses-matter-as-much-as-models",{"title":64,"description":199},"harnesses-matter-as-much-as-models","published","posts\u002Fharnesses-matter-as-much-as-models","lV1MvQW9v6oEPIHq-7PD5nhALaGpO88Vb8HdWkqU4jU",{"id":217,"title":218,"body":219,"category_label":8,"category_slug":12,"date_created":625,"dek":626,"description":199,"directus_id":627,"extension":207,"is_promoted":628,"meta":629,"navigation":208,"path":630,"published_at":625,"seo":631,"slug":632,"status":213,"stem":633,"__hash__":634},"posts\u002Fposts\u002Flocal-80b-beats-claude-coding.md","Why My Local 80B Model Beats Claude at Coding Tasks, and It's Not About the Model",{"type":66,"value":220,"toc":614},[221,225,232,235,239,245,248,257,260,264,267,278,281,285,292,299,309,313,328,331,337,340,346,352,355,358,362,369,464,470,474,511,515,557,563,567,610],[89,222,224],{"id":223},"the-setup","The Setup",[72,226,227,228,231],{},"I run a dual RTX 3090 Ti homelab (HL1) serving Qwen3-Coder-Next 80B MoE (3B active params) via llama-server. The model is quantized to Q3_K_XL (33.79 GiB, 3.64 BPW) by Unsloth, running at 262K context with Q8 KV cache. Both GPUs stay under 57C at ~300W each. The stack is dead simple: llama.cpp build b8492, systemd service, K8s ingress with TLS, and ",[76,229,230],{},"ccq"," alias to point Claude Code at the local endpoint.",[72,233,234],{},"Everything worked. Inference was fast: 84 t\u002Fs generation, 2200 t\u002Fs prompt eval at 262K context. But something was very wrong with real-world agentic coding performance.",[89,236,238],{"id":237},"the-symptom","The Symptom",[72,240,241,242,244],{},"Every turn of a Claude Code (",[76,243,230],{},") session took ~15-20 seconds before the model even started generating. On a 31K token conversation, that's 20 seconds of pure waiting per tool call. An agentic task with 20 tool rounds = 7+ minutes of just prefill overhead.",[72,246,247],{},"The llama-server logs told the story:",[249,250,255],"pre",{"className":251,"code":253,"language":254},[252],"language-text","n_past = 35, slot.prompt.tokens.size() = 31327\nforcing full prompt re-processing due to lack of cache data\n(likely due to SWA or hybrid\u002Frecurrent memory)\n","text",[76,256,253],{"__ignoreMap":199},[72,258,259],{},"Every single turn: 35 tokens of prefix match. Full re-processing of 31K+ tokens from scratch. The checkpoints were being created, but immediately erased on the next request.",[89,261,263],{"id":262},"the-architecture-problem-or-so-i-thought","The Architecture Problem (Or So I Thought)",[72,265,266],{},"Qwen3-Coder-Next uses a hybrid architecture: 3 layers of Gated Delta Net (SSM\u002Frecurrent) alternating with 1 layer of Global Attention (3:1 ratio). Unlike pure Transformer models where KV cache handles prefix reuse natively, hybrid models need the recurrent state to be reconstructed from scratch when the token prefix diverges.",[72,268,269,270,273,274,277],{},"llama.cpp PR #20087 added ",[76,271,272],{},"--checkpoint-every-n-tokens N"," to snapshot the recurrent state during prefill, allowing restoration from the nearest checkpoint instead of reprocessing from position 0. I rebuilt to b8492, added ",[76,275,276],{},"--checkpoint-every-n-tokens 4096",", and validated with curl: checkpoint restored, 63% tokens saved.",[72,279,280],{},"But in real agentic use? Still full re-processing every turn.",[89,282,284],{"id":283},"the-wrong-hypothesis-parallel-slots","The Wrong Hypothesis: Parallel Slots",[72,286,287,288,291],{},"My first theory: with ",[76,289,290],{},"--parallel 4"," (default), the server assigns requests round-robin across 4 LRU slots. Each slot has its own checkpoints. A single-session agentic client bounces between slots, so the checkpoints from the previous turn are on a different slot.",[72,293,294,295,298],{},"Fix: ",[76,296,297],{},"--parallel 1",". Force everything onto one slot.",[72,300,301,302,305,306,308],{},"Result: no change. Still ",[76,303,304],{},"n_past = 34-35",". Still full re-processing. The checkpoints are there, but the server can't use them because the token prefix diverges at position 35. (Spoiler: ",[76,307,290],{}," turns out to matter later. Once the real problem is fixed, it cuts wall time nearly in half. But at this point in the investigation, it was a red herring.)",[89,310,312],{"id":311},"the-real-culprit-claude-codes-prompt-serialization","The Real Culprit: Claude Code's Prompt Serialization",[72,314,315,316,319,320,323,324,327],{},"The breakthrough came from testing with OpenCode (which uses the OpenAI ",[76,317,318],{},"\u002Fv1\u002Fchat\u002Fcompletions"," format) instead of Claude Code (which uses the Anthropic ",[76,321,322],{},"\u002Fv1\u002Fmessages"," format via ",[76,325,326],{},"ANTHROPIC_BASE_URL",").",[72,329,330],{},"Claude Code logs:",[249,332,335],{"className":333,"code":334,"language":254},[252],"n_past = 35, slot.prompt.tokens.size() = 39933\nforcing full prompt re-processing\nprompt eval time = 19511ms \u002F 39042 tokens\n",[76,336,334],{"__ignoreMap":199},[72,338,339],{},"OpenCode logs:",[249,341,344],{"className":342,"code":343,"language":254},[252],"selected slot by LCP similarity, sim_best = 0.995\nprompt eval time = 52ms \u002F 13 tokens\n",[76,345,343],{"__ignoreMap":199},[72,347,348,349,351],{},"52 milliseconds vs 19 seconds. Same model, same server, same ",[76,350,297],{},".",[72,353,354],{},"Claude Code re-serializes the entire prompt on every turn in a way that makes the token sequence diverge after ~35 tokens (roughly the end of the system prompt). The server sees a completely different token stream from position 36 onwards, so the KV cache, the recurrent state, and all checkpoints are useless.",[72,356,357],{},"OpenCode maintains a stable prefix. The server finds 99.5%+ similarity, processes only the new tokens (~13-100 per turn), and the recurrent state checkpoints accumulate naturally (up to 30\u002F32 over a session).",[89,359,361],{"id":360},"the-benchmark","The Benchmark",[72,363,364,365,368],{},"Same prompt, same task (Python interval scheduling library, 34 unit tests), all running in empty directories with ",[76,366,367],{},"--allowedTools"," to skip permission prompts:",[370,371,372,394],"table",{},[373,374,375],"thead",{},[376,377,378,382,385,388,391],"tr",{},[379,380,381],"th",{},"Model",[379,383,384],{},"Time",[379,386,387],{},"Tests",[379,389,390],{},"Client",[379,392,393],{},"Config",[395,396,397,415,429,446],"tbody",{},[376,398,399,403,406,409,412],{},[400,401,402],"td",{},"Opus (Anthropic API)",[400,404,405],{},"10:28",[400,407,408],{},"34\u002F34",[400,410,411],{},"Claude Code",[400,413,414],{},"n\u002Fa",[376,416,417,420,423,425,427],{},[400,418,419],{},"Sonnet (Anthropic API)",[400,421,422],{},"9:49",[400,424,408],{},[400,426,411],{},[400,428,414],{},[376,430,431,434,437,439,442],{},[400,432,433],{},"Qwen3-Coder-Next (local)",[400,435,436],{},"2:21",[400,438,408],{},[400,440,441],{},"OpenCode",[400,443,444],{},[76,445,297],{},[376,447,448,450,456,458,460],{},[400,449,433],{},[400,451,452],{},[453,454,455],"strong",{},"1:02",[400,457,408],{},[400,459,441],{},[400,461,462],{},[76,463,290],{},[72,465,466,467,469],{},"10x faster than Opus. Clean first pass, zero fix rounds. The model had previously failed this exact benchmark (circular imports, multiple fix iterations) when running through Claude Code. The config improvements since then helped, but the real unlock was the client switch. And once the client was fixed, restoring ",[76,468,290],{}," gave an additional ~2x speedup. The parallelism that was useless with CC's broken prefix became a real advantage with OpenCode's stable one.",[89,471,473],{"id":472},"what-i-learned","What I Learned",[475,476,477,484,490,499],"ol",{},[478,479,480,483],"li",{},[453,481,482],{},"The client matters as much as the model."," Claude Code's prompt re-serialization is invisible to the user but catastrophic for incremental KV cache on hybrid SSM architectures. This is a CC-specific behavior. It doesn't affect pure Transformer models the same way because their KV cache is more forgiving of prefix mismatches.",[478,485,486,489],{},[453,487,488],{},"Hybrid SSM models amplify cache misses."," With a pure Transformer, a prefix mismatch just means recomputing KV for the divergent suffix. With a hybrid model (Gated Delta Net + Attention), the recurrent state must be reconstructed from scratch, or from the nearest checkpoint if the prefix matches that far.",[478,491,492,498],{},[453,493,494,497],{},[76,495,496],{},"--checkpoint-every-n-tokens"," works, but only if the client cooperates."," The feature is sound. The curl tests proved it. But it's useless if the client rebuilds the prompt in a way that breaks prefix continuity.",[478,500,501,507,508,510],{},[453,502,503,506],{},[76,504,505],{},"--parallel N"," was a red herring, until it wasn't."," With CC's broken prefix, slot count doesn't matter: you can't reuse a recurrent state built from a different token sequence. But once the client cooperates (OpenCode), ",[76,509,290],{}," cuts wall time from 2:21 to 1:02. The server can now overlap prefill and generation across slots because the cache actually works. The same config change that did nothing with CC gave a ~2x boost with OpenCode.",[89,512,514],{"id":513},"the-workflow-now","The Workflow Now",[249,516,520],{"className":517,"code":518,"language":519,"meta":199,"style":199},"language-bash shiki shiki-themes strip-chart","alias cc='claude'                              # Opus\u002FSonnet via Anthropic API\nalias ccq='OPENAI_API_KEY=... OPENAI_BASE_URL=https:\u002F\u002Fcode.llm.internal\u002Fv1 opencode run'\n","bash",[76,521,522,545],{"__ignoreMap":199},[523,524,526,530,534,537,541],"span",{"class":525,"line":10},"line",[523,527,529],{"class":528},"sTLRP","alias",[523,531,533],{"class":532},"sAP0c"," cc",[523,535,536],{"class":528},"=",[523,538,540],{"class":539},"sFa7Q","'claude'",[523,542,544],{"class":543},"sql22","                              # Opus\u002FSonnet via Anthropic API\n",[523,546,547,549,552,554],{"class":525,"line":31},[523,548,529],{"class":528},[523,550,551],{"class":532}," ccq",[523,553,536],{"class":528},[523,555,556],{"class":539},"'OPENAI_API_KEY=... OPENAI_BASE_URL=https:\u002F\u002Fcode.llm.internal\u002Fv1 opencode run'\n",[72,558,559,560,562],{},"Design with Opus\u002FSonnet in Claude Code. Write the code with ",[76,561,230],{}," (OpenCode + Qwen local). Review with Opus\u002FSonnet. The local model handles the heavy lifting at 10x the speed, zero API cost, and full 262K context. Claude Code stays for Anthropic models only.",[89,564,566],{"id":565},"relevant-llamacpp-issues","Relevant llama.cpp Issues",[568,569,570,580,588,600],"ul",{},[478,571,572,579],{},[573,574,578],"a",{"href":575,"rel":576},"https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fllama.cpp\u002Fissues\u002F18497",[577],"nofollow","#18497",": cache-reuse not effective for qwen3-next",[478,581,582,587],{},[573,583,586],{"href":584,"rel":585},"https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fllama.cpp\u002Fissues\u002F20225",[577],"#20225",": full prompt re-processing on every conversation turn",[478,589,590,595,596,599],{},[573,591,594],{"href":592,"rel":593},"https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fllama.cpp\u002Fissues\u002F19794",[577],"#19794",": ",[76,597,598],{},"--swa-full"," ineffective for Qwen3-Coder-Next",[478,601,602,595,607,609],{},[573,603,606],{"href":604,"rel":605},"https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fllama.cpp\u002Fpull\u002F20087",[577],"PR #20087",[76,608,496],{}," (the fix that works, if the client cooperates)",[611,612,613],"style",{},"html pre.shiki code .sTLRP, html code.shiki .sTLRP{--shiki-default:var(--code-token-keyword)}html pre.shiki code .sAP0c, html code.shiki .sAP0c{--shiki-default:var(--code-foreground)}html pre.shiki code .sFa7Q, html code.shiki .sFa7Q{--shiki-default:var(--code-token-string-expression)}html pre.shiki code .sql22, html code.shiki .sql22{--shiki-default:var(--code-token-comment)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":199,"searchDepth":31,"depth":31,"links":615},[616,617,618,619,620,621,622,623,624],{"id":223,"depth":31,"text":224},{"id":237,"depth":31,"text":238},{"id":262,"depth":31,"text":263},{"id":283,"depth":31,"text":284},{"id":311,"depth":31,"text":312},{"id":360,"depth":31,"text":361},{"id":472,"depth":31,"text":473},{"id":513,"depth":31,"text":514},{"id":565,"depth":31,"text":566},"2026-03-23T22:50:08.331Z","A local 80B on two 3090 Tis finished the benchmark in 1:02 against Opus's 10:28, and the only thing I changed was the client. Claude Code re-serializes the whole prompt every turn, which kills prefix reuse on hybrid SSM models and costs 20 seconds of re-prefill per tool call.","0c8a57ac-5681-44d2-9d6d-12ec9c4c1861",false,{},"\u002Fposts\u002Flocal-80b-beats-claude-coding",{"title":218,"description":199},"local-80b-beats-claude-coding","posts\u002Flocal-80b-beats-claude-coding","NCe5kWmDjzq5zjfiQ93f22a70YGHU183eszXmFid8fE",{"id":636,"title":637,"body":638,"category_label":8,"category_slug":12,"date_created":701,"dek":702,"description":199,"directus_id":703,"extension":207,"is_promoted":628,"meta":704,"navigation":208,"path":705,"published_at":701,"seo":706,"slug":707,"status":213,"stem":708,"__hash__":709},"posts\u002Fposts\u002Fwhen-84-percent-token-reduction-means-zero-accuracy.md","When 84% Token Reduction Means Zero Accuracy",{"type":66,"value":639,"toc":695},[640,642,645,648,652,655,658,661,665,676,679,683,686,689,692],[89,641,224],{"id":223},[72,643,644],{},"I had been evangelizing semantic code search for weeks. VectorCode promised to cut through large codebases by understanding meaning, not just matching strings. So I did what I should have done from the start: I ran a real benchmark.",[72,646,647],{},"The task was concrete: debug a payment processing bottleneck in a Laravel app. The files that had to be found were PaymentHubController at the entry point, GatewayPaymentHubService where the bottleneck lived, GatewayPayment with the N+1 query, and PaymentRepository underneath it. A realistic debugging scenario, not some toy example.",[89,649,651],{"id":650},"the-numbers-that-stung","The Numbers That Stung",[72,653,654],{},"Vanilla Claude Code: 91,457 tokens, 38 tool calls, 142 seconds. Found all 4 critical files. 100% accuracy.",[72,656,657],{},"VectorCode: roughly 15,000 tokens, 6 queries, 8 seconds. Found zero critical files. 0% accuracy.",[72,659,660],{},"I stared at that for a while. An 84% token reduction sounds incredible until you realize it produced 100% false positives. You save nothing when the answer is wrong. It is like bragging about fuel efficiency on a car that drives to the wrong city.",[89,662,664],{"id":663},"why-it-failed","Why It Failed",[72,666,667,668,671,672,675],{},"The failure modes were instructive. Semantic embeddings are great at matching documentation and test files, things written in natural language that describe what code does. But terse code? Variable names like ",[76,669,670],{},"$gatewayPayment"," and method signatures like ",[76,673,674],{},"processHubPayment()","? The embeddings had no idea what to do with those. VectorCode matched conceptually adjacent files (docs about payments, test helpers) instead of the code that mattered.",[72,677,678],{},"Meanwhile, vanilla CC did what good debugging actually looks like. It followed the framework's structure: routes to controllers to services to repositories. Pattern-based discovery. Progressive refinement. It knew Laravel, so it knew where to look. No semantic magic needed, just methodical grep-and-read cycles.",[89,680,682],{"id":681},"what-i-actually-learned","What I Actually Learned",[72,684,685],{},"My first instinct was to throw VectorCode out entirely. But that felt reactionary. The tool is fine. I was aiming it at the wrong job. When I asked it conceptual questions like \"how does payment processing work in this codebase?\" it returned useful orientation results. It is a discovery tool, and I had been using it as a precision one.",[72,687,688],{},"The hybrid approach is the real answer. VectorCode for the \"I just joined this project, where do I even start?\" phase. Vanilla tools for \"there is an N+1 query somewhere in the payment flow and I need to find it now.\"",[72,690,691],{},"Token efficiency is worth counting only when the answer stays right. An 84% reduction that produces garbage is waste with better optics.",[72,693,694],{},"I am glad I ran the benchmark before building my entire workflow around it. The numbers do not care about my enthusiasm.",{"title":199,"searchDepth":31,"depth":31,"links":696},[697,698,699,700],{"id":223,"depth":31,"text":224},{"id":650,"depth":31,"text":651},{"id":663,"depth":31,"text":664},{"id":681,"depth":31,"text":682},"2026-03-02T16:15:40.904Z","Semantic code search cut my token spend by 84% on a real Laravel debugging task and found zero of the four files that mattered. I had been evangelizing the tool for weeks before I finally benchmarked it.","16d46683-a587-4d4f-b62a-b352b3698dce",{},"\u002Fposts\u002Fwhen-84-percent-token-reduction-means-zero-accuracy",{"title":637,"description":199},"when-84-percent-token-reduction-means-zero-accuracy","posts\u002Fwhen-84-percent-token-reduction-means-zero-accuracy","z_VtyoPypiHuUCLBGrcZl-sI1YJgX7WRN-z9dTeR-2U",1786607568637]