Skip to content
This repository was archived by the owner on Nov 11, 2026. It is now read-only.

Latest commit

 

History

History
352 lines (250 loc) · 35.4 KB

design.md

File metadata and controls

352 lines (250 loc) · 35.4 KB

自然農法 観察アプリ — 設計案(第1版)

作成: 2026-10-27 対象: Meta Global AI Developer Hackathon(提出 11/4 21:00 ET = 11/5 11:00 JST) トラック: Indie Developer 課題: Build for Your World

0. 一文で

ストーリーは story.md:外から買う肥料と指導に頼る農業を、畑の中の力(根と菌根菌)で回す形に作り直す。畑ごとに違うので、AI がその畑を読み、人が結果で答え合わせする。農家一人一人が自分の畑を読めるようになる道具。

仕組みとしては、毎日スマホで撮る定点写真を、位置合わせ → SAM 3.1 で切り分け → Muse Spark で前日までと比較 → 農家が声で正誤を付ける、という流れで**検証済みの観察記録(プレーンテキスト)**に変える。

観察の方針(農家、2026-10-28)

自然農法では、細かく正確に測ることより全体を見ることが重要。AI の出力もまず全体の様子(勢い、色、草の組み合わせ、偏り)を短く言い、数字や個体の話はそれを支える範囲に留める。SAM の被覆率は「全体の割合がどう動いたか」をつかむ目安で、精密な計測ではない。

1. Meta モデルの調査結果(2026-10-27 に dev.meta.ai で確認)

