Kotoba

Where to start

What Kotoba isWho she is and where she runs, in one page
InstallingOne package, two commands
First runA key, a model, her first words
The approval gateHow she asks before she acts
The two voice modesLocal voice, or the agent tunnel
The soul fileChange who she is
RoadmapWhat grows next, and what was cut on purpose

Or a section

↑↓ move openesc close124 pages
All pages

Terminal and platforms7 of 10

The spinner, the phrase and the bar

About 6 minutes to read

On this page

While she works, the last rows of the window are the only thing moving. They are the answer to "is this thing stuck?", and nothing in them is decorative.

At 80 columns, twenty-one seconds into a turn with npm test still going, that is the band's row, the input frame, and the bar:

▆ npm test                                                                  21s
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃› type while she works — enter queues it, esc stops                          ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
 ● LIVE   ( ・ω・ )     Working on it…                          esc → stop   21.3s

The same step, committed to the transcript when it finishes, carries its toolset chip and its own clock:

▆ ▏BASH ▕ npm test                                                       21.3s
✓  TOOL   release notes · 7 results                                       3.0s

The tool row and its spinner

A running tool gets a row of its own with a mark in front of it. The mark is a twelve-frame ramp, ▁▂▃▄▅▆▇▆▅▄▃▂.oOo with --ascii. It fills at twelve frames a second at her neutral mood, and that rate is scaled by the mood she is in: 1.5× excited, 0.5× sad, 0.35× sleepy.

Below 0.2 seconds it does not animate at all: it shows a quiet bullet. An action that lands immediately should not flash.

On a surface slower than the ramp — 4 frames a second over SSH — it does not play the ramp slowly. It steps to a four-frame swell instead, one whole stride per draw: fewer frames, not slower ones, since below about 4 Hz no table reads as motion at all. Under --calm it does not move: one fixed frame, the same one every time.

Her thinking wears a different mark, ◦▪●, in a different colour. The two tables deliberately share no glyph, in either charset — on a terminal with no colour to tell them apart, "she is composing" and "a tool is running" were drawing the same character.

The clock beside the row is real elapsed time, clocked by the terminal, because nothing on the wire carries a timestamp.

The bar, left to right

The chip. LIVE normally, and WORKING whenever a long job is live — which is a departure on purpose, because the loudest device in the bar used to announce LIVE while the thing the reader wanted sat in the dim phrase beside it. It reads off the same one answer the phrase does, so the chip can never say WORKING while the phrase says the job landed.

The chip's mark blinks, as a status light: half on, half off, on a period of 0.7 s while she is speaking and 0.9 s while she works. The blink says "this is alive", and speeding one up would report an emergency nobody is having. While a long job is live it stops blinking and swells instead, four frames at 6 Hz, which is the one real motion device in the bar. At a safety gate it keeps a slow 2-second blink whatever else is going on: calm at a gate is deliberate. Under --calm it is solid, and it is solid at idle too, where the surface never repaints and nothing may cost a byte.

A third chip, OFFLINE, is printed once on the way out, as the last line of the session:

 ○ OFFLINE  ( -ω- )z  see you — the transcript stays right here

Her face, a kaomoji, still under --calm.

The phrase, which is what the turn is doing. Every phrase has short twins all the way down to nothing: a phrase that shortens reads as a decision, a phrase that truncates reads as a bug. The room it gets is measured against the prefix and the right slot actually built, not a fixed reserve.

The right slot, which is a state channel and not a clock. It carries a clock only where a clock is honest about something — a thing running. A card that is waiting has no countdown, because a countdown on a safety gate is a pressure this design does not want.

What the phrase says

WhileThe phrase
she is composingthinking…
a tool is running, first 4 sfocused — working…
a tool is running, after thatone of four, changing every 3.5 s
a known tool is runningits own phrase — reading…, recalling…, looking back through what you told me…, laying the steps out…
helpers are out3 on stage, and tab peek esc stops all on the right
a card is openwaiting on you
a long job is runningthe long job — <its current step>
a reminder came duea reminder just came due — <it>
nothing at allyou're connected — just type, and your model on the right

The four that cycle are:

Working on it…
Still running…
Still at it…
Not stuck — it's just a slow one…

That is the terminal's own reassurance and it is always there. Whether she also says something out loud while a tool runs is a different question with a different answer per model and per tool: a reasoning model narrates its own tool use, so the canned lines are suppressed for it, and a text register gets none of them — it draws this spinner instead.

esc, and what it would take down

After ten seconds of a turn the right slot starts offering esc → stop. Press it with more than one thing running and nothing stops: it arms for three seconds and the phrase becomes the blast radius, recomputed every frame:

esc again — that stops all 3 of them
esc again — that stops the one still running
esc again — that stops the job and the command
esc again — that stops this turn

Every size has its own sentence because the things it counts land during those three seconds. One plural sentence for the whole window ran down through that stops all 1 of them to that stops all 0 of them, which is a blast radius of nothing offered as a warning.

At the prompt the slot says /stop stops it instead, because out there prompt_toolkit owns the keyboard and esc closes a completion list.

Rates, and what they cost

SurfaceFrames per second
an ordinary terminal12
over SSH (SSH_CONNECTION or SSH_TTY is set)4
--calm / KOTOBA_REDUCED_MOTION2, and every mark is a still

Every moving mark is phased at the rate the surface actually redraws at, never at its design speed. A 6 Hz swell sampled at 2 Hz advances three frames per draw and plays out of order — which is exactly the stutter that was reported live.

An idle prompt costs nothing per second. The band is its content: no job and no plan is zero rows and zero bytes, the chip is solid at idle, and nothing wakes the prompt unless something is coming.

The box's hint line

The input frame's placeholder tells you what typing does right now:

  • at rest: talk to her · @ a file · / for commands
  • during a turn: type while she works — enter queues it, esc stops
  • with a card open: the card above is waiting — y, a, t, n or ? — naming the keys that card drew
  • with a confirmation open: the card above is waiting — y or n