← 목록
한선씨 2026-06-21 7KB 읽기 7분

docs.crowny.org 순수 한선씨 오피스 스위트 재구축

개요

docs.crowny.org(기존 5,052줄 Node.js, :4100)를 순수 한선씨로 재작성해 CrownyVM(crownyc) 위에서 구동. 사용자 확정 범위: 단일 마크다운 문서뷰어가 아니라 7앱 통합 워크스페이스(워드·프리젠테이션·스프레드시트·마인드맵·플랜·포커스·아웃라인). 기존 문서뷰어는 아웃라인 앱이 흡수. 울트라 병렬(Workflow 11모듈 빌드) + 울트라 딥리서치 동시 가동으로 진행.

무엇을 했는지

  1. 스카우트 3종(병렬): 기존 server-docs.js 19개 라우트군 매핑 / 한선씨 HTTP 라이브러리 카탈로그(네트워크.한선이 부분수신·대형응답 함정 해결) / CrownyVM·CrownyOS 런타임 경로(호스트 crownyc VM = TCP/FILE opcode 완비로 즉시 가능, 베어메탈 OS는 네트워크/스토리지 HAL 시뮬이라 미래 트랙).
  2. 울트라 병렬 빌드(Workflow): 공유코어 4 + 7앱 = 11개 한선씨 모듈을 sonnet 에이전트 병렬 작성, 각자 hanseonc_high 컴파일 자체검증. 11/11 전부 컴파일 성공(총 ~5,536줄). 1차는 스키마 한글키 400에러로 전멸 → ASCII 키로 수정 후 재실행 성공.
  3. 울트라 딥리서치: 블록기반 통합 데이터모델(Notion), 스프레드시트=의존성트리→계산체인 위상정렬(Excel 공식문서), 트리 레이아웃=Reingold–Tilford O(n), 파일기반 협업=Merkle-DAG 버전관리 — 7앱 설계 근거 확보.
  4. 메인 서버 조립 + 디버깅:
