2026-07-02
요약 (AI 작성)
오늘은 maru의 앱 시작·생명주기 안정성에 집중한 날이었습니다. 비정상 시작으로 프로세스가 죽어도 앱을 종료하지 않고 창을 유지하도록 lifecycle 루트커즈를 잡고, 시작-hold를 exit-code 게이트·grace window·죽은 입력 가드·좀비 reap으로 강화했습니다. 여기에 held 창 UX(재시도 ⏎·지속 안내·config 노브)를 얹고, 잘못된 shell.command로 앱이 크래시하던 문제는 기본 셸 폴백으로 막았습니다. 시작 디렉터리(workspace.root)를 GUI 필드로 노출해 셸 경로 오용 트리거를 없애고, PTY login 래퍼가 셸 경로·인자를 작은따옴표로 감싸 공백 경로 word-split도 방지했습니다.
렌더링 쪽에서는 사이드바 스피너를 sync(2026) 게이트에서 독립적으로 present하도록 분리하고, ESU edge로 폴링이 놓친 완성 프레임을 flush하도록 고쳤으며, 관측 로거를 .sync로 승격했습니다. 워크스페이스 직렬화 리더를 key-addressed 방식으로 전환해 스칼라 필드의 additive 하위호환을 확보하고 진화 계획도 문서로 남겼습니다. 이 밖에 사이드바 카드별 좌측 accent 막대색을 우클릭 메뉴로 배경색과 별도 지정할 수 있게 하고, 데스크톱 알림 제목에 발신 위치(탭 › 팬)를 접두하는 등 UX 다듬기도 이어졌습니다.
커밋
ohah/maru
- feat(workspace): 직렬화 리더를 key-addressed로 — additive 스칼라 필드 하위호환
- fix(sidebar): code-review high 반영 — 배경 tint 카드 모양·이중 tint·파서 상한
- feat(app): 비정상 시작 사망 시 앱 종료 대신 창 유지 (lifecycle 루트커즈)
- docs(workspace-restore): 직렬화 진화 계획 — 스칼라 필드 key-addressed 파싱(미구현)
- feat(sidebar): 카드별 좌측 accent 막대색 — 우클릭 메뉴로 배경색과 별도 지정, 비활성에도 표시
- fix(config): 잘못된 shell.command에 앱 시작 크래시 방지 — 기본 셸 폴백
- fix(render): sync(2026) ESU edge로 폴링이 놓친 완성 프레임 flush
- feat(render): 사이드바 스피너를 sync(2026) 게이트에서 독립 present
- fix(app): 시작-hold 강화 — exit-code 게이트·grace window·죽은 입력 가드·좀비 reap
- feat(settings): 시작 디렉터리(workspace.root) GUI 필드 — 셸 경로 오용 트리거 제거
- fix(pty): login 래퍼가 셸 경로·인자를 작은따옴표로 감싼다 (공백 경로 word-split 방지)