티옴타톡서버 — 세 엔진 통합 (Agent S)
개요
tok.tiomta.com:9929 HTTP 서버(티옴타톡서버.한선)를 신규 작성해 원장·톡·셀DB 세 엔진을
통합했다. 스펙 SSOT:
/Users/ef/crowny-tiomta/tok/스펙.md §서버 API 계약.
무엇을 했는지
- 자체시험 게이트 추가(무게이트로 top-level 실행되던 함정 수정):
- 티옴타톡.한선 →
TIOMTA_TOK_LIB 환경변수 게이트
- 티옴타셀DB.한선 →
TIOMTA_CELL_LIB 환경변수 게이트
- (티옴타원장.한선은 기존
TIOMTA_LEDGER_LIB 게이트 그대로, 무수정)
- _원장훅 실배선: 티옴타톡.한선이 티옴타원장.한선을 직접 가져오기(import)하고,
_원장훅()이 스텁 카운터 대신 실제
원장기록(...)을 호출하도록 교체. 스텁 파일
(
data/_원장스텁높이.psv) 의존 제거.
- 크로스파일 함수명 충돌 수리: 티옴타톡.한선과 티옴타셀DB.한선이 동일 이름의
내부 헬퍼(
플로어나눗/
나머지/
_파일읽기안전/
단언/
단언참)를 각자 정의하고
있어, 서버 파일이 둘 다 가져오기하면 hanseonc_high가 "이름 충돌"로 컴파일 실패
(같은 파일 내 중복은 경고 없이 마지막 정의가 이기지만, 서로 다른 파일 간 동일명
함수는 하드 에러 — 신규 실측). 티옴타셀DB.한선 쪽 헬퍼를
_셀플로어나눗 등으로
개명해 해결(로직 불변, 셀DB 단독 컴파일/셀프테스트 회귀 없음).
- 예약어 함정 재발견:
메서드가 예약 키워드(가져오기/메서드/레지스터/선택/
전이/신호 계열)라
변수 메서드 = ... 바로 컴파일 에러.
방식으로 개명.
- 서버 골격: TCP대기/TCP수락/TCP읽기(2-arg)/TCP쓰기/TCP닫기 루프(참조=
/Users/ef/crowny-tiomta/티옴타AI.한선 패턴). bind 실패 시 while 루프에 안 들어가고
자연 종료(busy-spin 없음). 상태코드 200/201/400/402/403/404/500 명시 테이블
(미등록=200 함정 회피). Content-Length 생략 + Connection: close(한글 JSON 바이트/
문자 불일치 함정 회피).
- 라우트: GET /health, GET /api/tok/threads?src=, GET /api/tok/thread/<ID>,
POST /api/tok/send·recommend·mam, GET /api/tok/ladder/<사용자>,
GET /api/ledger/balance/<사용자>, GET /api/ledger/verify. 셀DB 엔진은 가져오기만
하고(통합) 스펙에 없는 별도 라우트는 만들지 않음("스펙 API 계약 그대로").
X-Crowny-Owner 헤더 없으면 게스트=쓰기 라우트 403.
검증
- 3파일(티옴타톡.한선·티옴타셀DB.한선·티옴타톡서버.한선)
CROWNY_STRICT=1 컴파일
경고 0.
- 톡 단독 실행 33/33 PASS(원장 실배선 후에도 회귀 없음), 셀DB 단독 실행 17/17 PASS
(게이트 추가 후에도 회귀 없음).
- 종단 curl 검증: health→threads(출처필터 실측: 벤허츠/크라우니/전체)→send(게스트
403·오너 200, GET thread로 메시지 반영 확인)→recommend 비구매자 403→
원장기록("CD이체")로 철수 시드 100000(x100)→mam 성공(원장높이 1→2, 잔고
100000→95000)→mam 잔고부족 402(needed 10,000,000 > balance 95,000)→
ladder/balance/verify 정상→
서버 재기동 후 height=2·balance=95000 그대로 복원
(WAL PSV 영속 확인).
- ⚠ 실측 중 발견: 포트 9929가 원래 이 서비스에 배정된 포트(gateway.yaml 등록됨)임에도
불구하고, 무관한 crowny-erp 견적서버(PID,
crowny-erp/core/servers/견적서버.toau,
23시간+ 가동 중, 포트 레지스트리에 9929 등록 없음 — 정식 erp 포트는 9938)가
선점하고 있었다. 다른 세션의 프로세스일 가능성을 배제할 수 없어 임의 종료하지
않고, 검증은 임시 포트 19929(소스는 9929 그대로, 컴파일 직전 sed로만 임시 치환한
사본으로 실행)로 수행했다.
실제 9929 배포 전에 이 포트 충돌을 해소해야 한다
(견적서버가 무엇인지 확인 후 재배치 또는 종료는 사용자/담당 세션 판단 필요).
- curl 자체 한계: curl이 URL 경로(path) 세그먼트의 비ASCII(한글)를 자동
percent-encode하지만
쿼리스트링은 그대로 보냄(버전별 상이 가능) — 서버는
URL 디코딩을 하지 않는다(이 생태계의 다른 한선씨 서버들과 동일 관례,
예: 티옴타AI.한선도 미디코딩). 경로에 한글 사용자ID가 들어가는
/api/ledger/balance/<사용자>·
/api/tok/ladder/<사용자> 검증은 curl 대신
raw 소켓(python)으로 바이트를 그대로 보내 확인했다. 실서비스에서 브라우저/JS
클라이언트가 encodeURIComponent로 인코딩해서 보낼 경우 서버가 못 받는다 —
향후 개선 과제로 남김(현재 스펙엔 URL 인코딩 요구사항이 명시돼 있지 않아
이번 스코프에서는 미구현).
관련 파일
/Users/ef/crowny-tiomta/tok/스펙.md — SSOT
/Users/ef/crowny-tiomta/tok/티옴타원장.한선 — 무수정(기존 게이트 재사용)
/Users/ef/crowny-tiomta/tok/티옴타톡.한선 — 게이트 추가 + _원장훅 실배선 + 원장 가져오기
/Users/ef/crowny-tiomta/tok/티옴타셀DB.한선 — 게이트 추가 + 헬퍼 개명(충돌 회피)
/Users/ef/crowny-tiomta/tok/티옴타톡서버.한선 — 신규(HTTP 서버 :9929)
/Users/ef/crowny-tiomta/tok/data/ — 검증 후 빈 상태로 정리(실배포 전 원장복원() 0건 시작)
잔여 이슈
- 포트 9929 충돌(견적서버 선점) — 실배포 전 해소 필요.
- URL 퍼센트 디코딩 미구현(경로/쿼리 모두) — 한글 파라미터를 encodeURIComponent로
보내는 클라이언트와 호환 안 됨. 필요 시 UTF-8 바이트 단위 percent-decode 헬퍼 추가.
- LaunchAgent 등록은 이번 스코프 밖(과제 지시대로 러닝 데몬 남기지 않고 종료함).