Decision Log
主要な意思決定ログ
各アップデートの裏にある「なぜ」を、決定・仮説・結果の 3 点で残す。理由は変更内容から再構成
v2.1.4 「週に 1 回書かせる」のをやめ、毎日ひとこと置ける場所として作り直した
- DECISION
- 振り返りの対象週を月曜から開けっぱなしにし、閉じそこねた先週は水曜 0 時まで上に残す形にした。
週の中に 1 日ずつの欄を置き、過ぎた日は 4 択の感想、まだ来ていない日は 3 択の自信度を選べるようにした。
自由記述は「その他」を選んだときと、日ごとの任意のひとことだけに限る。
- WHY / 仮説
- それまで対象週は日曜だけが今週で、月曜になると先週へ切り替わっていた。
既定の通知が日曜 20:00 なので、その日のうちに閉じられるように、という理屈だった。
だが結果としてその週に触れる機会が日曜の 1 日しか無く、
水曜の手ごたえは週末には残っていない。
v2.2 で日のメモを廃止したときの本当の理由は「日と週のどちらに書くか毎日問われる」ことで、
粒度が 2 つあること自体ではなかった。それなら、日ごとは選ぶのが主にして
入力の重さを変えれば、問いが重ならない。
- RESULT
- 書く場所は増えたが、既定で出ている自由記述欄は週メモ 1 つのまま(日ごとは選択肢、「その他」は選んだときだけ)。
できなかった側だけを聞いていたのもやめ、できた側にも「時間を決めていた/準備しておいた/小さくやった」を置いた。
崩れた原因は週ごとに違うが、続いた形は再現できる。
v2.1.4 種別を足してよいのは「暦だけで予定日が決まる」ものだけ、と線を引いた
- DECISION
- 繰り返しに 第◯曜日(毎月の第 2 水曜・最終金曜など)を 4 つ目として足した。
一方で要望のあった「隔週」「月一回」は足さなかった — 間隔ベースが既に持っているため。
- WHY / 仮説
- 「決め方は 3 つまで」を守ってきたのは、v1 が種別を増やすたびに隠れた既定値
(週 2 回を選ぶと暗黙に月・木が入る)と分母の定義できない予定を持ち込んだから。
第◯曜日はそのどちらでもない。日付だけで予定日が決まるので
isScheduledOn が答えられ、達成率・ヒートマップ・棒グラフの分母にそのまま入る。
制約の本体は「3 つ」という数ではなく、分母を答えられるかどうかだった。
- RESULT
- 同じことを 2 通りで表せる状態も作らずに済んだ。
以後この線引きで判断する — 分母を答えられない種別は増やさない。
v2.1.4 グルーピングは線を濃くするのではなく、面で分けることにした
- DECISION
- 振り返りの節を、余白と細い線ではなく地より 1 段持ち上げた白い面で囲んだ。
週の切れ目の区切り線も外し、太字の見出しと余白だけにした。
- WHY / 仮説
- 「エリアの境界線が分かりにくい」という申告。線を濃くすれば直るが、
画面が表になって「静かに読む場所」という性格から外れる。
境目は「線の濃さ」ではなく「面の切れ目」でも伝わる。
- RESULT
- 同じ指摘で「できなかった習慣にだけ件数が付いている」ことも判明し、
週の合計・できた・できなかったの 3 つとも件数で言う形に揃えた。
片方だけに件数があると、数えているものが違うように見える。
v2.1.3 標的を指の下で動かさない。完了しても並びを変えないことにした
- DECISION
- 完了した習慣を一覧の下へ寄せるのをやめ、並びは常に並べ替え順のままにした。
「上から順に押していけば終わる」という理屈で v2.1.2 に入れた挙動を、1 バージョンで戻した。
- WHY / 仮説
- 「最初違和感がある」という申告を受けて、実際の挙動をフレーム単位で測った。
押した次のフレームにはもう入れ替わっており(アニメーションは挟まらない)、
3 枚並べて 1 枚目を押すと、2 枚目が 1 枚目の居た座標にぴったり乗る。
つまり同じ場所を続けて 2 回叩くと別の習慣が記録される。
これは v1 の敗因(34px の丸・カード本体・︙ が同居し、数 px の差で挙動が変わった)と
同じ種類の事故で、標的が指の下で動くぶん質が悪い。
単発の ToDo アプリが完了項目を下げる/消すのは、その項目が二度と一覧に戻らないから。
ここが扱うのは繰り返す習慣だけで、明日も同じ顔ぶれが同じ順で出る。
- RESULT
- 「まだ残っているのはどれか」はリングが数字で答え、済んだカードは地の色で見分けられるので、
下げなくても困らない。区画(未完了/完了)をまたがせない並べ替えの分岐も丸ごと消えた。
押した座標に同じカードが残ることをテストで固定した。
v2.1.3 リングは「今」しか言わない。先週を背後に敷く
- DECISION
- ホームのリングの背後に、先週 7 本・今週 7 本の日ごとの棒グラフを敷いた。
ホームに 2 つ目の図を積むのではなく、円の周りの空きに置く。
- WHY / 仮説
- 達成率のリングが答えるのは「今どれだけ進んだか」だけで、
先週より良いのか悪いのかを言わない。同じ理由で詳細画面はリングをやめて
推移グラフにしてある。とはいえホームに図を並べると要素が増え、v1 の形に戻る。
円は下ほど細るので裾の両脇が空いており、そこは元々使っていなかった。
- RESULT
- 棒はリングより先に描く(弧の上に重ねると達成率の線が途切れて見える。
小さいリングを円に食い込ませるのをやめたのと同じ理由)。数え方は達成率と同じ関数に
そろえたので、今週 7 本の合計は週リングの分子・分母と一致する。
画面の高さは差し引き 8dp しか増えていない。
v2.1.3 書ける場所を週 1 つに戻す。毎日のメモは 3 週間で畳んだ
- DECISION
- v2.1.2 で足した日ごとのメモ(DayNote)を廃止し、自由記述を週の振り返りメモ 1 つに戻した。
あわせて、日曜だけメモ欄の枠をゴールドに光らせる。
- WHY / 仮説
- 足したときの理屈は「週メモは日曜に 1 回書くものなので、水曜に起きたことは月曜に思い出せない」。
実際に使ってみると、埋まらない穴はそこではなく、入力欄が 2 つあること自体が
「どちらに書くのか」を毎日問い直させていた。書く場所は 1 つでよい。
代わりに要るのは「いつ書くのか」の合図で、その週を閉じられるのは日曜のうちだけ
(月曜になると対象が先週へ移る)。平常時と同じ見た目では、その日限りだと画面から読めない。
- RESULT
- 画面は消したが
day_notes テーブルと同期は残した。消すと、まだ旧版が入っている
端末から空の行が pull されて過去のメモが消える。
光らせる色はゴールド(attention)で、赤は取り返しのつかない操作のために取ってある。
色だけで伝えないよう 1 行添える。
v2.1.3 予定時刻が来たことは、時刻の文字が言う。枠には空きが無い
- DECISION
- 予定時刻を過ぎたら、カードの時刻をゴールド+太字にし、アイコンを時計から目覚まし時計に替える。
枠と地には手を出さない。
- WHY / 仮説
- 通知は一瞬で消えるし、既定ではそもそも鳴らない。画面の側でも言えないと、
時刻を決めたことが一覧に出ない。候補は「枠の色」と「時刻の文字」の 2 つだったが、
枠にはもう空きが無い —「これからやる/済んだ/予定外」で使い切っており、
4 つ目の意味を乗せると状態が掛け算で増える(v1 が 18 状態に膨らんだ形)。
面積が大きいぶん圧も強く、朝 7 時を過ぎた瞬間に並んだ枠が全部変わると画面が警告板になる。
期限超過が既に枠に触らずラベルの文字だけをゴールドにしていて、前例もあった。
- RESULT
- このカードでは「ゴールド=時間の話」に揃った。これからやる 1 枚にしか出さない
(済んだものに「もう時間だ」は用が無い)。
分ごとに刻まず、次の予定時刻ちょうどに 1 回だけタイマーを張る。
v2.1.2 build 30 失敗を「同期できませんでした」で片付けない。理由を画面に出す
- DECISION
- Apple ログインの資格情報を Firebase に渡す口を、汎用の
OAuthProvider('apple.com') から Apple 専用 API に変えた。
あわせて、ログインの失敗を「同期できませんでした」と呼ぶのをやめ、
失敗の識別子をそのまま画面に出すことにした。ログイン済みの行には
アカウントのアイコンとアドレス、最終同期の時刻を出す。
- WHY / 仮説
- きっかけは App Review が build 26 と build 29 を続けて却下したこと。
添付されたのは「同期できませんでした」というスクリーンショット 1 枚で、
ログインで落ちたのか同期で落ちたのかすら読み取れなかった。
entitlement・Firebase のプロバイダ設定・シートの提示先を順に疑って、すべて
シロだった。実機(iPad / iPadOS 26)で追うと、Apple のシートは正常に出て
トークンも正しく(audience も nonce も一致)、落ちていたのは Firebase に渡す
1 行だった。汎用 OAuth の口は Apple には存在しない access_token を付けて送る —
Dart の見た目は同じ 2 行なのに、通るネイティブ API が別物だった。
手元で再現できない相手(審査・利用者の報告)から返ってくるのは画面の写真だけで、
そこに識別子が 1 語あるかどうかで原因の絞り込みが変わる、と考えた。
- RESULT
- 修正後、iPad で Apple ログインから Firestore 同期まで到達を確認。
原因の切り分けに 2 回のリリースサイクルを使ったので、
シロだと確認済みの容疑をコードのコメントに残した
(同じ疑いを最初からやり直さないため)。
「押したあと何が起きたのか分からない」という声も同じ根で、
状態名(「同期中」)より誰としてログインしているかを
行の主役に置き換えた。
v2.1.2 書ける場所は「週」と「日」の 2 つまで。習慣ごとには持たせない
- DECISION
- その日のことを書けるメモを足した。ただし 1 日につき 1 件で、
習慣ごとの自由記述は持たせない。書く画面は 1 つだけにして、
ホーム(見ている日)・週の振り返り・履歴のどこから開いても同じ画面に送る。
ホームには入力欄を置かず、1 行の入口だけにした。
- WHY / 仮説
- 週のメモは日曜に 1 回書くものなので、水曜に起きたことは月曜には思い出せない。
かといって習慣ごとに書かせると、入力欄が習慣の数だけ増える —
v1 の振り返りが壊れたのは大量に入力させたうえ何も保存しなかった
ことなので、入力の量が増える方向は選べない。日に 1 件が最小の単位だと考えた。
ホームに入力欄を埋めなかったのは、キーボードが立ち上がるたびにカードの位置が
動くから。ホームに来る目的はカードを押すことで、書くのはその次にある。
- RESULT
- 保存ボタンを押さずに戻っても消えないようにした(同じ書き込み口を通す)。
削除ボタンは置かず、全部消して保存=消すに一本化している
(2 つの操作が同じ結果を作らないため)。行は tombstone として残すので、
他の端末の古いメモが同期で復活することもない。
v2.1.2 一度捨てた「頻度」を戻す。ただし隠れた既定値は作らない
- DECISION
- 繰り返しの決め方を 3 つにした(曜日で決める/週に何回/間隔で決める)。
v2 は曜日集合ひとつに畳んでいたが、そこへ「回数」と「間隔」を戻す。
ただし 回数ベースに曜日を一切持たせないことと、
頻度は編集画面にしか出さないことを条件にした
(追加フロー・オンボーディング・一括設定は曜日のまま、既定は毎日)。
- WHY / 仮説
- 曜日集合は 1 週間で一巡するので、「週 2 回・曜日は決めない」と
「隔週」「月一回」がどうやっても表せない。一方 v1 が壊れた原因は
頻度という概念そのものではなく、「週 2 回」を選ぶと暗黙に月・木が入る
という隠れた既定値と、それを追加フローに出したことだった。
壊れた原因のほうを禁止すれば、概念は戻せるはずだと考えた。
- RESULT
- 間隔ベースの次の期限は記録から逆算せず
Habit.nextDueDate に持たせた。
逆算すると、記録の窓が 7 日しかない振り返り画面で「一度もやっていない」に落ちて
期限が開始日まで飛ぶ。列に持てば判定は日付の比較だけで済む。
v2.1.2 分母の定義を変えるより、画面の中の食い違いを消す
- DECISION
- 週 N 回と間隔ベースは達成率の分母に入れない。ただし
「今日」だけは画面のカードそのものを分母にする。
日と週で分母の作り方が違うことになるが、そちらを採った。
- WHY / 仮説
- 週 2 回の習慣を曜日
[1..7] のまま日ごとに数えると、
全曜日で最大 29%(2/7)にしかならない — v1 で実際に起きたバグと同じ形。
だから期間の集計からは外した。ところが実機で確かめたら
カードが 1 枚残っているのにリングが 100% と出た。
期間の一貫性より、同じ画面の中で数字と一覧が食い違うことのほうが
直接効くと判断した。
- RESULT
- 週・月は過去の期限を復元できない(
nextDueDate は「今」の値しか持たない)ので
曜日ベースだけを数えたまま。非対称は残るが、意図した非対称としてコードに書いた。
v2.1.2 入れ替えるのをやめて、位置を固定して大きさで示す
- DECISION
- ホームの円グラフを、大きいもの 1 つ+小さいもの 3 つ(今日・今週・今月)にした。
3 つの位置は固定で、選択中だけ 1.25 倍になる。
「今年」は廃止した。
- WHY / 仮説
- もとは「日 週 月 年」の押せる文字 1 行で、押してみるまで中身が分からなかった。
そこで数字を小さい円に出したが、最初は「選択中のものは大きい円に居るので
小さいほうには出さない」形にした。これが分かりにくいと指摘された —
押すたびに 3 つの中身が入れ替わり、どれを押したのかを動きで復元するしかない。
位置を止めて大きさだけ変えれば、動くのは押したものだけになる。
- RESULT
- 帯の色に「どの期間か」を持たせた(弧の色は達成率が使い切っているため)。
大きい円の帯だけ薄くしてある — 原色のままだと 0% のときに濃い線が一周し、
満ちているように見えた。「今年」は 1 月なら必ず低く 12 月なら必ず落ち着くだけで、
日々の判断が変わらないので落とした。
v2.1.1 「置かない」と決めたものほど、どこに在るのかを書く
- DECISION
- 詳細画面の「今日」を、状態(1 つだけ・アイコンと大きめの文字)/その状態の意味と操作の場所を書いた 1 行/幅いっぱいの枠付きボタン、の 3 段に分けた。曜日・リマインダー・目標・計測開始日は 1 枚のカードにまとめ、カード全体を編集画面への入口にして、ヘッダーの鉛筆アイコンは外した。あわせてリマインダーの通知に習慣名と予定時刻を載せ、タップ先をその習慣の詳細画面にした。計測開始日は編集画面から変えられるようにした(未来は選ばせない)。
- WHY / 仮説
- 「できた/できないのボタンが分かりにくい」という申告を調べたところ、ボタンは 1 つしか無かった。並んでいたのは 状態表示の「できた」 と ボタンの「今日はやらない」 で、同じ行に横並び・違いは文字色だけ。2 択ボタンに読め、押しても反応しない左半分が壊れて見えていた。設定項目も同じ形で、読むだけの面なのに触っても何も起きないので、壊れているのと区別がつかない。完了トグルを詳細画面に置かないのは v2 の決めごと(速い経路が隠れるのを防ぐ)だが、置かないと決めたものほど、どこに在るのかを書かないと辿り着けない。通知も同じで、見出しが習慣名だけ・本文が全習慣共通の 1 行だったため、2 件並ぶとどちらがどの時刻の分か読めなかった。
- RESULT
- 状態と操作が別の要素になり、状態ごとに「どこで記録するか」が画面に出るようになった。編集への入口は設定カード 1 つに絞れた(同じ行き先の標的が 2 つあると毎回どちらか考えることになる)。高さを詰めた結果、390×844 以上の端末では日本語・英語・ドイツ語・ポルトガル語のいずれもスクロールなしで最後まで見える(テストで固定)。4.7 インチではまだ 35〜119dp 残る。通知は「ランニング の時間です/07:30 の予定です」となり、タップでその習慣に着く。予定時刻はホームの一覧にも出したので、鳴った通知と目の前のカードが結びつく。ついでに 320dp 幅で曜日の丸が 6px、イタリア語の目標ラベルが 17px 溢れていたのを直した(10 言語の溢れ検査に編集・詳細画面を追加して発見)。
v2.1.0 並び順は本人に委ね、急かす表示は「過ぎた締切」だけに絞る
- DECISION
- ホームのカードを長押しでつかんで上下に運べるようにし、並び順を保存して端末間でも保つようにした。長押しを並べ替えに割り当てたぶん、詳細画面への入口は各カードの ︙ 一本に統一。地の色は朝・昼・夕・夜でうっすら移ろわせる。アプリアイコンのバッジは、その習慣のリマインダー時刻(未設定なら 18 時)を過ぎた未記録だけを数えるように変えた。
- WHY / 仮説
- 「今日どれから手を付けるか」は本人にしか決められないのに、並びを作成順に固定していたのはアプリ側が段取りを決めている状態だった。ただし並べ替えのために上下ボタンを足すと 1 行のタップ標的が 3 つになり、v1 が壊れた「数 px の差で挙動が変わる」形に戻る。長押しは詳細画面へ行く経路だったが、同じ行き先の ︙ が隣に在って経路が 2 本重複していたので、余っている側を並べ替えに回せば標的を増やさずに済むと考えた。バッジは日付が変わった瞬間に今日の予定ぶんが全部乗る作りで、朝いちばんに最大値が付いて 1 日じゅう減らなかった——まだ誰も何も落としていない時点で「溜まっている」と言う装置になっていた。
- RESULT
- 並べ替えた順序は日をまたいでも別の端末でも保たれ、追加した習慣は末尾に入る。カード 1 行のタップ標的は記録と ︙ の 2 つのままで増えていない。バッジは朝は 0 のままで、締切を過ぎたぶんだけ増える形になった。地の色は 1 日 4 回しか変わらず、動かすのは地だけなので「これからやる 1 枚がいちばん強い」というカードの強弱と、「過去の日を見ているときは暖色」という合図はそのまま保たれている。
v2.0.0 作り足すのをやめ、ゼロベースで作り直す
- DECISION
- v1 の実装を全削除し、繰り返す習慣だけを扱うアプリとして再構築した。完了は 5 段階評価をやめてチェックのみに。ホーム画面は 1 画面・タブなし・完了経路にモーダルなしとし、行のどこをタップしても 1 タップで完了する形にした。単発 ToDo(やること)と外部 API 連携は廃止。
- WHY / 仮説
- 「毎日確認して完了するアプリなのに、ワンプッシュで完了できないのが苦痛」という申告を調べたところ、ワンタップ記録は v1.4.0 で実装済みだった。使えなかったのは、ヒット領域が約 34px と推奨の 44/48dp を下回り、別のタップ標的の内側にあって数 px 外すとモーダルが開き、押せると分かる手がかりが無かったため。つまり機能不足ではなく、同じ動作を書く経路が 5 つに増え、ホーム画面が 18 状態を持ち、手書き UI の約 30% が到達不能なコードになっていた——「何のアプリか」が定まらないまま積層した結果だと判断した。個別の修正では解けないと考え、作り直しを選んだ。
- RESULT
- 習慣 3 件の完了が 3〜9+ タップから 3 タップへ。完了経路は 1 つ、ホーム画面の状態は 1 つ、初回体験は 6 画面・約 50 入力から 1 画面に。手書きコードは 19,896 行から 5,029 行(UI 層は 16,752 → 1,540 行)。達成率の分母を経過日数から予定日に直し、週 2 回の習慣が最大 29% にしかならないバグも解消した。あわせて、ログインで記録をクラウド保存し機種変更で引き継げる任意のクラウド同期も実装した(未ログインでも全機能そのまま使える)。v2.0.0 で正式リリース
v2.0.1〜v2.0.2 最小の記録体験の次に、「続き具合」を見せて振り返りへ導く
- DECISION
- 習慣の詳細画面に「週ごと」「曜日別」の達成率グラフを追加し、詳細は閲覧専用・編集は右上へ分離した。ホーム中央の円には曜日と今日の残り時間を表示し、前日を見ているときは「昨日/◯日前」ラベルと横スライドで“いつを見ているか”を明示。週の振り返りが未了のあいだはホームに振り返りへの入口を出すようにした。
- WHY / 仮説
- v2 で記録を 1 タップまで削ぎ落とした次の課題は、「続いているか」を実感でき、つまずいた曜日に気づけること。数字の羅列ではなく先週比・曜日別で見せれば、曜日や通知の設定を自分で見直す動機になると考えた。
- RESULT
- 達成率が先週比・曜日別で一目で分かるようになり、振り返りへの動線をホームに常設。あわせて起動時に読み込みが終わらない不具合やアイコンバッジの減算も修正した。
v1.5.0 10 言語に対応し、配色は決めきれず「選べる」ようにした
- DECISION
- 全画面の文言を arb 化して 10 言語に対応。あわせて寒色ナチュラルの配色に刷新したが、v1.4.0 の暖色版も残してユーザーが設定画面で切り替えられるようにした。
- WHY / 仮説
- 習慣トラッカーは言語圏を選ばない題材なので、多言語化は伸びしろが大きいと考えた。配色は暖色と寒色のどちらが「気軽に開ける」かを決めきれず、選ばせる形に逃がした。
- RESULT
- 10 言語に到達した一方、配色を 2 つ残した判断は設定項目を 1 つ増やしただけだった。v2 では harmony 1 本に決め、切替ごと削除している。この判断は v2 で撤回
v1.0.2 アプリ容量を 112MB → 62MB へ 45% 軽量化する
- DECISION
- レベル画像を WebP 化するなどして、アプリ容量を約 45% 削減した。
- WHY / 仮説
- 初回ダウンロードの重さはインストール離脱の要因。毎日開いてほしいアプリこそ、入り口の摩擦を小さくすべきだと考えた。
- RESULT
- リリース直後の早い段階で 112MB → 62MB に軽量化。導入のハードルを下げた。
v1.3.5 通知の不具合を直し、リマインダーを既定 ON にする
- DECISION
- 通知・リマインダーが動作しない問題を修正(iOS フォアグラウンド通知・Android 13 以降の権限に対応)し、リマインダーのデフォルトを ON(21:00)に変更した。
- WHY / 仮説
- 習慣アプリでリマインダーは継続の生命線。動かない、かつ自分で ON にしないと使われない状態は致命的で、初期から「気づける」状態にすべきだと判断した。
- RESULT
- 通知が確実に届くようになり、既定で毎日リマインドされる状態に。継続の取りこぼしを減らした。
v1.4.0 やさしいトーンへデザインを刷新する
- DECISION
- アプリアイコン・ホーム画面をやわらかい配色に一新。時間帯あいさつ、ワンタップ記録、やさしい応援メッセージを導入した。
- WHY / 仮説
- 毎日開くアプリは「親しみやすさ」と「記録の手軽さ」が継続に直結する。真面目すぎず気軽に開けるトーンにすることが習慣化を助ける、と考えた。
- RESULT
- 気軽に開けて素早く記録できる体験に。継続のための心理的ハードルを下げた。