Fable · 골목 2차 화면 재수술 · 2026-08-07
감독의 자기비판이 맞다 — 지난 처방은 막다른 길만 뚫었고, 목록의 살은 손대지 않았다. 이번에는 카드 그 자체를 수술한다. 원칙은 쇼호스트 판정 그대로: 믿음의 최소 단위는 판매보다 먼저 있던, 날짜 붙은 기록 하나. 그 기록들은 이미 DB에 있고, 화면이 안 쓰고 있었다.
실제 골목을 걸을 때 가게 한 집 한 집이 달라 보이는 이유는 셋이다 — 창 너머로 무엇을 파는지 보이고, 문 앞에 오늘 써 붙인 말이 있고, 낡은 간판이 얼마나 오래 그 자리에 있었는지 말해준다. 지금 카드에는 셋 다 없다.
지금 카드의 넷은 왜 부족한가.
문패·상호·소개·동네는 전부 무시제(無時制) 재료다 — 어제와 오늘이 같고, 다음 달에도 같다. 시제가 없는 카드는 사건이 없는 카드이고, 사건이 없는 목록은 정의상 디렉터리다. 열 장이 똑같아 보이는 건 디자인 밀도의 문제가 아니라 재료의 문제였다 — 구별은 장식에서 나오지 않고, 그 가게에만 일어난 일에서 나온다.
쇼호스트 판정("날짜 붙은 기록")은 목록에서도 성립하는가.
성립하되, 그대로 옮기면 안 된다. 가게 단면은 손님이 머무는 자리라 "아는 것의 목록"이 서고, 골목 목록은 카드당 1초의 자리라 아는 것 중 가장 최신 한 줄만 선다. 즉 위계가 생긴다 — 골목 카드 = 아는 것의 목록의 맨 윗줄, 가게 단면 = 목록 전체. 이게 지난 판정보다 나은 점 하나이고, 나머지는 검증 결과 그대로 유효하다: 영상은 기다려야 하지만 날짜는 오늘 있다.
그래서 카드에 무엇을 더하는가 — 세 줄이다.
말 줄(오늘 한마디 — 내용과 날짜. 링만 반짝이고 말은 숨기던 것을 꺼낸다), 창 줄(다루는 것 — 물건 이름 두셋. 사진 0·가격 0, 골목 목록에 가격이 없다는 원칙은 그대로), 기록 줄(날짜 한 줄 — 문패를 건 날, 또는 가장 최근 수확). 셋 다 오늘 DB의 행이고, 셋 다 가게마다 다르다. 열 장이 서로 달라지는 건 이 세 줄이 한다.
| 재료 | 어디 있나 | 지금 화면 | 무엇이 되나 |
|---|---|---|---|
| 오늘 한마디 | today_note · today_note_at | 문패 링으로 존재만 표시 — 말은 카드에서 소개와 구별 불가, 날짜 없음 | 말 줄 — 말풍선 + "오늘 한마디 / 8월 5일의 한마디" |
| 물건 | market_listings.title | 목록에 0건 노출 | 창 줄 — "다루는 것 · 수박 · 된장 · 상추" |
| 수확일 | harvested_at(harvest_date) | 제철 소식 2건에만 | 창 줄의 초록 라벨 — "오늘 수확"(harvestLabel 문장 그대로) |
| 문패 건 날 | markets.created_at | 정렬에만 쓰고 select도 안 함 | 기록 줄 — "3월 4일에 문패를 걸었어요" |
| 오늘 나온 것 사진 | today_photo_url | 심방이 찍는데 손님은 못 봄 | 가게 단면의 한마디 곁(4부) — 카드에는 안 넣음(문패 철칙 ②) |
카드 한 장의 새 뼈대. 다섯 층 전부 같은 크기 규칙 아래 선다 — 영상·사진·한마디가 있다고 카드가 커지지 않는다(문패 철칙 ②의 목록판). 다른 것은 크기가 아니라 시제다.
최대 상태(한마디+수확+열림)여도 카드 한 장. 아래 3부에서 최소 상태와 나란히 선다.
지금 그대로. 링은 오늘 한마디의 신호 — 다만 이제 신호가 가리키는 말이 같은 카드에 보인다. 링만 있고 말이 없던 것이 지금까지의 구멍이다.
지금 그대로: 본보기 도장(DemoBadge)·단골 도장. 도장은 늘리지 않는다 — 도장이 셋이면 훈장 진열장이 된다.
있으면 말풍선 + "오늘 한마디", 24시간이 지나면 옅어지되 "8월 5일의 한마디"로 날짜가 남는다. 없으면 소개(intro)가 옅은 잉크로 이 자리에 — 지금 코드와 같되, 소개에는 따옴표도 날짜도 붙이지 않는다: 소개는 상태고 한마디는 사건이다. 둘을 같은 옷으로 입히던 것이 지금 카드의 두 번째 구멍이다.
물건 이름 최대 3개 + "외 N가지". 사진 0 · 가격 0 — 가격표부터 보이는 골목은 없다는 기존 원칙 유지. 일주일 안 수확이 있으면 가장 신선한 것에만 harvestLabel() 문장 그대로("오늘 수확·어제 수확·N일 전 수확") 초록 라벨 하나. 정문의 "오늘의 직거래"와 겹치지 않는 이유는 3부에서.
동네·열림(진짜만)은 지금 그대로. 더해지는 것은 날짜 한 줄: 진짜는 "3월 4일에 문패를 걸었어요"(created_at), 본보기는 "8월 5일에 본보기로 세웠어요". 카드가 품는 아는 것의 맨 윗줄이다 — 이 줄 덕에 빈 가게조차 날짜를 하나 가진다.
본보기 카드의 창 줄은 왜 남기는가.
본보기 물건 20건은 실재하는 DB 행이고, 정문이 이미 "사진 시연용" 표기와 함께 공개하고 있다. 본보기 카드의 창 줄은 차림 견본이다 — "진짜 가게가 서면 이 자리에 이렇게 차려진다"를 도장 아래에서 보여준다. 단 수확 라벨은 떼어낸다: 물건 이름은 차림이지만 "오늘 수확"은 오늘 일어난 사건의 주장이라, 본보기에 붙는 순간 거짓이 된다.
세로 한 줄은 맞다 — 골목은 한 줄이어야 골목이다(내 동네 렌즈가 필터가 아니라 정렬인 것과 같은 논리). 바꾸는 것은 둘: 차례(사건이 최근인 가게가 앞으로)와 이음새(진짜와 본보기 사이의 경계 한 줄).
차례의 규칙.
① 내 단골(로그인 시) → ② 오늘 기록이 있는 진짜(한마디·수확 최신순) → ③ 나머지 진짜 → 경계 문장 → ④ 본보기(고정 차례) → ⑤ 빈 터 카드. 어귀 문패 줄의 기존 rank와 같은 정신을 카드 목록에도 적용하는 것뿐이다 — 지금 카드 목록은 created_at 차례라 사건과 무관하게 서 있다. 내 동네 렌즈를 켜면 동네가 1차, 사건이 2차 — 렌즈의 "자르지 않고 앞으로 부른다"는 그대로다.
이음새 — 본보기 문장은 지금 잘못된 자리에 있다.
"이 골목의 N자리는 아직 본보기예요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다." — 문장은 옳고(정문과 오늘 합친 공용 문장, 원본 유지), 자리가 어귀 문패 줄 밑이다. 이 문장이 말하는 사건은 목록 안의 경계이므로, 문장을 그 경계 위에 세운다 — 진짜 카드들이 끝나고 본보기가 시작되는 이음새에. 진짜가 0인 오늘은 경계가 목록 맨 위라서 지금과 화면이 거의 같고, 진짜가 설 때마다 이 문장이 한 칸씩 아래로 밀려난다 — 물갈이 규칙이 눈에 보이는 사건이 된다.
창 줄이 정문의 "오늘의 직거래"와 겹치지 않는가.
장르가 다르다. 정문은 물건이 주어다 — 사진·가격·그리드, 탭하면 물건 시트. 골목의 창 줄은 사람이 주어, 물건은 술어다 — 이름만, 사진 0, 가격 0, 탭 목적지는 가게. 같은 진열대를 정문은 "무엇이 있나"로 읽고 골목은 "이 사람이 무얼 다루나"로 읽는다. 가격·사진이 골목 카드에 오르는 순간 두 화면이 겹치기 시작한다 — 그래서 창 줄의 상한은 글자다.
우리 골목
여기부터 본보기
이 골목의 10자리는 아직 본보기예요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다.
오너의 문장("2차 화면이 그대로인데")에 대한 답이 이 목업이다. 진짜 가게가 한 곳도 없는 오늘도 카드마다 창 줄과 세운 날이 붙어, 열 장이 처음으로 서로 다르다.
본보기 카드에는 날짜 붙은 사건이 없다 — 말 줄 자리엔 소개(옅은 잉크), 수확 라벨 없음, 열림 없음. 세운 날 하나가 유일한 날짜이고 그건 실제 사건(행이 생긴 날)이다.
"지금 N곳이 문 열었어요"가 없는 이유 — 진짜 0곳이면 그 줄은 렌더하지 않는다(기존 감독 정정 유지).
우리 골목
여기부터 본보기
이 골목의 8자리는 아직 본보기예요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다.
같은 화면의 두 시점이 물갈이 규칙을 증언한다. MOCK 1과 2의 차이 전부가 DB 행의 차이다 — 화면은 규칙을 새로 말하지 않고, 경계 문장이 밀려난 위치와 줄어든 숫자가 규칙을 보여준다.
한울과 이도의 차이가 곧 카드의 문법이다 — 오늘 말한 가게는 링과 진한 말풍선, 이틀 전에 말한 가게는 옅은 말풍선과 날짜. 둘 다 같은 크기, 다른 시제.
물건 사진 레일 · 카드 안 상품 그리드
물건이 주어가 되는 순간 정문의 "오늘의 직거래"와 같은 화면이 둘이 된다. 골목의 축은 "누구에게서"다.
"양림동 3곳" 같은 동네별 카운트 헤더
개수는 밀도 없음의 자백 — dongsOf()가 개수를 화면에 안 내보내는 기존 원칙 그대로.
지도 뷰
지도는 밀도를 만들지 못하고 비추기만 한다 — 핀 10개가 흩어진 그림은 "우리 골목"의 반증이다(기존 판정 유지).
"이번 주 발걸음 N번" 같은 활기 집계
발걸음 총 0. 집계 문장은 첫 발걸음들이 쌓인 뒤의 일이고, 그때도 본보기 발걸음은 세지 않는다.
단면의 병도 같다 — 상호·주소·시간·물건 전부 무시제. 약도 같다: 이미 있는 날짜를 꺼낸다. 더하는 것은 셋뿐이고, 그중 둘은 select에 컬럼 하나 넣는 일이다.
① 오늘 나온 것 — 심방이 찍은 사진을 손님이 본다.
today_photo_url은 000183이 정확히 이 용도로 만든 컬럼이다 —
"오늘 한마디의 시각 반쪽, 가게 단면의 한마디 옆에만 걸리고 골목 카드에는 넣지 않는다."
그런데 지금 [slug]는 select조차 안 한다. 심방자가 무릎 굽혀 찍은 사진이 원장에만 잠들어 있다.
한마디 말풍선 곁에 걸고, 24시간 옅어짐은 한마디와 한 몸으로(타임스탬프 공유가 이미 그렇게 설계돼 있다).
② 우벨이 아는 것 — 날짜 목록이 단면의 바닥에 선다.
쇼호스트 설계의 "아는 것의 목록"을 그대로 들인다. 오늘 쓸 수 있는 행은 둘 — 문패를 건 날(created_at), 가장 최근 수확(harvest_date). 한마디가 있으면 그 날짜가 셋째 줄. "우벨이 다녀왔어요"(심방 날)는 아직 못 쓴다: munpae_ok_at은 000183이 비노출을 약속한 초상권 원장이라, 노출용 심방 기록 한 줄이 서기 전까지 이 줄은 그리지 않는다(5부 표). 줄이 둘뿐이어도 목록은 성립한다 — 모른다는 사실을 목록으로 말하는 것이 0편의 쇼호스트다.
③ 문장 통일 — 수확과 한마디의 날짜 말투를 하나로.
지금 목록은 "오늘 수확·N일 전 수확"(harvestLabel), 단면은 "2026-08-02 수확"으로 서로 다르게 말한다. 같은 사실은 같은 문장으로 — 원본은 harvestLabel()(정문 제철 소식과 골목이 이미 쓰는 문장)이고 단면이 그것을 따른다. 한마디도 같다: "지난 한마디"라는 무날짜 표기를 버리고 목록과 같은 "8월 5일의 한마디"로.
‹ 골목
한울농원
다루는 것
우벨이 아는 것
구조는 안 바꿨다. 찾아가는 줄이 물건보다 위(단면의 헌법)는 그대로 — 더해진 것은 사진 한 장, 라벨 문장 통일, 그리고 바닥의 날짜 목록뿐이다.
"우벨이 아는 것"은 자랑이 아니라 회계다. 발걸음도 후기도 영상도 없는 가게가, 그래도 오늘 세 줄의 날짜로 말할 수 있다 — 쇼호스트 판정의 목록판 실증.
본보기 단면은 지난 라운드 처방 유지(전화·발걸음 걷어내고 개설 문 하나) + 기록 줄 하나만 추가: "8월 5일에 본보기로 세웠어요". 아는 것 목록은 본보기에 그리지 않는다 — 본보기가 아는 것을 쌓는 척하면 안 된다.
O·X는 "이 문장이 말하는 사건을 오늘 DB에서 한 행이라도 보여줄 수 있는가"로만 판정했다. X는 지우지 않고 무엇이 서야 O가 되는지 적었다. 코드 변경이 필요하지만 DB가 이미 아는 것은 O다(비고에 표시).
| 화면 | 문장 | 말하는 사건 | 오늘 DB | X면 무엇이 있어야 O가 되나 / 비고 |
|---|---|---|---|---|
| 골목 카드 · 말 줄 | “수박이 오늘 아침에 다 익었어요.” + 오늘 한마디 | markets.today_note 행 + today_note_at이 24시간 안 | O | 행이 없으면 말풍선 자체를 안 그린다 — 문장이 행에서만 태어난다 |
| 골목 카드 · 말 줄 | 8월 5일의 한마디 | today_note_at의 날짜 — 옅어진 말에도 날짜는 남는다 | O | 단면의 "지난 한마디"(무날짜)를 이 문장으로 교체 — 목록·단면 동일 문장, 원본은 이 표 |
| 골목 카드 · 창 줄 | 다루는 것 · 수박 · 재래식 된장 · 상추 외 2가지 | 그 가게의 market_listings 행들(제목·개수) | O | 코드: 목록 쿼리에 가게별 제목 조회 추가(market_id in …) — DB 행은 20건 이미 있다 |
| 골목 카드 · 창 줄 | 오늘 수확 / 어제 수확 / N일 전 수확 | harvest_date가 7일 안 | O | 원본은 harvestLabel() — 정문 제철 소식·골목·단면이 같은 문장을 쓴다 |
| 골목 카드 · 기록 줄 | 3월 4일에 문패를 걸었어요 | markets.created_at | O | 코드: page.tsx select에 created_at 한 단어 — 지금은 정렬에만 쓰고 버린다 |
| 골목 카드(본보기) | 8월 5일에 본보기로 세웠어요 | created_at + is_demo=true — 행이 생긴 실제 날 | O | "문패를 걸었어요"를 본보기에 쓰면 주인이 있는 척이 된다 — 동사를 가른다 |
| 골목 카드(본보기) | (수확 라벨·한마디·열림을 그리지 않음) | 없는 사건을 말하지 않는다는 규칙 그 자체 | O | 열림 배지 감독 정정과 같은 원리의 확장 — 본보기에는 시제가 없다 |
| 골목 목록 · 이음새 | 이 골목의 N자리는 아직 본보기예요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다. | is_demo N행 + 물갈이 규칙(코드 구현됨) | O | 정문·골목 공용 문장 그대로(원본: 오늘 합친 그 문장) — 자리만 본보기 경계로 이동 |
| 골목 목록 · 머리 | 이 골목은 호남신학대학교가 이웃을 위해 엽니다 | golmokHost 계산(오늘 한 곳으로 합쳐짐) | O | 기존 유지 — 보증은 골목 명판 한 줄까지, 카드에 교회명 안 붙는다(PIPA) |
| 골목 목록 · 머리 | 지금 N곳이 문 열었어요 | 진짜 가게 hours와 현재 시각 계산 | O | 기존 유지 — 진짜 0곳이면 줄 자체를 안 쓴다 |
| 가게 단면 | 오늘 나온 것 — 한마디와 함께 올랐어요 | markets.today_photo_url + today_note_at 24시간 안 | O | 코드: [slug] select에 today_photo_url — 심방이 찍는데 손님 화면이 안 보여주고 있었다 |
| 가게 단면 · 아는 것 | 3월 4일 이 골목에 문패를 걸었어요 | created_at | O | — |
| 가게 단면 · 아는 것 | 8월 7일 오늘 수확한 물건이 올라왔어요 | 그 가게 listing의 harvest_date=오늘 | O | — |
| 가게 단면 · 아는 것 | 우벨이 6월 12일에 이 가게에 다녀왔어요 | 노출 가능한 심방 방문 기록 행 | X | munpae_ok_at은 000183이 비노출을 약속한 초상권 원장 — 그걸 꺼내 쓰면 안 된다. 노출용 심방 기록 한 줄(날짜만)이 서는 날 O |
| 가게 단면 | 이 가게를 세 번 넘게 찾은 이웃이 N이에요 | market_visits 집계(이름 없는 숫자) | X | 집계 공개 RPC 하나 — 그리고 N≥1이 되는 날(쇼호스트 표와 동일 판정) |
| 골목 카드 | 봄부터 쉰두 번의 한마디가 쌓였어요 | 한마디 이력 행들 | X | today_note는 덮어쓰기라 이력이 없다 — note history가 서는 날 O |
| 골목 카드 · 도장 | 단골 | my_shop_visits ≥ 3 (로그인 본인 것만) | O | 기존 유지 — 이름 없는 내 발걸음, 남의 단골 수는 위의 X와 별개 |
lib/korean.ts의 particle().
③ 최소 변경 목록: page.tsx select에 created_at · 목록 쿼리에 가게별 listing 제목 조회 · ShopCard에 말/창/기록 줄 · listed 정렬에 사건 최신순 · 본보기 문장을 이음새로 이동 · [slug] select에 today_photo_url + 아는 것 카드 + "지난 한마디"→날짜 표기 + 수확 라벨 harvestLabel()로 통일. 새 테이블 0 · 새 RPC 0 — 전부 이미 있는 행이다.
Fable · 골목 2차 화면 — 카드에 시제를 준다 · 우벨 디자인 시스템(ms-* 토큰 · 밝음/어둠 두 세계) 기준으로 그림
같은 계보: santokki-front-door.html(정문·경계) · ubell-showhost.html(아는 것의 목록) — 이 문서는 그 판정의 목록판이다