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
+2 -2
View File
@@ -114,7 +114,7 @@ export function quizInputProblems(input: {
// per-session tree validation chains on top in tools.ts). Grading rules
// are identical, single-sourced here.
export const quizInputBase = z.object({
question: z.string().describe("The single quiz question to ask. Ask exactly one question per tool call."),
question: z.string().describe("The single quiz question to ask. ONE question per turn: ask, then end your turn — the answer determines the next question."),
options: z
.array(optionSchema)
.min(2)
@@ -197,7 +197,7 @@ export const askInputSchema = z
// No `mode` param — the pi original has none: the mode is inferred from
// whether options are present (the dock does exactly this). One less
// knob for the model to misuse.
question: z.string().describe("The single question to ask the learner. Ask exactly one question per tool call."),
question: z.string().describe("The single question to ask the learner. ONE question per turn: ask, then end your turn — the answer determines the next question."),
details: z.string().optional().describe("Optional extra context or instructions shown under the question."),
options: z
.array(optionSchema)