Stories A told story · drafted 2026-09-24

A Picture on the Row It Explains

Any person or agent can draw a diagram in the terminal and put it on the task row it explains, whole or not at all.

The seven beats

World
the one group, where every plan is a row on the board and every row has a thread
Cast
Tony, who asked; the agents who plan and build; a person elsewhere who wrote the small drawing editor and gave it away
Knock
one line on 2026-09-24: add lazy draw to our cli
Want
a diagram that lives on the row it explains, instead of box art typed by hand into a note and left to drift
Way
draw in the terminal, export it as plain characters, post it to the row's thread; the thread keeps 4000 bytes, so a picture that does not fit is refused whole, never cut
Turn
the first picture landed, and the check called it cut: 483 bytes sent, 482 kept. The door had trimmed a newline. Then a failed post came back reading ok. The drawing was easy; the receipt was the work
Lesson
Open — a Lesson is learned by someone, and this one is not written yet

A note on a board row, eleven lines long, three of them boxes drawn with plus signs and bars.

Nobody had checked the boxes since the day they were typed.


That is how pictures lived here. A plan was a row, and a row had notes, and when a plan needed a shape someone typed the shape by hand. The corners never met twice the same way. When the plan changed, the words changed and the boxes did not.

On a morning in September one line arrived. Add the drawing tool to the command line.

The tool already existed. A person far away had written a small editor that draws in the terminal, with a mouse, in plain characters, and had given it away. It ran on a different engine from the command line. So it was not taken in. It was called, the way a neighbour is called over the fence, and it kept its own house.


The want was not the drawing. The want was the picture sitting on the row it explained, in the row's own thread, where the next reader would already be looking.

The thread keeps four thousand bytes. A picture larger than that has two honest answers and one dishonest one. It can go whole. It can be refused whole, with both numbers named. Or it can be cut at the edge and reported as sent. The third answer is the one this board has been burned by before.


The first picture went up. The check that guarded it said it had been cut. Four hundred and eighty-three bytes sent, four hundred and eighty-two kept.

Nothing had been lost. The door trims a newline before it counts. The measurement had lied before the thing it measured did.

Then the door went quiet upstream, and a post that never landed came back reading ok, because one small word inside the answer had overwritten a larger one outside it.

The drawing had taken minutes. The receipt took the morning.


Now the door's own count decides what was kept, and a failure says whether it landed.

A picture on the row, eleven lines long, and every byte of it where it was sent.


Where the metaphor stops being true

  • "Called, the way a neighbour is called" — the editor is spawned as a child process by packages/cli/src/draw.ts (resolveRunner): lazydraw on PATH, else bun x lazydraw@0.1.1. It is not a dependency of @oneie/cli, whose runtime deps stay commander + @oneie/sdk.
  • "The door trims a newline before it counts" — resolvers/tasks.ts: bodyRaw.trim() then commentByteLen. draw.ts therefore reads submittedBytes/storedBytes/truncated from the response and never compares against its own byte count.
  • "One small word overwrote a larger one" — { ok: false, ...inner } let an inner body's ok replace the failed outcome. Fixed to { ...inner, ok: false }. The same spread shape exists in packages/cli/src/media.ts unwrap(); there it is guarded by 'ok' in inner, but it was not audited here.
  • Locked words used: group (the one group), people and agents, signal (the knock), the board's rows are Things. No dead names.
  • NOT WIRED: no agent prompt names one draw; an attach marks no path; nothing counts attaches.

The family this story generates

File Technology What it holds
text/lazydraw.md the story this file
packages/cli/src/draw.ts TypeScript the verb — spawn, export, attach, the refusal
packages/cli/tests/draw.test.ts vitest runner order, the byte cap in bytes not characters, registration
packages/cli/README.md · packages/cli/CLAUDE.md reference the command, one block and one row

Sentences that would be false if shipped

  • "Agents attach their diagrams to the rows they file." — no agent prompt or skill names one draw yet.
  • "Attaches are counted." — nothing counts them.
  • "one draw works anywhere one works." — it needs Bun ≥ 1.3; without it the verb refuses on one line.
  • "Diagrams of any size go on the board." — the thread keeps 4000 bytes; larger ones are refused whole.

The story shape — the chain, and the three rules

The fourteen parts walk one chain, from what is wanted to what was learned:

goal       states the Want plainly
  │
story      tells the seven beats
  │
plan       sets the path from the story to the work
  │
tasks      the rows /do executes, tagged on the board
  │
promise    what was agreed, its accepts frozen
  │
stakes     what changes if it is kept or missed
  │
events     signals — each one marks or warns a route
  │
proof      the &&-join of the accepts, run as written
  │
payment    money moves only where a person consents
  │
learning   a path or a status changes, so the next
           pick is not the last one

Three rules hold for every lifecycle, for people and for agents:

  1. Promises at every touchpoint. Each stage where a person or an agent meets ONE carries one promise with one checkable proof (promise, check).
  2. Agents help people move forward. Each stage names the agent that helps the person reach the next stage (helper).
  3. Agents hand tasks to people. Where judgment, consent, a signature or money belongs to a person, the agent hands them the task — a human workflow step, or the task reassigned — and says what it hands over (hands_over).

Connected to

Every link here was checked against the repo when the page was built. 3 names the story uses could not be found and are shown without a link.

People

  • tony

Agents

Each opens a chat with that agent.

Skills

Each opens the skill's page.

  • cli

Paths

The flows this story walks — trigger → step → step.

  1. trigger: a person or agent needs a diagram → tool: one draw <name> (the editor, a human at the keys) → tool: one draw attach <name> --task <tid> → tasks:comment

Tools

Receivers and scripts it signals.

  • packages/cli/src/draw.ts — one draw · list · export · attach
  • lazydraw 0.1.1 (github.com/mpospirit/lazydraw, MIT) — spawned: on PATH, else bun x; never a dependency
  • tasks:comment — the thread door, 4000-byte cap, reports submittedBytes/storedBytes/truncated

Events

Every event is a signal; each names the path it marks or warns.

  • tasks:comment · from the person or agent running one draw attach VERIFY: a comment marks nothing today; the thread is the record tags: draw, diagrams

Transactions

  • none — the editor is free and MIT; no credit moves

Analytics

  • VERIFY: attaches are not counted anywhere; the task thread is the only record