termgrid-core 1.5.5

Deterministic terminal grid state engine with invariant enforcement and backend decoupling.
Documentation
# Design Rationale

## Why Grid State Instead of Stream Output?

Stream-based rendering (raw ANSI writes) couples application logic to presentation side effects and makes replay, testing, and validation difficult.

A grid state model:

- Is inspectable and testable.
- Enables deterministic replay.
- Supports multiple backends (ANSI, xterm.js, offscreen buffers).
- Separates mutation semantics from output encoding.

## Why Explicit Continuation Cells?

Wide glyphs create ambiguity in stream models. Explicit continuation cells:

- Prevent partial overwrites of wide glyphs.
- Make invariants verifiable.
- Keep backend logic simple (render lead cell only).

## Why Registry/Profile Width Policy?

Unicode width handling varies across environments. A registry/profile:

- Centralizes width policy.
- Makes width resolution deterministic and explicit.
- Allows controlled overrides without relying on terminal behavior.

## Why Damage Tracking?

Incremental redraw reduces backend work. Damage tracking:

- Enables redrawing only affected regions.
- Improves performance for high-frequency updates.
- Avoids backend-side heuristics.

## Why Invariant Enforcement?

Rendering bugs can be subtle and compounding. Formal invariants:

- Detect corruption early.
- Prevent silent layout drift.
- Support safe refactors and vendor review.