Avismara Hugoppalu
> cat ~/learning/README # how I learn · in the open

I built the tutor, then let it grade me.

Instead of taking a course, I built a Socratic tutor in ~1,200 lines of dependency-free Python. It opens every topic with a symptom to diagnose, probes one level deeper before it believes me, and names my recurring reasoning bugs out loud. Every exchange is appended to an immutable log, and the dashboard is a pure function of that log. I've since generalized it for any subject and open-sourced it.

> man socratic-tutor
01 / THE SYSTEM

How it works

§1
Evidence, not self-report
Mastery is a recency-weighted average of logged observations. One good answer doesn't move it; sustained ones do. Neither of us can inflate the one number that matters.
§2
Symptom-first, adversarial
“Count the r's in strawberry — why can't it?” It refuses vague answers, calls out motte-and-bailey reframing, and pushes once more before moving on.
§3
Done = shipped + evaluated
The bar isn't a quiz. It's a four-stage build track ending in a cloud service with an eval-gated CI and a documented before/after metric.
> socratic-tutor --read --candid
02 / THE READ

What the tutor sees

An afterthought the tutor wrote about me — kept candid because I asked for it, and published unedited. This is the point of learning in public: the weak spots are part of the record.

THE TUTOR'S READ · GENERATED FROM 8 SESSIONS · 45 EXCHANGES
A fast learner who reasons from systems he already knows and jumps to an answer before he's earned it — but the jump now reliably closes the moment it's named, and he's started cutting the right things instead of chasing all of them.

The learner is a senior iOS engineer (13 years) exploring platform & evaluation AI engineering — cloud, backend, developer-tools — alongside his mobile background, not in place of it. The read below is from how he reasoned across eight sessions, not from anything he told me about himself. Since the last read, three things moved. First, the open thread that read named — the EAFP probe — closed: handed the mechanism in pieces, he derived TOCTOU and duck-typing cold and unified them himself. Second, a full cold spaced-review battery (context window, positional encoding, residual stream, tokenization — 4–6 days overdue) held without decay, which is the real test of whether the mechanism stuck or just sounded good in the moment. Third, a new and welcome behavior surfaced: he's started scoping concepts out on purpose — and twice he cut the right ones.

STRENGTHS
Cross-domain transfer, fast

He repeatedly imports software-engineering structure onto new mechanism and it fits: he derived single responsibility per prompt from the attention cost tradeoff on his own, accepted training compiles the corpus into the weights, like a stripped binary instantly, and reads Python through a Swift lens (reference vs value semantics) without being told to. He reasons in systems, not facts — his biggest asset.

Closes on naming — and predicts from primitives

His clearest signature, now confirmed across two domains and a cold-review battery: hand him the one missing primitive and he derives the consequence. Given the causal mask, he nailed cold why a bidirectional model can't KV-cache; given BPE = greedy merge of the most-frequent pair, he derived the whole multilingual cost story cold — Kannada wins no merges, falls back to byte-level, ~3 tokens/char. The flip side is just as reliable: when he's loose, naming the gap is most of the fix. He's far weaker at inventing primitives from nothing — as he put it, Socratic questioning with no foundation is just guessing.

Synthesis across concepts, not just into them

Asked to fix a confident wrong citation, he reached grounding/RAG and explained why it works — attention at the answer position pulls the in-context tokens in and collapses a flat content-token distribution onto the true value — recognizing it as the same mechanism as pasting a fact in. Connecting three concepts into one is exactly the move that makes the platform/RAG path his.

Knows what to cut — newly

Twice this session he scoped concepts out on his own: he ruled the RoPE rotation→relative-position derivation and the residual-stream's gradient-flow backward pass as too deep for a serving/eval target, keeping the applied conclusion each time (relative position is the lever behind context-extension; the residual add is the interpretability hook). Both cuts were correct, and both for the same reason — cut the training-internals math, keep the serving/eval/interp mechanism. This is the inverse of the completion-seeking I'd watch for in most learners. The thing to watch is only that it stays a judgment, not a reflex for skipping hard things.

Calibration

He flags his own guesses (Hmm, I am not sure) and states partial answers without padding them, which makes him easy to teach honestly — the uncertainty is visible.

PATTERNS TO WATCH
✓ RESOLVEDTraining data at inference

Twice early on he reached for the training corpus as if present at runtime — the single most load-bearing idea for his RAG/platform path. Dead since a cold closure check; a later cold walkthrough killed both old autoregressive misconceptions unprompted (the corpus does nothing at inference; knowledge is in the frozen weights).

