問いかけられる記録 — ノート三十冊が見せられなかったもの
9 分先に明かしておくことがある。 2026年4月にこの雑誌は、オレゴンの30年目のトマト農家が納屋のノート三十冊をひとつの画面に移した話を載せた。実名と年齢と地域まで特定されたインタビューだった。
この現場は特定の農家ではない。 だから元のインタビューをそのまま再掲しない。代わりに同じ形を最初から最後まで自分で作った。 以下のすべての画面と数字はそうやって作ったものから出たものであり、どこか一軒の農家の記録ではない。
この区別を冒頭に置く理由は、元の記事の論旨全体が「あなたにもできる」という許しであり、その許しは事例の実在に乗っているからだ。実在を確認しないまま同じ文を繰り返せば、それは許しではなく広告だ。
だからこの記事が証明しようとするものは狭くなる。**「ある農家がやり遂げた」ではなく「こういう道具はこういう姿で、実際にこれだけできる」**までだ。
元の記事の心臓に実物がなかった
元の記事の軸は良かった。紙は書くところで止まる。 取り出して照らし合わせる仕事は人の記憶と忍耐に委ねられる。ところが同じ欄で積まれれば、記録は問いかけられるものになる。
その物性の転換は今も正しいと見る。問題はその記事がそれを一度も見せなかったことだ。
- 彼が実際に何を言ったのか — 要求の原文0行
- その言葉がどんな画面定義になったのか — 定義の抜粋0行
- どんな段階を経て作られたのか — 制作過程0段階
- ノート三十冊の移管 — 「合間に移している」という記述だけ
そして記事の白眉である**「植えて18日目に最初の花」**という発見もそうだった。五年分のデータが積もってはじめて成り立つ主張なのに、そのデータもそれが現れた画面もなかった。
今回は三つを並べて置く。言ったこと → 定義になったこと → 実際に描かれたこと。
言ったこと
作りながら要求を三つの文に書いた。開発用語を使わなかった。
- 「作物を選んだら今年の記録がずらっと出るように。」
- 「記録は片手でできるように。」
- 「去年の今ごろはどうだったかが横に出るように。」
三つの文が三つの道具になった。
log offers: log.season, log.add, log.compare定義になったこと
最初の文が画面のこの部分になった。コードではなく宣言だ。
{
"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}}" }
]
}
}二つ目の文はボタンひとつになった。
{
"type": "button",
"label": "First flower",
"onTap": {
"type": "tool", "tool": "log.add",
"params": { "crop": "Tomato", "action": "firstFlower", "tempC": 19.5 }
}
}三つ目の文で画面がもうひとつ増えた。ルート一行だ。
"routes": { "/": "ui://pages/today", "/compare": "ui://pages/compare" }アプリ全体がJSON四つだ。 コンパイルは走らない。
実際に描かれたこと
今日の画面。植えてから何日かと例年の平均が上にある。

「First flower」を一度押すと行がひとつ増える。

そして年を重ねて見た画面。

18.2日はどこにも書かれていない
これがこの編で最も重要な部分だ。
元の記事は「18日」を結果のように書いた。このサンプルでその数字は定数ではない。 記録から毎回計算される。
/// 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.そして検証がそれを直接確認する。計算された値がソースに文字列として入っていれば失敗させる。
src = open(os.path.join(SERVER, "bin", "server.dart")).read()
assert str(cmp["avgDays"]) not in src, "the average must come from the records, not the source"通過ログだ。
average 18.2 computed from records, not present in any source file「記録から現れた」と「そう書いておいた」は画面では同じに見える。 だから見分ける方法を合格条件に入れた。
例外が口をきき始める
元の記事で最も良かった観察は平均ではなくその次だった。錨ができると外れる年が見え始めるということ。
計算された表がそのままそれだ。
spans: 2021:22d, 2022:18d, 2023:15d, 2024:18d, 2025:18d, 2026:18d2021年は22日で、その行のメモに five cold days in early April が付いている。2023年は15日で warm week before transplanting が付いている。
散らばったノートでは22日も15日も「今年はちょっと違うな」で流れていっただろう。比べる基準線がなければ例外だとすら分からない。 18.2という平均が立ってはじめてその二年が口をきき始める。
同じ欄でなければ重ならない
このすべてが成り立つ条件はひとつだ。記録が同じ形でなければならない。
/// One entry, in the same six slots every time. The whole argument of the
/// article rests on this being fixed: `plot · crop · action · date · note ·
/// tempC`. Paper let every year invent its own shorthand; slots do not.六つの欄だ。紙ができなかったのがこれだ — 紙は年ごとに違う略語を許す。2019年の「定植」と2023年の「移した」が同じ意味かどうか、ノートは知らない。
そして日付に関してひとつ意図的にやったことがある。
// The date is the machine's, not the grower's memory. Paper let a row
// be written three days late with no trace; this cannot.判断と道具の分担
元の記事の最高の資産は5段階の分担表だった。何が必要かの判断は農家が、それを運ぶ仕事は道具が。その表を維持しつつ、今回は各行が上で見た実物をひとつずつ指す。
| 何 | 誰が | この記事の実物 |
|---|---|---|
| 何を記録するか決める | 農家 | 六つの欄(plot·crop·action·date·note·tempC) |
| どう見たいかを言う | 農家 | 要求の三文 |
| その言葉を画面に移す | 道具 | バンドルJSON 4つ |
| 積み、絞り、計算する | 道具 | log.season · log.add · log.compare |
| 何をするか決める | 農家 | —(道具は判断しない) |
最後の行が元の記事の抑制された境界の節と同じ場所だ。画面の下にその文をそのまま置いた。
A tendency, not an instruction. Read this season on its own terms.
道具は平均を出すだけで、植えろとは言わない。 その線を越えた瞬間、30年の判断は使われない。
このサンプルの範囲
農家はいない。 この記事に出てくる要求の三文は私が書いたものであり、五年分の記録は私が作ったものだ。だから**「農家がこう作った」と読まないでほしい。** この記事が見せたのは「こういう道具はこういう姿で、これだけ短く、平均は本当に計算される」までだ。
そしてドメイン専門家がこの形式を自分で扱えるかは確認していない。 上のJSONは人が読めるものだが、58歳の農家がそれを自分で直せるかは別の問いであり、このシリーズは答えていない。元の記事が「言えばいい」と言ったその変換 — 人の言葉が定義になる段階 — は、ここでは私が手でやった。
ノート三十冊を移す仕事も扱っていない。 紙を欄に移す作業量が実際にどれだけかは、このサンプルが測っていない。
UIが英語である理由も書いておく。 このシリーズのサンプルは画面もコードも英語で書く。この編はどこか一軒の農家の道具ではなく構成なので、どの言語の読者も同じキャプチャと同じソースを読む。
書いておくことから問いかけることへ
元の記事は「小さく始めて一欄ずつ増やせ」で閉じた。その勧めは維持する。
そこに作ってみて分かった一行を足す。欄を増やすことより、欄を同じに保つことのほうが難しい。 六つの欄を決めるのに十分もかからなかったが、その六つが五年間ずっと同じでなければ最後の画面は成り立たない。紙が失敗した地点が正確にそこだ。
そして成り立ってしまえば記録は性質を変える。書いておくものから、問いかけられるものへ。 18.2日は誰かが書いてくれたものではなく、問いかけて出てきた答えだった。
練習課題
設備の例から答えをひとつ選び、それが引用している記録を指してください。該当する記録がなければツールは何をすべきですか。