2026-08-02
요약 (AI 작성)
세션 아카이브 UI 를 처음부터 끝까지 만든 날입니다. 로컬 세션 아카이브 부트스트랩에서 출발해 카드 그룹화, 워크스페이스 범위 필터, 검색 필터, 선택 항목의 로그 안전 노출, 상세 탭 열기와 bounded 상세 파싱, 새로고침 컨트롤을 차례로 붙였습니다. 도크가 짧을 때 상세를 감추고 높이에 clamp 하는 처리, 검색 시 숨겨진 선택 해제, 소스 컨트롤 스크롤 높이 보존, 아카이브 순회의 no-follow 유지, 변경 없는 세션 요약 캐싱 같은 세부도 함께 다뤘고, 아카이브 세션을 활성 pane 의 cwd 로 스코프하도록 고쳤습니다.
동시에 chrome 을 Metal UI 로 옮기는 토대를 놓았습니다. Metal UI 레이아웃과 시각 게이트를 문서로 정의한 뒤 typed flex layout 코어, 중첩 Metal UI rect 트리, typed UI paint resolver, typed pointer interaction seam 을 넣고 Metal overlay lowering 을 추출했습니다. 검증용으로 test-only Lab lowering seam 과 결정적 Lab 시나리오, Metal Lab readback 캡처를 만들고 Lab 카드 clip 기하와 시나리오 액션 seam 을 테스트로 덮었습니다. 그 위에서 Session Dock 컴포넌트 트리를 연결하고 픽셀 단위 스크롤 투영과 refresh anchor 보존, archive detail 패널 마운트까지 이었으며, 레거시 tui 설정 항목은 숨겼습니다.
session-host 는 generation 소유권(CR3a)을 새로 세웠습니다. 소유권 계약을 정의·확정하고 skeleton 과 generation attachment shell, batch registry 와 adapter 를 붙였으며 초기 snapshot 의 소유를 generation 이 갖도록 했습니다. 함께 ended stream purge 를 명세하고 준비했으며 ended event hot peek 과 공유 stream 연산 permit, client poison 결과 분류, 실행 중 reconnect 계약 정의가 이어졌습니다. 안정성 쪽은 tmp 정리가 살아 있는 host 의 endpoint 를 지우지 못하게 하고 캐시를 비워도 세션을 잃지 않게 했으며, 셸 통합 파일이 사라지면 다음 탭에서 다시 만들도록 고쳤습니다.
파일 패널의 리치 모드는 문법 목록 잠금을 원문 보존 규칙으로 대체해 모르는 조각을 그대로 지키도록 바꿨고, 블록 조각에 렌더 미리보기와 로컬 이미지를 붙이되 반쪽 조각은 미리보기를 감추도록 했으며, 읽기 모드가 문서에 직접 쓴 HTML 을 그리도록 신뢰 shell 삽입의 단일 예외를 열었습니다. CI·테스트에서는 Zig 0.16 sleep API 전환, diff 워커 경합으로 죽던 테스트, Trash 복원 대기, cwd follow 뷰포트 픽스처 안정화, IPC 없이 session-host 테스트를 돌리는 조정이 있었습니다.
커밋
ohah/maru
- feat(chrome): mount archive detail panel
- feat(chrome): add archive detail panel component
- feat(chrome): preserve session dock refresh anchor
- feat(chrome): project session dock scroll in pixels
- feat(session-host): prepare ended stream purge
- docs(agent): define session dock pixel scroll
- feat(chrome): connect session dock component tree
- feat(session-host): add ended event hot peek
- feat(session-host): add shared stream operation permits
- feat(chrome): add Metal Lab readback capture
- docs(session-host): specify ended stream purge
- test(chrome): cover Lab card clip geometry
- fix(chrome): make Lab action target measurable
- test(chrome): cover Lab scenario action seam
- feat(chrome): build deterministic Lab scenarios
- feat(chrome): add test-only Lab lowering seam
- fix(session-host): align snapshot process test domain
- feat(session-host): own generation initial snapshots
- refactor(chrome): extract Metal overlay lowering
- feat(chrome): add typed UI paint resolver
- test(file-tree): stabilize cwd follow viewport fixture
- feat(chrome): add typed pointer interaction seam
- feat(chrome): hide legacy tui setting entry
- docs(chrome): keep layout status in tracking docs
- feat(chrome): add nested metal ui rect tree
- feat(session-host): bind generation batch adapter
- feat(session-host): add generation batch registry
- feat(chrome): add typed flex layout core
- docs(chrome): specify pointer interaction ownership
- docs(chrome): define Metal UI layout and visual gates
- docs(agent-sessions): define native dock components
- fix(file-tree): follow active terminal cwd
- fix(ci): run session host tests without IPC
- fix(ci): avoid Zig test runner IPC failure
- test(agent): cover active pane cwd scope refresh
- fix(agent): scope archive sessions by active pane cwd
- feat(agent): open archive session detail tabs
- feat(agent): parse bounded archive session detail
- feat(agent): group archive session cards
- docs(agent): define grouped archive session UI
- fix(agent): clarify workspace scope availability
- feat(agent): filter archive by workspace scope
- fix(agent): clear hidden selection on search
- feat(agent): filter archive snapshot by search
- fix(agent): hide detail when dock is too short
- fix(agent): clamp archive detail to dock height
- feat(agent): show archive detail actions in dock
- feat(agent): reveal selected archive log safely
- feat(agent): retain verified archive source identity
- fix(agent): preserve source control scroll height
- feat(agent): add archive refresh control
- fix(agent): keep archive traversal no-follow
- perf(agent): cache unchanged session summaries
- feat(agent): add session archive bootstrap
- docs(session-host): define CR3a-2b ownership gates
- feat(session-host): add generation attachment shell
- test(app-session): use Zig 0.16 sleep API
- test(file-panel): wait for trash restore completion
- test(app-session): diff 워커 경합으로 죽던 테스트 셋을 고칩니다
- fix(shell-integration): 통합 파일이 사라지면 다음 탭에서 다시 만듭니다
- fix(session-host): tmp 정리가 살아 있는 host의 endpoint를 지우지 못하게 합니다
- fix(session-host): 캐시를 비워도 살아 있는 세션을 잃지 않게 합니다
- docs(session-host): close CR3a-2 ownership contract
- ci: allow cold macOS session-host gates to finish
- feat(session-host): add CR3a generation ownership skeleton
- feat(file-panel): 리치가 로컬 이미지를 그리고, 반쪽 조각은 미리보기를 감춥니다
- feat(file-panel): 리치의 블록 조각에 렌더 미리보기를 붙입니다
- docs(session-host): define CR3a ownership contract
- feat(session-host): classify client poison outcomes
- fix(session-host): observer로 강등된 터미널의 입력 불가를 알립니다
- feat(file-panel): 문법 잠금을 걷어내고 모르는 원문 조각을 보존합니다
- docs(file-panel): 문법 목록 잠금을 원문 보존 규칙으로 대체합니다
- docs(file-panel): 리치 HTML 미리보기를 신뢰 shell 삽입의 단일 예외로 엽니다
- docs(session-host): 실행 중 reconnect 계약을 정의합니다
- feat(session-host): consume typed control semantics
- docs(session-host): define f3c2 semantic take
- feat(file-panel): 읽기 모드가 문서에 직접 쓴 HTML을 그립니다