serial questioning + maximal formatting (owner ruling, 2026-09-26)

The prober was planning perfect 7-question batches instead of probing. Three
surfaces now say the same thing — one question, adapt, next question:

- prober/10 rewritten to ~2.6k (from 5.6k): serial discipline leads (ask,
  wait, choose the next question from the answer); 'How your questions
  arrive' deleted (owner: does nothing); 'You cannot get there by thinking'
  deleted (owner: didn't reduce thinking); 'never plan a batch' and the
  first-message-length line dropped per owner — no overcorrection, no
  strong-instruction inflation. Binary search compressed to four moves.
- tool descriptions: the async-era fossil 'Ask exactly one question per
  tool call; after calling, end your turn and wait' — which permitted
  multi-call batches — swapped for 'ONE question per turn: ... his answer
  determines the next' in all four places (prober quiz + ask descriptions,
  teacher quiz description, both zod question-field describes).
- shared/40-formatting: markdown/LaTeX coverage now explicitly names quiz
  questions, options, and explanations ('in prose and in quiz questions
  alike') — the prober wasn't using LaTeX in questions.

Prober composed prompt ~13.2k -> ~10.0k chars. Pins preserved verbatim
('measurement should be efficient', 'the read tool can inspect it directly').
Gates: typecheck 0, 986/986, lint clean, build green.
This commit is contained in:
amosblomqvist
2026-09-25 20:51:45 +03:00
parent ac1c1a2818
commit e89d4c2e23
4 changed files with 24 additions and 32 deletions
+5 -4
View File
@@ -46,7 +46,8 @@ export const askUserQuestionTool: LhTool<any, any> = {
description:
"Ask the learner a single question and pause until they answer. NOT graded — there is no correct answer. " +
"Use when requirements are ambiguous, preferences are needed, a decision would materially affect the lesson, " +
"or you need an open-ended response. Ask exactly one question per tool call; after calling, end your turn and wait.",
"or you need an open-ended response. ONE question per turn: call a single ask_user_question, then end your " +
"turn — his answer determines the next.",
schema: askInputSchema,
};
@@ -64,8 +65,8 @@ export const probeQuizTool: LhTool<any, any> = {
"Options-only: single-select or multi-select, plus an automatic 'I don't know' choice so the learner can " +
"signal a genuine gap instead of guessing. An always-present optional note field lets the learner attach a " +
"free-text note to ANY answer; it reaches you only when non-empty. No free-text answers — for non-graded " +
"questions use ask_user_question instead. Ask exactly one question per tool call; after calling, end your " +
"turn and wait for the graded result.",
"questions use ask_user_question instead. ONE question per turn: call a single quiz, then end your turn — " +
"his answer determines the next question to ask.",
schema: probeQuizInputSchema,
};
@@ -185,7 +186,7 @@ export function teachQuizToolFor(ctx: Pick<PlanToolContext, "chatId" | "chatStor
"plus an automatic 'I don't know' choice so the learner can signal a genuine gap instead of guessing. " +
"An always-present optional note field lets the learner attach a free-text note to ANY answer; it reaches you " +
"only when non-empty. No free-text answers — for non-graded questions use ask_user_question instead. " +
"Ask exactly one question per tool call; after calling, end your turn and wait for the graded result.",
"ONE question per turn: call a single quiz, then end your turn — his answer determines the next.",
schema: inputSchema,
});
}