Skip to content

Your first session

Work normally. Eklavya runs alongside Claude; you do not need to invoke a command for each question.

The session timeline

One task, with learning along the way

Work produces concepts, answers schedule reviews, and memory carries context into a later session.

  1. Open

    Your settings and relevant project memories load.

  2. Build

    Claude, or background agents it starts, implements your request; the concepts used are logged.

  3. Answer

    One question connects a concept to the work on screen.

  4. Continue

    Your answer is recorded and schedules a review while work continues.

  5. Return

    A later session recalls project history and revisits due concepts.

For example, ask Claude to “Add JWT authentication to the Express API.” As it implements the change, it logs concepts tied to the actual code. With the default as-you-go cadence, that logging call can trigger a question. Later edits and shell commands provide further checkpoints, paced by a four-minute interval. Task completion can bring one more question, subject to the same pacing and session budget. It comes after Claude’s answer, and Claude then repeats a short version of the answer under “Back to your task:”.

For a change that spans several files, delegate_work (on by default) asks Claude to hand the building to a background agent. Eklavya says so next to your prompt, before the first edit, and reminds Claude once if it changes a second file itself anyway. If you started the chat in your main checkout and Claude made a worktree for the task, Claude is asked to point the agent at that worktree. A staged plan goes one stage per agent, in order, and Claude reviews, runs your checks and commits each stage before the next. If you say to work inline, Claude is asked to do so. Under the default as-you-go cadence, questions come one at a time while the agent works, and the task answer arrives last.

Answers are graded from 0 to 5. Concepts you struggle with return sooner; successful reviews are spaced further apart. A new session also shows a short banner: its first line shows the installed version and your settings, followed by progress. quiet: true hides that banner without disabling questions or memory. The banner has a time budget: the details that need a database read (recalled memory, the memory health line, your learning counts and level) are each computed in their own process, and one that is not ready within about seven seconds of the hook starting is left out, so a slow database costs a line, not the whole greeting.

Nothing is asked until the session changes a file: through Claude’s edit tools in any git repository, including a sibling worktree; through a shell command that changes a file in a git repository (one that starts with cd into it, or, in a session started outside any repository, names it by git -C or a path, or runs from inside it, for a repository inside the folder it started in); or in the git working tree it started in, where a commit counts but a git pull or branch switch alone does not. Files under artifacts/ or reports/ never count. With delegate_work on, Claude starting a building agent counts too. A session spent reading, researching or answering questions gets no questions, including one started in a folder that holds repositories but is not one. Enforced quizzing and /eklavya:quiz are not held back.

The default budget is four questions per session, even though the setting is named max_questions_per_task. Explicit practice and enforced gate retries can behave differently; see The dials and The commit gate.

Concepts the budget does not reach are dropped once the session is over; Eklavya does not keep a pile of questions you were never shown. A question you decline, do not know or get wrong is scheduled for review a day later, and the next quiz in that project asks it again after that session’s own work.

A checkpoint example

Why is httpOnly set on the refresh cookie here?

On supported Claude Code builds, the question appears in the side panel. If the panel is unavailable, Claude shows four choices in its question card. The terminal card has an Eklavya header; in Claude Desktop’s Code tab and Cowork, it begins with [Eklavya].

The terminal status bar shows the current focus, cadence and difficulty:

[EKLAVYA concept · as-you-go · easy]

The installer configures this status line when possible. If you already have a custom one, see eklavya statusline. Claude Desktop has no equivalent status bar; use the dashboard.

The quiz side panel (experimental)

The side panel is on by default. On a supported Claude Code build, a question appears beside the transcript while Claude keeps working. You can read and answer it at your own pace. If the panel is unavailable, the question uses Claude’s question card and Claude waits for your answer.

To use the question card everywhere:

Terminal window
eklavya config set quiz.panel false

