Fable · 골목 2차 화면 재수술 · 2026-08-07

카드가 다 똑같은 이유는
카드에 사건이 없기 때문이다.

감독의 자기비판이 맞다 — 지난 처방은 막다른 길만 뚫었고, 목록의 살은 손대지 않았다. 이번에는 카드 그 자체를 수술한다. 원칙은 쇼호스트 판정 그대로: 믿음의 최소 단위는 판매보다 먼저 있던, 날짜 붙은 기록 하나. 그 기록들은 이미 DB에 있고, 화면이 안 쓰고 있었다.

0
지금 카드에 있는 날짜 — 넷(문패·상호·소개·동네) 전부 무시제
0
목록에 보이는 물건 — 20건이 DB에 있는데 카드는 침묵
2컬럼
골라놓고 안 쓰는 날짜 — created_at(미select) · today_photo_url(미노출)
10
전부 본보기 — 그래서 오늘부터 달라 보여야 한다

1부진단 — 산토끼가 골목에서 보아야 할 것

실제 골목을 걸을 때 가게 한 집 한 집이 달라 보이는 이유는 셋이다 — 창 너머로 무엇을 파는지 보이고, 문 앞에 오늘 써 붙인 말이 있고, 낡은 간판이 얼마나 오래 그 자리에 있었는지 말해준다. 지금 카드에는 셋 다 없다.

지금 카드의 넷은 왜 부족한가.

문패·상호·소개·동네는 전부 무시제(無時制) 재료다 — 어제와 오늘이 같고, 다음 달에도 같다. 시제가 없는 카드는 사건이 없는 카드이고, 사건이 없는 목록은 정의상 디렉터리다. 열 장이 똑같아 보이는 건 디자인 밀도의 문제가 아니라 재료의 문제였다 — 구별은 장식에서 나오지 않고, 그 가게에만 일어난 일에서 나온다.

쇼호스트 판정("날짜 붙은 기록")은 목록에서도 성립하는가.

성립하되, 그대로 옮기면 안 된다. 가게 단면은 손님이 머무는 자리라 "아는 것의 목록"이 서고, 골목 목록은 카드당 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부) — 카드에는 안 넣음(문패 철칙 ②)

2부가게 카드 해부도 — 얼굴 · 말 · 창 · 기록

카드 한 장의 새 뼈대. 다섯 층 전부 같은 크기 규칙 아래 선다 — 영상·사진·한마디가 있다고 카드가 커지지 않는다(문패 철칙 ②의 목록판). 다른 것은 크기가 아니라 시제다.

한울 한울농원 12 “수박이 오늘 아침에 다 익었어요.”오늘 한마디 3 다루는 것 수박 오늘 수확 · 재래식 된장 · 상추 외 2가지 4 양림동 · 지금 열려 있음 · 3월 4일에 문패를 걸었어요 5

최대 상태(한마디+수확+열림)여도 카드 한 장. 아래 3부에서 최소 상태와 나란히 선다.

1

문패 — 얼굴 (불변)

지금 그대로. 링은 오늘 한마디의 신호 — 다만 이제 신호가 가리키는 말이 같은 카드에 보인다. 링만 있고 말이 없던 것이 지금까지의 구멍이다.

2

이름 줄 — 상호 + 도장

지금 그대로: 본보기 도장(DemoBadge)·단골 도장. 도장은 늘리지 않는다 — 도장이 셋이면 훈장 진열장이 된다.

3

말 줄 — 날짜 붙은 한마디 (진짜 가게만)

있으면 말풍선 + "오늘 한마디", 24시간이 지나면 옅어지되 "8월 5일의 한마디"로 날짜가 남는다. 없으면 소개(intro)가 옅은 잉크로 이 자리에 — 지금 코드와 같되, 소개에는 따옴표도 날짜도 붙이지 않는다: 소개는 상태고 한마디는 사건이다. 둘을 같은 옷으로 입히던 것이 지금 카드의 두 번째 구멍이다.

4

창 줄 — 다루는 것

물건 이름 최대 3개 + "외 N가지". 사진 0 · 가격 0 — 가격표부터 보이는 골목은 없다는 기존 원칙 유지. 일주일 안 수확이 있으면 가장 신선한 것에만 harvestLabel() 문장 그대로("오늘 수확·어제 수확·N일 전 수확") 초록 라벨 하나. 정문의 "오늘의 직거래"와 겹치지 않는 이유는 3부에서.

