오너의 한 줄 "오프라인에서 만남은 항상 사랑방에서 만날 수 있어야 합니다"에 대한 답. 이 세계에서 확실하게 일어나는 유일한 일(매주의 모임·실제로 가는 심방·가게 문을 넘는 발걸음)이 지금 DB에 한 행도 안 남는다 — 그러나 처방은 만남을 기록하는 표가 아니다. 목업만 — 코드 변경 없음.
1부 · 판정 — 만남 자체를 기록할 것인가
만남은 행이 되지 않는다. 만남은 부를 이유가 되고, 부름의 첫 문장 속 잉크가 된다.
감독의 감("만남을 기록하면 출석부가 된다")은 검증됐다 — 이 제품에 이미 판례가 셋 있다: 심방 수첩의 "인사만"은 일부러 폰에만 남고(DB에 쓰지 않는다 — SimbangList 주석의 명문), 발걸음은 조직이 아니라 손님 본인의 손이 남기며 비로그인이면 서버조차 모르고, 인사의 거절은 서버에 한 행도 안 남는다. 그래서 법은 "기록 금지"가 아니라 한 단계 정밀하다 — 사람의 만남은 만난 본인만, "내가 갔다"의 방향으로만 기록할 수 있다. 조직이 "저 사람이 왔다"고 적는 표(출석부)는 짓지 않는다. 단위가 조직인 만남(노회 회의)만 예외이고, 그건 출석부가 아니라 회의록이라 이미 옳은 자리(org_meetings)에 산다.
"만났다"를 표로 만들면 무슨 일이 생기는지부터 재고, 만남이 사랑방에 들어오는 옳은 문 두 개를 지목한다.
① 출석부는 왜 죽는 길인가 — 감시의 문턱은 기록의 방향에 있다
"교회↔성도 만남" 표를 만들면 첫 행부터 질문이 뒤집힌다: 성도가 "내가 교회에 간 게 기록됐네"라고 묻는 순간 이 제품은 죽는다 — 종교는 PIPA 민감정보이고, 발걸음은 위치 이력이다. 감시감의 정체는 기록의 존재가 아니라 기록의 방향이다: 내가 나를 적는 것은 수첩이고, 남이 나를 적는 것은 장부다. 발걸음이 무섭지 않은 이유가 정확히 이것이다 — 손님이 자기 손으로 누르고, 가게에는 이름 없는 숫자만 가고, 로그인 전엔 서버조차 모른다("이 폰이 기억하는 중").
그리고 출석부는 쓸모의 방향도 틀렸다. 출석부가 답하는 질문은 "누가 왔는가"(관리)인데, 사랑방이 답해야 할 질문은 "오늘 누구를 부를 것인가"(관계)다. 관리의 표는 빠진 사람을 추궁하는 데 쓰이고, 부름의 책상은 기다리는 사람에게 먼저 가는 데 쓰인다 — 같은 데이터라도 물건이 다르다.
② 그러면 만남은 어떻게 사랑방에 들어오는가 — 문이 둘이다
문 하나 — 부를 이유. 만남이 일어나면 부를 이유가 공짜로 생긴다: 심방을 다녀오면 "다녀온 그 사람"이 있고, 발걸음이 3번 쌓이면 "단골이 된 그 손님"이 있고, 교회에 처음 오면 "새로 온 그 분"이 있다. 이유는 시스템이 대고(org_today_reach · 발걸음·인사 — 전부 라이브), 부르는 것은 사람의 손이다(자동 방 생성 금지 — 어제 세운 법 그대로).
문 둘 — 첫 문장 속 잉크. "오늘 뵈어 반가웠어요. 말씀하신 무릎 수술, 마음에 새겨두었어요" — 이 한 문장이 서면 만남은 메타데이터가 아니라 내용으로 영구히 기록된다. messages 행 하나가 만남의 기록이자 부름이자 관계의 첫 페이지다. 방 하나 = 관계 한 권이라는 어제의 재정의가 여기서 완성된다: 오프라인 만남은 그 책의 잉크이지, 책 옆의 색인이 아니다.
③ "항상 사랑방에서 만날 수 있어야 한다"의 번역
오너의 문장을 기능으로 직역하면 "만남마다 방을 만든다"가 되고, 그건 어제 금지한 빈 방 대량 생산이다. 옳은 번역은 이것이다: 오프라인에서 만난 두 사람 사이에는, 만남 직후에 부름 한 번이면 닿는 길이 항상 열려 있어야 한다. 그 길이 지금 세 갈래 중 두 갈래에서 끊겨 있다 — 심방 도구에 사랑방으로 가는 경로가 0줄이고, 가게 화면에도 0줄이다(실측). 이 문서의 목업은 그 끊긴 이음새를 잇는 그림이다.
어휘(orgVocab)로는 못 덮는다 — 네 갈래는 낱말이 아니라 사건이 다르다. 갈래마다 "오프라인에서 무슨 일이 있었고 → 무엇이 남고 → 사랑방에서 무엇이 되는가"를 지금 있는 재료로 적는다.
갈래 A가게 ↔ 손님상업 · 비로그인 가능 · 종교 무관
오프라인
손님이 가게 문을 넘는다
앱 밖의 사건 — 이게 원천이다
남는 것
발걸음 · 도장 3번 = 단골 · 인사(이름)
visit_shop · greeting_give — 라이브
사랑방에서
단골 가게의 한마디가 골목 어귀 맨 앞으로 먼저 들른다
MarketClient 차례 규칙 — 라이브
이 갈래는 messages 로 가지 않는다 — 그게 설계다. 사랑방은 실명·소속의 방인데 골목은 비로그인 산토끼의 세계라, 둘을 이으면 경계가 무너진다(2촌 하드스톱과 같은 결). 이 갈래의 "사랑방"은 오늘 한마디다 — 가게의 말은 1:1 쪽지가 아니라 입간판이고, 단골이 되면 그 입간판이 내 골목 맨 앞에 먼저 선다. 사장의 답장은 DM 이 아니라 분필을 고쳐 쓰는 것이다. 손님→가게의 1:1 채팅은 짓지 않는다 — 문의는 전화(이미 화면에 있다)가 맡고, 관계는 발걸음·인사가 맡는다.
갈래 B교회 ↔ 성도관계 · 실명 · 종교 민감
오프라인
예배 · 구역모임 · 심방
매주 확실히 일어나는 유일한 일
남는 것
행 0개 — 그리고 그대로 둔다(출석부 금지)
1부 판정 — 일부러 진 빚
사랑방에서
만남 직후의 부름 — 그 자리의 말이 첫 문장이 된다
start_thread_with_message(000205) — 라이브
핵심 이음새는 "다녀온 손이 식기 전"이다 — 심방에서 돌아오는 길, 목회자의 폰에서 부름 한 번이면 닿아야 한다(목업 ③). 초안은 우벨이 짓되 만남의 내용은 목회자만 아니까 초안은 뼈대, 잉크는 사람이다. 반대 방향의 문도 이미 있다: 성도의 초인종 "심방 청하기"는 온라인이 오프라인 만남을 청하는 다리다 — 이 갈래만 다리가 왕복이다.
갈래 C노회 ↔ 교회단위가 사람이 아니라 조직
오프라인
시찰회 · 정기회 — 조직들이 모인다
개통 각본의 단위 = 시찰(릴레이)
남는 것
회의록 — 유일하게 만남 자체가 기록되는 갈래
org_meetings · org_meeting_list — 라이브
사랑방에서
아직 부를 수 없다 — 받을 손이 없는 곳이 큐에 뜬 이유라서
org_today_reach_orgs(000206) — 라이브
이 갈래의 다리는 부름이 아니라 개통이다: 모임이 곧 자리이고(착석 전 공문 금지), 책상은 "이번 모임에서 문 열 3곳"을 올린다(하루 3곳 회전 — 라이브). 교회에 문이 생기고 관리자가 앉는 날, 그 교회는 자기 성도를 부르는 책상을 갖는다 — C의 다리는 B의 다리를 낳는 다리다. 만남 자체의 기록이 여기서만 허락되는 이유: 단위가 조직이면 기록은 감시가 아니라 공적 문서다(회의록은 법이 요구하는 물건이다).
갈래 D학교 ↔ 학생채플 · 수업 — 반복 · 대규모
오프라인
채플 · 수업 — 매주 수백 명이 한 방에
개별 부름의 재료가 아니다
남는 것
등록(새로 온 학생) · 긴 침묵
org_today_reach — 같은 기계가 돈다
사랑방에서
교목·교수의 부름 — B와 같은 길, 어휘만 갈린다
orgVocab: 성도→학생 · 심방→면담
D가 B와 다른 점은 만남의 결이다 — 채플은 관계의 만남이 아니라 반복되는 군중이라, "어제 채플에서 뵀죠"는 부름의 재료가 못 된다(그리고 채플 출석은 학사 시스템의 물건이지 사랑방의 물건이 아니다 — 여기서도 출석부 금지가 지켜진다). 부를 이유는 교회와 같은 셋(새로 온 학생·생일·오래 조용한 학생)이고 기계도 같다. 이 갈래는 새로 지을 것이 없다 — 어휘 등록부가 일하면 된다.
넷 다 조건부 렌더다 — 사건이 일어난 뒤에만 인쇄되고, 오늘의 실측(발걸음 0 · 단골 0)에서는 이 화면들 대부분이 아직 안 뜬다. 골드는 오프라인의 무엇이 화면에 도착한 자리에만 쓴다.
① 단골이 된 다음 날의 골목 어귀세 번의 오프라인 발걸음이 화면의 차례를 바꿨다 — 전부 라이브.
우리 골목 · 양림동
쑥골방앗간단골
방앗간 · 양림동 · 나의 발걸음 3번
보리네분식
음식점 · 양림동
달빛제과
제과 · 양림동
② 사장 — 발걸음이 도착한 저녁이름은 인사를 건넨 손님만 · 답장은 DM 이 아니라 분필이다.
내 가게 · 쑥골방앗간
오늘 도착한 인사
정순님이 인사를 건네왔어요
발걸음 4번의 단골 · 가게가 부를 이름이에요
3
오늘 발걸음
1
단골
1
인사 받은 이름
오늘 한마디 — 단골에게 먼저 들르는 답장
가게 앞 입간판처럼
내일은 모싯잎 송편 나와요
한마디 걸기왜 이렇게 했는가
· ①은 새 기능이 아니라 이미 라이브인 다리의 기준 화면이다 — 단골 맨 앞(MarketClient 차례 규칙)·한마디 말풍선·발걸음 줄 전부 오늘 코드에 있다. 이 화면을 기준으로 박아두는 이유: 갈래 A의 다리는 "지을 것"이 아니라 "이미 있는데 아무도 안 걸은 것"임을 문서가 증언해야 한다.
· ②의 골드 카드는 my_shop_greetings 행이 실재할 때만 뜬다(홈 MyShopCard 와 같은 판정 — 라이브). "인사 받은 이름 1"이라는 통계 칸의 셋째 자리는 이 화면의 경계 선언이다 — 이름의 수가 발걸음의 수보다 항상 작거나 같다는 것이 구조로 보인다.
· ②의 자물쇠 줄은 장식이 아니라 계약의 낭독이다 — greeting_give 가 가게에 넘기는 것은 부르는 이름과 발걸음 횟수 딱 두 가지(VisitBar 의 실제 문장)이고, 교회명·전화번호·소속은 컬럼 자체가 안 넘어간다.
· ②에 "정순님에게 답장하기" 버튼이 없다 — 갈래 A 판정(1:1 짓지 않음) 그대로. 답장의 자리는 한마디 편집기이고, 그 라벨("단골에게 먼저 들르는 답장")이 사장에게 방향을 가르친다.
③ 심방에서 돌아오는 길 — 부름 짓기초안은 뼈대, 만남의 잉크는 사람만 채울 수 있다.
첫 문장 — 보내기 전에 고치세요
은주님, 오늘 찾아뵙고 돌아오는 길이에요. 말씀하신 무릎 수술, 마음에 새겨두었어요. 수술 전날 다시 연락드릴게요.
보내면 이 말과 함께 방이 태어나요 — 빈 방은 만들어지지 않아요.
자동으로 나가는 건 없어요 · 전송은 목사님 손이에요.
④ 은주님의 사랑방 — 만남이 도착했다만남은 배지가 아니라 첫 문장의 내용으로 도착한다.
8월 7일 목요일 · 맞이 1
오늘의 맞이
이영훈 목사님이 은주님을 불렀어요
은주님, 오늘 찾아뵙고 돌아오는 길이에요. 말씀하신…
들어가 인사하기 →관계의 기록
왜 이렇게 했는가
· ③이 이 문서의 심장이다 — 오늘 심방 도구에는 사랑방으로 가는 경로가 0줄이고(실측), 이 화면은 그 이음새 하나를 잇는다. 서버는 이미 다 있다: 사람 고르기(픽커)·첫 문장과 함께 방 탄생(start_thread_with_message · 000205)·본문이 비면 예외(빈 방 자물쇠). 지을 것은 진입 동선과 초안뿐이다.
· ③의 초안에서 "찾아뵙고 돌아오는 길"은 넣을 수 있어도 "말씀하신 무릎 수술"은 시스템이 절대 못 짓는다 — 심방의 내용이 DB에 없기 때문이고, 그게 1부 판정의 값이다. 만남을 기록하지 않는 대신, 만남을 아는 유일한 사람의 손이 잉크가 된다. 초안은 짧게, 빈칸은 크게.
· ④의 맞이 카드는 사랑방 3차 처방(M-1ⓑ)의 것과 같은 카드다 — 심방발 부름이라고 다른 그릇을 만들지 않는다. 만남은 배지("심방")가 아니라 미리보기 문장 속에 산다 — 색인이 아니라 잉크(1부 ②).
· ④의 "첫 말 7월 23일 · 오간 말 5번"은 어제까지 X-4(빚)였는데 000205가 갚아서 오늘은 O다 — my_message_threads 가 first_message_at·message_count 를 반환하고 인박스가 이미 그린다(SarangbangInbox 실측). 문장표에서 O로 승격해 기록한다.
감시가 아님은 말로 다짐하는 게 아니라 표로 증명한다. 규칙은 하나로 요약된다 — 이름과 내용은 본인이 건넨 만큼만 건너간다.
| 자리 | 보는 것 | 절대 못 보는 것 | 근거 |
|---|---|---|---|
| 가게 주인 | 오늘 발걸음 합계 · 단골 수 · 인사를 건넨 손님의 부르는 이름 + 발걸음 횟수 | 인사 전 손님이 누구인지 · 전화번호 · 소속 · 교회명(컬럼 자체가 없다) · 비로그인 발걸음(서버에도 없다) · 인사를 거절한 사실 | greeting_give 계약("딱 두 가지") · 비로그인 발걸음은 localStorage · 거절은 폰만 기억(서버 무기록) |
| 손님 | 내 발걸음 수 · 가게의 한마디 · 내가 건넨 인사(언제든 거둘 수 있다) | 다른 손님의 발걸음 · 가게가 나를 어떻게 보는지(분류 자체가 없다) | my_shop_visits 본인 한정 · greeting_withdraw 라이브 — 건네기만큼 거두기도 가볍다 |
| 목회자 | 오늘 부를 이름과 이유(생일·새로 온 분·조용한 분) · 자기가 당사자인 방의 본문 · 기다리는 말 집계 | 성도의 연락처(RPC가 반환 안 함) · 성도의 발걸음·가게 이력(마당과 등불은 조인이 없다) · 당사자 아닌 대화 본문 | org_today_reach 계약(연락처 미반환 · 000199) · 낮/밤 두 세계 분리 — 위치 이력은 어느 관리 화면에도 안 흐른다 |
| 성도 | 받은 부름 · 읽으심(긍정형 · 1:1 한정) · 내가 맡긴 것 | "안 읽으셨어요" 부정형 · 내 이름이 오늘 책상에 오른 사실(읽을 RPC 없음 — X-1 유지) · 다른 성도의 읽음 | last_read_at 긍정형만 렌더 — 침묵은 성도 화면에서 지우고 목사 책상으로 흘린다(3차 처방 ⑤) |
| 노회 관리자 | 교회 단위의 이름과 이유("아직 문이 없는 곳" 등) · 회의록 | 교회 안 사람의 이름 한 칸도 · 성도 연락처 · 교회 내부 사랑방 | org_today_reach_orgs 계약(사람 아닌 organization 반환 · 000206) · 약속에 적힌 것만 흐른다(org-graph) |
| 우벨(플랫폼) | 사건의 행 — 발걸음·인사·부름·읽음 커서 | 비로그인 발걸음의 주인 · 만남 자체(출석부 없음) · 인사 거절 · 초안의 자동 전송(전송은 항상 사람의 손) | 1부 판정 — 기록의 방향은 항상 본인에게서 바깥으로. 조직→사람 방향의 기록 표는 짓지 않는다 |
검사법: "이 문장이 말하는 사건을 오늘 DB에서 한 행이라도 보여줄 수 있는가." X는 두 갈래로 가른다 — 갚을 빚(무엇이 생기면 O가 되는지 적는다)과 일부러 진 빚(영구 X — 출석부 금지의 값이라 갚지 않는다).
| # | 화면 / 문장 | 판정 | 말하는 사건 · 근거 — X면 무엇이 있어야 O가 되는가 |
|---|---|---|---|
| O-1 | ① "단골 · 나의 발걸음 3번 · 단골이라 먼저 들러요" | O | 손님의 오프라인 방문 3회 — visit_shop·my_shop_visits 라이브 · 단골 맨 앞 차례는 MarketClient 정렬 규칙 라이브. 오늘 실측 0이라 조건부로 안 뜬다 — 그래서 O다. |
| O-2 | ② "정순님이 인사를 건네왔어요 · 발걸음 4번의 단골" | O | 손님이 이름을 건넨 사건 — greeting_give → my_shop_greetings 라이브(홈 MyShopCard 와 같은 조건부 판정). |
| O-3 | ② "오늘 발걸음 3" (합계 통계) | O | footsteps_today — 홈 ShopSummary 가 이미 쓰는 값. 이름 없는 합계만이라 경계 안이다. |
| X-1 | ② "정순님에게 쪽지 보내기" (사장→손님 1:1) | X영구 | 짓지 않는다 — 골목(비로그인 세계)과 사랑방(실명 세계)을 직결하면 경계가 무너진다. 답장의 자리는 오늘 한마디(입간판)다. O로 만들 계획이 없는 X. |
| O-4 | ③ "은주님, 오늘 찾아뵙고 돌아오는 길이에요…" (심방 직후 첫 부름) | O | 부름의 사건 — start_thread_with_message(000205) 라이브: 첫 문장과 함께 방이 태어나고 빈 본문은 예외. 픽커·게이트(canCompose)도 라이브. 없는 것은 심방 화면에서 이리로 오는 문 한 짝뿐이다. |
| X-2 | ③ "이번 주 심방 다녀온 분" (다녀옴 큐) | X영구 | 심방 다녀옴의 행이 없다 — 그리고 만들지 않는다(1부 판정 · 출석부 금지). 부를 이유는 org_today_reach 셋으로 충분하고, 다녀온 직후의 부름은 목회자의 손이 기억한다. 일부러 진 빚. |
| O-5 | ④ "이영훈 목사님이 은주님을 불렀어요" (맞이 카드) | O | 조건부 렌더 — messages 안 읽은 행이 실재할 때만. 3차 처방 O-2와 같은 카드·같은 판정. |
| O-6 | ④ "첫 말 7월 23일 · 오간 말 5번" (목록 줄) | O | 어제의 X-4가 오늘 O로 승격 — 000205가 my_message_threads 에 first_message_at·message_count 를 더했고 SarangbangInbox 가 이미 그린다(실측). |
| O-7 | 노회 책상 "아직 문이 없는 곳 3곳 · 이번 모임에서" | O | org_today_reach_orgs(000206) 라이브 — 하루 3곳 회전 · 사람 이름 미반환. 전남노회 실측: 문 없는 곳 19 → 오늘 3. |
| O-8 | 노회 책상 "다음 정기회 · 9월 2일" (모임 예고) | O | 조건부 — org_meeting_list 에 meeting_date 행이 실재할 때만. 오늘 행이 없으면 안 뜬다. |
| X-3 | 학교 "어제 채플에서 뵀어요" | X영구 | 채플 출석의 행이 없고 만들지 않는다 — 군중의 만남은 부름의 재료가 아니다(2부 D). 학교의 부름은 등록·생일·긴 침묵으로 짓는다(O — 같은 RPC). |
| X-4 | ① "가게가 회원님을 기다려요" 류 — 타인의 마음을 현재형으로 약속 | X영구 | 주인 계정이 실재하지 않는 가게가 대부분(문장 규칙표 v1 판례 — MyShopCard 에서 이미 한 번 고친 병). 어떤 화면에도 안 쓴다. |
| 금지 | "가는 중이에요" · 가게 화면의 교회명 · "아직 안 읽으셨어요" · 자동 발송 | X | 있는 것은 "다녀왔어요"뿐 · PIPA(종교 민감정보) · 부정형 읽음은 눈치의 재생산 · 전송은 사람의 손 — 넷 다 어떤 화면에도 없다. |
Ubell Design · 페이블 · 2026-08-07 — 실측 근거: VisitBar.tsx(발걸음·인사·visit_merge — 사랑방 경로 0줄 확인) · SimbangShopClient.tsx·SimbangList.tsx("인사만"은 localStorage 명문 · 사랑방 경로 0줄 확인) · MyShopCard.tsx(footsteps_today·my_shop_greetings·문장 규칙표 판례) · MarketClient.tsx(단골 맨 앞 차례) · SarangbangInbox.tsx:223(첫 말·오간 말 — X-4 상환 확인) · TodayReach.tsx(org_today_reach 계약) · 000205(start_thread_with_message · 빈 방 존재 금지) · 000206(org_today_reach_orgs · 사람 이름 미반환) · org_meeting_list(회의록). 발걸음 0 · 단골 0 · 진짜 가게 0 · messages 15 · 계정 311/로그인 8은 감독 실측 그대로 옮김. 잔무(코드 아님, 기록만): ⑴ 심방·목양 동선에서 "부름 짓기"(픽커+초안)로 가는 문 한 짝(S-2③) ⑵ 학교 어휘 등록부에 부름의 책상 낱말(성도→학생·심방→면담) 검증 ⑶ 성도 초인종 "심방 청하기"가 목사 책상 "기다리는 말"에 실리는지 확인. 카카오 트레이드드레스 없음 — 노랑·갈색 말풍선·상표 미사용, 파랑 아침 스킨 유지. 이 문서는 설계이며 코드 변경 없음.