The panel shows one question at a time under the Eklavya mark: the concept and tier, the question, four options with a line under each, and Other — explain in your own words. Each option is its own bordered block, and pressing its text or the line under it picks it. The one you pick gets bold white text, a thicker highlighted border and a filled teal background across the whole block (Other keeps the border and bold text but no fill, because you type inside it); the highlight means picked, never right. The question renders as Markdown, so code and bold show as written; the panel also marks function calls and camelCase or snake_case names as code when the question did not. The options and the lines under them are plain text, because a button cannot draw code. On the desktop app the question is set as a larger bold heading with room below it, the options are spaced well apart, a long option wraps onto more lines instead of being cut off, and an option’s note lines up under its text; a click on an option’s text or note picks it, and picking moves nothing; the terminal panel keeps its tighter layout. In any panel narrower than 60 cells the Eklavya mark sits above the concept and tier instead of beside them, so a narrow pane never squeezes that line into a few letters. In the terminal, press Ctrl+X then Tab to move the keyboard into the panel; the number beside an option selects it, and Tab and Enter press the buttons. The desktop app keeps your typing in its prompt even after you click the panel, so there the panel shows no shortcuts: click an option and the buttons. Picking an option only selects it; nothing is graded until you press Submit answer. In Other, Enter keeps the words you typed and moves the keyboard to Submit answer, so a second Enter sends them. Skip question is its own button and records a decline for that question. New to me — Teach me, a Claude-orange button on its own row under Submit answer, is for a concept that is new to you: it records “I don’t know” (grade 0, dont_know), shows the right answer under “New to you, and that’s fine. Here’s the answer.” in Eklavya teal instead of the “Needs another look” wording, and starts the explainer page in the background even when explain_on_wrong is off. The same concept comes back in a later question. The result replaces the question in the same panel and says Correct or Needs another look in words, with a line on why and, after a miss, the right option. If the answer promotes you, it also says which level you cleared on this project. Done closes the result, and so does a 15-second timer when no Next question is waiting. After a miss with explain_on_wrong on, the panel starts the explainer page in the background itself, without a prompt in your transcript. The page marks the option you picked, or lists the words you typed under Other after the options. If Claude Code refuses or fails to start that agent, the panel asks once more, then falls back to a prompt asking Claude to start it. That prompt, and the one Next question sends, show in your transcript as one short Eklavya line; Claude still reads the full instruction. Closing the panel with Esc hides the question without grading or skipping it; /eklavya-panel opens it again. /eklavya:quiz uses the same panel: for a round, Next question asks Claude for the next one of that same round, on the same topic and up to the number you asked for.

Your answer is graded the same way as in the card. A pick takes the grade the asking model wrote with that option when it wrote the question (4 for the right one, 2 for a near miss, 1 for one built on a misconception). Words you type under Other are graded by one model call from the panel, using the rubric in Grading and scheduling, and that call uses your own Claude usage. Either way the answer is recorded once, by the same code that records a card answer.

The panel is used only when all of these hold: quiz.panel is on, the Claude Code terminal CLI (tested on 2.1.292) or the Desktop Code tab (enabled, not yet verified on a real Desktop build) is the host, the panel has reported in within the last 90 seconds, and its last report did not say the host could not show it. Otherwise the question uses the card, exactly as before. In a terminal narrower than 144 columns an unrequested panel waits instead of opening: you see “A question is waiting. /eklavya-panel to open it.” and the question stays put until you open it. The hint under the pane, with Ctrl+X then Tab, the answer keys and Esc, shows only in a terminal; the Desktop tab shows no hint line. With quiz.panel off, the panel shows nothing, /eklavya-panel opens nothing, and questions use the card.

If auto mode blocks Eklavya

Claude Code’s auto mode judges each tool call before it runs, and a plugin cannot grant its own permissions. Eklavya makes ten calls without you asking, because its hooks tell Claude to or its panel makes them itself:

