## Choose what to build

Start with the outcome\,&#32;not the API\.

### “I want my agent to do X—build Y”

| I want… | Build… | Why this surface fits |
| --- | --- | --- |
| A human to type&#32;`/seeds hours`&#32;and receive a local answer | An&#32;**extension slash command** | The command handler can answer without asking a model\. |
| The model to query inventory or reserve a specific item | A&#32;**model\-callable tool** | It has a parameter schema\,&#32;structured results\,&#32;cancellation and errors\. |
| Several commands\,&#32;tools and lifecycle handlers to share one domain | An&#32;**executable extension** | One default factory registers the related capabilities\. |
| A key chord to insert a useful phrase or open a local view | An&#32;**extension keyboard shortcut** | It is an operator convenience\,&#32;not a model tool\. |
| A startup option such as&#32;`--seed-quiet` | An&#32;**extension CLI flag** | The extension declares the flag before the CLI’s extension\-aware argument pass\. |
| To inspect\,&#32;block or transform a tool call | An&#32;**extension event handler** | `tool_call`&#32;and&#32;`tool_result`&#32;are the supported interception surfaces\. |

A slash command is&#32;**not**&#32;a tool the model can call\.&#32;Register a tool when the model needs a permanent domain capability\.&#32;Share a domain function between the command and tool rather than asking the model to “run the slash command\.”

“Human command” also does not mean “cryptographically proven human keystroke\.” An SDK or RPC host can deliberately submit slash\-command text through the command\-dispatch path\.&#32;Extensions run in\-process\;&#32;this workbook’s authorization examples are domain checks\,&#32;not a sandbox\.

### When code is unnecessary

| I want… | Build… | Important boundary |
| --- | --- | --- |
| A reusable instruction such as “summarize a fictional field observation” | A&#32;**prompt template** | It expands text\;&#32;it does not itself execute a TypeScript factory\. |
| A named text workflow invoked through a slash command | A&#32;**file\-based slash command** | Markdown command expansion is different from&#32;`registerCommand()`&#32;executing code locally\. |
| A reusable body of expertise\,&#32;instructions and supporting files | A&#32;**skill** | Discovery makes guidance available\.&#32;It does not automatically execute every script in the skill directory\. |
| Standing or conditionally applied instructions | A&#32;**rule** | Rules guide model behavior\.&#32;They are not filesystem or network enforcement\. |
| Different colors and visual styling | A&#32;**theme** | A theme changes presentation\,&#32;not tool authority\. |
| A different input\-editor frame | An&#32;**extension composer shape** | A shape is executable rendering code\,&#32;separate from a theme\. |

### When the integration belongs elsewhere

| I want… | Build… | Important boundary |
| --- | --- | --- |
| Only a model\-callable function\,&#32;especially in an existing tool package | A&#32;**standalone custom tool** | Its factory returns tools\,&#32;and its legacy&#32;`execute`&#32;argument order differs from native extension tools\. |
| To maintain an existing event\-only integration | A&#32;**legacy hook**\,&#32;or migrate it to an extension | JS\/TS hook factories can enter the extension loading pipeline\.&#32;New combined integrations are usually clearer as extensions\. |
| A new model endpoint\,&#32;transport or login flow | A&#32;**model\-provider registration** | This requires real provider configuration\.&#32;Registering metadata does not prove inference works\. |
| Tools or resources supplied by a separate process or remote service | An&#32;**MCP server** | The server owns a protocol endpoint\;&#32;the OMP client connects to it\. |
| To distribute extensions\,&#32;tools\,&#32;commands and optional features together | A&#32;**plugin bundle** | A package manifest selects entries\.&#32;Installation\,&#32;discovery and execution remain distinct steps\. |
| To embed OMP in an application | An&#32;**SDK host with inline extension factories** | The host owns session creation\,&#32;runtime initialization\,&#32;UI and disposal\. |
| To expose a Gemini\-style extension description | A&#32;**declarative&#32;`gemini-extension.json`&#32;manifest** | In this snapshot\,&#32;it is a metadata capability—not an automatic launcher for tools\,&#32;factories\,&#32;context or MCP servers named inside it\. |

There is overlap by design\.&#32;A plugin may contain an executable extension\,&#32;a skill and a prompt\.&#32;An executable extension may register a tool and a human command\.&#32;An MCP tool may ultimately appear in the same tool registry as a local tool\.

The useful question is always\:

> Which component discovers this file\,&#32;which component executes it\,&#32;and which interface can actually invoke the resulting capability\?

### The workbook’s route

Three projects carry the main progression\:

1. [Seed Desk\:&#32;welcome and inventory](<https://present-sketch-tp94.here.now/chapters/extensions-seed-desk-welcome-and-inventory#extensions-seed-desk-welcome-and-inventory>)\:&#32;a volunteer and an agent learn the same fictional desk information\.
2. [Seed Desk\:&#32;reservations](<https://present-sketch-tp94.here.now/chapters/extensions-seed-desk-reservations-on-the-active-branch#extensions-seed-desk-reservations-on-the-active-branch>)\:&#32;reads become revision\-checked\,&#32;branch\-aware actions\.
3. [Review Desk](<https://present-sketch-tp94.here.now/chapters/extensions-review-desk-edit-and-decide-locally#extensions-review-desk-edit-and-decide-locally>)\:&#32;a release note is inspected\,&#32;edited\,&#32;accepted\,&#32;rejected or cancelled—never published\.
4. [Package Lab](<https://present-sketch-tp94.here.now/chapters/extensions-package-lab-one-file-to-an-embedded-host#extensions-package-lab-one-file-to-an-embedded-host>)\:&#32;a notebook moves from one file to helpers\,&#32;a manifest and SDK embedding\.

Focused laboratories then cover native UI\,&#32;interception\,&#32;session navigation\,&#32;background delivery\,&#32;providers\,&#32;resources and file fallbacks\.

Use the&#32;[public feature reference](<https://present-sketch-tp94.here.now/chapters/extensions-public-feature-reference#extensions-public-feature-reference>)&#32;and&#32;[all 46 events](<https://present-sketch-tp94.here.now/chapters/extensions-all-46-extension-events#extensions-all-46-extension-events>)&#32;as lookup chapters\.

### How to read claims

This workbook uses three labels\:

- **Observed\:**&#32;a completed check is recorded in the supplied execution report\.
- **Source\-backed\:**&#32;the behavior follows from the supplied implementation or public type contract\.
- **Exercise\:**&#32;a proposed experiment or new small example\.&#32;Its expected result is explained\,&#32;but it is not added to the recorded proof count\.

The stories use fictional people and data\.&#32;The observations describe the recorded checks\,&#32;not real seed\-library operations\,&#32;a real release\,&#32;or a provider account\.

The workbook website and its downloads do not operate your OMP session\.&#32;There is no tutorial\-browser control API implied by these lessons\.
