# Inkhaven 1.3.24 — The Output Pane

_A new right-side **Output** pane for structured, one-way notifications from every
subsystem — the first slice of RFC PANE-1, the planned TUI rearchitecture. The AI
pane stays a conversation; Output becomes the home for everything Inkhaven needs
to tell you about without expecting a reply: translation results, Bund script
output, and (in later cycles) lexicon proposals, variety renderings, and world
fact-checks. One message envelope, one channel, `Ctrl+B Tab` to reach it. Zero
new dependencies — it reuses the in-tree DuckDB, ratatui, Bund VM, and chord
machinery. Reference: [PANE-1_PLAN.md](../PROPOSALS/PANE-1_PLAN.md)._

## The pane

- **`Ctrl+B Tab` / `Ctrl+B Shift+Tab`** cycle the right-side region between the
  **Output** pane and the **AI** pane (and focus the one you land on). The
  default is AI, so the launch view is unchanged; Output is one chord away.
- The Output pane lists active messages — a severity icon (`●` info, `⚠`
  warning, `⊗` contradiction, `↻` progress), the kind, and a one-line summary —
  newest first, pinned on top. Navigate with `↑`/`↓` (`j`/`k`), `g`/`G` for
  first/last.
- **Per-message actions**: `o` / Space **expands** detail (a translation's
  per-word trace and alternatives render inline), `d` **dismisses**, `p`
  **pins**, `r` **remembers** (commits a translation to memory), and `a`
  **asks the AI** about it.

Messages persist in a per-project DuckDB store (`output.db`), with a universal
envelope — kind, severity, lifetime, metadata, pin/snooze/dismiss state — that
every emitter writes through. A headless CLI mirrors it:
`inkhaven output show | emit | dismiss | clear`.

## What flows into it now

- **Translation (LANG-3).** Running a translation (`lang.translate` / `reverse` /
  `cross`) in the editor lands a `translation_result` in Output — `source →
  target`, expandable to the per-word trace; an uncovered word adds a `⚠`
  report. `r` commits the translation to the language's memory.
- **Bund `ink.io.*`.** A new stdlib family: `ink.io.print` / `log` emit
  notifications, `ink.io.notify` emits an arbitrary structured kind, and
  `ink.io.message.list` / `count` / `dismiss` / `pin` / `unpin` query and
  manage them. So a script's output finally has a reliable home inside the TUI.

## The ask-AI bridge

Press `a` on any Output message to ask the AI about it. The message's full
structured detail is carried into the conversation **by reference, not value**: a
short quote goes into the AI input, the rich detail is armed as context for the
next prompt, and focus moves to the prompt so you just type your question. The
model sees the derivation; the conversation stays clean.

## Design notes

- **Zero new dependencies.** PANE-1 is structural — the message store is new
  DuckDB tables on the existing engine, the pane is a ratatui widget, the
  `ink.io.*` words are Bund stdlib, the chord rides the existing meta-prefix
  ladder.
- **Non-breaking.** Every existing AI chord and behavior is preserved; the AI
  pane only sheds its accidental role as the catch-all for non-conversational
  output. The shell CLI is unaffected — translation commands emit to Output only
  when a store is active (i.e. in the TUI).
- **Foundation for what's next.** The same envelope and pane will host the world
  fact-checker (WORLD-1) and a Consistency Sentinel; new emitters declare a kind
  and call `emit`.

Tests 1576 → 1582. Full plan: [PANE-1_PLAN.md](../PROPOSALS/PANE-1_PLAN.md).

## Looking ahead

PANE-1 continues next cycle: a dedicated `Ctrl+B U` translation chord family (so
you can translate from the editor without a script), pane persistence and the
Output-default flip, retargeting the LANG-1 lexicon-proposal and LANG-2
variety-rendering surfaces into Output, and the status-line cleanup.