5

기록 줄 — 동네 · 열림 · 날짜 하나

동네·열림(진짜만)은 지금 그대로. 더해지는 것은 날짜 한 줄: 진짜는 "3월 4일에 문패를 걸었어요"(created_at), 본보기는 "8월 5일에 본보기로 세웠어요". 카드가 품는 아는 것의 맨 윗줄이다 — 이 줄 덕에 빈 가게조차 날짜를 하나 가진다.

본보기 카드와 진짜 카드의 차이는 크기가 아니라 시제다. 진짜 카드는 사건이 쌓일수록 시제가 늘고(오늘 한마디·오늘 수확·지금 열림), 본보기 카드는 시제가 없다 — 날짜 붙은 말도, 수확 라벨도, 열림도 없이 "본보기" 도장과 "세운 날" 하나만 남는다. 골격은 같고, 도장·차림 견본까지 같지만, 말하지 않는 것으로 정직해진다. 없는 수확에 날짜를 달면 그 순간 열림 배지 사고(감독 정정)의 재판이다.

본보기 카드의 창 줄은 왜 남기는가.

본보기 물건 20건은 실재하는 DB 행이고, 정문이 이미 "사진 시연용" 표기와 함께 공개하고 있다. 본보기 카드의 창 줄은 차림 견본이다 — "진짜 가게가 서면 이 자리에 이렇게 차려진다"를 도장 아래에서 보여준다. 단 수확 라벨은 떼어낸다: 물건 이름은 차림이지만 "오늘 수확"은 오늘 일어난 사건의 주장이라, 본보기에 붙는 순간 거짓이 된다.


3부목록 전체 — 한 줄은 지키고, 이음새를 만든다

세로 한 줄은 맞다 — 골목은 한 줄이어야 골목이다(내 동네 렌즈가 필터가 아니라 정렬인 것과 같은 논리). 바꾸는 것은 둘: 차례(사건이 최근인 가게가 앞으로)와 이음새(진짜와 본보기 사이의 경계 한 줄).

차례의 규칙.

① 내 단골(로그인 시) → ② 오늘 기록이 있는 진짜(한마디·수확 최신순) → ③ 나머지 진짜 → 경계 문장 → ④ 본보기(고정 차례) → ⑤ 빈 터 카드. 어귀 문패 줄의 기존 rank와 같은 정신을 카드 목록에도 적용하는 것뿐이다 — 지금 카드 목록은 created_at 차례라 사건과 무관하게 서 있다. 내 동네 렌즈를 켜면 동네가 1차, 사건이 2차 — 렌즈의 "자르지 않고 앞으로 부른다"는 그대로다.

이음새 — 본보기 문장은 지금 잘못된 자리에 있다.

"이 골목의 N자리는 아직 본보기예요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다." — 문장은 옳고(정문과 오늘 합친 공용 문장, 원본 유지), 자리가 어귀 문패 줄 밑이다. 이 문장이 말하는 사건은 목록 안의 경계이므로, 문장을 그 경계 위에 세운다 — 진짜 카드들이 끝나고 본보기가 시작되는 이음새에. 진짜가 0인 오늘은 경계가 목록 맨 위라서 지금과 화면이 거의 같고, 진짜가 설 때마다 이 문장이 한 칸씩 아래로 밀려난다 — 물갈이 규칙이 눈에 보이는 사건이 된다.

창 줄이 정문의 "오늘의 직거래"와 겹치지 않는가.

장르가 다르다. 정문은 물건이 주어다 — 사진·가격·그리드, 탭하면 물건 시트. 골목의 창 줄은 사람이 주어, 물건은 술어다 — 이름만, 사진 0, 가격 0, 탭 목적지는 가게. 같은 진열대를 정문은 "무엇이 있나"로 읽고 골목은 "이 사람이 무얼 다루나"로 읽는다. 가격·사진이 골목 카드에 오르는 순간 두 화면이 겹치기 시작한다 — 그래서 창 줄의 상한은 글자다.

MOCK 1오늘 그대로 — 진짜 0곳, 전부 본보기여도 화면이 달라진다/madang/market

우리 골목

