{
  "meta": { "version": 16, "startTime": "2026-11-01T19:00", "firstScene": "d1_evening_first" },
  "variables": { "crush": 0, "band": 0, "flags": { "answeredCall": false, "approachedAtNight": false, "voiceFirst": false, "voiceNight": false, "fan": false } },
  "blog": {
    "name": "락네버다이",
    "author": { "name": "GEE", "avatar": "assets/avatars/jihoon_insta.jpg" },
    "posts": [
      {
        "id": "blog_future_fan",
        "when": { "var": "flags.fan", "eq": true },
        "title": "투어를 마치며",
        "at": "2029-09-14T23:47",
        "likes": 2847,
        "blocks": [
          { "text": "팬 여러분들 안녕~ 지훈입니다. 이번 투어도 함께 해주셔서 감사합니다!\n\n약 8개월 정도의 투어를 진행하면서 여러분들과 3개의 계절을 함께 했는데요 그 안에서 여러분들과의 추억은 너무도 소중하게 제 안에 자리 하고 있어요. 가끔은 갤러리를 보면서 지난 날들을 되돌아 볼 때가 많은데 시간이 참 빠른 것 같다는 생각도 들어요. 1호 팬이 생겼던 11월이 엊그제 같은데 벌써 시간이 많이 흘렀네요.\n\n항상 순간 순간을 소중하게 생각하고 매 공연 진심과 최선을 다하고 있지만 지금 생각해보면 더 더 잘하는 모습 보여줬어야 했는데라는 아쉬움도 남고 그래요 이번 투어로 제가 여러분들께 긍정의 에너지를 전달 할 수 있었다면 전 너무 만족했던 투어로 기억에 남을 것 같아요~\n\n제가 언제까지 여러분들한테 이런 큰 사랑 받을 수 있을지는 잘 모르겠지만 팬 여러분들 덕분에 제가 이렇게 멋있게도 한번 살아봅니다. 제가 노력하고 신경쓰고 잘해야 하는 것은 당연하다 생각하고 그걸 바라봐주고 응원해주는 여러분들이 제 가치를 더 높게 만들어준다고 생각해요~~ 이런 생각이 변하지 않도록 옆에서 많이 도와주세요 아직 소년의 마인드라 잘 부탁드리겠습니다.\n\n마지막으로 다음 투어에서는 기가 막힌 모습 보여드릴게요 미래의 제 자신은 더 잘할 걸 제가 알기 때문에 자신있게 말씀 드리겠습니다. 언제나 저에게 팬이라는 큰 존재로 계셔주셔서 감사합니다~~~~굿나잇" }
        ],
        "noComments": true
      },
      {
        "id": "blog_d1",
        "title": "하이요",
        "at": "2026-10-01T22:40",
        "likes": 31,
        "blocks": [
          { "image": "assets/photos/blog_gee_1.jpg", "text": "아침 합주실 하드케이스는 늘 무거움 팔 삭제" },
          { "image": "assets/photos/blog_gee_2.jpg", "text": "기다리고 기다렸던 신발 배송 와서 기분 잠깐 좋아졌음 정말 까리한 신발인듯 자주 신고 다녀야지🎶" },
          { "image": "assets/photos/blog_gee_3.jpg", "text": "맥피 ㅋㅋ (맥주 같은 커피^^)" },
          { "image": "assets/photos/blog_gee_4.jpg", "text": "운동 많이 됐습니다." },
          { "image": "assets/photos/blog_gee_5.jpg", "text": "오랜만에 버스를 탔어요~~🚎" },
          { "image": "assets/photos/blog_gee_6.jpg", "text": "밖에 볼라고 탔는데 강제 시선 모자이크 ㅋㅋ" },
          { "text": "그리고 곧 큰 거 옵니다!!\n많이많이 기대해주세요🎸" }
        ],
        "commentList": [
          { "name": "도윤", "text": "야 공연 언제 하는데 날짜 나오면 바로 말해라", "at": "2026-10-01T22:58" },
          { "name": "수빈", "text": "지훈아 잘 지내지? 얼굴 본 지 너무 오래됐다", "at": "2026-10-01T23:12" },
          { "name": "김현우", "text": "큰 거 뭔데 나한테만 몰래 알려주라ㅋㅋ", "at": "2026-10-01T23:40" },
          { "name": "yejin_k", "text": "오랜만에 블로그 올라왔네요! 잘 지내는 것 같아서 다행이에요", "at": "2026-10-02T08:21" },
          { "name": "태현이형", "text": "하드케이스 들고 다니느라 고생한다 공연 날 꼭 갈게", "at": "2026-10-02T12:05" },
          { "name": "서진", "text": "공연 너무 기대돼요ㅠㅠ 이번엔 꼭 맨 앞에서 볼게요", "at": "2026-10-02T19:33" },
          { "name": "민재", "text": "신발 까리하네 공연 때 신고 나와라ㅋㅋ", "at": "2026-10-03T01:14" }
        ]
      },
      {
        "id": "blog_d2",
        "title": "오늘이에요",
        "at": "2026-04-02T21:10",
        "likes": 14,
        "commentList": [
          { "mine": true, "text": { "default": "약과 맛있게 잘 먹고 후기 알려줄게~ 시집 읽고 후기 남겨라 ㅋㅋ" }, "at": "2026-04-02T21:34" }
        ],
        "blocks": [
          { "image": "assets/photos/blog_gee_7.jpg", "text": "기대 한 것 보다 재미있었던📕 언제 다 읽지?" },
          { "image": "assets/photos/blog_gee_8.jpg", "text": "우연히 만난 아르떼미떼 조명입니다 귀엽죠? 히히" },
          { "image": "assets/photos/blog_gee_9.jpg", "text": "확대된 세상에 축소된 지훈입니다 귀엽죠? 히히" },
          { "image": "assets/photos/blog_gee_10.jpg", "text": "맛있어 보였지만 칼로리랑 당이 무지하게 높아서 무시하느라 애썼습니다 흑흑" },
          { "image": "assets/photos/blog_gee_11.jpg", "text": "대신 귀여운 거 사갑니다 야호!" },
          { "image": "assets/photos/blog_gee_12.jpg", "text": "옆에 있던 친구가 시집을 추천해줘서 예정에 없던 시집을 하나 데리고 왔어요 하하" }
        ]
      }
    ]
  },
  "recordings": [
    { "id": "rec_new", "title": "누구 목소리게???", "at": "2026-09-27T18:02", "seconds": 8, "audio": "assets/audio/rec_new.m4a" }
  ],
  "seed": {
    "messages": [
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-04-02T13:05",
        "text": { "older": "선배 오늘 카페 갈 건데 같이 갈래??", "default": "오늘 카페 갈 건데 같이 갈래??" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-04-02T13:05", "text": "혼자 가기 심심하다 ㅋㅋ" },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-04-02T13:08",
        "text": { "default": "좋아 몇 시에 볼까?" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-04-02T13:09", "text": "3시 어때?" },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-04-02T13:10",
        "text": { "default": "좋아!" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-04-02T13:10", "text": "그럼 그때 보자~~ 늦지 말구" },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-07-14T22:47",
        "text": { "default": "아직도 합주실이야? 집 언제 가?" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-07-14T22:52", "image": "assets/photos/dm_jihoon_home.jpg" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-07-14T22:52", "text": "이제 집 가려구~~" },
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-08-20T23:12",
        "text": { "older": "선배 아사히라고 알아??", "default": "아사히라고 알아??" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-08-20T23:12", "text": "내 친구인데 노래 진~~~~~짜 잘 만든다니까" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-08-20T23:12", "text": "심지어 얼굴도 잘생김" },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-08-20T23:14",
        "text": { "default": "오 그래?" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-08-20T23:15", "text": "어제 만든 거 들려줬는데 진짜 소름 돋았음 ㅋㅋㅋㅋ" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-08-20T23:15", "text": "우리 밴드 신스로 데려오구 싶은데 어때??" },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-08-20T23:17",
        "text": { "default": "좋은데? 나도 한번 들어보고 싶다" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-08-20T23:18", "text": "일단 내가 꼬셔보께 ㅋㅋ" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-09-09T11:20", "text": "나 오늘 준규랑 사히랑 밥 먹구 갈게~~" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-09-09T11:21", "text": "간 김에 사히한테 우리 곡 하나 줄 생각 있냐고 물어봐야겠다 ㅋㅋ" },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-09-09T11:23",
        "text": { "default": "꼭 설득해라 ㅋㅋ" }
      },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-09-09T11:23",
        "text": { "default": "잘생겼다며 나도 얼굴 좀 보자" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-09-09T11:24", "text": "안돼 ㅋㅋ" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-09-09T11:24", "text": "나만 아껴볼꺼임" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-05-15T11:21", "text": "나 요시랑 밥 먹구 갈게~~" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-05-15T11:21", "text": "합주 전까지는 갈겡" },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-05-15T11:24",
        "text": { "default": "알겠어. 늦지 마" }
      },
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-05-15T11:25",
        "text": "당연하지 ㅋㅋ"
      },
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-06-29T11:38",
        "text": { "older": "선배 나 합주 쫌 늦을 것 같아 ㅜㅜ", "default": "아 나 합주 쫌 늦을 것 같아 ㅜㅜ" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-06-29T11:38", "text": "준규가 아프대서 잠깐 보구 가려구" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-06-29T11:39", "text": "30분 정도 늦을 듯 ㅜ" },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-06-29T11:39", "text": "다른 애들한테도 좀 전해줘 ㅜ" },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-06-29T11:41",
        "text": { "default": "알겠어. 전해둘게" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-06-29T11:42", "text": "고마워 ㅋㅋ 금방 가께" },
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-10-31T22:14",
        "text": { "older": "{player} 선배, 내일 합주 12시 맞지??", "default": "내일 합주 12시 맞지??" }
      },
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-10-31T22:14",
        "text": { "older": "또 늦으면 선배 솔로 내가 부른다 ㅋㅋ", "default": "또 늦으면 니 솔로 내가 부른다 ㅋㅋ" }
      },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-10-31T22:16",
        "text": { "default": "12시 맞아. 안 늦어" }
      },
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-10-31T22:17",
        "text": "저녁은 먹구 연습하는 거지???"
      },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-10-31T22:19",
        "text": { "default": "이제 먹으려고" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-10-31T22:19", "text": "이 시간에?? 진짜로??" },
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-10-31T22:20",
        "text": "기타 치다 쓰러지면 또또 나만 곤란하고 합주 다 엎어지고 공연 망하고 ㅋㅋ 쫌 챙기라"
      },
      {
        "thread": "dm_vocal", "from": "vocal", "at": "2026-11-01T11:24",
        "text": { "older": "선배 합주실 오구 있어??", "default": "합주실 오구 있어??" }
      },
      {
        "thread": "dm_vocal", "from": "player", "at": "2026-11-01T11:26",
        "text": { "default": "가는 중. 안 늦어" }
      },
      { "thread": "dm_vocal", "from": "vocal", "at": "2026-11-01T11:27", "text": "오늘은 믿어본다 ㅋㅋ" },

      { "thread": "group_band", "from": "vocal", "at": "2026-10-10T16:09", "text": "엠티 왔으면 사진 좀 올리라 ㅋㅋㅋ 기록 남겨야지" },
      { "thread": "group_band", "from": "player", "at": "2026-10-10T16:11", "image": "assets/photos/mt_river.jpg" },
      { "thread": "group_band", "from": "drum", "at": "2026-10-10T16:12", "text": "아니 이거 뭐 잡는 거예요 ㅋㅋㅋㅋ" },
      { "thread": "group_band", "from": "bass", "at": "2026-10-10T16:12", "text": "진심 한 마리도 안 잡힘 ㅋㅋ" },
      { "thread": "group_band", "from": "vocal", "at": "2026-10-10T16:14", "text": "물고기들이 우리 보고 다 도망감 ㅋㅋㅋㅋ" },
      { "thread": "group_band", "from": "vocal", "at": "2026-10-10T21:04", "text": "다들 집 잘 들어갔나??" },
      { "thread": "group_band", "from": "drum", "at": "2026-10-10T21:05", "text": "넵!! 오늘 개재밌었어요 다음 엠티도 ㄱㄱ" },
      { "thread": "group_band", "from": "bass", "at": "2026-10-10T21:06", "text": "뭔 다음 엠티를 벌써 얘기하냐 ㅋㅋ" },

      {
        "thread": "group_band", "from": "player", "at": "2026-06-29T11:43",
        "text": { "younger": "지훈 선배 준규 선배 보고 오느라 30분 정도 늦는대", "default": "지훈이 준규 보고 오느라 30분 정도 늦는대" }
      },
      {
        "thread": "group_band", "from": "drum", "at": "2026-06-29T11:44",
        "text": { "older": "넵!! 알겠습니다", "default": "오키 알겠어!!" }
      },
      { "thread": "group_band", "from": "bass", "at": "2026-06-29T11:45", "text": "ㅇㅋ 그럼 먼저 맞추고 있으면 되겠네" },

      { "thread": "group_band", "from": "vocal", "at": "2026-10-31T20:02", "text": "내일 합주 12시다 늦는 사람 꿈에 찾아가서 지구 끝까지 쫓아갈 줄 알아라" },
      { "thread": "group_band", "from": "drum", "at": "2026-10-31T20:03", "text": "넵!! 스틱 챙겨갑니다" },
      { "thread": "group_band", "from": "bass", "at": "2026-10-31T20:04", "text": "그걸 왜 말하고 있냐 ㅋㅋ" },
      { "thread": "group_band", "from": "vocal", "at": "2026-10-31T20:05", "text": "정우 니 저번에 스틱 없이 와서 젓가락으로 칠 뻔했잖아 ㅋㅋㅋ" },
      { "thread": "group_band", "from": "drum", "at": "2026-10-31T20:05", "text": "아 그건 진짜 사고였다니까요 ㅠㅠ" },

      { "thread": "group_band", "from": "vocal", "at": "2026-11-01T14:51", "text": "오늘 다들 고생했어 ㅋㅋ 진짜로", "unread": true },
      { "thread": "group_band", "from": "drum", "at": "2026-11-01T14:52", "text": "마지막 합주 끝!!! 다들 수고하셨습니다 ㅋㅋㅋ", "unread": true },
      { "thread": "group_band", "from": "bass", "at": "2026-11-01T14:53", "text": "내일 공연인거 진심 미쳤네 ㄹㅇ", "unread": true },
      {
        "thread": "group_band", "from": "drum", "at": "2026-11-01T14:55", "unread": true,
        "text": { "older": "{player} 선배 오늘 기타 톤 개좋던데요", "default": "{player} 오늘 기타 톤 개좋더라" }
      }
    ],
    "calls": [
      { "from": "mom", "at": "2026-10-20T20:03", "status": "answered", "minutes": 9 },
      { "from": "dad", "at": "2026-10-22T08:41", "status": "answered", "minutes": 2 },
      { "from": "mom", "at": "2026-10-24T12:30", "status": "declined" },
      { "from": "mom", "at": "2026-10-24T18:06", "status": "answered", "minutes": 14 },
      { "from": "dad", "at": "2026-10-27T18:02", "status": "missed" },
      { "from": "dad", "at": "2026-10-27T21:15", "status": "answered", "minutes": 3 },
      { "from": "mom", "at": "2026-10-28T09:15", "status": "answered", "minutes": 3 },
      { "from": "dad", "at": "2026-10-29T19:15", "status": "answered", "minutes": 4 },
      { "from": "mom", "at": "2026-10-30T21:47", "status": "answered", "minutes": 8 },
      { "from": "mom", "at": "2026-10-31T18:12", "status": "answered", "minutes": 11 },
      { "from": "vocal", "at": "2026-10-31T20:40", "status": "answered", "minutes": 7 },
      { "from": "dad", "at": "2026-11-01T09:02", "status": "answered", "minutes": 2 },
      { "from": "mom", "at": "2026-11-01T13:20", "status": "missed" }
    ],
    "photos": [
      { "id": "cherry", "image": "assets/photos/cherry.jpg", "caption": "벚꽃", "at": "2026-04-04T17:40" },
      { "id": "yakgwa", "image": "assets/photos/yakgwa.jpg", "caption": "약과 사재기", "at": "2026-04-18T15:12" },
      { "id": "tree", "image": "assets/photos/tree.jpg", "caption": "산책", "at": "2026-05-24T13:05" },
      { "id": "coffee", "image": "assets/photos/coffee.jpg", "caption": "커피", "at": "2026-07-11T11:20" },
      { "id": "street", "image": "assets/photos/street.jpg", "caption": "길에서 갑자기", "at": "2026-08-22T21:37" },
      { "id": "rock", "image": "assets/photos/rock.jpg", "caption": "ROCK", "at": "2026-09-05T22:18" },
      { "id": "tile_flower", "image": "assets/photos/tile_flower.jpg", "caption": "벽 낙서", "at": "2026-09-19T16:42" },
      { "id": "headphones_orange", "image": "assets/photos/headphones_orange.jpg", "caption": "귤도 음악 듣는 중", "at": "2026-10-03T14:26" },
      { "id": "mt_river", "image": "assets/photos/mt_river.jpg", "caption": "엠티", "at": "2026-10-10T16:11" },
      { "id": "jihoon_hood", "image": "assets/photos/jihoon_daily_4.jpg", "caption": "지훈", "at": "2026-10-17T14:20" }
    ],
    "notes": [
      {
        "id": "setlist",
        "title": "셋리스트",
        "body": "1. Shock\n2. Smells Like Teen Spirit\n3. Back In Black\n4. Highway to Hell\n5. Don't Stop Believin'\n\n솔로 들어가는 타이밍 체크하기",
        "at": "2026-10-30T23:10"
      },
      {
        "id": "gig_checklist",
        "title": "공연 날 챙길 것",
        "body": "기타, 여분 줄 1세트\n피크 넉넉하게\n튜너, 케이블 2개\n페달 전원 어댑터\n스트랩 락\n\n나가기 전에 한 번 더 확인",
        "at": "2026-11-01T00:42"
      },
      {
        "id": "tone",
        "title": "기타 톤 세팅",
        "body": "게인 5 / 베이스 6 / 미들 7 / 트레블 5\n리버브는 살짝만\n솔로 때 부스터 켜기\n\n공연장 앰프가 다르니까 리허설 때 다시 잡기",
        "at": "2026-10-29T22:05"
      },
      {
        "id": "practice",
        "title": "연습할 것",
        "body": "Smells Like Teen Spirit 인트로 박자 자꾸 밀림\n메트로놈 80부터 천천히 올리기\n\nBack In Black 리프 피킹 너무 세게 하지 말기\nDon't Stop Believin' 솔로 손가락 꼬임",
        "at": "2026-10-24T01:17"
      },
      {
        "id": "strings",
        "title": "줄 교체",
        "body": "10-46 게이지로 교체함\n공연 이틀 전에 한 번 더 갈기\n새 줄은 튜닝 자주 확인하기",
        "at": "2026-10-12T19:33"
      },
      {
        "id": "song_idea",
        "title": "곡 아이디어",
        "body": "자작곡 코드\nAm - F - C - G\n\n후렴 마지막에 G 대신 Em 넣어보기\n녹음해서 단톡에 올리기",
        "at": "2026-09-14T00:28"
      }
    ],
    "snsStories": [
      { "id": "story_seed_band", "account": "band", "image": "assets/photos/poster.webp", "text": "D-1", "at": "2026-11-01T10:00" },
      { "id": "story_seed_band_soldout", "account": "band", "image": "assets/photos/rehearsal_soldout.webp", "at": "2026-11-01T14:30" },
      { "id": "story_seed_vocal_selfie", "account": "vocal", "image": "assets/photos/jihoon_selfie.jpg", "at": "2026-11-01T11:18" },
      { "id": "story_seed_bass", "account": "bass", "image": "assets/photos/haruto_mirror.jpg", "text": "내일 공연 ㄱㄱ", "textLook": "dark-top-right", "at": "2026-11-01T11:42" }
    ],
    "snsPosts": [
      {
        "id": "my_sky_post",
        "account": "player",
        "image": "assets/photos/sky.jpg",
        "caption": "오늘 하늘 뭐야",
        "likes": 23,
        "at": "2026-10-26T14:30",
        "comments": [
          { "account": "vocal", "text": "연습은 안 하고 하늘이나 보고 있음? ㅋㅋㅋ" },
          { "account": "drum", "text": "오 하늘 대박" }
        ]
      },
      {
        "id": "vocal_spring_post",
        "account": "vocal",
        "image": "assets/photos/jihoon_spring_1.jpg",
        "images": [
          "assets/photos/jihoon_spring_1.jpg",
          "assets/photos/jihoon_spring_2.jpg",
          "assets/photos/jihoon_spring_3.jpg",
          "assets/photos/jihoon_spring_4.jpg"
        ],
        "caption": "봄이 왔나 봄",
        "likes": 48,
        "at": "2026-04-12T15:20"
      },
      {
        "id": "vocal_daily_post",
        "account": "vocal",
        "image": "assets/photos/jihoon_daily_1.jpg",
        "images": [
          "assets/photos/jihoon_daily_1.jpg",
          "assets/photos/jihoon_daily_2.jpg",
          "assets/photos/rock.jpg",
          "assets/photos/jihoon_daily_4.jpg"
        ],
        "caption": "요즘 일상",
        "likes": 57,
        "at": "2026-10-18T21:40",
        "comments": [
          { "account": "drum", "text": "형 요즘 왜 이렇게 얼굴 좋아 보여요??" },
          { "account": "player", "text": { "default": "마지막 사진 누가 찍어줬길래 이렇게 잘 나왔어? ^^" } }
        ]
      }
    ]
  },
  "scenes": [
    {
      "id": "d1_evening_first",
      "chapter": "D-1",
      "steps": [
        { "type": "message", "thread": "group_band", "from": "vocal", "text": "정우 니 오늘 마지막 곡 왜 그랬노 ㅋㅋㅋ 드럼 혼자 딴 노래 치던데" },
        { "type": "message", "thread": "group_band", "from": "bass", "text": "너 두 번 틀렸잖아 ㅋㅋ" },
        { "type": "message", "thread": "group_band", "from": "drum", "text": "아니 세 번임 ㅋㅋㅋㅋ" },
        { "type": "message", "thread": "group_band", "from": "vocal", "text": "그걸 자랑이라고 하나 ㅋㅋㅋ" },
        { "type": "message", "thread": "group_band", "from": "vocal", "text": "아 맞다 다들 봤냐?? 내일 공연 매진임" },
        { "type": "message", "thread": "group_band", "from": "drum", "text": "헐 진짜요??? 개쩐다" },
        { "type": "message", "thread": "group_band", "from": "bass", "text": "진심 미쳤다야" },
        {
          "type": "sns_post",
          "id": "poster_d1",
          "account": "band",
          "image": "assets/photos/poster.webp",
          "caption": "내일 저녁 7시, 루비 라이엇 첫 공연. 와주세요.",
          "likes": 42,
          "comments": [
            { "account": "vocal", "text": "다들 온나 ㅋㅋ" },
            { "handle": "hongdae_gigs", "text": "갑니다!!" }
          ],
          "interactions": {
            "like": { "effects": [{ "add": "band", "value": 1 }] },
            "commentOptions": [
              {
                "text": { "default": "내일 우리 잘할 수 있겠지?" },
                "effects": [{ "add": "band", "value": 1 }]
              },
              {
                "text": { "younger": "근데 지훈 선배도 좀 멋있긴 했어 ㅋㅋ", "default": "근데 보컬도 좀 멋있긴 했어 ㅋㅋ" },
                "effects": [{ "add": "crush", "value": 1 }]
              }
            ]
          }
        },
        {
          "type": "choice",
          "thread": "dm_vocal",
          "options": [
            {
              "text": { "younger": "오늘 선배 목소리 좋던데? ㅋㅋ", "default": "오늘 목소리 좋던데? ㅋㅋ" },
              "effects": [{ "add": "crush", "value": 2 }, { "set": "flags.voiceFirst", "value": true }],
              "steps": [
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "뭐고 갑자기 ㅋㅋ" },
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "뭐 잘못 묵었나" }
              ]
            },
            {
              "text": { "default": "오늘 2절 리프 들어가는 타이밍 잘 맞지 않았어?" },
              "effects": [{ "add": "band", "value": 2 }],
              "steps": [
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "안 그래도 그 얘기 하려고 했음" },
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "오늘 거기 진짜 소름 돋더라" },
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "내일도 딱 그대로만 가자 ㅋㅋ" }
              ]
            }
          ]
        },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 4, "text": { "older": "근데 선배 지금 어디고", "default": "근데 니 지금 어디고" } },
        {
          "type": "choice",
          "thread": "dm_vocal",
          "options": [
            {
              "text": "알려주면 데릴러오나~~??",
              "effects": [{ "add": "crush", "value": 1 }],
              "steps": [
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "ㅋㅋㅋ 뭐라노" },
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "밥이나 챙겨 묵고 들어가라" }
              ]
            },
            {
              "text": { "default": "합주실. 솔로 좀 더 치고 갈게" },
              "effects": [{ "add": "band", "value": 1 }],
              "steps": [
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "연습벌레 다 됐네 ㅋㅋ" },
                { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "손가락 아끼라~ 내일 공연이잖아" }
              ]
            }
          ]
        },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 3, "text": "아 맞다 셋리스트 또 바꿈 ㅋㅋ" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "image": "assets/photos/setlist.webp" },
        { "type": "photo", "id": "setlist_memo", "image": "assets/photos/setlist.webp", "caption": "셋리스트 메모" },
        {
          "type": "note",
          "id": "setlist",
          "title": "셋리스트",
          "body": "1. Shock\n2. Smells Like Teen Spirit\n3. Highway to Hell\n4. Back In Black\n5. Don't Stop Believin'\n\n지훈이가 3, 4번 순서 또 바꿈\n5번 2절 크게!!\n솔로 들어가는 타이밍 체크하기"
        }
      ],
      "next": "d1_evening"
    },
    {
      "id": "d1_evening",
      "chapter": "D-1",
      "steps": [
        { "type": "message", "thread": "group_band", "from": "vocal", "minutes": 8, "text": "다들 밥은 묵었나~" },
        { "type": "message", "thread": "group_band", "from": "drum", "text": "아직이요 ㅋㅋㅋ" },
        { "type": "message", "thread": "group_band", "from": "bass", "text": "저도요 배고파 죽겠음" },
        { "type": "message", "thread": "group_band", "from": "vocal", "text": "내일 늦으면 벌금에서 안 끝난다 ㅋㅋ 알제?" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "at": "2026-11-02T02:00", "text": { "older": "선배 지금 바빠?", "default": "지금 바빠?" } }
      ],
      "next": "d1_late_night"
    },
    {
      "id": "d1_late_night",
      "chapter": "D-1",
      "steps": [
        { "type": "choice", "thread": "dm_vocal", "options": [ { "text": { "default": "아니. 왜?" }, "effects": [{ "set": "flags.answeredCall", "value": true }], "steps": [
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "아니 별건 아니고" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "락은 진짜 신기한 거 같아" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "고막 터질 것처럼 시끄러운데 듣고 있으면 오히려 머리가 조용해져" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "그게 나한텐 세상에서 제일 위로가 되더라" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나는 음악이 너~~무 좋다" },
              {
                "type": "choice", "thread": "dm_vocal",
                "options": [
                  {
                    "text": { "default": "나도 음악이 너무 좋아... 음악은 새삼 큰 힘이 있는 것 같아." },
                    "effects": [{ "add": "band", "value": 2 }],
                    "steps": [
                      { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "ㅋㅋ 역시 뭘 좀 아네" }
                    ]
                  },
                  {
                    "text": { "younger": "선배 같은 사람이 음악 해야지 누가 해 선배 노래 오래오래 듣고 싶어", "default": "너 같은 애가 음악 해야지 누가 하냐 네 목소리로 노래 오래오래 듣고 싶어" },
                    "send": [
                      { "younger": "선배 같은 사람이 음악 해야지 누가 해", "default": "너 같은 애가 음악 해야지 누가 하냐" },
                      { "younger": "선배 노래 오래오래 듣고 싶어", "default": "네 목소리로 노래 오래오래 듣고 싶어" }
                    ],
                    "effects": [{ "add": "crush", "value": 2 }, { "set": "flags.voiceNight", "value": true }],
                    "steps": [
                      { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "진짜??" },
                      { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "ㅋㅋ 고맙긴 한데" },
                      { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "아직 그런 말 들을 만큼은 아닌 것 같아" }
                    ]
                  }
                ]
              },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나는 있잖아" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나 믿어주는 사람들한테 부끄럽지 않은 보컬이 되고 싶어" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "지금보다 더 노력하고 더 잘해져서" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "기대해준 만큼은 꼭 보여주고 싶다" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "마흔 돼도 쪼끄만 클럽에서 목 쉬도록 소리 지르고 있으면 좋겠고~" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "이런 얘기 처음 하는데 웃고 있는 거 아니지? ㅋㅋ" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "선배 꿈은 뭔데", "default": "니 꿈은 뭔데" } },
              {
                "type": "choice", "thread": "dm_vocal",
                "options": [
                  {
                    "text": { "default": "음.. 우리 노래 따라 불러주는 사람들 앞에서 솔로 한 번 쳐보기? 크진 않아도 오래 가는 밴드였으면 좋겠어" },
                    "effects": [{ "add": "band", "value": 2 }],
                    "steps": [
                      { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "좋다 그거" },
                      { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "진짜 그렇게 되면 좋겠다" }
                    ]
                  },
                  {
                    "text": { "younger": "음.. 지금처럼 선배 옆에서 계속 기타 치는 거? ㅋㅋ", "default": "음.. 지금처럼 옆에서 계속 기타 치는 거? ㅋㅋ" },
                    "effects": [{ "add": "crush", "value": 2 }],
                    "steps": [
                      { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "꿈이 왜 이렇게 작노 ㅋㅋ" },
                      { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "그래도 좋네" }
                    ]
                  }
                ]
              },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "아 이제 좀 살 것 같다~ 속이 다 시원하네" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "내일 내 소리 안 나오면 선배가 기타로 메워라 ㅋㅋ", "default": "내일 내 소리 안 나오면 니가 기타로 메워라 ㅋㅋ" } },
              {
                "type": "choice", "thread": "dm_vocal",
                "options": [
                  { "text": { "default": "당연하지 ㅋㅋ" } }
                ]
              },
              {
                "type": "call", "from": "vocal", "minutes": 4, "audio": "assets/audio/jihoon_call.m4a",
                "onAnswer": { "steps": [
                  { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 1, "text": "긴장돼서 잠 안 와서 잠깐 목소리라도 들으려고 전화했다 ㅋㅋ" },
                  { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "내일 보자~ 늦지 말고 ㅋㅋ" },
                  { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나 먼저 자께" },
                  { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "얼른 자~~", "default": "얼른 자~~" } }
                ] },
                "onDecline": { "effects": [{ "add": "crush", "value": -2 }], "steps": [
                  { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 1, "text": "벌써 자나보네ㅜ" },
                  { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나도 자께" }
                ] }
              }
            ] }, { "text": { "default": "이제 좀 쉬려고" }, "steps": [ { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 12, "text": "그래 푹 쉬어~~" }, { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "내일 늦지 말구~~" } ] } ] }
      ],
      "next": "d0_postshow"
    },
    {
      "id": "d0_postshow",
      "chapter": "D-DAY",
      "steps": [
        {
          "type": "timeskip",
          "to": "2026-11-02T22:30",
          "arrivals": [
            { "type": "sns_story", "id": "story_today", "account": "band", "image": "assets/photos/poster.webp", "text": "오늘 밤 7시", "at": "2026-11-02T08:10" },
            { "type": "message", "thread": "group_band", "from": "vocal", "text": "끝났어", "at": "2026-11-02T20:40" },
            { "type": "message", "thread": "group_band", "from": "drum", "text": "끝났어요!!!!! 우리 개잘한 듯 ㅋㅋㅋㅋ", "at": "2026-11-02T20:41" },
            { "type": "message", "thread": "group_band", "from": "bass", "text": "미쳤다 진짜 미쳤다", "at": "2026-11-02T20:42" },
            { "type": "sns_story", "id": "story_after_me", "account": "band", "image": "assets/photos/concert.jpg", "text": "첫 공연 끝", "at": "2026-11-02T20:47" },
            {
              "type": "sns_post",
              "id": "review_show",
              "account": "band",
              "image": "assets/photos/review.webp",
              "caption": "첫 공연 끝났습니다. 와주신 분들 전부 감사합니다.",
              "likes": 87,
              "comments": [
                { "handle": "hongdae_gigs", "text": "마지막 곡 아직도 귀에 남아요" },
                { "account": "vocal", "text": "와줘서 고마워 진짜 ㅜㅜ" }
              ],
              "interactions": {
                "like": { "effects": [{ "add": "band", "value": 1 }] },
                "commentOptions": [
                  { "text": { "default": "다음 공연도 얼른 하자 ㅋㅋ" }, "effects": [{ "add": "band", "value": 1 }] },
                  { "text": { "younger": "오늘 지훈 선배 좀 멋있던데 ㅋㅋ", "default": "오늘 보컬 좀 멋있던데 ㅋㅋ" }, "effects": [{ "add": "crush", "value": 1 }] }
                ]
              },
              "at": "2026-11-02T20:58"
            }
          ]
        },
        { "type": "message", "thread": "group_band", "from": "vocal", "text": "오늘 다들 진짜 잘했음" },
        { "type": "message", "thread": "group_band", "from": "vocal", "text": "내 완전 함성에 떠내려가서 귀 떨어져나가는 줄 알았어" },
        { "type": "message", "thread": "group_band", "from": "drum", "text": { "older": "{player} 선배 솔로 개소름이었어요 ㄹㅇ", "default": "{player} 솔로 개소름이었음 ㄹㅇ" } },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "후기 올라왔던데 봤나?? 반응 장난 아님" },
        {
          "type": "sns_post", "id": "concert_post", "account": "band", "image": "assets/photos/concert.jpg",
          "caption": "오늘 무대 위 한 장 📸", "likes": 64,
          "comments": [{ "account": "drum", "text": "지훈이형 넘어가는 거 뭐예요 ㅋㅋㅋㅋ" }]
        },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 4, "text": "사진 봐라 ㅋㅋ 내 왜 저렇게 넘어가 있노" }
      ],
      "next": "d0_night"
    },
    {
      "id": "d0_night",
      "chapter": "D-DAY",
      "steps": [
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "오늘 진짜 끝났네 .." },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "아직도 귀가 웅웅거림 ㅜ" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "오늘 어땠노" },
        {
          "type": "text_reply",
          "thread": "dm_vocal",
          "routes": [
            { "pattern": "목소리|팬", "when": { "all": [{ "var": "flags.voiceFirst", "eq": true }, { "var": "flags.voiceNight", "eq": true }] }, "effects": [{ "set": "flags.fan", "value": true }], "ending": "fan", "next": "end_fan", "steps": [] }
          ],
          "otherwise": { "steps": [{ "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "그랬구나" }] }
        },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "근데" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "오늘 선배 덕분에 끝까지 불렀어", "default": "오늘 {player} 덕분에 끝까지 불렀어" } },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "이런 말 잘 안 하는데 ㅋㅋ" },
        {
          "type": "choice",
          "thread": "dm_vocal",
          "options": [
            {
              "text": { "default": "나야말로 힘이 될 수 있어서 너무 다행이야" },
              "effects": [{ "add": "crush", "value": 2 }, { "set": "flags.approachedAtNight", "value": true }]
            },
            {
              "text": { "default": "다음 공연도 얼른 잡자 ㅋㅋ 오늘 같은 무대 또 하고 싶어" },
              "effects": [{ "add": "band", "value": 2 }]
            },
            {
              "text": { "default": "오늘 진짜 고생 많았어~ 푹 자" }
            }
          ]
        },
        { "type": "ending" }
      ]
    },
    {
      "id": "end_confession",
      "chapter": "엔딩",
      "steps": [
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 5, "text": "음.. 있잖아.. 진짜 용기내서 하는 말인데..." },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 3, "text": { "older": "나 {player} 선배 쫌 좋아하는 것 같아", "default": "나 {player} 쫌 좋아하는 것 같아" } },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "선배는 어떤데", "default": "니는 어떤데" } },
        {
          "type": "text_reply",
          "thread": "dm_vocal",
          "routes": [
            { "pattern": "팬\\s*(이|할|하고|될|됐|해)", "when": { "all": [{ "var": "flags.voiceFirst", "eq": true }, { "var": "flags.voiceNight", "eq": true }] }, "effects": [{ "set": "flags.fan", "value": true }], "ending": "fan", "next": "end_fan", "steps": [] },
            { "pattern": "좋|조아|사랑|나도|응|웅|ㅇㅇ|그래|당연|콜|사귀|설레|기뻐|행복|♥|❤|💕|하트|ㅎㅎ|헤헤|히히", "exclude": "안\\s*(좋|사랑)|(좋|사랑)\\S*\\s*않|못\\s*(좋|사랑)|싫|미안|친구로|모르겠|글쎄|별로|아직", "steps": [
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "아 진짜??" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나 지금 혼자 방에서 웃고 있어" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "내일 합주실 앞에서 보자~~" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "오늘은 따뜻하게 하고 자구" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "잘 자 {player} 선배", "default": "잘 자 {player}" } },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나도 자러 가께~~" }
          ] },
            { "pattern": "안\\s*(좋|사랑)|(좋|사랑)\\S*\\s*않|못\\s*(좋|사랑)|싫|미안|친구\\s*(로|사이)|아니|안\\s*돼|별로|모르겠|글쎄|잘\\s*모르|생각\\s*(해\\s*볼|좀|할)|부담|ㄴㄴ|노노|거절|아직|그런\\s*(사이|거)", "ending": "lingering", "next": "end_lingering_after_confession", "steps": [] }
          ],
          "otherwise": { "steps": [
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "아 진짜??" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나 지금 혼자 방에서 웃고 있어" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "내일 합주실 앞에서 보자~~" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "오늘은 따뜻하게 하고 자구" },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "잘 자 {player} 선배", "default": "잘 자 {player}" } },
              { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나도 자러 가께~~" }
          ] }
        },
        { "type": "timeskip", "to": "2026-11-03T15:00" },
        { "type": "rename", "character": "vocal", "thread": "dm_vocal", "name": "❤️🖤" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "{player} 선배", "default": "{player}" } },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "우리 합주 끝나고 놀러가장 히히" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "대놓고 톡 보지 말구" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "애들 눈치 채면 어떡해 ㅋㅋ" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "모 하구 놀까?" },
        {
          "type": "sns_post",
          "id": "vocal_after_confession",
          "account": "vocal",
          "image": "assets/photos/vocal_after_confession.jpg",
          "caption": "같은 밴드 부원을 사귀면 좋은 점",
          "likes": 64,
          "comments": [{ "handle": "hongdae_gigs", "text": "그래서 좋은 점이 뭔데요??" }]
        }
      ]
    },
    {
      "id": "end_bandmates",
      "chapter": "엔딩",
      "steps": [
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "ㅋㅋㅋ 역시" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": { "older": "선배 진짜 못 말림 ㅋㅋ", "default": "니 진짜 못 말림 ㅋㅋ" } },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "오늘 솔로 들어갈 때 소름 돋아서 죽는 줄 알았잖아 ㅜㅜ" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "우리 오래 하장" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "이건 진지해" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "다음 합주 언제 돼??? 벌써 하구 싶당" },
        {
          "type": "sns_post",
          "id": "vocal_after_bandmates",
          "account": "vocal",
          "image": "assets/photos/mic.jpg",
          "caption": "최고의 기타, 최고의 밴드. 다음 공연도 보러 온나",
          "likes": 71,
          "comments": [{ "handle": "hongdae_gigs", "text": "다음 공연 언제예요!!" }]
        }
      ]
    },
    {
      "id": "end_fan",
      "chapter": "엔딩",
      "steps": [
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 4, "text": { "older": "선배 진짜 내 팬이나 ㅋㅋㅋ", "default": "니 진짜 내 팬이나 ㅋㅋㅋ" } },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "같은 밴드끼리 무슨 팬이고" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "근데 고맙다" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "1호 팬으로 받아줄게" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나 먼저 자께" },
        {
          "type": "sns_post",
          "id": "vocal_after_fan",
          "account": "vocal",
          "image": "assets/photos/mic.jpg",
          "caption": "1호 팬 생김",
          "likes": 58,
          "comments": [{ "handle": "hongdae_gigs", "text": "2호 팬 신청합니다" }]
        },
        { "type": "blog_post", "post": "blog_future_fan" },
        { "type": "read", "app": "blog" }
      ]
    },
    {
      "id": "end_lingering_after_confession",
      "chapter": "엔딩",
      "steps": [
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 4, "text": "아 그런가 ㅋㅋ" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 5, "text": "아니다 내가 괜히 그랬음 ㅜ" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "내일 얘기하자" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나 먼저 자께" },
        {
          "type": "sns_post",
          "id": "vocal_after_lingering",
          "account": "vocal",
          "image": "assets/photos/mic.jpg",
          "caption": "하려던 말은 내일로",
          "likes": 49,
          "comments": [{ "handle": "hongdae_gigs", "text": "무슨 말이요...?" }]
        }
      ]
    },
    {
      "id": "end_lingering",
      "chapter": "엔딩",
      "steps": [
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 4, "text": "있잖아" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "내가 오늘" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "minutes": 9, "text": "아니다" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "오늘 말고" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "내일 얘기하자" },
        { "type": "message", "thread": "dm_vocal", "from": "vocal", "text": "나 먼저 자께" },
        {
          "type": "sns_post",
          "id": "vocal_after_lingering",
          "account": "vocal",
          "image": "assets/photos/mic.jpg",
          "caption": "하려던 말은 내일로",
          "likes": 49,
          "comments": [{ "handle": "hongdae_gigs", "text": "무슨 말이요...?" }]
        }
      ]
    }
  ],
  "endings": [
    {
      "id": "fan",
      "title": "히든 엔딩: 1호 팬", "emoji": "👊", "holdMs": 4000,
      "when": { "all": [{ "var": "flags.voiceFirst", "eq": true }, { "var": "flags.voiceNight", "eq": true }, { "var": "flags.fan", "eq": true }] },
      "scene": "end_fan"
    },
    {
      "id": "confession",
      "title": "고백 엔딩", "emoji": "❤️",
      "when": { "all": [
        { "diff": ["crush", "band"], "gte": { "config": "endingMargin" } },
        { "var": "flags.answeredCall", "eq": true },
        { "var": "flags.approachedAtNight", "eq": true }
      ] },
      "scene": "end_confession"
    },
    {
      "id": "bandmates",
      "title": "끈끈한 밴드 동료 엔딩", "emoji": "🎸",
      "when": { "diff": ["band", "crush"], "gte": { "config": "endingMargin" } },
      "scene": "end_bandmates"
    },
    {
      "id": "lingering",
      "title": "여운이 남는 엔딩", "emoji": "💭",
      "when": { "always": true },
      "scene": "end_lingering"
    }
  ]
}
