"맞이의 방"이라는 이름이 화면에서 아무 일도 하지 않는다는 감독 진단에 대한 답. 맞이를 사건으로 정의하고, 그 사건의 DB 한 행을 지목하고, 화면을 목록이 아니라 사건의 그릇으로 다시 그린다. 목업만 — 코드 변경 없음.
사랑방에서 반드시 일어나야 할 단 하나의 사건
교회가 한 사람의 이름을 부른다.
이 사건의 DB 한 행 — 오늘 가능: 교역자가 새 사랑방에서 윤재권을 고르고 첫 문장을 보내면 public.messages에 한 행이 선다(post_message RPC · 라이브). 부를 이름은 org_today_reach(000199 · 라이브)가 이미 대주고 있다 — 새로 온 분·생일·오래 조용한 분 하루 셋. 자동 발송은 없다. 이름은 시스템이 대고, 말은 사람이 건다.
전제 확인부터 — 2차 처방(맞이의 방·읽음은 위로만·척추 카드 철거)은 유지한다. 이 문서는 그 위에 세 가지를 더한다: 사건의 지목, 화면의 사건화, 그리고 읽음 0의 판정.
① 단 하나의 사건 — 왜 "부름"인가
광장의 사건은 익명이라야 가능한 발화였고, 성소의 사건은 한 사람의 무릎이었다. 사랑방은 이름으로 맞아주는 방이므로, 사건은 이름에서 시작해야 한다 — 교회가 한 사람의 이름을 부른다. 다른 후보를 다 재봤다: "성도의 말이 읽힌다"는 성도가 먼저 말을 맡겨야 성립하고(실측: 자발 발화는 기도 요청 3건뿐), "대화가 오간다"는 카톡의 사건이지 사랑방의 사건이 아니다. 부름만이 실사용 0에서도 오늘 일으킬 수 있는 사건이다 — 일으키는 손이 조직 쪽에 있기 때문이다.
그리고 부름은 사슬의 첫 고리다. 아래 사슬의 나머지 전부가 이 한 행에서 자동으로 딸려 나온다 — 성도는 아무것도 새로 배울 필요가 없다.
1 · 부름
교회가 이름을 부른다
messages ← post_message
사람의 첫 부름 행 아직 없음
2 · 열람
성도가 방을 연다
message_thread_members.last_read_at ← mark_thread_read
자동 · 라이브 (오늘 5방 1명)
3 · 응답
답 한 줄 · 🙏 · 카드 회신
messages · message_reactions
경로 라이브 (리액션 0행)
4 · 읽으심
내 말이 가 닿았다
상대 last_read_at 를 성도가 본다
라이브 (1:1 한정·긍정형만)
5 · 기록
방이 관계 한 권이 된다
messages 의 누적 (행은 이미 있음)
화면이 아직 안 보여줌
② 첫 말은 누가 짓는가 — 사건이 말을 만들고, 문장은 우벨이 거들고, 전송은 손이다
광장의 "오늘의 물음"과 구조는 같다 — 첫 말을 사용자가 짓지 않게 한다. 장치만 다르다: 광장은 익명이 문턱을 내렸고, 사랑방은 사건이 문턱을 내린다. 새로 옴·생일·오래 조용함은 이미 일어난 사건이라 첫 문장의 재료가 공짜다 — "재권님, 양림의 가족이 되신 걸 환영해요"는 창작이 아니라 사실의 낭독이다. org_today_reach가 그 사건 셋을 매일 목회자 책상에 올려놓는 것까지 라이브다.
우벨이 대신 말해주는가? 문장 초안까지만. 누르면 초안이 담긴 작성 화면이 열리고, 고치고, 보내는 것은 목사의 손이다 — 개통 각본의 "첫 접촉은 사람"이 이 화면의 헌법이다. 그리고 성도의 첫 말은 작문이 아니라 응답이다: 답장 한 줄, 🙏 한 번, 투표 카드 회신 — 전부 부름이 있어야 존재할 수 있는 말들이고, 전부 이미 지어져 있다.
③ 읽음 0은 기능인가 이유인가 — 판정: 셋이 겹쳐 있고, 메울 수 있다
첫째 겹 — 측정 착시(기능). 실측된 message_receipts는 000025가 짓고 아무 코드도 쓰지 않는 죽은 표다 — 앱·RPC 전수 검색에 쓰기 경로가 없다. 저 표의 0은 영원히 0이다. 산 표는 따로 있다: message_thread_members.last_read_at(mark_thread_read가 방을 여는 순간 자동 기록·라이브). 관리자 광고의 읽음 표가 멀쩡한 것과 같은 이치로, 사람 대화의 읽음 기계도 멀쩡하다.
둘째 겹 — 진짜 구멍(이유). 산 표를 재도 참담하다: 커서를 남긴 사람이 단 한 명이다. 그런데 이 구멍의 이름은 "읽을 이유의 부재"가 아니라 "열 방의 부재"다 — 읽음은 성도가 만들려고 마음먹는 물건이 아니라 방을 여는 순간 생기는 부산물이고, 방을 열게 하는 것은 도착이다. 도착 0 → 열람 0 → 읽음 0. 사슬의 죽은 고리는 2가 아니라 1이다.
셋째 겹 — 값어치의 방향. 성도에게 자기가 만드는 읽음은 값이 없다(만드는 줄도 모른다 — 그래서 좋다). 성도가 받는 읽음이 값이다: 내가 맡긴 기도 제목에 돌아오는 읽으심. 그 값은 말을 맡긴 성도에게만 생기고, 말을 맡기는 일은 부름에 대한 응답으로만 시작된다.
판정 — 구멍은 메워진다. 단, 읽음 기능을 고쳐서가 아니라 ①의 사건을 일으켜서. 창끝("단톡방은 읽음을 모른다")은 부러지지 않았다 — 다만 창끝은 부름 뒤에만 찌를 수 있다. 부수 판정 하나: 죽은 표는 언젠가 지워야 한다(문서 끝 잔무).
④ 카톡을 대체하지 않는다면 사랑방은 무엇인가 — 관계의 기록
감독의 감이 맞다. 단톡방은 강이라 흐르고 잊는다 — 3년 전 병상에서 받은 위로도, 아직 한 번도 말을 걸어보지 못한 사람이 누구인지도 카톡은 모른다. 우벨만이 명부(313)와 말(15)을 같은 DB에 가진 자리라서, 카톡이 영영 못 답하는 두 질문에 답할 수 있다: "누구와 아직 한 번도 말하지 않았는가"(org_today_reach의 조용한 분 — 라이브, 실제 문장이 "한 번도 말한 적이 없어요"다) 그리고 "이 관계의 첫 말은 언제였는가"(messages.created_at — 행은 오늘도 있다).
그래서 사랑방의 방 하나는 대화 스레드가 아니라 한 관계의 기록 한 권이다. 카톡은 대화가 끝나면 방이 죽지만, 기록은 말이 뜸해도 죽지 않는다 — "첫 말 7월 23일 · 오간 말 5번"이라는 줄은 말이 없는 날에도 참이다. 이 재정의가 빈 상태 문제(⑤)의 절반을 그냥 없앤다: 기록은 얇을 수는 있어도 실패할 수는 없다.
⑤ 세 빈 상태 — 하나는 세우고, 하나는 없애고, 하나는 흘려보낸다
목록이 빌 때 — 주인을 세운다(유지). 문패+초인종, 사과도 씨앗도 없음. 2차 처방 그대로 라이브이며 재확인한다.
방 하나가 빌 때 — 그 상태를 낳지 않는다. 현행 start_direct_thread는 말없이 방부터 만든다(빈 방이 태어날 수 있는 구조 — 오늘은 우연히 0개). 처방: 방은 첫 말과 함께 태어난다 — 픽커의 완료가 "방 만들기"가 아니라 "첫 문장 보내기"가 된다. 빈 방 화면은 디자인하는 게 아니라 존재를 금지한다.
상대가 답이 없을 때 — 침묵을 성도 화면에서 지우고, 목사 책상으로 흘린다. 재권의 화면은 아무것도 조르지 않는다: 맡긴 말은 "내가 맡긴 것"에 조용히 앉아 있고, 부정형 라벨("아직 안 읽으셨어요")은 존재하지 않는다 — 읽으심이 오는 날 긍정형 한 줄이 처음 생길 뿐이다. 재촉은 받을 사람에게 간다: 목사 책상의 "기다리는 말"(기도 요청 3건 — 실재하는 행)이 그 자리다. 읽으심 뒤의 침묵은? 그것은 실생활의 침묵과 같은 것이라 시스템이 해석하지 않는다 — 닿음의 확인까지가 우벨이 판 것이고, 답의 보증은 판 적이 없다.
달라진 것은 하나다: 부름이 온 날, 화면 맨 위가 스레드 줄이 아니라 맞이 카드다 — 골드 테두리는 이 앱에서 도착의 색이고, 사랑방에서 골드가 허락되는 유일한 자리다. 그 아래 목록은 "대화"가 아니라 "관계의 기록"이라는 이름을 얻는다.
ⓐ 빈 사랑방 — 기본 상태2차 처방 그대로. 주인이 서 있고 초인종이 있다 — 그걸로 완성.
8월 7일 목요일
광주양림교회
이 방의 주인은 교회예요. 말은 교회가 먼저 겁니다 — 첫 인사가 도착하면 여기와 홈에 종이 울려요.
초인종 · 먼저 내밀 손이 있다면
조용한 방이에요 · 새 말이 오면 종이 울려요
ⓑ 부름이 도착한 날맨 위가 목록이 아니라 사건이다. 이 카드는 messages 행이 실재할 때만 뜬다.
8월 7일 목요일 · 맞이 1
오늘의 맞이
이영훈 목사님이 재권님을 불렀어요
재권님, 양림의 가족이 되신 걸 환영해요. 이번 주일…
들어가 인사하기 →관계의 기록
오늘 온 말은 여기까지예요
왜 이렇게 했는가
· ⓑ의 맞이 카드는 안 읽은 도착이 있는 동안만 존재한다 — 열고 나면 카드는 사라지고 관계의 기록 줄만 남는다. 사건은 지나가고 기록은 남는다는 ④의 문법 그대로다.
· 목록의 이름을 "교회의 말 / 나에게 온 말"에서 "관계의 기록"으로 바꿨다. 실측이 이유다: 공지방 0, 대화 상대 사실상 1~2명 — 두 켜로 가를 살림이 아직 없고, 기록 한 칸이면 정직하다. 공지방이 실제로 생기면 "교회의 말" 켜가 위에 다시 선다(조건부 렌더 — 지금 코드에 이미 있다).
· 줄 안의 "첫 말 오늘 · 오간 말 1번"은 카톡이 못 하는 유일한 줄이라 넣었지만, 목록 RPC(my_message_threads)에 첫 말 시각이 없어 오늘은 못 뜬다 — X-4로 표시하고 남겨둔다(방 안에서는 오늘도 가능, M-2 참조).
· ⓐ에 아무것도 더하지 않았다. "재권님 이름이 오늘 목사님 책상에 올라 있어요"라는 참인 문장을 세울 수 있었지만 성도가 그 사실을 읽을 RPC가 없다 — 참이어도 근거 없는 문장은 안 쓴다(X-1).
ⓒ 방 안 — 관계의 기록 한 권위가 아니라 시작이 보인다. 침묵은 아무것도 조르지 않는다.
이 기록의 첫 말 · 8월 7일, 교회의 인사
읽으심오후 8:40
읽으심오전 9:12
🙏 기도했습니다 — 이영훈 목사ⓓ 관리자 — 부름의 책상사건 1(부름)을 일으키는 유일한 기계. 자동 발송 없음.
관리 책상 · 광주양림교회
누르면 초안이 열려요 · 고쳐서 보내는 건 목사님 손이에요
기다리는 말
광고 읽음 — 심방 명단
왜 이렇게 했는가
· ⓒ 머리맡("이 기록의 첫 말")은 방을 열 때마다 이 방이 강이 아니라 기록임을 한 줄로 선언한다. 방 안에서는 메시지가 전부 로드되므로 이 줄은 오늘 코드로도 참이다(O-6) — 목록의 같은 줄(X-4)과 운명이 갈리는 이유까지 3부에 적었다.
· ⓒ의 침묵 설계: 재권의 기도 부탁에 아무 일도 없는 닷새 동안, 이 화면은 한 글자도 변하지 않는다. 부정형 라벨도, 카운트다운도, 사과도 없다 — 읽으심이 오는 날 긍정형 한 줄이 처음 생긴다. 재촉은 ⓓ의 "기다리는 말"이 목사에게 한다. 눈치는 구조로 제거하고, 책임은 책상으로 옮긴다.
· ⓓ의 세 칭호(새로 온 분·생일·조용한 분)와 "한 번도 말한 적이 없어요"는 지어낸 카피가 아니라 org_today_reach가 실제로 반환하는 문자열이다. 조용한 분이 하루 3명으로 잘려 도는 것(밀린 목록이 아니라 리듬), 연락처를 반환하지 않는 것도 그 RPC의 실제 계약이다.
· ⓓ에 개인 대화 본문은 없다 — 목사가 본문을 보는 곳은 자기가 당사자인 방 안뿐이고, 책상은 이름·이유·집계까지다(절대 계약 5).
검사법: "이 문장이 말하는 사건을 오늘 DB에서 한 행이라도 보여줄 수 있는가." 도착·상태를 그리는 문장은 행이 실재할 때만 렌더되는 조건부 문장으로 지어 거짓말이 구조적으로 불가능하게 했고, 그래도 못 미치는 문장은 X로 표시해 남긴다 — X는 지우는 게 아니라 빚 목록이다.
| # | 문장 | 판정 | 근거 — 표·RPC · 오늘의 행 |
|---|---|---|---|
| O-1 | "이 방의 주인은 교회예요 · 말은 교회가 먼저 겁니다" | O | 규칙 문장 — 새 대화 진입이 리더·교역자로 게이트됨(canCompose 라이브) + 성도의 시작은 초인종 3종뿐. 규칙이 코드로 집행되고 있으므로 참. |
| O-2 | "이영훈 목사님이 재권님을 불렀어요" (맞이 카드) | O | 조건부 렌더 — messages 안 읽은 행이 실재할 때만 뜬다. 오늘 그 행을 만드는 경로(post_message + 픽커)도 라이브. 거짓으로 뜰 방법이 없다. |
| O-3 | "읽으심" | O | message_thread_members.last_read_at — 산 커서, 오늘 5행 실재. 1:1 한정·긍정형만·성도 간 비노출은 2차 처방대로. |
| X-4 | "첫 말 7월 23일 · 오간 말 5번" (목록 줄의 관계 나이) | X | 행은 있다(messages.created_at 15행) — 그러나 목록 RPC my_message_threads가 첫 말 시각·누적 수를 반환하지 않아 오늘 화면엔 못 쓴다. RPC에 first_message_at·message_count 두 칼럼이 더해지는 날 O가 된다. |
| O-5 | "🙏 기도했습니다 — 이영훈 목사" | O | 조건부 렌더 — message_reactions 행이 있을 때만(쓰기 경로 라이브). 오늘 0행이므로 오늘은 아무 화면에도 안 뜬다 — 그래서 O다. |
| O-6 | "이 기록의 첫 말 · 8월 7일, 교회의 인사" (방 안 머리맡) | O | 방 안은 메시지 전체가 로드됨 — initialMessages[0].created_at으로 오늘 코드에서도 계산 가능. X-4와 같은 문장이지만 데이터가 손에 있어 운명이 다르다. |
| X-1 | "재권님의 이름이 오늘 목사님 책상에 올라 있어요" (빈 목록에 세우려던 문장) | X | 사실 자체는 참일 수 있다(org_today_reach가 새로 온 분을 올린다) — 그러나 그 RPC는 목회자 게이트라 성도가 자기 이름의 등재를 읽을 길이 없다. 참이어도 근거를 못 대는 문장은 안 쓴다. 목업 ⓐ에서 뺐다. |
| O-7 | "오늘 말 걸 사람 · 한 번도 말한 적이 없어요" (관리자) | O | org_today_reach(000199) 라이브 — 칭호·사유 문자열이 RPC 반환값 그대로. 조용한 분 하루 3명 회전, 연락처 미반환. |
| O-8 | "기도 부탁 3건이 와 있어요" (관리자 · 기다리는 말) | O | prayer_requests 오늘 3행 실재 — 이 제품의 유일한 자발적 실사용이 이 칸의 근거다. |
| X-7 | "맡긴 말이 사흘째 기다려요" (관리자 · 1:1 침묵 재촉) | X | 1:1 무응답을 세는 RPC·화면이 없다. 기도·심방·질문(표 있는 3종)은 O-8로 가능하나 일반 대화의 침묵 큐는 오늘 못 쓴다. ⑤의 침묵 설계가 온전하려면 필요한 다음 빚. |
| O-9 | "조용한 방이에요 · 새 말이 오면 종이 울려요" | O | 실시간 구독(postgres_changes · 인박스 라이브) + 홈 도착 줄(my_message_threads unread) — 종을 울리는 기계가 둘 다 라이브. |
| O-10 | "교회의 말" 켜 (공지방이 생기면 목록 위에 서는 켜) | O | 조건부 렌더 — is_announcement_only 방이 있을 때만(코드 라이브). 오늘 0방이라 안 뜬다 — 몸이 없는 켜를 화면에 세워두지 않는 것까지가 판정이다. |
| 금지 | "아직 안 읽으셨어요" · "N명이 함께하고 있어요" · 씨앗 대화 | X | 부정형 읽음 라벨은 눈치의 재생산, 활기 숫자는 실측(1명) 앞에서 거짓, 씨앗은 절대 계약 1 위반 — 셋 다 어떤 화면에도 없다. |
Ubell Design · 페이블 · 2026-08-07 — 실측은 이 문서 작성 중 프로덕션 DB 왕복(2026-08-07): messages 15(사람의 말 11 · 보낸 사람 8 · 첫 행 7/23) · threads 10(빈 방 0 · 공지방 0) · message_receipts 0행(쓰기 코드 전무 — 000025 유래의 죽은 표) · last_read_at 기록 5방/1명 · reactions 0 · prayer_requests 3. 코드 근거: SarangbangInbox.tsx · ThreadRoom.tsx(mark_thread_read·읽으심·🙏) · NewThreadPicker.tsx(start_direct_thread — 말없이 방부터 만듦) · 000067(mark_thread_read) · 000199(org_today_reach). 잔무(코드 아님, 기록만): ⑴ message_receipts 표 정리 판단 ⑵ my_message_threads에 first_message_at·message_count(X-4) ⑶ 1:1 침묵 큐(X-7) ⑷ 픽커 완료를 첫 문장 전송으로(⑤-2). 카카오 트레이드드레스 없음 — 노랑·갈색 말풍선·상표 미사용, 파랑 아침 스킨 유지. 이 문서는 설계이며 코드 변경 없음.