practice: the between-problems pause — conclude ends the turn, the learner's go-ahead paces the stream (round 16)
Owner ruling (2026-10-06): every concluded problem opens a pause. The
agent may speak its closing words about the learner's last thinking
after the conclude result, then ENDS ITS TURN — a system-prompt law
deliberately, per owner correction, NOT tool-level terminate. The next
problem is never posed until the learner explicitly moves on; the pause
is the session's teaching space (repairs, clarifications, follow-ups —
still surgical, never re-teaching).
The move-on signal is a first-class input: { type: "next" } appends a
practice-next marker (content = single-sourced NEXT_PROBLEM_TEXT — the
model's unambiguous go-ahead: pose per the selection rules or wrap if
the arc is complete). Honest 400s: practice sessions only, nothing
active (mid-problem input rides the dock), riding after any pending
dismissal synthesis exactly like text.
The fast path (owner approved: composer-band chip + Enter-on-empty):
- Composer.enterAction gains "next" — Enter on an EMPTY composer in
the pause fires the signal; typing anything makes Enter a send again;
busy (steer/stop) outranks the pause.
- The Next chip hovers at the composer band's top-right (pick-pill
chrome register) whenever the pause is live and a problem has ever
been posed; the placeholder becomes the hint ("Ask about this
problem — or press Enter for the next one…", exact);
- the transcript renders the signal as a compact centered NEXT PROBLEM
line (mono-caps chrome); session-core appends it optimistically.
CONCLUDE_ACK_TEXT rewritten to carry the law; doctrine §VIII gains the
pause law (owner-sanctioned edit #3); 00-base's conclude/dismissal
bullets rewritten + the between-problems section added.
This commit is contained in:
@@ -39,6 +39,7 @@ import { QUESTION_TOOLS } from "./pending.ts";
|
||||
import {
|
||||
CONCLUDE_ACK_TEXT,
|
||||
HANDOFF_TEXT,
|
||||
NEXT_PROBLEM_TEXT,
|
||||
THINKING_LABEL,
|
||||
} from "./contracts/chat.ts";
|
||||
import { compactAnswerForModel, type QuestionAnswerData } from "./question-core.ts";
|
||||
@@ -71,6 +72,7 @@ export interface LhMarkerMessage {
|
||||
| "subagent-abort"
|
||||
| "plan-block"
|
||||
| "practice-thinking"
|
||||
| "practice-next"
|
||||
| "problem-dismissed"
|
||||
| "compaction";
|
||||
/** The model-facing text ("" for plan blocks — UI-only). */
|
||||
@@ -248,6 +250,24 @@ export function newThinkingMessage(problemCallId: string, text: string): LhMarke
|
||||
};
|
||||
}
|
||||
|
||||
/** The learner's explicit move-on signal (owner round 16): appended by
|
||||
* the next input (the composer band's chip, or Enter on an empty
|
||||
* composer during the between-problems pause). The content is the
|
||||
* single-sourced NEXT_PROBLEM_TEXT — the model's unambiguous go-ahead;
|
||||
* the transcript renders its own compact line off the marker (never
|
||||
* the content). */
|
||||
export function newNextMessage(): LhMarkerMessage {
|
||||
return {
|
||||
id: newMessageId(),
|
||||
role: "custom",
|
||||
customType: "practice-next",
|
||||
content: NEXT_PROBLEM_TEXT,
|
||||
display: true,
|
||||
details: {},
|
||||
timestamp: Date.now(),
|
||||
};
|
||||
}
|
||||
|
||||
/** The problem-dismissal marker (ask-style discard, owner 2026-10-04):
|
||||
* UI-ONLY — toLlmMessages filters it. The model's face arrives later, at
|
||||
* the user's next input, as the synthesized conclude pair
|
||||
|
||||
Reference in New Issue
Block a user