feat(tools): the P2 toggle bridge — toolToggles first-class, definitive vocabulary

Reconciliation of the diverged tool-toggles seam (2026-09-19, master's
P2): Platform injected the resolved delta as an ad-hoc intersection on
AgentBuildOptions while the factories' enabled? param sat unread — the
seam was inert on both sides.

- teacher-agent: AgentBuildOptions gains toolToggles?: EnabledTools;
  both constructors thread it to the factories (createTeacherTools /
  createProberTools). An explicitly injected opts.tools registry is
  never filtered — the caller owns it.
- Vocabulary ADJUDICATED with the user (2026-09-19): TOGGLEABLE_TOOLS is
  the definitive list — the job tools only (research/demo/visual/pdf).
  quiz/ask_user_question stay always-on forever (the prober's flow is
  graded-quiz brackets -> probe_done; quiz-off collapses assessment and
  teaching doctrine is built on graded verification — the wedge danger);
  the learner-fs set, plan tools, and probe_done also always-on.
- settings-body (write side): unknown tool keys reject with 400 + the
  supported list, mirroring the prompt-switch validation; the read-side
  sanitizer stays lenient for forward-compat.
- chat-handler: the intersection is gone (field now first-class) and the
  seam comment states the adjudicated vocabulary.

Gates: typecheck, 28 new/updated tests green (tool-toggles-bridge,
question-tools, settings-body), chat-flow + settings suites green.
This commit is contained in:
amosblomqvist
2026-09-19 18:16:17 +03:00
parent cb4fe25c89
commit 6c42393e42
6 changed files with 132 additions and 24 deletions
+6 -4
View File
@@ -155,10 +155,12 @@ describe("the prober's quiz: no nodeId field at all", () => {
describe("tool toggles (core/pending.ts + factories)", () => {
it("TOGGLEABLE_TOOLS: the sub-agent dispatch tools; quiz/ask/read stay off the list", () => {
// The user-toggleable vocabulary Platform's settings validates against.
// quiz/ask_user_question/read are always-on FOR NOW (user-decided
// 2026-09-15, sources v0); they join when settings exposes them — the
// factory seam is generic.
// THE DEFINITIVE vocabulary (adjudicated with the user 2026-09-19, P2
// reconciliation): the job tools only. quiz/ask_user_question are
// permanently always-on (the prober's assessment + teaching doctrine
// are built on graded questions — the wedge danger), as are the
// learner-fs set, plan tools, and probe_done. The settings WRITE side
// validates against this list (settings-body).
assert.deepEqual(TOGGLEABLE_TOOLS, ["research", "demo", "visual", "pdf"]);
});