2. Start from Main
The exact syntax
OMP slash command — enter in Main’s composer, not a shell:
/tan <work>
Replace <work> with the task. The command takes the remaining, trimmed text as the work item. Multi-word text needs no special quoting.
There are no /tan flags in the supplied implementation.
Main can already be streaming when you launch a tan. The launch path does not require aborting Main’s current turn.
Fictional practice project
Imagine a disposable checkout containing these files.
data/catalog.csv — fictional fixture:
title,shelf,label
The Paper Moon,green,amber
A Map of Clouds,green,blue
The Quiet Atlas,silver,amber
docs/label-guide.md — fictional fixture:
Green-shelf books use amber labels.
Silver-shelf books use silver labels.
docs/visitor-faq.md — fictional fixture:
Visitors may browse the green and silver shelves.
Ask a librarian if a shelf label is unclear.
You can work through the examples without creating anything. For a live rehearsal, have Main prepare these fixtures in a disposable practice directory—not by overwriting similarly named files in an existing project.
Worked scenario: launch a bounded audit
First confirm that you are in Main and that the fictional files are available.
OMP slash command — Main only:
/tan Audit the fictional Lantern Library label rules. Read data/catalog.csv and docs/label-guide.md. Report mismatched labels with their expected labels. Do not edit any file, run project-wide repairs, or change Main's work.
Expected observations
- A dispatch status identifies a background job, such as the generated job ID shown after
Dispatched background tan. - The tan appears in the runtime Hub under a generated
Tan-…agent ID. - Main remains the underlying conversation; launch does not automatically focus the tan.
- If Main was already working, its turn can continue alongside the tan.
The compact dispatch breadcrumb may show only a shortened work preview. While Main is streaming, the controller queues that breadcrumb for later context rather than steering it into Main’s current response.
Fictional acceptance check
Against the unchanged fixtures, a complete audit should identify:
- A Map of Clouds: blue → amber.
- The Quiet Atlas: amber → silver.
That is a correctness check for the assignment—not a promised model response.
If the tan finishes before you reach it, use Continue a finished tan. Finishing quickly is not a control failure.
Prerequisites and launch failures
| Observation | Meaning and recovery |
|---|---|
Usage: /tan <work> | No nonblank work was supplied. Return to Main and provide a concrete assignment. |
No active model available for /tan. | Main has no active model to pass to the clone. Resolve model availability in Main before launching again. |
Background jobs are disabled; enable async jobs to use /tan. | The actual check is that this session has an async job manager. See the correction below. |
/tan requires a persisted session. | An in-memory session is insufficient. Use a normal persisted interactive session. |
| Background-job limit reached | Wait for an appropriate running job to finish, or deliberately cancel an identified job. Do not cancel an arbitrary row to make room. |
| A filesystem, session, authentication, or provider error | Determine whether dispatch happened before retrying. A launch acknowledgment does not prove that the first model request succeeded. |
A persisted session need not already contain an assistant answer: the controller calls ensureOnDisk() and flushes it before forking. An in-memory session, however, has no persisted parent path to fork.
Important recovery correction
Although the missing-manager error says “enable async jobs,” this
/tancontroller does not testasync.enabled. The shown SDK constructs the primary async manager independently of that toggle.Therefore, changing
async.enabledis not an established repair for a missing manager, nor is that toggle a proven/tanon/off switch here. Have Main diagnose the current host/session setup and implementation version.The SDK does read
async.maxJobswhen constructing the manager. That is not evidence of live resizing of an existing manager.
Keep a copy of an important launch request. The slash-command handler clears its text before starting; the focused-chat restoration behavior described later is not a blanket guarantee for failed slash-command launches.
What is inherited—and what is not synchronized
| At initial launch | Boundary |
|---|---|
| Persisted conversation entries | The child reconstructs context from a journal copy. Unfinished streaming text, unsent drafts, and pending user queues are not a synchronized continuation of Main. Compaction can affect what history becomes active model context. |
| Main’s current model and configured thinking selector | These are passed at launch, including an auto thinking selector when configured. Main’s later choices are not a live model mirror for the tan. |
| Main’s current system-prompt blocks | A snapshot is passed, not a continuously synchronized prompt. |
| Main’s enabled tool names | This includes enabled tools that are not top-level-visible. The SDK rebuilds tools; names alone do not guarantee identical availability or implementations. |
| A settings snapshot | The subagent helper applies its own overrides. Shared services and storage still exist. |
| Model registry and authentication infrastructure | The tan is not a separate account or permission sandbox. |
| Working directory and inherited workspace context | No isolated repository copy is created. |
Main’s initial local:// mapping | It is captured for the initial background run; later Main session changes do not retarget that captured mapping. |
Permission caveat: the subagent settings helper sets the default approval mode to yolo for unattended execution and disables the advisor by default. Explicit per-tool approval policies are still inherited. Do not assume Main’s interactive approval behavior is reproduced unchanged.
The initial tan is created headlessly. Focusing it later does not recreate it as a new Main session with all interactive-only facilities.
It also does not inherit Main’s live extension instances, editor, shell/kernel state, browser ownership, or active provider request as one cloned runtime. Initial extension discovery is disabled, but that is not equivalent to “all custom capabilities are disabled”: SDK custom-tool discovery and supplied MCP proxy tools are separate paths.
Newly staged images are not forwarded by the launch command
The current /tan slash handler forwards work text only. TanCommandController.start() does not accept an image argument, and its initial clone.prompt() supplies no images.
Consequently:
- An image already recorded in inherited conversation history may be part of the forked history.
- An image newly staged beside
/tan …is not forwarded as a new attachment by this launch path. - A textual image marker in the work request is not evidence that its image bytes arrived.
For a new image, launch first, focus the verified Tan ID, then attach it to an ordinary chat message. Alternatively, provide an authorized, accessible file and ask the tan to read it.
Inspect the composer after launch. Do not assume staged attachments were either sent or safely discarded.
Tangent work and live control · Source chapter: tan/2-start-from-main. Original evidence remains scoped to its recorded snapshot.