Personal project · 2026

haburn

決めたルーティンを守れなかった日は、自分のお金が知人へのギフトに変わります。行動ログで判定し、罰金をギフトとして配り、その記録からどんな罰金なら達成率が上がるかを検証する、3つのプロジェクトの組み合わせです。

hakaru haburn komon 未達を渡す 記録を 分析へ 設定を 見直す
全体構成

データがどう流れるか

hakaruは判定した未達をhaburnに直接渡します。komonは両方のデータベースを読むだけで、本番には書き込みません。

DATA SOURCESSERVERSEXTERNAL iOSショートカット NFCタグ(起床) Appleヘルスケア Google Calendar GitHub Kaggle hakaru 観測を日次にまとめるルーティンで判定未達だけを引き渡す 毎日10:00 JSTに判定 未達タスク名1日1回 haburn 円建てで台帳に記帳しきい値で自動購入LINEでギフトを配布 受取人ごとの台帳 Polygon未達の記録 LINE公式アカウント 知人(受取人) ワンタイムリンク 決済のバックエンド: BitcoinLightningとCashu ecashで支払う Cashu mintecashを保有 Lightning請求書を支払う QUOカードPayギフトコード 支払いを依頼 komon読み取り専用

横にスクロールできます。点線は読み取りのみ。ロゴの商標はそれぞれの権利者に帰属します。

ある1日

行動から、ギフトが届くまで

06:12
hakaru玄関のNFCタグにかざすその日最初のタッチの時刻を起床時刻として記録する。ジムのWi-Fi接続、外出、Suica決済もショートカットが送る
3時間ごと
hakaru当日分を採り直すGitHubやカレンダーを集め直すだけで、日中は判定しない。挽回できる時間に罰金を確定させないため
翌10:00
hakaru前日を確定させて判定未達があれば、タスク名だけをhaburnに渡す。金額はhaburn側が決める
直後
haburn罰金を記帳1件100円、1日1,000円まで。受取人のうち1人に持ち回りで加算する。公開してよいタスク名はPolygonに記録する
1,000円到達
haburnギフトを自動で購入CashuのecashでLightning請求書を支払い、QUOカードPayを買う。額面を検証してから支払う
数分後
受取人LINEにリンクが届き、長押しで開封リンクは1回限り。開いた時点で使用済みになる
画面

使う人から見えるもの

自分はhakaruで残りを確認し、知人はLINEとhaburnの画面でギフトを受け取ります。数値は例です。

14:20●●●
hakaru9/30 (火)
やること判定観測ルーティン
今日締め
6:30までに起きる6:12 ✓
6000歩あるくあと2,140歩
自重トレーニングあと1セット
判定日が先
週2回ジムに行く1 / 2回
hakaru · やること判定前に、あと何歩・あと何回かを表示する
10:04●●●
haburn
今日
ギフトが届きましたQUOカードPayを1枚お送りします。リンクは1回だけ開けます。
受け取る
10:04
LINE · 通知受取人はアプリもウォレットも用意しなくていい
10:05●●●
haburnあと23時間
GIFT ARRIVED

ギフトが届いています

押し続けている間だけ蒸留が進みます。
溜まりきると、1回だけ表示されます。

長押しで蒸留する
haburn · 受け取り長押しで炎が溜まり、ギフトコードが1回だけ表示される
18:30●●●
haburnホーム
受け取るギフトQUOカードPay
次にギフトが届く順番
BURN LOG
09-29Burn 2件
記録済み
09-27ギフトを届けました
記録済み
09-26Burn 1件
記録待ち

金額は表示しません。届いた事実だけが並びます。

haburn · ホーム残高も金額も出さず、起きた事実だけを並べる

01 · 測る

hakaru

行動ログを集めてルーティンの達成を判定し、未達だけをhaburnに渡す。

iOSショートカット
歩数Appleヘルスケア
起床時刻玄関のNFCタグ
ジム・自重トレWi-Fi接続 / gym-log
外出自宅の位置トリガー
コンビニ利用Suica決済の座標
予定の時間Google Calendar
コミット数GitHub
コンペ提出数Kaggle
記録のしかた

記録は、ほぼ自動