ToolsWhy they run on their own
log_session_concepts, get_session_quiz_plan, record_attemptThe start-of-session note and the Stop hook have Claude log concepts, plan a question and record the answer. A denial here ends the turn with no question.
upsert_concepts, get_learner_profileThe tutor skill, which those hooks load, reads your profile first and links new concepts.
panel_sync, panel_answer, present_questionThe panel polls and submits answers itself, and Claude hands it each question.
memory_search, memory_getThe recall notes point Claude at these to read earlier work.

A refusal reads like plugin:eklavya:eklavya - panel_sync (mcp) denied by auto mode, or names another of these tools. Auto mode can also deny a harmless call with an unrelated reason such as “Irreversible Local Destruction”, so a message that sounds wrong still means this fix. Add all ten to the permissions.allow list in your user settings, ~/.claude/settings.json, keeping the entries already there:

{
"permissions": {
"allow": [
"mcp__plugin_eklavya_eklavya__panel_sync",
"mcp__plugin_eklavya_eklavya__panel_answer",
"mcp__plugin_eklavya_eklavya__present_question",
"mcp__plugin_eklavya_eklavya__log_session_concepts",
"mcp__plugin_eklavya_eklavya__get_session_quiz_plan",
"mcp__plugin_eklavya_eklavya__record_attempt",
"mcp__plugin_eklavya_eklavya__upsert_concepts",
"mcp__plugin_eklavya_eklavya__get_learner_profile",
"mcp__plugin_eklavya_eklavya__memory_search",
"mcp__plugin_eklavya_eklavya__memory_get"
]
}
}

Or paste this into Claude Code and let Claude make the change:

Eklavya's tools are being denied by auto mode. Add mcp__plugin_eklavya_eklavya__panel_sync, mcp__plugin_eklavya_eklavya__panel_answer, mcp__plugin_eklavya_eklavya__present_question, mcp__plugin_eklavya_eklavya__log_session_concepts, mcp__plugin_eklavya_eklavya__get_session_quiz_plan, mcp__plugin_eklavya_eklavya__record_attempt, mcp__plugin_eklavya_eklavya__upsert_concepts, mcp__plugin_eklavya_eklavya__get_learner_profile, mcp__plugin_eklavya_eklavya__memory_search and mcp__plugin_eklavya_eklavya__memory_get to permissions.allow in my ~/.claude/settings.json, keeping my existing entries.

The Desktop Code tab runs the same engine and reads the same ~/.claude/settings.json, so one rule is meant to cover the terminal and Desktop alike; a project’s .claude/settings.json also applies in both. A Desktop session in a different permission mode can still ask or refuse. An allow rule is checked before auto mode decides, so these ten calls run without being judged. Allow only these ten rather than the whole Eklavya server, which would also let tools such as memory_delete, memory_write and set_config run without asking.

One call stays out on purpose: when the commit gate finds questions switched off for the session, it tells Claude to run set_config to turn them back on. That tool can change any Eklavya setting, so allowing it would let Claude change settings without asking. Expect auto mode to ask there, and approve it when you do want questions back.

Eklavya’s other read tools (memory_timeline, memory_file_history, memory_status, memory_collections, code_outline and code_find_symbol) are marked read-only in the MCP protocol, which lets Claude Code run them in auto and plan mode without an entry. Unverified on a live host: if auto mode still refuses one, add it beside the ten.

A miss in the panel starts the explainer agent, and auto mode judges that too. It drops Agent allow rules, so no setting skips the check. If its classifier is briefly unavailable you may see eklavya:eklavya-explainer denied by auto mode. The panel asks once more, then hands the explainer to Claude, whose own start normally gets the page written, so there is nothing to fix.

If you do not know the answer

Choose “I don’t know” to get an explanation grounded in the work. Skipping moves on without one, and the question is not asked again in that session. Both receive grade 0, but Eklavya records the difference so it can respond appropriately. A correct multiple-choice answer receives at most grade 4; Grading and scheduling explains the scale.

Make it fit your workflow

Use The dials to change the pace, topic or difficulty. Use /eklavya:quiz for practice, /eklavya:progress for learning progress, and /eklavya:memory for project history. If expected questions never arrive, start with Troubleshooting.