kidoku-mystery
WIP(現在進行中)
Work In Progress
このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。
現在の状況
(2026-08-19 更新 / プロジェクト凍結)
- このプロジェクトは凍結中。You の判断(2026-08-19): プレイ環境の手触りがチープなままでは楽しさを判定できず、演出を作り込む方向も検討したが、反省を糧に別企画(サスペンス)を新プロジェクトとして立ち上げることにした
- 振り返りは
kidoku-mystery-ポストモーテム.md(教訓5つ+うまくいったこと+持ち出し資産) - 凍結時点の状態: Day1〜4 執筆済み(123ノード)、エンジン・セーブ永続化・プレイテストモードまで動作、
scenario-lintエラー0、swift test33件成功、main は origin と同期 - 解凍する場合の入口: ① ポストモーテムを読む ②
.devnotes/WIP.mdのアーカイブ(下記 2026-08-19 スナップショット)で現在地を把握 ③ 未解決の筆頭は「既読仕様(数だけ/リスト型)」と「演出パス」 - 新プロジェクトで ScenarioKit(形式・リンター・エンジン・セーブ)を流用する場合はこのリポジトリから持ち出す
過去のWIPアーカイブ
(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)
2026-08-18 17:25 時点のスナップショット(=Day2執筆前。凍結までの経緯は DEVLOG 2026-08-19 参照)
(2026-08-18 17:25 更新 / 縦スライス①②③ 完了、次は Day2 の執筆)
- いまここ: 縦スライス3ステップが全て完了。Day1 は You の OK 判断済みで確定台本。
- ① シナリオ形式+リンター(
scenario/FORMAT.md+ScenarioKit/) - ② 実行エンジン(
Runtime.swiftのScenarioRunner)+ 偽スマホ5画面 - ③ Day1 の台本(4場面・9経路・ビートB1/B2)
- ① シナリオ形式+リンター(
- 次にやること = Day2 の執筆。設計上は 大悟=囮の日。初の着信(エンジンは実装済み・未使用)が入り、菜帆ピーク(Day3)への前振りが乗る。ビートは B3〜B4 あたりを想定(B は Day1-6 に10個)
- その次の候補 = セーブの永続化。今はアプリを閉じると最初から。待ちもアプリ起動中しか進まないので、「7日間かけて遊ぶ」体験そのものがまだ検証できていない
- 今ある資産:
scenario/FORMAT.md… 形式 v1 の正典。「実行エンジン」節と「v1でまだ実装していないもの」表つきScenarioKit/… Parser(スキーマ正典)/Validator/Runtime(実行エンジン)/Transcript(台本書き出し)/scenario-lintCLI + 回帰テスト25件scenario/*.json… レジストリ6種+ day1(本編確定)- iOS … 偽スマホ5画面(chat / home / photos / phone / call)。Day1 を実機で通し確認済み
- 検査:
cd ScenarioKit && swift run scenario-lint ../scenario --allow-missing-handoff→ エラー0・警告4(day2未執筆/EN未到達/B1・B2が判定式未使用=いずれも正常) - テスト:
cd ScenarioKit && swift test→ 25件成功 - 台本を読む:
swift run scenario-lint ../scenario --allow-missing-handoff --transcript out.md - Day1 台本の Artifact: https://claude.ai/code/artifact/1dcb26d8-b90c-4d82-8ff8-05fa5c724a27
- 確定した設定(今セッション分): グループ名=天体観測 / 主人公=女性固定・結衣(ゆい) / 隠し要素=TRUE到達+もう1周 / 呼称は 夏希・菜帆「結衣ちゃん」、蓮・静香・大悟「結衣」、美月だけ未設定(終盤の特別な呼称のため)
- 未実装(FORMAT.md に表で明記): セーブ永続化 / ローカル通知の実発火 / 画像・スタンプの実素材
- 未決: 製品タイトル『太陽を既読にする』はまだ(仮)。商標(区分9/42)とストア名の実チェックが未了
- 進め方ルール: 大枠は You が確認、細部は Codex(
codex exec)に監修を通して Claude が決める。※ 長いプロンプトは stdin で渡す(引数だと無言でハングする) - 後回しにするもの: 素材洗い出し、商標・ストア名チェック、Android
2026-08-18 17:25 時点のスナップショット(=縦スライス②③に入る前)
(2026-08-18 14:00 更新 / 縦スライス① 完了、次は ②エンジン拡張)
- いまここ: 縦スライス3ステップのうち ① シナリオ形式+バリデータが完了(commit
80dc4a1、push済み)。企画は一巡して全確定済みなので再検討しない。 - 次にやること = ② エンジン拡張(You の意思決定ゼロ):
ios/KidokuMystery/ViewModels/ChatViewModel.swiftをDayOneScript.swift直参照から ScenarioKit 駆動へ置換する(読み込みはPackageLoader.loadValidated)- 自動既読を廃止する。現行は送信1.25秒後にエンジンが勝手に既読を付けているが、既読タイミング自体が物語情報なので
markReadstep でスクリプトが指定した場所だけで付くようにする - 選択肢分岐・可変待ち(
suspend)・画面遷移(surface/navigate)をスクリプトから動かせるところまで伸ばす - あわせて吹き出し配色を Messages から離す(下記リスク参照)
- その後 = ③ Day1シナリオのドラフト: Claude が GDD v0.2+真相設計書を材料に書き、You は読んで OK/NG を付けるだけ(意思決定を「選ぶ」一種類に圧縮する方針)。
- 今ある資産:
scenario/FORMAT.md… スクリプト形式 v1 の仕様(正典)。実装との齟齬は放置せずどちらかを直すScenarioKit/… Parser(スキーマ正典)/Validator(分岐グラフ検査)/FixtureRunner/scenario-lintCLI + 回帰テスト8件scenario/*.json… レジストリ6種+ day1(プロローグのみ。本編はこれから)- 検査コマンド:
cd ScenarioKit && swift run scenario-lint ../scenario --allow-missing-handoff→ 現状 エラー0・警告3(警告は day2 未執筆/EN未到達/ビートB1未参照=いずれも今は正常) - リンター自体の検査:
cd ScenarioKit && swift test→ 8件成功
- iOSプロトタイプ: シミュレータで動作確認済み。プロローグ一本+選択肢+既読表示まで通る。ただし台本はハードコードのままで、②で置き換える。
- 要対応リスク: 現行の吹き出しが右寄せの青+SwiftUI標準で Apple Messages に寄りすぎ。App Store Guideline 5.2.5(Apple製品・Messages と紛らわしいUIの禁止)に触れうるため配色を変える。偽スマホUI自体は実績多数で問題なし、ホーム画面を作る際も iOS の springboard に似せないこと。
- 未決: 製品タイトル『太陽を既読にする』はまだ(仮)。商標(区分9/42)とストア名の実チェックが未了。
- 進め方ルール: 大枠は You が確認、細部は Codex(
codex exec)に監修を通して Claude が決める。 - 後回しにするもの(縦スライス完成まで触らない): 素材洗い出し、商標・ストア名チェック、Day3以降のシナリオ、Android。
- 制作ボード(現在地の可視化): https://claude.ai/code/artifact/70389af2-1340-4cfa-9e1b-dcfed54f7d9a
2026-08-18 14:00 時点のスナップショット(=この日の作業前・再開プラン確定時)
- 経緯: 意思決定が多すぎて疲れて中断していた(2026-07-21 以降停止)。再開にあたり「Youの意思決定ゼロの作業から入り、Youはテイスト判定(OK/NG)だけに絞る」方針を確定(intelligence-bank の牛尾剛×Newbee回の議論から。ハーネスで減らすのは創作以外の意思決定)。
- 目標: ROADMAP の縦スライス(Day1〜2+分岐1本+END1つ)一本に絞る。他は着手しない。
- 再開手順(次セッションは①から。「縦スライス再開、①から」で開始):
- ① シナリオスクリプト形式+バリデータ(You の意思決定ほぼゼロ):
DayOneScript.swiftにハードコードされている原型をデータ形式(JSON等)に外出しし、分岐・フラグ・EN到達可能性・孤児分岐を機械チェックするリンターを作る(分岐地獄対策を管理表でなく機械検証にする) - ② エンジン拡張(同ゼロ): 選択肢分岐・可変待ち・既読演出をスクリプト駆動で動くようにiOSプロトタイプを伸ばす
- ③ Day1シナリオはClaudeがドラフト生成: GDD v0.2+真相設計書を材料に書き、You は読んでOK/NGを付けるだけ(意思決定を「選ぶ」一種類に圧縮)
- ① シナリオスクリプト形式+バリデータ(You の意思決定ほぼゼロ):
- 確定済みの土台(企画フェーズは一巡完了、再検討しない): 未決事項①〜⑩全確定。GDD v0.2(
kidoku-mystery引き継ぎ.md)、真相核心はkidoku-mystery-真相設計.md(ネタバレ)。犯人=夏希/EN全10+隠し・TRUE方針A/アプリ名Nagi/タイトル(仮)『太陽を既読にする』/待ち=可変+通知設計/名前入力あり/電話=音声なしA1。 - 進め方ルール: 大枠は You が確認、細部は Codex(
codex exec)に通して Claude が決める。 - 後回しにするもの(縦スライス完成まで触らない): 素材洗い出し、商標・ストア名チェック、Day3以降のシナリオ。
- リポジトリは main が origin と同期済み・クリーン(iOSプロトタイプは commit b2c6cc3 まで反映済み)。
〜2026-08-18(企画フェーズ一巡完了、以後中断)
- 未決事項①〜⑩を全て確定(①美月/②犯人=夏希/③秘密+癖崩れ/④Nagi/⑤『太陽を既読にする』/⑥苗字/⑦EN10+隠し・TRUE方針A/⑧待ち・通知/⑨名前入力/⑩電話A1)。GDD v0.2・真相設計書あり。
- 次フェーズ候補としてシナリオ執筆+フローチャート整備/素材洗い出し/iOSプロトタイプ/商標チェックを列挙していた。iOSプロトタイプ(SwiftUIチャット+既読)は commit b2c6cc3 で着手済み。
- その後、意思決定疲れで中断。
〜2026-07-21 07:35
- 企画フェーズ。GDD v0.1。電話アプリを物語装置として追加確定(具体仕様は未決)。
- 未決事項①「6人目の性別・名前・人物詳細」を壁打ち中(Claude のたたき台に対する回答待ちで中断)。
ROADMAP(計画)
ロードマップ
2026-08-19: プロジェクト凍結。以下は凍結時点の計画(解凍時の参考として残す)。 経緯は DECISIONS.md、教訓は kidoku-mystery-ポストモーテム.md 参照。
今週
- 未決事項①〜⑩ を全て確定(企画フェーズ一巡完了)
- ①美月 ②真相・犯人=夏希 ③秘密+癖崩れ ④アプリ名Nagi ⑤タイトル『太陽を既読にする』⑥苗字 ⑦EN+ルーティング ⑧待ち・通知 ⑨名前入力 ⑩電話
- 縦スライス① シナリオ形式+バリデータ(
scenario/FORMAT.md+ScenarioKit/、回帰テスト8件) - 偽スマホの画面遷移を確定(自動遷移+選択肢のみ・自由探索なし)
- 縦スライス② エンジン拡張(
ScenarioRunner新設・iOSをJSON駆動へ・自動既読を廃止しmarkRead制御に・偽スマホ5画面) - 吹き出し配色を Apple Messages から離す(App Store Guideline 5.2.5 対策)
- Day2 の執筆(大悟=囮の日。初の着信が入り、菜帆ピークへの前振りが乗る)
- セーブの永続化(アプリを閉じても続き、待ちもアプリ外で進む。
RunnerSnapshot+SaveStore)
今月
- ローカル通知の実発火(
suspend.notificationは今は文言表示のみ) - シナリオ執筆と同時のフローチャート管理整備(分岐地獄対策。7日×分岐×EN10)
- → 管理表ではなく「JSONデータ形式+リンター(機械検証)」で実現
- iOS(SwiftUI)でチャット/既読/通話UIのプロトタイプ(ネイティブ・iOS先行で確定、Androidは後続)
- → チャット+既読はシミュレータで動作確認済み。通話UIは未着手(②以降)
- 縦スライス③ Day1シナリオのドラフト(You が6点とも OK 判断済み。台本は確定)
- 素材の洗い出し(アイコン差分・スタンプ各3〜6・画像メッセージ10〜20・UI一式)
- 製品タイトルの商標(区分9/42)・各ストア名の実チェック ※タイトルは現在まだ「(仮)」
今四半期
- プレイアブルな縦スライス(Day1〜2 + 分岐1本 + END1つ)を作る
- Day1・エンジン・偽スマホ5画面は完了。残りは Day2 と END到達の1本
いつか
(いつかやりたいこと・アイデアストック)
DECISIONS(意思決定)
意思決定記録
このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。
2026-08-19: プロジェクト凍結。別企画(サスペンス)を新規立ち上げ
決定: kidoku-mystery(『太陽を既読にする(仮)』)を凍結する。削除はしない(main に全 push 済みの状態で保存)。反省を糧に、別企画(サスペンス)を新プロジェクトとして一から立ち上げる。
理由:
- 通しプレイの結果、偽スマホの手触り(演出)が骨組みのままでは「楽しいか」を判定できないと判明。演出を作り込む選択肢もあったが、検証の順番(体験を最後に回した)と設計プロセス(紙の確定が実物と突き合わされていない)の問題が根にあり、続けるより教訓を新企画に投じる方を選んだ。
- 教訓と持ち出し資産は
kidoku-mystery-ポストモーテム.mdに整理(体験の縦を最初に切る/紙の設計は実物と突き合わせるまで確定ではない/Codex監修は体験品質には効かない/意思決定を前倒しでまとめすぎない)。 - ScenarioKit(形式・リンター・エンジン・セーブ)は新企画がチャット/スマホ劇なら流用できる。
2026-08-18: 主人公=結衣(ゆい)/隠し要素は TRUE到達+もう1周
決定: 主人公の名前は**結衣(ゆい)**で固定。呼称は 夏希・菜帆=「結衣ちゃん」/蓮・静香・大悟=「結衣」(呼び捨て)。美月だけは終盤で明かす固定の特別な呼称を使うため未設定(=当面は名前呼び)。 隠し要素(美月視点の裏ログ全解禁)の解放条件は TRUE到達+もう1周 に振り替え。
理由:
- 呼び方を全員同じにすると関係が平板になる(Codex監修)。呼び捨てか「ちゃん」かは性別でなく過去からの距離で決めた。夏希の「結衣ちゃん」は反転後も変えない方針で、親しさが後から支配的に響く。
- 隠し要素は旧「男女両クリア」が女性固定で成立しなくなったための振り替え。全EN到達は重すぎ、TRUE到達だけでは即開放で周回動機にならない。TRUE到達+もう1周なら「真相を知った目で読み直す」動機とそのまま噛み合う。
2026-08-18: 主人公は女性固定・名前も固定(未決事項⑨の変更)
背景: GDD v0.2 では「開始時に男女2人から選択」「名前入力あり(下の名前+男女別デフォルト)」で確定していた。Day2 以降の執筆に入る前に、呼称と性別差分の実装をどう通すかを検討した段階で開け直した。
決定: 主人公は女性固定。名前も固定(プレイヤー入力なし)。性別差分プレースホルダ {pc.g:男|女} は形式から削除し、書いたらリンターがエラーにする。呼称は {pc.call} のキャラ別テーブルで一元管理する(PlayerCharacter)。
理由:
- 本作の主人公は「プレイヤーの器」ではなく人物。失踪前夜のSOSを既読無視した原罪、美月と2人だけの共有記憶(Day7の本人確定の証拠)、美月だけが使う固定の特別な呼称まで設計されている。器でない主人公に性別選択を載せると、美月との関係の温度を毎回書き分けることになる。
- 女性を選んだ決め手は夏希の反転。夏希の動機は独占欲と「美月が戻れば二番手に戻る恐怖」。主人公が男だと序盤の懐きが恋愛感情に読まれ、Day6の反転が嫉妬オチに矮小化される。同性なら依存と独占の話として届く。
- 大悟(美月に惚れて通話で圧力をかけた男)と主人公の役割が被らず、Day2の囮としての機能が保たれる。
- 実務: 選択式は台詞レビューと実機の通し確認が全部2倍になる。7日分を個人開発で回すには重い。
- 名前も固定にしたのは、呼称を機械生成(名前+接尾辞)せずに執筆で決められるようにするため。入力名から作ると「さくらちゃん」のように響きが破綻しうる。固定なら夏希の懐き方も美月の特別な呼称も自由に書ける。
- 偽スマホ系(A Normal Lost Phone / Simulacra)が主人公を無性別にできているのは主人公が「拾った第三者」だから。グループの一員である本作では使えない。
影響: 「男女両クリアで隠し要素(美月視点の裏ログ全解禁)」の解放条件は成立しなくなるので、別条件へ振り替えが必要(未決)。
2026-08-18: 分岐管理は「管理表」でなく「データ形式+リンター」で行う
背景: GDD のリスクメモに「チャット×マルチエンドは分岐地獄になりやすい。フローチャート管理をシナリオ執筆と同時に整備する」とあった。しかし人手のフローチャート/管理表は、7日×分岐×EN10 の規模では必ず実態とズレる。加えて Swift にハードコードした台本(DayOneScript.swift)は、シナリオを書き進めるほど破綻する。
決定: シナリオをノードグラフの JSON(scenario/*.json)に外出しし、専用リンター(ScenarioKit / scenario-lint)で機械検証する。管理表は作らない。iOS アプリとリンターは同じ Swift ローダーを共有し、スキーマの正典は実装(Parser.swift)に一本化する。アプリ実行時は loadValidated(エラー1件でも拒否)を使う。
理由: 分岐の破綻(孤児分岐・行き止まり・EN未到達・フラグのtypo・既読演出の順序違反)は、人間のレビューでは見落とすが機械なら確実に落とせる。管理表と違って実データそのものを検査するのでズレようがない。ローダーを共有することで「リンターは通るがアプリが読めない」も起きない。
副産物: 回帰テスト(swift test、フィクスチャ7種・8ケース)を入れた直後、画面解決の処理順が Set の反復順に依存して実行ごとに検査結果が変わる不具合が見つかった。テストがなければ「たまに通る」状態のまま気づけなかった。リンター自体もテストで守る方針とする。
2026-08-18: 偽スマホ内の画面遷移=スクリプト駆動(自由探索なし)
背景: 偽スマホ内アプリは「チャット+写真+電話」の3つと決めてあり、素材リストに「偽スマホホーム画面」もあったが、ホームに戻れるのか/アプリを自分で切り替えられるのかは未記録の穴だった。縦スライス①で作ったスクリプト形式も、暗黙に「戻れない」前提で組まれていた。
決定: 画面移動は次の2経路だけ。プレイヤーが任意のタイミングで自由に探索することはない。
- 自動遷移(話の流れ上そうなる): シーンがホームから始まる、着信で通話画面になる等。遷移先ノードの
surface宣言で表す。 - 選択肢による移動:
navigateアクション(home/chat/photos)。「Nagi を開く」「ホームに戻る」等。
理由: ①で「分岐地獄を管理表でなく機械検証で抑える」ところから再開した経緯があり、自由探索は「プレイヤーがどの順で何を見たか」が分岐条件に絡んでシナリオ管理とバリデータを一段複雑にする。スクリプト駆動なら縦スライスは軽い実装で通しつつ、後から自由探索へ広げる余地も残る。Simulacra / A Normal Lost Phone は自由探索型、Bury Me My Love / Lifeline はチャット単画面型で、どちらもiOSで実績があるため商業的な制約ではなく管理コストで選んだ。
実装: ScenarioKit に排他的な Presentation(home / chat(room) / photos / phone / call(callId))と navigate / dismiss アクション、写真アプリ用の showPhoto step を追加。
設計上の要点(Codex 監修で改めたもの):
- 画面は「どのルームを開いているか」まで含む。DM と グループを別画面として扱わないと、前景ルーム・送信先・セーブ復元が決まらないため。
- 省略時は直前ノードから継承(当初は「省略=chat 固定」だったが、home の次で書き忘れると黙ってチャットへ飛ぶ事故が起きるため変更)。先行ノードの画面が食い違う合流点は明示必須で、リンターが
surface-unresolvedで弾く。演出のない EN ノードは画面を問わない。 - 通話を切ったら着信前の画面に戻る(当初は「チャットUIへ戻る」と書いていたが、ホームや写真アプリで着信を受けた場合と矛盾する)。
- 写真アプリは出入りだけでなく
showPhotoを持つ(Day4 静香の証拠写真、Day5〜7 の物証提示に必要)。着信履歴はphone画面としてエンジンが自動描画する。
リンターの surface-mismatch が見るもの: navigate 先ノードの画面(ルーム含む)不一致 / 通話ノードへの navigate / プレイヤー送信系(choice の送信・既読、playerMessage、player の image・stamp)が chat 画面かつ前景ルームと一致するか / showPhoto が photos 画面か / chat でない choice の room。
あわせて確認したストア規約: 偽スマホUI自体は App Store 実績多数で問題なし。効くのは Guideline 5.2.5(Apple製品・インターフェースと紛らわしいアプリの禁止、Messages を明示的に例示)。偽スマホの外観を iOS そっくりにしないことが条件で、行き来の自由度は規約上の論点ではない。現行プロトタイプは自分の吹き出しが右寄せの青+SwiftUI 標準見た目で Messages に寄りすぎのため、配色の見直しが必要(LINE の緑を避けるのと同様に、Messages の青も避ける)。
2026-07-21: 実装=ネイティブ・iOS先行
決定: 実装はネイティブ。iOS先行(SwiftUI)で立ち上げ、Android(Jetpack Compose)は後続。既存VNエンジン(Ren'Py/Naninovel等)や自作ハーネスは採らない。
理由: 本作は立ち絵VNでなく「偽メッセージアプリ」型で、チャット/既読/通話/フローチャート分岐が既存VNエンジンと相性が悪い。実機の質感(本物のスマホアプリに見える)が体験の核なのでネイティブが適する。iOS先行は開発環境(macOS+iOSビルド/シミュレータ)が揃っており立ち上がりが速いため。
2026-07-21: 命名・進行UXの確定(④⑤⑥⑧⑨)
決定:
- ④ 作中チャットアプリ名=Nagi(凪)。
- ⑤ 製品タイトル(仮)=『太陽を既読にする』(リリース前に商標区分9/42・ストア名を実チェック)。
- ⑥ 苗字=木村蓮/森夏希/岡田静香/西野大悟/高橋菜帆/日野美月(美月のみ隠し味「日×月」。当初「日向」は目立ちすぎ・読み分けで「日野」に)。
- ⑧ 待ち時間=可変(章内連続+境界待ち、要所のみ現実時刻同期)。返信期限はアプリ内で選択肢を確認した時点起点。
- ⑨ 名前入力=あり(下の名前のみ+デフォルト)。呼称はキャラ別変数管理、美月の特別呼称は固定愛称で序盤非表示。
理由: タイトルはコアメカ「既読」×失踪者「太陽」の二重性で一意性とテーマ適合が最強(Codex 評価)。苗字は「平凡でリアル+美月だけ微かな仕掛け」方針。待ち/通知/名前入力は擬似リアルタイム没入と離脱抑制・理不尽回避・ストアポリシーを両立させる実装仕様に落とし込み。
2026-07-21: 企画設計の進め方=大枠は You / 細部は Codex
決定: kidoku-mystery の企画・設計の壁打ちは「大枠は You に確認、細部は Codex(codex exec)に監修を通して Claude が決める」で進める。Codex が大枠を揺るがす場合のみ You に戻す。
理由: You は細部レビューの負荷を負いたくない。Codex(GPT 5.6 Sol)をセカンドオピニオン監修者に、Claude を取りまとめ・決定役にする分業。
2026-07-21: 犯人=夏希、真相の背骨=美月の意思変化
決定: 犯人(嘘つき)=夏希で固定。真相の背骨=美月の意思が「探さないで(失踪時)」→「見つけてほしい(Day1)」に変化し、唯一連絡を握る夏希がその新真意を故意に握り潰す。美月は自発的失踪(生存ベース)。
理由: 「一番懐いてくる癒し役が犯人」の反転。犯人性を「失踪させた(過去)」でなく「生存を知りながら隠蔽・再会妨害(現在)」に置くことで、自発的失踪ともテーマ(見られなかった被害者の孤独)とも矛盾しない(Codex 5回監修で確定)。詳細は真相設計書。
2026-07-21: TRUE到達=方針A(1周目でも到達可能)
決定: TRUE END は1周目でも3条件(真相到達+"見る"姿勢一貫+Day7の正しい対話)充足で到達可能。周回動機は隠し裏ログ(美月視点)+全ENコンプ+2周目高速で担保し、TRUE自体は周回ゲートにしない。
理由: BADを「失敗」でなく「別の真実」として設計する方針と合わせ、初見の満足度を確保するため。
2026-07-21: 電話アプリは音声なし(A1)を堅持
決定: 電話アプリは音声・映像なし(A1)。本人確定は「ビデオ通話」でなくリアルタイム・テキストのチャレンジ(予測不能な即時課題+2人だけの共有記憶の二段構え)に置換。
理由: GDD当初の音声なし方針を維持。実写風の声/顔の制作コストを回避でき、既読=テキストの世界観とも一貫。②の本人確定設計と衝突しないよう置換した。
2026-07-21: 電話アプリを物語装置として追加する
背景: 偽スマホ内アプリの初期スコープは膨張リスク回避のため「チャット+写真」に限定していたが、物語中に電話要素(電話アプリ起動)を入れたい意向が出た。
決定: 偽スマホ内に電話アプリを追加し、チャットと並ぶ第2の物語装置とする。初期スコープを「チャット+写真+電話」に拡大。
理由: 既読メカニクス(読む/読まない)の電話版として「着信に出る/出ない」が選択肢化でき、大悟の「すぐ通話しよ」癖・「ログの空白」演出など既存設計の延長線上で機能するため。音声なし方針のままでも成立する。具体仕様(音声の有無・不在着信・着信履歴演出等)は未決事項⑩で別途詰める。
DEVLOG(作業ログ)
開発日誌
このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。
2026-08-19
Day2〜4執筆・セーブ永続化・プレイテストモード → 通しプレイの結果、プロジェクト凍結
やったこと
- Day2(commit
f2469fa): 大悟=囮の日。初の着信を夜の議論に割り込ませる形で実装。Codex監修3周(夏希のブレーキがDay6相当→弱める/BLOCK経路の補強/菜帆の時刻手掛かりを台詞でなくUIの時刻表示に)。リンターの call-shape バグ(通話中deadlineのtimeout辺を誤検出)も1件修正 - セーブ永続化(commit
4781b19):RunnerSnapshot(エンジン状態の丸ごと保存/復元)+SaveStore(表示ログと1ファイルに原子的書き込み)。「ログと位置が一致する基準点だけを保存」方式で台詞の欠落・重複を排除。Codex監修6周(初回保存が作られない・位置とログのズレ窓・背面での期限開始など実バグ4件を検出)。contentRevision巻き戻し・catch-up再生・期限の絶対時刻保存まで。SaveTests 8件追加、実機で強制終了/背面化/待ち明けを検証 - Day3(commit
f71b35f): 菜帆ピーク。朝の姿勢(B5)で昼の打ち明け話が3段階に変わる(聞く=高崎まで/黙る=場所伏せ/読まない=DMが来ない)。B6=旧端末の復元開始。監修3周(「脚本が菜帆は別件と保証している」等の構造指摘→全面改稿) - Day4(commit
da9f298): 静香の写真(showPhoto初使用)+復元された通話履歴(美月→大悟5回)。写真は「静香が今夜自分から出す」を待つ/先に出すの選択に。監修3周(発車標では場所の証明にならない→駅名標+画像情報に分離、ほか) - プレイテストモード(commit
ee088b4): DEBUG限定。速度3段階(実時間/待ちなし/早送り)・章ジャンプ(ビート方針で自動プレイ)・状態パネル(ビート/フラグ一覧) - テスト設計を2回変更: 総当たり→スナップショット探索(Day3)→seed固定サンプリング120周(Day4で2万分岐超え)。33件・1.2秒
起きたこと → 凍結決定
- You が通しプレイ。「プレイ環境がチープで、これが楽しんでもらえるとは到底思えない」。演出(アプリ切替・起動・メッセージ着信・通知・着信)を作り込んでから確認すべきだったという判断
- 直後の「既読ってグループチャットに存在する概念?」の一問で、コアメカニクスの可視性仕様(誰の既読か見えるのか)が曖昧なまま4日分書いていたことが露呈(Day2監修でCodexが指摘済み・先送りしていた)
- 演出パス案(A チャットの生々しさ → B 通知と夜 → C アプリ起動 → D 着信)まで出したが、You の判断でプロジェクト凍結。反省を糧に別企画(サスペンス)を新規に立ち上げる
- 振り返りは
kidoku-mystery-ポストモーテム.md。教訓の核: 「体験の縦」を最初に切る(このジャンルはUIの手触りが商品。システムの縦スライスでは楽しさを検証できない)
凍結時の状態
- Day1〜4 執筆済み(123ノード・選択の組み合わせ約50万)。Day5〜7 未執筆、EN未到達
scenario-lintエラー0 /swift test33件成功 / iOS ビルド成功 / main は origin と同期
2026-08-18
17:25 - 縦スライス②③完了、主人公を女性固定「結衣」に確定
やったこと
- 縦スライス② エンジン拡張(commit
ae4899b)ScenarioKit/Sources/ScenarioKit/Runtime.swiftに ScenarioRunner を新設。ノードグラフを歩きchoice/call/suspend/endingで停止するプル型エンジン。タイマーを持たず絶対時刻を返すだけにしたので、進行ロジックを時間なしで検証できる- 条件式の評価をリンター(fixtures)と実行エンジンで共有し、形式の解釈を一本化
- iOS を
DayOneScript.swift(ハードコード台本)から バンドルしたscenario/*.jsonをloadValidatedで読む構成へ置換。未執筆の日への handoff は DEBUG ビルドのみ許可 - 自動既読(送信1.25秒後)を廃止。既読は
markReadstep を書いた場所でだけ付く - 偽スマホの5画面(chat / home / photos / phone / call)を実装。画面遷移・着信履歴・返信期限・章境界の待ち(開発用スキップ付き)まで動作
- 吹き出し配色を Messages から離した(深緑+紙色・角を1つ落とした吹き出し。Guideline 5.2.5 対策)
- 選択肢を作中アプリのUIに見えないようフローティングカードに変更(You 指摘)
- 縦スライス③ Day1シナリオのドラフト(commit
f7c486f〜811a667)- 4場面構成: 一年前の既読無視(プロローグ)→ 深夜0:17にアカウントが動く → 朝の仕切り直しと七日後の約束 → 主人公にだけ届く個別DM
- ビート B1(深夜)B2(朝のDM)を全経路ちょうど1回で配置
scenario-lint --transcriptを実装(JSON から読める台本を書き出す。FORMAT.md に「後付け予定」とあったもの)- 台本を Artifact で提示し、You が6点とも OK 判断
- 主人公の設計を変更(未決事項⑨を開け直し)。女性固定・名前も固定=結衣(ゆい)。隠し要素は「TRUE到達+もう1周」に振り替え
{pc.name}/{pc.call}の解決を実装(TextResolver)。性別差分{pc.g:男|女}は形式から削除し、書いたらリンターがエラーにする
- 回帰テストを 8件 → 25件に(実行エンジン12件・プレースホルダ3件・リンター10件)
決めたこと(DECISIONS.md 参照)
- グループ名=天体観測(「見る/見られる」がコアメカニクスなので名前と骨が一致する。検討過程で「たいようけい」を挟んだがグループ名らしさに欠けた)
- 主人公=女性固定・名前も固定(結衣)。隠し要素の解放は TRUE到達+もう1周
詰まったこと / 気づき
- 本番シナリオに密着したテストは書いた翌日に壊れる。Day1 を書き直した瞬間に5件が落ちた。台詞を検証するのをやめ、「選択肢を総当たりで踏破して全経路が終端に届く」「全経路でビートがちょうど1回」「既読は markRead 経路のみ」を固定する形に書き換えたら、以後の台本変更で壊れなくなった
- 実機で回すと形式の穴が出る。DMを開いたら「今」のメッセージが1年前のログより上に出た(過去ログを開いた時点で積んでいたため)。プロローグとして冒頭に置く構成に変えて解決。リンターは通っていたので、通し確認でしか見つからない類だった
- 真相設計との食い違いを2件発見。①
characters.jsonに高橋菜帆が欠落(①の変換時に落ちていた)②Day1 の美月が会話に応答していた(設計は「曖昧な一方向シグナルのみ・ライブ会話しない」=夏希の生存独占が崩れないため)。七日後の提案を蓮に移して修正 - Codex が1時間49分ハングした。長いプロンプトを
codex exec "$(cat ...)"と引数で渡したのが原因。stdin(- < file)なら通る。CPU時間0.14秒のまま無言で待ち続けるので気づきにくい - Codex 監修で、女性固定の決め手にしていた理由(同性なら恋愛のもつれに見えない)を半分否定された。結論は変わらないが、解釈を左右するのは性別より演出という指摘に沿って Day1 に1行追加(夏希「全部見ようとしなくていいよ。わたしが見とくから」=2周目に探索を止める誘導として反転する)
次回やること
- Day2 の執筆。設計上は大悟=囮の日で、初の着信(エンジン実装済み・未使用)が入り、菜帆ピークへの前振りが乗る
- セーブの永続化(今はアプリを閉じると最初から。待ちもアプリ起動中しか進まない=「7日間かけて遊ぶ」体験が未検証)
2026-08-18
14:00 - 縦スライス① 完了(シナリオJSON化+バリデータ)と画面遷移の確定
やったこと
- 縦スライス①「シナリオスクリプト形式+バリデータ」を完了(commit
80dc4a1、65ファイル・約5,000行)scenario/FORMAT.md: スクリプト形式 v1 の仕様。ノードグラフ(終端はnext/choice/branch/call/ending/handoff/suspendのちょうど1つ)、宣言制の状態レジストリ(フラグ/enum/ビート)、V1〜V4 ゲート変数の表現、deadline・suspend・セーブ再開のコミットポイント制まで確定ScenarioKit/: Swift パッケージ。Parser(スキーマ正典・未知フィールド拒否)/Validator(CFG+支配解析)/FixtureRunner(Day7判定表の表駆動テスト)/scenario-lintCLIscenario/*.json: レジストリ6種+ day1(DayOneScript.swiftのプロローグを変換)
- 偽スマホの画面遷移を確定(未記録の穴だった。DECISIONS 参照)。
Presentation(home / chat(room) / photos / phone / call)、navigate・dismissアクション、写真アプリ用showPhotostep を追加 - 回帰テストを恒久化:
Tests/ScenarioKitTests/にフィクスチャ7種+XCTest 8件。正常系はエラー0、壊したパッケージは狙ったコードで検出、を固定 - iOSプロトタイプを実機シミュレータで起動して動作確認(プロローグ一本+選択肢+既読表示まで通ることを確認)
- 現在地把握用の制作ボード(Artifact)を作成
決めたこと(DECISIONS.md 参照)
- 分岐管理は管理表でなくデータ形式+リンターで行う。スキーマの正典は実装に一本化
- 偽スマホ内の画面移動は「自動遷移」と「選択肢」の2経路のみ。自由探索はしない
詰まったこと / 気づき
- リンター自身のバグをテストが掘り当てた: 画面解決のトポロジカル順が
Setの反復順に依存し、さらに演出stepのないENノードへ候補集合から任意の1つを割り当てていたため、同じデータでも実行ごとに検査結果が変わっていた(エラー3件/4件が揺れる)。順序を安定化し、ENノードには画面を持たせない形に修正。10回連続実行で一致を確認 - ストア規約の論点は「行き来の自由度」ではなく「見た目」: 偽スマホUI自体は App Store に実績多数(Simulacra / A Normal Lost Phone 等)。効くのは Guideline 5.2.5(Apple製品・Messages と紛らわしいUIの禁止)。現行プロトタイプの吹き出しが右寄せの青+SwiftUI標準で Messages に寄りすぎており、配色変更が必要
- 製品タイトル『太陽を既読にする』は全記録で (仮) 付き。商標(区分9/42)とストア名の実チェックが未了
- Codex 監修は形式に6周、画面遷移に4周。特に「写真アプリで証拠を出せない」「チャットのどのルームを開いているか決まらない」の2件は、Day4以降を書き始めてから気づいたら手戻りが大きい類の指摘だった
次回やること
- ② エンジン拡張:
ChatViewModelをDayOneScript.swift直参照から ScenarioKit 駆動(loadValidated)へ置換。自動既読(送信1.25秒後)を廃止しmarkReadによるスクリプト制御にする - あわせて吹き出し配色を Messages から離す
- その後 ③ Day1シナリオのドラフト(Claude が書き、You は OK/NG のみ)
2026-07-21
命名・進行UX(④⑤⑥⑧⑨)確定 → 未決事項①〜⑩ 一巡完了
やったこと
- Codex 監修を通して命名・UX を確定(大枠は You、細部は Codex):
- ④ 作中チャットアプリ名=Nagi(凪)(中立・実在アプリ風、LINE距離・緑/吹き出し回避)。対抗 Miru。
- ⑤ 製品タイトル(仮)=『太陽を既読にする』(太陽=美月×既読×「人を読む/見つける」の二重性、真相判明で反転)。次点『七日間の既読』。※リリース前に商標(9/42)・ストア名の実チェック。
- ⑥ 苗字=木村蓮/森夏希/岡田静香/西野大悟/高橋菜帆/日野美月(美月だけ隠し味「日×月」)。当初案「日向」は目立ちすぎ&読み分けで「日野」に。
- ⑧ 待ち時間=可変(章内連続+境界待ち、要所のみ現実時刻同期)。返信期限は「アプリ内で選択肢を確認した時点」起点で理不尽回避。通知は同意/静音/作中通知明示/催促1回。サーバーレスの端末時計仕様(TZ/夏時間/再起動/再計算)を明文化。買い切り/2周目は演出時刻のみ深夜で即時進行。
- ⑨ 名前入力=あり(下の名前のみ+デフォルト)。呼称はキャラ別変数(通常/親密/あだ名/美月専用)。美月の特別呼称は固定愛称で序盤に出さない(本人確定の先食い回避)。
- GDD を更新(タイトル・アプリ名・苗字・進行UX節・未決事項の全✅化)、真相設計書に美月専用呼称の注記を追加。
次回やること
- シナリオ執筆+フローチャート管理の整備、素材洗い出し、実装エンジン/フレームワークの選定と検証。
- ④⑤⑥⑧⑨ 分の commit(未実施)。
6人目確定〜真相・秘密・電話・EN の一括確定(Codex監修ループ)
やったこと
- 進め方を確立: 大枠は You 確認 / 細部は Codex(
codex exec, gpt-5.6-sol)に監修を通して Claude が決定。Codex が「OK」明言するまで改訂を反復。 - 未決事項①: 6人目=美月(みつき・女) 確定(聞き役/鏡のキャラ性、Day7=対面の集まり、主人公の既読無視の負い目)。
- 未決事項②(真相と犯人): Codex 5回監修でOK。犯人=夏希。背骨=美月の意思が「探さないで→見つけてほしい」に変化し、夏希がその新真意を故意に握り潰す。証拠経路(美月旧端末の段階復元)・本人確定(二段構え)・テーマ着地まで確定。
- 未決事項③(秘密+癖崩れ): Codex 2回でOK。各キャラの秘密と癖が崩れる瞬間を【真/偽/情】タグで設計、7日配置まで。作中アプリを「送信取消可能時間」仕様に(未読が証拠を守る機構)。
- 未決事項⑩(電話アプリ): Codex 2回でOK。音声なし(A1)+着信出る/出ない選択肢化+要所限定。本人確定はリアルタイム・テキストチャレンジに置換。
- 未決事項⑦(EN): Codex 3回でOK。全10+隠し、TRUE解放は方針A(1周目可能)、排他的優先判定表でルーティングの未定義域を解消。
- 記録: 真相核心を
kidoku-mystery-真相設計.md(ネタバレ)に分離新設。GDD を v0.2 に更新(6人目・電話・未決事項の確定反映+ネタバレ文書へのポインタ)。
決めたこと(DECISIONS.md 参照)
- 犯人=夏希 / TRUE到達=方針A / 電話=音声なしA1 / 進め方=大枠You・細部Codex。
次回やること
- 残る未決 ④作中アプリ名 ⑤製品タイトル ⑥苗字 ⑧待ち時間・通知 ⑨名前入力。命名系(④⑤⑥)はまとめて壁打ち向き。
- コミット&push は未実施(You の指示待ち)。
07:35 - 企画引き継ぎ・電話アプリ追加・6人目の壁打ち再開
やったこと
kidoku-mystery引き継ぎ.md(GDD v0.1)を読み込み、企画の現在地を引き継ぎ- 電話アプリ要素をGDDに反映(3か所: キャラクター節に追加確定として記載/未決事項⑩を新設/初期スコープを「チャット+写真+電話」に更新)
- 未決事項①「6人目の性別・名前・人物詳細」の壁打ちを再開し、叩き台を提示(回答待ち)
- 性別=女性案を支持(動機を5人に均等配分できる・主人公性別選択と噛み合う)
- 名前は美月を推奨(「太陽と呼ばれた子が月」=相手ごとに求める顔を映す鏡→5人の証言食い違いが必然になる)
- 人物像案: グループ全員の秘密を握る聞き役/主人公は失踪前夜の最後のDMを既読無視していた負い目を持つ
- Day7時限の正体案: 失踪1年の節目に5人が対面で集まる約束
決めたこと
- 電話アプリを物語装置として追加する(DECISIONS.md 参照)
次回やること
- 6人目の4確認点(性別確定/名前/聞き役コンセプト+既読無視の負い目/Day7=対面の集まり)への回答を受けて確定
- 確定後、未決事項②「真相と犯人」の設計へ
最近のコミット
- b272fce プロジェクトを凍結し、ポストモーテムを残す 2026/8/19
- ee088b4 プレイテストモードを入れ、通しで触れるようにする 2026/8/18
- da9f298 Day4の台本を執筆し、静香の写真と旧端末の復元を同じ日に置く 2026/8/18
- f71b35f Day3の台本を執筆し、朝の姿勢で昼の打ち明け話が変わるようにする 2026/8/18
- 4781b19 セーブを永続化し、アプリを閉じても待ちが実時間で進むようにする 2026/8/18
- f2469fa Day2の台本を執筆し、初の着信をシナリオで通す 2026/8/18
- ec12365 .devnotes を更新(縦スライス②③完了・主人公を女性固定「結衣」に確定) 2026/8/18
- 811a667 主人公を「結衣」に確定し、隠し要素の解放条件を振り替え 2026/8/18
- d8b68c2 Codex監修を反映: 夏希の懐きに「見なくていい」誘導を仕込む 2026/8/18
- ff91681 主人公を女性固定・名前も固定にし、呼称テーブルを実装 2026/8/18
README
kidoku-mystery(既読ミステリー)
概要
(記入予定)
セットアップ
(記入予定)
使い方
(記入予定)