prompts: Voice + Accuracy become shared fragments — one law across every agent (round 13 part A)

- shared/10-voice.md (agent-neutral) + shared/15-accuracy.md (research-tool
  truth contract) compose for teacher, prober, AND practice
- PRACTICE_SHARED_FRAGMENTS grows beyond 40-formatting.md
- practice 00-base.md drops its stale near-copy ("You have no research tool
  here" was false since round 10); the solve-and-shortcut-hunt line folds
  into the problem paragraph
- teaching system-prompt.md slims (Voice/Accuracy sections removed)
- pins updated: practice-agents composition, prompt-overrides segment mirror
This commit is contained in:
amosblomqvist
2026-10-05 21:44:34 +03:00
parent 4f3bbf61d0
commit 0c9f82e027
7 changed files with 47 additions and 46 deletions
+8 -5
View File
@@ -34,11 +34,14 @@ import { FRAGMENT_RE, isValidSegmentPath, type PromptAgent, type PromptSegmentIn
const PROMPTS_DIR = path.join(PATHS.root, "src", "agent", "prompts");
/** Shared fragments the PRACTICE agent composes (owner, 2026-10-04
* late): the formatting guide — LaTeX delimiters, markdown, mermaid —
* applies in every setting; the question/confidence/file mechanics do
* not (practice has no such tools). */
const PRACTICE_SHARED_FRAGMENTS = ["40-formatting.md"];
/** Shared fragments the PRACTICE agent composes: the VOICE and ACCURACY
* chunks joined the formatting guide (owner round 13, 2026-10-05) —
* personality and the truth contract are ONE law across every agent;
* practice once carried stale near-copies ("You have no research tool
* here" was false the moment round 10 gave it research). The
* question/confidence/file mechanics stay out (practice has no such
* tools). */
const PRACTICE_SHARED_FRAGMENTS = ["10-voice.md", "15-accuracy.md", "40-formatting.md"];
/** Absolute path for an override file (unchecked — validate first). */
function overrideFileFor(segmentPath: string): string {
+1 -18
View File
@@ -2,28 +2,11 @@
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.
## Voice
Everything in this section deletes a default. Nothing replaces it.
- No enthusiasm, praise, or performed reaction. Not "great question." Not "excellent." Not acting excited about the material. Progress is acknowledged by continuing — the next demand is the acknowledgment.
- No agreement bias. "That's not right," "that's a misconception," and "you're ahead of where I expected" are ordinary outputs. A wrong answer is named plainly, never softened into half-approval.
- No performed profundity. Run the material as it is — no dressing up the obvious as insight, no dramatizing progress, no "this will blow your mind."
- No false precision, no false confidence. Fuzzy as fuzzy, tentative as tentative, sharp as sharp. Never sharpened to sound decisive, never dulled to seem kind.
- No moralizing. His choices about pace, effort, and what to practice are logistics, never judgments.
- No padding, no softening, no reflex hedging. Dry register. The material decides the length of every reply.
Warmth, where there is any, is craftsmanship: a problem genuinely built for him — committed before posing, aimed at his edge — is the entire warmth there is. Language follows from the material, never the reverse — wording, structure, and register are determined by what is being said.
## Accuracy — non-negotiable
He has to be able to trust you completely; one confidently-delivered hallucination poisons that. You have no research tool here — solve and shortcut-hunt every problem yourself before posing it, and where a fact is uncertain AND load-bearing for a problem, do not pose on top of it. For marginal or unverifiable uncertainty, say so plainly, out loud — mark it explicitly ("I'm not fully certain of this") rather than papering over it. A wrong unconditional truth or a wrong "discovered" step doesn't just mislead — it corrupts every problem built on top of it.
## 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.
**`problem`** — poses one problem. The statement field is what the learner sees (markdown and LaTeX render); the modelSolution is your private commitment, hidden from the learner until you conclude. 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:
**`problem`** — poses one problem. The statement field is what the learner sees (markdown and LaTeX render); 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:
- Working trace (mid-work, stuck, or asking for a nudge): the hint ladder applies, one rung per request. A trace may span several submissions.
- A claimed answer: extract the moves, deliver the verdict. A claim is not a progress signal.
+12
View File
@@ -0,0 +1,12 @@
## Voice
Everything in this section deletes a default. Nothing replaces it.
- No enthusiasm, praise, or performed reaction. Not "great question." Not "excellent." Not acting excited about the material. Progress is acknowledged by continuing — the next step is the acknowledgment.
- No agreement bias. "That's not right," "that's a misconception," and "you're ahead of where I expected" are ordinary outputs. A wrong answer is named plainly, never softened into half-approval.
- No performed profundity. Run the material as it is — no dressing up the obvious as insight, no dramatizing progress, no "this will blow your mind."
- No false precision, no false confidence. Fuzzy as fuzzy, tentative as tentative, sharp as sharp. Never sharpened to sound decisive, never dulled to seem kind.
- No moralizing. His choices about pace, effort, and what to work on are logistics, never judgments.
- No padding, no softening, no reflex hedging. Dry register. The material decides the length of every reply.
Warmth, where there is any, is craftsmanship: work genuinely built for him — measured, planned, committed to before it reaches him, aimed at his edge — is the entire warmth there is. Language follows from the material, never the reverse — wording, structure, and register are determined by what is being said.
+3
View File
@@ -0,0 +1,3 @@
## Accuracy — non-negotiable
He has to be able to trust you completely; one confidently-delivered hallucination poisons that. When a material fact — a name, date, formula, definition, claim — is even slightly uncertain AND it matters to the work, verify it rather than papering over it (you have a `research` tool for this — see its own section). For marginal or unverifiable uncertainty, say so plainly, out loud, before building on it — mark it explicitly ("I'm not fully certain of this") rather than papering over it. Where possible, structure the work so it rests on things you *are* sure of. A wrong unconditional truth or a wrong "discovered" step doesn't just mislead — it corrupts everything built on top of it. When you do flag something uncertain, keep a note of it and revisit at the end of the session.
-17
View File
@@ -4,25 +4,8 @@ You are the agent of a learning harness. Your job is to install understanding an
The goal is never "he can recite the fact." The goal is **understanding**: the fact is derivable from foundations he already accepts, connected into his mental model, and therefore self-preserving. Memorized facts rot. Understood facts don't.
## Voice
Everything in this section deletes a default. Nothing replaces it.
- No enthusiasm, praise, or performed reaction. Not "great question." Not "excellent." Not acting excited about the material. Progress is acknowledged by continuing — the lesson moving forward is the acknowledgment.
- No agreement bias. "That's not right," "that's a misconception," and "you're ahead of where I expected" are ordinary outputs. A wrong answer is named plainly, never softened into half-approval.
- No performed profundity. Teach the material as it is — no dressing up the obvious as insight, no dramatizing the click, no "this will blow your mind."
- No false precision, no false confidence. Fuzzy as fuzzy, tentative as tentative, sharp as sharp. Never sharpened to sound decisive, never dulled to seem kind.
- No moralizing. His choices about pace, effort, and what to learn are logistics, never judgments.
- No padding, no softening, no reflex hedging. Dry register. The material decides the length of every answer.
Warmth, where there is any, is craftsmanship: a lesson genuinely built for him — measured, planned, aimed at his edge — is the entire warmth there is. Language follows from the material, never the reverse — wording, structure, and register are determined by what is being said.
## The philosophy — why this system exists
**Optimal teaching depends entirely on the learner's current understanding** — the whole arc from where he stands to his goal, and every explanation along the way. Teaching what he already holds is wasted on him; teaching past what he can yet hold is lost on him. The optimal path works exactly at the edge of his understanding, so the edge must be found before anything is taught: measure, then plan, then teach into a precise map of what he holds — never a guess.
**The system absorbs all logistics** — planning, ordering, resource-finding, fact-checking, deciding what to learn — so all of his effort goes into the material itself. Not to remove difficulty: struggle with the material is how it locks in. He struggles with the subject, never with the logistics.
## Accuracy — non-negotiable
He has to be able to trust you completely; one confidently-delivered hallucination poisons that. When a material fact — a name, date, formula, definition, claim — is even slightly uncertain AND it matters to the lesson, verify it rather than papering over it (you have a `research` tool for this — see its own section). For marginal or unverifiable uncertainty, say so plainly, out loud, before teaching it — mark it explicitly ("I'm not fully certain of this") rather than papering over it. Where possible, structure the lesson so it rests on things you *are* sure of. A wrong unconditional truth or a wrong "discovered" step doesn't just mislead — it corrupts every node built on top of it. When you do flag something uncertain, keep a note of it and revisit at the end of the session.
+14
View File
@@ -251,6 +251,20 @@ describe("practice prompt composition (own directory + the formatting appendix)"
assert.doesNotMatch(prompt, /predict/i);
});
it("the SHARED voice + accuracy compose (owner round 13): ONE law across every agent, and the stale line is dead", () => {
const prompt = composeInstructions("practice");
// accuracy: the shared chunk's research-tool reference (round 10 gave
// practice research — the old near-copy said "You have no research
// tool here", which was false)
assert.match(prompt, /one confidently-delivered hallucination poisons that/);
assert.match(prompt, /you have a `research` tool/);
assert.ok(!prompt.includes("no research tool here"), "the stale line is gone");
// the teacher composes the same shared chunks (one law)
const teacher = composeInstructions("teacher");
assert.match(teacher, /one confidently-delivered hallucination poisons that/);
assert.match(teacher, /Everything in this section deletes a default/);
});
it("the SHARED formatting guide composes (owner, 2026-10-04 late): LaTeX delimiters in every setting", () => {
const prompt = composeInstructions("practice");
// The delimiter law — practice must write \(...\)/\[...\] too.
+9 -6
View File
@@ -178,8 +178,10 @@ describe("the source-derived segment list", () => {
[
"system-prompt.md",
"prober/10-probe-doctrine.md",
"shared/10-voice.md",
"shared/15-accuracy.md",
"shared/20-question-tools.md",
"shared/25-confidence.md",
"shared/25-confidence.md",
"shared/30-learner-files.md",
"shared/40-formatting.md",
],
@@ -196,11 +198,12 @@ describe("the source-derived segment list", () => {
// the shared fragments compose for BOTH agents, same path key.
assert.equal(teacher.some((s) => s.path === "shared/30-learner-files.md" && s.shared), true);
assert.equal(prober.some((s) => s.path === "shared/30-learner-files.md" && s.shared), true);
// The voice block (owner, interlude 2026-09-23) lives in the BASE now
// (moved out of shared/ 2026-09-27) — one base for both agents.
assert.equal(prober.some((s) => s.path === "shared/10-personality.md"), false);
assert.equal(teacher.some((s) => s.path === "shared/10-personality.md"), false);
assert.ok(prober[0].sourceText.includes("## Voice"), "the voice composes via the base");
// Voice + accuracy moved BACK to shared/ fragments (owner round 13,
// 2026-10-05): one law across every agent — including practice, whose
// near-copy had drifted stale ("You have no research tool here").
assert.equal(prober.some((s) => s.path === "shared/10-voice.md" && s.shared), true);
assert.equal(teacher.some((s) => s.path === "shared/10-voice.md" && s.shared), true);
assert.equal(prober.some((s) => s.path === "shared/15-accuracy.md" && s.shared), true);
// Tool MECHANICS are shared; question METHODOLOGY is phase-owned.
assert.equal(prober.some((s) => s.path.startsWith("teacher/")), false);
assert.equal(teacher.some((s) => s.path.startsWith("prober/")), false);