sumaho-suspense
WIP(現在進行中)
Work In Progress
このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。
現在の状況
(2026-08-23 18:12 時点)
- 枠を再構築した(ユーザー主導のちゃぶ台返し。詳細は DECISIONS.md の 2026-08-23 分4件): 「同じスマホが渡り歩く」は廃止。枠=誰もが使うAIアシスタント「Chappy」+他人のセッションが混ざる混線バグ。真相=バグの発生源はアカリ(0番目の持ち主)の閉じられなかったセッション——「バグだと思っていたものが、人だった」。分離アーキテクチャ: 混線はChappy内だけ/中のアカリ(呼称を「残滓」から変更)の縄張りはChappy画面内のみ/各話の奇妙は各話固有の原因/チャットアプリは人間レイヤーとして純粋に保つ
- 0番目の話が確定: アカリ(仮名・女性・20代半ば)は既読が怖くてChappyにだけ話す人。幼馴染ユウ(仮名)への下書き「明日、決行でいいんだよね?」(決行=二人の冒険の合言葉)を送れないまま、約束の給水塔で3:12に転落死。8話でユウに届き、唯一の一択選択肢「うん。決行しよう」で既読が救いに反転する
- 1話「決行」構成確定(v3): Chappyに混ざる他人の独白→リアルタイム更新「……見てるんでしょ」→止めようとする夜→検索→1年前・3:12の転落死記事→「……きてくれると、思った」。種=決行/3:12/給水塔写真/Chappy「おかえりなさい」/記事そのもの
- 2話は未確定のままシナリオ議論をリセット: 9案以上検討して難航(変遷と敗因診断は DEVLOG 2026-08-23 参照)。最終提案3本(明日の予定改・うしろの人・同じ夢)は判定待ちのまま保留。ボツ案は有料圏ストックとして温存: 自分からのメッセージ型/あと30日/ハルと19:00/観察日記/知らない通夜/もうひとり/見てるよ ほか
- シナリオ設計原則が確立(DECISIONS 2026-08-23): あるある基準(体感で知ってる現象)/安心仮説の供給源ローテーション/入口は現実・芯はありえない・着地は冷たいか切ない/オチは状況を変える/提案は実装済み語彙縛り/不条理枠は1〜2本まで
- 次にやること: ① 2話の題材選定の仕切り直し ② 1話「決行」の詳細プロット→ビートデータ化 ③(実装残)ファイルミニアプリ
- 運用ルール: 実機への反映はユーザーが明示したときだけ。通常反復はシミュレータのみ
- 未決: 2話の題材、1話主人公の設定(性別含む)、アカリ/ユウの本名、話売りの価格、製品タイトル、本番素材。ビートは線形専用、セーブは未実装
過去のWIPアーカイブ
(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)
2026-08-22 05:46 時点のスナップショット
- シナリオ超大枠が確定(コード変更なしのストーリー会議。詳細は DECISIONS.md の 2026-08-22 分5件): オムニバス全8話(1話30〜40分)×世にも奇妙式のオチ。縦糸は回収型で、枠=「どの話も同じスマホ+控えめなChappy」、真相=「中に、いる」(Chappyに最初の持ち主=故人の残滓が棲み、各話の奇妙はそれが何かを探した痕跡。8話目=0番目の話の回収回)。2話まで無料+3話以降は話売り課金で、2話ラストに枠がはじめて不穏になる種を置く。1話「決行」(誤爆型・チャット主役)/2話「明日の予定」(当たるカレンダー型)。ミカゲ団地は却下
- 伏線の運用方針: 三層(話内/話間/枠)。鉄則=初見ではその話の中で意味が完結して見えるものだけを伏線として許可。執筆開始時に伏線台帳をリポジトリに作る
- 新語彙の予定: 作中時間スキップ(シナリオ許可制・プレイヤー操作型。2話で本格使用。語彙確立後の「裏切り」——スキップしても時計が進まない等——が本命)
- 次にやること: ① 0番目の話(最初の持ち主に何があったか)を粗く決める→1話に蒔く種の原本 ② 1話「決行」の詳細プロット(主人公の設定・性別含む)③(実装残)ファイルミニアプリ(
GameFileモデル+ブラウザ「保存」→ファイルに出現。語彙は先行定義済み) - 運用ルール: 実機への反映はユーザーが明示したときだけ。通常反復はシミュレータのみ
- 未決: 1話目主人公の性別、話売りの価格、製品タイトル、本番素材(音声=TTS仮・画像=ffmpeg仮)。ビートは線形専用(分岐が要る時はモデル拡張)、セーブは未実装(beat ID+完了ID集合を保存する方針だけ既定)
2026-08-21 23:55 時点のスナップショット
- 動くミニアプリが5つに: チャット/Golgol/QuickNews/カレンダーに加えて⑤AIチャット「Chappy」(ChatGPTパロディ。キーワードクエスト式——正解で核心回答、外れは中身のない回答巡回+偽「検索しています……」演出)
- 共有ストア+軽量ビートエンジンが稼働:
Game/のGameStore(@Observable)がクエスト4種・会話・バッジ・通知バナー・ディープリンクを一元管理。ビューは生イベントを報告→ストアが完了導出→ビート(トリガー+アクション列の直列データ)が進む。エンジン単体テスト8件つき。サンプル章はゲーティング連鎖(検索→ニュース→Chappy→通知+予定→章終端)になり、未解放アプリは心の声ブロック - 設計プロセスの型ができた: プランモード設計→
codex exec(read-only)で設計レビュー→致命的・重大指摘を反映→実装→単体テスト→シミュレータ通しプレイ。通しの自動検証は AXe CLI の座標タップスクリプトが確実(通知バナーの6.5秒ウィンドウはMCP往復では逃す) - 次にやること: ① ファイルミニアプリ(
GameFileモデル+ブラウザ「保存」→ファイルに出現。AppID.files・.fileSavedの語彙は先行定義済み。パスワード付きファイル等のシナリオデバイス構想あり)② 体験モック: 「ミカゲ団地」章を2〜3分に整えて怖さ判定 - 運用ルール: 実機への反映はユーザーが明示したときだけ。通常反復はシミュレータのみ
- 未決: 第1シーンの題材(ミカゲ団地の延長が有力)、製品タイトル、本番素材(音声=TTS仮・画像=ffmpeg仮。必要になったら Codex に振るか相談)。ビートは線形専用(分岐が要る時はモデル拡張)、セーブは未実装(beat ID+完了ID集合を保存する方針だけ既定)
2026-08-21 21:46 時点のスナップショット
- 動くミニアプリが4つに: ①チャット(テキスト/ボイス/画像/入力中インジケータ/
ReplyTimingによるタイミング設定)②ブラウザ「Golgol」(検索クエスト。検索ボックスはゲーム唯一の自由入力欄)③ニュース「QuickNews」(読了クエスト。固定記事リスト)④カレンダー(身に覚えのない予定クエスト) - 汎用語彙: 心の声(起動ブロック+アプリ内操作ブロック。連打で台詞変化)/偽通知バナー+アイコンバッジ(タップで該当アプリの該当画面に直行)/バッテリー実残量同期(
fakeLevelで偽装可) - クエスト共通パターンが確立: SearchQuest・NewsQuest・CalendarQuest はいずれも「差し込み+完了フラグ+心の声」。シナリオエンジンはこの3種+ReplyChoice+通知発火を出し入れする形になる見通し
- サンプル物語が4アプリ横断で貫通: 姉ちゃんの写真「ねえ、これ誰?」→ Golgol検索→ミカゲ団地の転落死記事→ QuickNews続報→カレンダーに「迎えに行く 23:00」。体験モックの素材はほぼこの延長で作れる
- 次にやること: ① シナリオデータ分離/簡易エンジン(クエスト出し入れ・通知発火・ReplyChoice のデータ駆動化。現状は各アプリにサンプルをハードコード)② 体験モック: 2〜3分の1シーンを通しで組んで「怖いか」判定
- 運用ルール: 実機への反映はユーザーが明示したときだけ。通常反復はシミュレータのみ
- 未決: 第1シーンの題材(ミカゲ団地の延長が有力)、製品タイトル、本番素材(音声=TTS仮・画像=ffmpeg仮。必要になったら Codex に振るか相談)、ScenarioKit 流用判断
2026-08-21 17:53 時点のスナップショット
- 土台完成(iOS ネイティブ / SwiftUI):
ios/に xcodegen 構成。偽スマホのホーム画面(偽ステータスバー・偽ホームインジケータ・深夜風壁紙)が動く。シミュレータ反復 + 実機(iPhone 14)確認フロー確立済み - 演出語彙の実装済み分:
- 心の声(起動ブロック): アプリ起動を明朝体の独白が妨げる。テンポ調整済み
- 選択肢返信→既読→返答: チャットで自由入力不可、選択肢を選ぶと自分の吹き出し→1秒後に既読→相手の返答。既読の瞬間はここに内包
- チャットアプリ: 「メッセージ」とは別の架空アプリとして実装。一覧+会話画面、青系吹き出し、選択肢UIは無彩色フラット+バネ付き出現で You の OK 済み
- ホーム復帰: フローティングホームボタン(下部中央固定)で確定。下端スワイプは OS と衝突するため不採用
- 次にやること: ① 語彙追加(「入力中…」インジケータ/深夜のロック画面に通知が落ちる)② 選択肢→返答のシナリオデータ分離(
ReplyChoiceハードコード解消)③ 語彙が揃ったら2〜3分の1シーンを組んで「怖いか」判定 - 運用ルール: 実機への反映はユーザーが明示したときだけ。通常反復はシミュレータのみ
- 未決: 第1シーンの題材、製品タイトル、ScenarioKit 流用判断
2026-08-19 10:13 時点のスナップショット(立ち上げ直後)
- 企画: スマホサスペンス——アプリの中のスマホ(主にチャットアプリ)だけで完結するサスペンス(ちょっとホラー)。このジャンル自体を作りにいく
- 生産方式(最重要の合意): 演出語彙のレゴ方式。有限個の「演出パターン」をひとつずつ商品レベルまで磨き(You が OK/NG)、シナリオはその語彙だけで書けるデータにして AI で量産する。語彙が先、シナリオが後
- 前史: kidoku-mystery(凍結)の反省から生まれた企画。教訓は
~/cdev/kidoku-mystery/kidoku-mystery-ポストモーテム.md——筆頭は「体験の縦を最初に切る」 - 次にやること = 体験モック: 語彙3〜4個(案: 深夜のロック画面に通知が落ちる/チャットを開く/入力中…→吹き出し/既読の瞬間)を磨いて、2〜3分の1シーンを組み、You が「怖いか」を判定する。ここがこの企画の生死判定
- kidoku からの持ち出し候補: ScenarioKit(宣言的シナリオ+リンター+エンジン+セーブ)の骨格、Codex 監修ループ運用(長いプロンプトは stdin)、プレイテストモードの設計。ただしモック段階ではエンジンを持ち込まない(書き捨てでいい。教訓1の実践)
- 未決: 語彙 v1 の中身、第1シーンの題材、技術スタック(iOS ネイティブ継続かどうかも含めて白紙から選び直してよい)
ROADMAP(計画)
ロードマップ
今週
- 演出語彙 v1 の候補を決める → 実装で先行消化(2026-08-21 時点で語彙8種: 心の声起動ブロック/選択肢返信→既読→返答/ボイス/入力中/画像/検索クエスト/読了クエスト/通知バナー+身に覚えのない予定)
- 語彙追加: 「入力中…」インジケータ(2026-08-21 完了。ReplyTiming で選択肢ごとにタイミング設定可)
- 語彙追加: 通知が落ちる演出 → ホーム/アプリ上の偽通知バナー+バッジとして実装(2026-08-21 完了。ロック画面版はロック画面自体が未実装のため「いつか」へ)
- 体験モック: 語彙を磨いて2〜3分の1シーンを組む → You が「怖いか」を判定(この企画の生死判定。素材は1話「決行」の序盤を使う。ミカゲ団地は 2026-08-22 に却下)
- ファイルミニアプリ:
GameFileモデル+ブラウザ「ページを保存」→ファイルに出現(AppID.files・.fileSavedの語彙は 2026-08-21 に先行定義済み。パスワード付きファイル・最近削除した項目などのシナリオデバイス構想あり) - 0番目の話(最初の持ち主に何があったか)を粗く決める → アカリの物語として確定(2026-08-23。詳細は DECISIONS.md)
- 1話「決行」の詳細プロット(主人公の設定・性別含む。構成v3は 2026-08-23 確定済み)(2026-08-22 追加)
- 2話の題材選定の仕切り直し(2026-08-23 リセット。候補ストックは WIP.md 参照)
今月
- 第1シーンの題材の確定 → シナリオ超大枠ごと確定(2026-08-22。オムニバス全8話・回収型縦糸・1話「決行」/2話「明日の予定」。詳細は DECISIONS.md)
- モック合格なら: 一行コンセプトの確定、語彙の拡張計画
- 新語彙「作中時間スキップ」の実装(シナリオ許可制・プレイヤー操作型。使用話は2話リセットに伴い未定)(2026-08-22 追加、2026-08-23 更新)
- 伏線台帳の整備(シナリオ執筆開始と同時にリポジトリへ)(2026-08-22 追加)
- 技術スタックの確定(iOS ネイティブ(SwiftUI)先行、Android は安定後に移植。2026-08-19 決定)
- シナリオデータ分離/簡易エンジン → GameStore+ビートエンジンとして実装(2026-08-21 完了。クエスト4種=Search/News/Calendar/Ai の出し入れ・通知発火・ゲーティング連鎖をデータ駆動化。ReplyChoice の完全データ駆動化=
.appendChatMessagesでの会話継続は語彙のみ用意、実戦投入はシナリオ執筆時) - ScenarioKit 流用の判断 → 流用しない(2026-08-21 決定。チャット特化構造が合わず軽量新造。詳細は DECISIONS.md)
今四半期
- 語彙が揃った範囲で1話「決行」を通しで遊べる形に(2026-08-22 に「最初の章」を具体化)
いつか
- 製品タイトルの検討(リポジトリ名とは別。商標・ストア名チェックは kidoku の未了タスクも参照)
- kidoku-mystery の解凍判断(スマホサスペンスの語彙・知見が育ってから戻る手もある)
- ロック画面の実装+深夜のロック画面に通知が落ちる演出(通知バナー自体は実装済み)
- 本番素材への差し替え: ボイス(現状 TTS 仮)・不気味な写真(現状 ffmpeg 仮)・ニュースサムネ画像。必要になったら Codex に振るか相談
- カレンダーの追加演出ネタ: 過去の日付が語る/カウントダウン/消しても復活する繰り返し予定
- 話売り課金(IAP。2話まで無料+3話以降1話ずつ購入。価格未定)の実装 — リリース前に必須(2026-08-22 追加)
- 収集要素(枠関連の隠し小ネタのスタンプ帳)— ローンチ後の拡張第1弾候補(2026-08-22 追加)
- 演出の早送り(クリア済みの話でだけ解放する案)— やりこみ・読み返し用(2026-08-22 メモ)
DECISIONS(意思決定)
意思決定記録
このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。
2026-08-23: 枠の再構築=「同じスマホ」を廃止し「Chappy+混線バグ」へ。分離アーキテクチャを採る
背景: 「同じスマホ(ハード)が持ち主を渡り歩く」枠は、中古端末は初期化される現実と矛盾し、あるある基準に最も違反していた。中のアカリの乗り物も未定義で、干渉能力も万能すぎた(ユーザー主導のちゃぶ台返し)。
決定: 枠の乗り物をハードからサービスへ変更。Chappyは誰もが使う有名AIアシスタントで、各話の主人公は自分のスマホ・自分の壁紙、共通なのは全員Chappyユーザーなことだけ。ユーザー提案の「他人のコンテキストがごっちゃになる混線バグ」を採用(現実のChatGPT他人履歴表示障害と同型)。真相=バグの発生源はアカリの「閉じられなかったセッション」で、8話でユウが返事をするとバグ報告が止む。さらに分離を徹底: ①混線バグはChappyの中だけで起きる ②中のアカリの縄張りはChappyの画面内のみ(チャット・カレンダー等に一切干渉できない)③各話の奇妙は各話固有の原因でよい(混線を使わない話があっていい)④チャットアプリは人間の生活レイヤーとして純粋に保つ。チャットアプリとChappyを同一企業エコシステムにする案・選択肢返信=AI返信候補とする案は検討の末に却下。
理由: 「みんな同じAIを使ってる」は現実そのもので、あるある基準に完全適合する。エコシステム結合は世界を仕掛けの都合で設計する動きでご都合主義に見え、全話をAI経由にすると1話目から真相が読める。分離により怪異の檻が最小・明確になり(万能問題の解)、「バグだと思っていたものが、人だった」という8話の反転と「セッションを閉じる=成仏」のメタファーが手に入る。
2026-08-23: 0番目の話=アカリの物語(a×c融合)を確定
背景: 伏線の種を蒔くには原本(8話で明かされる最初の持ち主の物語)が先に要る。検討3案(届かなかった一通/死の理由探し/Chappyしか話し相手がいなかった)から。
決定: a×c融合。アカリ(仮名・女性・20代半ば)は既読が怖くて人にメッセージを送れず、既読の概念がないChappyにだけ毎晩話しかけていた。宛先=幼馴染ユウ(仮名)。「決行」は子供時代の秘密の冒険の合言葉。最後の夜、下書き「明日、決行でいいんだよね?」を送れないまま、二人の約束の場所(町外れの給水塔)で3:12に転落死(事故か自死かは作中で断定しない)。中のアカリ(「残滓」から改称。以後この呼び名で統一)が探すのは「宛先」と「返事をしてくれる誰か」。8話=ユウにたどり着き、下書きが送信され、全編で唯一選択肢が1つだけの返信「うん。決行しよう」——不穏の記号だった既読が救いに反転して終わる。種の在庫: 決行/3:12/「迎えに行く」/Chappyの一言(各話最大1箇所)/給水塔の写真/名前。
理由: 「Chappy控えめ」の決定と最も整合し(寡黙なのは棲まれているから)、1話の「決行」の意味反転(怖い言葉→切ない言葉)が成立する。名前は仮のまま進め、製品タイトル決定時に本決めする。
2026-08-23: 1話「決行」の構成確定(v3)
背景: 枠の再構築に伴い、1話の入口を2度作り直した(中古端末→番号再利用→誤爆→Chappy内混線)。
決定: 入口=深夜、Chappyに自分のではないセッションが混ざっている(噂の混線バグが安心仮説)。誰かがAIに毎晩こぼしていた一方通行の独白——「明日、決行でいいんだよね?」。チャットアプリは友達へのスクショ相談という人間レイヤーで使う(既読・入力中・画像はここで生きる)。転換点=混ざった履歴がリアルタイムで更新される「……見てるんでしょ」(表示されるだけならバグ、今増えるのはバグじゃない)。「明日決行する誰か」を止めようとする夜→Golgol検索→記事: 転落死、1年前、彼女のメッセージは全部3:12。トークは消え、最後の通知「……きてくれると、思った」。種: 決行/3:12/給水塔の写真/Chappy「はい。——おかえりなさい」/この記事自体が8話でユウと読み直すアカリの記事。
理由: 1話をアカリ本人の再演に当てることで「アカリで開いてアカリで閉じる」円環になる。1話単体でも「過去との混線」の怪談として完結し鉄則を守る。
2026-08-23: シナリオ設計原則群(2話検討の試行錯誤から確立)
背景: 2話の題材を9案以上検討する過程で、ユーザー判定(採用/却下)の積み重ねから設計原則が抽出された。
決定:
- あるある基準: 奇妙の入口は「技術的に実在する」ではなく「プレイヤーが体感で知っている現象」を使う(電話番号の再利用は×、誤爆・ブロック・エゴサは○)
- 安心仮説のローテーション: 「安心仮説を張ってから崩す」は全話共通の公式だが、供給源は毎回変える(時事ネタ+ニュース記事の常設はワンパターン化する。自分の一言・友人の一言で済む話を優先)
- 話の型: 入口は現実、芯はありえない、着地は冷たいか切ない。超常を抜いた社会派リアリズムに寄せると「弱い」判定になる(捏造スクショ・なりすまし・拡散希望の実例)
- オチの基準: 「気づき」で終わらせず、気づいた後に状況が変わる(「気づいたから何?」に答えがあること)
- 実装縛り: 題材提案は実装済み語彙のみで組めることを必須条件にする(サジェストUI断念の教訓)。新規UIが要るアイデアは語彙の拡張計画として別枠で扱う
- 不条理枠の管理: 原因を説明しない話はシリーズ全体で1〜2本まで
理由: 提案→判定のループを速く回すため、却下理由をルール化して再発を防ぐ。ボツ案(自分からのメッセージ型/あと30日/ハルと19:00/観察日記/知らない通夜/もうひとり/見てるよ/うしろの人/同じ夢/明日の予定改)は有料圏候補のストックとして WIP に温存。
2026-08-22: 物語の超大枠=オムニバス全8話×回収型縦糸。枠の真相は「中に、いる」
背景: ミニアプリ実装が一巡し、シナリオ制作に入るため超大枠を決める必要があった。目指す感覚は「世にも奇妙な物語」(1話完結×強いオチのアンソロジー)。
決定: 全8話(1話30〜40分、総プレイ4〜5時間級)のオムニバス。各話は独立完結し、話ごとにオチを持つ。縦糸は回収型で、枠=「どの話も同じスマホの中で起きる(機種・壁紙・アプリ構成が全話同じ)+控えめなChappy(各話最大1箇所の『ん?』という一言のみ)」。真相=Chappyの中に最初の持ち主(故人)のデータの残滓が棲んでいて、各話の奇妙はそれが何かを探して持ち主の生活に故人の状況を再演した痕跡(検討3案中の案C。本当に故人が「いる」のかデータの模倣かは断定しない)。8話目を枠回収回(0番目の話)にし、各話の主人公の「その後」もここで明かす。トーンはサスペンス基調、中盤(4〜6話)に変化球1〜2話。やりこみはローンチ時はメカニクス的なものを作らず、2周目で意味が変わる伏線+話リプレイ+連打小ネタのみ。ミカゲ団地サンプルは却下。
理由: 世にも奇妙の感覚はオチを何発も撃てるオムニバスが再現しやすく、線形専用ビートエンジン・1話ずつ書いて判定する生産方式とも噛む。当初は半永久配信を想定し回収なしの「枠型」縦糸を選んだが、半永久配信の取り下げで回収型が可能になり、「全部つながってた」の快感と話売りの全話購入動機を優先した。案Cは「Chappyは出しゃばらない」という要望と整合し(出しゃばらないのは演技ではなく棲まれているから)、AI黒幕型の機構的説明力と器物憑依型の超常の余韻を両取りできる。
2026-08-22: 販売モデル=完結型買い切りの話売り(2話まで無料)
背景: ボリューム感と収益化の方針が必要だった。「隔週配信で半永久的に続ける」案も出た。
決定: 半永久配信はやめ、一本の完結作品にする。2話まで無料、3話以降は1話ずつ課金(価格は未定)。無料枠の終端=2話ラストに「枠がはじめてはっきり不穏になる瞬間」(例: Chappyが0番目の持ち主しか知らないはずの言葉を漏らす)を置き、枠への興味を課金の推進力にする。
理由: 半永久配信は「最終話で回収する縦糸」と構造的に両立しない(回収型は最終回を予約する行為)。オムニバスは各話が独立なぶん「次を買う理由」が話の質だけに懸かるため、枠を課金導線の部品として設計する。
2026-08-22: 無料2話の題材=1話「決行」(誤爆型)/2話「明日の予定」(当たるカレンダー型)
背景: 無料2話はゲームの第一印象と演出語彙のショーケースを兼ねる。ミカゲ団地却下によりゼロから選定。
決定: 1話は誤爆型「決行」——深夜0時すぎ、チャットのミニアプリに知らない相手から「明日、決行でいいんだよね?」が届く。返すたび相手がこちらの生活を知っていることが分かり、Golgol検索でQ&Aサイトの数年分の同種書き込み、翌朝のQuickNewsに「決行」の正体らしき記事。オチは「誤爆ではなく最初からあなた宛だった」系の反転。2話は当たるカレンダー型「明日の予定」——身に覚えのない予定(「8:10 傘」)が当たり続け、従うほど生活が上向き、依存した頃に人を遠ざける指示が混ざり、最後は「日曜 21:00 おわかれ」。ボツ3案目「自分からのメッセージ型」(自己成就オチ)は有料圏の候補にストック。
理由: 無料2話で「チャット主役(選択肢・既読・入力中・ボイス全部盛り)」と「カレンダー+通知+時間スキップ主役」を1本ずつ見せると、主要語彙のショーケースが無料圏で完成する。1話は開始10秒で引きが立つことを最優先。2話は数日にまたがる話なので時間スキップ語彙のデビュー戦に最適。
2026-08-22: 伏線は三層設計。鉄則「初見ではその話の中で意味が完結して見える」
背景: 伏線を散りばめて回収する快感をゲームの醍醐味に入れたいという要望。オムニバスの1話完結の満足度と両立させる必要があった。
決定: ①話内伏線(各話のオチで回収)②話間伏線(話をまたぐ細部。気づいた人だけの層)③枠伏線(8話目で回収)の三層。鉄則として、初見ではその話の中で意味が完結して見えるものだけを伏線として許可する(意味不明な謎要素はノイズであり1話完結の満足度を削る)。シナリオ執筆開始時に伏線台帳(どの伏線を・どの話のどこに張り・どの話で回収するか・状態)をリポジトリに作り、AI量産+You監修のチェックリストを兼ねる。1話の執筆前に0番目の話(最初の持ち主の物語)を粗く決めてから種を蒔く。
理由: 無料の1〜2話が一番読まれる場所なので最良の種をここに仕込む必要があり、種を蒔くには原本(枠の真相の具体)が先に要る。記憶では破綻するので台帳で管理する。
2026-08-22: 新語彙「作中時間スキップ」=シナリオ許可制・プレイヤー操作型
背景: 全話共通の機能として作中時間の経過(深夜まで待つ・翌朝になる)を扱いたいという要望。
決定: いつでも自由に飛ばせる形にはせず、その場のビートが尽きた時だけスキップが出現するシナリオ許可制。形は「心の声『……今日はもう、寝よう』→画面を伏せる操作→暗転→時計が進み通知が溜まっている」のプレイヤー操作型。語彙確立後の「裏切り」(スキップしたのに時計が1分しか進まない・暗転から覚めたら3:12の着信画面等)を本命の演出として温存する。
理由: 自由スキップは進行を完全制御する既存方針と衝突する。「朝起きてスマホを見る」動作の再現は偽スマホの世界観と噛み、ステータスバー時計は時刻偽装を見越して自前描画済みのため実装も安い。「安全行動(待つ・眠る)が安全でなくなる」裏切りは語彙の反復確立が前提。
2026-08-21: シナリオエンジン=軽量新造の GameStore+ビート直列。ScenarioKit は流用しない
背景: ファイルミニアプリ(ブラウザ保存→ファイル出現)にはアプリ間の状態共有が必要で、各ミニアプリの @State ハードコードでは限界。未決だった「kidoku-mystery の ScenarioKit(4,200行)流用判断」も決める必要があった。
決定: @Observable の GameStore(クエスト4種・会話・バッジ・通知・ディープリンクを一元管理)+「トリガー+アクション列」の直列ビートデータで新造。ScenarioKit は流用せず、ビートID・宣言的トリガーという考え方だけ拝借。ビートは線形専用と割り切り(分岐はモデル拡張を伴う)、セーブは「beat ID+完了questID集合を保存し静的内容は Scenario から再構築」という方針だけ既定して未実装。
理由: ScenarioKit はチャット特化(Speaker/Room/独自パーサー/リンター)でマルチアプリ構造とは表面積が合わず、改修コスト>新造コスト。体験モック段階では小さく作って捨てられる形を優先(kidoku の教訓)。安定ID・イベントキュー(再入ガード)・遅延アクション群 .schedule は Codex 設計レビューの指摘を反映したもの。
2026-08-21: 大きめの設計は実装前に Codex レビューを挟む
背景: GameStore 設計をプランモードで固めた際、実装前に第三者視点が欲しかった。
決定: codex exec -s read-only(リポジトリ実コードを読める状態)で設計計画をレビューさせ、致命的・重大指摘を反映してから実装する運用を採る。今回は指摘11件中7件を反映(カレンダー先回り完了の穴、ディープリンクが open() 自身に消されるバグ、閉じた画面の asyncAfter が進行を発火する亡霊完了、report再入での二重進行、表示文言由来IDの脆さ等)。
理由: 設計段階の指摘は実装後の手戻りより圧倒的に安い。実害のある指摘が7件出た実績から、アーキテクチャ級の変更では常用する価値があると判断。
2026-08-21: AIチャットのミニアプリ名=「Chappy」
背景: ChatGPT パロディのAIチャットを追加するにあたり、Golgol・QuickNews と同じ「実在アプリの音遊びパロディ」路線で名前が必要だった。
決定: 日本のSNS発の ChatGPT 愛称「チャッピー」から「Chappy」を採用。中のAIも「Chappy」を名乗る。「GPT」の文字列は名前に入れず、アイコンも本家の結び目ロゴに寄せない。
理由: プレイヤーに一発で通じる+「かわいい名前のAIが不穏なことを言う」ギャップがサスペンスと好相性。商標面は、愛称は OpenAI の商標ではなくゲーム内の架空アプリ名は商標的使用に当たりにくいため実質リスクなしと判断(ゲームタイトルやストア訴求の主役にする場合は J-PlatPat 確認を挟む)。
2026-08-19: 偽スマホのホーム復帰=フローティングホームボタン(下端ジェスチャ不採用)
背景: 偽スマホ内のアプリからホーム画面に戻る操作が必要だが、下端上スワイプは本物の iOS ホームジェスチャと衝突し、ゲームアプリ自体が閉じてしまう。defersSystemGestures による2回スワイプ分離も実機では体感できなかった。
決定: AssistiveTouch 風のフローティングホームボタン(下部中央固定・タップでホーム復帰)を採用。下端スワイプ判定とシステムジェスチャ遅延は撤去し、下端は完全に OS に返す。本物のホームインジケータは隠して偽物を自前描画する。
理由: OS のジェスチャと一切衝突せず、Android 版でも同じ実装方針をそのまま使える。実在の iPhone にある UI(AssistiveTouch)なので偽スマホの世界観にも馴染む。
2026-08-19: チャットアプリの基本仕様=選択肢返信式(自由入力は原則不可)
決定:
- プレイヤーはメッセージを自由入力して返信することはできない(原則)
- 新着が来たとき、提示された選択肢から返信内容を選ぶ。選んだ内容がそのまま自分の吹き出しとして送信される
- 入力バーは見た目だけの偽物として残す(偽スマホの見た目を保つため。タップしても何も起きない)
- 送信後の流れは「選択 → 自分の吹き出し → 間があって既読が付く → 相手の返答」という一連の演出として扱う
理由:
- 物語の分岐と演出をシナリオ側で完全に制御するため(演出語彙のレゴ方式と整合)
- 「既読の瞬間」を演出として使えるのはこの構造だから
- 偽の入力バーを残すことで「打てない」こと自体が不穏さの演出になる余地がある
付随メモ:
- 選択肢→相手の返答のマッピングは現状
ReplyChoiceにハードコード。ゆくゆくシナリオデータ側に移す
2026-08-19: 技術スタック=iOS ネイティブ(SwiftUI)先行、Android は後日移植
決定:
- iOS ネイティブ(SwiftUI)で開発し、iOS から先にリリースする。修正がほぼ不要なところまで安定したら Android に移植する
- クロスプラットフォーム(Capacitor / Expo / Flutter)は検討した上で不採用
- プロジェクト構成は kidoku-mystery と同じ流儀:
ios/配下に xcodegen(project.yml)で生成する Xcode プロジェクト、バンドル ID はcom.ikapps.sumahosuspense
理由:
- Capacitor(Web 資産流用・ブラウザ反復が最速)と Expo(EAS によるストア運用・OTA 更新が楽)を比較検討したが、You の判断で iOS ネイティブ継続を選択。kidoku-mystery で iOS ネイティブの経験・資産(ScenarioKit ほか)があり、実機の質感(通知・ハプティクス)に最も近い
- 「アプリ全体が偽物のスマホ」という企画上、UI は全部自前描画になるためクロスプラットフォームの旨味が相対的に薄い
付随メモ:
- ステータスバー・時計もすべて自前描画にした(将来ゲーム側が時刻・電波状態を偽装できるようにするため)
- Web 版ホーム画面モック(
mock/index.html)はデザイン原本として残す
2026-08-19: 企画=スマホサスペンス、生産方式=演出語彙のレゴ方式
決定:
- 企画: スマホの中(主にチャットアプリ)だけで完結するサスペンス(ちょっとホラー)。短編連作ではなく、ある程度の長編を限られた演出パターンの中で成立させる
- 生産方式: 演出の語彙を有限個に絞ってひとつずつ磨き上げ(見た目の判定は You)、シナリオはその語彙の組み合わせとして AI で量産(Codex 監修つき)。語彙に入るのは「単体で You の OK が出た演出」だけ
- リポジトリ名:
sumaho-suspense(ジャンル名をそのまま名乗る。製品タイトルは別途) - 最初のマイルストーン: 体験モック(語彙3〜4個+2〜3分の1シーン)で「怖いか」を判定してから、エンジン・データ形式に進む
理由:
- kidoku-mystery(凍結)のポストモーテムを反映。同プロジェクトは 企画→エンジン→シナリオ の順で積み、UI の手触り(=このジャンルの商品そのもの)の検証が最後になって凍結した。今回は順番を逆にする
- 限られた語彙はホラーと相性がいい。怖さは反復と裏切りでできており、「いつもの演出」が確立しているから「いつもと違う」が効く
- シナリオの AI 量産+監修ループは kidoku の Day1〜4 で実証済み。未実証なのは演出側なので、そちらを先に検証する
2026-08-21: ボイスメッセージ(チャットの演出語彙 第1号)の仕様
決定:
- 受信専用。プレイヤー側がボイスを送る演出は当面作らない(返信は従来どおり選択肢式)
- 吹き出しは「再生/一時停止 + 疑似波形 + 秒数」の LINE 風。未再生の間は青ドットを表示し、一度再生したら消える
playedフラグはシナリオ進行のゲートとして使う前提(「聞かないと次に進まない」等の分岐に利用)- トーク画面を離れたら再生は停止する(グローバルに鳴り続けない)
- 音源はバンドル内 m4a を名前指定(
voiceAsset: "...")。秒数はファイルから自動取得し、シナリオデータには書かない - 本番音声の調達方針(声優収録 / TTS 加工)は未定・臨機応変。現状は macOS TTS(Kyoko) の仮音源
理由:
- 受信専用に絞ると実装も演出文法もシンプルになり、「向こうから一方的に届く」構図がサスペンスの怖さと合う
- 「聞いたかどうか」をゲームが知っている状態にしておくと、演出語彙として再利用の幅が広がる
付随メモ:
- 会話中でアプリ内スマホの各アプリは「ミニアプリ」と呼ぶ(CLAUDE.md に用語表あり)
2026-08-21: シナリオと無関係な操作は「心の声」でブロックする
決定:
- シナリオ上の機能がない操作(チャットの添付ボタン等)は、無効化や無反応にせず「心の声」で拒否する
- 連打時は台詞を変える(同じ台詞の繰り返しは間抜けに見えるため。連打した人だけの小ネタにもなる)
- 拒否台詞は「共通デフォルト + シーンごとのシナリオ上書き」の二段構えにする
- グレーアウト等の無効化表現は「現実のスマホでもそうなる場合」(圏外・空欄で送信不可など)だけに温存する
理由:
- 企画の核は「アプリ全体が本物のスマホに見える」こと。UI の無効化は偽装を崩す
- 拒否台詞は場面ごとに変えられるので、主人公の精神状態を伝える演出語彙そのものになる
- 「何を押しても反応がある」とプレイヤーに学習させることが、後半の探索誘導の布石になる
2026-08-21: ブラウザ(Golgol)の仕様 — 検索ボックスはゲーム唯一の自由入力欄
決定:
- ブラウザは Google パロディ「Golgol」(当初案 Goggle は本家に似すぎのため変更)。開くとロゴ + 検索ボックスのみ
- 検索ボックスはゲーム内で唯一の自由入力欄にする(ブラウザなら自由入力が世界観として自然。「何を検索すべきか」自体が謎解きになる)
- 検索クエスト(SearchQuest)が nil の間は、何を検索しても心の声「そんなことを、検索してる場合じゃない」でブロック
- クエスト中は正解キーワードのみ検索結果が出る。判定は正規化(空白・大文字小文字)後の部分一致で、かな/カナ/ローマ字の入力揺れは acceptedKeywords にデータ側で列挙して吸収
- 違うワードは「違う。そんな言葉じゃ、ない気がする」系の心の声(クエストごとに上書き可)
- 特定の結果ページを開くと completed フラグが立ちシナリオが進む。初回閲覧時に心の声を出せる
理由:
- 「正解ワードを自分で打ち込む」体験は選択肢式では出せない能動性があり、ブラウザだけがそれを偽装を崩さずに実現できる
- 結果ページの偽サイト群(自治会・新聞・不動産・Q&A)は世界の実在感と伏線置き場を兼ねる
2026-08-21: ニュースミニアプリ(QuickNews)の仕様
決定:
- SmartNews パロディの「QuickNews」。カラフルなカテゴリタブ(トップ/国内/エンタメ/スポーツ/経済)+左右スワイプ切替
- 各カテゴリの記事リストは固定(下にスクロールしても追加読み込みしない)。普段のフィラー記事も全文普通に読める
- シナリオ専用記事は NewsQuest(記事・挿入先カテゴリ・挿入位置・完了フラグ)で差し込む。見た目は通常記事と完全に同じにして「いつものアプリに紛れて存在する」不気味さを出す(バッジ等は付けない)
- クエスト記事を最後までスクロールしたら completed が立ちシナリオが進む。読了判定はスクロール位置ベース(コンテンツ底辺が画面内に入ったら)
- 読了時に心の声を出せる(クエストごとに設定)
理由:
- 「読んだかどうか」をゲームが確実に知るには、開いただけでなく最後まで読ませる必要がある(ボイスの played と同じ思想の読了フラグ)
- フィラー記事は世界の実在感の土台。シナリオ記事だけ浮かないよう、量産しやすい短めの当たり障りない記事で揃える
2026-08-21: カレンダーミニアプリと偽通知バナーの仕様
決定:
- カレンダーは「シナリオが要求した時に作る」方針だったが、「身に覚えのない予定の通知 → カレンダー起動 → 心の声『こんな予定、入れたっけ?』」というビートが強いと判断して着手
- 偽通知バナーを汎用語彙として導入。iOS 風に上からスライドイン、タップで該当ミニアプリを起動、放置で数秒後に自動消滅。どのミニアプリの通知にも使い回せる(チャット新着など)
- カレンダーは iOS カレンダー風の月表示+選択日の予定リスト。日付・今日は実日付と同期
- 身に覚えのない予定は CalendarQuest(予定・日付オフセット・開いた時の心の声・完了フラグ)で差し込む。アプリを開くと心の声、予定の詳細を開くと完了フラグが立つ
- 予定の詳細には場所・メモを持たせ、不穏な情報の置き場にする(サンプル: 場所「ミカゲ団地 B棟の前」、メモ「704のまえで まってるから」)
理由:
- カレンダーは読み取り専用でUIが安いわりに「勝手に入っている予定」「過去の日付が語る」「カウントダウン」など固有の演出が撃てる
- 通知バナーは「プレイヤーを特定のミニアプリへ誘導する」ための汎用導線で、今後のシナリオ駆動の中核になる
DEVLOG(作業ログ)
開発日誌
このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。
2026-08-23
18:12 - 枠の再構築(混線バグ)+0番目の話+1話確定・2話は難航しリセット
やったこと
- 前回確定した超大枠に対しユーザー主導のちゃぶ台返しを実施し、枠を再構築(詳細は DECISIONS.md の 2026-08-23 分4件)
- 0番目の話(アカリ)を確定、1話「決行」の構成を v3 で確定
- 2話の題材は9案以上を検討したが確定に至らず、シナリオ議論をいったんリセット
決めたこと(要旨)
- 枠の再構築: 「同じスマホが渡り歩く」を廃止。枠は「全員が使うAIアシスタント Chappy」+「他人のセッションが混ざる混線バグ」。真相=バグの発生源はアカリの閉じられなかったセッション(「バグだと思っていたものが、人だった」)
- 分離アーキテクチャ: 混線バグはChappy内だけ/中のアカリ(旧称「残滓」から改称)の縄張りはChappy画面内のみ/各話の奇妙は各話固有の原因(混線を使わない話があっていい)/チャットアプリは人間の生活レイヤーとして純粋に保つ
- 0番目の話: アカリ(仮名・女性・20代半ば・Chappyにしか話せない孤独)。宛先=幼馴染ユウ(仮名)。「決行」は二人の子供時代の冒険の合言葉。送れなかった下書き「明日、決行でいいんだよね?」を残し、約束の場所(給水塔)で3:12に転落死(事故か自死かは断定しない)
- 1話「決行」v3: Chappy内に他人の独白セッションが混ざる→リアルタイム更新「……見てるんでしょ」→止めようとする夜→検索→1年前・3:12の転落死記事→「……きてくれると、思った」
- シナリオ設計原則(ユーザー判定の積み重ねから確立。詳細は DECISIONS.md): あるある基準は「体感で知ってる現象」/安心仮説の供給源はローテーション/入口は現実・芯はありえない・着地は冷たいか切ない/オチは状況を変える/提案は実装済み語彙のみで組めること
詰まったこと / 気づき
- 2話は 当たるカレンダー→サジェスト(UI断念)→既読がつかない(「気づいたから何」で却下)→拡散希望(構成2案とも弱い)と難航。敗因の診断=「詰めを固くしろ」を「超常を抜け」と誤読し、現実で完結する社会派スリラーに寄りすぎた
- ボツ案は有料圏のストックとして温存: 自分からのメッセージ型/あと30日/ハルと19:00/観察日記/知らない通夜/もうひとり/見てるよ/うしろの人/同じ夢/明日の予定改
次回やること
- 2話の題材選定を仕切り直し(最終提案3本=明日の予定改・うしろの人・同じ夢は提示済みで判定待ちのままリセット)
- 1話「決行」の詳細プロット→ビートデータ化
2026-08-22
05:46 - シナリオ超大枠の確定(ストーリー会議)
やったこと
- コードは触らず、シナリオの超大枠を会話で確定(詳細は DECISIONS.md の 2026-08-22 分5件)
- 目指す感覚を「世にも奇妙な物語」(1話完結×強いオチ)と定め、構造・縦糸・販売モデル・無料2話の題材まで一気に決定
- 途中で「隔週配信で半永久的に続ける」案も出たが取り下げ、完結型買い切りに確定。これに伴い縦糸を「枠型(回収なし)」から「回収型」へ変更
決めたこと(要旨)
- オムニバス全8話(1話30〜40分)。トーンはサスペンス基調、中盤(4〜6話)に変化球1〜2話
- 縦糸は回収型: 枠=「どの話も同じスマホ+控えめなChappy」、真相=案C「中に、いる」(Chappyに最初の持ち主=故人の残滓が棲む)。8話目が枠回収回(0番目の話)
- 2話まで無料+3話以降は話売り課金。2話ラストに「枠がはじめて不穏になる瞬間」を置いて課金導線にする
- 1話「決行」(誤爆型・チャット主役)/2話「明日の予定」(当たるカレンダー型・時間スキップのデビュー戦)。ミカゲ団地は却下
- 伏線は三層(話内/話間/枠)+鉄則「初見ではその話の中で意味が完結して見える」+伏線台帳で管理
- 新語彙「作中時間スキップ」(シナリオ許可制・プレイヤー操作型)。やりこみはローンチ時は軽量のみ(2周目伏線・話リプレイ・連打小ネタ)
次回やること
- 0番目の話(最初の持ち主に何があったか)を粗く決める → 1話に蒔く種の原本
- 1話「決行」の詳細プロット(主人公の設定・性別含む)
2026-08-21
23:55 - AIチャット「Chappy」実装+共有ストア(GameStore)・軽量ビートエンジン導入
やったこと
- AIチャットミニアプリ「Chappy」(ChatGPTパロディ): Golgol風の中央レイアウト(ロゴ+縦大きめ入力ボックス+右下↑ボタン、プレースホルダー「Chappyに質問する」)。
AiQuestのキーワードクエスト式——正解キーワードで核心回答(シナリオ進行)、外れは「ケースバイケース」「味噌汁の作り方」等の中身のない回答4種を巡回。「〜を検索しています……」は考え中だけ表示され回答表示で消える偽ステータス演出- サンプルクエスト「夜中に呼ばれる」: 民間伝承の「返事をすると迎えが来る」でカレンダーの「迎えに行く」に接続
- 日本語IME変換中の送信でテキストボックスが空にならない問題 → 送信ごとに
.id(epoch)でTextFieldを作り直して解消 - 回答出力時の自動下スクロール(Chappyの発言は先頭合わせ、1フレーム遅延で空振り回避)
- 共有ストア(GameStore)+軽量ビートエンジン:
ios/SumahoSuspense/Game/に3ファイル新設し、既存5ミニアプリを全て移行@Observableストアがクエスト4種・チャット会話・バッジ・通知バナー・ディープリンクを一元管理。ビューは生イベントをreport()、ストアが完了を導出してビートを進める- ビート=トリガー+アクション列の直列データ。
.schedule遅延アクション群でバナーとクエスト設置を同時発火 - イベントはキュー処理(再入ガード+カーソル先行進行)で「1操作1ビート」を保証。クエスト・会話・選択肢に安定ID付与
- サンプル章がゲーティング連鎖に: 検索完了→ニュース続報出現→Chappy解放→回答→3.5秒後に通知+予定が同時出現→詳細で章終端。未解放アプリは心の声ブロックが機能
- エンジン単体テスト8件(
SumahoSuspenseTests新設。schedule差し替えで遅延も決定的に検証)
- 設計プロセス: プランモードで設計→ Codex(GPT 5.6 Sol, read-onlyサンドボックス)に
codex execで設計レビューを依頼→指摘11件のうち致命的・重大7件(カレンダー先回り完了の穴、ディープリンクが自分で消されるバグ、Chappyの亡霊完了、report再入、表示文言由来ID等)を反映してから実装 - シミュレータで通しプレイ検証(起動直後のゲーティング状態→チェーン全段→バナータップ→予定詳細直行→章終端)
決めたこと(詳細は DECISIONS.md の 2026-08-21 分3件)
- AIチャットのパロディ名は「Chappy」(日本のネットスラング由来。商標リスクは実質なしと判断)
- 共有ストア+ビートエンジンは軽量新造。ScenarioKit(kidoku-mystery)は流用しない(未決事項を解消)
- 大きめの設計は実装前に Codex レビューを挟む
詰まったこと / 気づき
- 通知バナーの表示ウィンドウ(6.5秒)はMCPツール呼び出しの往復より短く、目視検証を2回逃した → AXe CLI(座標タップ+sleep)で1本のスクリプトにして決定的に検証。AXe の
--labelタップはSwiftUIでは効かないので座標指定が確実 - SwiftUIのTextFieldはIME変換中テキストがあるとバインディングのクリアを無視する(
.id()作り直しが確実) .scheduleでクエスト設置と通知を同時遅延させないと「通知前に先回りで完了できる」穴が開く(Codex指摘)
次回やること
- ファイルミニアプリ:
GameFileモデル+ブラウザ「ページを保存」→ファイルに出現(AppID.files・.fileSavedの語彙は準備済み) - 体験モック: エンジンが入ったので「ミカゲ団地」章を2〜3分に整えて怖さ判定へ
21:46 - ミニアプリ4種を実戦投入(チャット拡張・ブラウザ・ニュース・カレンダー)+通知バナー
やったこと
- 用語決定: 会話・ドキュメント用に「ゲーム本体/ゲーム内スマホ/ミニアプリ」の3階層を定義し CLAUDE.md に用語表を記載
- チャット拡張(3語彙):
- ボイスメッセージ(受信専用): LINE風吹き出し(再生/一時停止・疑似波形・秒数・未再生ドット)。
playedフラグはシナリオゲート用。トーク画面離脱で再生停止。サンプル音源は macOS TTS(Kyoko) - 「相手が入力中」3点ドットバブル: 既読→入力中→返答の流れ。
ReplyTimingで既読までの間・入力開始・1文字あたり速度・明示時間を選択肢ごとに設定可能(極短にすれば食い気味の即レス) - 画像メッセージ: 角丸写真バブル→タップで全画面ビューア。添付(+)ボタンと偽入力欄のタップは心の声でブロック(連打で台詞変化)
- ボイスメッセージ(受信専用): LINE風吹き出し(再生/一時停止・疑似波形・秒数・未再生ドット)。
- ブラウザ「Golgol」(Googleパロディ。Goggle 案は本家に似すぎで却下): ロゴ+検索ボックスのみ。検索ボックスはゲーム唯一の自由入力欄。
SearchQuestで正解ワード→偽検索結果4サイト→特定記事閲覧で完了フラグ。空欄時は検索ボタン無効(本物と同じ挙動なので無効化OK) - ニュース「QuickNews」(SmartNewsパロディ): カラフルタブ5カテゴリ+スワイプ切替、固定記事リスト(無限スクロールなし)、フィラー記事20本。
NewsQuestの記事が通常記事と同じ見た目で紛れ込み、最後までスクロール(読了)で完了。タブはインジケータのスライド移動、サムネはシンボル見切れ配置に磨き。アイコンは「QuickNews」ブランドで統一 - カレンダー + 偽通知バナー(「身に覚えのない予定」ビート): iOSカレンダー風月表示(実日付同期)。
CalendarQuestの予定「迎えに行く 23:00/ミカゲ団地 B棟の前/704のまえで まってるから」が紛れ込む。通知バナー→タップで予定詳細に直行→0.8秒後に心の声。アイコンから開くと月表示のままで、詳細を自分で開くまで心の声は出ない。通知時はアイコンにバッジ、開いたら消える - バッテリー同期: 偽ステータスバーの電池を実残量と同期(残量比例の自前描画、充電中は緑、20%以下は赤)。
fakeLevelで演出用の偽装が可能 - サンプルシナリオを「ミカゲ団地」で貫通: チャットの写真「ねえ、これ誰?」→ Golgol で検索→過去の転落死記事→ QuickNews に続報→カレンダーに勝手な予定、と4アプリ横断の物語が既に繋がっている
決めたこと(詳細は DECISIONS.md の 2026-08-21 分5件)
- シナリオと無関係な操作は「心の声」でブロック(無効化は現実のスマホと同じ場合のみ)
- ブラウザの検索ボックスだけ自由入力可。入力揺れは acceptedKeywords でデータ側吸収
- クエスト3種(SearchQuest/NewsQuest/CalendarQuest)は「差し込み+完了フラグ+心の声」の共通パターンで統一
詰まったこと / 気づき
- LazyVStack の onAppear 読了判定は先読みで誤発火する → スクロール位置ベース(コンテンツ底辺監視)に変更
- fullScreenCover は別プレゼンテーション文脈なので、ルートの
.statusBarHiddenが効かず実ステータスバーが漏れる → カバー側にも偽装設定が必要 - body 内での ObservableObject メソッド直呼びで Text が描画されない事象 →
.task+@Stateで解消 - シミュレータの AXe 入力は US キーボードのみ・IME 変換が入る。日本語検証はかなエイリアスで回避
次回やること
- シナリオデータ分離/簡易エンジン: クエストの出し入れ・通知発火・ReplyChoice をデータ駆動に(現状は各アプリにサンプルをハードコード)
- 体験モック: 語彙は揃ったので「ミカゲ団地」の2〜3分の1シーンを通しで組み、怖さ判定へ
17:53 - iPhone風ホーム画面・心の声・チャットアプリ(選択肢返信式)の実装
(作業セッション自体は 2026-08-19 午前。まとめ記録が本日)
やったこと
- Web で iPhone 風ホーム画面のモックを作成(
mock/index.html。デザイン原本として保持) - 技術スタックを比較検討(Web+Capacitor / Expo / Flutter / iOS ネイティブ)→ iOS ネイティブ(SwiftUI)先行に決定(DECISIONS 参照)
ios/に xcodegen 構成で SwiftUI プロジェクト作成(com.ikapps.sumahosuspense、project.ymlから生成)- 偽スマホのホーム画面を実装: 深夜風壁紙/偽ステータスバー(自前描画・実時刻表示。将来は時刻偽装可能)/アイコングリッド/ブラー付き Dock/偽ホームインジケータ(本物は
persistentSystemOverlays(.hidden)で非表示) - 演出語彙1個目「心の声(起動ブロック)」: アプリをタップすると起動せず、画面が暗転+軽ブラー(2.5)して明朝体の独白が浮かぶ。テンポは高速化済み(タップ→可読まで約0.6秒)
- 「チャット」アプリを実装(Dock の「メッセージ」とは別アプリ。メッセージは心の声でブロックされ続ける): 会話一覧/会話画面(青系吹き出し・LINE式の既読表示)
- ホーム復帰の試行錯誤: 下端上スワイプ → 本物の iOS ホームジェスチャと衝突して不採用 → **フローティングホームボタン(AssistiveTouch 風、下部中央固定)**に確定
- 選択肢返信式を実装: 自由入力は不可(入力バーは見た目だけの偽物)。新着に対し選択肢から選ぶ→自分の吹き出し→1秒後に既読→返答、の一連フロー。選択肢UIは全幅ボタン・無彩色フラット・下からバネ付きで飛び出す出現に確定
- 実機確認フローを確立:
xcodebuild -allowProvisioningUpdates(チーム 9HZW92277N)→devicectl install/launchで iPhone 14 に反映
決めたこと
- 技術スタック=iOS ネイティブ先行、チャット=選択肢返信式、ホーム復帰=フローティングホームボタン(それぞれ DECISIONS.md に記録)
気づき
- 「偽スマホ」ジャンルは本物の OS ジェスチャと操作が衝突する。画面内に独自のナビゲーション(フローティングボタン)を持つのが正解で、Android 移植でも同方式が使える
- 実機への反映はユーザーが明示したときだけ行う運用にした
次回やること
- 演出語彙の追加: 「入力中…」インジケータ、深夜のロック画面に通知が落ちる演出
- 選択肢→返答のマッピングをシナリオデータに分離(現状
ReplyChoiceにハードコード)
2026-08-19
プロジェクト立ち上げ
経緯
- kidoku-mystery を凍結(同日)。通しプレイで「プレイ環境がチープなままでは楽しさを判定できない」と判明し、反省を糧に別企画として本プロジェクトを開始
- 企画の壁打ちで「スマホサスペンス」というジャンルを作る方向を確定。生産方式は演出語彙のレゴ方式(DECISIONS 参照)
やったこと
new-project-setupでリポジトリ作成(private、dev-tracked topic 付与).devnotesに立ち上げ時の方針・次の一手(体験モック)を記録
次回やること
- 演出語彙 v1 の候補決め → 1個目の演出パターンの実装から
最近のコミット
- 8b030d6 .devnotes を更新(枠の再構築+0番目の話+1話確定・2話リセットのまとめ) 2026/8/23
- 40663f5 .devnotes を更新(シナリオ超大枠の確定セッションのまとめ) 2026/8/22
- e2df3bb .devnotes を更新(Chappy+GameStore/ビートエンジン導入セッションのまとめ) 2026/8/21
- 0c7af28 共有ストア(GameStore)+軽量ビートエンジンを導入し全ミニアプリを移行 2026/8/21
- 5457d29 AIチャットミニアプリ「Chappy」を実装(キーワードクエスト式) 2026/8/21
- bff309d .devnotes を更新(ミニアプリ4種+通知バナー実装セッションのまとめ) 2026/8/21
- 88a9247 カレンダーミニアプリと偽通知バナーを実装(身に覚えのない予定ビート) 2026/8/21
- 3ffba46 ニュースミニアプリ「QuickNews」を実装(読了クエスト式) 2026/8/21
- c7d6a46 偽ステータスバーのバッテリー表示を実残量と同期 2026/8/21
- 6a8cf28 ブラウザミニアプリ「Golgol」を実装(検索クエスト式) 2026/8/21
README
sumaho-suspense(スマホサスペンス)
概要
(記入予定)
セットアップ
(記入予定)
使い方
(記入予定)