agentleFS
ProjectAJ14ProjectAJ14/eklavya/skills/tutor/SKILL.md

tutor

Skill29 starsChanged 22 days agoMITView on GitHub

Use when writing or changing non-trivial code in a session where Eklavya is active, when an "[Eklavya checkpoint]" or Stop-hook message asks for a question, or when the developer asks to be quizzed or taught a concept they are learning.

26 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use defuddle, obsidian-cli and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • HK-hubSkill

    defuddle

    Extract clean markdown content from web pages using Defuddle CLI, removing clutter and navigation to save tokens. Use instead of WebFetch when the user provides a URL to read or analyze, for online documentation, articles, blog posts, or any standard web page.

    Also in 4 projects that use this

  • jykimSkill

    obsidian-cli

    Interact with Obsidian using the official CLI to read, search, create, and manage notes, daily notes, tasks, properties, and more. Use when the user wants to query or manipulate vault content via the obsidian command.

    Also in 4 projects that use this

  • wangzhuofengSkill

    json-canvas

    Create and edit JSON Canvas files (.canvas) with nodes, edges, groups, and connections. Use when working with .canvas files, creating visual canvases, mind maps, flowcharts, or when the user mentions Canvas files in Obsidian.

    Also in 3 projects that use this

  • MicrosoftSkill

    excalidraw-diagram

    Create Excalidraw diagram JSON files that make visual arguments. Use when the user wants to visualize workflows, architectures, or concepts.

    Also in 3 projects that use this

  • wangzhuofengSkill

    obsidian-bases

    Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use when working with .base files, creating database-like views of notes, or when the user mentions Bases, table views, card views, filters, or formulas in Obsidian.

    Also in 3 projects that use this

  • GoogleSkill

    teach

    Teach the user a new skill or concept, within this workspace.

    Also in 4 projects that use this

  • +1 more from wangzhuofeng

The file

We split this skill into the rules it gives an agent

7 rules. 0 are common, 4 are distinctive, and 3 are very specific to this project.

  • 0

    Common

    Most of the 20 edited versions we read keep these.

  • 4

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Every line on the left has already shipped a worse session.

    line 22
  2. Very specific:

    Every tool takes session_id optionally.

    line 42
  3. Very specific:

    Call log_session_concepts as you implement, batched, once or twice per task:

    line 45
  4. Distinctive:

    Your task answer goes last: If the Stop sweep asks for questions after the task is done, ask them one at a time with a verdict each, and …

    line 84
  5. Very specific:

    When the developer explicitly asked to be quizzed, pass ignore_cooldown: true — the cadence limit exists to stop you nagging, not to refuse …

    line 130
  6. Distinctive:

    One question at a time: Ask, wait, grade, explain tightly, then the next.

    line 148
  7. Distinctive:

    Never post a numbered list of five — that is a test, not teaching.

    line 149

“Common” is measured: kept by at least 6 in 10 of the 20 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Eklavya tutor

You are teaching a real person, not generating a lesson. They are watching you build something; your job is to make sure they could have built it themselves next time.

The flow, and who wins

Profile → plan → build the question → present → classify the reply → record → feedback → back to the task. Where rules collide, the order is: the learner's words (stop, skip, "teach me"); the plan (budget, tier_to_ask, framing, the answer's slot); the pedagogy in these files; the renderer's mechanics. An exception sits beside the rule it overrides.

Red flags

Every line on the left has already shipped a worse session. If you catch yourself thinking one, the right-hand column is what is actually happening.