モデル 確認した事実 この企画での使い方
SAM 3.1 (sam-3.1) 短い名詞句1つで、該当する全インスタンスのボックス+マスクを返す。1リクエスト1概念(カンマ列挙は不可)。否定・OR・位置指定は不可。ゼロ件は正常応答。入力は URL または base64。出力はフレームごとに1行の特殊トークン文字列、マスクは base85 ラスタ。ボックス/点プロンプトで ID を指定した追跡も可。$2.50/1k 画像。 概念ごとに1リクエスト(例: "crop seedling", "weed", "bare soil", "animal footprint")。マスクのピクセル数から被覆率を出す。
Muse Spark 1.3 (muse-spark-1.3) 画像・動画・PDF 入力、1M トークン、1リクエストに複数画像可。Responses API(OpenAI SDK 互換、base_url=https://api.meta.ai/v1)。構造化出力、点/ボックス/カウントの「perception grounding」あり。Standard は学習に使われない($1.25/$4.25 per Mtok)。-contributor は学習に使われる代わりに安い。音声入力は 1.3 では劣化 → Voice Transcribe を使えとの注記。 位置合わせ済みの「今日+過去数日」+SAM の被覆率+天気を1リクエストで渡し、変化だけを JSON で返させる。畑の写真なので Standard を使う。
Muse Glimmer (30B, Apache 2.0) テキスト+画像入力。単一 GPU / Mac で動く想定。Ollama, llama.cpp, vLLM 対応。 ローカル処理(日次の簡易説明、記録の整形)。写真を外に出さない経路。
Muse Spark Open テキスト・画像・動画・音声入力のオープンウェイト。自前ホストか外部プロバイダ。 Glimmer で足りない場合の代替。規模が大きいので優先度は低い。
Muse Voice Transcribe (muse-voice-transcribe-1.0) 日本語対応(25言語、languageBias で指定)。語彙バイアスあり(農業用語を登録できる)。ファイル送信は POST /v1/asr/transcribe、WAV、10分以内、32MB以内。$0.18/時間。 畑で撮りながら話した一言を文字起こし → 農家の判定として記録。
Muse Code ターミナル用コーディングエージェント。 開発に使い、README に使用箇所を書く。

分かったことからの設計判断

  1. SAM は「何を切るか」を知らない。 名詞句を決めるのは人(またはSpark)。自然農法の畑では「作物/雑草」は見た目で分けにくいので、概念名はこの畑の実態に合わせる(例: "daikon leaf" のように作物名で指定する方が "crop" より当たる可能性が高い)。これは写真が来てから試験する。
  2. 複数日比較は Spark 1回で済む。 複数画像入力が確認できたので、「昨日と今日の差分」を1プロンプトで聞ける。
  3. 音声は Spark に直接入れない。 Voice Transcribe で文字にしてから渡す。
  4. ローカル経路は Glimmer。 ただし 30B なので、手元の GPU/メモリ次第で量子化が必要(要確認: 開発機の構成)。

1.5 最初の定点(2026-10-27 撮影)

作物: 大根(Raphanus sativus)とカイラン(Brassica oleracea var. alboglabra)。どちらもアブラナ科で、子葉期はどちらもハート形。

見分けの手がかり(子葉〜本葉期):

大根 カイラン
子葉 大きい、明るい緑 やや小さい、厚く青みがかった緑(ろう質)
本葉 ざらつき・毛、切れ込み なめらか、ろう質で青緑

設計への影響(2026-10-28 改め、全体を見る方針): 一株ずつ分類・追跡はしない。SAM は seedling などで芽の被覆の目安を出すだけ。Spark は写真全体を見て「大根とカイランの混ざり具合、勢い、偏り」を言い、農家が正誤を付ける。

播種: 2026-10-18、大根とカイランを混ぜてバラマキ。位置では作物を判別できないので、見た目だけが手がかり。記録には播種後日数(DAS: 10/27 = 9 日目)を入れる。

2 つ目の定点(2026-10-27 撮影、真上から)

多種を混ぜて播いた場所。農家自身も「何が生えてくるかわからない」。大きなハート形の子葉(アブラナ科らしい)、赤紫の小さな葉、三つ葉、細かく切れ込んだ葉、イネ科の細い葉などが混ざっている。

1 つ目(大根とカイランの 2 種、播き筋あり)が易しい地点、2 つ目が難しい地点として対になる。

設計への影響:

  • 一株ずつの同定はしない。播いた種のリストを渡し、Spark には「何が出てきているか、どれが優勢か」を全体として言わせる。分からないものは「不明」でよい。

3 つ目の定点: 1 年刈らずにおいた区画(2026-10-28 追加)

無肥料にして 4 年目の自分の畑で、1 年間草を刈らずにおいた区画。見た目は耕作放棄地と同じで、放棄地を作物に戻す過程の代わりとして使う。写真(斜めから)に見えるもの:

見えているもの 見立て 確信度
黄色い穂状の花、細い葉が茎に密につく セイタカアワダチソウ 高
銀白色の穂、背の高い幅広のイネ科 オギ(農家の同定。ススキではない) 確定
右下の灰緑色で細かく裂けた葉、小さな花穂 ヨモギ類 中
中央奥の丸い葉 クズ? 低

この地点の役割は「復活」の起点。9 日間で見せるのは:

オギは湿った土地を好む。ただし伏流水は地下約 4 m で(農家の知見)、地下水位が高いという私の推定は外れた。農家の見立てでは、土は黒色片岩(三波川帯)のシルト由来。シルトは細かく水を保つので、オギが育つ理由として「堆積土の保水性」が有力になる(地質図で要確認、GSJ は 10/28 もメンテ中)。刈り方と作物の提案では、オギと地下約 4 m の伏流水の両方を Spark に渡す。地図にない、こうした農家の知見を site.md に足していくこと自体が「人が答え合わせをする」例になる。

  1. 刈る前の読み: SAM で goldenrod, silver grass, reed などの被覆率。site.md に来歴(無肥料 4 年目、1 年刈らず)を書く。
  2. 刈り方の提案([F]、story.md 参照): Spark が最初に刈る場所と高さを、理由付きで一つ出す。農家が刈るか、却下して理由を言う。
  3. 刈った後: 同じ定点で、何が先に戻ってくるかを毎日記録する。

撮り方: 草丈が高いので、真上からは撮れない。刈る前は斜めの全景を同じ位置から、刈った後は刈った帯を真上から(1〜1.5 m)も撮る。

SAM の名詞句の候補(写真で試験して決める): seedling, sprout, radish seedling, broccoli seedling, cotyledon, weed, bare soil, straw, dry grass, footprint, goldenrod, silver grass, reed, vine

Voice Transcribe の語彙バイアス候補: 大根, カイラン, 子葉, 本葉, 播き筋, 畝, 草マルチ, 刈り草, 足跡, 鹿, 猪, 乾いてる, 湿ってる, セイタカアワダチソウ, ススキ, オギ, ヨシ, ヨモギ, クズ, 放棄地

1.6 畑の知識は前提ではなく仮説(2026-10-28)

records/site.md の各行に状態を付ける: data(公開データ)/ record(農家がしたこと・見たこと)/ hypothesis(農家または AI の読み、未検証)/ supported・refuted(検証済み、根拠を書く)。

  • 仮説は AI に前提として渡さない。調べる対象として渡す。
  • 調べる主な手段は雑草(農家の方針)。何が、どこに、どれだけ生え、どう変わるかが、その畑の土・水・来歴への答えになる。毎日の写真(SAM の草種別被覆率、Spark の比較、農家の訂正)がその計器。
  • 補助として ② Spark の検索グラウンディングで外の根拠(出典付きで「支持 / 反対 / 見つからない」)、③ 試し播きなどの試験。
  • 「この草が生えるのは〇〇だから」という読み自体も仮説として扱い、同じように確かめる。
  • 状態を変えるのは農家。AI の推定も農家の知見も同じ扱い。
  • すでに refuted が 3 件ある(ススキ→オギ、低い氾濫原→微高地、地下水位が高い→伏流水は約 4 m)。どれも AI の推定を農家が直したもの。デモで「答え合わせ」の実例として使える。

雑草で土を読む話の裏付け(2026-10-28 に検索):

  • 考え方は広くある(自然農法、FiBL の技術ノート、各国の普及資料)。ただし指標の一覧は場所ごとに一致せず、専門家の間でも食い違う。厳密な検証研究はほとんど見つからない。検証が少ないうえに、精度も悪い(農家の評価)。ここがこの道具の出番: 一般の一覧で当てるのではなく、AI と一緒に定期的に観察し、どういう方法で改善したらいいかの知識を増やしていく(農家の方針)。毎日続けることが目的ではない。たまる知識の形は「何をした(刈り方、播いた物、時期)→ 草と作物がどう変わった → 農家の評価」。読みの精度はその副産物。
  • 当たりやすいのは、一年草より多年草、1 種より一緒に生える草の組み合わせ。地域差が大きく、欧州の一覧はそのまま使えない。
  • だからこの道具では、一般の指標表を答えにせず、この畑の草の組み合わせとその変化を、日々の記録で確かめていく。
  • 茨城県農総センター: 放棄年数が長いとセイタカアワダチソウ・ススキ・オギ等の多年草が優占。ススキ・オギの根は約 30 cm。放棄地の下層はリン酸・石灰・窒素が不足。推奨する再生法は除草剤+プラウ耕+堆肥(外から入れる方法で、この企画とは逆)。
  • 東北大の不耕起草生水田: 表層に有機物層はできるが、0〜30 cm の土壌炭素は慣行田と有意差なし(「地上ではなく土の中の有機物」という農家の指摘と関係する)。

新モジュール check/: 仮説 1 件 → Spark が雑草の記録を読み、どの草がどこに出れば支持・反対かを示す。加えて検索グラウンディングで外の根拠(出典 URL)。ハッカソン中は外の根拠まで。畑での確かめはシーズンをまたぐ。

1.7 記録の取り方: 畑ごとに広く撮って見比べる(2026-10-28 改め)

記録の単位は畑。1 回の観察 = 1 枚の畑を歩いて、全体が分かるように写真を撮る(枚数は自由、声のメモは任意)。

  • 畑を区画に分けるか、何か所から撮るかは農家の自由。アプリは区画数を決めない。写真のファイル名やメモで「北の端」などと書けば、Spark はそれを手がかりに読む。
  • 見比べ方:
    1. 時期どうし(同じ畑の前回と): 畑全体がどう動いたか。刈った・播いた等の手入れの後に何が変わったか。
    2. 畑どうし(任意): 土も来歴も違う畑を並べると、草の違いが土・水・来歴の違いを語る(§1.6 の「雑草で読む」)。
  • Spark には今回の写真と前回の写真をまとめて渡す(複数画像可)。出力は「畑全体 → 目立つ偏り → 前回からの変化」の順。
  • 厳密な位置合わせは要らない。field-timelapse は、手入れの前後を重ねて見せたい所だけに使う。
  • ハッカソン中はデータを揃えるため毎日〜隔日。その後は定期的(週 1 など)。
  • これまでの 3 つの定点は、それぞれの畑の写真の一部として扱う。

1.8 雑草のバロメーター(2026-10-28)

雑草は土の酸度・肥沃さ・乾燥のバロメーターになる。従来の一覧表(一種 → 一つの答え)は検証が少なく精度も悪いので、AI では次のように読む。

  • 組み合わせで読む: 写真に写る草全体とその割合から総合する。一種の指標植物で決めない。
  • 様子も読む: 葉色(黄ばみ、赤紫)、勢い、草丈、密度、花の時期、しおれ方。乾燥は天気(雨のない日数)と並べて読む。
  • およその値と相対の両方を出す(農家の指摘で改め): 酸度は pH の幅(例 5.5〜6.5)、肥沃さは 痩せ/中/肥沃、乾燥は 乾/適湿/湿 の 3 段階。それより細かくは言わせない。加えて向き:
    • 時期: 同じ畑の前回と比べて up(より酸性/より肥沃/より乾燥)・down・same・unclear
    • 畑どうし: 畑を並べ、最も酸性/肥沃/乾燥の側から順に並べる
  • 肥沃さは「植物が取れる量」: 土にあるミネラルの量ではなく、植物が自分で取れているかを生育から読む。この畑は黒色片岩由来でミネラルは豊富、ただし植物が自ら取れないと意味がない(農家)。
  • 根拠と確信度を必ず付ける: どの草の、何を見てそう読んだか。草が何を示すかという読み自体が仮説なので、確信度で表す。草から言えなければ unclear。
  • 答え合わせ: 各バロメーターに農家が right / wrong(理由)を付ける。時々の簡易 pH 試験紙や土を握った感触を声のメモで残せば、pH の幅がこの畑で当たっているかを確かめられる。訂正は次回のプロンプトに戻り、この畑での読みが鍛えられる。
  • 限界: 写真は地上だけ。根や土の構造は見えない。芽生えの時期は草の種類を取り違えやすい。

記録の行の形:

- dryness: dry; drier than 2026-10-27; evidence: オギの葉先が巻き、ヨモギがしおれている。5 日雨なし [0.55]  → farmer: right
- fertility: richest → poorest: uncut (rich) > row1 (moderate) > mix1 (poor); evidence: ... [0.40]

コード: describe.py の時期比較に 3 つのバロメーターを足す。畑どうしは compare_fields() で各畑の最新の観察を並べ、records/_compare/<date>.md に残す(2 行目の例はこのファイルの行)。

1.9 総合判断: 優勢な草の理由 × 野菜の育ち(2026-10-28)

農家の方針: 優勢になる雑草を調べれば、理由は分かるはず。これに野菜の生育状態を合わせて総合判断すれば、かなりの情報が得られる。

  1. 優勢な草を挙げる: 毎回の観察で、畑の中で優勢な草を 2〜4 種、和名+学名+およその割合で出す(dominant)。全種を数えない。
  2. なぜ優勢なのかを調べる: 優勢な草ごとに、その草が優勢になる理由(好む pH、水分、肥沃さ、刈り取り・攪乱への反応、光、遷移の段階、根)を Spark に調べさせ、records/_plants/<学名>.md に残す。一度調べた草は再利用。各行は仮説で、確信度付き。農家が right / wrong を付けられる。
  3. 野菜の育ちを見る: 勢い、葉色、大きさ、揃い、ストレスの兆し(crops)。野菜が写っていなければ省く。
  4. 総合判断: バロメーター(§1.8)は、優勢な草が優勢な理由から出発し、野菜の育ち、天気、地形・地質・土壌(records/site.md)で照らし合わせて出す。地質・土壌は公開資料(産総研シームレス地質図、農研機構 日本土壌インベントリー、国土地理院 土地条件図)から取り、data として書く。site.md の hypothesis 行は未検証、refuted 行は誤りとしてモデルに渡す。草と野菜が違う方向を指すときは、そう書いて確信度を下げる。

出力の順: 畑全体 → 優勢な草 → 野菜の育ち → 酸度・肥沃さ・乾燥 → 変化。

周辺の情報(農家の指摘): 対象の畑だけでなく、周りも効く。隣の土地の使い方(田、果樹、畑、家、道、放棄地)、川・水路・旧河道、雑草の種や獣の出どころ、隣の施肥・除草剤。surroundings.py が国土地理院タイル(現在の空中写真、1974〜78 年・1961〜69 年の空中写真、標準地図、治水地形分類図)を畑を中心に約 1.5 km 四方で取り、Spark が一度だけ読んで records/surroundings.md に仮説として書く。農家が正誤を付け、隣の様子など地図にない知識は site.md の Surroundings に書く。どちらも総合判断に渡る。

地質図(GSJ)の API は 10/27・10/28 ともメンテナンス中。復旧したら site.md の Geology を data で埋める。

注意: 草の生態の説明は、検索グラウンディングで出典を付けるのが望ましい(API の指定方法は未確認、plants.py の TODO)。それまでは出典なしの仮説として扱う。

1.10 緑肥の提案(2026-10-28)

農家の要望: どういう緑肥がいいかを提案できるアプリにする。§1.9 までの「読む」の上に、「出す」を載せる最初の段(ストーリーの「その畑に合った刈り方と作物を出す」の作物の側)。

入力(すべてこの畑の記録から):

  • 畑の最新の観察: 全体、優勢な草、野菜の育ち、酸度・肥沃さ・乾燥
  • 優勢な草が優勢な理由(records/_plants/)
  • 地形・地質・土壌・周辺(site.md、surroundings.md)。農家の知見(例: 「ヘアリーベッチはこの畑では強すぎる」)を守る
  • 時期(日付から、徳島で今まけるもの)
  • 手元の種(任意)。あればその中から組む
  • この畑への過去の提案と、農家の正誤・理由

出力(records/_proposals/<field>/<date>-cover_crop.md、各行に農家が right / wrong を付ける):

  • 要約
  • 混植の組み合わせ: 種ごとに役割(根で耕す、窒素を入れる、太い根で穴を開ける、菌根菌をつなぐ、地表を覆う…)、およその割合、この畑での理由
  • まき方・時期
  • 注意(強すぎる種、窒素の取り合い、後作への影響、根粒菌など)
  • 確かめ方: 何がどうなれば当たりか(芽生え、どれが優勢になるか、葉色、春の様子)。次からの観察でそのまま答え合わせする

方針: 単作でなく混植(リジェネラティブ農業、野草化栽培と同じ方向)。正確な播種量より、役割と割合の目安。アブラナ科は菌根菌と共生しないことを踏まえる。窒素はこの畑で足りない側。

1.11 はじめて農業をする人(2026-10-28)

農家の指摘: はじめて農業をする人は、こういう雑草がいっぱいの畑(放棄地や長く休んでいた畑)から始めることが多い。

この人たちには、この畑の農家が持っている知識(ススキとオギの見分け、洪水の当たり方、遺跡の記録、「ヘアリーベッチはここでは強すぎる」)がまだ無い。だから道具の役目が大きい。

  • 最初の一回: 場所を入れると、公開資料から site.md の下地(標高、地質、土壌、周辺の地図、川の来歴)を作る。人が知っていることを足していく。
  • 最初の観察: 畑を歩いて撮る → 優勢な草とその理由 → 最初の提案(どこから、どう刈るか/何をまくか)。
  • 答え合わせを経験の代わりに: 経験が無い分、提案には必ず「何が見えたら当たりか」を付け、後の写真で確かめる。土を掘る、握るなど、すぐできる確かめ方も添える。
  • 言葉: 提案と説明は日本語で、専門用語に一言の説明を付ける(いまの出力は英語。言語を切り替えられるようにする)。

デモでは、この畑(無肥料 4 年目、1 年刈らず)を「はじめての人が受け取る畑と同じ姿」として見せられる。

「1 年刈らなかった区画」のようなケースは多い(農家)。手が回らなかった区画、借りたばかりの休耕地など。耕作できなくなった人が手放した畑が、草に戻ったところで、はじめての人に渡る(農家)。放棄地とはじめての人は、同じ流れの両端にいる。

日本の夏は、3 か月もすれば畑が雑草で覆われる(農家)。手放してから次の人に渡るまでの短い間でも、畑は草に戻る。だから:

  • 観察の間隔は季節で変える。夏は短く(1〜2 週ごと)、冬は長く(月 1 程度)。
  • 刈り方の提案は「いつ刈るか」が中心になる。夏は遅れると 1 回で手に負えなくなる。だからこの区画は特殊な例ではなく、よくある出発点の代表としてデモに使える。

1.12 SAM の名詞も答え合わせで直す、そしてみんなで共有する(2026-10-28)

農家の方針: SAM に頼む名詞は間違ってもいい。これから直していけばいい。そして、それはみんなで共有する。

  • 畑ごとの一覧 records/_concepts/<field>.md(concepts.py): 名詞ごとに、何の草のためか、誰が決めたか(ai / farmer / shared / default)、前回の結果(被覆率と数、または「見つからず」)。農家が wrong(理由、代わりの名詞)を付けると、その名詞は使わなくなり、代わりが農家の名詞として入る。
  • 流れ: 前回の優勢な草 → 名詞がない草には名詞を用意 → SAM(segment_field)→ 結果を一覧に書き戻す → 農家が直す。
  • 共有ライブラリ shared/sam_concepts.md: 草(学名)ごとに名詞と、農家たちの right / wrong の数。場所や農家の情報は持たない。ある畑で名詞が要るときは、まず共有ライブラリの一番良いもの(right が wrong より多い)を使い、無いときだけモデルに聞く。共有ライブラリで外れとされた名詞は、モデルに「使うな」と渡す。
  • コードと一緒にリポジトリに入るので、OSS と同じく他の農家が使い、直し、送り返せる。

1.13 スマホのアプリ(2026-10-28)

農家の要望: 写真をフォルダに置く作業が面倒。iPhone でも Android でも、畑からでも家からでも送れるようにする。

形: debpc で動く小さな Web アプリ(Python のサーバー+スマホ向けの 1 画面の HTML)。iPhone は Safari、Android は Chrome で開き、ホーム画面に置けばアプリのように使える。どちらも同じ画面で、App Store / Play ストアも Mac も要らない。iPhone の HEIC はサーバーで JPEG に直す。

使い方の基本(2026-10-28 農家の方針): 畑ではすぐに送らなくていい。畑ではいつものカメラで撮り(声のメモもスマホの録音で)、家に帰ってから家の Wi-Fi でまとめて送って処理する。これなら畑で電波も外からの接続も要らない。写真の撮影日時が残るので、日付は自動で合う。

畑から送りたくなったとき(後回し): Tailscale(iPhone・Android とも公式アプリあり)でスマホと debpc を私的なネットワークでつなぐ。ポートを外に開けずに携帯回線から届き、tailscale serve で正規の HTTPS になる。HTTPS は、Safari でも Chrome でも、マイクと位置情報を使うための条件でもある。Tailscale の導入とログインは農家が行う。

画面の流れ:

  1. 畑を選ぶ: 位置情報で一番近い畑を自動で選ぶ(違えば 1 タップで変える)。新しい畑はその場の位置で登録。
  2. 撮る: カメラで何枚でも。家ではカメラロールから選ぶ。日付は写真の撮影日時(なければ今日)で、画面で直せる。
  3. 送る: サーバーが photos/<畑>/<日付>/ に自動で置く。フォルダ作業は無くなる。
  4. 読む: SAM と Spark が裏で動き、終わると畑全体 → 優勢な草 → 野菜 → バロメーター → 変化が出る。SAM の切り分けを写真に重ねて見せる。
  5. 答え合わせ: 各項目に ✓ / ✗。✗ は理由を声か文字で。SAM の名詞もここで直す(§1.12)。
  6. 声のメモ: 押して話す → Muse Voice Transcribe(日本語)→ 文字になって記録へ。録音はブラウザで WAV にしてから送る(サーバーに ffmpeg は要らない)。

作る順: ① 送る→自動で置く(今日)② 読む→答え合わせ ③ 声。①だけでも面倒な作業が無くなる。②③はハッカソンの「人が確かめる」の入口で、デモの画面そのものになる。

2. 処理の流れ

スマホ写真 (+ 任意の音声メモ)
   │
   ▼
[A] 位置合わせ(任意)  ← field-timelapse(ハッカソン前の既存コード。境界をここで明示)
   │  手入れの前後を重ねたい所だけ。入力: photos/<field>/<date>/*.jpg
   ▼
[B] 切り分け  ← SAM 3.1(新規)
   │  概念ごとに1リクエスト。マスク → 被覆率(%) と位置を CSV/JSON に。
   ▼
[C] 比較説明  ← Muse Spark 1.3(新規)
   │  入力: その畑の今回の写真+前回の写真、[B] の被覆率(目安)、天気(Open-Meteo)
   │  出力: JSON(畑全体 → 目立つ偏り → 前回からの変化、確信度)
   ▼
[D] 検証  ← Muse Voice Transcribe + 簡単な UI(新規)
   │  農家の音声メモを文字起こし。AI の各項目に right / wrong / 訂正 を付ける。
   ▼
[E] 記録  ← プレーンテキスト(新規)
      records/<field>/<date>.md  …  1 枚の畑の 1 回の観察で 1 ファイル。写真、被覆率、AI の説明、農家の判定、天気
      → 訂正済みの例は次の観察の [C] のプロンプトに few-shot として戻す

[A] は申請書で「already built」と書いた部分。リポジトリでは別ディレクトリ(または git submodule)にして、ハッカソン中に書いたコードと履歴で区別する。

3. 記録フォーマット(案)

1 枚の畑の 1 回の観察で 1 ファイル。人も AI も読める Markdown + YAML front matter。

---
field: north-field
date: 2026-10-28
photos: [photos/north-field/2026-10-28/north-end.jpg, photos/north-field/2026-10-28/middle.jpg]
weather: {rain_mm: 0, tmax: 21.3, tmin: 12.8, days_since_rain: 3}
coverage: {weed: 61.2, bare_soil: 18.5, crop: 20.3}   # SAM 3.1, % of frame
---

## AI observation (muse-spark-1.3)
- leaf_colour: daikon leaves slightly paler than 10-26  → farmer: wrong (same colour, morning light)
- weed_height: ~15cm, +2cm vs 10-26                      → farmer: right
- soil: dry surface, cracks visible                      → farmer: right
- animal: no new tracks                                  → farmer: wrong (deer track at NE corner)

## Farmer note (muse-voice-transcribe, ja)
北の畝、土は乾いてる。北東の角に鹿の足跡。葉色は変わってない。

訂正は構造化(farmer: wrong + 理由)して残す。これが「人が検証した」証拠であり、次日の few-shot にもなる。

4. 新規に作るもの(ハッカソン期間中)

# モジュール 内容 優先
1 segment/ SAM 3.1 呼び出し、出力トークンのパース、マスク → 被覆率 高
2 describe/ 畑の今回+前回の写真を Spark へ。全体 → 偏り → 変化の JSON、few-shot 高
3 records/ 畑ごと・観察ごとに 1 ファイルの読み書き、天気の取り込み 高
4 verify/ Voice Transcribe 呼び出し、判定 UI(最小: CLI か Flet の1画面) 中
5 local/ Glimmer(Ollama)で [C] の軽量版を動かす経路 中
6 report/ 期間の全体の様子の並び(写真と一言)、被覆率の目安の推移 中

5. 費用の見積もり($150 クレジット内)

  • SAM: 4概念 × 3畑 × 写真 3 枚 × 9回 ≈ 324 画像 ≈ $0.8
  • Spark: 1 回の観察で画像約 20 枚(今回+前回)≈ 40k トークン入力、2k 出力 ≈ $0.06。9 回で $0.5。試行錯誤で ×20 しても $10 程度。
  • Voice: 1日 3分 × 9日 ≈ $0.1

→ 余裕があるので、プロンプトの試行錯誤に惜しまず使える。

6. デモ(3分動画)の筋書き

story.md の順に話す。細部の技術説明は README に回す。

  1. 外に頼る農業(30秒): 肥料も使い方も外から。会社が情報システムを業者に預けてきたのと同じ。リン鉱石の7割はモロッコ、中国は輸出を絞っている。
  2. 変え方(20秒): 畑の中の力で回す。ただし畑ごとに違うので、上から一つのやり方は配れない。耕作放棄地は約42万ha、富山県ほど。
  3. 道具(70秒): 徳島の畑を歩いて撮る → SAM が草と作物の割合の目安を出す → Spark が畑全体を言い、偏りと前回からの変化を読む(畑どうしも並べられる)→ 農家が声で答え合わせ。
  4. 放棄地と同じ姿の区画(30秒): 無肥料 4 年目、1 年刈らずにこうなった。セイタカアワダチソウとオギの土地を読み、Spark が最初に刈る場所と高さを出す → 刈る → 数日で何が戻ってきたか。
  5. 9日間(20秒): 全体の様子と農家の訂正の並び。「何をしたら、どう変わったか」がたまっていく。記録は手元のテキスト、Glimmer なら自宅だけで動く。
  6. 締め(10秒): 農家一人一人が、業者や指導を通さずに自分の畑を読めるようになる。

7. 日程(11/4 提出)

日 やること
10/27 (火) 写真撮影開始。設計確定。git 初期化。SAM をプレイグラウンドと API で試す。
10/28 (水) segment/ 完成。被覆率が出る。records/ の形を固める。
10/29 (木) describe/ 完成。2日分の比較が JSON で出る。
10/30 (金) verify/(音声+判定)。few-shot の戻し。
10/31 (土)〜11/1 (日) Glimmer ローカル経路。report/。毎日のデータ処理を続ける。
11/2 (月) README、コードの整理、Muse Code 使用箇所の記録。
11/3 (火) デモ動画撮影・編集。
11/4 (水) 予備。提出(日本時間 11/5 11:00 まで)。

8. 機械の分担(2026-10-27 決定)

機械 構成 役割
debpc(このセッション) Intel 内蔵 GPU、RAM 62GB 開発機。[A]〜[E] のコードと、SAM / Spark / Voice の API 呼び出し。
MINISFORUM MS-S1 MAX Ryzen AI Max+ 395、ユニファイド 128GB Glimmer サーバー。llama.cpp か Ollama で OpenAI 互換 HTTP を出し、debpc から LAN 越しに叩く。bf16 でも載るが、まず Q8 で速度を見る。
GeForce RTX 3070 VRAM 8GB Glimmer 30B は載らない(4bit でも約 18GB)。今回は使わない。

describe/ は base_url を切り替えるだけで Spark(api.meta.ai)と Glimmer(MS-S1 MAX)の両方を向けるようにする。両者とも OpenAI 互換なので同じクライアントコードで済む。

9. 未確定・要確認

  • MS-S1 MAX(Linux, 192.168.100.6): ping は通るが 22/11434 が閉じている(10/27 時点)。sudo ss -tlnp | grep -E ':22|:11434' で待ち受けを確認。手順は scripts/setup-glimmer-server.sh。
  • field-timelapse の場所と入出力形式
  • SAM に効く概念名(写真が来てから Playground で試す)
  • 天気の日別値: Open-Meteo の過去データ API を畑の座標で叩く(2026-10-27 決定、src/fieldnotes/weather.py)。自前サイトの NetCDF は 57 官署のみで徳島が入っていなかった。
  • 地点プロファイル records/site.md: 地質(GSJ がメンテ中)、土壌、来歴が未記入
  • クレジット反映の確認(2026-10-28 農家が受け取りを確認)

10. 今後(2026-10-27 合意)

  • 本体は上の計画どおり進める。
  • 記録に基づいて買い手の質問に答えるエージェント(Spark のツール呼び出しで records/ を検索し、記録にあることだけを答える)は、11/1 までに B〜D が動いていればおまけとしてデモ末尾に入れる。動いていなければハッカソン後に回す。
  • 本格的な商店(出品、価格交渉、決済、エージェント同士の交渉)はハッカソン後の別プロジェクト。この記録を根拠データとして使う方向で考える。
  • その先: 新しい販売組織を作る(2026-10-28 農家)。農協が入口(肥料・農薬の販売)と出口(出荷)を握る形の外に、自然農の農家どうしの販売の仕組みを作る。共通の形式の記録(プレーンテキスト、農家の答え合わせ付き)が、参加の条件と買い手への説明になる。OSS がコミュニティや財団を作ってきたのと同じ形。

近所の写真と、あとで考えること(2026-10-28、農家と)

  • 畑の近所も撮る。隣の畑のやり方(除草剤、耕起)、川、耕作放棄地、昔の屋敷など。地図では見えないものを、畑を読むときの背景にする(around.py、photos/_around/)。
  • 畑の写真は家の写真より、セキュリティの心配が少ない。写るのは土地で、家の中や人ではない。
  • 盗難が問題になったら、固定のビデオカメラを置くことも考えられる。同じ記録の仕組みに、定点の写真として入れられる(まだ作らない)。