---
title: "03 — The Interaction Surface — Context, Tools, Modes, and Keys"
uid: interaction-surface
tags: ["keyboard", "roadmap:claude-code", "context", "permissions", "tools", "claude-code"]
excerpt: "The loop is fixed; what you control is what it perceives and the leash it runs on — context, tools, and permission modes. The keyboard shortcuts are handles on those three axes."
date: 2026-08-13T03:28:23+0000
source: https://www.aveshina.my.id/en/blog/interaction-surface
---

"Just typing prompts" was how I described driving a Claude Code session, which made the keyboard shortcuts a memorization exercise. The frame that fixed that: **the agentic loop is fixed; everything I control is either the input the loop perceives or the leash it runs on.** [1] Inputs are *context* and *tools*; the leash is *permission modes*. Once I saw those three axes, the keyboard shortcuts stopped being a memorization exercise and became obvious handles on them.

The framing that clicked is to stop thinking of a session as a chat and start thinking of it as a loop I'm continuously tuning. Every prompt I type, every file I @-mention, every /compact I run is me shaping *what the model perceives next*. Every Shift+Tab, every Ctrl+C, every Esc+Esc is me shaping *how much rope the loop has*. The model and the loop itself never change session to session — my tuning of those two axes is the entire job [1][3].

## Context: the workspace the loop perceives

The first axis is **context** — the total information the model holds in active memory at once: the conversation history, every file it has read, and the results of every terminal command it has run [2]. It's a temporary workspace measured in tokens, and it fills up. As it fills, the model can start to "forget" early details or lose accuracy — what the roadmap calls context rot. Managing it (through /compact, /clear, and fresh sessions) is what keeps responses sharp and costs predictable.

The way of thinking I use: context is a whiteboard, not a database. It's not persistent storage; it's working memory for the current task. When I want things to actually persist across sessions, that's a different mechanism entirely (the CLAUDE.md memory file, covered in its own post). The whiteboard gets wiped on /clear and summarized on /compact.

## Tools: the hands the loop can use

The second axis is **tools** — the functions that let the model act rather than just generate text [3]. They split into client-side and server-side:

- **Client-side tools** touch my local environment: Bash runs terminal commands, Read and Edit manipulate files, Glob and Grep search the codebase.
- **Server-side tools** reach outward: WebSearch fetches real-time information from the internet.

MCP servers and plugins (covered in their own posts) extend this set — they add new tools the loop can call. The thing I had to internalize is that *every tool the loop can reach is also a risk surface*. A loop with Bash and no approval prompts can run anything I could run. That's why tools and permission modes are separate axes: tools say what's _possible_, permissions say what's _allowed right now_.