아는 사람의 가게들

이 골목은 호남신학대학교가 이웃을 위해 엽니다

여기부터 본보기

이 골목의 10자리는 아직 본보기예요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다.

양림 양림상점 본보기 동네 잡화를 다루는 자리예요. 다루는 것 햇감자 10kg · 방울토마토 · 참기름 양림동 · 8월 5일에 본보기로 세웠어요
나무결 나무결공방 본보기 원목을 손으로 다듬는 공방이에요. 다루는 것 도마 · 원목 소반 방림동 · 8월 5일에 본보기로 세웠어요
한그릇 한그릇 본보기 점심 한 끼를 짓는 밥집이에요. 다루는 것 손칼국수 · 보리밥상 봉선동 · 8월 5일에 본보기로 세웠어요
+
여기는 다음 가게의 자리예요
가게나 농장을 하시면 이 골목에 문패를 걸 수 있어요. 진짜 가게가 서면 본보기가 한 자리 물러납니다.
이 자리에 문패 걸기 →

오너의 문장("2차 화면이 그대로인데")에 대한 답이 이 목업이다. 진짜 가게가 한 곳도 없는 오늘도 카드마다 창 줄과 세운 날이 붙어, 열 장이 처음으로 서로 다르다.

본보기 카드에는 날짜 붙은 사건이 없다 — 말 줄 자리엔 소개(옅은 잉크), 수확 라벨 없음, 열림 없음. 세운 날 하나가 유일한 날짜이고 그건 실제 사건(행이 생긴 날)이다.

"지금 N곳이 문 열었어요"가 없는 이유 — 진짜 0곳이면 그 줄은 렌더하지 않는다(기존 감독 정정 유지).

MOCK 2진짜 둘이 선 날 — 경계가 아래로 밀려난다/madang/market (미래 상태)

우리 골목

아는 사람의 가게들 · 지금 2곳이 문 열었어요

이 골목은 호남신학대학교가 이웃을 위해 엽니다
한울 한울농원 “수박이 오늘 아침에 다 익었어요.”오늘 한마디 다루는 것 수박 오늘 수확 · 재래식 된장 · 상추 외 2가지 양림동 · 지금 열려 있음 · 3월 4일에 문패를 걸었어요
이도 카페 이도 “새로 볶은 원두가 들어왔어요.”8월 5일의 한마디 다루는 것 핸드드립 원두 200g · 드립백 사직동 · 지금 열려 있음 · 6월 20일에 문패를 걸었어요

여기부터 본보기

이 골목의 8자리는 아직 본보기예요. 진짜 가게가 올 때마다 한 자리씩 내어드립니다.

양림 양림상점 본보기 동네 잡화를 다루는 자리예요. 다루는 것 햇감자 10kg · 방울토마토 · 참기름 양림동 · 8월 5일에 본보기로 세웠어요
여기는 다음 가게의 자리예요
이 자리에 문패 걸기 →

같은 화면의 두 시점이 물갈이 규칙을 증언한다. MOCK 1과 2의 차이 전부가 DB 행의 차이다 — 화면은 규칙을 새로 말하지 않고, 경계 문장이 밀려난 위치와 줄어든 숫자가 규칙을 보여준다.

한울과 이도의 차이가 곧 카드의 문법이다 — 오늘 말한 가게는 링과 진한 말풍선, 이틀 전에 말한 가게는 옅은 말풍선과 날짜. 둘 다 같은 크기, 다른 시제.

목록에 세우지 않는 것

물건 사진 레일 · 카드 안 상품 그리드

물건이 주어가 되는 순간 정문의 "오늘의 직거래"와 같은 화면이 둘이 된다. 골목의 축은 "누구에게서"다.

"양림동 3곳" 같은 동네별 카운트 헤더

개수는 밀도 없음의 자백 — dongsOf()가 개수를 화면에 안 내보내는 기존 원칙 그대로.

지도 뷰

지도는 밀도를 만들지 못하고 비추기만 한다 — 핀 10개가 흩어진 그림은 "우리 골목"의 반증이다(기존 판정 유지).

"이번 주 발걸음 N번" 같은 활기 집계

발걸음 총 0. 집계 문장은 첫 발걸음들이 쌓인 뒤의 일이고, 그때도 본보기 발걸음은 세지 않는다.