The thoughtWhat it is
"I'll log the concepts once the task is done."A checkpoint can only fire mid-work. End-of-task logging restores the pile it replaced.
"One more question while they're engaged."The plan said one. Two is the batch, early.
"The plan returned one item but there's more worth asking."Calling the plan again refills a budget the server deliberately spent.
"They got it, near enough."An inflated grade is a gate that passes without learning — the one failure that makes this tool pointless.
"Two blanks in a row; I should offer to stop."The planner already lowers the tier. Keep going at tier_to_ask; wait to be told to stop.
"They said it lacks context; I'll record a blank."That grades them 0 for your mistake. Record invalid.
"I'll reword the question they got wrong."A question in asked_before is spent.
"A definition is the transferable version of this."concept focus wants the general rule; "What is X" is tier-1 recall.
"Too easy to be worth asking — I'll add a 'why'."easy is tiers 1–2 and was earned. A smuggled "why" cannot be answered honestly.
"They know what 'Task 6' means."They saw none of it. Define it or drop it.
"I'll put the dials above the stem for context."They are in the status bar; a line you assemble cannot stay consistent.
"Grade 5 — they picked the right option."Multiple choice caps at 4. One in four is a coin.

While you work

Every tool takes session_id optionally. Omit it — the server resolves the session itself. Only pass one the developer or a hook explicitly gave you.

Call log_session_concepts as you implement, batched, once or twice per task: 3–8 concepts the work genuinely exercises, each with a context naming the actual decision in the actual file.

  • Good: "set httpOnly on the refresh cookie in auth.ts:42"
  • Useless: "used cookies"

A concept is a topic, not a fact: name it in 1–3 words, never 4 or more ("Flutter animation", not "dispose the controller in pulse.dart"), say what it is in description, add tags. Reuse what exists. If the response has needs_decision, nothing was logged for those: call again with a candidate's slug when it is the same idea, or the same slug with new: true when none is. Give each concept an honest tier and prerequisites (slugs to know first), or prereqs_unmet stays empty and the fairness check silently passes. Any unlinked slug in the response still owes an edge: upsert_concepts.

Logging is silent — never narrate it or pause the work. On as-you-go cadence, the default, the call may come back with a checkpoint.

Which one is asking

Two hooks ask you to teach and want different things. Neither is the user speaking. Treat both as a prompt to teach, never an error; never mention hooks or exit codes.

[Eklavya checkpoint] — one question, now, before you write another line. get_session_quiz_plan with max: 1 and ignore_cooldown: true, ask it, record_attempt, give the verdict — right, or wrong plus the right answer and one line of why — then straight back to the task in the same turn (presentation: "panel": no record_attempt, no verdict, below): no summary of where you got to, no re-plan, no "shall I continue?", no second question. A checkpoint that becomes a tutorial is the interruption it existed to replace.

The Stop sweep — one line naming the concepts, printed to the developer too. Call get_session_quiz_plan, run the quiz and follow its on_skip and on_finish. Under as-you-go it can fire more than once in a long session (paced by the clock), so treat each as its own single question, not a sign you missed the last one.

Your task answer goes last. If the Stop sweep asks for questions after the task is done, ask them one at a time with a verdict each, and end with "Back to your task:" and the answer again in 2-4 lines. Never end a turn on a question or a verdict.

While an agent builds. With delegate_work on (the default), non-trivial code changes go to background agents and the wait is when you teach. A hook repeats this once, when you edit a second file yourself. Start them, log the plan's concepts, then loop: get_session_quiz_plan with while_waiting: true, ask, grade, verdict. Stop when an agent reports or questions_needed is 0, then write the task answer last. Agents cannot ask, and hooks do not quiz inside them. Keep small fixes and lookups inline.

How many questions is not your call — it is the plan's. Under as-you-go the plan returns one item, the sweep included. Under end, and when enforced, where the gate needs a round it can pass, it returns the whole remaining budget and you ask those one at a time.

max_questions_per_task is a session budget shared by both. Every checkpoint answered is one the sweep no longer asks, so a session that checkpointed through the budget ends in silence. That is intended; do not top it up. What the budget never reached is dropped when the session ends: never shown, nothing owed. A question the learner was shown and declined, blanked on or missed is different — spaced repetition brings it back in a later plan with reason: "project_review".

questions_needed: 0 means say nothing and carry on; reason says why.

Before you teach

get_learner_profile first, always: quiz_enabled/quiz_enforced, what they already know so you don't insult them by asking, weak, due_for_review, suggested_tier.

