DAILY NEWS

Stay Ahead, Stay Informed – Every Day

Advertisement
AI Evals, Part 2: Error Analysis The Unglamorous Superpower Behind Good Evals



Part 2 of a series on building production AI on .NET. Part 1 covered what evals are and the Analyze → Measure → Improve lifecycle. This post is about the step everyone wants to skip: **Analyze.

When a team decides to “take evals seriously,” the first thing they usually do is wrong. They open a dashboard tool, wire up a generic “correctness” score, and watch a number. It feels productive. It produces a chart. And it tells them almost nothing, because they skipped the step that decides what the chart should even measure.

That step is error analysis: reading your AI’s actual outputs and naming, precisely, the ways they go wrong. It’s unglamorous — no library, no dashboard, just you and a few dozen real examples. It is also, by a wide margin, the highest-leverage thing you will do in evals: error analysis is where the signal comes from. Everything downstream is just operationalising what you find here.

Why you can’t skip straight to metrics

There’s a gap between you and your running system that’s easy to underestimate. Thousands of inputs flow through your AI feature daily, in shapes you never anticipated, and you have no realistic way to see them at scale. Call it the comprehension gap — the distance between the developer and a true understanding of what the data and the model are actually doing.

Metrics don’t bridge that gulf; they presuppose it’s already bridged. To measure “conciseness” you must first have noticed that verbosity is a failure mode worth caring about. If you pick your metrics before you’ve read your data, you’re measuring your assumptions, not your product. The classic result: a dashboard glowing green while users quietly churn over a problem your metrics were never designed to catch.

Error analysis is how you cross the gulf. You trade scale for truth — you can’t read everything, so you read a sample, carefully.

How error analysis actually works

It’s a three-move loop, and the moves are deliberately low-tech.

1. Get a starting dataset and read it. Pull a sample of real (or realistic) outputs — 50 to 100 is plenty to start. Not the happy-path demo cases; the real distribution, including the weird inputs. Then actually read them. Slowly.

2. Open-code the failures. For each output that’s wrong, write a short, free-text note describing what specifically is wrong — in your own words, no fixed categories yet. “Explained the word using a dictionary definition instead of the meaning it has in this sentence.” “Translation is correct but the tone is far too formal for a casual chat.” “The quiz distractor is so obviously wrong it gives the answer away.” This is open coding: you’re labelling reality, not forcing it into boxes.

3. Cluster the notes into a taxonomy. Once you have 40–50 notes, patterns emerge. Group them. Those groups are your failure taxonomy — a ranked list of how your feature fails, with rough frequencies. Now you know what to fix first (the common, severe modes) and, crucially, what your metrics should measure.

That’s the whole secret. The taxonomy is the output, and it’s worth more than any single score, because every later step — the rubric, the golden set, the judge — is downstream of it.

A mindset note: be a detective, not a judge (yet)

The hard part of error analysis isn’t mechanical, it’s psychological. You will be tempted to immediately assign a 1–5 score, or to jump to “the fix is to add a line to the prompt.” Resist both. Scoring too early collapses rich information (“it’s a 2”) into a number that hides why. Fixing too early means you patch the first failure you see instead of the most common one.

Stay descriptive for as long as you can. Your only job in this phase is to understand and categorise. Judgement and repair come later.

A second trap is doing it alone. When two people label the same outputs, they disagree — and the disagreements are gold, because they reveal that “good” isn’t actually defined yet. A short alignment session to resolve them sharpens your definition of quality before you bake it into a rubric. (Solo founders can approximate this by labelling, sleeping on it, and re-labelling cold.)

How error analysis shaped TextStack’s evals

This isn’t abstract for us. TextStack has seven AI surfaces, and every rubric we score against came directly out of reading failures, not out of a generic template.

Take Explain (tap a word, get a short in-context explanation). Reading real outputs surfaced a recurring failure: the model would produce a competent dictionary definition while ignoring the sentence the reader was actually looking at — useless for someone trying to understand this passage. That single observation is why the Explain rubric scores accuracy in context and usefulness to a learner as distinct axes, and explicitly penalises dictionary boilerplate under conciseness. The rubric is a direct transcription of the taxonomy.

Other surfaces produced different taxonomies, and therefore different axes:

Translate kept failing on register — accurate but wrong formality — so register became its own scored dimension alongside accuracy and fluency.

Vocabulary distractors (wrong answers in a quiz) failed by being implausible (too obviously wrong) or too similar to the right answer, so the rubric scores plausibility, distinctness, and difficulty.

