practice: slim the tool schemas — the modelSolution IS the reveal

Owner round (2026-10-05): the problem pose only really needs statement,
mode, target, modelSolution; conclude needs no reveal field.

- problemInputObject drops decisionPoints, expectedWrongMoves, strategy,
  rationale. Halves the pose payload (the GLM incident's failing args
  were 3.3KB — a direct weak-model hardening).
- concludeInputObject drops solutionReveal: the reveal is the
  modelSolution committed at pose time, shown verbatim at conclude.
- Doctrine pass (00-base mechanics, 10-doctrine V.4/V.5): the commitment
  is the solution alone; the reveal instruction points at it.

Fixtures slimmed to the new shapes (flow, agents, heal). ConcludeCard's
render of legacy solutionReveal input stays until the card redesign
lands (Slice C).
This commit is contained in:
amosblomqvist
2026-10-05 02:22:04 +03:00
parent e8fe5da6b1
commit 09480979c4
6 changed files with 11 additions and 45 deletions
+3 -9
View File
@@ -38,25 +38,19 @@ import type { ToolResultMessage } from "@earendil-works/pi-ai";
// The BYOK key-presence gate reads env-first (chat-flow.test.ts's idiom).
process.env.OPENROUTER_API_KEY ??= "test-key-presence-gate";
/** A valid problem pose (the full commitment — the schema's every field). */
/** A valid problem pose — the slim schema: statement, mode, target,
* modelSolution (the commitment, which is also the reveal). */
const POSE = {
statement: "Prove that every finite group of prime order is cyclic.",
mode: "recall",
target: ["group-order"],
modelSolution: "Let |G| = p. Any x ≠ e generates a subgroup whose order divides p…",
decisionPoints: ["pick an element and consider ⟨x⟩"],
expectedWrongMoves: [
{ move: "reaching for Sylow", resolution: "Sylow needs p² at least; order p is direct" },
],
strategy: "single-cue recall, minimal parse cost",
rationale: "first problem of the session — baseline the cue",
} as const;
/** A valid conclude (the reveal spend). */
/** A valid conclude — no reveal field; the pose's modelSolution is the reveal. */
const CONCLUDE = {
outcome: "solved",
verdict: "The subgroup-order argument is credited in full.",
solutionReveal: "Let |G| = p; ⟨x⟩'s order divides p and exceeds 1, so it is p — G = ⟨x⟩.",
rung: null,
missClass: null,
retest: false,