iPhoneの「ショートカット」アプリのオートメーションが、家を出る・Suicaで払う・ジムのWi-Fiにつながるといった出来事をきっかけに起動し、hakaruのサーバーへ記録を送ります。アプリを開いて入力する必要はありません。GitHubやカレンダーはhakaruが自分で取りに行きます。

9:41●●●
オートメーション
自宅を出たときhakaru外出 · 即時に実行
自宅に着いたときhakaru帰宅 · 即時に実行
交通系ICで支払ったときhakaru Suica · 現在地を添付
ジムのWi-Fiに接続hakaruジム · 即時に実行
SNSアプリを開いたときhakaru朝のアプリ · 即時に実行
1時間ごとhakaru歩数 · ヘルスケアから合計
玄関のNFCタグhakaru起床 · かざした時刻
iPhoneから送る(プッシュ)
出来事が起きる場所・Wallet・Wi-Fi・App・時刻・NFCがトリガー
ショートカットが起動「URLの内容を取得」でJSONをPOST
hakaruが受け取るPOST /ingest で観測として保存
サーバーが取りに行く(プル)
定期的に起動3時間ごとと、毎朝10:00
APIから集めるGitHub · Google Calendar · Kaggle · gym-log
日次にまとめて判定プッシュ分と合わせてルーティンに当てる
  • 電波がない場所での再送は、送信ごとの重複キーで1件にまとまる
  • ショートカット自体もスクリプトで生成・署名し、管理画面からワンタップで更新できる
ルーティン9本の記録方法
自動6本 · 操作なし ついで2本 · NFCタッチ / トレーニング記録 手動1本 · 読書

いま判定しているルーティン

判定式はデータベースに置いてあり、しきい値を変えてもデプロイは要らない。欠測=未達はデータが届かないこと自体が「やっていない」を意味するもの。

毎日
6:30までに起きる
6:30までに起床
記録
ついで 玄関のNFCタグ
判定条件
その日最初のタッチが6:30以前。4:00前のタッチは起床にしない
sleep.wake_at ≤ 390欠測=未達
毎日
6000歩あるく
6,000歩以上
記録
自動 ヘルスケアから1時間ごとに送信
判定条件
1日の歩数の合計が6,000歩以上
activity.steps ≥ 6000
毎日
朝にSNS・動画を開かない
0回
記録
自動 対象アプリを開いたときに送信
判定条件
朝の時間帯にSNS・動画アプリを開いた回数が0
app.morning_launch ≤ 0
毎日
毎日読書する
1回以上
記録
手動 読んだらショートカットを実行
判定条件
その日に読書の記録が1回以上ある
reading.count ≥ 1欠測=未達
毎日
毎日コミットする
1コミット以上
記録
自動 GitHub APIから取得
判定条件
その日のGitHubのcontributionsが1以上
commits.total ≥ 1
毎日
自重トレーニングを1セット以上記録する
1セット以上
記録
ついで gym-logアプリの記録を取得
判定条件
gym-logの自重メニューに1セット以上保存されている
bodyweight.sets ≥ 1
直近7日 · 日曜判定
週2回ジムに行く
2回 / 週
記録
自動 ジムのWi-Fi接続で送信
判定条件
日曜に、直近7日のジム来館が2回以上
gym.visits ≥ 2
直近7日 · 日曜判定
コンビニは週3日まで
3日 / 週まで
記録
自動 交通系ICで支払ったときに送信
判定条件
日曜に、直近7日のうちコンビニで決済した日が3日以下
payment.convenience.days ≤ 3
月末判定
月1本OSSで受け入れられる
1本 / 月
記録
自動 GitHubから取得
判定条件
月末に、その月に外部OSSで受け入れられたPRが1本以上
oss.merged_prs ≥ 1重み ×3
収集の失敗を未達にしないデータが届かない日は判定から外す
引き渡しは1日1回hakaruとhaburnの両側で日付を一意にして二重に防ぐ
中身は保存しない予定のタイトルや決済内容は持たず、数と時刻だけを残す
日付は日本時間UTCで日付を区切ると、起床時刻と睡眠の日付が1日ずれる

02 · 配る

haburn

タスク未達の罰金をギフトコードに変え、LINEで知人に配る。

