docs.crowny.org 사이트 정리 — /office 강등 · 에디터 통합 · nav 단일화 · 라이트 SSOT
개요
"Notion식 7앱(워드/시트/슬라이드/마인드맵/플랜/포커스)"을 어제(6/21) 8090 베어메탈 데모로 새로 만들었으나 — 이미 존재하는 정적 오피스(한선씨/정적/, /office)와 중복이었고
허브 핵심(견적/제안/도면)과도 맞지 않은 환상이었다. 실자산을 읽고 근거 기반으로 정리.원래 질문 3가지에 답:
- /office 어떻게? → 보조 도구로 강등 (실자산이므로 삭제 X)
- 메뉴 14개 과밀 → 1차 6 + 드롭다운 2 단일화
- 디자인 일관화 → crowny.org 라이트 SSOT 정렬
무엇을 했는지
① 어제 만든 환상 아카이브 (버림)
오피스/(bin·앱·정적·코어·테스트 전부 빈 스켈레톤) +베어메탈-…실행화면.html(정적 목업)- →
아카이브/2026-06-21-오피스7앱-환상/로 이동 + README(왜 버렸나 기록) - server-docs.js 참조 0건 확인 후 이동 → 라이브 영향 없음
② 에디터 3중복 통합 → 정적 /office 정본
- 기존: React
/편집(트랙2) · 정적/office(트랙1) · index.html 문서모드 = 3중복 /편집·/편집기→ 302 리다이렉트 /office (server-docs.js)- React SPA(dist)는
/app으로 보존(nav 비노출 레거시 — CDF v2·셀시냅스·AI추천 자산) - 정본 편집기 =
/office=한선씨/정적/index.html(sheet12+slide11+editor12 + 비즈니스 템플릿 14+)
③ nav 14개 평면 → 그룹 단일화
④ 라이트 SSOT 정렬
crowny-standard.css가 이미:root라이트 토큰(--bg#FAF9F7 --text#1A1A1A --accent#C9A961, crowny.org SSOT 일치) 보유- 홈.html이 이 CSS를 불러놓고도 인라인
<style>로 전부 다크 덮어쓰고data-theme="dark"였음 - →
data-theme="light"+ 인라인 스타일 전부var()토큰 기반 재작성. 하드코딩 다크색 제거 - 순수 CSS hover 드롭다운(JS 불필요)
관련 파일
홈.html— 전면 재작성 (라이트 + 그룹 nav + 에디터 통합 카드)server-docs.js— /편집·/편집기 302→/office, /app 분리 보존, 인라인 nav 4곳 교체한선씨/정적/crowny-standard.css— 라이트 SSOT 토큰 (기존, 그대로 활용)INVENTORY.md— 진입점 표 갱신 (/편집 리다이렉트, /app 레거시)아카이브/2026-06-21-오피스7앱-환상/— 버린 7앱 + README
검증 (라이브, 포트 4100)
- 홈: data-theme="light" + cd-nav + 도구/더보기 드롭다운 확인
- /편집 → 302 Location /office ✓
- /office 200, /app 200(React 보존) ✓
- 핵심 라우트 8종(/홈·문서함·견적서·제안서·도면·신규·qna·viewer) 전부 200 ✓
- 하위페이지(/tip·/docs) 새 인라인 nav 반영 ✓
- node --check 통과, 서버 무중단 재시작(PID 64543)
추가 작업 (2026-06-22 오후 — "둘다" 요청)
A. LaunchAgent 영속화 수정 ✅ 완료
- 깨진 원인: plist가 존재하지 않는
server.js를 가리킴(status=1). 실 서버는 수동node server-docs.js. - 수정: plist ProgramArguments →
server-docs.js. 수동 프로세스 정지 후launchctl bootout→bootstrap. - 검증: launchd 관리 PID 17536(status 0) → kill -9 테스트 → 27130 자동 재기동, /홈 200. 리스너 PID == launchd PID 일치.
- 이제 재부팅/크래시 시 KeepAlive(SuccessfulExit=false)로 자동복구.
B. 한선씨 라이브 컷오버 — 섀도 실측 + 단계 계획 (한 방 컷오버 불가 확정)
실측(섀도 4101에서버.한선→toau 기동):
서버.한선컴파일·기동 성공(59131 cubes 로드, 4101 LISTEN) — 그러나 모든 HTTP 요청에 000/무응답.
- 라우트 격차: live JS 59개 라우트 vs
서버.한선~26함수(login/signup/docs/cells/synapses/cdf기초/static).
- 핵심 사실: 견적/제안/도면 엔진(
*.rpn.한선)은 이미 한선씨. JS는 그걸 spawn하는 HTTP 글루 껍데기. 즉 도메인 로직은 이미 한선씨, 남은 건 글루.
- HTTP 처리층 수리 —
서버.한선이 요청에 응답부터 하게(TCP읽기 전체수신·Content-Length·응답 flush). 이게 선결. - 간단 라우트 패리티 — health/version/static/docs/login을 섀도 4101에서 JS와 1:1 비교 통과.
- 라우트그룹 단계 이관 — 견적/제안/도면/문서함을 한 그룹씩. 어려운 것(PDF·WebSocket·spawn)은 마지막.
- 섀도 풀패리티 통과 후에만 4100 스왑 (gwlive 방식).
B-2. 한선씨 HTTP 처리층 수리 ✅ 완료 (2026-06-22)
"고치기" 요청으로서버.한선의 HTTP 무응답(000)을 근본 수리. 두 버그 발견·수정(공유 lib 무수정, 로컬 수정만):버그①: TCP읽기 1인자 호출 → 영구 블록 (근본 원인)
- VM opcode 493(TCP_READ)은 2인자
[fd, 최대]를 pop.서버.한선은TCP읽기(클라이언트)1인자 →
read(garbage) 블록 → 모든 요청 무응답.
- 격리 에코 서버로 확증: 1인자=수락 후 읽기 블록 / 2인자=정상 200.
- 수정:
TCP읽기(클라이언트, 8191). 작동하는 라이브 서버들도 2인자(TCP읽기(연결, 16000)) 사용. - ⚠️ 동일 1인자 패턴 보유 서버 다수(crowny-ai·baraco·bible·bm 등) — 잠복 동일버그 가능. 이번엔 docs만 수정.
[]로 직렬화
서버.한선은맵생성/맵넣어해시맵 사용. 공유JSON.한선의JSON생성은 배열형 맵([k,v,...])만 지원 →
길이()==0이라 길이0→"[]" 분기로 오직렬화. /health·/api/version이 [] 반환.
- 수정:
서버.한선에 로컬맵JSON(값)헬퍼 추가(맵키목록+맵꺼내로 해시맵 순회, 그 외 값은 JSON생성 폴백) →
JSON응답이 이를 사용. 공유 JSON.한선 무수정(188모듈·다수 라이브 서비스 보호).
- 검증:
/health→{"status":"ok","app":"crownydoc","lang":"hanseon"}✓
/%ED… percent-encoded → 리터럴 비교 실패, /편집 302 미발화·한글 라우트 정적폴백) ④견적/제안/도면/문서함 실 핸들러 ⑤WebSocket·PDF·spawn ⑥TCP읽기 4095B 단일read 캡(대형 POST 트렁케이트).
→ 라이브 4100은 여전히 JS. 섀도 풀패리티 후 스왑.잔여 이슈
- 비즈니스 템플릿 트랙 비대칭(트랙1 14+ vs 트랙2 0)은 미해결(별도 과제).
- 블록다이어그램(OmniGraffle 대체) 여전히 미구현.
한선씨 동반 (2026-06-22 — JS→한선씨 정렬 원칙 준수)
JS 라우팅 변경을 한선씨 동반본에도 반영(컴파일 검증 완료):서버.한선—네비게이션()새 nav로 갱신 + 디스패처에/편집·/편집기 → 리다이렉트("/office")분기 추가. 컴파일 OK (1.65MB)server-docs.한선—라우팅()에/편집·/편집기 → "redirectToOffice"처리기 매핑 추가. 컴파일 OK (203KB)- 처음엔 "동반 대상 아님"으로 적었으나 — 한선씨 우선 원칙상 라우팅 로직도 동반 대상이며 이미 동반본이 존재해 정정·반영함.