The Shape of the Gap: Socrates, Aporia, and the Architecture of Unlearning in Coni
“Aporia teaches us that we don’t know what we thought we knew, and we are all the better for finding out. After all, it is better to have knowledge of our ignorance than to be ignorant of our ignorance.”
— Oscar Davis, What is the Socratic method? Could it be used to test students in an age of AI? (The Conversation, October 2026)
“Whatever inspiration is, it’s born from a continuous ‘I don’t know’… This is why I value that little phrase ‘I don’t know’ so highly. It’s small, but it flies on mighty wings.”
— Wisława Szymborska (Nobel Lecture, 1996)
“Friend, please, do not try to decide now. Do not shut any possibility out of your heart. Honor this place of not knowing… Answers will appear only when they are ready. When the questions have been fully honored and loved.”
— Jeff Foster (The Way of Rest, 2016)
I. The Courthouse Steps and the Oracle Machine
In 399 BCE, on the marble steps outside the court of the Archon Basileus in Athens, two men collided.
One was Socrates, seventy years old, walking toward the trial that would end in a cup of hemlock. He was indicted on politically motivated charges of failing to honor the city’s gods and corrupting the youth. The other was Euthyphro, a self-assured religious prophet striding into court to prosecute his own father for manslaughter.
Euthyphro had zero doubt. When his family protested that prosecuting one’s elderly father was impious, Euthyphro scoffed: they simply failed to understand the divine law of piety.
To Socrates, this was a miracle. Here, at the exact moment Socrates was being dragged before a jury for impiety, stood a man who claimed total, unshakeable certainty about what piety was! And so, as philosopher Oscar Davis recounts in his piercing essay for The Conversation—“What is the Socratic method? Could it be used to test students in an age of AI?”—Socrates invited Euthyphro into a conversation.
That conversation, immortalized in Plato’s Euthyphro, did not end with a textbook definition of piety. It ended with Euthyphro tunic-loosened, dizzy, contradicting himself at every turn, and finally bolting down the street—“storming off” rather than staying in the uncomfortable, humbling space that the Greeks called aporia ($\dot{\alpha}\pi\omicron\rho\acute{\iota}\alpha$): a pathless perplexity, the sudden realization that we do not know what we thought we knew.
Now fast-forward 2,425 years.
We have built silicon oracles that sit in every browser tab and terminal window. Unlike Socrates, a Large Language Model never leads you into aporia. If Euthyphro had opened a chat prompt on the courthouse steps and typed, “Give me five bullet points proving it is pious to prosecute my father,” the model would have replied in 180 milliseconds:
“Certainly! Here is a well-structured legal and theological argument supporting your prosecution…”
As Davis observes, the existential danger of AI in education—and in software engineering—is not that people get answers:
“A student who asks AI to explain the causes of the French Revolution (simply because this was a question assigned to them) has asked a question, but not one that costs them anything. Nothing in their own understanding was at risk in the asking… AI answers before the question has been sharpened, and often before the student has worked out what they were really asking in the first place. The danger is that the experience of aporia is skipped entirely and the authentic and generative question that might have led somewhere is never found.”
In The Architecture of Grace (our philosophical and architectural companion to Coni), we have spent twenty chapters arguing a single thesis: computer science did not outgrow the humanities; it merely re-enacted their deepest dilemmas in silicon.
What happens when we examine Plato’s elenchus (the Socratic method) and Davis’s warning about the foreclosure of aporia through the lens of functional systems architecture and Coni code?
II. The Pathology of Premature Closure: Oracle RPC vs. Elenchus CSP
In Chapter 19 of The Coni Book (The Sacred Not Knowing), we contrasted Eager Foreclosure—where an imperative runtime greedily forces every branch and locks into the first available answer—with Liminal Evaluation, inspired by Jeff Foster and Wisława Szymborska.
Oscar Davis diagnoses the exact same pathology in how humans interact with AI.
When a student (or an autonomous software agent) treats intelligence as a Zero-Cost Oracle RPC, the interaction is stateless and one-way:
- A shallow, unexamined prompt is fired across the wire.
- The oracle immediately fills the void with fluent, high-probability tokens.
- Zero internal state is risked. No prior belief is tested; no contradiction is exposed; aporia is short-circuited.
Plato’s elenchus, by contrast, is not a lookup table. As Davis outlines, the Socratic method is a stateful, six-step dialogical protocol:
- One participant (Socrates) asks the questions.
- The partner must respond from their own held convictions.
- A universal definition or invariant principle is sought (not just a list of examples).
- Socrates seeks clarification, gathering assent to auxiliary premises.
- Those premises are composed to reveal an internal contradiction in the original claim.
- The loop repeats until the partner either flees in frustration or enters aporia—the fertile ground where unlearning completes and a sharpened question is born.
In Coni, we don’t model dialogue as a destructive variable mutation or a one-shot HTTP getter. We model it using Communicating Sequential Processes (CSP) (chan, go, >!, <!) paired with Epochal Immutability—where every refutation preserves the historical ledger of what we used to believe and how the question sharpened.
Let’s write Plato’s Euthyphro as a live concurrent dialogue in Coni:
;; 1. Modeling an Interlocutor with an Immutable Epochal Ledger
(defn make-interlocutor [name claim confidence]
{:name name
:claim claim
:confidence confidence
:epoch 0
:status :dogmatic-certainty
:history []})
;; 2. The Elenchus Step Function: Refutation as Question-Sharpening
(defn elenchus-step
"Applies Socratic refutation (elenchus) to an unexamined claim against a counterexample.
Instead of overwriting memory, each step records an immutable epoch and sharpens the question."
[state probe]
(let [contradiction? (:exposes-contradiction? probe)
new-conf (if contradiction?
(max 0.15 (- (:confidence state) (:severity probe)))
(:confidence state))
aporia? (<= new-conf 0.35)
new-status (cond
aporia? :aporia-reached
contradiction? :perplexed
:else :dogmatic-certainty)
sharpened-q (:refined-question probe)]
{:name (:name state)
:claim (if aporia? nil (:next-claim probe))
:confidence new-conf
:epoch (inc (:epoch state))
:status new-status
:question sharpened-q
:history (conj (:history state)
{:epoch (inc (:epoch state))
:prior-claim (:claim state)
:probe (:socratic-question probe)
:contradicts (:contradiction probe)
:confidence new-conf
:status new-status
:sharpened-q sharpened-q})}))
Now let’s wire Socrates and Euthyphro across bounded CSP channels (ch-socrates and ch-euthyphro) and watch Euthyphro’s dogmatic certainty (0.98) dissolve across three rounds of elenchus:
(defn run-euthyphro-dialogue []
(let [ch-socrates (chan 4)
ch-euthyphro (chan 4)
probes [{:socratic-question "Is that which is pious loved by the gods because it is pious, or is it pious because it is loved by the gods?"
:contradiction "Defining piety as 'prosecuting the wrongdoer' gives only an example, not the universal form (eidos)."
:exposes-contradiction? true
:severity 0.32
:next-claim "Piety is what is dear to the gods."
:refined-question "What is the single universal form that makes all pious actions pious?"}
{:socratic-question "Do the gods not quarrel and disagree with each other about what is just and unjust?"
:contradiction "If the gods disagree, the same act is both god-loved and god-hated—making it simultaneously pious and impious."
:exposes-contradiction? true
:severity 0.30
:next-claim "Piety is what ALL the gods love unanimously."
:refined-question "How can divine approval ground morality if approval itself depends on a prior standard?"}
{:socratic-question "Does the god love the pious because it is pious, or is it pious because the god loves it?"
:contradiction "If being god-loved is a secondary effect of being pious, it cannot be the essential definition of piety!"
:exposes-contradiction? true
:severity 0.25
:next-claim nil
:refined-question "If external authority cannot define virtue, what intrinsic property makes an action just?"}]]
;; Socrates coroutine: paces elenchus probes across the channel
(go
(doseq [p probes]
(>! ch-socrates p))
(close! ch-socrates))
;; Euthyphro coroutine: receives each probe and evolves through immutable epochs
(go
(loop [state (make-interlocutor "Euthyphro" "Piety is prosecuting my father for murder." 0.98)]
(let [probe (<! ch-socrates)]
(if (nil? probe)
(>! ch-euthyphro state)
(recur (elenchus-step state probe))))))
(<! ch-euthyphro)))
When we execute this script with ./coni, look at the trajectory that emerges:
=== 1. EUTHYPHRO CSP DIALOGUE ===
Final Status: :aporia-reached
Final Confidence: 0.15
Sharpened Question: If external authority cannot define virtue, what intrinsic property makes an action just?
Epoch 1 [:perplexed | conf: 0.66] -> What is the single universal form that makes all pious actions pious?
Epoch 2 [:perplexed | conf: 0.36] -> How can divine approval ground morality if approval itself depends on a prior standard?
Epoch 3 [:aporia-reached | conf: 0.15] -> If external authority cannot define virtue, what intrinsic property makes an action just?
Look closely at what happened between Epoch 0 and Epoch 3.
At Epoch 0, Euthyphro had an answer (:confidence 0.98), and therefore he had no question. By Epoch 3, his dogmatic claim has been reduced to nil (:status :aporia-reached), his false confidence has dropped to 0.15, and in its place stands one of the most profound questions in the history of moral philosophy (the Euthyphro Dilemma):
“If external authority cannot define virtue, what intrinsic property makes an action just?”
As Oscar Davis writes: “What Plato’s dialogues show is that learning takes place through the to-and-fro of reflective thought and that much of learning is really unlearning… Crucially, the result of the discussion is to arrive at a question that is now far more refined.”
III. Recognising the Shape of the Gap: Epistemic Transducers
Why can’t an AI simply ask the questions for us?
Here, Davis makes a distinction that every systems architect and AI researcher should tattoo on the inside of their eyelids:
“The question is where learning begins. To want to know something, you must already have some grip on what it is that you don’t know. You have to recognise the shape of the gap in your knowledge… The question that matters, philosophically, is the one that exposes a gap in the knowledge of the one who is asking – and this is precisely what AI cannot do on the asker’s behalf. AI can fill gaps. It cannot locate them for you in any way that counts as learning.”
Read that last sentence again: AI can fill gaps. It cannot locate them for you.
Consider Davis’s example of photosynthesis:
- If a student looks at a green leaf in the sun and wonders, “Wait—I know the plant dies in the dark, so sunlight isn’t just warming it; there is a chemical mechanism converting light into survival that I cannot explain,” that student has located the shape of the gap. Their question has negative space with defined edges. When an explanation arrives, it clicks into a receptive structural socket.
- If a student pastes an assigned prompt into an LLM (“Explain the causes of the French Revolution”), nothing in their mental model was at stake. The AI pours liquid concrete over flat ground where no foundation trench was ever dug.
In Chapter 16 of The Coni Book (The Value of Uncertainty), we drew on Richard Feynman’s 1955 address to the National Academy of Sciences: every concept we hold sits on a graduated scale between falsity and truth, and dogmatic certainty is the enemy of discovery.
In Coni, we can build a single-pass Transducer Pipeline (comp, map, filter, transduce) that audits a stream of knowledge claims—not to generate answers, but to compute the topology of the epistemic gap:
(defn epistemic-gap-score
"Measures the gap between asserted confidence and actual examined foundations."
[node]
(let [conf (:asserted-confidence node)
tested (:counterexamples-tested node)
risk (:personal-stake node)
foundation (min 1.0 (* 0.25 tested))
hollowness (max 0.0 (- conf foundation))]
(assoc node
:foundation-strength foundation
:hollowness-index hollowness
:cost-of-asking (* risk (- 1.0 (min 0.9 foundation)))
:gap-shape (cond
(and (> conf 0.80) (= tested 0)) :dogmatic-illusion
(and (< conf 0.45) (> tested 1)) :fertile-aporia
(< risk 0.20) :zero-cost-oracle-prompt
:else :developing-inquiry))))
;; Composable transducer: scores epistemic topology and isolates actionable gaps in one pass
(def locate-gaps-xform
(comp (map epistemic-gap-score)
(filter (fn [node]
(or (= (:gap-shape node) :dogmatic-illusion)
(= (:gap-shape node) :fertile-aporia))))))
Let’s run three knowledge states through transduce with zero intermediate heap allocations:
- The Photosynthesis Inquiry: Low asserted confidence (
0.35), two counterexamples already wrestled with, high personal curiosity (0.90). - The Copy-Pasted Homework Prompt: High asserted confidence from an LLM (
0.92), zero counterexamples tested (0), near-zero personal stake (0.05). - The Unexamined Architecture Dogma: An engineer claiming “Two-phase commit never blocks during partitions” with
0.96confidence and0failure modes tested.
(let [knowledge-claims [{:topic "Photosynthesis"
:claim "Plants need sunlight to survive, but I don't yet know the chemical mechanism."
:asserted-confidence 0.35
:counterexamples-tested 2
:personal-stake 0.90}
{:topic "French Revolution"
:claim "Asked AI to explain causes for homework; pasted 5 bullet points."
:asserted-confidence 0.92
:counterexamples-tested 0
:personal-stake 0.05}
{:topic "Distributed Consensus"
:claim "Two-phase commit guarantees zero blocking even during network partitions."
:asserted-confidence 0.96
:counterexamples-tested 0
:personal-stake 0.85}]
audited (transduce locate-gaps-xform conj [] knowledge-claims)]
(doseq [node audited]
(println (str " [" (:topic node) "] Shape: " (:gap-shape node)
" | Hollowness: " (:hollowness-index node)
" | Cost of Asking: " (:cost-of-asking node)))))
Output:
=== 2. LOCATING THE SHAPE OF THE GAP (TRANSDUCER AUDIT) ===
[Photosynthesis] Shape: :fertile-aporia | Hollowness: 0 | Cost of Asking: 0.45
[French Revolution] Shape: :dogmatic-illusion | Hollowness: 0.92 | Cost of Asking: 0.05
[Distributed Consensus] Shape: :dogmatic-illusion | Hollowness: 0.96 | Cost of Asking: 0.85
Look at the telemetry difference between those three states:
| Knowledge Node | Asserted Confidence | Hollowness Index | Cost of Asking (Epistemic Stake) | Diagnosed Topology | Required Intervention |
|---|---|---|---|---|---|
| Photosynthesis | 0.35 (Humble) |
0.00 |
0.45 (Genuine Risk) |
:fertile-aporia |
Ready for Synthesis: The shape of the gap is known. |
| French Revolution | 0.92 (Borrowed AI) |
0.92 |
0.05 (Zero Stake) |
:dogmatic-illusion |
Withhold Oracle: Force student to locate a contradiction first. |
| Distributed Consensus | 0.96 (Hubris) |
0.96 |
0.85 (High Production Risk) |
:dogmatic-illusion |
Inject Elenchus: Simulate a network partition counterexample. |
IV. Testing in an Age of AI: Grading the Aporetic Trajectory
This brings us to the central practical question of Oscar Davis’s article: Could the Socratic method be used to test students in an age of AI?
For centuries, universities tested learning by grading descriptive output: the final 2,000-word essay, the take-home problem set, the static summary. Today, descriptive output has a marginal production cost of $0.00 and 200 milliseconds. Grading a take-home essay in 2026 to see if a student understands history is like timing someone on a highway to see how fast they can sprint, without checking if they are driving a motorcycle.
Davis proposes flipping assessment on its head:
“To develop and assess a student’s learning today, we could find ways for students to identify and then evaluate the gaps in their own knowledge. This means, as some universities have started to do, encouraging and assessing dialogue in the classroom and utilising reflective, as opposed to purely descriptive, assessments. From here, the teacher’s task is to encourage the student to pose new meaningful questions, which are interconnected with the student’s own learning journey.”
Notice how deeply this resonates with Chapter 09 of The Coni Book (Carol Dweck’s Growth Mindset): fixed-mindset assessments reward the polished performance of error-free answers (which encourages cheating and AI outsourcing), whereas growth-mindset assessments reward the trajectory of struggle, unlearning, and question refinement.
What if we stopped grading the static answer and instead graded the Aporetic Trajectory?
In Coni, we can formalize a Socratic Assessment Rubric (evaluate-learning-trajectory) that evaluates three things an LLM prompt cannot fake on a student’s behalf during live dialogical examination:
- Unlearning (
:contradictions-discovered): How many of their own initial assumptions did the student test and falsify? - Question Refinement Delta (
:q-delta): How much sharper, more structural, and more meaning-bearing is the student’s final question compared to their initial question? - Dialogical Endurance (
:dialogue-turns): Did they stay in the room with Socrates when aporia hit, or did they storm off like Euthyphro (or outsource the turn to a one-shot oracle)?
(defn evaluate-learning-trajectory [submission]
(let [turns (:dialogue-turns submission)
unlearning (:contradictions-discovered submission)
initial-q-depth (:initial-question-depth submission)
final-q-depth (:final-question-depth submission)
ai-outsourced? (and (= turns 1) (= unlearning 0))
q-delta (- final-q-depth initial-q-depth)
socratic-score (if ai-outsourced?
0.12
(min 1.0 (+ (* 0.35 (min 1.0 (/ unlearning 3.0)))
(* 0.45 q-delta)
(* 0.20 (min 1.0 (/ turns 4.0))))))]
{:student (:student submission)
:mode (:mode submission)
:q-refinement q-delta
:socratic-score socratic-score
:verdict (cond
ai-outsourced? :foreclosed-by-oracle
(>= socratic-score 0.75) :authentic-aporia-mastery
:else :surface-familiarity)}))
Running this evaluator across two student trajectories in Coni:
=== 3. SOCRATIC TRAJECTORY ASSESSMENT ===
[Student-A (One-Shot AI Prompt)]
Verdict: :foreclosed-by-oracle | Socratic Score: 0.12 | Question Refinement Delta: +0.00
[Student-B (Socratic Elenchus Dialogue)]
Verdict: :authentic-aporia-mastery | Socratic Score: 0.85 | Question Refinement Delta: +0.67
V. Coda: Protecting the Conditions of Not Knowing
Near the end of his essay, Oscar Davis writes a paragraph that belongs in the preface of every philosophy syllabus and every systems architecture manual written in this century:
“We now have a tool that seems to know almost everything. The task for tertiary education is not to compete with AI at answering. It is to protect the conditions under which students still recognise what they do not know. That recognition cannot be outsourced. It is where genuine learning begins.”
Whether we are teaching university students to read Plato’s Euthyphro, designing confidence-gated local AI cascades on Apple Silicon, or writing concurrent Lisp pipelines in Coni, the lesson is identical:
Wisdom is not the speed at which you emit tokens to close a question.
Wisdom is the courage to sit on the courthouse steps in Athens, watch your unexamined certainties crumble under gentle, relentless questioning, and stay in the sacred space of aporia long enough for a truer question to be born.