Foundations

Embrace the good, engineer around the bad

LLM capabilities are jagged

The strawberry problem

How many r’s are in “strawberry”?

Most LLMs confidently answer 2.

The correct answer is 3.

An “easy” task for a 5-year-old. A hard task for a trillion-parameter model.

But also…

SCREENSHOT: an impressive Claude Code or Copilot session —
a complex coding task completed in seconds
(e.g., “build me a Shiny app that does X” → working app)

A “hard” task for most humans. Trivial for an LLM.

The jagged frontier

IMAGE: “Jagged frontier” illustration —
a line graph with “task difficulty (human perception)” on x-axis
and “LLM performance” on y-axis, showing a jagged, non-monotonic curve
(Source: Ethan Mollick / “Co-Intelligence”, or recreate as a simple sketch)

The key insight

LLMs are great at

  • Language → code
  • Summarization
  • Pattern matching
  • “Fuzzy” translation

LLMs are bad at

  • Precise counting / math
  • Faithful recall of facts
  • Consistent long-range state
  • Knowing what they don’t know

Our strategy: focus LLMs on what they’re good at, and engineer around the rest.

What is an agent?

flowchart TD
    U["👤 User"] --> |prompt| L["🧠 LLM"]
    L --> |tool call| T["🔧 Tools"]
    T --> |result| L
    L --> |response| U
    style L fill:#447099,stroke:#33567a,color:#fff
    style T fill:#ee6331,stroke:#c84e1f,color:#fff
    style U fill:#0e3b5c,stroke:#082638,color:#fff

An agent is an LLM, in a harness, that calls tools in a loop — deciding each next step from the last result.

  • Read tools observe the world
  • Write tools change the world

Agent harnesses are getting good

SCREENSHOT: Claude Code terminal session
(something relatable — fixing a bug, writing tests)

SCREENSHOT: OpenAI Codex or similar
(another agent IDE in action)

This has radically changed how I work in the last 6 months.

YOLO mode

Let the agent run unsupervised.

Terrifying. But so useful.

✅ Viable when…

  • Local dev environment
  • Easy to undo (git)
  • Low blast radius

❌ Dangerous when…

  • Hosted / production system
  • Real users, real data
  • Hard to undo

Hallucinations & sycophancy

Hallucination

The model invents plausible-sounding information that isn’t true.

“The pandas.DataFrame.fuzzy_merge() method…”

(This doesn’t exist.)

Sycophancy

The model agrees with you even when you’re wrong.

“You’re right, that approach is much better!”

(It wasn’t.)

Both are unsolved. Both are why we need human-in-the-loop design.

I feel deeply conflicted about AI

I’m so much more productive.

But at what cost?

Personal — Am I losing the ability to think for myself?

Societal — Am I contributing to something harmful?

IMAGE: something contemplative —
a person at a crossroads, or a balance/scale visual
(keep it tasteful, not melodramatic)

What’s the alternative?

If I practice AI abstinence, is that better than
helping people practice safe AI?

I chose to build tools that make AI safer and more transparent:

  • Humans stay in the loop
  • Outputs are verifiable
  • The system is auditable

In data science, correctness matters

Design systems where humans can course-correct and verify.

  • Show your work (code, not just answers)
  • Make it reproducible
  • Let the human say “no, that’s wrong”

SCREENSHOT: Posit Assistant showing
generated code alongside results —
the “show your work” pattern

Don’t overthink it

You probably don’t need:

Complex RAG

Multi-agent systems

Fine-tuned models

What you do need:

Good context + good tools + a human in the loop

Unless you have scale issues, agentic search of plain text files works surprisingly well.

The recipe for today

  1. Focus LLMs on language → code
  2. Give them tools and context
  3. Keep humans in the loop

That’s it. Let’s go build.

☕ Break — 5 min