← 목록
기타 2026-07-19 6KB 읽기 6분

티옴타톡서버 — 세 엔진 통합 (Agent S)

개요

tok.tiomta.com:9929 HTTP 서버(티옴타톡서버.한선)를 신규 작성해 원장·톡·셀DB 세 엔진을 통합했다. 스펙 SSOT: /Users/ef/crowny-tiomta/tok/스펙.md §서버 API 계약.

무엇을 했는지

  1. 자체시험 게이트 추가(무게이트로 top-level 실행되던 함정 수정):
- 티옴타톡.한선 → TIOMTA_TOK_LIB 환경변수 게이트 - 티옴타셀DB.한선 → TIOMTA_CELL_LIB 환경변수 게이트 - (티옴타원장.한선은 기존 TIOMTA_LEDGER_LIB 게이트 그대로, 무수정)
  1. _원장훅 실배선: 티옴타톡.한선이 티옴타원장.한선을 직접 가져오기(import)하고,
_원장훅()이 스텁 카운터 대신 실제 원장기록(...)을 호출하도록 교체. 스텁 파일 (data/_원장스텁높이.psv) 의존 제거.
  1. 크로스파일 함수명 충돌 수리: 티옴타톡.한선과 티옴타셀DB.한선이 동일 이름의
내부 헬퍼(플로어나눗/나머지/_파일읽기안전/단언/단언참)를 각자 정의하고 있어, 서버 파일이 둘 다 가져오기하면 hanseonc_high가 "이름 충돌"로 컴파일 실패 (같은 파일 내 중복은 경고 없이 마지막 정의가 이기지만, 서로 다른 파일 간 동일명 함수는 하드 에러 — 신규 실측). 티옴타셀DB.한선 쪽 헬퍼를 _셀플로어나눗 등으로 개명해 해결(로직 불변, 셀DB 단독 컴파일/셀프테스트 회귀 없음).
  1. 예약어 함정 재발견: 메서드가 예약 키워드(가져오기/메서드/레지스터/선택/
전이/신호 계열)라 변수 메서드 = ... 바로 컴파일 에러. 방식으로 개명.
  1. 서버 골격: 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 바이트/ 문자 불일치 함정 회피).
  1. 라우트: 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건 시작)

잔여 이슈

  1. 포트 9929 충돌(견적서버 선점) — 실배포 전 해소 필요.
  2. URL 퍼센트 디코딩 미구현(경로/쿼리 모두) — 한글 파라미터를 encodeURIComponent로
보내는 클라이언트와 호환 안 됨. 필요 시 UTF-8 바이트 단위 percent-decode 헬퍼 추가.
  1. LaunchAgent 등록은 이번 스코프 밖(과제 지시대로 러닝 데몬 남기지 않고 종료함).