Cashu ecashLightningLINE
購入の流れ
台帳1,000円→ Cashu ecash→ Lightning支払い→ QUOカードPay→ LINEで配布

前身からの改善

  • 前身はPolygon上のJPYC送金で、受取人が自分でウォレットを用意する必要があった
  • haburnではLINEでリンクを受け取るだけ。QUOカードPayはアプリ登録なしでブラウザーから使える

お金が動く前の安全策

  • 1回の支払いに、satsの絶対上限と円額から導く上限の2段をかける
  • 請求書の額面がカタログ価格と一致するか確かめてから支払う
  • 結果が不明な注文は再決済も自動返金もせず、供給元に状態を問い合わせる
残高を見せないいつでも引き出せる口座の形にしない
換金は自動のみ運営側のしきい値で動き、ユーザーはタイミングを操作できない
招待制運営が把握している相手しか登録できない

03 · 見直す

komon

hakaruの判定とhaburnの罰金を突き合わせ、どんな罰金ならルーティンの達成率が上がるかを調べる。

1件あたりの罰金100 円
1日の上限1,000 円
ルーティンの重み× 1 既定
未達の公開選択 ルーティンごと
罰金を入れる前と後で、達成率は変わったか
1日の上限に届いた日に、諦めが起きていないか
未達の翌日は、また未達になりやすいか
未達を公開すると、金額を上げるより達成率が上がるか
実験B1 · 2026-09-29から84日間

確実な罰金と、くじの罰金

期待値が同じ2条件を日ごとにランダムに割り付けて比べる。下は未達3件の日が10日あった場合のイメージ。

確実毎回300円
300
300
300
300
300
300
300
300
300
300
くじ10%で3,000円
3,000
どちらも10日で合計3,000円 割り付けはHMACで決め、開始時に秘密値のハッシュを公開済み 前日21:00に翌日の条件だけを自分に通知
背景 · プロスペクト理論

期待値が同じなのに、なぜ差が出うるのか

期待値だけで判断する人にとって、B1の2条件はまったく同じです。それでも達成率に差が出たら、それはお金の「感じ方」の歪みによるものと言えます。KahnemanとTverskyのプロスペクト理論は、この歪みを2つの曲線で表します。

① 損失の感じ方は逓減する

利得 損失 感じる価値 300円 3,000円 10倍の額でも 痛みは約7.6倍

損失は同じ額の利得より強く感じる(損失回避)。ただし額が大きくなるほど、1円あたりの痛みは小さくなる。この効果だけを考えると、大きく稀な罰金は小さく感じるので、確実な罰金の方が達成率は上がる。

② 小さい確率は大きく感じる

10% → 約17% 0 .1 1 実際の確率 感じる重み 点線 = そのまま

人は小さい確率を実際より重く見積もる(確率加重)。人が宝くじや保険を買う理由の一つとされる。この効果だけを考えると、10%の罰金を実際より重く受け止めるので、くじの罰金の方が達成率は上がる。

2つを掛け合わせると(よく引かれる推定値 α=0.88, λ=2.25, γ=0.69で計算)
確実
0.30
くじ
0.38

感じる痛みの大きさ(相対値)。この推定値では、確率加重の影響が逓減を上回り、くじの方が重くなる。ただし自分の曲線はわからないので、実験で確かめる。

くじ > 確実 なら確率加重の影響の方が大きい小さく稀でも大きな罰金を設計に取り入れる余地がある
確実 > くじ なら逓減の影響の方が大きい大きく稀な罰金は小さく感じる。少額を確実に取る方がいい
差がないなら期待値だけで決まっている罰金は期待値だけで設計すればよく、分布の形は気にしなくていい

「100円と300円で比べる」実験にしなかったのは、額を上げれば達成率が上がるという予測は普通の経済学でも同じで、プロスペクト理論を確かめられないため。


これまで

経過

2026-08-15

haburnが判定から受け取りまで、実データで一通り動く

2026-08-21

hakaruが判定だけで稼働開始(罰金なし)

2026-08-30

hakaruからhaburnへの引き渡しを有効化。罰金の記帳が始まる

2026-09-29

komonの実験B1を開始(実施中)