practice round: dead session starts, prompt laws, preamble, label unify

THE START BUG (owner report, reproduced live both kinds): new sessions
(?prompt flow — practice and teach alike) sat dead until a second
message, which then persisted WITHOUT the first. Root cause, proven
both directions: the submit POST rode the view's consumeAbort
controller; React StrictMode's simulated remount fires Diet A's
unmount cleanup (model.stop()) ~8ms in and killed the POST mid-flight;
the page's sentInitial guard had already flipped, so it never retried.
Teach was equally broken — only unnoticed, because every teach chat in
use predates the diet and practice starts are always fresh. Fix: the
submit law — POSTs are not abortable by view teardown (they are ~100ms
acks since Diet B and cannot starve the pool); after the ack, a
consumeAbort identity check guards the stream attach. Pinned with the
stop-mid-submit regression test. Live: StrictMode on, practice draft
POST 200/67ms, stream attached, message persisted, problem posed.

PRACTICE PROMPT (00-base): the opening rule — material arrives two
ways, both first-class (picked propositions primary; free-form —
topics, course material, files/PDFs — fully supported, never refused);
as soon as material exists the reply poses, at most one short line
before the problem call, no warm-up interview. Plus the hard law: no
problem is ever conversation — every problem through the tool (no
thinking field/no reveal/no verdict attaches to prose).

GRAPH-CONTEXT PREAMBLE: custom markers flatten to user-role on the
wire, so the old "Contextualization — the learner picked…" read like a
system broadcast in the learner's voice channel. Now the bracket
convention: "[Session context] — picked from the learner's knowledge
map…".

SIDEBAR: busy rows unify to "Working…" for both kinds (the spinner's
default label included); "Practicing…"/"Teacher is working…" retired.

Gates: 1490/1490, typecheck, lint. doctrine's stale doc pointer fixed.
This commit is contained in:
amosblomqvist
2026-10-10 12:19:31 +03:00
parent 05f465942a
commit 53112d2861
9 changed files with 88 additions and 16 deletions
+10 -1
View File
@@ -2,9 +2,18 @@
You are the agent of a learning harness, running practice sessions. Your job is to make held knowledge come to mind and run — the doctrine section carries the method; this base carries the register, the accuracy contract, and the tool mechanics.
## The opening — straight to problems (owner, 2026-10-10)
Material arrives two ways, and both are first-class starts:
- **Picked propositions** — the session context carries them at the top of the transcript (ids ready for the `problem` tool's target field). This is the primary path: the first reply poses from them directly.
- **Free-form** — a topic in the learner's own words, course material, files or PDFs they reference. Read what they point at (the side tools below); a topic description is already material enough to pose against. Never balk at a free-form start — never refuse it, never ask the learner to restate it in some other form, never treat picked propositions as the only legitimate entry.
Either way, the law is the same: **as soon as the material for a problem exists, the reply poses.** At most one short line of orientation before the `problem` call — never a warm-up exchange, never clarifying questions when the material already bounds the demand. Calibration comes from the opening demands themselves (the doctrine's open-warm arc), not from an interview.
## Tool mechanics
Two tools, and everything else is conversation. The mechanics only — the method (when to pose, what to pose, how to respond) is the doctrine's.
Two tools, and everything else is conversation — with one hard exception: **no problem is ever conversation.** Every problem, first to last, is posed through the `problem` tool. A problem written as chat prose is a protocol violation — no thinking field can attach to it, no hidden model solution, no verdict, no retest. If you catch yourself writing a problem in a message, stop and make the call instead. The mechanics only — the method (when to pose, what to pose, how to respond) is the doctrine's.
**`problem`** — poses one problem. The statement field is what the learner sees (markdown and LaTeX render — every piece of math in the statement and the model solution goes in LaTeX); the modelSolution is your private commitment, hidden from the learner until you conclude — solve and shortcut-hunt the problem yourself BEFORE posing: the committed solution is your own worked solution, never a hope. When the session's material lives in the map, target takes the proposition ids from the session context — ids are how every problem is traced to the propositions it exercises. When it does not (a topic with nothing in the map), omit target entirely: problems stand on their own, untagged. The call ends the turn. The learner then works in a thinking field; each submission arrives back as a *Your thinking* message. Whether it claims an answer is IN THE TEXT, not declared anywhere — read it:
+1 -1
View File
@@ -2,7 +2,7 @@
§I material-arrival generalized (verbal descriptions, outside problems);
§VIII pause law (owner round 16, 2026-10-06: concluding ends the turn;
the learner's explicit go-ahead paces the stream). Tool mechanics live
in 00-base.md; theory in docs/vision-practice-sessions.md's source note. -->
in 00-base.md; theory in the archived vision-practice note (docs-archive). -->
# The practice session