Skip to content

Batch 8 Synthesis — Deckline-Core (UI Catalog / Single-Color / Ambient / LISP)

Reading note. Several Batch 8 entries were captured before the 128×75 ratification and still cite the old 80×25 / Rows 1–23 / Row 24 grid in their prose (e.g. sc-im, csvlens). This synthesis cites the techniques those entries demonstrate, recast at the 128×75 canon. Where an entry’s number is stale, the number is wrong; the pattern is not.


The Batch 8 corpus is 49 production TUIs. Across them, the same finite set of interaction patterns recurs — which is exactly what makes a catalog worth building: KN-86 does not need to invent UI idioms, it needs to pick from a settled vocabulary and bind each pick to a surface and an FFI primitive. This section extracts the patterns by category, names the strongest exemplar(s), and maps each to a KN-86 surface + the constrained cell API.

PatternStrongest Batch 8 exemplar(s)KN-86 binding
Hierarchical drill-in / back-out (push a view, pop with one key)hackernews-TUI (Story ▸ Article ▸ Comment view stack, backspace/C-p pops), visidata (sheet-stack: drill pushes, q pops, Shift+S shows the stack as a sheet), logradar (sources ▸ patterns ▸ details, Enter drills / b backs)Maps 1:1 onto the existing drill-into / nav_stack / BACK model (test_nav_stack). hackernews-TUI is the cleanest reference impl — adopt its “every view is reachable by drilling in, dismissable by backing out, BACK is universal” contract verbatim. visidata’s “show the nav-stack as a navigable surface” is the bonus move: a BACK-history that is itself drillable.
Modal (vim-rooted: NORMAL / INSERT / VISUAL)sc-im, csvlens, visidata, chronos — uniformly vim-modalThe nEmacs structural editor (ADR-0008, ADR-0016) and any editor-grade cart inherit the modal spine. The current mode renders in chrome (Row 0 or the surface’s own status line); the mode-cycle key is consistent per surface.
F-key / Row-74 contextual hint barmicro (nano-style bottom key-hint bar that changes with context), mc (F1–F10 digit-as-affordance + word-as-label + inversion for active)The canonical Row 74 firmware hint strip. micro generalizes it to context-sensitive — which matters more on KN-86 because the Sweep TERM key is context-polymorphic (ADR-0016). mc validates the digit+label+inverted-active composition. Row 74 is nOSh-owned; carts never draw it.
Tab strip / numbered-tabcsvlens (TAB cycles selection mode), chronos (tab toggles the all-day strip), clipse (top filter strip), bare-deck digit tabsBare Deck Terminal’s five tabs (STATUS / CIPHER / LAMBDA / LINK / SYS) cycle on the right-half digit cluster (Sweep 1–5). TAB as a single-key “cycle what the cursor means” (csvlens row/col/cell) is the in-surface variant.
Address-jump / teleportsc-im (goab12 jumps to a named cell), chronos (gh##/gt1430 composable temporal jumps)“Type a coordinate, teleport the cursor” beats an arrow-key marathon on a 34-key budget. Adopt as the grid-nav idiom for any addressable-cell cart.
Bounded viewport over unbounded space (pan/zoom)mapscii (drag/keys pan, a/z zoom), chronos (zoom = row-semantics)Any cart with a map, star-field, node-graph, or schematic. Device input is keyboard pan (HJKL / arrows) + zoom keys; mapscii already ships the keyboard path.

Navigation headline — chronos’s zoom-as-row-semantics. chronos renders a week-view time grid where each row represents 30 / 15 / 5 / 1 minutes, switchable with +/-, while the terminal height never changes. This is the general solution to KN-86’s fixed-cell-density problem: let the operator trade range against detail by changing what each row means, not by adding rows. It generalizes past calendars to zoomable logs, waveform views, and mission timelines. On a 75-row grid this is more valuable than on the old 25-row grid — there is more range to compress and more detail to expand.

PatternStrongest exemplar(s)KN-86 binding
Single-panel viewport + chromecsvlens, browshbrowsh independently validates KN-86’s “chrome around a viewport” — Row 0 status / Rows 1–73 content / Row 74 action. The cleanest external proof the geometry is sound.
Dual-panel (source ▸ target)mc (the canonical two-pane file manager — operate toward the other pane), waves (library vs. queue)Cross-cartridge / cross-surface operations: a cart that moves an item from one collection to another. Tab switches the active pane; the verb acts toward the inactive one. The 128-wide grid finally makes two real panels legible (cramped at 80).
Three-panel master ▸ detail ▸ contextlogradar (sources ▸ patterns ▸ details), mynav (navigator + live preview + breadcrumb), clipse (list + preview + filter)A mission browser: contracts ▸ phases ▸ phase-detail. logradar is the most rigorous three-pane reference; the 128-col width is what makes three live panels possible.
Overlay / modal dialogmicrosoft-edit (draw_menubar / draw_filepicker dropdown + floating modal-dialog idiom), mcfly (full-screen ranked overlay)The reference for the Legacy Terminal mode menu (ADR-0021) and the SYS shell. A floating dialog over a dimmed surface; nOSh owns the dim + the dialog frame.
Zen / focus mode (chrome hidden, full grid to content)w3m, writeroom-mode lineage, reader-stack entriesA runtime affordance: hide Row-0/Row-74 chrome and give Rows 0–74 to content for distraction-free reading or a full-bleed ambient scene. Chrome is restored on any chrome-affecting key.
Windowed / framed regionsdesktop-tui, tvterm (Turbo Vision lineage)Box-drawn sub-regions inside the content area; border-weight encodes panel focus (see §2).
PatternStrongest exemplar(s)KN-86 binding
List + previewclipse, mynav, newsboatThe default browse surface — a scrolling list on the left, a live preview of the selection on the right. Selection = inversion (§2).
Table / grid (pinned header + scrolling body)csvlens, sc-im, sheetsui, visidataThe shared spine: pinned header row + scrolling body + bottom : command line + status strip (mode + counts). A v0.1-adjacent NoshAPI gap — mission boards, faction rosters, price tables, dispatch logs all need it. csvlens’s column-fitting against a hard column count is directly relevant (now a 128-col budget). csvlens frozen columns (f<n>) pin row-label columns.
Tree (collapsible, indent + box-drawing)hackernews-TUI (comment tree), bookokrat (TOC), mc (directory tree)Indent + CP437 box-drawing + collapse glyphs ( collapsed / expanded). This widget is also an s-expression browser — see §4.
Calendar / time-gridchronos (intraday zoomable), calcure (month grid + agenda), caps-log (year/month index)A 2D grid render (KN-86-native), not a list. Events positioned by (day-column, time-row) and sized by duration — both spatial channels, monochrome-clean.
Spatial / mapmapscii, astrotermGeometry projected into the cell grid (TEXT) or the half-block / braille sub-cell canvas (HALF-BLOCK).
Sparkline / time-serieslogradar, cavaThe single most-liftable data-display primitive — see §2 for the full recipe.
PatternStrongest exemplar(s)KN-86 binding
Command-line / : promptsc-im (: opens a bottom-line structural-command buffer), csvlens, visidataThe TERM key opening a bottom-of-screen command line is the sc-im : line in a different costume. Validates the existing TERM / REPL command surface against mature prior art.
Fuzzy search / command palettemcfly (full-screen ranked overlay), clipse (s fuzzy), mynavmcfly’s full-screen ranked overlay is the KN-86 command-palette / REPL-recall model: type, see a ranked list, commit. Universal s = fuzzy search across the corpus.
Form / structured multi-field inputchronos (Huh-library form panel for event editing — structured, not inline)The model for any KN-86 cart that needs a structured input panel (mission-config, deck-handle entry, cart settings). A multi-field panel beats inline editing for anything with more than one field.
Live-coding / text-is-the-programline (a terminal prompt is the sequencer; edit text, the loop updates next bar)The Toneline front door — and the apex LISP-integration example (§4). Two front-ends, one representation: a terse line-style prompt or the same phrase in nEmacs as an s-expression.
PatternStrongest exemplar(s)KN-86 binding
Status bar (counters, mode, separators)logradar (sources ▸ patterns ▸ events ▸ evt/m-separated live counters), csvlens (status doubles as mode indicator + command line)Direct reference for Row 0 composition: a dense row of counters separated by a box-drawing/triangle glyph. The mode-and-counts pattern is the spine.
Sparklinelogradar, cavaSee §2 (the canonical single-color recipe).
Animated glyph-state status iconslogradar ( running / starting-spinner / error / stopped — distinct glyphs, animate by frame-cycling)The model for status indication everywhere: coprocessor link, cart-load, mission status — each gets a distinct character, not a colored dot. Drives a proposed (status-glyph …) primitive. Lands on the Row-1 CIPHER-LINE status strip and Row 0.
PatternStrongest exemplar(s)KN-86 binding
Screensaver / ambient fieldneo (matrix rain), astroterm (starfield), cbonsai (bonsai)The ambient-mode scene roster — see §3 (full architecture).
Reveal / transitionno-more-secrets, react-video-asciiUnified under the canonical (reveal :style …) primitive (ADR-0033). Carousel tab change, cart-load, mission-accept, CIPHER-fragment arrival all dispatch through it.
Raster → cell mosaicbrowsh (half-block), mapscii (braille), chafa (FGBG coverage)The pixel toolkit — see §2.

Catalog summary. Eleven of these patterns are already in the KN-86 model (drill/back, modal, Row-74 hint bar, command line, reveal). The catalog’s value is the gaps it exposes against settled prior art: a table primitive (csvlens/sc-im/visidata spine), a sparkline primitive (logradar recipe), a status-glyph primitive (logradar icons), a form-panel pattern (chronos/Huh), and zoom-as-row-semantics (chronos) as a cross-surface density tool. Those five are the highest-leverage promote-to-spec candidates from the UI catalog.


KN-86 is monochrome amber (#E6A020 on #000000) — locked. Every entry in Batch 8 ships in color; none of them break when the color is removed, because across the corpus the same six-channel substitution recurs. The corpus converged on it independently — BrogueCE (roguelike ruleset), logradar (which ships an actual Mono theme), and durdraw (whose ░▒▓█ palette is the toolkit) state the same grammar in three idioms. This section distills it.

The audit across every Batch 8 entry resolves to one rule with six channels. BrogueCE states it most crisply (“design as if color never existed, then add inversion + shading + blink as three extra channels”); logradar is the best worked example; durdraw supplies the density palette.

ChannelEncodesGlyph mechanismCorpus source
Glyph = identitywhat a thing is — never colorA distinct character per category ( vs vs ; $ vs % vs @ typed-column markers; ! threat vs ? unidentified)BrogueCE rule 1; logradar status icons; visidata typed-column header glyphs
Inversion = selection / focus / hazardwhat is active or dangerousBlack-on-amber cell swapBrogueCE rule 2; csvlens + sc-im cursor/range; mc active F-key; chronos visual-mode sweep
Character density / shading ░▒▒▓█ = magnitudehow muchThe ░▒▓█ shading ramp or the ▁▂▃▄▅▆▇█ block rampBrogueCE rule 3; durdraw palette; logradar sparkline; astroterm star-magnitude ramp
Border-weight = panel focuswhich region is in focuslight / heavy / double / rounded CP437 box-drawing borderscaps-log six named border styles; desktop-tui framed regions
Leading-glyph column = item stateper-row state (pin / select / category / unread)A reserved first column carrying /*/ per rowclipse pin glyph; newsboat unread ; logradar status column
Blink / glyph-cycle on the frame tick = the old “color shimmer”attention / liveness / anomalyCycle a cell’s glyph (or invert it) on the 20 fps tickBrogueCE colorDances shimmer; logradar spike → emphasis shift; neo glitch layer

The general re-encoding rule, stated three times in three clusters and worth stating once canonically: color-as-category → glyph-as-category; color-as-magnitude → block-density-as-magnitude; selection / emphasis → inversion.

2.2 The pixel toolkit — two modes, one buffer

Section titled “2.2 The pixel toolkit — two modes, one buffer”

When a cart needs sub-cell imagery (boot art, attract scenes, gameplay sprites, maps, sparklines), the corpus supplies a two-mode pixel toolkit, both modes monochrome by construction and both reconcilable with ADR-0027’s 128×150 half-block canvas.

  • Half-block — browsh. One cell = two vertically-stacked sub-pixels via the four glyphs ' ▀▄█' (space / upper / lower / full), foreground+background pair per cell. Yields 2× vertical resolution with zero color dependency. Best for filled / image-like content. This is exactly ADR-0027’s half-block canvas: 128 cols × 75 rows × 2 vertical sub-cells = 128 × 150 effective pixels; the cart-usable region is 128 × 146 (rows 1–73). browsh’s amber-intensity ramp grades brightness per half-cell.
  • Braille — mapscii + astroterm. One cell = a 2×4 dot grid, codepoint 0x2800 + bitmask; dots OR-accumulate into a per-cell mask (brailleMap = [[0x01,0x08],[0x02,0x10],[0x04,0x20],[0x40,0x80]]), cell projection (x>>1) + w*(y>>2). Yields 2×h / 4×v sub-resolution. Best for fine / sparse geometry — contour lines, scatter, constellation stick-figures, sparkline detail.

Both drive from one accumulation buffer. A cart (or the runtime) accumulates “on” sub-pixels into a single buffer; the renderer emits either the half-block glyph set (filled mode) or the braille glyph set (sparse mode) from the same data. The block fallback shares browsh’s glyph vocabulary, so the two modes are not separate subsystems — they are two emitters over one buffer. This reconciles directly with ascii-effects.md (the brightness-ramp grammar) and the reveal-styles.md lifecycle.

Caveat — braille is not in v0.1. Braille (U+2800 block) is outside the v0.1 KN-86 Code Page (CP437 + Press Start 2P). The half-block set ( ▀▄█) is in-set. For v0.1, braille-mode content falls back to the ░▒▓█ block vocabulary; full braille is a Layer-2 character-set item (flag for character-set.md). php-gameboy rasterizes a real .gb ROM to braille and is empirical proof the “terminal runs a real handheld game” premise is sound — but it carries the same braille-vs-CP437 caveat.

2.3 The sparkline recipe — logradar, the corpus’s best single-color reference

Section titled “2.3 The sparkline recipe — logradar, the corpus’s best single-color reference”

logradar is the single best single-color reference in Batch 8 (and likely the corpus): it ships a Mono theme (“pure grayscale, accents via shape emphasis not hue”) as existence proof, with a role-based palette architecture that is exactly the model the KN-86 aesthetic-mode roster should use. Its sparkline is a complete, production recipe worth lifting wholesale into a (draw-sparkline …) NoshAPI primitive:

  • Ramp: ▁▂▃▄▅▆▇█ (U+2581–2588), 8× sub-cell vertical resolution, color fully separable.
  • Window: a 2-minute rolling history in 24 buckets (5-second intervals).
  • Normalization: soft-cap at 3× the non-zero mean — so a single spike doesn’t flatten the rest of the line into invisibility; typical activity uses the mid-range glyphs, only genuine outliers hit .
  • Emphasis: the newest bucket is bolded (rightmost). An anomalous spike shifts the line to inversion or glyph emphasis (KN-86) rather than a hue shift (logradar).

This is the right answer for any cart rendering a time series — mission tempo, credit history, system load on the Bare Deck STATUS tab. cava confirms the same ▁▂▃▄▅▆▇█ eighth-block ramp as the canonical “Unicode density” set for audio spectrum / VU; astroterm shows the same brightness-as-glyph-density lever applied to point sources (a 10-step magnitude ramp).

2.4 The KN-86 single-color rule set (one paragraph)

Section titled “2.4 The KN-86 single-color rule set (one paragraph)”

Design every KN-86 surface as if color never existed, then add three orthogonal channels back. Glyph identity carries category (a distinct character per kind — never a hue); cell inversion (black-on-amber) carries selection, focus, and hazard; and character density — the ░▒▓█ shading ramp for area and the ▁▂▃▄▅▆▇█ block ramp for bars/sparklines — carries magnitude. Layer in three supporting channels where a surface needs them: border-weight (light/heavy/double CP437 frames) for panel focus, a reserved leading-glyph column for per-row state (pin/unread/category), and glyph-cycle-or-invert on the 20 fps frame tick for attention/liveness (the old color shimmer, the anomaly flag). For sub-cell imagery, accumulate into one buffer and emit either half-block ( ▀▄█, 128×150 filled, the ADR-0027 canvas) or braille (2×4 sparse, v0.1 falls back to ░▒▓█). The one-line proof that this is sufficient: “KN-86 is logradar locked to its Mono theme, amber instead of gray.”


3. Screensaver / Ambient Mode Architecture

Section titled “3. Screensaver / Ambient Mode Architecture”

KN-86 has no canonical “what the deck shows when the operator walks away.” The Batch 8 rendering/ambient cluster (neo, astroterm, cbonsai, chafa, maze-tui) supplies a complete, code-grounded architecture for one. This proposes the nOSh ambient system.

power-idle timer (existing)
│ no input for N seconds
ambient-mode enter ──→ (reveal :radial) the scene in
procedural field generator writes cells into the
(scene-specific, no image 128×75 cell grid + the
decode, LFSR-seeded) 128×150 half-block canvas
│ per-frame, UNDER the 20 fps cap
any key ──→ ambient-mode exit ──→ (unreveal :radial) ──→ restore prior surface
  1. Idle-timer — reuse the power-idle path. Ambient mode is not a new timer. It hangs off the existing CPU-governor / screen-blank idle path (the same one ADR-0023’s accel CRT-glitch system uses). After N seconds of no input, nOSh enters ambient mode; the threshold is a SYS-tab setting.

  2. Procedural field generators write into the 128×75 cell grid (and the half-block canvas). No image decode — these are procedural generators, the profile that fits an idle-mode budget. Each scene is a small per-frame field function. This is the neo model exactly: neo’s entire cascade is per-column head/tail crawl + per-cell brightness-by-distance ramp + optional in-place character re-roll — “no image input, no per-frame raster, no heavy math.” That is the canonical single-color screensaver reference; swap neo’s green color-pair ramp for an amber-intensity LUT and it is a KN-86 scene verbatim.

  3. Scene roster, persisted as a SYS-tab setting. A named, cyclable list, stored alongside the accel CRT-glitch setting at /home/shared/nosh-config.toml:

    SceneReferenceProfile
    matrix-rainneoPer-column head/tail crawl + brightness ramp + glitch shimmer. The canonical reference.
    starfieldastrotermLowest-draw scene — sparse point sources, magnitude→glyph-density ramp. The default-economy choice.
    bonsaicbonsaiSeeded procedural growth — branches split per growth params; live-grow / hold / regen.
    offScreen blank (hands fully back to the power-idle blank).

    Cycling and persistence follow the aesthetic-mode mechanism already specified (synthesis.md §3 item 2 / Recommendation): the picker lives on the Bare Deck SYS tab.

  4. Under the 20 fps cap, so idle lowers average draw. The ambient field runs beneath the runtime’s animation cap. The starfield in particular is cheaper than a live interactive surface, so entering ambient mode reduces average draw rather than raising it — ambient mode is a power-down affordance, not a power-up one. This is the deciding constraint on scene selection: a scene that costs more than the idle surface it replaces is disqualified.

  5. Deck-State-seeded determinism. The field generators are seeded from cipher_seed[4] in the Universal Deck State (the same LFSR procgen the gameplay uses). cbonsai’s --seed=INT (same seed → same tree, every time) is the direct mechanism: your deck grows your tree. Each operator’s ambient field is deterministically theirs. A captured gameplay seed can override the deck seed to render a shareable scene (a screenshot-able artifact tied to a specific run). neo and astroterm are seedable the same way (per-column desync seed, catalog+location seed).

  6. Any-key exit via the reveal lifecycle. Entering ambient mode plays (reveal :radial) (“appears into being”); any key exits via (unreveal :radial) (CRT-shrink-inward collapse) back to the prior surface. Both compose through the canonical reveal-styles.md primitive — no bespoke transition code. nOSh intercepts the exit key (the cart underneath never sees the wake keystroke; it only resumes once the surface is restored).

chafa is a technique reference, not a device dependency — GLib footprint on the Pi, x86-only SIMD that doesn’t fire on the Cortex-A53 (the “SIMD-optimized” headline evaporates), and a dual LGPLv3+/GPLv3+ license. Adopt chafa’s model (tag-selected symbol map + FGBG coverage matcher) and reimplement against CP437 / Press Start 2P; reserve direct linking for the desktop emulator / cart-authoring toolchain only. Same posture for neo (GPL-3.0) and cbonsai (GPL-3.0): technique references, reimplemented from first principles in KN-86’s own permissively-licensed runtime, exactly as no-more-secrets was. The procedural generators are small and well-understood; reimplementation is cheap.

3.3 The (draw-framebuffer) overlap — flag, don’t duplicate

Section titled “3.3 The (draw-framebuffer) overlap — flag, don’t duplicate”

The addendum cluster flags a surface that would otherwise duplicate the half-block canvas. The old BITMAP / gfx-blit surface is gone (ADR-0027). A (draw-framebuffer pixels) helper — a sprite-from-bytes blit — should be specified as sugar over (half-block-set …), blitting a byte-array into the 128×150 half-block canvas (cart-usable 128×146). It belongs inside ADR-0027’s planned half-block helper Fe library, not as a new FFI surface. Ambient scenes that want pixel-flavored output use the same path.


KN-86 runs a KEC Lisp VM (ADR-0001, ADR-0004) bolted onto a cell-grid runtime, with cartridges authored in Fe over the constrained NoshAPI FFI (ADR-0005, amended by ADR-0027). Batch 8 contains the corpus’s best prior art for embedded-interpreter-drives-a-grid — and it validates the architecture KN-86 already chose, then extends it in four specific ways.

sc-im is the single best reference for “how a scripting language wires into a cell-grid app,” and it is production proof — a real, shipping C codebase (C + ncurses + embedded Lua) of exactly KN-86’s shape (Fe VM bolted onto a cell runtime). Three of its decisions are doctrine for KN-86:

  • A model-only cell API that never touches the render loop. sc-im’s Lua reaches cells via sc.lgetnum / sc.lsetnum / sc.lsetform — it reads and writes the model, and the render loop redraws from the model independently. The scripting layer never draws. This is direct external validation of ADR-0005’s discipline (and ADR-0027’s constrained cell API): cart-Lisp mutates state and calls bounded cell primitives; it does not own presentation. sc-im proves a real embedded interpreter can drive a grid app without render-loop authority.
  • {r}{c} context injection → Fe FFI. sc-im’s @lua("script", i) injects the calling cell’s {row}{col} context into the script. Maps onto the Fe FFI’s per-cell event dispatch.
  • :trigger → Lisp-lambda cell handlers. sc-im registers a script function to fire on cell read/write. This is exactly the KN-86 Lisp-lambda cell handler model — a cell carries a Fe lambda that fires on event, dispatched through the tagged-union cell contract (C function pointer or Lisp lambda reference, identical contract). sc-im is the shipping precedent that the trigger-on-cell-event pattern works at scale.

4.2 Query / filter DSLs reduce to “a predicate over a row” — which Fe provides for free

Section titled “4.2 Query / filter DSLs reduce to “a predicate over a row” — which Fe provides for free”

Several Batch 8 data tools ship a query/filter mini-language: csvlens example-cell filters, loglens-core (level=="error" && latency>500), visidata derived columns. They all reduce to the same thing: a predicate/expression evaluated over a row. KN-86 does not need to hand-roll a filter-DSL parser — the Fe VM is an expression evaluator. A mission-board filter, a roster query, a log filter all become (filter (lambda (row) <predicate>) rows) over Fe data. This is a real cost saving: loglens-core had to build a parser + AST for its filter language; KN-86 skips that half entirely. The lesson: any cart-facing “query language” should be Fe expressions, not a bespoke grammar.

4.3 The collapsible nested tree is an s-expression browser

Section titled “4.3 The collapsible nested tree is an s-expression browser”

The collapsible tree widget — hackernews-TUI comment tree, bookokrat TOC — is structurally an s-expression browser over Fe cons-cells. The mapping is exact:

Tree operationLisp operationKN-86 key
Enter a sub-nodeCAR (descend into the form)CAR (left home index)
Step out to parentBACK (pop)BACK
Next siblingCDR (next cons)CDR
Collapse / expand a sub-formtoggle render of the sub-listTAB (/)

This is not a metaphor — the nEmacs structural editor (ADR-0008) navigates cons-cells, and a comment-tree / TOC browser navigates a tree; they are the same widget over the same data structure. One tree-browser implementation serves both reader-mode content and structural Lisp editing. The function-block keycaps (CAR / CDR / BACK already on the Sweep left half per synthesis.md §4) are the tree-navigation keys — the keymap was already a Lisp keymap.

4.4 FFI shape — namespace it, keep it callback-free

Section titled “4.4 FFI shape — namespace it, keep it callback-free”

Two editor entries corroborate KN-86’s FFI bets from opposite directions:

  • Namespace NoshAPI by domain. micro’s Lua plugin layer imports by namespace — import("micro/buffer"), import("micro/config") — with a pre/on-event + register-command/register-key hook vocabulary. This argues that NoshAPI (ADR-0005) should be namespaced, not flat: cell/*, deck/*, mission/*, audio/*, cipher/* rather than 30 flat builtins. A namespaced surface is more discoverable (the in-band keymap-discovery doctrine, synthesis.md L1) and more stable across versions.
  • Callback-free, immediate-mode is the right model. microsoft-edit wrote its own immediate-mode TUI (tui.rs, modeled on Dear ImGui) and stated the reason explicitly: “the lack of callbacks means we can use this across a plain C ABI.” That is independent external endorsement of KN-86’s exact bet — the cart-calls-primitives-each-frame, no-retained-callback model. The cart’s frame loop calls cell primitives directly and yields; the runtime does not hold cart callbacks across frames (beyond the bounded semantic-event dispatch ADR-0027 defines). microsoft-edit reached the same conclusion KN-86 did, for the same C-ABI reason.

A third, liftable extension: orbiton’s portal cross-file clipboard → a cross-cartridge clipboard on Universal Deck State (copy in one cart, paste in another). And durdraw → a real cart-art authoring tool (canvas + ░▒▓█ palette + frame timeline; .dur JSON as a clip-source schema), which is the authoring front-end for the half-block / ASCII content §2 and §3 consume.

4.5 The apex example — the Toneline sequencer language IS KEC Lisp

Section titled “4.5 The apex example — the Toneline sequencer language IS KEC Lisp”

The strongest LISP-integration finding in Batch 8 is line: its sequencer pattern grammar is architecturally a text grammar parsed by an embedded language VM (Lua/LPeg) into a data tree that a host runtime schedules — which is exactly the nOSh-runtime-plus-Fe-VM split KN-86 already runs. The mapping from a line phrase to a Fe s-expression is nearly one-to-one:

line phraseKEC Lisp s-expression
(c3 e3 g3) g5 e6(seq (chord c3 e3 g3) g5 e6)
45 .34 35.(seq 45 (div 34) (div 35)) (leading . = subdivide)
d3~.5(amp 0.5 d3)
r(reverse)
*4(repeat 4)
s(shuffle)
rl / rr(rotate ±n)

The conclusion the Toneline synthesis carries in full, stated here as the LISP-integration apex: a phrase is a list, a song is a list-of-lists, LAMBDA (already on the Sweep left-half keymap and in the Toneline fiction) defines a reusable phrase, and phrase transforms are the standard list library. There is no separate sequencer DSL plus a scripting language — they are one representation. Two front-ends sit over it: the terse line-style prompt (the live-coding input pattern, §1.4) and the same phrase in nEmacs as an editable s-expression (the s-expression browser, §4.3). The Fe VM that authors carts is the same VM that schedules music — which is the cleanest possible vindication of the embedded-Lisp architecture.


The four deliverables converge on a short list of NoshAPI / spec actions. Ordered by leverage:

#ActionSourceLands in
1(draw-sparkline …) primitive — logradar recipe (24 buckets / 2-min window / soft-cap 3× mean / newest-bolded)§2.3NoshAPI catalog (ADR-0005)
2(status-glyph …) primitive — logradar glyph-state icons (● ◐ ✖ ○)§1.5, §2.1NoshAPI catalog
3Table primitive — pinned header + scrolling body + frozen columns + status strip (csvlens/sc-im/visidata spine)§1.3NoshAPI catalog + ui-patterns.md
4Ambient / screensaver mode — idle-timer + scene roster (neo/astroterm/cbonsai) + Deck-State seeding + reveal-lifecycle exit§3orchestration.md + a small ADR if it touches Universal Deck State
5(draw-framebuffer) as sugar over (half-block-set) — inside ADR-0027’s half-block helper Fe library, not a new FFI surface§3.3ADR-0027 helper library
6Namespace NoshAPI by domain (cell/*, deck/*, mission/*, …)§4.4ADR-0005 revision
7Cart-facing “query language” = Fe expressions, not a bespoke DSL(filter (lambda (row) …) rows)§4.2lisp-paradigm.md
8Tree-browser widget = s-expression browser (CAR enter / BACK out / CDR next / TAB collapse)§4.3ui-patterns.md + ADR-0008
9Single-color rule set (§2.4) as a canonical authoring constraint§2screen-design-rules.md
10Zoom-as-row-semantics (chronos) as a cross-surface density pattern§1.1ui-patterns.md

The Toneline-specific promotions (the line→Fe phrase grammar, the live-set workflow, the audio-viz primitives) live in the separate Toneline synthesis; item references above are the Deckline-core subset.


Navigation / readers / hierarchical: hackernews-TUI, newsboat, w3m, browsh, bookokrat, mapscii, mynav, clipse, mcfly. Calendar / productivity: caps-log, calcure, chronos. Data / grid / table: csvlens, sc-im, sheetsui, visidata, logradar, loglens-core. Editors: micro, microsoft-edit, maki, nino, orbiton, durdraw. Games / files / windowing: BrogueCE, php-gameboy, mc, desktop-tui, tvterm, maze-tui. Audio / Toneline: line, cava, upiano. Rendering / screensaver / ambient: neo, astroterm, cbonsai, chafa.

Anchoring specs: ADR-0027 (128×75 + constrained cell API), ADR-0005 (NoshAPI), ADR-0033 + reveal-styles.md (reveal grammar), ascii-effects.md (ASCII visual language), ADR-0001 / ADR-0004 (Fe VM), ADR-0008 / ADR-0016 (nEmacs + REPL input), synthesis.md (Batch 1–7 synthesis + the Sweep keymap).