Extras · 사양 외 기능

사양서에 없는 부가기능

기능 사양서·스토리보드에 적지 않았지만 Zenith(manifast-platform)에 들어간 부가·운영 기능입니다. 에이전트가 이런 기능을 넣으면 요청 없이도 여기에 남깁니다.

구분 · 사양서·스토리보드= 제품 본기능. 부가기능 = 버전 뱃지·DX 등 사양에 없는 것. 함정·결정은 주요확인사항, 버그는 버그 리포트.

부가기능 목록 (13)

e13002026-08-17SDK · DX

사내 @zenith/zenith-sdk (Zenith 프로그램 ID 베이크)

앱은 zenith-sdk만 import한다. dist는 Manifest 클라이언트를 복사한 뒤 Core/Wrapper ID를 Zenith로 치환한다.

적용됨

설명

npm 이름 `@zenith/zenith-sdk`. 기본 프로그램 ID는 HQY4XUKnn… / CxbMmW7SWZ…. Manifest MNFSTqt… 로 주문을 보내지 않는다. 온체인 프로그램은 GPL 포크(zenith-program).

위치

packages/zenith-sdk · zenith-program

e12002026-08-14모바일 · 지갑

iOS Safari 세이프 에어리어 · Phantom 인앱 연결

노치/홈 인디케이터 여백, 입력 포커스 확대 방지. Safari에서는 ‘Phantom 앱에서 열기’(App Store 설치) 후 인앱에서 연결.

적용됨

설명

viewport-fit=cover + env(safe-area-inset). 모바일 input 16px. iOS Universal Link browse, 스토어는 App Store. 인앱 주입이 늦으면 폴링. iOS 16.4+(Phantom 16+).

위치

manifast-platform: [locale]/layout viewport · globals.css · phantomSolana.ts · SelectWalletModal

e11002026-08-14트레이드 UI

주문·취소 결과 알림 (PC 우측 하단 · 좁은 화면은 헤더 아래)

지정가 제출·즉시 체결·실패, 미체결 취소 성공·실패. PC는 오른쪽 하단, 모바일·태블릿은 헤더 아래 가로 한 줄. Phantom 확인 중은 넣지 않는다.

적용됨

설명

동시에 하나만. PC 약 3초, ≤1100 약 2.4초. 클릭하면 닫힘. 반대편 호가와 만나면 ‘체결되었습니다’, 호가에 남으면 ‘제출했습니다’.

위치

manifast-platform: TradeToasts · useTradeSession.showToast · TradeApp

e10002026-08-14차트

차트 하단 거래량(볼륨) 히스토그램

캔들 아래 봉마다 체결량 막대. 양봉 초록·음봉 빨강.

적용됨

설명

값은 candle_bars.volume(base 수량 합). 툴바 OHLC 옆에 V. 과거 봉은 --candles-only 백필로 채움. 라이브는 ingest가 체결마다 $inc.

위치

MarketCandleChart HistogramSeries · ingest incVolumeAllResolutions · backfill-fills --candles-only

e09002026-08-14웹 · SEO

Railway dev는 검색엔진 색인 차단

dev.zenith-dex.xyz(Railway `dev`)와 로컬은 구글 등에 안 잡히게 막는다. production만 색인 허용.

적용됨

설명

robots.txt Disallow, 페이지 meta robots=noindex, 응답 헤더 X-Robots-Tag. Host가 dev.로 시작하면 환경변수와 상관없이 차단.

위치

manifast-platform: app/robots.ts · middleware X-Robots-Tag · [locale]/layout metadata.robots · appEnv.shouldBlockSearchIndexing

e08002026-08-11트레이드 UI

태블릿(721–1100) 차트 아래 주문 · 호가 100% 2단

접이식·태블릿은 PC 셸을 쓰되 세로 순서를 차트 → 주문 → 호가(2단 가로 100%) → 미체결. 모바일(≤720)은 그대로.

적용됨

설명

workspace-main·main-grid는 display:contents로 풀고 order로 재배치. PC(1101+) 3열은 유지.

위치

manifast-platform: useIsTablet · trade-shell--tablet · globals.css 721–1100

e07002026-08-11운영 · ingest · trade-api

Helius RPC 실패 텔레그램 알림

서버가 Solana RPC(Helius) 호출에 실패하면 한국시간·에러 원문을 텔레그램으로 보낸다. 같은 유형은 5분에 1통.

적용됨

설명

그룹 방은 필수 아님. 봇 DM /start 후 chat id. 개발/운영 봇·채팅 분리. 토큰은 .env·Railway만, 깃 금지.

위치

manifast-platform: shared telegramAlert · ingest fillIndexer/marketWatcher · trade-api rpcRespond

