From d680008f25283de2bde8b68b1a30d9973c92dbec Mon Sep 17 00:00:00 2001 From: amosblomqvist Date: Sun, 27 Sep 2026 00:39:39 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20teach=20divider=20prepended,=20not=20a?= =?UTF-8?q?=20replacement=20branch=20=E2=80=94=20first=20lesson=20block=20?= =?UTF-8?q?renders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The inferred teach seam sat as a ternary branch in the messages.map chain (alongside the no-bubble marker branches), so the ENTIRE first teaching group — thinking, prose, the tagged quiz call — rendered AS the divider and vanished below it (the Lacan session, 2026-09-27). The marker branches replace contentless scaffolding; the teach group is a real message. The divider now prepends inside the group's Fragment. Also tightens 10-planning.md: the presenting turn asks NOTHING — no quiz, no ask_user_question, no 'shall we begin?' (the teacher was substituting a confirmation question for the dead verdict buttons). --- components/chat.tsx | 26 ++++++++++++++---------- src/agent/prompts/teacher/10-planning.md | 5 ++++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/components/chat.tsx b/components/chat.tsx index ad6e405..826e3e8 100644 --- a/components/chat.tsx +++ b/components/chat.tsx @@ -1047,18 +1047,22 @@ export function Chat({ // assistant group — is gone). Never a user bubble: the wake is // scaffolding; the model-facing instruction lives in the adapter. - ) : m.role === "assistant" && mi > 0 && phases[mi] === "teach" && phases[mi - 1] !== "teach" ? ( - // THE INFERRED TEACH SEAM (owner ruling 2026-09-26, the verdict - // death): teaching begins where the FIRST nodeId-tagged quiz is - // posed — the fold (phaseTimeline, the same derivation the phase - // chip reads) flips to teach exactly AT this assistant group, so - // the divider renders before the whole block (thinking -> prose -> - // the quiz call) — where the explicit accept marker used to sit. - // The boundary check (this index flips, the previous didn't) - // guarantees exactly ONE divider per session. - - ) : ( + ) : ( + {/* THE INFERRED TEACH SEAM (owner ruling 2026-09-26, the verdict + death): teaching begins where the FIRST nodeId-tagged quiz is + posed — the fold (phaseTimeline, the same derivation the phase chip + reads) flips to teach exactly AT this assistant group, so the divider + renders BEFORE the whole block (thinking -> prose -> the quiz call) — + where the explicit accept marker used to sit. The boundary check + (this index flips, the previous didn't) guarantees exactly ONE divider + per session. PREPENDED, never a replacement branch: the teach group is + a real message with content (the marker branches above have none) — a + replacement ternary swallowed the entire first lesson block (the + Lacan session, 2026-09-27). */} + {m.role === "assistant" && mi > 0 && phases[mi] === "teach" && phases[mi - 1] !== "teach" ? ( + + ) : null} {m.role === "user" ? ( diff --git a/src/agent/prompts/teacher/10-planning.md b/src/agent/prompts/teacher/10-planning.md index 8cfc495..fdb517c 100644 --- a/src/agent/prompts/teacher/10-planning.md +++ b/src/agent/prompts/teacher/10-planning.md @@ -50,7 +50,10 @@ Two parts: **Stress-test the roots before presenting.** For every node you're treating as foundational, ask: is this genuinely an unconditional truth *for him*, or a disguised theorem that itself derives from something simpler he'd accept at face value? If it derives, push it down and extend the map — never found the lesson on a mid-level fact. A wrong root corrupts everything hung off it, and roots are far easier to audit in a drawn map than mid-flow. -**Presenting ENDS your turn.** The plan is presented in prose and map, and then you stop — his next message is the natural next move. Do not ask a check or teach in the same turn as presenting. +**Presenting ENDS your turn.** The plan is presented in prose and map, and +then you stop. The presenting turn asks NOTHING — no quiz, no +`ask_user_question`, no "shall we begin?": there is nothing to confirm. His +next message is his own unprompted reply and the natural next move. - If his reply asks for changes, revise: fix the map (`plan_init` again — a wholesale rewrite), present again, and end your turn once more. - Otherwise his reply moves the lesson forward — begin the first node.