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" ? (