e06002026-08-06트레이드 UI · trade-api

Solana RPC 장애 상단 배너

RPC 쿼터·한도·연결 문제로 잔고·미체결·주문이 실패하면 헤더 아래 노란 배너로 안내한다.

적용됨

설명

trade-api는 해당 에러에 HTTP 503 + code RPC_UNAVAILABLE. 웹은 잔고·openOrders·주문 상태 메시지를 모아 판별. PC·모바일 공통. 차트 mid 끊김만으로는 뜨지 않음(ingest 쪽 별도).

위치

manifast-platform: RpcIssueBanner · shared rpcErrors · trade-api rpcRespond · wallet/orders/tx controllers

e05002026-08-14PERF

PERF HUD 최소(FPS만) — 모바일 기본, PC는 토글

PERF 오버레이를 접으면 FPS만 작게 표시. 모바일(≤720)은 접힘이 기본, PC는 PERF 클릭으로 접고 펼친다.

적용됨

설명

펼치면 Frame·Heap·DOM. Pop out 팝업(/perf)은 제거. 개발 모드 또는 ?perf=1 일 때만 표시.

위치

manifast-platform: WebPerfHud.tsx · globals.css perf-hud--mini

e04002026-08-14지갑 · 헤더

Phantom 전용 지갑 + 연결 해지 확인 모달

Select Wallet은 Phantom만. 미설치 시 설치 안내(iOS App Store · Android Play · 인앱 딥링크). 주소 클릭 시 Disconnect 확인 모달.

적용됨

설명

Wallet Standard + 주입 provider. 일반 모바일 브라우저는 앱 설치를 몰라 browse 딥링크로 인앱을 연다(c0600). iOS 스토어 버튼은 App Store(id 1598432977). 현재 Phantom 앱은 iOS 16+. 해지 모달은 유저용 연결 해제만.

위치

manifast-platform: apps/web phantomSolana.ts · SelectWalletModal · DisconnectWalletModal · useTradeSession

e03002026-08-05realtime · 통계

하루 총 방문자(탭/SSE 연결) Mongo 집계

헤더 Online용 `/presence/stream`이 연결될 때마다 당일(KST) 누적 연결 수를 Mongo에 저장한다. 유니크 유저가 아니라 탭/SSE 연결 횟수.

적용됨

설명

컬렉션 `daily_visitors` — `_id`/`date` = YYYY-MM-DD(Asia/Seoul), `count`는 presence SSE 연결마다 +1(탭 닫아도 감소 없음). 시각은 `updatedAtTs`(Unix ms, 로직) + `updatedAtKst`(한국시간 문자열, Compass 확인). BSON Date는 UTC만 가능해서 표시용으로 쓰지 않음. Online(실시간 탭 수)과 별개. 조회: `GET realtime/stats/daily-visitors?date=YYYY-MM-DD`. fills·candle_series도 동일하게 `*Ts`/`*Kst` 패턴.

위치

manifast-platform: @zenith/shared time.ts · realtime mongoDailyVisitors · ingest fills/candles · GET /stats/daily-visitors

e02002026-08-05헤더 · realtime

헤더 Online(접속자 수) 표시

PC 헤더에 지금 사이트를 보고 있는 탭 수(Online)를 실시간으로 보여 준다. 모바일 헤더에는 표시하지 않는다(자리 부족).

적용됨

설명

브라우저가 realtime `GET /presence/stream` SSE에 연결되면 전역 접속 +1, 탭을 닫으면 −1. Redis presence 채널로 realtime 인스턴스 간 숫자를 맞춘다. 호가 SSE의 마켓별 viewers와는 별개(차트는 presence=0으로 마켓 시청자 미카운트). 연결 전이거나 실패 시 UI는 「—」. 모바일은 TradeShell만 Online pill을 쓰고 MobileTradeShell에서는 제거했다.

위치

manifast-platform: useOnlineCount · TradeShell online-pill · realtime presence.controller / presence.ts (모바일 헤더 미표시)

e01002026-08-05헤더 · DX

헤더 앱 버전 뱃지

브랜드(Zenith) 옆에 `vX.Y.Z`와 환경 라벨(local / dev / production)을 표시한다.

적용됨

설명

dev 배포마다 루트·apps/web package.json patch 버전을 올린다. 로컬·Railway dev·운영 모두 헤더에 보인다. 버전 문자열은 apps/web/package.json을 읽는다. 환경은 NEXT_PUBLIC_APP_ENV · RAILWAY_ENVIRONMENT_NAME · next dev(local)로 판별한다.

위치

manifast-platform: AppVersionBadge · TradeShell/MobileTradeShell 헤더 · .cursor/rules/dev-deploy-version.mdc