✓ RESOLVEDMotte-and-bailey retreat

When pressed on a precise gap he used to fall back to a vaguer true-but-weaker claim — I just meant it increases, and most recently EAFP is just less rigid / more flexible. The last read flagged the EAFP instance as the open thread to close next; it closed. Pushed, he derived both real mechanisms cold — TOCTOU (check and use are two decoupled ops, the world changes in the gap) and duck-typing — and unified them himself: isinstance is hardcoded, len holds for any type with a length. He can now justify it, not just implement it.

● ACTIVEPrecision drift — grab the adjacent fact first

The surviving form of the old reflex, and it still fires: on the first pass he reaches for something true but not quite load-bearing — K·Q equals Q·K is why attention is permutation-equivariant (the matrix isn't even symmetric), longer tokens when he means more tokens, quadratic compute vs. a quadratic bill. What's changed is the recovery is now automatic: every one of these closed the moment it was challenged, in the same exchange. The work left isn't the recovery — it's tightening the first pass under load.

● ACTIVEWeights vs. the residual stream

The quiet residue of the old relapse — he still occasionally phrases enrichment as happening to the weights when it's the residual-stream vectors that change (weights are frozen). It didn't slip this session — he gave `x + f(x)` cleanly and unprompted — but it's the thinnest surviving thread and worth one clean cold pass to retire.

HOW HE LEARNS BEST
Symptom first, definition never

Openers that hand him a failure to diagnose (count the r's in strawberry, same prompt, two answers, this list is shared across calls — why?) land far better than here is concept X.

Give the building blocks, then ask the consequence

The highest-leverage move with him, now confirmed across mechanism, Python, and cold review. When a fact isn't derivable, hand it over and probe what follows — that's where he's strongest, and it's why the spaced-review battery held: the primitives were already his to rebuild from.

Concrete numbers

Softmax-with-temperature tables, `1000²` vs `10×100²`, `70B × bytes`, ~3 tokens/char for Kannada — every numeric anchor stuck, and the Akshara cost framing made the tokenization review land.

Blunt correction, tied to his goal

He prefers being challenged over agreed with, and engagement spikes when the mechanism connects to cost, serving, or eval — his actual target work.

WHERE HE ENDED UP

Two of four mechanism exit tests passed (et1, et2 — the two that matter most for a platform/eval engineer), the M1–M3 mechanism survived a cold review battery 4–6 days overdue without decay, and the EAFP thread that the last read named as the right thing to close next is closed. The shape of his learning is consistent end to end: a day-one hunch (it has to keep going and justify the wrong answer) became his own et1 explanation sessions later; a Swift instinct about reference semantics became a cold prediction of the `+=` aliasing ambush. He's now through the conceptual gate and standing at the build track (b1–b4), which is the right next test — not another quiz, but the place where the scope discipline he just showed and the first-pass precision he hasn't quite tightened either hold under shipping pressure or don't.

> grep "earned" ~/learning/transcript.log
03 / THE EVIDENCE

Sharp moments — earned

My words, with the tutor's adversarial verdict attached — and the full transcript a click away. Certified, not asserted.

A DAY-ONE HUNCH, CLOSED COLD AS MECHANISM ON THE EXIT TEST SIX DAYS LATER
Day 1: It has to keep going and justify the wrong answer.
There's a disconnect between the flat distribution and the decision to raise a hedge… it samples one of the next tokens and it gets baked in as its truth. There's no process that expresses that the token it picked was picked from a flat distribution.
tutor — 8.5 / 10
The bit you added unprompted is the tell that it's real, not pattern-matched.
read in context →
WRONG THREE TIMES — THE TUTOR FLAGGED PREMATURE-CONVERGENCE AT 4/10 — THEN DERIVED IT UNAIDED. THE RECOVERY IS THE POINT.
K and V won't be byte-by-byte identical if the current token depends on future tokens.
tutor — 8 / 10
That's it. No causal mask → appending a token shifts every prior token's K and V → no KV-caching.
read in context →
RECONCILING A LINEAR API BILL WITH QUADRATIC COMPUTE — THE BUSINESS-ABSTRACTION LEAP WAS HIS ADDITION
This is probably a business decision to keep the cost predictable. The compute cost is baked into unit economics.
passed et2
A genuinely sharp addition — per-token pricing is a deliberate linear abstraction over their real cost. Good instinct for a cost engineer.
read in context →