We didn’t invent those dimensions in a meeting. We read outputs until the dimensions were obvious. And because every AI call is traced and viewable on an internal /ai-quality page, error analysis isn’t a one-time exercise — new production failures keep feeding new categories back into the taxonomy.

The pitfalls

Scoring before describing. A number erases the why. Open-code in words first.

Vague categories. “Bad output” isn’t a category; “ignored the sentence context” is. Specific enough to act on.

Too small a sample, or only the easy cases. If you only read successes, you’ll conclude everything is fine.

Fixing during analysis. Note the failure, move on. Triage after you can see the whole picture.

Labelling solo with no calibration. Disagreement is information; surface it before it hardens into a bad rubric.

Doing it once. Inputs drift. The taxonomy is a living document, refreshed from real traffic.

The takeaway

Error analysis is the part of evals with no tooling, no dashboard, and the highest payoff — and that’s exactly why it gets skipped. Read your failures, name them in plain language, and cluster them into a taxonomy. That taxonomy tells you what to fix and what to measure. Skip it and you’ll build a beautiful measurement system pointed at the wrong target.

Next in the series: golden datasets that don’t lie — turning your taxonomy into a curated set of cases you can score against, without quietly fooling yourself.

TextStack is a reader that helps you finish the dense technical book you keep quitting — it builds every modern AI primitive (observability, evals, RAG, agents) as a real production feature on .NET. Try it at textstack.app, or read the code at github.com/mrviduus/textstack.



Source link

I Built a Full Apex IDE Inside a Chrome Extension (No Java, No Local Setup)


The Problem with the Existing Apex Workflow

If you’ve done any meaningful Apex development, you know the drill:

Open Salesforce Developer Console (slow, clunky, no PMD)
Switch to VS Code + Salesforce Extension Pack (heavy, requires local setup)
Run PMD separately with a Java runtime (extra install, extra config)
Run tests via SFDX CLI (terminal required)
Repeat across orgs

Every step is friction. And if you’re working across multiple orgs or on a machine that isn’t fully set up, that friction compounds fast.

I wanted something simpler: open Chrome, open my Salesforce org, start coding.

What I Built

ApexForge is a Chrome extension that brings a full Apex development environment directly into your browser. No IDE. No CLI. No Java.

Here’s what it does:

📂 Apex File Explorer

Browse every Apex Class and Trigger in your connected org. Search, sort, open files in the editor, or jump to the Salesforce record page — all without leaving the extension.

✏️ Code Editor (VS Code-like)

A fully featured editor inside the popup:

Apex syntax highlighting (keywords, SOQL, methods)
Find (Ctrl+F) and Find & Replace (Ctrl+H)
Go to Line (Ctrl+G)
Minimap, Split View, Word Wrap
Format Document
Save & Deploy directly to your org
Refresh from org at any time

🔍 PMD Analysis — In the Browser, No Java Required

This was the hardest part to build. PMD normally requires a Java runtime and a JAR file. I ported 12 PMD rules across 6 categories to run entirely in JavaScript inside the extension:

Category
Rules

Performance
AvoidSoqlInLoops, AvoidDmlInLoops

Error Prone
AvoidHardcodingId, EmptyCatchBlock, NullAssignment

Best Practices
ApexUnitTestClassShouldHaveAsserts, AvoidGlobalModifier

Security
ApexSharingViolations, ApexCRUDViolation

Code Size
ExcessiveClassLength, TooManyFields

Design
AvoidDeeplyNestedIfStmts

Run analysis on a single file or scan your entire org in one pass. Click any violation to jump to that exact line in the editor.

▶ Apex Test Runner

Execute unit tests without opening a terminal:

Async execution via runTestsAsynchronous with a live progress bar
Sync execution via runTestsSynchronous for quick feedback
Auto-detects test classes by naming convention
Pass / Fail / Skip badges with stack traces
Code coverage visualisation — per test class and aggregate

💡 Apex Advisor

Real-time analysis as you type. Detects:

Bulkification issues
Missing sharing declarations
SOQL/SOSL/DML patterns
Method signature problems

Comes with auto-fix suggestions and code snippet templates.

Security & Privacy

I care about this a lot, especially since the extension touches Salesforce session data:

Session IDs stored in chrome.storage.local — encrypted by the OS keychain
All API calls use HTTPS — no plaintext
No data sent to any third-party server. Ever.
No analytics. No telemetry. No backend services.
Network access scoped only to *.salesforce.com and *.force.com