```figure
<svg viewBox="0 0 740 260" xmlns="http://www.w3.org/2000/svg" class="my-6 w-full max-w-2xl" role="img" aria-label="Two axes I control around a fixed loop. Left axis: Inputs — Context (whiteboard that fills) and Tools (client-side: Bash, Read, Edit, Grep; server-side: WebSearch). Right axis: Leash — Permission Modes (Plan, Default, Accept-Edits, Bypass). Arrows from both sides feed into a central box labelled 'Agentic loop (fixed)'.">
  <defs>
    <marker id="is1" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">
      <path d="M0,0 L10,5 L0,10 z" fill="#64748b"/>
    </marker>
  </defs>
  <g font-family="ui-sans-serif, system-ui, sans-serif" text-rendering="geometricPrecision">
    <rect x="280" y="100" width="180" height="60" rx="10" fill="#e0e7ff" stroke="#6366f1" stroke-width="1.8"/>
    <text x="370" y="125" font-size="13" font-weight="700" fill="#1e1b4b" text-anchor="middle">Agentic loop</text>
    <text x="370" y="143" font-size="10" fill="#475569" text-anchor="middle">fixed — model + perceive/decide/act</text>

    <!-- LEFT: inputs -->
    <text x="110" y="40" font-size="12" font-weight="700" fill="#052e16" text-anchor="middle">Inputs (what it perceives)</text>
    <rect x="30" y="55" width="170" height="40" rx="8" fill="#dcfce7" stroke="#16a34a" stroke-width="1.5"/>
    <text x="115" y="72" font-size="11" font-weight="700" fill="#052e16" text-anchor="middle">Context</text>
    <text x="115" y="87" font-size="9.5" fill="#475569" text-anchor="middle">whiteboard · fills with tokens</text>
    <rect x="30" y="110" width="170" height="60" rx="8" fill="#fef9c3" stroke="#ca8a04" stroke-width="1.5"/>
    <text x="115" y="128" font-size="11" font-weight="700" fill="#422006" text-anchor="middle">Tools</text>
    <text x="115" y="143" font-size="9" font-family="ui-monospace,monospace" fill="#422006" text-anchor="middle">Bash · Read · Edit · Grep</text>
    <text x="115" y="157" font-size="9" font-family="ui-monospace,monospace" fill="#422006" text-anchor="middle">WebSearch · +MCP</text>
    <path d="M200,110 C240,110 250,120 278,125" fill="none" stroke="#64748b" stroke-width="1.5" marker-end="url(#is1)"/>

    <!-- RIGHT: leash -->
    <text x="610" y="40" font-size="12" font-weight="700" fill="#500724" text-anchor="middle">Leash (how much rope)</text>
    <rect x="540" y="55" width="170" height="115" rx="8" fill="#fce7f3" stroke="#db2777" stroke-width="1.5"/>
    <text x="625" y="75" font-size="11" font-weight="700" fill="#500724" text-anchor="middle">Permission Modes</text>
    <text x="625" y="95" font-size="9.5" fill="#500724" text-anchor="middle">Plan · read-only</text>
    <text x="625" y="112" font-size="9.5" fill="#500724" text-anchor="middle">Default · ask first</text>
    <text x="625" y="129" font-size="9.5" fill="#500724" text-anchor="middle">Accept-Edits · auto files</text>
    <text x="625" y="146" font-size="9.5" fill="#500724" text-anchor="middle">Bypass · no prompts</text>
    <path d="M540,125 C500,125 490,125 462,130" fill="none" stroke="#64748b" stroke-width="1.5" marker-end="url(#is1)"/>
  </g>
</svg>
```

## Permission modes: the leash

The third axis — the leash — is **permission modes**, the settings that control how much autonomy the loop has [4]. Default mode asks for my approval before any file edit or shell command. Accept-Edits lets the agent modify files automatically while still prompting for terminal commands. Plan mode restricts it to read-only tools so it can research and outline a strategy without touching anything. And Bypass-Permissions (often called "YOLO mode") removes all approval prompts for use in secure, isolated environments.

The roadmap is explicit that these are a dial, not a toggle, and the dial is the entire safety model [4]. I cycle them with Shift+Tab, and the mode I'm in decides how many destructive actions can happen between my checks. Plan mode for exploration, Default for real edits, Accept-Edits only for repetitive mechanical work where I trust the pattern, Bypass never on a machine I care about.

## The keys that steer the loop

With those three axes in hand, the keyboard shortcuts are just handles. I stopped memorizing them as a list and started reading them as operations on context, tools, or the leash:

- **Ctrl+C** — the kill switch. Sends an interrupt to stop the current activity immediately: a runaway loop, a search taking too long, a response going the wrong way [5]. It's how I yank the leash.
- **Ctrl+R** — reverse search through command history. Finds and reuses previous prompts or commands by typing a few letters [6]. It's context recovery.
- **Esc** — exits menus, cancels active inputs, clears the command line [7]. A light reset of interface state without touching the underlying process.
- **Esc + Esc** — the Rewind feature, the one that took longest to click. Double-tap opens a temporal menu: jump back to any previous prompt, restoring the conversation, the code, or both [8]. Before every change Claude snapshots affected files, so I can discard an entire failed branch of reasoning without manual git surgery.
- **Shift+Tab** — cycles permission modes on the fly [9]. The leash dial, under my fingers mid-session.

The keys I reach for most are Ctrl+C (stop a drift), Esc+Esc (rewind a bad turn), and Shift+Tab (tighten or loosen the leash before a risky step). Everything else is occasional.

## MCP and plugins: growing the tool menu

