CrownyOffice B-셸 통합 라이브 검증 + 런타임 오류 2건 수리
개요
빌더 산출 요약(office-shell/focus/outline/home/module-bridge/enhance-sheet/enhance-slide/office-commands 9파일)이 이미 index.html에 배선 완료된 상태를 인수받아, 라이브(docs.crowny.org/office) 통합·런타임 검증을 수행. 헤드리스 크롬 스모크에서 실제 TypeError 2건을 발견해 최소수정으로 수리.
무엇을 했는지
- 가드레일 로드됨 —
/Users/ef/.claude/templates/한선씨-가드레일.md 전체 로드.
- 배선 상태 점검: index.html은 이미 9개 신규 JS(office-shell.js 최상단 + focus/outline/home/module-bridge/enhance-sheet/enhance-slide/office-commands 하단) + office-design-tokens.css + 인라인 registerModule×8/switchMode 별칭/gotoModule 1회 호출까지 전량 배선 완료 상태였음(추가 배선 불필요, 병렬 세션이 선행 완료).
- 컴파일 검증:
CROWNY_STRICT=1 ./hanseonc_high office-shell.한선 → 0 경고, crownyc run → office-shell.한선 자체시험: 통과=12 실패=0 ALL_PASS.
- node --check: 9개 JS 전부 + index.html 인라인
<script> 추출본 — 전부 통과.
- 라이브 curl 검증:
/office 200, 8탭(data-mod home/doc/sheet/slide/mind/focus/outline/plan) 전부 존재, 신규 9파일(8 JS + tokens.css) 전부 200, ?mode= 8종 전부 200. 로컬 index.html과 라이브 응답이 byte-identical(diff 무차이, 81 script 태그 일치, meta charset UTF-8 확인) — 정적 서빙이라 재기동 불필요.
- 헤드리스 크롬 스모크 (
--headless --dump-dom --enable-logging=stderr): 최종 DOM에 8탭 마크업 전부 존재 확인. 콘솔에서 실제 런타임 에러 2건 적발:
-
[CrownyShell] onEnter(doc) TypeError: CrownyOffice.toolbar.render is not a function —
office-shell.js가 아니라 index.html 자체 인라인 스크립트가 등록한 doc onEnter 훅이
CrownyOffice.toolbar.render()를 호출하는데,
CrownyToolbar(editor-toolbar.js) 생성자가 이미
this._build()로 자체 렌더링하며
.render 메서드는 애초에 존재한 적이 없음(구현 확인: editor-toolbar.js에
.render prototype 없음,
_build만 존재). 기본 활성 탭이 doc라 페이지 로드마다 100% 발동하는 치명 오류.
-
Uncaught TypeError: Cannot create property 'innerHTML' on string 'ch-today-embed' —
home.js의
_renderTodayEmbed()가
document.getElementById('ch-today-embed')로 실제 엘리먼트(
el)를 받아놓고, 정작
CrownyFocus.renderTodayInto() 호출 시
el 대신 문자열 리터럴
'ch-today-embed'를 그대로 넘김(복붙 실수).
focus.js의
renderTodayInto(el)는
el.innerHTML=...을 바로 호출하므로 문자열에 innerHTML을 만들려다 TypeError.
- 최소수정 적용 (허용 범위 내:
index.html, home.js):
-
index.html:
CrownyShell.registerModule({id:'doc', onEnter:function(){ CrownyOffice.toolbar.render(); ...}}) →
CrownyOffice.toolbar.render(); 호출 제거(툴바는 생성자에서 이미 빌드됨, 존재하지 않는 메서드 호출만 삭제).
-
home.js:
global.CrownyFocus.renderTodayInto('ch-today-embed') →
global.CrownyFocus.renderTodayInto(el).
- 재검증(같은 턴): 정적 서버라 재기동 없이 즉시 반영 —
curl로 라이브 파일에 수정 반영 확인(toolbar.render 문자열 소거, renderTodayInto(el) 확인). 헤드리스 크롬 재실행 → TypeError 콘솔 로그 0건, 8탭 마크업 유지, 홈 모듈의 ch-today-embed/focus-root/od-panel-title 마크업이 정상 주입됨(수정 전에는 이 지점에서 예외로 중단되었을 렌더가 정상 완주).
관련 파일
/Users/ef/CrownyDoc/한선씨/정적/index.html (수정: doc onEnter 훅에서 무효 .toolbar.render() 호출 제거)
/Users/ef/CrownyDoc/한선씨/정적/home.js (수정: renderTodayInto(el) 인자 버그 수정)
/Users/ef/CrownyDoc/한선씨/정적/office-shell.js, focus.js, outline.js, module-bridge.js, enhance-sheet.js, enhance-slide.js, office-commands.js, office-shell.한선 — 라이브 검증만(수정 없음)
잔여 이슈
- 한선씨 동반 미완(의도적 보류): PostToolUse 훅이
index.html 수정 시 index.한선 동반을 요구했으나, 이번 과제 프롬프트가 "허용 편집 범위: index.html + 이번 워크플로 신규 9파일만"으로 명시 고정되어 있어 10번째 신규 파일 생성을 보류함. crownycode-learn.sh search로 기존 패턴 조회 결과 MISS(재사용 가능한 기존 패턴 없음). 후속 세션이 스코프 확장을 받으면 index.한선(부트스트랩 로직 요약) 동반 작성 필요.
- 디자인대조.sh FAIL(오탐 의심): PostToolUse 훅이
/Users/ef/CrownyBrowser/tools/디자인대조.sh로 .tabbar/.tab/.toolbar/.omni/.bm/.ib 셀렉터 부재를 FAIL 보고했으나, 이는 CrownyBrowser 자체 셀렉터 체계이고 이번 Office 셸은 별도 SSOT(설계파일 office-design/unpacked.html 기반 .od-* 클래스 + office-design-tokens.css)를 따르는 페이지라 셀렉터 불일치가 예상된 결과로 판단됨. 실제 오피스 디자인 토큰(brand/accent/canvas/surface/ink/line, Pretendard/JetBrains Mono) 준수 여부는 이번 세션에서 별도 재검증하지 않았음 — 필요 시 오피스 전용 디자인 대조 스크립트로 후속 확인 권장.
- 라이브 스모크에서 발견된 그 외 로그(ServiceWorker blob: 등록 실패, Manifest URL 경고)는 기존부터 있던 별개 이슈로 이번 과제 범위 밖(수정하지 않음).