:9977 브레인큐 상주서버 — /translate·/twin/next 라우트 추가
개요
org.crowny.brainq(launchd, :9977 크라우니코드 뇌 상주 조회 서버)에 기존 /q,/status,/reload
라우트를 무손상 유지한 채 번역·사고트윈 노출 라우트 2종을 추가했다. 신규 데몬 등록 없음 —
기존 launchd 잡을 kill→KeepAlive 자동재기동으로만 반영.무엇을 했는지
1. GET /translate?d=<en2ko|ko2en>&q=<문장>
- 기동 시
/Users/ef/crowny-butler/libs/실어휘코드북v2_한글.psv(4169행, Concepticon EN↔KO)를
- 단어급(공백 토큰) 치환. 미등재 토큰은
[원문]그대로. - ko2en은 조사 접미 스트립(에서/으로/을/를/이/가/은/는/의/에/로/와/과/도/만, 정본과 동일 순서·목록)
- 방향 자동감지:
d파라미터가 en2ko/ko2en이 아니면 첫 글자 코드포인트로 판별(정본과 동일 규칙). - 응답 첫 줄:
번역|<방향>|단어급|매핑N/전체N(어순 스왑 생략을 "단어급"으로 정직 표기),
- 정본 대조:
~/.claude/scripts/브레인번역.한선(RPN VM, 조사스트립+어순스왑 포함 원본)과
PLUM TREE en2ko, 자두를 밤나무가 ko2en)으로 직접 실행 대조 — 매핑수·치환 결과
단어 단위로 일치 확인(정본은 hanseonc 배열캡 4095로 en2ko 캐시가 4095행 절단되는 기존 VM
함정이 있어, 이 JS 서버가 오히려 4164행 전량을 커버 — 알려진 차이, 버그 아님).2. GET /twin/next?steps=<CSV트릿열>&n=<N>
~/.claude/scripts/큐트릿격자.한선의 부스트업모드를 child_process(crownyc run)로 직접 호출,
사고트윈.sh의 run_qg()와 동일 프로토콜(CROWNY_QG_MODE=부스트업모드,
CROWNY_QG_STEPS, CROWNY_QG_BOOST 환경변수 경유).
- 컴파일 캐시(
/tmp/사고트윈_큐트릿격자.toau)를사고트윈.sh와 공유 — 소스가 캐시보다 최신일 때만
hanseonc_high로 재컴파일.
- 타임아웃 10초, 실패 시
오류|트윈실행실패정직 반환. - 출력:
다음스텝후보|<트릿CSV>|<4상이름CSV>그대로 패스스루.
검증 결과
- launchd 재기동(kill PID → KeepAlive 자동재기동):
/status레코드/셀 수치 재기동 전후 동일
/q 회귀: 환불_판정 조회 HIT:상주|TAA 정상(재기동 전후 동일 응답)./translate 양방향 실측:PLUM TREE → 번역|en2ko|단어급|매핑2/2 / 자두 나무자두를 밤나무가 → 번역|ko2en|단어급|매핑2/2 / plum chestnut tree브레인번역.한선) 동일 입력 실행 결과와 단어 단위 일치 확인./twin/next?steps=1,1,2,0,1&n=2 → 다음스텝후보|2,0|타,옴 정상./q p50: 재기동 전 0.576ms → 재기동 후(라우트 추가 후) 0.705ms, 30회 샘플 max 6.8ms —관련 파일
/Users/ef/.claude/scripts/crownycode-brain-server.js— 상주 서버 본체(라우트 2종 추가)/Users/ef/.claude/scripts/crownycode-brain-server.한선— 동반 한선씨 축소 데모(라우트 개념 재현 추가)/Users/ef/.claude/scripts/브레인번역.한선— 번역 정본(RPN VM, 대조 기준)/Users/ef/.claude/scripts/사고트윈.sh,~/.claude/scripts/큐트릿격자.한선— 트윈 부스트업 원본/Users/ef/crowny-butler/libs/실어휘코드북v2_한글.psv— 코드북 데이터/Users/ef/Library/LaunchAgents/org.crowny.brainq.plist— 기존 launchd 잡(재등록 없음, kill+KeepAlive만 사용)
잔여 이슈 → 해결 (2026-07-07 후속)
위 두 잔여 이슈를 모두 해소했다.
1. 어순 스왑 이식 완료
- 코드북 로드 시 온톨로지 필드(col6)를
en2koMap/ko2enMap값에{word, onto}로 함께 보관하도록 확장. translateLine()을 토큰별 (word,onto,matched) 3배열 수집 → 인접쌍(j,j+1) 모두 매치 시
Action,Thing→스왑 / ko2en: Thing,Action→스왑) 재배열 루프로 재작성
— 정본 브레인번역.한선의 줄번역() 스왑 로직과 1:1 이식.
- 응답 태그
단어급→어순포함으로 갱신. - 대조표 (정본
브레인번역.한선RPN VM 직접실행 vs JS 서버/translate):
eat fish | 물고기 먹다 | 물고기 먹다 | ✅ |
| 스왑 역방향(Thing,Action) | ko2en | 물고기 먹다 | eat fish | eat fish | ✅ |
| 무스왑(Thing,Thing) 회귀 | en2ko | PLUM TREE | 자두 나무 | 자두 나무 | ✅ |- 동반
.한선축소 데모(crownycode-brain-server.한선)에도데모ONTO맵 + 동일 스왑 루프 이식,
EAT/FISH 예시 추가 — hanseonc_high 컴파일·실행 확인(스왑 4케이스 모두 정본과 일치, 최초
구현 시 ko2en 조사스트립 스템 추적 누락 버그 발견→데모조사스트립이 "값§스템" 팩 반환하도록
수정해 온톨 조회 키를 정확히 잡도록 고침).2. 코드북 mtime 감시 재로드 완료
/q의maybeReload()(DB mtime 3초 디바운스 폴)와 동일 패턴으로maybeReloadCodebook()추가,
maybeReload(); maybeReloadCodebook(); 호출.
- 검증: 코드북 파일
touch후 4초 대기 → 로그에코드북 mtime 변경 감지 — 재로드+
코드북 로드: 4164행 확인(재기동 없이 흡수, /translate APPLE 응답 불변 확인).재검증 (launchd kill→KeepAlive 재기동 후)
/status:58570|0|20|11.3%|...— 셀 구조·레코드 수 무손상./q회귀:환불_판정→HIT:상주|TAA정상(라우트 신설 전과 동일 응답 포맷)./qp50(30회 curl 왕복): 23.2ms(curl 프로세스 스폰 오버헤드 포함 — 서버 자체 응답은 기존과
/status 메모리 46.7MB로 안정).관련 파일(갱신)
/Users/ef/.claude/scripts/crownycode-brain-server.js— 온톨로지 보관·어순스왑·코드북mtime재로드 추가/Users/ef/.claude/scripts/crownycode-brain-server.한선— 동반 데모에 온톨스왑 이식(버그 수정 포함)