4부가게 단면([slug]) — 같은 병, 같은 약

단면의 병도 같다 — 상호·주소·시간·물건 전부 무시제. 약도 같다: 이미 있는 날짜를 꺼낸다. 더하는 것은 셋뿐이고, 그중 둘은 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일의 한마디"로.

MOCK 3가게 단면 — 진짜 가게, 비로그인/madang/market/hanul

‹ 골목

한울

한울농원

농장 · 양림동

“수박이 오늘 아침에 다 익었어요.”오늘 한마디
사진 · 오늘 나온 것
오늘 나온 것 — 한마디와 함께 올랐어요
문 여는 때매일 08:00–18:00 · 지금 열려 있음
가는 길광주 남구 양림동 25-3
전화061-000-0000
전화로 물어보기 길 찾기 명함

다루는 것

양림밭 수박 1통오늘 수확15,000원 / 통
재래식 된장 500g5일 전 수확12,000원 / 통
유기농 상추3,000원 / 봉

우벨이 아는 것

  • 3월 4일 이 골목에 문패를 걸었어요
  • 8월 7일 오늘 수확한 물건이 올라왔어요
  • 8월 7일 오늘 한마디를 걸었어요
다녀왔어요

구조는 안 바꿨다. 찾아가는 줄이 물건보다 위(단면의 헌법)는 그대로 — 더해진 것은 사진 한 장, 라벨 문장 통일, 그리고 바닥의 날짜 목록뿐이다.

"우벨이 아는 것"은 자랑이 아니라 회계다. 발걸음도 후기도 영상도 없는 가게가, 그래도 오늘 세 줄의 날짜로 말할 수 있다 — 쇼호스트 판정의 목록판 실증.

본보기 단면은 지난 라운드 처방 유지(전화·발걸음 걷어내고 개설 문 하나) + 기록 줄 하나만 추가: "8월 5일에 본보기로 세웠어요". 아는 것 목록은 본보기에 그리지 않는다 — 본보기가 아는 것을 쌓는 척하면 안 된다.


5부문장표 — 검사법: 오늘 DB에서 한 행이라도

O·X는 "이 문장이 말하는 사건을 오늘 DB에서 한 행이라도 보여줄 수 있는가"로만 판정했다. X는 지우지 않고 무엇이 서야 O가 되는지 적었다. 코드 변경이 필요하지만 DB가 이미 아는 것은 O다(비고에 표시).

화면문장말하는 사건오늘 DBX면 무엇이 있어야 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_atO코드: 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_atO
가게 단면 · 아는 것8월 7일 오늘 수확한 물건이 올라왔어요그 가게 listing의 harvest_date=오늘O
가게 단면 · 아는 것우벨이 6월 12일에 이 가게에 다녀왔어요노출 가능한 심방 방문 기록 행Xmunpae_ok_at은 000183이 비노출을 약속한 초상권 원장 — 그걸 꺼내 쓰면 안 된다. 노출용 심방 기록 한 줄(날짜만)이 서는 날 O
가게 단면이 가게를 세 번 넘게 찾은 이웃이 N이에요market_visits 집계(이름 없는 숫자)X집계 공개 RPC 하나 — 그리고 N≥1이 되는 날(쇼호스트 표와 동일 판정)
골목 카드봄부터 쉰두 번의 한마디가 쌓였어요한마디 이력 행들Xtoday_note는 덮어쓰기라 이력이 없다 — note history가 서는 날 O
골목 카드 · 도장단골my_shop_visits ≥ 3 (로그인 본인 것만)O기존 유지 — 이름 없는 내 발걸음, 남의 단골 수는 위의 X와 별개
⚠구현자에게. ① 위 문장 전부 한 문장 = 한 줄(템플릿 리터럴 하나)로 — 여러 줄로 쪼개면 공백이 사라져 "어느 교회가봤는가" 사고가 재발한다. ② 날짜가 문장 속에 들어가는 자리("3월 4일 문패를…")는 조사가 숫자 뒤라 분기가 없지만, 가게 이름 뒤에 조사가 필요해지는 문장을 새로 만들면 반드시 lib/korean.tsparticle(). ③ 최소 변경 목록: 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(아는 것의 목록) — 이 문서는 그 판정의 목록판이다