fix: teach divider prepended, not a replacement branch — first lesson block renders

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).
This commit is contained in:
amosblomqvist
2026-09-27 00:48:46 +03:00
parent 145b470752
commit d680008f25
2 changed files with 19 additions and 12 deletions
+15 -11
View File
@@ -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.
<PhaseDivider key={m.id || `m-${mi}`} phase="plan" />
) : 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.
<PhaseDivider key={`teach-${m.id || `m-${mi}`}`} phase="teach" />
) : (
) : (
<Fragment key={m.id || `m-${mi}`}>
{/* 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" ? (
<PhaseDivider key={`teach-${m.id || `m-${mi}`}`} phase="teach" />
) : null}
<Message from={m.role} className={m.role === "assistant" ? "max-w-full" : undefined}>
<MessageContent className={m.role === "assistant" ? "w-full" : undefined}>
{m.role === "user" ? (
+4 -1
View File
@@ -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.