# Inkhaven 1.4.3 — The Inner Editor (Part B)

_Completes **INNER_EDITOR-1**. Part A (1.4.2) shipped the editorial core — the engine, the
Output surface, the ambient trigger. Part B makes the Editor **conversational** and
**teachable**: discuss its observations in the AI pane, declare a craft choice deliberate so
it stops raising it, drive it from scripts, and watch its budget in the cost dashboard.
Built on the same in-tree infrastructure — **no new dependencies**. **Two crash/display
fixes** from the Part A feedback land here too (see below)._

_Plan: [INNER_EDITOR-1_PLAN.md](../PROPOSALS/INNER_EDITOR-1_PLAN.md) · New tutorial:
[88](../Tutorials/88-inner-editor.md)_

## Two fixes first (from the 1.4.2 Inner Editor feedback)

- **Background AI jobs no longer crash the TUI.** `start_bg_job` spawned a plain OS thread
  that didn't inherit the main thread's Tokio runtime, so any background LLM call
  (`collect_blocking` → `tokio::spawn`) panicked with *"there is no reactor running"* — which
  is exactly what Inner Editor's `engage` hit. The job runner now captures the runtime handle
  and enters it in the worker. One fix for every background job (also closes a latent WORLD-4
  slow-auto crash).
- **No more stray `.` in the editor pane.** `collect_blocking` printed a per-token progress
  dot to stderr — fine on the CLI, but the TUI owns the terminal in raw mode, so the dots
  splattered onto the screen during an engage. The ticks are now suppressed inside the TUI.

## Talk to the Editor — conversation mode

The AI pane gains a third structured scope (after Socrates). Press **`C`** in the
`Ctrl+V O` overview, or cycle the pane to **Editor** with **F9**: the AI becomes the Inner
Editor, opening with what it noticed about the open paragraph and ready to discuss it — in
the same non-prescriptive voice (it helps you think; it never drafts your prose). Editor
conversations are tagged under the `inner_editor` cost budget.

## Teach it — record-as-intent

The Editor will sometimes notice a pattern you put there on purpose. Tell it once and it
stops raising that category. Select a finding in Output and press **`i`**, or:

```sh
inkhaven inner-editor intent dictionary_richness --description "the silence motif is intentional"
inkhaven inner-editor intent style_instability --chapter ch04 --description "Ch.4 alternates POV"
```

This writes into the **shared intent ledger** — the same one Inner Socrates consults — under
new style-intent kinds (`deliberate_repetition`, `voice_instability_intentional`,
`prose_belief_intentional_distance`, …). Future Editor findings of that category, in scope,
are suppressed. The two Inner-family members now share one declared-intent record.

Findings also record the paragraph's current **snapshot id**, so
`inkhaven inner-editor findings history --paragraph <id>` reads as a timeline across drafts.

## Script it — `ink.inner_editor.*`

Seven new Bund words: `findings.list` / `usage.today` / `config` / `categories` /
`system_prompt` (read-only), `intent.declare` (`store_write`), and `engage` (`ai_write`) —
run an engagement and get its findings back as dicts. See
[BUND_TUTORIAL.md](../Bund/BUND_TUTORIAL.md).

## See the cost — dashboard integration

**`inkhaven cost`** (and **`Ctrl+B $`**) now surface the Inner Editor budget alongside World
and Inner Socrates — `inner editor · editor_engagement N/200` — read from the feature's own
store. The cap, as everywhere, **informs but never blocks**.

## Dependencies & compatibility

**No external application or binary dependencies; no new runtime crates.** The new intent
kinds are additive (existing ledger entries and `.isl` bundles keep working); no on-disk
shape moved. Note the chord: the Inner Editor family lives on **`Ctrl+V O`** (O = *Observe*)
— the RFC's `Ctrl+B E` was already `ToggleSound`, and an existing binding isn't displaced.
Tests 1875 → 1879.