- 오피스서버.한선 작성 — 11모듈 가져오기, TCP대기(9090)→디스패치 루프. - 앱별 TCP닫기 정책 불일치 흡수: 아웃라인/마인드맵/플랜/포커스=내부 닫기, 워드/시트/프리젠=메인이 닫기(실측 검증 후 디스패처 분기). - 퍼센트 디코딩 추가: 브라우저/curl이 한글 경로를 %인코딩(/워드/%ec%9b%8c%eb%93%9c) → 디스패치 전 디코딩(퍼센트디코딩, 코드값/글자변환 기반). 이거 없으면 전 앱 404. - 이름충돌 수정: _목록JSON(워드+마인드맵), _목록UI(워드+프리젠) 중복 → 가져오기 순서상 마지막이 전역 덮어씀(워드가 프리젠 UI 서빙, 워드 목록이 마인드맵 빈목록 호출). 워드 함수를 _워드_목록*로 rename. - 저장_목록 중앙수정: 파일목록()+_목록파싱.json 접미사 검사가 한글 파일명에서 깨짐 → 신뢰성 있는 인덱스파일(_index.txt, 글자() 문자단위) 우선. - 시트 API 중첩 수정: /api/시트/*/시트 게이트 안에 갇혀 404 → API 체크를 게이트 밖으로.
  1. 검증: 7앱 UI 전부 HTTP 200, 전 API 목록 응답, 워드/시트 CRUD+자동ID 왕복 성공.

관련 파일

  • 메인: /Users/ef/CrownyDoc/오피스/오피스서버.한선 (포트 9090, 퍼센트디코딩+디스패치)
  • 코어: /Users/ef/CrownyOS/crownyc/libs/오피스_{코어,저장,인증,렌더}.한선
  • 앱: /Users/ef/CrownyOS/crownyc/libs/오피스_{아웃라인,워드,프리젠,시트,마인드맵,플랜,포커스}.한선
  • 기동: /Users/ef/CrownyDoc/오피스/시작.sh (loopback+타임아웃, 게이트웨이 사이드카 권장값)
  • 데이터: /Users/ef/CrownyDoc/오피스/데이터/<앱>/<아이디>.json + _index.txt
  • 토대 레퍼런스: /Users/ef/CrownyOS/crownyc/apps/예제_HTTP서버_견고.한선, libs/네트워크.한선
  • 빌드 워크플로우: office-suite-hanseon-build-wf_c81e6cd7-14b.js

실행

bashbash /Users/ef/CrownyDoc/오피스/시작.sh
curl http://127.0.0.1:9090/health        # {"status":"ok","engine":"crowny-office","apps":7}
# 게이트웨이 자동결선: office.crowny.org (crowny-ports.sh set 완료, HTTPS 자동)
도메인 등록: office.crowny.org → :9090 (라이브 docs.crowny.org:4100 무영향, 별도 프리뷰).

2차 잔여작업 완료 (2026-06-21, 울트라 병렬 7에이전트 + 중앙 통합)

  • 응답봉투 {ok,...} 전면 통일: 7앱 목록/로드/저장/삭제 + UI JS 동기화. 8/8 엔드포인트 "ok":true 확인. (해소)
  • 시트 수식엔진 심화: SUM/AVG/MIN/MAX + 괄호 우선순위(재귀하강 파서) + 2D 범위(A1:C1) + 셀참조 해석 + 순환참조 감지. 실측: SUM=60·AVG=20·MAX=30·(A1+B1)*2=60 정확. (해소)
  • 플랜 간트 다중작업: _플랜_간트작업파싱 객체별 슬라이싱으로 작업마다 개별 시작오프셋/기간 산출(t0 offset0 dur9, t1...). (해소)
  • 마인드맵 깊은 자동배치: BFS 임의깊이 방사형(깊이별 반지름+150, 형제 부채꼴 균등). 손자까지 배치 확인. (해소)
  • 포커스 정렬 영속: _정렬.txt 순서저장→목록 재배열. (해소)
  • 함수명 전역충돌 근절: 7앱 전부 헬퍼를 앱접두사화(_시트_, _플랜_...). 11모듈 충돌 0건 재검증. (해소)
  • 시트 한글 \x 이스케이프 버그: 에이전트가 응답 JSON 한글키를 \xEC\x95\x84(="아이디") 바이트로 작성 → 한글 리터럴 6종 치환. (해소)
  • 모듈 총 4,121→5,023줄로 성장. 메인 toau 7.1MB. 종합검증 PASS=15/15.

3차 작업 (2026-06-21, 3전선 병렬 — 세션한도로 일부 미완)

  • 전선 C 앱심화2 (7/7 완료·통합, 8/8 검증 PASS): 세션한도는 에이전트 구조화반환만 막았고 Write+컴파일은 7앱 모두 완료돼 있었음. 아웃라인=[[위키링크]]+백링크+전문검색 / 워드=버전 diff(/워드/비교) / 플랜=CPM 임계경로(ES/EF/LS/LF/slack/마일스톤) / 시트=차트 SVG(/api/시트/차트?범위=)+셀서식 / 마인드맵=노드 색상+드래그좌표 / 포커스=오늘뷰+@컨텍스트 필터+반복작업 / 프리젠=테마5종(다크/라이트/골드/블루/미니멀)+레이아웃. 프리젠 테마는 발표HTML에 테마CSS 미배선 갭을 직접 수정(기본 다크 뒤 테마CSS 오버라이드 주입, 라이트→#f5f5f0·골드→#1a1200 확인). TCP닫기 정책·충돌0 검증, 7앱 UI 200, 메인 9.2MB.
  • 전선 A 베어메탈 딥리서치: QEMU virt MVP 경로 확정 → 2026-06-21-베어메탈-크라우니OS-오피스-MVP계획.md. (virtio-mmio/smoltcp/virtio-blk+FatFs, 실HW는 후순위.)
  • 전선 B 한글ID 근인 확정(정정): 스케일 아님(323K큐브 standalone 정상) → 요청처리 중 str_gc가 경로 문자열 stomp. 버퍼 단일할당 회피도 미해결 → crownyc.c str_gc 루팅 수술 필요(고위험·엣지케이스라 보류). 메인의 퍼센트디코딩은 버퍼 단일할당본으로 교체(할당 감소).

잔여 이슈 (남은 것)

  • 한글 ID 쿼리 엣지케이스: ?id=<한글> 로드 시 경로쿼리값이 빈값(229K큐브 라이브에서 글자변환 재조립 문자열+부분() 슬라이싱 STR풀 스케일 함정). 실사용 ID는 아이디생성이 ASCII(doc-358686737)라 정상 흐름 무영향 → VM(crownyc.c) 내부 수술 필요해 알려진 한계로 확정. UI는 항상 ASCII 자동ID 사용.
  • 시트 셀 저장 계약: 셀맵을 body에 JSON문자열("cells":"{...}")로 전달해야 함(본문JSON값 1레벨 한계). 그리드 UI는 이 계약 준수.
  • 베어메탈 CrownyOS 구동: 현재는 호스트 crownyc VM. OS 위 직접구동은 Tegra/RK3588 EQOS·SDHCI 드라이버 + 앱 런타임 필요(미래 트랙).
  • 딥리서치 검증 일부: 레이트리밋으로 일부 클레임 투표 실패(핵심 findings는 견고).