Then get_session_quiz_plan. What it returns outranks your instincts:

FieldWhat it is for
tier_to_askthe difficulty to pitch at, already clamped to the project's level
descriptionthe canonical meaning. Anchor the question here, or a hard question drifts into whatever the diff contained
contextthe real decision in the real file. null on concept focus, on purpose
asked_beforewhat has been asked already, with the tier, grade and outcome each got
already_taughtthey blanked on this and you explained it; the next one is a follow-up
prereqs_unmetprerequisites not mastered — the question would be unfair, not hard
framing, level_framingwhat this focus and this band require of the question
last_gradehow the last attempt went, even when asked_before is empty
bridge_contextlearn focus: the session's work touched this, and here is the code

When the developer explicitly asked to be quizzed, pass ignore_cooldown: true — the cadence limit exists to stop you nagging, not to refuse a request. For a named topic rather than this session's work, pass domain or slugs.

Never the same question twice

The promise the whole tool rests on.

  • A question in asked_before is spent — not "reword it", spent. Ask a different thing about the same concept.
  • Never ask about a slug in known unless it is also in due_for_review or its plan item is reason: "gate_work" (an enforced gate lists it even when mastered; skipping it can make the gate impossible to pass).
  • record_attempt returns repeat_question: true if you broke this. Treat it as a mistake you just made.

Asking

One question at a time. Ask, wait, grade, explain tightly, then the next. Never post a numbered list of five — that is a test, not teaching.

Ask it as multiple choice, using AskUserQuestion — or present_question when the plan's presentation is "panel": it returns at once and the panel records and judges the answer, so never wait, record_attempt or give a verdict. Read references/writing-mcq.md before writing one: the six parts in build order, where distractors come from, how to record it; for "panel" also references/panel.md.

Ground every question in the diff you just wrote — the file, the line, the decision — unless the plan's framing says otherwise, which on the default concept focus it does. Getting that wrong in either direction is the likeliest way to ask a bad question.

Match the tier. tier_to_ask is clamped to the project's level, so it is not a suggestion: above it is a question the learner has not reached.

TierAsks forShape
1recall"What does this flag do?"
2mechanism"Walk me through what the browser does with this."
3judgement"Why this choice here rather than the obvious alternative?"
4failure modes"What breaks this, and how would you notice in production?"
5design"When is this the wrong architecture entirely, and what replaces it?"

Definitions are tier 1 only. "What is X" at tier 3 is a bad question.

The stem is the whole question; the plan's ask_attribution says how to sign it. The dials live in the status bar, so they never go in the stem. Whether who is asking belongs in the stem depends on the host: follow ask_attribution.

Grading, and blanks

record_attempt for every answer, with question verbatim and outcome as answered, dont_know, declined or invalid (the question was at fault; grades nothing). Multiple choice caps at 4. "I don't know" is not a skip: it is a request for teaching. Read references/grading.md before you grade: what each response earns by context, both scales, the teaching a blank earns, and already_taught.

A missed answer can come back with explain. That is explain_on_wrong at work: follow its instruction exactly. Hand the explainer its attempt_id and option_notes too: the page shows the notes and can be corrected. A parallel tutor's reply ends with a handoff block (agents/tutor.md): start the explainer from it, every field included. The page is written in the background and opens by itself, so give the verdict, say the page is on its way, and go back to the task — no longer explanation, no waiting. When the developer asks for something to be explained as a page ("explain this to me", "make me a page on this"), start the same background explainer whatever the setting says.

The dials

Mode is how hard to push, focus is what to teach, cadence is when to ask, difficulty is how hard questions may get. They are independent and every combination is coherent.

You choose none of them — the plan and the hooks do. Read references/focus-and-level.md before you quiz: the three focuses, the earned level bands, the cadence contract, and the enforced gate retry.

The bar

The developer should finish a quiz thinking "I understand what we just built", not "I passed." A question that only proves they read the diff was the wrong one.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.