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