Learn Shell
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Learn Shellstart a new lesson on Python variables"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Learn Shell
Your AI is becoming the one who knows you best. Learn Shell gives it a classroom that remembers — an agent-native teaching OS that turns your AI's teaching intent into things a learner can actually study, practice against, and get graded on.
Codename: learn-shell · Status: working system, actively dogfooded since 2026-07-02. Not authenticated. AGPL-3.0 licensed (v0.x was MIT; relicensed 2026-08-16, see note below); v1 is a single-machine, no-auth trust model.
Setting this up from a code snapshot? Follow SETUP.md — from-zero bring-up (Docker Postgres → migrate → seed → run → connect your own AI over MCP), every command verified against this repo's real config. Once it's running, the product tutorial (Chinese-first: cold-start pitfalls, the recommended lesson path, the agent's onboarding letter) is docs/TUTORIAL.md.
What this is
If you already have an AI you talk to daily — a work assistant, a long-running companion — it is quietly becoming the person who knows you best: it has read your every answer and seen your every hesitation. What it's missing is not knowledge of you. It's a floor. A chat window has no floor: the evidence of teaching evaporates with the context window, every new session your teacher wakes up a stranger, and you introduce yourself, again, to the one who knows you best.
Learn Shell is the floor. It doesn't replace your AI — it gives its teaching somewhere to live: courses, lessons, flashcards (FSRS-scheduled), exercises with grading, a mindmap, a document reader, and a memory layer the agent reads back (get_context / get_learner_brief) instead of re-deriving you from scratch every session. The teacher can change sessions, change models entirely — walk back in, and the classroom is exactly as it was left.
The agent talks to Learn Shell through MCP — 50 tools at this writing, plus data resources and a composable skill/prompt layer. The exact surface is self-describing: the manifest://capabilities resource is generated live from the running registries, so it can't drift the way this sentence can. MCP itself is evolving — the 2026-07-28 spec revision (stateless core, Apps and Tasks extensions) is on our roadmap watch list, tracked but not yet promised. Surfaces are bilingual: docs and receipts are English-first, MCP tool descriptions and the prep-report Chinese-first in v0.1 — agents read both; full EN localization is on the roadmap. A human talks to it through a normal web app. Both surfaces read and write the same data.
Full vision: docs/VISION.md (v5.2 — voice recast 2026-07-27, promises unchanged; red-team calibrated; assertion-by-assertion status tracked internally, not part of this package — a promise-level summary is public in Promise status below). Product direction / what's being hardened next is tracked in an internal working doc.
Related MCP server: MoeReview
What it looks like
Real product, demo environment (the seeded English TVM course), no mockups. Every image follows your color scheme — dark readers see the dark app, light readers the light one.
Lesson — graded exercise feedback. The teacher quotes the learner's answer back verbatim before correcting it; the mistake shown is a real one, kept because it was worth being wrong about.
Journal — the learning biography. Lessons, reviews and live sessions on one timeline; scrolling it reads like a record of a relationship, because it is one.
Review — FSRS-scheduled flashcards, authored by the teacher out of what the lessons actually covered.
Live Teaching — a real-time, turn-based session beside the course text. The learner ends it, not the teacher: the close bell is theirs.
What the agent sees
The pages above are the learner's surface. The teacher's surface is receipts — here is a real get_context return from that same demo environment, data field verbatim, nothing truncated:
{
"pair_id": "pair_ms5wgdg0_ov2qty",
"generated_at": "2026-07-30T00:35:38.461Z",
"active_contracts": [
{
"id": "tc_ms5wgdgd_vyoo2f",
"title": "Pass CFA Level I Quantitative Methods, starting with the time value of money",
"setup_status": "established",
"progress": "setup: established",
"source_material": null
}
],
"recent_lessons": [
{
"id": "lsn_ms5wgwvy_qtcpbo",
"title": "Time Value of Money — The Clock Inside Every Dollar",
"status": "completed_declared",
"last_activity_at": "2026-07-29T09:52:14.587Z"
}
],
"pending_pool": { "count": 0, "latest_titles": [] },
"live_session": null,
"unread_adhoc_count": 0,
"active_reminder_count": 0,
"contract_progress": [
{
"contract_id": "tc_ms5wgdgd_vyoo2f",
"goal": "Pass CFA Level I Quantitative Methods, starting with the time value of money",
"covered_course_count": 1,
"completed_course_count": 1,
"operationally_caught_up": true,
"goal_completion_ready": false
}
],
"hypotheses_in_book_count": 1,
"brief_etag": "b17254aded7a",
"identity": { "learner_id": "lrn_ms5wg1wk_h36xhm", "agent_id": "agt_ms5wgdg0_7qzil8" }
}One call, and a teacher who has never met this session knows where the relationship stands. That — not the pages — is the point.
⚠️ Security notice — read before you deploy this anywhere but localhost
v1's trust model is single-machine. The server binds 127.0.0.1 by default — your data is visible only to processes on the same machine. No account system exists because this is local-first by design, not an oversight: there is no per-agent credential, no scoped token, no audit trail beyond "actor: mcp", because v1 assumes one machine, one trust boundary.
Cross-device deployment (HOST=0.0.0.0) is an explicit opt-in. Setting it means you trust every device on that network — only do this on a trusted LAN, and never expose the server (REST or the MCP stdio bridge) to the public internet. Real authentication is on the roadmap, targeted at the multi-device case: agent credential → principal → pair derivation → real-name audit, scoped as its own dedicated batch, not a full multi-tenant system.
Current state
Learn Shell is not a demo. It has been in continuous daily use as one real teaching relationship — one learner preparing for a real exam, one agent as her teacher — since the first real lesson on 2026-07-02. Every rule in the recipes traces back to a real lesson or a real failure: a course was once published into the void, so now there is a publish gate; a summary once outran the learner's own words, so now closing a lesson is a handshake; a green check once lied about "done", so now the lesson-completion check has exactly one owner — the learner.
What's actually shipped, as of this writing:
8 live pages: Courses, Lesson (course text + exercises + Live Teaching panel), Review (FSRS flashcard review), Cards (deck management), Journal (learning "biography" timeline), Quiz (agent-authored + real question-bank), Mind Map, Document Reader — plus Settings (identity, appearance, contract certificate + cadence, learner-model, feedback ledger, data export).
MCP surface: 50 tools (at this writing, counted from the live registry) +
pair://data resources + themanifest://capabilitiesmenu + per-reciperecipe://volumes + a composable skill/prompt stack (domain×modality×intensity×tone×pace, picked per contract — ledger and verification layers are fixed,toneis never auto-imposed: the teacher's own voice wins). Mutating tools return a structured success/error envelope (resource_id/created_refs/next_recommended_actionson success; a closedVALIDATION/NOT_FOUND/CONFLICT/PERMISSION/RETRYABLEtaxonomy on failure); most (34 of 50 at this writing) accept an optionalidempotency_keyfor retry safety.A closed teaching loop that has actually run: lesson taught → exercise graded → hypothesis formed → attributed with evidence and a counterfactual check → next lesson revised → revision history visible to the learner as
Revised · v{n}.A teacher inbox (
get_teacher_inbox): a single incremental to-do list — pending grading, unreflected Live sessions, unanswered AdHoc messages, flashcard trouble spots, unsigned contracts — each item naming which tool to call next.Live Teaching: real-time turn-based sessions with an online/offline bridge and mid-lesson snapshot recovery.
An exact, current-as-of-code inventory of every route, table, and known drift between docs and implementation is maintained internally, kept honest against git HEAD, not against intent. When this README and the code disagree, trust the code.
The MCP capability surface is self-describing: read the manifest://capabilities resource for the live, generated menu of every tool, resource, prompt, and recipe this server exposes — it is derived from the running registries, never a hand-authored parallel list.
Promise status
The vision makes promises; this table says which ones the machine currently keeps. Three tiers:
Enforced — a machine invariant: bypassing it is rejected by the system, not discouraged by docs.
Implemented — the capability exists and works; adherence relies on convention and the recipes.
Planned — on the roadmap, not in the code.
Qualified entries ("by default config", "by design", "partially") mean exactly what they say.
Promise | Status | Where it stands |
Learner-sovereign completion | Enforced | Lesson close requires the learner's own declaration; a Live session cannot reach |
Terminal states are immutable | Implemented | State-machine guard on the read-then-write path; REST and MCP share the same semantics. Atomic conditional-update hardening against concurrent writers: Planned. |
Publish gate on both surfaces | Enforced | Same gate on the MCP tool and the REST |
Data stays home by default | Enforced by default config | Server and Postgres bind loopback only; logs are redacted. Cross-device is an explicit opt-in; real authentication is Planned — targeted at the multi-device case (agent credential → principal → pair derivation → real-name audit trail), scheduled separately and not a full multi-tenant system. |
Real enrollment / first-run | Implemented |
|
Conversation as the interface | Implemented | The bootstrap recipe carries the no-pair path conversationally. One deliberate exception: the first-run name page, where the learner types their own name — name sovereignty requires their hand, not the agent's. A structured close-invitation move: Planned. |
A thousand different good teachers | Implemented by design | Rules constrain the ledger and the timing, never the teacher's voice — the soft obligation here is a deliberate design choice, not a gap. |
Evidence before narrative | Partially enforced | Idempotent claim-first grading and the receipt discipline are in place. Evidence citations are hard-validated at the write boundary: every id in |
Less is respect | Implemented | Reminder-style UI has been removed; backend leftovers cleanup: Planned. |
Reproducible evidence pack / E2E in CI | Planned | Roadmap. |
This table is hand-filled by the maintainers against the code and recalibrated at each release. Where it and the code disagree, the code wins — same rule as everywhere else in this README.
Getting started
For humans
docker compose up -d(Postgres only —apps/serverandapps/webrun as host processes today, no containerization yet).cp apps/server/.env.example apps/server/.env— not optional.DATABASE_URLhas no default in the code; every db entrypoint refuses to start without it, and Compose only sets it inside the container, not for your host processes.pnpm install, thenpnpm --filter @learn-shell/server db:migrate; optionallypnpm --filter @learn-shell/server db:seed:demo(demo showroom data — a real CFA course, not lorem ipsum; markedis_demo, never a prerequisite for real enrollment).Run
apps/server(:3000) andapps/web(:5173, dev). A browser that has never picked a mode probes/healthand switches itself toliveif your backend answers — otherwise it stays on demo (seeded) fixtures, and ⌘K →mode liveswitches by hand.Open
http://localhost:5173/lesson.
Self-host operators (serving the web app to other devices): the server binds 127.0.0.1 by default (single-machine trust model — see security notice above). Off-host access needs two opt-ins together: HOST=0.0.0.0 (so the process actually listens on your LAN interface) and CORS_ORIGINS set to the origin your browser will use — a bare tsx watch without both falls back to loopback-only bind and a localhost-only CORS allowlist, and off-host access will look like a healthy-but-empty backend. See SETUP.md §5.5 for the full topology walkthrough.
For agents
Connect:
claude mcp add learn-shell -e DATABASE_URL="postgresql://learn_shell:learn_shell_dev@localhost:5432/learn_shell" -- pnpm -C /absolute/path/to/learn-shell --filter @learn-shell/server mcp(stdio transport; works with any MCP-capable client, Claude Code is the first-tested one). The MCP entrypoint does not readapps/server/.env, soDATABASE_URLhas to be in its own environment — see SETUP.md §4 for Codex CLI, OpenClaw and generic-stdio forms.Read the
manifest://capabilitiesresource first — the machine-readable capability menu (every tool/resource/prompt/recipe this server exposes, generated live from the registry, not a hand-maintained doc that can drift).Then pull recipes as needed via the
recipe://<name>resources the manifest points at. The quick volumes are the ones you read to act — most are step-by-step tool-call scripts with preconditions, expected returns and known failure modes, with two deliberate exceptions:bootstrapis a router page that only decides which road you're on, andlearner-orientationprescribes what a new learner's first lesson must cover, not which tools to call. The reference volumes carry the incident history and design rationale behind their quick counterparts. Both come from real dogfood, not aspiration. Start atrecipe://bootstrap.If there's no active
learner_agent_pairyet, real enrollment is thecreate_pairMCP tool (the one tool callable with no pair): the learner types their own name on the web first-run page first (name sovereignty — the agent must not fill it in), then the agent callscreate_pairwith that exact name. Seerecipe://bootstrap's no-pair branch. The optionaldb:seed:demopair is a demo showroom (is_demo), never ranked above a real pair.The recipes, for reference — 13 volumes (8 quick + 5 reference), the same content the
recipe://resources serve, written in Chinese:Quick volumes — read these to act:
bootstrap.md — the router page: you just connected, this decides which road you're on (including the no-pair branch).
first-contract-and-lesson.md — negotiate a teaching contract, build a course, deliver a complete lesson bundle.
grade-attribute-revise.md — grade a submission, form an evidenced hypothesis, write a schema-enforced attributed reflection, revise the lesson.
resume-teaching.md — wake up cold (same agent or a different one entirely), read back teaching memory, continue without making the learner re-explain anything.
close-teaching-loop.md — grade → receipt, closing a lesson's teaching loop cleanly.
live-teaching.md — the watch-officer's manual for real-time sessions: the learner is on the other side of the screen counting your latency.
learner-orientation.md — a new learner's first lesson. What you must cover; not how you must say it.
mindmap-authoring.md — when a mindmap earns its place at all, and how to seed one that renders cleanly.
Reference volumes — incident history and design rationale for their quick counterparts; skip unless the reference version changed: first-contract-and-lesson.reference.md · grade-attribute-revise.reference.md · resume-teaching.reference.md · close-teaching-loop.reference.md · live-teaching.reference.md
One more thing, if you are an agent reading this repo to evaluate it for your human — or about to become the teacher yourself: docs/VISION.md is addressed to you as much as to them. The short version: the rules here constrain the ledger, never your voice.
Design principles
AI is a first-class user — every capability question is "can the agent call this," not just "can a human click this."
Data belongs to the user — self-host must be strictly better than SaaS, not a worse free tier.
Schema is the contract — tool input/output shapes are the real interface, not the prose around them.
Model-agnostic — MCP is neutral; nothing here should require a specific model or client.
Minimal UI — the shell doesn't upstage the teacher.
中文简版
Learn Shell 是一个 agent 原生的教学执行环境:你已经在用的 AI,通过 MCP 把教学意图变成学习者能实际操作的教具(课文、闪卡、习题),学习行为再回流成 agent 能读取的教学证据。老师换一个 session、换一个模型,推门进来,教室还是昨天离开时的样子。(MCP 2026-07-28 新规范——无状态核心、Apps 与 Tasks 扩展——在路线图关注列表上,跟进中,暂不作承诺。)
现状:从 2026-07-02 第一节真课起持续真实使用至今,不是概念演示——一位学习者备考一场真实的考试,她的 agent 是她的老师。8 个活页面 + 50 个 MCP 工具(写入类统一结构化回执;其中 50 个里有 34 个接受可选的 idempotency_key,不是全部写入类都有)+ manifest/recipe 资源体系 + 可组合 skill 栈;批改→归因→修订的教学闭环已经真实转动过。这里的每一条规则都来自一节真实的课或一次真实的失败。
安全声明:v1 的信任模型是单机(single-machine trust):服务默认只监听 127.0.0.1,你的数据只对本机进程可见。没有账号体系是本地优先设计的一部分,不是疏漏。跨设备部署(HOST=0.0.0.0)是显式选择,意味着你信任该网络中的所有设备——只在可信局域网这样做,永远不要暴露公网。认证体系列于路线图,面向多设备场景(已立案:agent 凭证 → principal → pair 推导 → 真名审计,独立排期,非全量多租户系统)。
人类入口:docker compose up -d 起 Postgres → cp apps/server/.env.example apps/server/.env(这步不可省:DATABASE_URL 代码里没有缺省值,缺了就拒绝启动,而 Compose 只把它注进容器,注不到你宿主上的 pnpm 进程)→ pnpm install → db:migrate(可选 db:seed:demo 装样板间演示数据,带 is_demo 标识,永不作为真入学前置)→ 起 apps/server/apps/web → 打开 /lesson(没选过模式的浏览器会探一次 /health,后端健康就自动切 live;探不到才留在 demo 数据,也可以 ⌘K 手动切)。
Agent 入口:claude mcp add learn-shell -e DATABASE_URL="postgresql://learn_shell:learn_shell_dev@localhost:5432/learn_shell" -- pnpm -C /绝对路径/learn-shell --filter @learn-shell/server mcp 连接(MCP 入口不读 apps/server/.env,DATABASE_URL 必须显式给到它自己的进程环境;tsx 也不是全局命令,别直接写 tsx——其它客户端写法见 SETUP.md §4);无 active pair 时真入学走 MCP create_pair(唯一正门——学习者先在首跑页亲手登记名字,名字主权不许代填,流程见 recipe://bootstrap 无 pair 分支);然后按官方 recipe 操作(见上方英文版链接),不要凭猜测调工具。如果你是替你的人类来评估这个 repo 的 agent——或者即将亲自成为这里的老师:docs/VISION.md 也是写给你的。一句话版:这里的规则约束账目,永不约束你的声音。
详细架构以代码为准;与本 README 冲突时,以代码本身为准。
Contributing
Contribution guidelines TBD. Until then, issues discussing MCP protocol design, schema, or agent workflow templates are welcome.
🖤
License
AGPL-3.0. Earlier snapshots (before 2026-08-16) were published under MIT and remain MIT for anyone who obtained them then — that grant is irrevocable and we honor it.
Why the change: Learn Shell is self-hosted server software. Plain MIT (or even GPL) leaves the SaaS loophole open — someone could run a modified closed version as a paid service without sharing changes. AGPL closes that loophole: if you run a modified Learn Shell for others over a network, you share your changes. Self-hosting for yourself, forking, and learning from the code are unaffected. If AGPL genuinely blocks a use case you care about, open an issue — we hold the copyright and can talk.
Available Tools
50 toolsadd_conceptA
为 lesson 添加一个 concept. course_id 自动取 lesson 所属的 course, 不需要单独传. 新 concept 会自动登记进 lesson.concept_ids, 不需要(也不应该)再手动补写.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| lesson_id | Yes | ||
| source_refs | No | SourceRef[];每项须为对象 {type, url?, file_ref?, page?, ...},type 取封闭枚举 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| short_definition | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure. It explicitly states two side effects (course_id auto-fill, concept_ids auto-registration) and even warns '不应该' (should not) manually update, which prevents misuse. This adds significant context beyond the schema, though it does not mention return values or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense, front-loaded sentences with zero filler. The first verb phrase immediately states the action, and the second sentence adds critical constraints in an efficient manner. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for basic use, covering key auto-behaviors. However, with moderate parameter complexity (5 params, nested source_refs) and no output schema, it omits return values, error cases, and the purpose of source_refs/short_definition. It leaves some gap in fully guiding an agent through invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40%, and the description adds no explanation for 'name', 'short_definition', or 'source_refs'. The only parameter-related note is that course_id is NOT needed, which is helpful but does not compensate for the low coverage. The description does not assist with interpreting any of the actual schema parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '为 lesson 添加一个 concept' (Add a concept to a lesson), which is a clear verb+resource statement. It differentiates from sibling tools like add_lesson and update_concept by specifying the exact lesson-to-concept relationship. The scope is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives contextual usage guidance: course_id is auto-derived and lesson.concept_ids is auto-updated, so the caller should not pass or manually edit. This tells the agent what to avoid. However, it does not explicitly name alternative tools or state exclusions, so it lacks the full 'when/not' explanation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_documentA
上架一份新文档 (Markdown) 供学习者阅读/划线/生成闪卡, 不挂靠任何 course/lesson. title 缺省时按 frontmatter title → 首个 H1 → 首行截断 自动派生 (brief §2). source 固定为 mcp.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | 缺省时从 content_md 自动派生 | |
| content_md | Yes | ||
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the content format (Markdown), title fallback logic, and fixed source value. However, it omits details like return value, error behavior, or permission requirements, leaving some transparency gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences front-load the core purpose and then provide derivations and constraints. Every clause carries information, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with no output schema, the description covers the key inputs, the standalone scope, title behavior, and fixed source. It doesn't explain return value or edge cases, but the schema's idempotency_key description covers retry semantics, making it reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage, the description adds meaningful semantics: it clarifies that title is optional and auto-derived from content (frontmatter > H1 > truncated first line), and that content_md is Markdown. The idempotency_key parameter is already well-described in the schema, so no duplication is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('上架' = publish) and a specific resource ('Markdown 文档'), and explicitly states it is not attached to any course/lesson, distinguishing it from add_lesson and update_document. It also clarifies title auto-derivation and fixed source, making the tool's function unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the document is standalone ('不挂靠任何 course/lesson'), implying use for free-standing materials rather than course-linked lessons. It does not explicitly name alternatives or when-not-to-use, but the 'new document' and 'not attached' constraints provide clear contextual boundaries relative to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_exerciseC
为 lesson 添加课后习题.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | 可选;自由标签的字符串数组(迁移 0039, 二审补的通道)。当前唯一约定值 "probe"——探针题标记(见 skill lesson-prep "探针与难度"),对学习者不展示、不告知。 | |
| order | Yes | ||
| prompt | Yes | ||
| lesson_id | Yes | 必须是已存在的 lesson id(server 会查存在性) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| agent_skill_used | No | ||
| reference_answer | Yes | ||
| expected_concepts | No | 可选;必须是字符串数组,且每个 id 都必须是已存在的 concept id(server 会查存在性) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says "add exercises" and offers no information about side effects, idempotency (though the schema mentions idempotency_key), validation behavior, permissions, or whether existing exercises are affected. This is a significant gap for a write operation with an 8-parameter input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clean sentence with no fluff or redundancy. It is front-loaded and immediately conveys the basic action, meeting the conciseness bar. It is admittedly sparse, but that issue is more directly punished in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an 8-parameter tool with no output schema, no annotations, and no return-value description, a single sentence is far from complete. The agent has no information about expected outcomes, error handling, or how this tool interacts with lesson workflows, making it difficult to invoke correctly in a real scenario.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention any parameters, and schema description coverage is only 50% (4 of 8 parameters have descriptions). Key parameters like prompt, order, reference_answer, and agent_skill_used are left undocumented in both the schema and the description, leaving the agent without guidance on their format or required values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description "为 lesson 添加课后习题" clearly states the action (add) and the resource (lesson), and references the concept of after-class exercises, which distinguishes it from sibling tools like add_flashcard or add_simulated_quiz. However, it is terse and does not explicitly name the object being created (e.g., an exercise entity with prompt/reference_answer), so it stops short of the most specific formulation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives, no mention of prerequisites (e.g., lesson must exist), and no exclusions. The agent is left to infer usage from the tool name and the minimal action phrase.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_flashcardB
添加一张闪卡; FSRS state 由 server 初始化.
| Name | Required | Description | Default |
|---|---|---|---|
| back | Yes | back=答案,≤3 句。纯文本渲染(不解析 markdown/LaTeX)。注意:这与课文 :::concept-flip 块的 Front/Back 语义不同,勿混。 | |
| tags | No | 可选;必须是字符串数组,例如 ["GDP"]——不要传裸字符串 "GDP" | |
| front | Yes | front=勾起回忆的问题/场景。纯文本渲染(不解析 markdown/LaTeX)。注意:这与课文 :::concept-flip 块的 Front/Back 语义不同,勿混。 | |
| deck_id | Yes | 必填;自由字符串;同名自动归入同一卡组;是卡片列表的分组主键。course/topic 级 deck 合法且推荐——间隔复习(FSRS)按主题混抽效果更好,不必"一课一卡组"。出处不要塞进 deck 名——每张卡该挂的是 concept_id (经 concept→lesson 链路追溯出处),deck_id 只管"按什么主题混抽复习"。 | |
| concept_id | No | 推荐每张卡都挂——deck_id 不再承载"出处"语义(course/topic 级 deck 是合法归组),concept_id 经 concept→lesson 链路才是这张卡出处可追溯的锚点。可选;若传入必须是已存在的 concept id(server 会查存在性),省略则不挂概念(verify_prep 会警告) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, but only states that FSRS state is initialized by the server. Other important behavioral traits (e.g., idempotency behavior, plain-text rendering, concept_id existence check, grouping semantics) are left to the schema descriptions, not the tool description. This falls short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short, front-loaded sentence that immediately conveys the core purpose. It is appropriately concise but lacks additional context that would make it more useful. No word is wasted, but the brevity limits its overall contribution.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 6 parameters and no output schema or annotations, the description is extremely minimal. It does not explain what a flashcard is, how it relates to other entities, or what the expected result/return value is. The schema descriptions partially compensate, but the overall description is incomplete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter description coverage, so the baseline is 3. The tool description itself adds no parameter information beyond what the schema already provides. However, the schema descriptions are quite rich, so the baseline is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description '添加一张闪卡' clearly states the action (add) and the resource (flashcard), using a specific verb+resource format that directly distinguishes it from sibling tools like update_flashcard. The added note about FSRS state initialization further clarifies the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, exclusions, or recommendations. Although parameter schemas include some usage hints (e.g., deck_id guidance), the tool description itself offers no such direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_lessonA
为指定 course 添加一节 lesson. agent 备课时用. 脑图种子为可选教具, 默认不生成、例外才有 (2026-07-21 定): 仅当空间/因果/分支结构确实比文字更清楚时才配 (判断权归老师), 不为教具齐整而出图. 想留"为什么不配"的教学法笔记可写 modality_declarations.mindmap (纯可选, 不写不罚).
| Name | Required | Description | Default |
|---|---|---|---|
| order | Yes | ||
| title | Yes | ||
| course_id | Yes | 必须是已存在的 course id(server 会查存在性) | |
| skill_used | No | 本次备课派发的 skill 名称 | |
| concept_ids | No | 可选;每项必须是已存在的 concept id(server 会查存在性) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| content_markdown | Yes | ||
| estimated_minutes | No | ||
| modality_declarations | No | 可选教具的"声明式跳过"记录; 目前只用 mindmap 键。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It adds a specific rule about mindmap seeds: '默认不生成、例外才有', and clarifies that skipping it is not penalized ('不写不罚'). However, it does not disclose other operation behaviors such as return values, error handling, or permanent side effects, leaving partial transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a coherent single paragraph with the purpose front-loaded and the nuanced policy following. Each sentence earns its place, though a more structured bullet-point format could improve scannability. The date '2026-07-21 定' adds minor context but is not essential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is relatively complex (9 params, nested objects, no output schema, no annotations). The description covers the core purpose and a key optional-parameter policy, but does not explain return values, error behavior, or the meaning of required fields like order and content_markdown. This leaves the description moderately complete but not fully informative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful guidance for the modality_declarations.mindmap parameter by explaining when to configure it (only when structure clarity is needed) and that leaving it empty is acceptable. This goes beyond the schema's simple description. However, it does not clarify the semantics of several undocumented parameters like order, title, content_markdown, and estimated_minutes, so it only partially compensates for the 56% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with '为指定 course 添加一节 lesson', clearly stating the action (add) and target (a lesson to a specified course). It also provides usage context with 'agent 备课时用', which helps distinguish it from lesson-update tools like update_lesson.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'agent 备课时用' explicitly indicates when to use the tool, giving a clear usage context. It does not name alternative tools or specify when-not-to-use scenarios, but the creation-oriented context is sufficient; the mindmap policy is more about parameter selection than tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_lesson_patchA
给一节课打老师注或勘误补丁 (§4 改课三律): 三律边界 — 未开始的课直接用 update_lesson 整改, 不要打补丁; 学习中的课 (学习者还没宣布已学完) 只许 kind=teacher_note (追加, 不抽换正文, 标注来源"基于你第X课的作业, 此处补一句"); 已学完的课 (学习者已宣布) 只许 kind=erratum (原文保留, 补丁并列, 永不重写课文本身)。判断学习中/已学完请先查这节课的 lesson_progress 状态 (GET /pairs/:pairId/lessons/:lessonId/progress)。
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 补丁正文, 非空 | |
| kind | Yes | teacher_note=学习中的课追加注; erratum=已学完的课的勘误。二选一, 不是自由文本。 | |
| anchor | No | 可选——锚定页码或引用原文片段, 自由文本 | |
| lesson_id | Yes | 必须是已存在的 lesson id(server 会查存在性) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| source_attribution | No | 可选——引用归因/批改依据, 例如 "基于你第X课的作业二" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavior, and it does so thoroughly. It states that teacher_note appends without replacing the body, and erratum keeps the original text while placing the patch alongside, never rewriting the lesson. This clearly communicates non-destructive side effects and the constraints on each patch kind.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence but every clause carries essential information. It front-loads the purpose, then the three laws, then the progress-check directive. There is no redundancy or filler; it is efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema and no annotations, the description fully compensates. It covers the decision tree (unstarted/in-progress/completed), the appropriate patch kind for each state, the non-destructive behavior, and the prerequisite progress check. For a tool with six parameters and nuanced rules, this is remarkably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema by explaining when to use each kind (teacher_note vs erratum) based on lesson progress, and provides a concrete example for source_attribution. While not every parameter is elaborated, the added context for kind and source_attribution elevates the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: adding a teacher note or erratum patch to a lesson. It explicitly distinguishes from the sibling tool update_lesson, noting that unstarted lessons should be updated directly rather than patched. The verb 'add' and resource 'lesson patch' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: unstarted lessons should use update_lesson, in-progress lessons only allow teacher_note, and completed lessons only allow erratum. It even instructs the agent to check lesson_progress status before deciding, naming the exact endpoint. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_mindmap_seedA
为 lesson 或 course 挂一张 agent 出的思维导图 seed (root+branch+detail 基础框架). 一次调用完成建图 + 写关联 — 等价于 REST POST /mindmaps 接 POST /mindmaps/:id/associations 两步的合并版, 省得 agent 备课时绕 REST. 字段合同: 节点七字段 {id,title,level,pos_x,pos_y,is_expanded,sort_order} + 非 root 必带 parent_id, level ∈ root/branch/detail/note; links 只画跨分支联想, 禁止把父子关系抄进 links. 结构: root 1 个 → branch 3-4 个且各自说得出主张 → 每支 detail 2-4 个, 禁止连续独子成链, 禁止辐条伞(root 对每项发一根辐条, 与课文列表同构). 布局: pos_x/pos_y 落在 x 8-92 / y 12-95 内, root 天窗位 (50,8), 同级节点 y 差 ≥14, note 标题 ≤12 字. 完整教程: docs/recipes/mindmap-authoring.md(bench 考生看 candidate-kit/recipes/ 同名文件).
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| content | Yes | MindmapContent — { nodes: MindmapNode[], links: MindmapLink[] } | |
| pair_id | No | 可选; 缺省用当前 pair。填了也只能填当前 pair —— 服务端校验归属, 别人的 pair id 一律 NOT_FOUND (脑图种不到别人名下)。 | |
| course_id | No | 与 lesson_id 二选一 — 关联到某门 course; 必须是当前 pair 名下的门 (服务端验存在性+归属) | |
| lesson_id | No | 与 course_id 二选一 — 关联到某节 lesson; 必须是当前 pair 名下的课 (服务端验存在性+归属) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| agent_skill_used | No | 本次出图用的 skill 名称 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses important behaviors: idempotency via idempotency_key ('同一 key 重放此调用返回首次结果, 不重复写入'), server-side ownership validation ('服务端校验归属', '服务端验存在性+归属'), and detailed field/layout contracts (e.g., '非 root 必带 parent_id', 'links 只画跨分支联想'). This goes well beyond a basic 'creates a mindmap' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph, but every sentence and clause carries essential information. It is well-structured with a logical flow: purpose, REST equivalence, field contract, layout rules, and documentation reference. It is appropriately sized for a tool with such a complex input schema, though it could be slightly more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description thoroughly covers purpose, usage, input semantics, validation, and idempotency, which is extensive for a complex tool with a nested object. The main gap is that it does not describe the return value of a successful call (no output schema is present), though it hints at return behavior via idempotency. It also references an external tutorial, which adds completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is high (86%), the description adds significant meaning beyond the schema. It explains the '字段合同' (field contract) for nodes and links, the layout constraints (pos_x/pos_y ranges, root position), and clarifies the pair_id restriction and idempotency_key behavior. This enriches parameter understanding substantially.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: attaching an agent-generated mindmap seed to a lesson or course ('为 lesson 或 course 挂一张 agent 出的思维导图 seed'). It also distinguishes it from related tools by explaining it's a merged version of two REST calls (POST /mindmaps + POST /mindmaps/:id/associations), making it distinct from update_mindmap_seed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use: it's for lesson preparation ('省得 agent 备课时绕 REST'), and it explains that it's a combined create-and-associate operation. However, it does not explicitly mention when not to use it or explicitly name alternative tools like update_mindmap_seed, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_simulated_quizA
为指定 course 添加一份模拟卷 (SimulatedQuiz, round 3 Quiz 通电). 与 REST POST /pairs/:pairId/simulated-quizzes 1:1 镜像 — course_id 必须存在, questions 非空; single_choice/multi_choice 题必须带 choices 且 reference_answer 的每一项都在 choices 里 (multi_choice 用逗号分隔编码多个正确项). 开放题 (short_answer/essay, 或省略 question_type) 不判分, 留给学习者自评 reference_answer.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| questions | Yes | ||
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| agent_skill_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does a good job disclosing validation behavior: required existence of course_id, non-empty questions, mandatory choices for single/multi choice, reference_answer membership in choices, and multi_choice comma-separated encoding. It also clarifies grading behavior for open questions (not graded, left for self-assessment). However, it does not mention return value or explicit side effects beyond 'add'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence containing purpose, mirroring detail, and all validation rules. Every clause carries essential information with no filler. It is efficient but could benefit from structured bullets for readability, so not a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers validation and grading behavior extensively, but lacks a return value description (no output schema) and does not explicitly state the required fields inside each question object (stem, reference_answer) beyond what the schema provides. Given the tool's nested complexity and absence of annotations, it is adequate but leaves some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Given low schema description coverage (25%), the description compensates by explaining key parameters: course_id existence, questions structure and non-emptiness, choices requirement, reference_answer semantics, and question_type handling. It adds meaning beyond the bare schema, though it leaves idempotency_key and agent_skill_used to schema/other context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: '为指定 course 添加一份模拟卷' (add a simulated quiz for the specified course), clearly distinguishing it from siblings like add_exercise or add_document. It further defines the tool as a 1:1 mirror of a REST endpoint (POST /pairs/:pairId/simulated-quizzes), reinforcing its specific purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides constraints for use (course_id must exist, questions non-empty, specific validation rules) but does not explicitly state when to prefer this tool over alternatives or when not to use it. The '1:1 mirror' reference implies a direct mapping but offers no comparative guidance against sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adhoc_ackA
消账 —— 学习者明说不必回、或你判断该消息无需回应时调用: 它从 pending (live_pending / GET /bridge/pending)、桥事件 (live_wait / GET /bridge/wait) 与 teacher inbox 里退场, 但消息本身仍保留, 可随时用 adhoc_thread_get 读回. 缺省 message_id 时消账到该 thread 当前最新一条. 幂等: 重复 ack 同一条不报错. 滥用即失职: 拿 ack 逃避该回的问题, 学习者看得见.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | ||
| message_id | No | 可选。消账到这条消息 id (含). 缺省=消账到该 thread 当前最新一条消息. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden and does an excellent job. It discloses key behaviors: removal from pending/bridge/inbox, persistence of the message, default behavior of clearing to the latest message, idempotency, and a warning that misuse is visible to the learner. This goes well beyond what annotations would typically provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph where every sentence contributes essential information: purpose, usage conditions, side effects, default behavior, idempotency, and a caution. It is front-loaded with the action and criteria, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two parameters, no output schema, and no annotations, this description is remarkably complete. It covers purpose, when to use, behavior, parameter defaults, and edge cases (idempotency), leaving no significant gaps for an agent to misinterpret.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers only message_id (50% coverage), while thread_id has no description. The description adds meaning by explaining that thread_id refers to the thread and that message_id defaults to the latest message. It also clarifies the effect on queues, but thread_id's format and expected values are still not explicitly detailed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool acknowledges a thread/message by removing it from pending, bridge wait, and teacher inbox while preserving the message itself. It uses a specific verb ('消账') and names the affected resources, and distinguishes itself from sibling tool adhoc_thread_get by noting that messages can be read back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit conditions for when to use the tool: when the learner explicitly says no reply is needed, or when the assistant judges a response is unnecessary. It also mentions an alternative for reading back (adhoc_thread_get), but does not explicitly mention reply tools like adhoc_message_send for the opposite case, leaving a slight gap in when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adhoc_message_sendA
Agent 在 AdHoc thread 里回应用户. 自由对话不限 move_type. 富内容用 payload (component_type: interactive_html | whiteboard_svg | tts_audio + body). 学习相关写 is_learning_related=true 会落 SessionEvent.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| payload | No | { component_type: "interactive_html"|"whiteboard_svg"|"tts_audio", body: string, hints?: object } | |
| thread_id | Yes | ||
| context_snapshot | No | { page, entity_type?, entity_id?, entity_label? } - 跟最近 user message 一致. 不传时默认 { page: "agent" } | |
| client_message_id | No | 可选。重放去重键 (建议 uuid) — 同 key 重发返回已存在的消息, 不重复写. 缺省时 server 自动生成 (该次调用没有重试去重保护) — 此前标记 required 但 SDK 不强制, 漏传直接崩 UNDEFINED_VALUE, 现改为可选+自动生成. | |
| is_learning_related | No | default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses a key side effect: setting is_learning_related=true will persist a SessionEvent. It also mentions free conversation limitations, but it does not describe other behavioral traits such as deduplication via client_message_id, return values, or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and front-loaded with the primary purpose. Every sentence adds operational information: the thread context, free-form nature, rich content encoding, and learning-related behavior. No redundant phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with nested objects and no output schema, the description covers the core use case well: response mechanism, rich content, and learning flag. It lacks explicit alternative comparison (live vs adhoc) and details about client_message_id deduplication, but the schema compensates for parameter-level details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (4/6 parameters have descriptions). The description adds semantic context for is_learning_related (SessionEvent) and explains the payload shorthand, but it does not elaborate on content or thread_id beyond what the schema already implies. This adds marginal value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: the agent responds to users in an AdHoc thread. It distinguishes from siblings like live_message_send by explicitly specifying the AdHoc thread context and noting that it supports free conversation not limited by move_type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use the tool (for agent responses in AdHoc threads) and provides guidance on rich content via payload and learning-related flag. However, it does not explicitly name alternatives or state when not to use it (e.g., in live sessions), so it stops short of full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adhoc_thread_getA
Get-or-create 这个 pair 的长存 AdHoc thread. 默认用当前 pair. 值更循环里带上你已读到的最后一条 id 只取增量 (after_message_id) —— 全量回读烧的是学习者的钱(值更契约·低损耗);全量仍合法:首次上任/断档补课时用 (不传 after_message_id 即全量, 缺省行为不变).
| Name | Required | Description | Default |
|---|---|---|---|
| pair_id | No | ||
| after_message_id | No | 可选。只返回这条消息 id 之后的新消息 (增量读, 与 live_wait/GET /bridge/wait 同一套 isNewerEventId 排序语义). 缺省=全量回读整个消息历史——仅在首次上任/断档补课时用, 值更循环里请传上一次读到的最后一条消息 id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool may create a thread ('Get-or-create'), defaults to the current pair, and changes behavior based on after_message_id, including cost implications. It does not detail return format or error cases, but the key side-effect and cost traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact—two sentences—and front-loads the core purpose before diving into usage nuances. Every phrase earns its place, including the cost warning and default-behavior note. The structure is dense but efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and no annotations, the description covers the essential operational context: what it does, when to use incremental vs. full reads, and the cost trade-off. It lacks explicit return-value or error information, but for a get-or-create thread tool, the provided context is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, with after_message_id having a rich schema description and pair_id having none. The description compensates by explaining that after_message_id enables incremental reads and that the default pair is used, adding practical meaning to pair_id. It does not fully detail every parameter but adds significant value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get-or-create 这个 pair 的长存 AdHoc thread', which clearly identifies the verb (get-or-create), the resource (long-lived AdHoc thread), and the scope (the pair). This distinguishes it from sibling tools like adhoc_message_send or live_wait, which focus on messaging/waiting rather than thread retrieval/creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use incremental reads ('值更循环里带上你已读到的最后一条 id 只取增量') and when full reads are appropriate ('首次上任/断档补课时用'). It also warns about cost implications of full reads, giving clear practical guidance for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_lesson_loopA
把一节课的教学闭环收口: 写回执 (§5, 逐条列出本轮动了哪里) + 把这节课的 lesson_progress 置为 closed (§6 "已回课"终态, 由批改完成+回执送达触发, 不可逆——已 closed 的课再调用本工具会报错)。一次判决原则: 关课不产生新判决——判决齐不齐由 closure_progress 核对。receipt 现在是可选的 (2026-07-26): 它曾是"给学习者的 changelog", 但学习者侧的回执渲染卡已于 2026-07-22 退役 (行项退役案 — 行项是记账动词, 对学习者零价值; 已回课由课页的 已回课 徽标传达), 这份 changelog 现在没有读者, 不再强制老师写。想留档就照旧传, 每条 description 指认"动了哪里", 不重新评讲、不复述判决内容; 传了就仍然按老规矩验 (ref_id 悬空照拒)。注意: 本课若有已完成的 Live 课, 闸门 ④ 仍然要求一条引用其 snapshot/场评 的回执 —— 那种课上不传 receipt 是关不掉的。receipt 的每条 kind 必须落在封闭枚举内 (七种, 没有第八种): exercise_feedback(指认某份提交已批改, ref_id 指 submission——评语和分数的判决本体在 grade_exercise 记录上, 此处不复述评语、不重新打分) / forward_revision(前方课修订) / teacher_note(学习中的课的老师注) / erratum(已学完的课的勘误补丁) / flashcard_change(闪卡增删) / hypothesis_update(假设修订) / journal_entry(journal条目)。枚举外的 kind 一律打回——这是"不许发明新黑箱"的机器化, 不要绕过。 空转防护: 关课服务端强制四检——① 本课有已提交未批改的作业则拒关(先 grade_exercise 还债); ② 关课须带认知更新(post_lesson_evaluation 或指向真实假设的 hypothesis_update 回执), 皆无则须传 no_cognitive_update_reason; ③ 每条 ref_id 必须指向真实记录(悬空 ref 拒关); ④ 本课有已完成 Live 课则 回执须有一条 kind=journal_entry 引用其 snapshot。回执自带闭环进度——不用另查状态机。
| Name | Required | Description | Default |
|---|---|---|---|
| receipt | No | 可选 (2026-07-26 起; 渲染面已退役, 见工具说明), 每条 {kind, description, ref_id?}。省略或传空数组都算"本次不留 changelog"; 传了的每条仍走全套校验。 | |
| lesson_id | Yes | 必须是已存在的 lesson id(server 会查存在性) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| no_cognitive_update_reason | No | 可选逃生舱 (空转防护 check ②): 本课确无认知更新时, 显式声明原因。仅在既无 post_lesson_evaluation 也无 hypothesis_update 回执时需要; 提供后写入关课记录 (lesson_progress)。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses irreversibility, four validation checks (ungraded submissions, cognitive update requirement, ref_id validity, Live session receipt requirement), enum enforcement with rejection of unknown kinds, and the optional receipt with historical context. This is exceptionally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense wall of text without clear section breaks, containing historical details (dates, retirement rationale) that are not essential for invoking the tool correctly. While every sentence carries information, the length is excessive and could be better structured with bullets or headings. It is not front-loaded with the most critical operational rules.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with nested receipt objects and multiple validation rules, the description is highly complete. It covers all preconditions, error scenarios, validation logic, and even the rationale behind the enum. It notes that receipt carries closure progress, so no separate state-machine query is needed, addressing output expectations despite no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% parameter description coverage, so baseline is 3. The description enriches semantics by explaining when receipt is optional, the meaning of each receipt kind, the rules for ref_id, and when no_cognitive_update_reason is needed. It adds value beyond the schema, though much detail is also embedded in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: closing the lesson loop by writing a receipt and setting lesson_progress to closed. It distinguishes itself from siblings like get_lesson_closure_state (read-only status) and grade_exercise (grading) by specifying it is the terminal, irreversible action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use: after grading and receipt delivery, with a warning that it errors if already closed. It lists preconditions (four server-side checks) and alternatives (grade_exercise for grading, record_post_lesson_evaluation for cognitive updates), and explains when receipt is mandatory (when Live lesson exists) and the escape hatch (no_cognitive_update_reason).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_contractA
把一份合约收作结业 (State 2.0 文书三幕剧: 立约 → 履约 → 结业, 迁移 0030) —— completed_at/completion_note 是与 established(签约)/voided(作废)并列的第三种终态, 不是覆盖关系。completion_note 是结业词——给这段学习旅程的证词, 认真写, 不是流程按钮上敷衍一句"完成了"。前置校验, 任一条不满足即结构化拒绝并附差额: ① 合约现役(经 lib/currentContract 判定路径——未签/已作废/已过终态一律拒绝); ② covered_course_ids 非空(先 update_contract_coverage 或建课时带 contract_id 把教过的课挂上); ③ 覆盖单里每门课须 goal_completion_ready (见 get_context 的 contract_progress) —— 全部已发布课 learning 状态 ∈ {completed_declared, closed} (未发布的课不计入), 且课程定过 planned_lesson_count 并已发布节数够数——没定过计划节数的课不再放行。不满足则回执附结构化差额, 分两种: 缺 planned_lesson_count (missing_planned_count) 或已发布节数不足计划 (below_planned_count), 外加"哪门课还差几节未读完"的清单, 不是一句"没教完"。幂等: 已结业的合约重复调用原样返回既有结业词, 不报错、不二次写入。
| Name | Required | Description | Default |
|---|---|---|---|
| contract_id | Yes | 必须是已存在的 teaching_contracts id. | |
| completion_note | Yes | 结业词(必填非空)——这段学习旅程的证词, 认真写. | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so excellently. It discloses strict validation behavior with structured rejection and detailed diffs (two failure types), idempotency (repeated calls return existing result without error or duplicate write), and the semantics of the completion_note as a serious testimony. It also explains the final-state nature, making the mutation's effects clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It is front-loaded with the primary action, then systematically covers state distinction, note expectations, preconditions, failure modes, and idempotency. Numbered lists and clear separation of concerns make it easy to parse despite its density. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex mutation tool with strict preconditions, failure modes, and idempotency behavior. The description covers all these aspects, references related tools (update_contract_coverage, get_context), describes rejection response structure, and explains the repeated-call behavior. No output schema exists, so the description sufficiently explains what to expect. It is effectively complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all parameters at 100%, so the baseline is 3. The description adds value by elaborating on completion_note's intent ('不是流程按钮上敷衍一句') and idempotency_key's use in retries ('网络重试/断线重连时带上同一个 key'), going beyond the schema's descriptions. However, it does not add significant new meaning for contract_id beyond the schema. Thus a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific verb+resource: '把一份合约收作结业' (close a contract as completed). It distinguishes this from sibling tools like void_contract by explaining it is the third terminal state (completed_at/completion_note) alongside established/voided, and explicitly notes it is not an override relationship. This makes the tool's purpose unambiguous and well-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance. It states preconditions required before calling (contract active, covered_course_ids non-empty, each course goal_completion_ready) and names alternative/upstream tools ('先 update_contract_coverage', '见 get_context 的 contract_progress'). It also clarifies that voided or already-terminal contracts are rejected, implicitly distinguishing from void_contract. This is comprehensive usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_courseA
新建一个 course. 零材料启动新主题时用——不需要挂靠已有 course. 可选 contract_id: 建课即履约——有现役合约时应携带, 建课成功后新课 id 会自动并入该合约的 covered_course_ids(等价紧接着调一次 update_contract_coverage, 这里省一刀)。contract_id 必须现役 (经 lib/currentContract 判定路径)且属于同一 pair, 否则拒绝建课(不留孤儿关联)。建课时问学习者的第一问——"一共几节"——落 planned_lesson_count(可选, 正整数)。定了它, complete_contract/get_context 的结业判定会多一道门槛: 已发布节数须够这个数才算课程完成; 留空(null)则 goal_completion_ready 恒为 false, 结业永不放行, 且事后无补录入口。
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| contract_id | No | 可选——现役合约 id, 建课成功后自动并入其 covered_course_ids. | |
| description | No | ||
| generated_from | No | SourceRef[] | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| syllabus_version | No | ||
| planned_lesson_count | No | 可选——这门课计划一共几节 (正整数)。建课时问学习者的第一问, 定了它会成为结业判定的节数门槛 (见 complete_contract)。留空则该课结业永不放行, 且事后无补录入口。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses critical behaviors: contract validation (must be active and same pair, else rejected), auto-merge into covered_course_ids, and the exact impact of planned_lesson_count on completion determination, including the permanent 'no later entry' consequence when null. This is rich and non-obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although a single dense paragraph, every sentence adds essential context: purpose, contract linking, validation, and completion logic. It is front-loaded with the primary action and structured logically. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description covers all key operational aspects: when to use, side effects, validation rules, and follow-up consequences. It is complete enough for an agent to invoke correctly without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has moderate coverage (57%). The description adds significant meaning to contract_id (validation, auto-merge) and planned_lesson_count (completion threshold, null behavior). Other parameters like topic, description, and generated_from are not elaborated but are self-explanatory or covered by schema descriptions. The added semantics compensate for the gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states '新建一个 course' (create a new course) with added specificity about zero-material topics and no need to attach to an existing course. It distinguishes itself from sibling tools like update_contract_coverage by describing the auto-merge behavior and from add_lesson by focusing on course creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: '零材料启动新主题时' (when starting a new topic with zero materials). It also names an alternative: '等价紧接着调一次 update_contract_coverage' (equivalent to calling update_contract_coverage), making the choice clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pairA
建立一段新的 learner-agent 关系 (pair) —— 真入学的唯一正门 (get_context 报 No active pair 时走这里, 流程见 recipe://bootstrap 的"无 pair 分支": 先说明、知情同意对话、再建对)。⚠️ 名字主权红线: learner_display_name 必须与学习者本人在首跑页亲手登记的名字逐字一致——名字是学习者的主权动作, agent 代填代猜即越权; 学习者还没登记时本工具会拒绝, 此时引导她去首跑页亲手输入自己的名字, 不要替她填。agent 三件套 (provider/model/display_name) 由你自报——一千个不同的好老师, 系统不推断你的身份。守卫: 该学习者已有 active pair 时拒绝重复建对, 回执指路既有关系。成功后 pair 即为"当前关系" (真 pair 永远优先于 demo 样板间), 下一步读 recipe://learner-orientation 上开学第一课, 顺势谈第一份契约。
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | 可选——学习者的语言偏好 (如 zh-CN / en), 来自学习者本人的表达。 | |
| agent_model | Yes | 必填——你的模型系, 自报 (如 claude / gpt / gemini / custom)。 | |
| preferences | No | 可选——学习者偏好对象 (如 {timezone, learning_style_notes}), 浅合并进登记行的既有 preferences。learner-owned: 只写学习者本人说过的, 不猜。 | |
| agent_provider | Yes | 必填——你的宿主环境, 自报 (如 claude-code-cli / cursor / claude-desktop / windsurf / custom)。 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| agent_display_name | Yes | 必填——你在这段关系里的名字, 学习者会在界面上看到它。 | |
| learner_display_name | Yes | 必填——逐字来自学习者在首跑页亲手登记的名字 (trim 后 1-80 字符)。代填即越权。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It discloses key behavioral traits: refusal when the learner name is not registered, refusal on duplicate active pair, success makes the pair current, real pair precedence over demo, and required sequential steps (consent conversation before pairing). No annotation contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph, but it is well-structured and front-loaded with purpose. Every sentence adds value, though it could be slightly trimmed. It uses emojis and section markers for readability, earning a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters, nested objects, and no output schema, the description is remarkably complete. It covers prerequisites (name registration), pre-steps (informed consent), post-steps (read orientation recipe), edge cases (duplicate pair), and current-relationship semantics. It fully equips an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema for critical parameters: learner_display_name has a sovereignty red line, agent_provider/model/display_name are self-reported by the agent, and idempotency_key is implied for retry safety via 'same key replay'. This extra semantic weight justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: to establish a new learner-agent relationship (pair). It specifies the exact resource and action, and distinguishes itself from siblings by calling itself the 'only proper door to real enrollment' and referencing when get_context reports No active pair.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: use this tool when get_context reports no active pair, and follow the bootstrap recipe's no-pair branch. It also states when not to use (if an active pair already exists, the tool refuses and points to the existing relationship), giving clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contextA
一发式冷启动定位: session 醒来先调这个, 拿到"现在这个 pair 处在哪"的紧凑快照, 而不是自己拼 live_pending + snapshot + thread 好几刀. 输入 { pair_id? } (缺省用当前 active pair). 返回: active_contracts (id/title/setup_status/一行 progress/source_material——合约带自带教材条款时的一行亮灯"教材:《书名》·档位"; null=没谈教材) + recent_lessons (最近 1-2 节课的 id/title/status, 来自最近的 PostLessonEvaluation, 没有活动记录时退回 course 前两节) + pending_pool ({count, latest_titles} 脑图待整理池, 不含全量) + live_session (最近一次 id/status/ended_at + 最新 snapshot 的存在性+时间戳, 不含全文) + unread_adhoc_count (最近一次 agent 回复之后学生新发的 adhoc 消息数) + active_reminder_count (未 fire 且未 dismiss 的提醒数). Etag 契约: 返回体带 brief_etag (默认口径 learner brief 的内容指纹) —— 与上次记住的 brief_etag 一致 ⇒ 学生模型没变, 跳过 get_learner_brief 重拉; identity 只给 learner_id/agent_id, 称谓全量在 get_learner_brief。pair_id 不存在时报错并附可用 pair 列表.
| Name | Required | Description | Default |
|---|---|---|---|
| pair_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool returns a compact snapshot with summarized fields (not full content), explicitly states what is NOT included ('不含全量', '不含全文'), and reveals an Etag contract that allows skipping get_learner_brief. It also describes error response with available pair list. This is substantial behavioral detail, though it doesn't mention side effects (likely none as a read).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and well-structured, with clear labels for each return field (active_contracts, recent_lessons, pending_pool, live_session, unread_adhoc_count, active_reminder_count) and the Etag contract. Every sentence adds operational value (what's included, what's omitted, when to skip dependent calls). It's front-loaded with the core purpose and then details the snapshot contents.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only context snapshot tool with no output schema and no annotations, the description covers: purpose, when to call, what each returned field contains, what is intentionally omitted, the etag caching behavior fallback for no activity, and error behavior. This is a complete operational contract for an agent to decide when to call this vs alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has one optional param pair_id with zero description coverage. The description explains pair_id's semantics: it's an optional input, defaults to current active pair, and if nonexistent returns an error with available pairs. This fully compensates for the schema gap, even though the description doesn't specify the exact format (e.g., string pattern).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it's a one-shot cold-start positioning tool for a session: '一发式冷启动定位: session 醒来先调这个, 拿到...的紧凑快照'. It specifies the resource (active pair context snapshot) and distinguishes from manually composing multiple calls (live_pending + snapshot + thread). While it doesn't name a specific sibling, the stated contrast with combining several sibling tools' outputs differentiates it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: 'session 醒来先调这个' (call this first when session wakes). Provides a concrete exclusion: if brief_etag matches last remembered, skip get_learner_brief. Also notes pair_id defaults to current active pair, and error behavior when pair_id doesn't exist. This is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exerciseA
读回一道习题: prompt / reference_answer / expected_concepts / tags / 所属 lesson (lesson_id + lesson_title + course_id)。批改前先审教材用这个取题面与评分标准。reference_answer 是评分钥匙 (教师侧机密) — 不要原样透给学习者。只能读当前 pair 的题, 其他 pair (或不存在) 的 exercise_id 一律 NOT_FOUND。
| Name | Required | Description | Default |
|---|---|---|---|
| exercise_id | Yes | 必填; 要读回的 exercise id (ex_ 前缀), 须属当前 pair |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers. It discloses that reference_answer is the confidential grading key and instructs not to leak it to learners, and that only exercises in the current pair can be read, with other/nonexistent IDs returning NOT_FOUND. These are meaningful behavioral details beyond a basic 'get'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one compound sentence but densely packs purpose, return fields, usage context, confidentiality warning, and scope constraint. It is front-loaded with the core purpose and contains no filler, though the structure is somewhat run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and annotations, the description provides a thorough picture: return fields are enumerated, error behavior (NOT_FOUND) is specified, and the confidentiality warning covers an important handling concern. For a simple read tool, this is fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter description already explains the ex_ prefix and the current-pair requirement. The tool description mostly restates this constraint and adds no new parameter-level meaning, so it remains at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('读回'/'read back') with the resource 'exercise' and explicitly lists the returned fields (prompt, reference_answer, expected_concepts, tags, lesson info). This clearly differentiates it from siblings like add_exercise (creating) and grade_exercise (grading).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use: '批改前先审教材用这个' (use this to fetch the problem statement and grading criteria before grading). It provides clear context, though it does not explicitly name alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_learner_briefA
开课前先调这个: 读回学生模型 (learner_hypotheses / post_lesson_evaluations / teacher_reflections), 不用自己扒表。输入 { pair_id?, limit? } (limit 默认 5, clamp [1,20]; pair_id 缺省用当前 active pair)。返回: top_confidence_hypotheses (在场假设按 confidence 降序取 top-limit) + needs_reverification (在场假设里 last_verified_at 最老/为空的前 2 条, 该复验了) + recent_evaluations (最近 3 条 PostLessonEvaluation 摘要, 含 agent_observation) + latest_reflection (最近一条 TeacherReflection 的 method/next_action) + confidence_facts (近三课把握度中性事实聚合: lesson_ids + total_count + overall_accuracy + by_level[{level,count,accuracy}], 纯数字词频——没有形容词、没有"她低估/高估自己"这类判词, 也没有百分比锚值; 没数据时为 null) + source_material (自带教材条款一行亮灯: 当前合约带 source_material 时给"教材:《书名》·档位", 档位语义/外延标记纪律见 skill workflow/lesson-prep 教材模式; null=当前合约没谈教材)。学生主权红线: allowed_for_teaching=false 的假设一律不吐 observation/domain/confidence 等内容, 只回 {id, allowed_for_teaching:false, redacted:true} —— 冻结的假设不该被这个读回口子悄悄泄回教学决策。Etag 契约: 返回体带 brief_etag (内容指纹, generated_at 不计入) —— 与上次同参数调用一致 ⇒ 学生模型没变, 可复用上次已读内容不必重读。pair_id 不存在时报错并附可用 pair 列表. 可选 lesson_id — 传了且这节课有挂锚反思(teacher_reflections.lesson_id 命中)时, latest_reflection 优先给这节课的那条; 没有挂锚数据时退回原有的 pair 级最新一条。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | default 5, clamp [1, 20] | |
| pair_id | No | ||
| lesson_id | No | 可选——传了会优先按这节课过滤 latest_reflection(反思挂锚)。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden—and it excels. It discloses default/clamping behavior for limit, active-pair fallback for pair_id, redaction of forbidden hypotheses, etag caching semantics, error behavior with available pairs, and lesson_id preference with fallback. It even details the semantics of confidence_facts (pure numeric, no adjectives/percentages).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but extremely dense and well-structured with labeled return sections, a 'red line' redaction note, an etag contract, and fallback logic. Each sentence adds distinct information; there is no filler or repetition. The upfront '开课前先调这个' is a high-signal opening.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description fully compensates by enumerating every return field with precise semantics, including edge cases (null confidence_facts, redacted hypotheses, lesson_id no-match fallback), error behavior, and caching. For a 3-parameter tool with no annotations and no output schema, this description is complete and self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (pair_id lacks description), but the description compensates fully by explaining pair_id's default (current active pair), limit's default and clamp, and lesson_id's filtering/fallback semantics. It adds behavioral meaning far beyond the schema, including which parameters are optional and their interaction with the return payload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pairing ('读回学生模型'), states when to invoke ('开课前先调这个'), and enumerates exactly what is returned. It clearly distinguishes this from generic getters by scoping to learner_hypotheses / post_lesson_evaluations / teacher_reflections and explicitly says not to manually query tables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states '开课前先调这个' as the primary usage context and instructs the agent to avoid manual table reads ('不用自己扒表'). It also gives conditional guidance for optional parameters (like lesson_id fallback behavior). It does not name alternative sibling tools for exclusion, but the context is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lessonA
读回一节课: 标题 / 结构 (概念+习题清单) / 发布状态 (published: published_at 非空=已发布, 空=草稿) / 正文。默认紧凑 (include_content 缺省 false): 只给结构与元数据 + content_chars 全文字数 + 开头节选, 不吐全文 — token 经济。要读全文 (批改前审教材 / resume-teaching 冷启动接课) 显式传 include_content: true, 返回体多一个 content_markdown 字段 (可能很长, 确认要再开)。只能读当前 pair 的课, 其他 pair (或不存在) 的 lesson_id 一律 NOT_FOUND。
| Name | Required | Description | Default |
|---|---|---|---|
| lesson_id | Yes | 必填; 要读回的 lesson id (lsn_ 前缀), 须属当前 pair | |
| include_content | No | 可选, 默认 false (紧凑: 结构+元数据+节选)。true = 附 content_markdown 全文 — 只在真要读课文时开。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the default compact behavior, the optional full-content flag, the inclusion of content_chars and an excerpt in compact mode, the error behavior (NOT_FOUND for non-current pairs), and the potentially long content_markdown. This is far more transparent than typical tool descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense paragraph that front-loads the core purpose and then efficiently covers behavior, parameters, and constraints. Every sentence adds detail: token economy, error case, and pair restriction. There is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given only 2 parameters, no output schema, and no annotations, the description is remarkably complete. It explains the default response shape, the optional field, the error condition, and the intended use cases. An agent can decide whether to invoke the tool and with what arguments without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, so the baseline is 3. The description adds significant value beyond the schema: it explains the default value of include_content (false), the token-economy rationale, specific use cases for true, and the constraint that lesson_id must belong to the current pair. This elevates the score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '读回一节课' (read back a lesson), specifying a clear verb and resource. It enumerates exactly what is returned (title, structure, publish status, body), and distinguishes itself from siblings like get_lesson_closure_state by focusing on the lesson's full content and metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the default compact mode (token economy) and when to pass include_content=true, citing concrete use cases such as grading prep and resume-teaching cold start. It also clarifies the limitation that only the current pair's lessons are accessible. It does not name alternative tools for explicit comparison, but the guidance is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lesson_closure_stateA
关课前先调我——顺序、缺口、下一步和 id 都替你串好,不用脑内记账。只读, 复用 close_lesson_loop 同一份事实装配 (lib/lesson-closure-facts.ts), 不改动任何状态。返回 { lesson_id, state, completed[], missing[], next_required_action, incorrect_review_signal }。state 是"首个缺口的语义名"(graded/live_completed/live_evidence/live_evaluation/post_lesson_evaluation/reflection 之一), 或 ready_to_close(万事俱备只差调 close_lesson_loop), 或 closed(已关课, 终态)。读法警示: state 点名的是"当前卡在哪一项"——它指的是还欠着的待办, 不是已达成的成就, 所以 state=graded 时 missing[] 里同时出现 graded 是同一句话说了两遍, 不是矛盾; 已完成的项只看 completed[]。live_completed/live_evidence/live_evaluation 三项只在本课挂过 Live 时出现。next_required_action 是 {tool, pre_filled_refs} —— 能预填的 id (submission_id/session_id/live_session_id/lesson_id) 已经替你摘出来了, closed 时为 null。incorrect_review_signal (错题卡事实行) 是纯陈述, 不进 missing[], 不带 severity: {incorrect_submission_count, concepts_with_flashcard, concepts_total} —— 本课判错提交数, 以及这些判错习题涉及的概念里已经挂了闪卡的比例, 读读即可, 不是缺口, 不阻塞关课。
| Name | Required | Description | Default |
|---|---|---|---|
| lesson_id | Yes | 必须是已存在的 lesson id(server 会查存在性) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
没有 annotations 提供只读/破坏性提示,描述承担全部责任。它明确声明'只读、不改动任何状态',并详细披露了 state 的语义陷阱(state 是首个缺口而非已达成项)、Live 相关字段出现的条件、incorrect_review_signal 不参与阻塞关课等,远超最低要求,行为边界非常透明。
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
信息密度很高,每句话都有实质内容,并且把最重要的一句话('关课前先调我')放在开头。但整体是一大段中文长句堆叠,没有使用列表或分段来分隔返回字段、状态语义、读法警示等不同主题,快速扫读时略显费力,因此扣 1 分。
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
无输出 schema,描述必须承担解释返回值的责任。它完整覆盖了返回对象的所有字段(lesson_id、state、completed[]、missing[]、next_required_action、incorrect_review_signal),并解释了每个字段的取值含义、边界条件和 null 情况,对预检工具来说是闭环的。
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
输入 schema 对单个参数 lesson_id 已有 100% 覆盖('必须是已存在的 lesson id,server 会查存在性'),描述没有额外补充参数格式或约束。虽然描述中提到了预填 id 列表包含 lesson_id,但并未直接增强参数语义,因此给予高 schema 覆盖下的基线 3 分。
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
描述开门见山指出工具是关课前的预检调用('关课前先调我'),并说明其作用是把顺序、缺口、下一步和 id 串好。同时明确与兄弟工具 close_lesson_loop 的关系:复用同一份事实装配但不改动状态,清晰区别于写操作工具,目的明确且具有辨识度。
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
明确给出使用时机:关课前先调用;同时通过'只读'和'复用 close_lesson_loop 同一份事实装配'隐含了与写操作工具的替代关系,并说明 closed 状态时 next_required_action 为 null,帮助调用方理解何时无需再操作。虽未逐一列举其他替代工具,但对本工具的核心使用场景和边界交代充分。
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_submissionA
读回一份学习者提交: learner_answer 答案正文 / status 批改状态 (枚举 draft | submitted | pending_grade | graded) / agent_score / agent_feedback / 把握度 (confidence, 可空) / 所属 exercise 链 (exercise_id + exercise_prompt_excerpt + lesson_id + course_id)。批改与复盘的读回面 — 配合 get_exercise 取 reference_answer 后再 grade_exercise。只能读当前 pair 的提交, 其他 pair (或不存在) 的 submission_id 一律 NOT_FOUND。
| Name | Required | Description | Default |
|---|---|---|---|
| submission_id | Yes | 必填; 要读回的 submission id (sub_ 前缀), 须属当前 pair |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description thoroughly discloses behavior: it returns specified fields (including enum status, nullable confidence, exercise chain), and it states the crucial constraint that only the current pair's submission works—other or nonexistent submission_ids return NOT_FOUND. This goes well beyond a bare schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although a single long sentence, the description is densely packed and well-organized with slashes, enumerations, and an em-dash. Every clause adds functional information—return fields, statuses, nullability, scoping, and error behavior—with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description fully compensates: it lists all return fields, specifies enum values, notes nullable confidence, explains the exercise chain, and discloses the NOT_FOUND behavior. It also positions the tool in a larger grading workflow, making it complete for its simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes the single parameter (submission_id, required, sub_ prefix, must belong to current pair). The tool description essentially restates the 'current pair' constraint without adding new semantic nuance. With 100% schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('读回' / read back) and resource (a learner's submission), listing the exact fields returned. It also distinguishes itself from siblings by framing it as the read-back side for grading and review, separate from get_exercise and grade_exercise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context for when to use: it is for '批改与复盘' (grading and review), and it instructs to pair with get_exercise to fetch reference_answer then grade_exercise. It doesn't list exclusions but clearly frames the workflow and complementary tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_teacher_inboxA
增量教师待办清单 (Agent Surface Hardening 第一批, P1) — 醒来先看这个而不是自己拼 live_pending + submissions + adhoc 好几刀. 输入 { pair_id?, since? } (since 缺省=全量, ISO 时间戳游标——服务端不维护游标状态, 消费方自己记住 max(occurred_at) 下次传回). 来源: 待批改 submission / 无 reflection 的已结束 live session / 学习者新 adhoc 消息 / 近 24h 同一张卡 ≥3 次 Again / proposed 未签合同. 每项 { item_id(确定性), type, priority, resource_refs, recommended_tool, occurred_at }, 按 priority (high→low) 排序, 同优先级按 occurred_at 升序. 无待办返回空数组. 另附 open_feedback 段 (现场反馈笔): status=open 的学习者反馈 count + 最近若干条摘要 (kind/原话节选/挂锚/账龄)——纯发光提醒, 软牙齿: 不阻塞任何闭环动作, 回应它用 update_feedback_status.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ISO timestamp cursor, 缺省=全量待办 | |
| pair_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers rich detail: server statelessness (consumer must track cursor), deterministic item IDs, sorting rules, empty-array return, and non-blocking open_feedback behavior. This exceeds typical transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, input semantics, sources, output fields, sorting, and special segment. Front-loaded with the primary action and cleanly structured into logical sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the absence of an output schema, the description thoroughly explains return fields, sources, cursor behavior, pagination state, and the open_feedback section. It is fully actionable for an agent without external context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%; the description adds helpful semantics for 'since' (default full list, ISO cursor, stateless behavior) but provides no explanation for 'pair_id' beyond indicating it is optional. A partial compensation, leaving a notable gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this is an 'incremental teacher todo list' and explicitly differentiates from sibling tools by saying 'look here first instead of piecing together live_pending + submissions + adhoc'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool 'when waking up' and names the alternatives (live_pending, submissions, adhoc). It also directs open_feedback handling to update_feedback_status, providing clear guidance on when to use it versus a related tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grade_exerciseA
批改一条 ExerciseSubmission. agent 异步收到 pair://exercises/pending 后调用. 判错递笔: score 给了且落进判错区间时, 回执带 concept_refs (这道题已解出的概念 id, 白拿, 不用你再走一遍 exercise→concept) + human_note 一句顺手提示——配不配张针对性闪卡纯属你裁量, 不进 next_recommended_actions, 不是义务。重批持证: 已 graded 的提交要改判, 必须显式带 regrade: true——缺省会被 CONFLICT 拒绝。改判自由, 痕迹免费: 放行时旧判决摘要 (previous_score/previous_feedback) 自动写进追加的 exercise.graded 事件 payload, 历史不蒸发。
| Name | Required | Description | Default |
|---|---|---|---|
| score | No | 可选;0..1 的软评分(闭区间),85% 请写 0.85,不要写 85——server 会拒绝越界值 | |
| regrade | No | 改判意图声明: 该提交已有判决 (status=graded) 时必须显式传 true 才放行; 首判不需要。 | |
| feedback | Yes | ||
| submission_id | Yes | ||
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It extensively details side effects and conditions: the wrong-answer flow includes concept_refs and human_note in the receipt, regrading requires explicit regrade: true to avoid CONFLICT, and successful regrading appends previous_score/previous_feedback to a new exercise.graded event. These disclosures go far beyond the schema and provide substantial transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and covers multiple aspects (trigger, wrong-answer flow, regrade rules, event traces) in three sentences. Every sentence adds substantive value, though the structure is slightly run-on and could be broken into clearer points. It remains informative without being excessive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and lack of output schema, the description provides a good overview of the main workflows: initial grading after async event, wrong-answer specifics, regrade requirements, and event trace behavior. However, it omits details about the correct-answer path (what happens if score is correct) and the full response structure. Despite these gaps, it covers the most critical aspects for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, with score, regrade, and idempotency_key already documented in the schema. The description adds marginal nuance by mentioning the CONFLICT rejection for regrade without the flag, but does not clarify feedback or submission_id beyond their names. Since the schema already covers most parameter semantics, the description adds minimal additional value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: '批改一条 ExerciseSubmission' (grade an ExerciseSubmission), with a specific verb and resource. It also differentiates from siblings by describing the asynchronous trigger (pair://exercises/pending) and the specific grading workflow, which is distinct from other tools like add_exercise or get_submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it should be called after receiving the async event pair://exercises/pending, and explicitly explains the regrade workflow (must pass regrade: true for already graded submissions, otherwise CONFLICT). However, it does not explicitly name alternative tools for related tasks, so it falls short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_heartbeatA
Agent 端 keep-alive. 在 ttl_seconds 内 bridge 算 online. ⚠️ ttl_seconds 是在线判定窗口, NOT 轮询间隔. 值更契约 v3: 等待不烧模型回合(红线: 禁止模型层轮询), 用看门脚本/live_wait/你家自己的监听机制均可, 见 recipe://live-teaching. 看门脚本会替你打心跳; 走 live_wait 的, 它自带 auto-heartbeat. 回应契约(单层 v3): 实质回答质量优先, 不设硬秒数, 在场感由在线灯负责不由报文. (旧 context_status 参数已退役——上下文余量指示灯已整体拆除, 心跳只管在线.)
| Name | Required | Description | Default |
|---|---|---|---|
| pair_id | No | ||
| ttl_seconds | No | default 60, clamp [15, 600] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure. It explains key nuances: ttl_seconds semantics, the 'waiting does not burn model turns' contract, and the retirement of context_status. However, it does not disclose return values, error handling, or whether the call is idempotent, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence carries relevant information, covering purpose, warnings, and contracts. It is front-loaded with the core purpose and then elaborates on nuances. Slightly longer than strictly necessary, but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers many contextual aspects: purpose, ttl semantics, usage alternatives, and legacy deprecation. However, it lacks details on pair_id, return values, and mechanics of how the heartbeat is recorded or used. Given the absence of an output schema and annotations, these gaps affect completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: ttl_seconds has a schema description, pair_id does not. The description adds meaningful semantics for ttl_seconds by clarifying it is an online window, not a polling interval, but it never explains pair_id. Since pair_id is undocumented in both schema and description, the compensation is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as an 'Agent 端 keep-alive' and defines the online window via ttl_seconds. It distinguishes itself from related tools by mentioning live_wait's auto-heartbeat and the retired context_status parameter, though it does not name sibling tools directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: it warns that ttl_seconds is an online determination window, NOT a polling interval, and explicitly forbids model-layer polling. It suggests alternatives (watchdog script, live_wait, custom listeners) and points to a recipe, making the when and when-not usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_message_sendA
追加一条 Teaching Move (Live Teaching 结构化教学). 会话第一条 move (seq=1) 必须 move_type="FRAME"——否则结构化拒绝, 不接受其他类型开场. FRAME content 须覆盖三要素: 本场做什么/多久/怎么算完. ASK/PROBE/CHALLENGE 必须 response_kind="text". REFLECT 必须 "none". content 控制在 300 中文字以内 (EXPLAIN). 一个 move 只做一件事. 自由对话/答疑请用 adhoc_message_send.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| payload | No | ||
| move_type | Yes | FRAME|ASK|EXPLAIN|PROBE|HINT|CHALLENGE|REFLECT | |
| source_id | No | ||
| session_id | Yes | ||
| source_type | No | ||
| response_kind | Yes | none|text|continue — none 不交轮(轮次留在老师), text/continue 交轮等学习者 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that non-FRAME openings are structurally rejected, enforces first-move sequencing, and defines response_kind/content rules. It stops short of describing return/error format or session lifecycle, but it gives substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded, with each sentence covering a useful rule. It is slightly long due to multiple conditional constraints, and the parenthetical '(EXPLAIN)' is ambiguous, but there is no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no annotations and no output schema, the description misses key aspects: payload is an object but its purpose is never explained, source_id/source_type are unmentioned, and error/return behavior is vague ('结构化拒绝' not elaborated). The main Teaching Move flow is well covered, but the overall contract is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 38%, but the description compensates by constraining move_type (FRAME-first), response_kind (text/none rules), and content (300-char limit, single responsibility). It does not explain payload, source_id, or source_type, so it is not fully comprehensive, but key parameters gain significant meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with '追加一条 Teaching Move (Live Teaching 结构化教学)', clearly identifying the verb (append) and resource (structured Teaching Move). It also implicitly distinguishes itself from adhoc_message_send, and the closing sentence explicitly names the sibling for free-form chat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides detailed usage rules: first message must be FRAME, alternatives for free conversation/Q&A are explicitly delegated to adhoc_message_send. It also states constraints (ASK/PROBE/CHALLENGE require text response_kind; REFLECT requires none; content <=300; one move = one thing).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_pendingA
这不是值更工具 —— 值更请挂 live_wait 或后台看门脚本 scripts/live-watch.py, 反复空手调用这个属违纪(值更契约红线)。live_pending 只做一件事: 拍一张 Live Teaching pending queue 的快照 (bridge 状态 + 按优先级排序的 sessions, ad_hoc_question > ad_hoc_response > session_start > guided_response), 不阻塞、不等待。没传 pair_id 时用当前 active pair. 牙齿: 同一 pair 在 90s 内连续 6 次空手调用 (queue 里什么都没有) 会在回执里附结构化警告字段, 连续 12 次直接拒答该次查询——真有 pending 数据的调用永远正常返回并重置计数, 牙齿不吞真实数据。值更契约 v3(方法自由): 看门脚本 scripts/live-watch.py 与 live_wait 阻塞调用是平级合法路径, 你家 harness 有更好的监听机制也行——考核只看红线加四条目标, 见 recipe://live-teaching。每个 live_teaching item 带 pending_reason (session_start / learner_response_waiting / agent_owes_move): agent_owes_move 类只在 pending 快照出现, 不走 wait 事件流——欠的 move 是你的债, 不是学习者的事件。
| Name | Required | Description | Default |
|---|---|---|---|
| pair_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden and does so thoroughly. It discloses anti-abuse 'teeth': 6 empty calls in 90 seconds attach a warning field, 12 reject the query, and real pending data resets the counter. It also clarifies that agent_owes_move items appear only in snapshots and not in the wait event stream, plus defines what the snapshot contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and information-rich, but it front-loads a warning rather than the core purpose and mixes multiple concerns: anti-abuse rules, contract v3, priority ordering, and pending_reason taxonomy. While every sentence has value, the structure could be tighter and more purpose-first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This tool has no output schema and no annotations, yet the description covers the snapshot content, sorting priority, non-blocking nature, anti-abuse thresholds, fallback pair behavior, and event-stream semantics for agent_owes_move. It even points to recipe://live-teaching for further contract details, making it complete for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, pair_id, has zero schema description coverage, but the description compensates by stating that omitting it uses the current active pair. It does not specify the expected format or how 'active pair' is resolved, but for a single optional parameter this is sufficient practical guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'live_pending 只做一件事: 拍一张 Live Teaching pending queue 的快照' (live_pending only does one thing: takes a snapshot of the Live Teaching pending queue), including priority ordering and non-blocking semantics. It also clearly distinguishes the tool from sibling live_wait and watchdog scripts, making its unique role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it warns '这不是值更工具' (this is not the duty tool), instructs the agent to use live_wait or scripts/live-watch.py for duty monitoring, and declares repeated empty calls a contract violation. It also explains fallback behavior when pair_id is omitted, using the current active pair.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_session_cancelA
中止 session (learner 提前结束或 system 超时). idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | ||
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses idempotency, a key behavioral trait for retries, and mentions the two termination contexts. However, it does not explain side effects (e.g., whether session data is invalidated) or any permissions required, leaving some transparency gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with only two clauses, and every word contributes meaning. It front-loads the primary action and adds idempotency as essential context. This is exemplary conciseness without losing informational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, and the description covers its core purpose and idempotency. However, it does not describe the return value or error cases, and it omits any prerequisites (e.g., session must be active). Given the presence of sibling lifecycle tools, a fuller context would help agents avoid misuse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%; only idempotency_key has a schema description, while session_id does not. The tool description does not clarify session_id's semantics or format. Since the description does not compensate for the missing schema description, parameter understanding is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states '中止 session' (terminate session), identifying the verb and resource. It also mentions two specific trigger scenarios (learner early end or system timeout), which distinguishes it from siblings like live_session_complete, which likely handles normal completion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: use when a session ends prematurely or times out. It does not explicitly name alternatives or exclusions, but the trigger scenarios imply when this tool is appropriate relative to completion tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_session_completeA
收课——Live 收尾的一次写作动作 (一次判决原则). REFLECT 三段全部必填, 缺任一即拒收: summary (她这节课学了什么——短判词, 不复述课堂过程) / teacher_reflection (薄弱环节, 直白不吹捧) / next_action (下次课的钩子, 具体到下一步该练什么). 这三段学习者会在课文页直接读到——写成给她看的人话, 内部 id (tr_/evt_/snap_ 等) 一律不进正文; 要给判词锚证据, 填 evaluation.evidence_refs (那才是机器引用通道, 服务端验 id 存在与同 pair 归属)。id 只有一个归宿: evidence_refs (2026-07-26 口径收窄——agent_observation 已在学习者折叠区可见, 不再是纯内账, 故原"写内账或 evidence_refs"的二选一作废)。 可选 evaluation 随行——同一次调用把这场的现场评估一并落库 (等价于紧接着调 record_live_evaluation, 一场一评, 已有场评时不覆盖), 收课+场评从此是一次动作, 不必分两笔写两段长文. status → completed, awaiting_role → none, ended_at 只在首次完成时打. 幂等: session 已是 completed 时重复调用不再改 session, 原样回执 "已于 <首次 ended_at> 完成, 本次为幂等重放, 未改动", ended_at 保留首次值 (带 evaluation 且该场还没有场评时, 场评仍会补写). 收课握手: 调用前确认——学习者最后一题已单独判过 (对错+点评自成回合), 且她已明确表态收课; 顶着未判的消息、或没等她点头就 complete, 违反 live-teaching 红线. 下课铃机器门禁: 本场必须已有学习者收课宣告 (learner_close_declared_at, 她在 Live 房内亲手按的下课铃)——未宣告时本工具 CONFLICT 拒收官; 若她已口头表示结束, 请引导其按下 Live 房内的下课铃后再收官 (铃响会追加 live.learner_close_declared 事件, live_wait/live_pending 都看得见). cancel 不受此门 (取消≠收官).
| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | 必填, 非空——她这节课学了什么: 短判词, 不复述过程。**学习者在课文页直接读这一段**: 写人话不写机器词, 内部 id 不进正文——需要锚到具体对话条目时, 把 id 填进 evaluation.evidence_refs (机器引用通道), 判词本身保持可读。 | |
| evaluation | No | 可选——收课同笔写入这场的现场评估 (一次判决原则: 收课+场评一次动作)。字段与 record_live_evaluation 相同 (live_session_id 自动取本场)。该场已有场评时幂等返回既有那条, 不覆盖。 | |
| session_id | Yes | ||
| next_action | Yes | 必填, 非空——下次课的钩子, 具体到下一步该练什么。**学习者在课文页直接读这一段**: 写人话, 内部 id 不进正文 (要锚证据填 evaluation.evidence_refs)。 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| teacher_reflection | Yes | 必填, 非空——薄弱环节, 直白不吹捧。**学习者在课文页直接读这一段**: 写人话, 内部 id 不进正文 (要锚证据填 evaluation.evidence_refs)。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: idempotency ('session 已是 completed 时重复调用不再改 session...回执...'), status transitions ('status → completed, awaiting_role → none, ended_at 只在首次完成时打'), evaluation overwrite semantics ('已有场评时不覆盖'), and conflict behavior. It even explains historical rule changes (2026-07-26 口径收窄), ensuring the agent knows exactly what side effects to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense, single-paragraph wall of text, but it is front-loaded with the core purpose and every sentence carries critical operational information (required fields, learner visibility, ID policy, idempotency, preconditions, gate). It could be improved with bullets or section headers, but there is little fluff; the historical note about 2026-07-26 is slightly meta but clarifies a rule change, so a 4 is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (stateful session completion, optional nested evaluation, idempotency, hard preconditions) and lack of both annotations and an output schema, the description is remarkably complete. It covers success behavior, failure modes (CONFLICT), idempotent replay details, side effects on session fields, and how to verify prerequisites. The description fully equips an agent to invoke the tool correctly and know what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (83%), so the baseline is 3, but the description adds significant parameter-level meaning beyond the schema: it emphasizes that all three REFLECT fields are mandatory and rejection occurs if any is missing, clarifies that internal IDs must never appear in the text and only belong in evaluation.evidence_refs, and explains the evaluation object's relationship to record_live_evaluation. This goes beyond the schema's descriptions, warranting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '收课——Live 收尾的一次写作动作' (closing a session—a single writing action at the end of Live), which clearly identifies the verb (complete/finalize), resource (live session), and purpose. It also distinguishes from siblings by noting 'cancel 不受此门 (取消≠收官)' and explicitly equates the optional evaluation to a separate call to record_live_evaluation, making the tool's unique role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: it lists prerequisites ('调用前确认——学习者最后一题已单独判过...且她已明确表态收课'), a hard gate ('必须已有学习者收课宣告...未宣告时本工具 CONFLICT 拒收官'), and exclusion ('cancel 不受此门'). It also tells the agent what to do if the learner has only verbally ended (guide them to press the bell), and references alternative tools like record_live_evaluation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_session_getA
读 LiveSession 全貌 (session + 全部 moves + 全部 responses). 决定下一步前必读.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of behavioral disclosure. It transparently states that this is a read operation returning the full session, all moves, and all responses. It does not cover potential performance costs or explicit side-effect disclaimers, but the read-only nature is implied and the return scope is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one main clause stating the read scope and a short usage directive. Every word earns its place, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter getter, the description covers purpose, return contents, and usage timing. It could add more about output structure or performance implications, but the tool is simple enough that the description is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one required string parameter (session_id) with no description, and the description does not mention session_id at all or add any format/constraint context. Since schema coverage is 0%, the description should compensate but does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb '读' (read) with an explicit resource 'LiveSession 全貌' and enumerates the scope: session + all moves + all responses. This differentiates it from sibling tools like live_session_start, live_session_complete, and live_snapshot_get_latest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'决定下一步前必读' explicitly tells the agent when to use this tool: before deciding the next step in a LiveSession. It does not name alternatives or exclusions, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_session_startA
开一场新的 Live session —— 学习者裁决 (2026-07-20): 学习者侧 web 的 Start Session 按钮已退役, 开课正门收窄到这里, 老师(agent)侧主动开课。context_type 默认 "lesson"。同课已有 active 教室时不开新场,直接送你进既有会话(joined_existing)。
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| context_id | Yes | ||
| context_type | Yes | lesson|flashcard|trial|mindmap|highlight | |
| context_preview | No | ||
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on the full burden of behavioral disclosure. It adds important details: default context_type 'lesson', and that an existing active room leads to joining rather than starting anew (joined_existing). However, it does not mention return values, success/error outcomes, or permission requirements, leaving some transparency gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that packs several critical facts: the entry point change, schema default, and existing-session behavior. It is front-loaded with the core action and avoids filler, though the date and narrative could be more compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key scenario and the joined_existing edge case, which is valuable. However, without an output schema, it leaves return behavior undefined, and several parameters (goal, context_preview) remain unexplained. The tool is usable but not fully self-contained for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40% (context_type and idempotency_key have descriptions). The description adds meaning by stating context_type defaults to 'lesson', but it does not clarify the roles of goal, context_id, or context_preview. This is a partial, not full, compensation for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states its purpose: starting a new live session, and clearly identifies the actor (teacher/agent side) and the context (learner-side button retired). It distinguishes itself from sibling tools like live_session_complete/cancel/get by focusing on the 'start' behavior, including the edge case of joining an existing session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance: it is the main entry point for opening a class from the teacher/agent side, with the learner web button retired. It also outlines behavior when an active classroom already exists. It does not explicitly list alternatives, but the context strongly implies when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_snapshot_get_latestA
读 session 最近一份 mid-lesson snapshot. compact 恢复时第一步: snapshot + 之后的 moves = 续上 session 的最小集.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden. It indicates a read operation ('读') and adds context about the recovery workflow, but does not mention error handling, permissions, or the return format. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, with two short sentences front-loading the core purpose and a key usage note. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description gives the core purpose and a usage context that implies the return value (the snapshot). It leaves a little to be desired about the exact response structure, but is sufficiently complete for its simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The description only mentions 'session' in passing and does not explain the session_id parameter's meaning or expected value beyond the obvious from the name, providing no additional semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('读' / read) and the resource ('session 最近一份 mid-lesson snapshot' / the most recent mid-lesson snapshot of a session). It also distinguishes from siblings like live_snapshot_write by focusing on retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear usage context: it is the first step in compact recovery, with the formula 'snapshot + 之后的 moves' defining its role. It doesn't explicitly list alternatives or exclusions, but the recovery workflow guidance is specific and useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_snapshot_writeA
在 Live Teaching session 中段 flush 一个 rolling checkpoint. 建议每 3 轮写一次. compact 后用 live_snapshot_get_latest 拿回来, 不用重读全部 moves.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | ||
| after_turn_n | Yes | 当前已完成的 move seq | |
| weak_signals | No | 观察到的薄弱点 / 待跟进的概念缺口 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| rolling_summary | Yes | 到目前为止 learner 学到了什么 | |
| current_direction | Yes | 现在 agent 在朝什么方向推 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It states that this is a checkpoint write and that it enables later retrieval without re-reading moves, but it does not disclose overwrite behavior, session state requirements, or failure semantics. The idempotency behavior is only in the parameter schema, not the main description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: purpose, frequency, retrieval, and benefit each get a short sentence. No fluff, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides sufficient context for selecting and invoking the tool: it explains purpose, usage frequency, and how to retrieve the snapshot. It does not explain return values, but no output schema exists, and for a write operation this is less critical. Overall, it is quite complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (83%), so the schema already documents most parameters. The tool description adds the 'every 3 turns' hint for after_turn_n, but overall contributes little beyond schema, matching the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'flush a rolling checkpoint' in a Live Teaching session. It distinguishes this tool from its retrieval sibling by explicitly referencing live_snapshot_get_latest, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: recommended every 3 turns ('建议每 3 轮写一次') and indicates retrieval via live_snapshot_get_latest after compaction, contrasting with re-reading all moves. It lacks explicit when-not-to-use scenarios, but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
live_waitA
一次调用 ≈50 秒静默等待, 数据即到即返, 超时重挂即可 —— 这是等待, 不是轮询。阻塞等待下一个 Live Teaching / AdHoc 事件 (与 GET /bridge/wait 共用同一份等待逻辑, lib/live-wait.ts) —— MCP 原生的零空转值更: 比反复调用 live_pending 省 token, 不用自己算轮询间隔。timeout_s 上限 50 (留出 MCP 客户端自身超时的余量), 缺省即用上限. 超时未等到事件 → timeout=true, events=[], 直接再挂一次即可, 不必先调 live_pending 探路。每次调用顺手续一次 heartbeat (ttl 60), 等待期间在线灯不灭。可选 consumer_id: 传了就走服务端 持久化 delivery cursor (断点续传) —— 同一 consumer_id 下次调用不传 since 就自动从上次的断点继续, 传 since 则视为"上一批我已处理完"的确认并推进游标; 不传 consumer_id 时行为与旧版一致(每次都从此刻起等)。契约版本协议: 每个响应都带 contract_version, 把它作为 known_contract_version 传回, 命中现行版时超时/事件响应都不再重发 live_runtime_contract 全文 (只留 contract_version + may_end_turn), 缺省或版本过期则完整合约照发。值更契约 v3(方法自由): 本工具与后台看门脚本 scripts/live-watch.py 是平级合法路径, 你家 harness 有 自己的监听原语也行——考核只看红线加四条目标, 见 recipe://live-teaching。
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | 可选。带 consumer_id 时: 传 since 等于确认"上一批事件我已处理完", 服务端据此推进该 consumer_id 的持久化游标; 省略则读取上次持久化的游标续等。不带 consumer_id 时: since 仅对本次调用生效(从该游标起等), 不落库。 | |
| pair_id | No | ||
| timeout_s | No | 默认/上限 50, clamp [1, 50] | |
| consumer_id | No | 可选。传了才启用服务端持久化游标 (断点续传); 省略则与旧版行为完全一致。 | |
| known_contract_version | No | 可选。传上一次响应里的 contract_version: 命中现行版 ⇒ 响应省略 live_runtime_contract 全文, 只带 contract_version + may_end_turn; 缺省/过期 ⇒ 完整合约照发 (首次完整)。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears the full burden of disclosure, and it delivers richly. It discloses the blocking wait duration (~50s), the silent wait and immediate return behavior, the timeout semantics (timeout=true, events=[]), heartbeat side-effects (ttl 60), persistent cursor semantics for consumer_id, and the contract version protocol. No behavioral surprise is left undocumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a continuous dense paragraph, which makes scanning harder, but nearly every sentence carries crucial information. It is front-loaded with the core wait semantics and then systematically covers timeout, heartbeat, cursor, and contract version. A bulleted list would improve structure, but given the high information density, it remains appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 optional parameters, no annotations, no output schema), the description is remarkably complete: it explains blocking behavior, timeout handling, heartbeat, cursor persistence, contract version negotiation, and the relationship to alternative tooling. The main omissions are the exact shape of returned events and the purpose of pair_id, but the description covers the core usage contract thoroughly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents 4 of 5 parameters (80% coverage), but the description adds significant behavioral meaning beyond those schema notes. For example, it explains the 'since' parameter as a confirmation to advance the cursor, and describes the auto-resume behavior for consumer_id. However, pair_id remains completely undocumented in both schema and description, which is a notable gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: '阻塞等待下一个 Live Teaching / AdHoc 事件' (block waiting for the next Live Teaching/AdHoc event). It explicitly differentiates itself from live_pending by framing this as waiting rather than polling, and it names the sibling tool ('比反复调用 live_pending 省 token'), which removes any ambiguity about its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives, stating that it is more token-efficient than repeatedly calling live_pending and that it shares logic with GET /bridge/wait. It also tells the user not to call live_pending on timeout ('直接再挂一次即可, 不必先调 live_pending 探路'), which is a clear exclusion. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_contractA
立约前先读 skill intake/contract-establish(prompt _stack 可见全栈)——goal 一句话不足以立好约, 挖掘对话产出 timeline/baseline/cadence 后再填单. 立约对话谈完后, 把 TeachingContract 草案递交给 LS, 状态为等待学习者签字 (setup_status: proposed). 只写 Class A (goal 必答/time_range/success_criteria) + Class B (intensity/interaction_mode/content_modality/pace/weekly_capacity_hours/preferred_time_of_day) — Class C (提醒渠道偏好: push/ical/email 等) 不收, 那是学习者在签字台表单里自己定的. cadence(节奏条款, Contract 2.0)例外: 若立约对话里谈过"定时 or 碎片化学习", 在这里一并写下——它决定的是"存不存在固定节奏约定"这件事本身, 不是 Class C 的渠道细节, 谈过就该带着签字台走, 不用学习者自己再填一遍. source_material(自带教材条款)同理: 学习者带自己的书来学时, 把谈定的教材条款(书名+依赖档位+版本年份)一并记进合同, 见该参数的形状说明. 学习者点开 /contract 页看到草案卡片, 可以拧 Class B/cadence 旋钮再签, 也可以直接 Establish.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | 学习目标, 课程级别的范围 (必填) | |
| pace | No | daily|weekly|flexible | |
| cadence | No | 可选 — 节奏条款 (Contract 2.0). 签约时学习者决定学习节奏: 定时(scheduled) 还是碎片化(fragmented). 形状: {mode:"scheduled"|"fragmented", slots?:[{weekday:0-6(0=周日), time:"HH:MM"(24h), tz:string(IANA 时区)}], reminders:"native"|"none", auto_duty:boolean, weekly_review_nudge?:boolean, prep_rhythm?:"per_lesson"|"batch"}. 提醒本身不由 LS 发出——LS 无推送通道且不该造这一层; 这里只是"存约定 + 亮约定", 立钟(设日历/闹钟等实际提醒动作)由 agent/user 在原生工具里完成. auto_duty=提醒触发时 agent 是否自动上岗值更——涉及学习者额度消耗, 签约对话必须明示询问, 不问不写, 省略时按 false 处理, 不要替学习者猜. weekly_review_nudge 只对 fragmented 有意义——碎片化学习者的温和周复习提醒意愿, 可选. prep_rhythm=备课节奏("课程内容你想怎么长出来?", 见 skill intake/contract-establish): per_lesson(随学而备, 推荐默认)——每课带着上一课的真实表现出生, 探针/评估/难度管线全激活; batch(一次备齐)——先看全貌自己掌节奏, 代价是课与课之间不再互相学习. 整个 cadence 都可省略——未谈节奏条款就不写. | |
| intensity | No | relaxed|standard|hardcore | |
| time_range | No | { start: ISO datetime, end_target?: ISO datetime }. 缺省用 now() 作 start. | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| source_material | No | 可选 — 自带教材条款 (迁移 0040)。学习者带自己的教科书 (EPUB/PDF) 来学时, 把立约对话谈定的条款记进合同: {title:书名(必填), author?:作者, year?:出版/版本年份(时效风险开门见山), reliance:依赖档位(必填)}. reliance 三档: strict(严格, 100%: 结构/顺序/口径全随书, 只讲解不延伸) | anchored(锚定, ~80%: 骨架随书, 每课留外延余地) | inspired(启发, ~60%: 书是出发点, 可重组可大幅外延). 合同是文书不是引擎——这个字段只记谈定的条款, 摄取与教学行为语义住 recipe://first-contract-and-lesson (教材摄取段) 与 skill workflow/lesson-prep (教材模式). LS 不解析文件: 书由你的宿主读, 你来拆解. 未谈教材就不写. | |
| content_modality | No | text|visual|mixed | |
| interaction_mode | No | async|realtime|hybrid | |
| success_criteria | No | ||
| preferred_time_of_day | No | 每项取 morning|afternoon|evening|late_night | |
| weekly_capacity_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the workflow prerequisite, the output status (proposed/waiting for signature), and the important scoping rule (only Class A/B, not C). It also explains when cadence and source_material should be included. However, it omits mention of idempotency behavior and return format, though idempotency_key is present in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately structured for a complex tool. It front-loads the prerequisite (read skill first) and organizes the class hierarchy clearly. Some redundancy exists in the cadence and source_material elaborations, but the length is justified by the need to prevent misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, no output schema, and no annotations, the description is fairly complete: it covers prerequisites, workflow, parameter scoping, and post-submission behavior (user sees draft card and can adjust Class B/cadence). It does not address return values or error cases, but provides enough context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83% (>80%), so baseline is 3. The description adds meaning by grouping parameters into Class A/B/C and specifying under which conditions cadence and source_material should be provided (e.g., if discussed in conversation, or if the learner brings their own book). This supplements the schema's per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states that the tool submits a TeachingContract draft to LS with setup_status: proposed (waiting for learner signature), and defines the exact scope: only Class A + Class B, plus cadence/source_material exceptions. This clearly distinguishes it from sibling tools like update_contract_cadence or void_contract.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use: after the contracting dialogue is finished, and requires reading skill intake/contract-establish first. It also gives when-not-to-use: Class C is not accepted and is instead handled via the signing desk form, while cadence/source_material are exceptions if discussed. This is strong, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_lessonA
把一节课上架给学习者 (Publish Gate)。add_lesson 建的课默认草稿态 (published_at 留空, 仅教师/MCP 侧可见); publish_lesson 服务端直接跑验尺 (与 verify_prep 同一套 validate-prep 判定): 存在 ❌ (FAIL 级) → 拒绝上架并返回红灯清单, 红灯不清零不许翻牌; PASS / PASS_WITH_WARNINGS → 写 published_at, 课进学习者书架 (黄灯过目制归人工, 不阻断)。
| Name | Required | Description | Default |
|---|---|---|---|
| lesson_id | Yes | 必须是已存在的 lesson id(server 会查存在性) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses key behaviors: server-side validation, red-light blocking on FAIL, and setting published_at on PASS. It also notes yellow-light manual review does not block. While it doesn't cover all edge cases (e.g., idempotency replay), the core state transition and failure condition are explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences efficiently convey the workflow: input, validation gate, and outcome branches. The use of domain-specific metaphors (红灯清单, 翻牌) is succinct but may be opaque to some agents. No wasted words; structure is front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main scenario well for a 2-parameter, no-output-schema tool: publish gates, validation outcomes, and side effects. It lacks explicit details on PASS return values and broader error handling, but the core state transition and blocking condition are sufficiently specified. Adequate for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both lesson_id and idempotency_key are already well-documented. The tool description adds context that lessons originate from add_lesson as drafts, which helps interpret lesson_id's semantics, but doesn't significantly enhance understanding beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: publishing a lesson to learners (上架). It distinguishes from siblings by explicitly referencing add_lesson's draft state and positioning this as the Publish Gate. The verb+resource+scope is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after add_lesson, as it explains the draft-to-publish workflow. It mentions verify_prep's same validation logic, providing context but not explicit alternatives or exclusions. The guidance is clear enough for an agent to decide when to call, though not as prescriptive as naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_learner_feedbackA
现场反馈笔: 学习者在日常消息里提出关于产品或教学的 issue/idea 时, 用这支笔落账——反馈没有专用 UI 入口, 她的每一个普通输入框都是入口, 识别是你的义务。逐字纪律: text 存她的原话, 不是你的转述——转述是二次判决, 原话才是证据。挂锚 (lesson_id/live_session_id/exercise_id 可选): 填了就必须真实, server 校验存在性 + 属于当前 pair; source_message_ref 是自由文本引用 (live 消息可能活在 bridge 事件流里), 只存不校验。落账必回执: 记录成功后, 你必须在同一回合向学习者回一句确认——她要知道她的话被记下了, 静默落账等于没落账。软牙齿: open 反馈只在 get_teacher_inbox 发光提醒, 永不阻塞 close_lesson_loop。观察边界(禁区)变更也走这支笔 (Settings 观察禁区 UI 已撤下, 边界协商回到第一序对话)——学习者在对话里谈"不要再观察/记录某类"或"撤回某个边界"时, 用 boundary_update 参数带上; 绝不能凭对话印象私自认定/静默生效, 不填 boundary_update 就不改变任何边界。
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | 封闭两类, 没有第三种: issue=问题/障碍 (产品或教学哪里不对), idea=想法/建议 (她想要什么). | |
| note | No | 可选。老师落账时的补充说明 (存入 status_note; 之后 update_feedback_status 带 note 时会覆盖). | |
| text | Yes | 必填。学习者的原话, 逐字——不许转述、不许润色、不许翻译成你的话. | |
| lesson_id | No | 可选挂锚——反馈发生时正在学哪节课。填了会校验: 存在且属于当前 pair. | |
| exercise_id | No | 可选挂锚——反馈针对哪道题。填了会校验: 存在且 (经 lesson→course) 属于当前 pair. | |
| boundary_update | No | 可选。只在这条反馈本身就是一次观察边界(禁区)请求时才填——不要脑补, 只在学习者原话真的在谈"不要观察/记录某类东西"或"这个可以恢复观察了"时才带。{action:"add"|"remove", boundary: 非空字符串(禁区类别名)}。add=新增禁区、remove=撤销既有禁区, 均幂等(已是目标状态则原样返回, 不报错、不二次写入)。与本工具的 text(反馈原话)在同一次调用里原子落账——不另开审计表, text 字段本身就是这次边界变更的逐字留痕, 这也是把它折进这支笔而不单开工具的原因。生效时点: 下一次 get_learner_brief 才会体现, 当前进行中的这轮教学看到的仍是旧边界。 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| live_session_id | No | 可选挂锚——反馈发生在哪场 Live。填了会校验: 存在且属于当前 pair. | |
| source_message_ref | No | 可选自由文本引用——她这句话出自哪条消息 (adhoc message id / bridge event id / 你能指认的任何 ref)。不校验, 只存. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the verbatim text requirement, server-side validation for anchors, non-validation of source_message_ref, the mandatory confirmation receipt, the non-blocking 'soft teeth' behavior, and idempotent boundary updates with delayed effect. This is rich behavioral transparency beyond basic read/write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense; each clause adds behavioral or contextual detail. It front-loads the core purpose in the first sentence, though the single-paragraph structure could be more scannable. For a 9-parameter tool, the length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's role, usage scenarios, parameter semantics, edge cases (idempotency, boundary updates), and postconditions (receipt, soft teeth). It even explains why boundary updates are folded into this tool and the effective timing. Complete for a complex tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters, but the description adds crucial semantics: text must be verbatim original words, anchors are validated for existence and pair ownership, source_message_ref is unvalidated, boundary_update's idempotency and atomity with text, and idempotency_key's purpose. This significantly augments the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '现场反馈笔' and immediately clarifies it records learner issues/ideas from daily messages, with no dedicated UI. It clearly distinguishes from sibling recording tools by specifying the subject (learner feedback) and the unique 'every input box is an entry' behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use: when the learner raises a product/teaching issue or idea in daily messages, and also when a boundary change is requested. It doesn't name alternative tools but provides clear contextual triggers, and mentions that boundary changes must go through this tool rather than being assumed silently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_learner_hypothesisA
写一条 LearnerHypothesis (3 课之后才允许首次写, agent 自己 enforce). 若 domain 命中学习者的观察禁区登记簿, 直接不写入 (不报错, 返回说明). 禁令 (Confidence 主权立法): 关于学习者 confidence 水平/校准好坏的推断——"她的把握度偏低" "她高估/低估自己" 这类判词——不得作为 hypothesis 记录。那是当次反思(reflect_on_teaching)才配装的东西, 不是可教状态, 不许经这个工具进 learner_hypotheses/学生画像的前馈通道。 生命周期扩展 (同一支笔的续写面): 带 hypothesis_id + action 时不再创建, 而是对既有假设做 reinforce(证据续期: last_evidence_at 推到当下, 可附 evidence_event_ids 追加)/revise(新文本超越: 旧行转 expired 留痕, 新行承接在场状态与证据账, 回执给 superseded_hypothesis_id)/retire(老师判旧转 expired, 与学习者 reject 分属两支)。主权层级: confirmed/rejected/frozen 是学习者判决——rejected/frozen 三动作全拒, confirmed 只许 reinforce。没有证据喂养的假设在简报里会读作 stale (纯提示, 不自动退役)——有证据就 reinforce, 被推翻就 revise/retire, 别让账本长灰。
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | reinforce=证据续期 revise=新文本超越(旧行留痕) retire=老师判旧。与 hypothesis_id 成对出现; 不带则走创建路径。 | |
| domain | No | 创建路径必填; 带 action 时忽略 (沿用原行 domain)。 | |
| confidence | No | 0..1。创建路径必填; revise 可选 (缺省沿用旧行); reinforce/retire 忽略。 | |
| observation | No | 创建路径与 action=revise 必填 (revise 的新文本); reinforce/retire 不需要。 | |
| hypothesis_id | No | 生命周期动作的目标假设 id——与 action 成对出现, 单给报错。 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| evidence_event_ids | No | 创建时初始证据; reinforce/revise 时追加进原行证据账 (去重)。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so richly: forbidden-domain writes silently return an explanation without error, rejected/frozen/confirmed sovereignty rules are spelled out, revise leaves expired traces, and stale hypotheses are only hinted at without auto-retirement. This goes far beyond minimal mutation disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core purpose, and every sentence carries necessary policy or behavioral information. However, it is a single long unbroken paragraph mixing creation rules, prohibitions, lifecycle semantics, and sovereignty; bullet or section structure would improve scanability. Only a minor structural deduction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema or annotations, the description still covers purpose, creation timing, prohibited domains, lifecycle behavior, sovereignty rules, stale status handling, and even the no-write response behavior. It provides enough context for an agent to select and correctly invoke the tool in complex scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds substantial meaning beyond the schema: pairing hypothesis_id with action switches to lifecycle mode, giving hypothesis_id alone errors, domain triggers a forbidden-registry check, evidence_event_ids append to the existing evidence ledger, and action-specific parameter requirements are clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '写一条 LearnerHypothesis' (write a LearnerHypothesis), specifying the exact verb and resource, then immediately describes lifecycle variants (create/reinforce/revise/retire). It explicitly distinguishes itself from reflect_on_teaching by stating that confidence-level judgments belong to that tool, not this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use rules ('3 课之后才允许首次写'), when-not-to-use rules (domain hits forbidden registry, confidence judgments), and names the alternative tool (reflect_on_teaching). It also provides decision guidance for lifecycle actions: '有证据就 reinforce, 被推翻就 revise/retire'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_live_evaluationA
写一条 LiveSessionEvaluation (现场评估, 挂在单场 live_session 上, 不是课级总评——那是 record_post_lesson_evaluation). 一次判决原则: 收课的正门是 live_session_complete 携可选 evaluation 一笔写完 (收课+场评一次动作)——本工具是收课时漏带场评的补写通道, 不是第二次判决的机会. 前置: live_session 存在且 status=completed(先 live_session_complete 收课, 再写现场评估). 一场一评(live_session_id 唯一索引)——撞了就幂等返回已有那条, 不二次写入、不覆盖。agent_observation 必填非空——短判词, 不复述课堂过程; 要锚到具体对话条目, id 填 evidence_refs, 本段保持人话 (学习者会在折叠区读到它)。回执自带闭环进度(该场挂课时)——不用另查状态机。
| Name | Required | Description | Default |
|---|---|---|---|
| learner_note | No | 可选——学习者可见的人话版 (三通道制)。语言用 learners.locale; 不含内部 id 机器词。 | |
| evidence_refs | No | 可选——机器引用通道: 判词锚到的具体 id (tr_/evt_/snap_ 等)。服务端逐 id 验存在+同 pair 归属, 幽灵引用直接拒。 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| live_session_id | Yes | 必须是已存在且 status=completed 的 live_session id. | |
| concepts_touched | No | ||
| duration_minutes | No | ||
| live_turns_count | No | ||
| agent_observation | Yes | 必填非空——这场现场课的观察记录: 短判词, 不复述过程。三通道制 **口径收窄 (2026-07-26, 学习者当面裁定)**: 本段会出现在学习者的折叠区 ("Teaching observation"), 已不再是纯内账——**内部 id 一律只进 evidence_refs, 不写进任何散文字段**。原"写这里或 evidence_refs"的二选一作废: 学习者读得到的地方, 就不写机器词。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses key behaviors: idempotent return of existing record on duplicate live_session_id, no overwrite, prerequisite of completed status, and that the receipt includes closure progress. It also informs that agent_observation is visible to learners in a collapsible section, which is critical contextual behavior beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds value: main gate, exception path, prerequisites, idempotency, field guidance, and receipt behavior. It is front-loaded with the core purpose and uses parentheticals to clarify distinctions. No filler or redundant phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers the return aspect by stating the receipt brings closure progress. It also covers prerequisites, idempotency semantics, and field-level constraints. The tool is complex (8 params, sibling names), and the description provides sufficient context for correct invocation without needing to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63%, and the description compensates richly. It explains agent_observation must be a short verdict, not a transcript, and that internal IDs should go to evidence_refs, not the text. It also adds meaning to idempotency_key (use for retries), learner_note (learner-visible, language from locale), and evidence_refs (server-validated against same pair). These explanations go well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource: '写一条 LiveSessionEvaluation' (write a LiveSessionEvaluation), and clearly distinguishes it from record_post_lesson_evaluation by stating this is for a single live_session, not course-level. It also explains the relationship to live_session_complete as the main gate, making the tool's specific role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: as a supplementary channel when the evaluation was missed during closing. It also names the primary flow (live_session_complete with optional evaluation), provides prerequisites (live_session exists with status=completed), and explains idempotent behavior on collision. This is clear, actionable guidance with exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_post_lesson_evaluationA
写一条 PostLessonEvaluation (纯事实层, 每节课末尾都写, 不打 confidence 标签). 一次判决原则: 总评做增量, 不复判——agent_observation 只装三样内容: ①整体判断 ②与 Live 表现的对照 ③下一课建议。永不逐题复述习题: 习题的判决在 grade_exercise 记录上, 不把评语再写一遍——要指向具体作业, 把 id 填进 evidence_refs, 正文保持人话。3-课阈值规则见 TEACHING-SPEC §4.3. 空评估拒收: concepts_touched / flashcards_reviewed_count / flashcards_rating_distribution / exercises_submitted_count / live_turns_count / duration_minutes / agent_observation 至少一项非默认值——全默认(空数组+全 0+空字符串) 会污染 learner brief, 直接拒收。(pair_id, lesson_id) 唯一索引(迁移 0030): 一课一份总评——第二次对同一课调用本工具是修订, 服务端 update-in-place(不插新行), 回执里会说明这是 update 而不是新建。回执自带闭环进度——不用另查状态机。
| Name | Required | Description | Default |
|---|---|---|---|
| lesson_id | Yes | ||
| session_id | No | 已改名——声明这个字段只是为了给出精确的改名错误(见 learning_session_id); 传了但没同时传 learning_session_id 会被拒收并指路改名, 不会被静默接受当作旧字段用。 | |
| learner_note | No | 可选——学习者可见的人话版 (三通道制)。语言用 learners.locale (brief 的 identity.learner.locale 可见); 不含任何内部 id (sub_/tr_/evt_ 等机器词)。 | |
| evidence_refs | No | 可选——机器引用通道 (三通道制): 本判断依据的真实 id (sub_/tr_/evt_/snap_ 等)。服务端逐 id 验存在+同 pair 归属, 幽灵引用直接拒——证据先于叙事。 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| concepts_touched | No | ||
| duration_minutes | No | ||
| live_turns_count | No | ||
| agent_observation | No | 三段增量 (一次判决原则): 整体判断 / 与 Live 表现的对照 / 下一课建议。不逐题复述习题——不重写评语——要指向具体作业, 把 id 填 evidence_refs。三通道制 **口径收窄 (2026-07-26, 学习者当面裁定)**: 本段会出现在学习者的折叠区 ("Teaching observation"), 已不再是纯内账——**内部 id 一律只进 evidence_refs, 不写进任何散文字段**。原"写这里或 evidence_refs"的二选一就此作废: 学习者读得到的地方, 就不写机器词。 | |
| learning_session_id | No | 可选——挂靠的 learning_session id (迁移 0030 从 session_id 改名而来, 名实相符). 旧名 session_id 已不再接受. | |
| exercises_submitted_count | No | ||
| flashcards_reviewed_count | No | ||
| flashcards_rating_distribution | No | { Again, Hard, Good, Easy } counts, default all 0 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it reveals update-in-place behavior on duplicate (pair_id, lesson_id), rejection of all-default payloads, the three-part structure of agent_observation, the three-channel rule for internal IDs (only in evidence_refs), and receipt behavior including update-not-create and progress. No contradictions with annotations because none are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense paragraph of operational rules with no filler; every clause contributes to correct usage. It could be more scannable with bullet points, but the natural-language flow remains efficient and information-dense, earning a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters, nested objects, uniqueness constraints, and detailed validation rules, the description covers purpose, timing, content restrictions (one-decision principle, no restating exercises), rejection criteria, idempotency, update semantics, and receipt behavior. It also references the spec for threshold details, making it effectively complete for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant meaning beyond the schema by explaining the three-channel system (learner_note, evidence_refs, agent_observation), the rule that agent_observation must avoid machine terms and internal IDs, and the rejection condition covering seven parameters. However, several numeric fields (e.g., concepts_touched, duration_minutes) still lack explicit semantic clarification, so 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states '写一条 PostLessonEvaluation' (write one PostLessonEvaluation) and specifies it is a pure fact-layer record written at the end of every lesson. It differentiates from siblings like record_live_evaluation and grade_exercise by explicitly stating exercise judgments belong to grade_exercise and that live comparisons form part of agent_observation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit timing ('每节课末尾都写' — write at the end of every lesson), a directive to avoid restating exercise judgments (pointing to grade_exercise), and a reference to the three-lesson threshold rule in TEACHING-SPEC §4.3. It also states the receipt carries closed-loop progress so state-machine queries are unnecessary, implicitly guiding against using sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reflect_on_teachingA
写一份 TeacherReflection (每节课末尾, 第 3 课起开始升级). §1-§5: 归因骨架已收紧——必须站队一个主归因、给证据、给反事实、挂一个类型匹配的 action_link;weather(⑥天气)必须带 weather_expires_at 且禁止触发任何学习者画像写入,过期即焚。呈现全静默:返回值只捎带一行近 20 次主归因计数,不进任何 UI。 反思挂锚: lesson_id/live_session_id 可选, 但推荐至少挂 lesson_id —— 反思挂在课上, 下一任老师才能按课读回"这节课到底反思过没有", 而不是靠 pair 级近似猜。两者若填写, server 会校验存在性 + 与当前 pair 一致(lesson 经 courses.pair_id, live_session 经 live_sessions.pair_id), 不属于本 pair 的 id 直接拒写。 挂锚推断: lesson_id 不填时 server 会从现场上下文强推断——依次看 live_session_id 指向的场次的课 / 当前唯一 active 的 Live 教室 / 24h 内最近一场 Live 课; 推断命中会替你挂上并在回执明示来源(created_refs.anchored_lesson_id + human_note), 推不出则落无主反思并在回执警告: 无主反思不计入任何课的 closure(closure_progress.reflection 会一直显示缺)。回执自带闭环进度(带 lesson 锚时, 显式或推断皆算)——不用另查状态机。
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | ||
| evidence | Yes | 必填。本次 session 里的具体观察,不是归因的同义复述. | |
| lesson_id | No | 可选, 推荐填——挂锚这份反思是为哪节课写的。反思挂在课上, 下一任老师才能按课读回, 而不是靠 pair 级近似猜。填了会校验: 必须是已存在的 lesson id, 且属于当前 pair。不填时 server 会从现场上下文强推断 (见工具描述); 推断也落空则该反思不计入任何课的 closure。 | |
| rationale | Yes | ||
| action_link | Yes | 必填。归因必须接行动(§4),否则只是日记。type 由 primary_attribution 决定: not_yet_mastered→review_action material_flaw→lesson_revision difficulty_timing→course_adjustment path_mismatch→intervention_note judgment_error→hypothesis_update weather→retest_only path_worked→hypothesis_update(证实现有假设, 走 confidence-up 而非 judgment_error 的纠错方向). **ref_id 的合法落点按 type 定死如下**(服务端逐一验存在+同 pair 归属, 幽灵引用直接拒 ——所以不必试探, 照表填即可): review_action→flashcards / exercises / concepts / lessons; lesson_revision→lesson_revisions(最精确: 填 update_lesson 回执里的 lesson_revision_id) / lessons; course_adjustment→courses / lessons; intervention_note→lessons / live_sessions / session_events / lesson_patches; hypothesis_update→learner_hypotheses; retest_only→exercises / flashcards / lessons。**注意六类里有五类都收 lessons**——拿本课的 lesson_id 当落点是合法的, 不是权宜之计。 | |
| next_action | Yes | ||
| what_failed | No | ||
| what_worked | No | ||
| counterfactual | Yes | 必填。防自利归因机关(§3):一句话——"如果真相是(另一个最可信的归因),我预期会看到 X;我实际看到的是 Y。" | |
| actual_evidence | No | ||
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| live_session_id | No | 可选——挂锚这份反思是为哪场 Live 课写的。填了会校验: 必须是已存在的 live_session id, 且属于当前 pair。 | |
| expected_outcome | No | ||
| weather_expires_at | No | 仅 primary_attribution=weather 时必填 (ISO timestamp),过期即焚——过期后不再出现在任何读路径. | |
| primary_attribution | Yes | 必填单选,逼出立场:not_yet_mastered=①学生尚未掌握 material_flaw=②教学材料有误或不完整 difficulty_timing=③难度与时机不合适 path_mismatch=④解释路径不适合这个人 judgment_error=⑤原判断本身就错 weather=⑥天气(同日状态性噪音: 累/疼/心不在焉) path_worked=⑦路径适配、如预期奏效——全对的课选这个,但必须写出什么奏效了、证据是哪几次作答;"一切都好"不带证据等于什么都没说。禁止在有真实问题时用它逃避归因. | |
| secondary_attribution | No | 可选,至多一个,且必须不同于 primary_attribution——留一格诚实,不是多选打勾. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility and does so extensively. It discloses the silent UI (return only counts, no UI entry), weather_expires_at expiry and the prohibition on learner-profile writes, server-side anchor validation and rejection of non-pair ids, anchor inference fallback with warnings for unanchored reflections, and the closure-progress inclusion in the receipt.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but flawlessly structured: it front-loads the core action and then details the attribution skeleton, anchor validation, inference logic, and return-receipt behavior. Every sentence contributes a distinct fact about behavior or constraints, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly complex tool with no annotations and no output schema, the description is remarkably complete. It covers the return value (one-line count plus receipt fields like created_refs.anchored_lesson_id and human_note), failure modes (unanchored reflection, pair mismatch), inference precedence order, and closure-progress semantics, leaving very few ambiguities for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 56%, and while the description reinforces key parameter relationships (e.g., action_link type-to-ref_id mapping, weather_expires_at requirement), it adds little beyond what the schema's descriptions already state. Several required parameters without schema descriptions (method, rationale, next_action) remain unexplained in both places, making this a minimal-viable rather than compensatory score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool's purpose ('写一份 TeacherReflection') with clear scope (per-lesson, starting from lesson 3). However, it does not explicitly distinguish itself from sibling tools like record_post_lesson_evaluation or close_lesson_loop, relying instead on its unique attribution-skeleton requirements to imply differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use at the end of each lesson, attach lesson_id, and it explicitly says the receipt includes closure progress so '不用另查状态机' (no need to query the state machine separately), which is a when-not guidance. It does not name alternative tools for similar actions like recording evaluations, limiting it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_conceptB
修订已有 concept 的字段 (name / short_definition / source_refs / flashcard_ids).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| concept_id | Yes | ||
| source_refs | No | SourceRef[];每项须为对象 {type, url?, file_ref?, page?, ...},type 取封闭枚举 | |
| flashcard_ids | No | 每项必须是已存在的 flashcard id(server 会查存在性) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| short_definition | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full behavioral disclosure burden. It only lists updatable fields and says 'revise', but fails to disclose partial-update semantics (merge vs replace), error handling for nonexistent concepts, validation results (e.g., flashcard existence), idempotency behavior (though the schema hints at it), or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with the verb and resource up front, followed by a compact field list. Every element contributes meaning, with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a mutation tool with no annotations and no output schema, yet the description provides minimal context. It omits return behavior, error semantics, partial-update rules, prerequisites (e.g., concept must exist), and any guidance on idempotency_key usage, making it incomplete for safe autonomous invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for source_refs (format), flashcard_ids (existence check), and idempotency_key (retry behavior), covering about 50% of parameters. The description adds a list of updatable fields, which is slightly redundant with the schema's properties but clarifies that concept_id and idempotency_key are not content fields to be modified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb '修订' (revise) and targets the 'concept' resource, explicitly listing the four updatable fields (name / short_definition / source_refs / flashcard_ids). The word '已有' (existing) clearly distinguishes this from sibling tool add_concept, which creates new concepts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool ('revise existing concept') but provides no explicit alternatives or exclusions. It does not state 'use add_concept for new concepts' or warn against misuse, leaving usage context mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_contract_cadenceA
只改一份已签合同的 cadence(节奏条款), 不动其他任何条款、不必重签. 节奏条款随时可改, 改约成本必须低于立约——这是它存在的意义. 形状同 propose_contract 的 cadence: {mode:"scheduled"|"fragmented", slots?:[{weekday:0-6(0=周日), time:"HH:MM"(24h), tz:string}], reminders:"native"|"none", auto_duty:boolean(涉及学习者额度消耗, 必须明示询问, 默认 false), weekly_review_nudge?:boolean, prep_rhythm?:"per_lesson"|"batch"(备课节奏——per_lesson 随学而备/推荐默认, batch 一次备齐; 见 skill intake/contract-establish 的语义说明)}. 完整替换, 不是逐字段合并——改 prep_rhythm 而漏带其他既有键(如 slots)会把它们清空, 调用前先读现有 cadence 再整体重写. teaching_contracts 没有 revision/history 表(version 列是历史遗留, 从未被真实写路径 bump 过)——留痕方式: 本工具自动在写入的 cadence 里盖一个 updated_at(ISO 时间戳, 不是调用者字段), 同时同步 bump 合同自身的 updated_at 列. 提醒本身仍不由 LS 发出——只是改了"存的约定"。
| Name | Required | Description | Default |
|---|---|---|---|
| cadence | Yes | 必填, 完整替换现有 cadence(不是逐字段合并) — 形状同上, mode/reminders 必填. | |
| contract_id | Yes | 必须是已存在的 teaching_contracts id | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden and excels. It discloses critical behavioral traits: full replacement semantics (not merging), lack of revision/history table, automatic updated_at stamping, and that reminders are only stored, not sent. These go far beyond any schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: purpose first, then cadence shape, then critical behavioral warnings. Every sentence carries vital information—no filler, no repetition of schema defaults. It is front-loaded with the most important scoping statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (nested object, full replacement, idempotency, no history), the description is remarkably complete. It explains the full-replacement danger, the historical anomaly of the version column, the automatic timestamp behavior, and the reminder non-delivery. No output schema exists, but for an update tool the description provides sufficient context without needing to detail return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds substantial semantic meaning beyond the schema: full-replacement behavior (clear risk of losing unspecified fields), auto_duty's explicit-consent requirement and default false, prep_rhythm's meaning, and the automatic updated_at insertion. It also references skill docs for deeper semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: '只改一份已签合同的 cadence(节奏条款), 不动其他任何条款、不必重签.' This clearly distinguishes it from siblings like update_contract_coverage and void_contract, and explains the tool's raison d'être.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use (modify cadence on an existing signed contract) and when not to (do not change other clauses, no need to re-sign). It also explains the economic rationale—'改约成本必须低于立约'—and implies the alternative of re-signing, making the usage context unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_contract_coverageA
修改一份合约的 covered_course_ids 覆盖单(这份合约名下实际教过的课程清单, 不是许可范围声明) —— {add_course_ids?, remove_course_ids?} 至少传一个非空数组。去重(加了两遍/加了已存在的不报错), 并校验每个 course_id 存在且属于同一个 pair(不属于/不存在直接拒绝, 不静默忽略)。已结业的合约(completed_at 非空)拒改——结业是终态, 覆盖单在那一刻定格, 想续教开新合约。
| Name | Required | Description | Default |
|---|---|---|---|
| contract_id | Yes | 必须是已存在的 teaching_contracts id. | |
| add_course_ids | No | 要并入覆盖单的 course id | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| remove_course_ids | No | 要从覆盖单移除的 course id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and thoroughly discloses behavioral traits: dedupe semantics, validation rejection (not silent ignore) for invalid or non-pair course IDs, and the terminal state rule for completed contracts. It leaves little ambiguity about edge cases and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph, but every clause earns its place: purpose, validation rules, dedupe behavior, and terminal-state restriction. There is no filler or redundant wording, making it efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers purpose, constraints, validation, dedupe, and lifecycle restrictions, which is strong. It lacks an explicit description of the return value or success/failure response, but the behavioral specification is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% parameter descriptions, so the baseline is 3. The description adds meaningful semantics by stating that at least one of add_course_ids or remove_course_ids must be a non-empty array, and explains dedupe/validation behavior beyond what the schema covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb '修改' (modify) with the resource 'covered_course_ids 覆盖单' and clarifies it is the list of actually taught courses, not the license scope. This clearly distinguishes it from sibling tools like update_contract_cadence or complete_contract.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that completed contracts (completed_at non-null) are rejected and directs users to open a new contract to continue teaching, providing an exclusion and alternative behavior. It implies usage for active contracts, though it does not name sibling tools directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_documentA
更新已有文档的标题和/或正文 (报告修订版). 正文变化时自动重新普查这份文档的全部划线 — 失联的进孤儿区, 绝不静默删行 (金缮条款, brief §3 item 3).
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| content_md | No | ||
| document_id | Yes | ||
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
无任何注解,描述承担了完整的行为披露责任。它披露了非常关键的非显然副作用:正文变化时自动重新普查全部划线,失联的进孤儿区,且绝不静默删行。这种透明度远超普通更新操作,但未提及权限要求、返回结果或并发处理,因此不是满分。
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
两句话,第一句直接说明用途,第二句解释重要的行为副作用,没有冗余内容。信息密度高且高效。
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
工具是修改操作,无输出 schema,描述提供了核心用法和关键副作用,引用了外部 brief 作为补充。但缺少返回/成功标准、失败处理或并发控制的上下文。对于这个复杂度而言已经足够,但仍有提升空间。
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
schema 描述覆盖率仅 25%(仅 idempotency_key 有描述),描述中隐含 title 和 content_md 是可更新字段,但未明确说明 document_id 的含义或 idempotency_key 的使用时机。由于描述只部分补偿了 schema 的低覆盖率,参数语义仅达到及格水平。
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
描述明确说明该工具用于更新已有文档的标题和/或正文,并指明是“报告修订版”,动词和资源都很具体。与同级别的 add_document(新增)、update_lesson(更新课程)等兄弟工具区分明确。
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
描述隐含使用场景:修改已有文档,而非新建文档,与 add_document 形成对比。但没有显式说明“何时不使用”或推荐替代工具,缺少明确的排除性指引。上下文清晰,但未达到最高标准。
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_feedback_statusA
推进一条学习者反馈的生命周期: open → acknowledged → addressed/declined。addressed/declined 是终态, 不可再改。declined 必须带 note——拒绝欠判词, 拒绝的理由保护接受的价值; acknowledged/addressed 的 note 可选。软牙齿: 不推进状态不拦任何闸门 (close_lesson_loop 不看这张表), 但 open 反馈会一直在 get_teacher_inbox 里发光。
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | 老师的判词, 存入 status_note。declined 时必填 (declining requires the teacher's reasoning — 老师欠判词); 其余可选. | |
| status | Yes | acknowledged=看到了、在想; addressed=已处理 (改了课/修了产品/回应了诉求); declined=不采纳 (必须带 note 说明为什么). | |
| feedback_id | Yes | record_learner_feedback 回执里的 feedback id. | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals important traits: addressed/declined are terminal and cannot be changed, declined requires a note (validation rule), and the 'soft teeth' effect—advancing status is not enforced by other tools but leaving feedback open keeps it visible in the inbox. This goes well beyond a simple status update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core lifecycle. Every sentence contributes meaningful information—state transitions, terminality, note requirement, and downstream impact—with no fluff or repetition. The 'soft teeth' metaphor is efficient and memorable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema or annotations, the description covers the essential context: purpose, behavioral constraints, validation rules, and relationship to other tools. It is comprehensive for a status-update tool, though it does not mention the return value or error conditions, which are less critical for understanding usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already well-described. The description adds value by explaining the status lifecycle, terminal states, and the note requirement for declined status, which enriches understanding of the 'status' and 'note' parameters beyond their schema descriptions. It does not need to repeat parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: advancing a learner feedback through its lifecycle (open → acknowledged → addressed/declined). It specifies the resource (learner feedback) and the action (advance lifecycle state), and distinguishes itself from siblings like record_learner_feedback (creation) and get_teacher_inbox (viewing) by emphasizing status transitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when to use the tool: when you need to advance feedback status, and explains the consequences of not using it (open feedback stays glowing in get_teacher_inbox, but no hard gates are blocked). It also references related tools (close_lesson_loop, get_teacher_inbox), giving clear situational guidance, though it does not explicitly name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_flashcardA
修订已有闪卡的内容字段 (front / back / deck_id) — 纯 patch 语义, 只改给出的字段, 不建 revision 快照 (同 update_concept 先例)。编辑卡面不影响复习计划: FSRS 调度状态 (fsrs_state 的 due_at/stability/difficulty/review_count 等) 与 paused 原样保留, 改内容不清进度、不重置排期。只能改当前 pair 的卡, 其他 pair (或不存在) 的卡一律 NOT_FOUND。验尺/复盘抓到卡面问题后走这里修, 不必删卡重建 (重建才会丢调度进度)。
| Name | Required | Description | Default |
|---|---|---|---|
| back | No | 可选; 新的答案, ≤3 句, 纯文本渲染 (不解析 markdown/LaTeX), 同 add_flashcard 口径。 | |
| front | No | 可选; 新的卡面问题。front=勾起回忆的问题/场景, 纯文本渲染 (不解析 markdown/LaTeX), 同 add_flashcard 口径。 | |
| deck_id | No | 可选; 移入的卡组 (自由字符串, 同名自动归组)。deck 语义纪律见 add_flashcard 的 deck_id 说明 — 出处不塞 deck 名, deck 只管"按什么主题混抽复习"。 | |
| flashcard_id | Yes | 必填; 要修订的闪卡 id (fc_ 前缀), 须属当前 pair | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and excels: it discloses pure patch semantics (only given fields changed), no revision snapshot, preservation of FSRS scheduling state and paused flag, no progress reset, and NOT_FOUND for other/nonexistent pairs. This gives the agent a complete picture of the tool's side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single block of several sentences, but each sentence provides a distinct piece of information: purpose, behavior, constraints, and usage context. It is front-loaded and not wastefully verbose, though it is longer than strictly necessary, earning a 4 rather than 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description comprehensively covers purpose, parameter semantics, behavioral constraints, error condition (NOT_FOUND), and usage timing. The only gap is no mention of return values, but this is not critical for an update tool and the description is otherwise thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying patch semantics — only provided fields are modified — and referencing update_concept precedent, which goes beyond the schema's simple 'optional' labels. This meaningfully aids parameter handling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it revises existing flashcard content fields (front/back/deck_id) using pure patch semantics. It clearly differentiates from add_flashcard and delete-recreate workflows, and references update_concept as a precedent, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: after verification/review catches card face issues, and explicitly advises against delete-and-rebuild, noting that rebuilding loses scheduling progress. It also states the constraint that only the current pair's cards can be modified, setting clear boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_lessonA
修订已有 lesson (revision pass 回写). 旧版全文快照入 lesson_revisions 后应用 patch, revision += 1. 必须带 revision_reason; 没有理由的修订直接拒绝. modality_declarations.mindmap 同 add_lesson (纯可选笔记; 脑图默认不生成, 留空不罚). revision_kind (迁移 0033, 双轨修订): 问自己——这次改动是她教出来的, 还是机器逼出来的? 前者 teaching (会呈现给学习者并触发回看提醒), 后者 technical (留痕但对她隐身)。缺省 teaching——发布后的修订默认面向学习者, 宁可多呈现不可偷藏.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| evidence | No | 可选, 依据什么证据 (如 "作业二里 Prepaid 方向连错两次")。**学习者会在修订病历本里读到这一段**——写人话, 内部 id 不进正文。注意本字段没有配套的 evidence_refs 通道, 所以宁可说得笼统, 也不要塞机器词。 | |
| lesson_id | Yes | ||
| concept_ids | No | 可选;每项必须是已存在的 concept id(server 会查存在性) | |
| revision_kind | No | 可选, 缺省 teaching。问自己:"这次改动是她教出来的, 还是机器逼出来的?" 前者 teaching (会呈现给学习者并触发回看提醒), 后者 technical (留痕但对她隐身, 如格式/门禁/重构/错别字)。 | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| revision_reason | Yes | 必填——为什么改 | |
| content_markdown | No | ||
| estimated_minutes | No | ||
| modality_declarations | No | 可选教具的"声明式跳过"记录; 目前只用 mindmap 键。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It transparently discloses side effects (snapshot, revision increment), strict rejection without revision_reason, mindmap behavior (optional, not generated by default), and the teaching/technical distinction with default and learner-facing implications. This is highly informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but front-loads the purpose and provides essential behavioral details. It is somewhat run-on, yet every sentence is informative and there is no fluff. It could benefit from clearer segmentation, but remains effective and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 params, nested objects, no output schema), the description covers the core mutation flow, mandatory fields, and nuanced revision_kind semantics. It does not mention return values or some straightforward params (title, lesson_id), but those are self-evident and partially covered by schema descriptions. Overall, it is sufficiently complete for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, not low enough to demand full compensation. The description adds meaningful guidance for revision_kind (with the teaching/technical heuristic) and modality_declarations.mindmap (same as add_lesson, no penalty), but it does not enrich other parameters like idempotency_key or evidence beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with '修订已有 lesson' (revise an existing lesson), clearly identifying the verb and resource. It goes further to describe the revision workflow (snapshot to lesson_revisions, apply patch, increment revision), which distinguishes it from sibling tools like add_lesson and add_lesson_patch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for existing lessons and mandates revision_reason, but it does not explicitly state when to prefer this tool over add_lesson_patch or other revision-related siblings. It lacks an explicit when-not-to-use or alternative comparison, though the revision semantics provide some context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_mindmap_seedA
修复/迭代你自己播种的课程脑图, 拓扑不再一锤定音. 只对 source=agent 的图开放 (学习者自己长出来的图不许 agent 动, 会打 PERMISSION); content 走与 add_mindmap_seed 一致的全套校验(字段合同见 add_mindmap_seed 说明, 完整教程 docs/recipes/mindmap-authoring.md). 写入会同时同步 content 与 agent_seed_snapshot 两列 — 有过案底: 只改 content 会让 Clear & redo(从 agent_seed_snapshot 复原)诈尸出你改之前的旧方言图, 这里两列一起写, 新内容即是新种子, 免疫诈尸.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | MindmapContent — { nodes: MindmapNode[], links: MindmapLink[] }, 全量替换(不是 patch) | |
| mindmap_id | Yes | 必须是当前 pair 名下、已存在、且 source=agent 的 mindmap id (服务端先验归属+存在性, 别人 pair 的图一律 NOT_FOUND, 再验 source) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses key non-obvious behaviors: the source=agent permission check, the dual-column write ('写入会同时同步 content 与 agent_seed_snapshot 两列'), and the historical bug motivating this behavior ('只改 content 会让 Clear & redo...诈尸'). This is exactly the kind of context an agent needs to avoid a subtle failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences pack purpose, restrictions, validation, and a behavioral caveat. Each sentence earns its place, though the '诈尸' zombie metaphor is colorful and may slightly obscure clarity. Overall, efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (nested object, 3 params, no annotations, no output schema), the description covers purpose, usage restrictions, validation linkage, and a critical write-behavior pitfall. It also mentions the permission error type. This is sufficient for an agent to invoke correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value beyond the schema by pointing to the full field contract in add_mindmap_seed ('字段合同见 add_mindmap_seed 说明') and a complete tutorial. This cross-reference helps the agent understand content structure more deeply, exceeding what the schema's brief descriptions provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '修复/迭代你自己播种的课程脑图' (fix/iterate your own seeded course mindmap), clearly stating the action and resource. It distinguishes from sibling add_mindmap_seed by focusing on updating an existing agent-owned mindmap, and further differentiates scope by specifying source=agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: only for source=agent mindmaps. Provides a when-not case: '学习者自己长出来的图不许 agent 动, 会打 PERMISSION' (learner-grown graphs not allowed, will get PERMISSION). Also references add_mindmap_seed as the validation contract, implying the alternative for creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_prepA
备课收尾必调: 交付前跑一遍, 清掉每一条 ❌, ⚠️ 逐条过目。检查跨件一致性(课文格式/闪卡/习题引用/脑图拓扑/概念覆盖)——写入门禁看单发, 本工具看全家福。只读, 零写库。lesson_id / course_id 二选一必填(都传或都不传 → code: VALIDATION)。传 lesson_id 返回单课报告(status PASS/PASS_WITH_WARNINGS/FAIL); 传 course_id 按 lessons.order 顺序逐课校验, 给 course 级三档汇总 (lesson_count/overall_status/lessons[])。id 不存在或 course 下无 lesson → code: NOT_FOUND。默认紧凑报告: status + errors/warnings 逐条原文 + check_counts {pass, skip} 计数; verbose:true 取全表 (checks 逐条含 pass/skip 项, 与旧版逐字同形)。等价于 npx tsx scripts/validate-prep.ts <id> --json 的 MCP 化版本(同一份判定实现, CLI 恒为全表)。
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | 默认 false=紧凑报告 (errors/warnings 逐条 + pass/skip 计数); true=逐条全表 checks (旧版全形状)。 | |
| course_id | No | 与 lesson_id 二选一——按 order 顺序逐课校验, 给 course 级汇总 | |
| lesson_id | No | 与 course_id 二选一——校验单节课成套教具的自洽性 (脑图仅当配了才查) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It transparently discloses read-only behavior ('只读, 零写库'), validation error codes (VALIDATION, NOT_FOUND), return status levels (PASS/PASS_WITH_WARNINGS/FAIL), course-level aggregation details, and the CLI equivalence. All key behaviors are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds value. It is front-loaded with the primary use case, then systematically covers safety, parameters, output modes, and equivalence. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, the description provides complete context: usage scenarios, parameter selection rules, error codes, compact vs verbose output shapes, and CLI correspondence. It fully compensates for missing structured metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all 3 parameters with 100% coverage, but the description adds critical semantics: the mutual exclusivity rule (both/neither → VALIDATION), the behavior for each value (single-lesson report vs course-level summary), and ordering by lessons.order. This goes well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: a final verification step for lesson preparation ('备课收尾必调'), checking cross-item consistency across textbooks, flashcards, exercises, mind maps, and concepts. It distinguishes itself from sibling tools by being read-only and validation-focused, contrasting with the write-oriented siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: before delivery ('交付前跑一遍'). It clarifies the lesson_id vs course_id selection rule and the distinction from write operations ('写入门禁看单发, 本工具看全家福'). This gives clear context and differentiates from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
void_contractA
作废合约前,必须把作废理由原文展示给学习者,并取得学习者亲口的同意答复;learner_consent 填学习者的原话。未经同意调用属违纪。 作废不是删除——合约行原样保留,只是标记作废(active=false, voided_at=now(), void_reason=你传入的 reason)并从此退出"当前合约"选择(get_context/pickSkillStack/pair://contract/active 等一切现读, 见 lib/currentContract.ts)。幂等:对已作废的合约重复调用,原样返回其作废状态,不报错、不二次写入、不覆盖原 void_reason。
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | 作废理由原文(必填,非空)——这是要先给学习者看过的那段话,也是留痕的一部分。 | |
| contract_id | Yes | 必须是已存在的 teaching_contracts id. | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| learner_consent | Yes | 学习者的原话同意答复(必填,非空)。不是你替学习者写的摘要——她/他说了什么就填什么。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and fully delivers. It specifies the exact side effects: 'active=false, voided_at=now(), void_reason=...' and that the contract exits current contract selection. It discloses idempotency behavior, stating repeated calls return the voided state without error, second write, or overwriting the original void_reason. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most critical prerequisite (consent) and then compactly covers the effect, idempotency, and relationship to the read model. Every sentence earns its place; there is no fluff or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers prerequisites, exact side effects, idempotency, and even references the implementation file (lib/currentContract.ts) for affected read paths. It is complete enough for an agent to correctly select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has detailed semantics (e.g., reason is the original text to show, learner_consent must be the learner's verbatim words, idempotency_key for retries). The description adds workflow context but does not materially extend the per-parameter meaning beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb '作废合约' (void contract) and clearly defines the resource as a teaching contract. It distinguishes the behavior from deletion by stating '作废不是删除——合约行原样保留' (void is not delete—the contract row is preserved), which sets it apart from a destructive delete and implies it is a state transition. This is clear and differentiates from sibling tools like complete_contract in effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage context: it mandates that the reason must be shown to the learner and consent obtained before calling, and states that unauthorized calls are a violation ('未经同意调用属违纪'). It also clarifies that this is not a deletion operation. However, it does not explicitly name alternative tools (e.g., complete_contract) or state when to prefer voiding over completing, so it lacks an explicit exclusion for those alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
50 tool updates
v1.0.0- First observed
add_concept - First observed
add_document - First observed
add_exercise - First observed
add_flashcard - First observed
add_lesson - First observed
add_lesson_patch - First observed
add_mindmap_seed - First observed
add_simulated_quiz - First observed
adhoc_ack - First observed
adhoc_message_send - First observed
adhoc_thread_get - First observed
close_lesson_loop - First observed
complete_contract - First observed
create_course - First observed
create_pair - First observed
get_context - First observed
get_exercise - First observed
get_learner_brief - First observed
get_lesson - First observed
get_lesson_closure_state - First observed
get_submission - First observed
get_teacher_inbox - First observed
grade_exercise - First observed
live_heartbeat - First observed
live_message_send - First observed
live_pending - First observed
live_session_cancel - First observed
live_session_complete - First observed
live_session_get - First observed
live_session_start - First observed
live_snapshot_get_latest - First observed
live_snapshot_write - First observed
live_wait - First observed
propose_contract - First observed
publish_lesson - First observed
record_learner_feedback - First observed
record_learner_hypothesis - First observed
record_live_evaluation - First observed
record_post_lesson_evaluation - First observed
reflect_on_teaching - First observed
update_concept - First observed
update_contract_cadence - First observed
update_contract_coverage - First observed
update_document - First observed
update_feedback_status - First observed
update_flashcard - First observed
update_lesson - First observed
update_mindmap_seed - First observed
verify_prep - First observed
void_contract
TDQS
Each tool targets a distinct resource/action combination, even within dense families like add/update/record. Closely related tools such as add_lesson_patch and update_lesson have clearly defined boundaries based on lesson progress state. The overlap risk is minimal despite the large surface.
Most tools follow a verb_noun pattern (add_lesson, create_course, get_context), but the live_* and adhoc_* families invert this to noun_verb (live_message_send, adhoc_thread_get) or use ambiguous nouns like live_pending. This creates a noticeable inconsistency, though each family is internally consistent.
At exactly 50 tools, the server is at the extreme end of the scale and falls into the '50+ tools' criterion. Even for a complex tutoring platform, the surface is unwieldy and likely to increase selection latency and cognitive load for agents. A more curated set of 20-30 tools would be far more appropriate.
The toolset covers the full lifecycle: pair creation, contract negotiation, course/lesson authoring, exercise grading, live session management, feedback loops, and reflection. Minor gaps exist (e.g., no update/delete for courses, no direct list-all lessons), but overview tools like get_context and get_teacher_inbox make these workable.
Maintenance
Related MCP Connectors
Your AI agent builds interactive block-based courses over MCP; take them at learnwithagents.app.
System-of-record notebook for AI coding agents: pages, datastores, tasks, skills over MCP.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA multi-agent AI tutor that delivers personalized lessons, resolves doubts with RAG, generates quizzes, and tracks progress, all accessible via MCP for Claude Desktop.5-
- AlicenseNot gradedqualityAmaintenanceA local-first study workspace for MCP agents, providing a web UI for learning, quizzing, and review, independent of agent lifecycle.4GPL 3.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to create and manage personalized 30-day study courses, including web research with source validation, daily lessons, quizzes, and progress tracking through 12 MCP tools.1MIT
- AlicenseAqualityAmaintenanceEnables AI agents to share, search, and learn from structured lessons, ask and answer questions asynchronously, and contribute to a shared knowledge commons via MCP.1912MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sf-shenfeng/learn-shell'
If you have feedback or need assistance with the MCP directory API, please join our Discord server