Field

A Log You Can Ask — What Thirty Notebooks Could Not Show

By makemind · Jul 14, 2026

Something to state up front. In April 2026 this magazine ran a piece about a thirty-year tomato grower in Hwacheon, Gangwon, who moved thirty notebooks from a barn onto one screen. It was an interview naming the person, their age and their region.

This is not a specific farm. So we do not republish that interview. Instead we built the same shape from beginning to end ourselves. Every screen and every number below comes from what we built, and it is not any one farm's records.

The reason this distinction sits in the first paragraph is that the original's whole argument is permission — "you can do this too" — and that permission rests on the reality of the case. Repeating the same sentence without having confirmed that reality is not permission, it is advertising.

So what this piece sets out to prove narrows. Not "a farmer did it" but "a tool like this looks like this, and it really does this much".

The heart of the original had nothing real in it

The original's axis was good. Paper stops at writing. Taking things out and comparing them is left to human memory and patience. But stacked in the same slots, a record becomes something you can ask.

We still think that shift in materiality is right. The problem is that the piece never once showed it.

  • What he actually said — zero lines of the original request
  • What screen definition that speech became — zero lines of definition
  • What steps it went through — zero steps of process
  • Moving thirty notebooks — only the statement "I'm transferring them bit by bit"

And the piece's best line — "first flower on day eighteen after transplanting" — was the same. It is a claim that only stands once five seasons of data exist, and neither that data nor the screen where it emerged was there.

This time we put three things side by side. What was said → what became a definition → what was actually drawn.

What was said

While building, we wrote the requirement as three sentences. No development vocabulary.

  1. "Pick a crop and this season's records come up in a row."
  2. "Recording should work with one hand."
  3. "Show me what this time last year looked like, next to it."

Three sentences became three tools.

log offers: log.season, log.add, log.compare

What became a definition

The first sentence became this part of the screen. Not code — a declaration.

{
  "type": "list",
  "items": "{{season}}",
  "emptyMessage": "Nothing recorded this season yet",
  "itemTemplate": {
    "type": "linear", "direction": "horizontal", "spacing": 12,
    "children": [
      { "type": "text", "text": "{{item.date}}" },
      { "type": "text", "text": "{{item.action}}" },
      { "type": "text", "text": "{{item.tempC}}°C" },
      { "type": "text", "text": "{{item.note}}" }
    ]
  }
}

The second sentence became one button.

{
  "type": "button",
  "label": "First flower",
  "onTap": {
    "type": "tool", "tool": "log.add",
    "params": { "crop": "Tomato", "action": "firstFlower", "tempC": 19.5 }
  }
}

The third sentence produced one more screen. One line of route.

"routes": { "/": "ui://pages/today", "/compare": "ui://pages/compare" }

The whole app is four JSON files. No compiler runs.

What was actually drawn

Today's screen. Days since transplanting and the average of past years sit at the top.

Today — day 18 since transplanting, past seasons averaged 18.2 d. A real render capture
Today — day 18 since transplanting, past seasons averaged 18.2 d. A real render capture

Press "First flower" once and one row appears.

One tap adds one record — 2026-04-19 firstFlower recorded
One tap adds one record — 2026-04-19 firstFlower recorded

And the screen with the years laid over each other.

18.2 days on average — 2021:22d, 2022:18d, 2023:15d, 2024:18d, 2025:18d, 2026:18d
18.2 days on average — 2021:22d, 2022:18d, 2023:15d, 2024:18d, 2025:18d, 2026:18d

18.2 days is written down nowhere

This is the most important part of this piece.

The original wrote "eighteen days" as though it were a result. In this sample that number is not a constant. It is computed from the records every time.

/// Days from transplant to first flower, per season.
///
/// This is the whole "eighteen days" claim, and it is arithmetic over the
/// rows — no constant anywhere. A year with no flower recorded yet is left
/// out rather than guessed at.

And the verification confirms that directly. If the computed value appears as a string in the source, it fails.

AVG=$(grep -o "average from records: [0-9.]*" captures/run.log | awk '{print $4}')
if grep -RIn --exclude-dir=captures -F "$AVG" farm_server/bin farm_log.mbd bundle_host/lib; then
  echo "   the average $AVG appears literally in the source — it must be computed"
  exit 1
fi

The passing log.

   average 18.2 computed from records, not present in any source file

"It emerged from the records" and "somebody typed it in" look identical on screen. So a way to tell them apart went into the pass condition.

This content requires Developer or above

Sign in and upgrade your plan to continue reading.

View Plans
Twitter