Two extension mechanisms sit on the tools axis and deserve a flag here (full posts follow). **MCP** — the Model Context Protocol — is the open standard that connects Claude to external tools, databases, and services, turning it from a local file editor into a connected agent [10]. **Plugins** bundle multiple customizations (slash commands, agents, skills, hooks, MCP servers) into one installable unit [11]. Both grow the tool axis; neither changes the loop. The discipline is the same as with built-in tools: every new tool is new capability _and_ new risk surface.

## How I use this

The habit these notes left me with is a pre-flight check shaped exactly around the three axes. Before a session, I ask: is the **context** clean for this task (or do I need /clear)? Are the right **tools** available (and are the wrong ones — like an MCP server I don't need — adding noise)? Is the **permission mode** set to how much rope this task actually warrants? A session that drifts is almost always one where I let one of those three slip — context rotting, a tool I forgot was enabled, a leash left too loose. Tuning the three axes is the whole job; the loop does the rest.

## References

[1] Anthropic, "Best Practices for Claude Code," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/best-practices](https://code.claude.com/docs/en/best-practices)

[2] Anthropic, "The context window," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/how-claude-code-works#the-context-window](https://code.claude.com/docs/en/how-claude-code-works#the-context-window)

[3] Anthropic, "Tools," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/how-claude-code-works#tools](https://code.claude.com/docs/en/how-claude-code-works#tools)

[4] Anthropic, "Permission modes," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/permissions#permission-modes](https://code.claude.com/docs/en/permissions#permission-modes)

[5] Anthropic, "Interactive mode," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/interactive-mode](https://code.claude.com/docs/en/interactive-mode)

[6] Anthropic, "Reverse search with Ctrl+R," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/interactive-mode#reverse-search-with-ctrl+r](https://code.claude.com/docs/en/interactive-mode#reverse-search-with-ctrl+r)

[7] Anthropic, "Interactive mode — Esc," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/interactive-mode](https://code.claude.com/docs/en/interactive-mode)

[8] Anthropic, "Checkpointing," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/checkpointing](https://code.claude.com/docs/en/checkpointing)

[9] Anthropic, "Configure permissions," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/permissions](https://code.claude.com/docs/en/permissions)

[10] Anthropic, "Connect Claude Code to tools via MCP," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/mcp](https://code.claude.com/docs/en/mcp)

[11] Anthropic, "Discover and install prebuilt plugins through marketplaces," Claude Code Docs, 2025. [Online]. Available: [https://code.claude.com/docs/en/discover-plugins](https://code.claude.com/docs/en/discover-plugins)

```quiz
Q: The three axes you control around the fixed agentic loop are…
- prompt length, model size, response timeout
- context (inputs perceived), tools (hands available), permission modes (the leash)
correct: 1
explain: The loop itself is fixed. What I tune is what the model perceives (context + tools) and how much autonomy it has (permission modes).

Q: What does "context rot" refer to?
- Files literally decaying on disk
- As the context window fills, the model loses track of early instructions or loses accuracy
correct: 1
explain: Context is a finite workspace measured in tokens. When it fills, earlier details get forgotten or accuracy degrades — managed with /compact, /clear, and fresh sessions.

Q: You're about to let the agent make many repetitive file edits you trust. Which mode fits?
- Plan mode
- Accept-Edits mode
correct: 1
explain: Accept-Edits auto-approves file edits while still prompting for shell commands. Plan is read-only; Default asks every time; Bypass removes all prompts (too risky on a machine you care about).

Q: Double-tapping `Esc` (Esc + Esc) opens the Rewind menu. What can you restore?
- Only the conversation text
- The conversation, the code state, or both — to any previous prompt checkpoint
correct: 1
explain: Claude snapshots affected files before each change. Esc+Esc lets you jump back to any prior prompt and restore conversation only, code only, or both.

Q: MCP servers and plugins change the loop by…
- replacing the underlying model with a different one
- growing the tool menu the existing loop can call
correct: 1
explain: MCP and plugins add new tools/capabilities the same loop reaches for. They extend the tools axis; they don't change the loop or the model.
```