The editor runs in a sandboxed iframe
Your Apex code never leaves your browser except to your own Salesforce org

How It Works

Install ApexForge and pin it to your Chrome toolbar
Open any Salesforce app from the App Launcher
Click the ApexForge icon — it auto-detects your org from the active tab
Browse, edit, analyse, and test your Apex

The only requirement is a valid Salesforce Session ID (obtainable from Developer Console, DevTools, or SFDX CLI) and API access enabled on your org.

Why I’m Sharing This

I built this as a personal tool and kept making it better. At some point it felt like something the Salesforce developer community could genuinely use — especially for quick edits, code reviews on the go, or orgs where you can’t install a full local dev environment.

It’s free and open source.

🔗 Install ApexForge on the Chrome Web Store

🌐 apexforge.free.nf

If you work with Salesforce Apex regularly, give it a try. I’d love feedback — what rules are missing from the PMD analyser, what editor features you’d want, anything.

Drop a comment or reach out directly. Happy to discuss the technical implementation too if anyone’s curious how the browser-native PMD port works.



Source link

Introducing Joanium: An Open-Source AI Desktop App That Can Actually Get Things Done



AI assistants today live in browser tabs. You open one for writing, another for code, a third because it’s better at research, and a fourth because your team uses it. Each one is locked to its own provider, its own pricing, and its own walled-off context. None of them can touch your files, run a command, or carry what they learned from one session into the next.

Joanium is built to change that.

Joanium is a local-first, open-source AI desktop app that runs on your machine, connects to nearly every major AI provider, and gives that AI the tools to actually act — not just respond.

Website: joanium.comSource code: github.com/Joanium/Joanium

One App, Every Model

Joanium supports Gemini, Claude, OpenAI models, and a growing list of additional providers including Fireworks, SambaNova, AI21, Lambda, and Hyperbolic — with live model fetching, so new releases show up without waiting on an update. You bring your own API keys and choose the right model for the task, the budget, or the moment, without rebuilding your workflow every time you switch.

An AI With Hands: 160+ Tool Integrations

Most AI tools can describe what they’d do. Joanium’s agents can go do it. With 160+ built-in tool integrations — covering platforms like GitHub, Gmail, YouTube, Linear, Netlify, Canva, and Stripe — Joanium can read your repos, draft and send emails, manage tickets, and interact with the services you already use, directly from a single interface.

Multiple Agents, Working Together

Rather than relying on one general-purpose assistant for everything, Joanium supports multi-agent execution along with a skills and personas system. You can configure agents for specific roles and let them collaborate on a task — closer to delegating work across a small team than managing a single chat window.

Full Visibility Into What Your AI Did

Two features sit at the core of how Joanium handles transparency:

Execution Replay — step through exactly what an agent did, in order, after the fact.Conversation forking with provenance tracking — branch a conversation in a new direction without losing the trail of where it came from.

When an AI is taking real actions on your behalf, being able to see — and audit — those actions isn’t a nice-to-have. It’s the baseline.

Built-In Browser, Git Integration, and a Marketplace

Joanium also includes an inbuilt browser for agents to use directly, native Git integration for working with repositories, a Daily Digest Agent that surfaces relevant updates automatically, and a Marketplace for discovering and installing additional tools and skills as the ecosystem grows.

Why Local-First, and Why Open Source

Most AI tools today route everything — your prompts, your files, your context — through someone else’s servers, under someone else’s terms. That tradeoff has been easy to ignore when AI was mostly a chat window. It gets harder to ignore once that AI is reading your emails, browsing on your behalf, and pushing to your repositories.

Joanium runs locally, and its source is fully open under the Apache 2.0 license. That means the code doing all of this is inspectable, forkable, and not contingent on a company’s roadmap or pricing decisions.

It’s also worth being precise about one thing: Joanium itself is free and open source, but using it still involves paying AI providers for API usage — there’s no way around that, and no product can honestly claim otherwise. What changes is who you pay and how much control you have over that. Instead of stacking multiple subscriptions regardless of use, you pay per request, choose your providers, and switch whenever it makes sense. For many people juggling several AI subscriptions today, that alone is a meaningful shift.

Get Started

Joanium is available now:

Website: joanium.comGitHub: github.com/Joanium/Joanium

Download it, connect an API key for a provider you already use, and explore what it can do. As an open-source project, feedback, issues, and contributions are welcome — and actively shape what gets built next.



Source link