Skip to content

HBHR100_시트 워크스페이스 (공통 Shell) ​

⚠ 8월 UX 재편 대규모 반영 — 전면 재작성 별도 예정

(Hereby) HR 급여 관리 > 시트 워크스페이스 (공통 Shell)

프로토타입TBU
Statusreview
Owner카나 (PM)

개요 ​

월 단위 스프레드시트 워크스페이스의 **공통 레이아웃(Shell)**을 정의한다. 글로벌 헤더 · 워크스페이스 헤더(월 네비게이션 · 이번 달 · 이전 월 가져오기 · 단축키 · 폴더 관리 · 새 시트 만들기) · 좌측 사이드바 · 시트 헤더 · 스프레드시트 툴바 · 서식 도구 모음 · 데이터 그리드 · 하단 합계행이 모든 시트 유형에 공통으로 얹힌다. 진입 시 인증 검사를 수행하며, 미인증 시 /hr-system/signin으로 리다이렉트한다. 시트는 「설정 중 → 사용 중 → 작업 완료」의 수명주기를 가지며, 각 단계에 따라 상태 배지(시트 헤더 h3 위치)·구조 편집 잠금·반영 버튼 노출이 달라진다. 본 문서는 Shell 골격과 진입 동선을 정의하고, 각 구역 상세는 하위 문서에 위임한다.

문서 히스토리 ​

날짜작성자팀변경 내용
2026-07-06카나PM최초 작성
2026-07-10카나PM라이브 기능 검토 반영
2026-07-13카나PM버튼 행동 명세 보강
2026-07-21카나PMGC700 깊이 재작성
2026-07-21카나PM가독성 패스 + 액션 표기 (GUIDE §7·§8)
2026-07-21카나PM셀 스타일 확정판 적용 (콸 승인)
2026-07-24카나PM코드 변경 반영(7635459)
2026-07-28카나PM코드 변경 반영(aed8800)
2026-07-29카나PM역방향 동기화 — 개발팀 직접 수정 반영(3637e20, 백틱 이스케이프)
2026-08-11카나PM시트 수명주기·수식 범위 바·조건부 서식·IFERROR·드로어 재편 반영(#528·#533·#540 머지)
2026-08-12카나PM수식 순환 방지·채우기 핸들 통일 반영(471f3db·8d38bed)
2026-08-13카나PM불리언 리터럴·표시 형식, 엑셀식 =/<> 연산자 반영(90bc68f·b862772)
2026-08-17카나PM라이브 실사 검증 반영(dev v0.1.0+)
2026-08-21카나PMcolumnLayout 중복 컬럼 키 서버 검증 반영(91782a7) — 조용한 헤더 붕괴 재발 방지
2026-09-17카나PM「급여대장」 빈 폴더 상시 노출·삭제 되살아남 문제 해소 반영(#754, d123698, CS-OKBEST-260917-0002)
2026-09-18카나PM읽기 전용 셀 사유 안내 토스트+바로가기(f9ccac1, #790)·상시 시트 안내 배너 닫기(2433f1f, #788) 반영 — 커밋 근거, 라이브 실사 이월(TBU). ⚠️ 상시(에버그린) 시트 상위 기능(#713) 사양서 미반영 갭 확인 → 후속 이월
2026-09-23카나PM시트 AI 변경 세트(제안→미리보기→적용→되돌리기, 2204a6b #821)·변경 세트 카드 버튼 활성 수정(c51d76d #824)·열 레이아웃 변경 제안(cdc6685 #822)·급여 정산 도구 5종·단계 그라운딩(b590afa #827)·업로드 임포트 매핑 단계+검증 리포트+임포트 변경 세트(eea3dac #832)·임포트 되돌리기 휴지통·수식 열 인식 수정(1193e00 #836)·admin 임베드 시트 어시스턴트 FAB 노출·도크 비키기(9d73c12 #853, CS-OKBEST-260922-0002) 반영 — 커밋 근거, 라이브 실사 이월(TBU)
2026-09-23카나PM열 설정 「종류」 라디오 비어 보임·수식바 캐럿 어긋남 수정(6457e48 #867, CS-OKBEST-260923-0002·0003)·식별 열 항목별 도움말(1e0dffe)·행 컨텍스트 메뉴 다중 선택 대상 규칙(4d75d89 #868, MED-705)·AI 레이아웃 변경 세트의 수식 열 종류 유지(73f8bfc #872, CS-OKBEST-260923-0005)·식별 근로계약 값 시트 년월 기준 전환(b2a0dc0 #873, MED-703) 반영 — 커밋 근거, 라이브 실사 이월(TBU)
2026-09-25카나PM낮 스윕 라이브 실사 — 행 메뉴 다중 선택(ㄴ70-R: "3개 행 선택됨…" 안내·「선택한 N개 행 보호/삭제」 라벨)·열 설정 「종류」 라디오 3종 정상 렌더(값 직접 입력/ƒ 수식 계산식/식별 직원 정보 + 고급 종류 — CS-0002 수정 검증)·헤더 우클릭 메뉴 항목 채록(열 설정/반영 소스 보기/새 열 추가/열 삭제/정렬/수식 편집/일괄 변경/이름 바꾸기/조건부 서식/헤더 색/이 열까지 고정/열 숨기기)·「전체화면」 버튼(ㄴ23-A) 실측. 읽기 전용 토스트(ㄴ5D)는 합성 이벤트로 미발화 — TBU 유지
2026-09-21카나PM시트 어시스턴트 마운트(조직별 모듈 opt-in·읽기 전용 도구 8종·선택 영역은 키만 전달 — 1cfa01e #810, 4829289 #812, 18f766b #815)·전체화면 토글(Ctrl+Shift+F, iframe→부모 메시지 — b41697d #808, 046033b #813)·새 시트 템플릿 지연 로딩(1a27d31 #803, UI 불변) 반영 — 커밋 근거, 라이브 실사 이월(TBU)
2026-10-01카나PM구글 시트식 시트 UX(메뉴 「편집」→「수정」·저장 상태 표시·서식 도구 모음 확장·메뉴 검색·셀 값 변경 이력·단축키 개편·레일 폭 조절 — ccea0b9e #831)·적용 필터 띠/숨긴 행 띠(8aecd9c5 #881)·팀 범위 배지·히스토리 권한 게이트·진입 권한 모달 제거(89fe2a6f #916, cba75f41 #936, cc7bb723 #930)·첫 한글 음절 입력(23000c37 #940, 4dbca86d #952)·권한 없는 시트 참조 셀 「권한 없음」(3a6093fd #954)·변경 세트 적용/되돌리기 칸 이력 기록(a39bce86 #955)·PERIODSTART/PERIODEND/DATEDIF·문자열 리터럴·조직 시간대 TODAY()(d5aa87d9 #956)·히스토리 값 변경 불러오기 실패 안내(fe029463 #968) 반영 — 커밋 근거, 라이브 실사 이월(TBU)
2026-10-01카나PM수식 ROUND 반올림 방식 엑셀 일치(half away from zero — 33ab86f9, #901)·업로드 매핑 미매칭 「직접 연결」 피커·전 탭 검증(f2a6921f, #887) 반영 — 커밋 근거, 라이브 실사 이월(TBU)
2026-10-02카나PM설정 중 시트 「직원 추가」 버튼 노출(ㄴ64C·64)(7170d1a6, #978) · 직원 선택 즉시 표시·기간 열 자유 입력(ㄴ70-C1·C2)(2c578aa5, #1010) · 행/셀 메뉴 「예약 변경…」「계약 시행일 변경…」(ㄴ70-RS)(14c13f52, #974 · a0298fde, #962) · 시트 어시스턴트 예약 변경 제안·승인(ㄴ70-AI-F)(85812e19, #983)·붙여넣기 첨부 칩·끊긴 턴 복구(ㄴ70-AI-G)(70d9a7df, #1005) · 수식바 「북마크한 열」·시트 전환 넘김 포인터(ㄴ60-B·ㄴ71)(8284d800, #982 · 99a24b42, #979) — 커밋 근거, 라이브 실사 이월(TBU)
2026-10-03카나PM히스토리 「변경 세트」 확인 대기 [적용]/[취소]·출처 「예약 변경」·예약 목록 「승인」 확대(ㄴ64E·ㄴ64H·ㄴㄴ70-RS1)(30fe6180, #1021) · 변경 세트 적용·되돌리기 즉시 다시 그림·토스트 1회(ㄴ64H)(f3647829, #1025) · 연도 없는 날짜·날짜 열 대시 → 빈 칸(ㄴ70-C3)(a61b5dd7, #1028) · 함수 QUOTIENT·WEEKDAY·ISHOLIDAY(ㄴ75E)(845fa997, #1029 · 622b6663, #1031) — 커밋 근거, 라이브 실사 이월(TBU)
2026-10-07카나PM시트 검색 이력 드롭다운(ㄴ52, e3bdf36b #1063, MED-919·918) · 팝오버 편집기 클릭 유지(ㄴ70-C1, 5cd3483 #1039, MED-886) · AI 레이아웃 제안 선택지 동반·형식 diff(ㄴ70-AI-C, 23dd8e3 #1038, MED-885) · 필터 축소 시 스크롤 보정(ㄴ70-F1 신설, c4fd9a2d #1066, MED-936) · 행 페이징 결정적·중복 제거(ㄴ70-P 신설, 94f83b0e #1044, MED-899) 반영 — 커밋 근거, 라이브 실사 이월(TBU). ⚠️ 시트 접근 권한 공유 선택기(entityPicker, #1063)는 공유 모달 사양 미채록 — 후속 이월
2026-10-08카나PM(10/7 머지분) 시트 위치 안내(ㄴ70-AI-H 신설 — 기능 바로가기 4종·열 위치 보기·관리자 임베드에서도 시트 어시스턴트가 안내·저장된 열 ID 재확인·고정 열 폭 반영, #1043) · 시트 초기화 시 안내 콜백 자동 실행 오류 수정(ㄴ70-AI-H 비고, 9b5c1908 #1082) · 셀 예약 창 「이 칸」/「다른 진행 중 예약」 분리·「모든 예약 보기」 시트·직원 범위 이동·같은 칸·같은 달 중복 차단(ㄴ70-RS, bee96793·3d441c2e #1084, MED-827) 반영 — 커밋·코드 근거, 라이브 실사 이월(TBU). 공유 대상 선택기 검색창 입력이 목록을 거르지 않던 결함 수정(c84bc2d0 #1109, MED-918 — 급여대장 「접근 권한」·드라이브 「권한 관리」)은 entityPicker 행 미채록이라 행 반영 없이 이월 유지
2026-10-10카나PM(10/9 머지분) PR #1128(MED-976) 반영: 시트 공개 범위 사고 방지 — 이전 월 가져오기 문구·대상 기준 교체(ㄴ22)·이월 공개 형태 라벨·「모두 비공개로 가져오기」(ㄴ22a 신설)·접근 권한 모달 「지정한 팀·개인만 (권장)」 우선+전체 공개 경고(ㄴ22b 신설)·컨텍스트 메뉴 「전체 공개로 전환」 라벨 — 라이브 실증 완료(10/10, 가져오기·접근 권한 모달 원문 채록)

Data I/O ​

Server → Client ​

변수DB 엔티티.컬럼값 없을 때비고
$조회 월 (YYYY-MM)당월 기본상단 Month·Year 스피너와 연동
$PayrollSheet.folder (추정)"(미분류)" fallback좌측 폴더 트리 ([[HBHR108_폴더·휴지통 사이드바]] 참조)
$PayrollSheet[] (추정)Empty 상태 (70-E)폴더별 카운트 표시
$PayrollRecord[] (추정)빈 그리드"293/293건" 형태 카운트
$PayrollSheet.updatedAt (추정)hide헤더 "· 4시간 전" 형태

Client → Server ​

액션전달 값tRPC / SDK권한 토큰
인증 세션 검증—sdk.auth.session() (추정)HR_ADMIN / SUPER_ADMIN
기간 변경(시트 리스트 재로드)periodsdk.payrollSheet.list() (추정)payroll:read (추정)
시트 검색query (사번/성명/사유/항목)클라이언트 필터 (추정)—
새 시트 생성name, folder, isPublic, templatesdk.payrollSheet.create() (추정)payroll:write (추정)
셀 편집rowId, columnId, valuesdk.payrollSheet.updateCell() (추정)payroll:write (추정)
폴더 관리 모달 열기—클라이언트 (추정)payroll:write (추정)
시트 작업 완료 토글sheetId, isLockedsdk.payrollSheet.toggleComplete() (추정)payroll:write (추정)
시트 설정 완료(수명주기 확정)sheetIdsdk.sheetView.finishSetup() (추정)canManageSetup (추정)
시트 재설정sheetIdsdk.sheetView.reopenSetup() (추정)canManageSetup (추정)
변경 세트 제안·조회sheetId, 변경 조건(필터·매핑)sheetChangeSet.create / get / listpayroll:write (추정)
변경 세트 적용·취소·되돌리기changeSetId, confirmedsheetChangeSet.approve / execute / reject / revert (apply는 tRPC 예약어라 execute)payroll:write (추정)

화면 플로우 ​

공통 Shell 사양표 ​

번호항목/기능명타입사양 및 기능 설명연관/영향 범위비고
00화면 진입 조건-• 조건1 [HR_ADMIN] / 조건2 [SUPER_ADMIN] 인증 시에만 워크스페이스를 노출하는 인증 게이트
• 진입 시: 인증 세션 확인
 - CASE01 [미인증]: /hr-system/signin 리다이렉트
 - CASE02 [인증 세션]: 워크스페이스 진입 허용
인증 세션인증 게이트
01초기 상태-• 진입 직후 최근 작업 시트로 자동 이동시키는 기능
• 진입 시: /hr-system/sheets/{sheetId}로 자동 리다이렉트
 - CASE01 [최근 시트 없음]: 동선 미확정
기간 네비게이터(20)TBU: 최근 시트 없을 때 진입 동선
02다이얼로그 (DS 교체)-• 워크스페이스의 네이티브 alert/confirm/prompt를 전부 DS 다이얼로그로 교체. confirm→askConfirm(Promise<boolean>), alert→showAlert, 오류는 showError(제목 "오류" + danger 톤)로 감싸고, 컴포넌트 밖 모듈은 dialog-bridge로 같은 모달에 닿는다. 단순 안내·검증 메시지(셀/행 선택 요청, 시간 형식 오류 등)는 모달 대신 토스트로 내려 흐름을 끊지 않는다
 - CASE01 [원본 기록 변경 확인]: 배치 전체가 in-flight Promise를 공유해 한 번만 물음
워크스페이스 전역 다이얼로그신규 (코드 반영: be83131) · 네이티브 팝업 폐지
10글로벌 헤더-• 좌측 로고 "hereby HR 급여 관리", 우측 계정 / 알림 / 로그아웃을 담는 전 화면 고정 헤더—전 화면 고정
ㄴ11계정Button• 로그인 계정을 표시하는 헤더 버튼
• 클릭 → TBU
—TBU: 표시 값·클릭 동작
ㄴ12알림Button• "알림"을 표시하는 헤더 버튼
• 클릭 → TBU
—TBU: 상세 동작·에러 처리
ㄴ13로그아웃Button• 현재 세션을 종료하는 헤더 버튼
• 클릭 시: 세션 종료 후 /hr-system/signin (추정)
00 진입 조건
20워크스페이스 헤더-• 월 네비게이션 + "이번 달" + "이전 월 가져오기" + "단축키" + "폴더 관리"(7/21 신규) + "새 시트 만들기" 액션을 담는 상단 헤더 바period 변경 시 시트 리스트 재로드월 단위
ㄴ21월 네비게이션-• "이전 달" / "2026년 7월"(현재 월 표기) / "다음 달" 이동 + "이번 달" 빠른 이동으로 조회 월을 바꾸는 기능
• 이동 시: period 변경 → 시트 리스트 재로드
 - CASE01 [period 없음]: 당월 기본
period 변경 시 시트 리스트 재로드
ㄴ22이전 월 가져오기Button• 이전 월의 시트를 현재 월로 복제하는 "이전 월에서 가져오기" 모달을 여는 기능
• 클릭 시: 모달 오픈 → 이전 월의 내가 볼 수 있고 현재 월에 없는 시트 복제(기본 시트는 자동 생성으로 제외)
 - (10/9 머지, #1128, MED-976) 모달 원문 교체: "이전 월의 시트 중 내가 볼 수 있고 현재 월에 없는 시트를 복제합니다. 기본 시트는 자동으로 생성되므로 제외됩니다." (10/10 라이브 실증) — 남의 비공개 시트는 대상에 안 나옴
[[HBHR108_폴더·휴지통 사이드바]] 이전 월에서 가져오기 모달신규 · 문구 교체(#1128) · TBU: 에러·실패 동작
ㄴ22a이월 공개 형태 안내·「모두 비공개로 가져오기」 (MED-976)Modal• (10/9 머지, #1128) 가져오기 모달 대상 목록의 시트마다 공개 형태 라벨(「전체 공개」(적색)·「부분 공개 {n}」(청색)·「비공개」(회색) — 「모두 비공개로」 체크 시 전부 「비공개」)
• 안내 notice(전체 공개 포함 시 경고 톤): "지난달 공개 형태가 그대로 이어져요 — 전체 공개 {n}개. 부분 공개 시트는 공유 대상(팀·개인)과 만든 사람이 그대로예요. 전체 공개 시트는 급여 관리자 전원과 모든 팀장(자기 팀·하위 팀 직원의 행)이 봐요." (10/10 라이브 실증 원문)
• 체크박스 「모두 비공개로 가져오기」 + "공유 대상 없이 나만 볼 수 있게 만들어요. 이번 달 내용을 확인한 뒤 공개할 때 써요." (라이브 원문) — 켜면 사본 전부 비공개(공유 대상 제거), 확인 후 「접근 권한」에서 공개
• 가져온 뒤 「공개 형태 안내」 창에서 어떤 형태로 들어왔는지 재안내(가이드 근거)
carry-forward.ts · carryForwardPrivate신설 (#1128) · 라이브 실증 2026-10-10(전체 공개 1개 케이스)
ㄴ22b시트 공개 범위 — 접근 권한 모달 개편 (MED-976)Modal• (10/9 머지, #1128) 「접근 권한」 모달 공개 범위 select 개편: 옵션 순서·라벨 교체 — 「지정한 팀·개인만 (권장) — 만든 사람 + 아래 목록」(private, 첫 옵션) / 「조직 전체 — 급여 관리자 전원 + 모든 팀장(자기 팀 행)」(shared)
 - CASE01 [비공개]: info notice "부분 공개를 권장해요 — 함께 볼 팀·개인만 아래에 추가하세요. 전체 공개는 꼭 필요할 때만 써 주세요." (10/10 라이브 실증)
 - CASE02 [전체 공개]: 경고 notice "전체 공개 중이에요 — 급여 관리자 전원과 모든 팀장(자기 팀·하위 팀 직원의 행)이 이 시트의 급여·개인정보를 볼 수 있어요. 필요한 사람만 보게 하려면 「지정한 팀·개인만」으로 바꾸고 아래에서 공유 대상을 골라 주세요(권장)." (패치 원문)
 - 전체 공개로 전환하는 액션은 경고를 거침(setSheetAccessVisibility — 「그래도 전체 공개」 확인, 가이드 근거)
• 사이드바 컨텍스트 메뉴 라벨 「공개로 전환」 → 「전체 공개로 전환」(패치 근거)
sheet-access.html · access.ts신설 (#1128) · 모달 라이브 실증 2026-10-10(비공개 시트) · 전환 경고 플로우는 저장 금지상 실사 미실행
ㄴ23단축키Button• 4카테고리(탐색/선택/편집/메뉴·찾기) 단축키 도움말 모달을 여는 기능. 단축키 ⌘/(윈도우 Ctrl+/)로도 열고 닫음(예전 ? 키 폐지), 과거 보기 메뉴의 "단축키"가 헤더 버튼으로 이동
• 클릭 시: 단축키 도움말 모달 노출. 전체 카탈로그는 [[HBHR103_편집 메뉴·단축키]] 소유 — 아래 [단축키 카탈로그 포인터] 참조
[[HBHR103_편집 메뉴·단축키]] 참조보기 메뉴에서 이동 · 토글 키 ?→⌘/ (#831)
ㄴ23-A전체화면Button• 시트 화면에서 LNB·페이지 헤더를 걷어내고 본문만 채우는 「전체화면」. 관리자 패널 페이지 헤더 액션 자리에서 진입
• 단축키 Ctrl/⌘+Shift+F 토글 — 시트는 iframe이므로 메시지로 부모(admin)에 전달
• 복귀: ESC · 상단 중앙 「전체화면 종료」 · 다른 탭 이동
 - CASE01 [시트 안에 열린 모달 있음]: ESC가 모달을 먼저 닫고 전체화면 유지
• 단축키 도움말(ㄴ23)에 새 조합 표기
[[HBAD100_App Shell·사이드바]]신설 (코드 반영: b41697d #808 · 046033b #813) · 라이브 실사(2026-09-25): 시트 화면 페이지 헤더 「전체화면」 버튼 실측(토글 동작 미실행)
ㄴ24폴더 관리Button• 각 폴더를 "{n}개 시트"로 나열하고 하단 "+ 새 폴더"를 제공하는 "폴더 관리" 모달을 여는 기능. 상세 사양은 [[HBHR108_폴더·휴지통 사이드바]]에 위임
• 클릭 시: 폴더 관리 모달 오픈
 - 모달 원문 폴더 목록: "eCount 연동 2개 시트" / "급여대장 3개 시트" / "문서·서명 1개 시트" / "병동 6개 시트" / "시트 에러 발생 케이스 1개 시트" / "연장근무 1개 시트" / "인센티브 2개 시트" / "출퇴근 3개 시트" / "치료실 인센티브 1개 시트" / "휴직·퇴사 2개 시트" + "+ 새 폴더"
[[HBHR108_폴더·휴지통 사이드바]] 폴더 관리 모달7/21 신규 · "그룹"→"폴더" 용어 확정 · TBU: 에러·실패 동작
ㄴ25새 시트 만들기Button• 새 시트 생성 모달을 여는 기능. 새 시트 기본 생성 = 1000행 × 26열(A~Z, col_1~col_26)
• 클릭 시: "새 시트 만들기" 모달 오픈
[[HBHR101_새 시트 만들기 모달]] 참조기본 1000행×26열
ㄴ25-U업로드 임포트 (매핑 단계 · 검증 리포트 · 임포트 변경 세트)-• 「새 시트 만들기 › 업로드」에 매핑 단계를 추가해, 파일을 올리면 바로 시트가 생기지 않고 매핑 → 검증 리포트 → 승인 → 시트 생성 순으로 진행하는 기능
• 업로드 시: 서버가 파일을 storage에 보관하고 탭 요약 + 매핑 초안을 돌려준다(매핑 초안 우선순위 = 템플릿 매핑 > 휴리스틱). AI 매핑 제안이 초안을 한 번 다듬는다
• 검증 리포트 항목: 직원 연결 · 미매칭 · 중복 · 형식 불일치 · 수식 변환 · 합계. 리포트를 승인해야 시트가 생성된다
• 미매칭 행 직접 연결: 검증 리포트의 미매칭 행마다 「직접 연결」(동명이인이면 「후보에서 고르기」) 피커가 붙고, 고른 결과는 탭 매핑의 rowOverrides(원본 행 번호 → 직원 id — 파일마다 달라 템플릿 매핑에는 저장 안 함)에 저장돼 승인 시 자동 매칭보다 우선 적용. 동명이인 후보(candidates)는 리포트의 미매칭 행에 실려 오고 피커는 그 목록에서만 선택
• 승인 게이트: 승인은 모든 탭을 검증한 뒤에만 진행(종전: 활성 탭 리포트만 보고 전 탭 생성 — 보지 않은 탭이 검사 없이 만들어지던 문제 해소)
• 생성된 시트는 **임포트 변경 세트(kind=import)**로 남아 카드에서 적용 · 되돌리기 · 원본 보기가 가능(70-AI-A·70-AI-B 참조)
 - CASE01 [임포트 되돌리기]: 생성된 시트를 휴지통으로 보내고(삭제자 기록이 남아 휴지통에 정상 노출), 워크북은 지워진 시트를 다시 읽지 않고 시트 목록 화면으로 나가 시트 목록·휴지통을 재조회한다(되돌리기 직후 "Sheet not found" 발생 문제 해소)
 - CASE02 [캐시값 없는 수식 셀]: 계산값이 저장돼 있지 않은 수식 셀(openpyxl로 만든 파일)도 수식으로 읽어 수식 열로 인식한다
[[HBHR101_새 시트 만들기 모달]] 업로드 · [[HBHR102_파일 메뉴]] 📤 업로드 · [[HBHR108_폴더·휴지통 사이드바]] 휴지통 · 70-AI-A 변경 세트신설 (코드 반영: eea3dac #832) · QA(2026-09-22) 수정 반영: 휴지통·목록 재조회·수식 열 인식(1193e00, #836) · 미매칭 직접 연결·rowOverrides·전 탭 검증(f2a6921f, #887) · TBU: 라이브 실사 이월
ㄴ25-P템플릿 지연 로딩Perf• 새 시트 모달의 초기 조회를 제거하고 모달이 열릴 때 최신 템플릿 목록을 조회
 - 닫힌 모달의 변경 이벤트는 다음 열기에 반영
 - 기존 폼·직접 진입 동작은 불변(사용자가 보는 화면 변화 없음 — 첫 로딩만 가벼워짐)
[[HBHR101_새 시트 만들기 모달]]성능 (코드 반영: 1a27d31, #803) · UI 변화 없음
40좌측 사이드바-• "폴더" / "휴지통(🗑)" 탭, "▸▾" 접기, 폴더별 시트 그룹 + 건수를 담는 사이드바. 폴더 10종은 아래 [폴더 트리] 참조
 - Empty: [[HBHR108_폴더·휴지통 사이드바]] 참조
[[HBHR108_폴더·휴지통 사이드바]] 참조상세 위임
ㄴ41폴더 트리List• 폴더 10종((미분류) / eCount 연동 / 급여대장 / 문서·서명 / 병동 / 시트 에러 발생 케이스 / 연장근무 / 인센티브 / 출퇴근 / 치료실 인센티브 / 휴직·퇴사)을 나열하는 트리. 각 시트 항목 = "{이름} '26.7" + 건수
• 클릭 시: 해당 시트 로드
 - CASE01 [폴더 없음]: "(미분류)" fallback
 - CASE02 [「급여대장」 폴더]: 이름 있는 폴더는 급여대장 시트 혼자 세우지 못함 — 0개짜리 빈 「급여대장」 폴더가 상시 노출되던 문제 + 폴더 삭제가 되살아나던 문제 해소(CS-OKBEST-260917-0002). (미분류) 버킷·사용자가 만든 빈 폴더는 그대로 유지
[[HBHR108_폴더·휴지통 사이드바]] 참조"그룹"→"폴더" 용어 확정 (7/21) · 빈 급여대장 폴더·삭제 재생성 수정(코드 반영: d123698, #754)
50시트 헤더-• 시트명·기간 + 건수 "293/293건" + 수정시각 "· 4시간 전" + 검색 + 뷰 토글(전치/행렬) + 메모 이력 + 셀 상세 패널 표시 + 시트 닫기 + 실행취소/재실행 상시 버튼을 담는 시트 헤더
• 변경 세트가 있는 시트는 헤더에 「최근 변경 N」 칩을 함께 표시(70-AI-A 참조)
[[HBHR109_행 정보 패널·검색]] 참조 (검색 상세) · 70-AI-A 변경 세트「최근 변경 N」 칩 추가 (코드 반영: 2204a6b, #821)
ㄴ50-S저장 상태 표시Text• 시트명 옆에 저장 상태를 표시. 평소 「N분 전 편집됨」, 저장 중 「저장 중…」, 저장 끝 ✓+「방금 편집됨」(툴팁 "모든 변경사항 저장됨\n마지막 저장: …")
• 저장 실패 시: 빨간 「저장 실패」 + [다시 불러오기] — 자동 재시도 없음
 - 툴팁 "저장하지 못한 변경이 있어요. … 다시 불러오면 서버에 저장된 값으로 돌아가요."
50 시트 헤더 · 58 실행취소신규 (ccea0b9e #831) · TBU: 라이브 실사
ㄴ50-T권한 범위 배지·권한 게이트Badge• 팀장 등 팀 범위 조회자에게 「팀 범위」 배지 노출. 툴팁 "팀장으로 지정된 팀의 직원 행만 보여요.\n합계·건수도 보이는 행 기준이에요."
• 급여 시트 조회는 조직 전체 급여 조회 권한 필요, 팀 범위는 팀장 지정 팀 + 소속 역할이 팀 범위를 주는 팀
• 시트 열 때 관리자 전용 조회를 하지 않아 「접근 권한이 필요해요」 모달이 뜨지 않음
50 시트 헤더 · ㄴ64E 히스토리 · 권한 분기 CASE06신규 (89fe2a6f #916, cba75f41 #936, cc7bb723 #930) · TBU: 팀장 계정 실사
ㄴ51시트명·기간 인라인 편집-• 시트명·기간을 인라인으로 수정하는 기능
• 더블클릭 시: 인라인 편집 진입(시트명 이름 변경 / 기간 "'26.7" 기간 변경)
[[HBHR102_파일 메뉴]] 이름 바꾸기와 관계 TBU더블클릭 인라인
ㄴ52시트 검색Search• 사번/성명/사유/항목으로 행을 거르는 검색. placeholder "사번 / 성명 / 사유 / 항목 검색"("( / )" 표기·"/" 단축키는 #831로 폐지 — ⌘F 찾기 막대 사용)
• 입력 시: 일치 행 필터
• 검색 이력 드롭다운(10/7, #1063): 검색창(dsSearchInput)에 사용자별 최근·자주 쓰는 검색어 드롭다운 — 저장 규칙·민감 패턴 제외·자주/최근 분리·제안 혼합은 core search-history 로직, 서버 user_search_history(사용자 × 컨텍스트 × 검색어, 횟수·마지막 사용, 마이그레이션 1954) + searchHistory.list/record/remove/clear(본인 것만)
 - Empty: 검색 결과 없음 상태
[[HBHR109_행 정보 패널·검색]] 참조 · searchHistoryTBU: 검색 결과 없음 문구 · 이력 드롭다운 UI 원문 TBU(실사 대기)
ㄴ53전치 뷰 토글Button• 행/열을 바꾼 전치 레이아웃으로 전환하는 토글(hover 시 노출). title 원문 "전치 보기 — 행과 열이 바뀐 레이아웃"
• 클릭 시: 전치 레이아웃으로 전환
그리드 렌더(표시 전용)hover 노출 · 신규
ㄴ54행렬 뷰 토글Button• 다차원 피벗 행렬 레이아웃으로 전환하는 토글(hover 시 노출). title 원문 "행렬 보기 — 다차원 피벗 레이아웃"
• 클릭 시: 행렬 레이아웃으로 전환
그리드 렌더(표시 전용)hover 노출 · 신규
ㄴ55메모 이력Button• 셀 메모 이력을 조회하는 "메모 이력" 버튼. 셀 메모는 모달에서 우측 상세 레일의 "메모" 탭으로 이동(아래 56 참조)
• 클릭 → TBU
sheet_cells 메모 · 56 셀 상세 레일신규 · TBU: 세부 동작·Empty·에러 동작
ㄴ56셀 상세 패널 표시Button• 선택 셀/행의 우측 상세 레일 노출을 토글하는 "셀 상세 패널 표시" 버튼. 레일은 "셀 상세" / "메모" 2탭으로 구성되며, 같은 앵커 셀을 설명하는 두 화면을 토글로 나눠 쓴다. 레일은 그리드를 덮는 오버레이로 열려 가운데 영역 폭을 가져가지 않는다
• 클릭 시: 상세 레일 노출 토글
 - CASE01 ["메모" 탭]: 앵커 셀의 메모 스레드 전체 표시(작성·수정·답글·해결·삭제 인라인 처리), 상단 "시트 전체 메모 보기" 진입. 메모 탭에서만 레일 폭 384px로 확대
 - CASE02 [셀 이동]: 입력 중이면 핀으로 고정(내용 유지), 잃을 입력 없으면 선택 셀을 따라감
[[HBHR109_행 정보 패널·검색]] 셀 상세 패널 · sheet_cells 메모"메모" 탭 신규 (코드 반영: d91858b) · 모달 → 레일 탭 이동
ㄴ57시트 닫기Button• 현재 시트를 닫고 시작 화면으로 이동하는 "시트 닫기 — 시작 화면으로 돌아갑니다" 버튼
• 클릭 시: 현재 시트 닫고 시작 화면으로 이동
워크스페이스 시작 화면
ㄴ58실행취소/재실행Button• 편집 스택을 실행취소(⌘Z) / 재실행(⌘⇧Z)하는 상시 버튼(편집 메뉴에서 이동)
• 클릭 시: 편집 스택 실행취소 / 재실행
 - CASE01 [히스토리 없음]: disabled
[[HBHR103_편집 메뉴·단축키]] 편집 스택편집 메뉴에서 이동
ㄴ59댓글Button• "💬" 댓글 버튼
• 클릭 → TBU
—TBU: 상세 동작
ㄴ5A시트 작업 완료 토글Button• 시트 단위로 "작업 완료" 상태를 토글해 시트를 편집 가능/view-only(잠금)로 전환하는 기능. 파일 메뉴 항목 원문 = "'{시트명}' 작업 완료로 변경"(사용 중 → 작업 완료 전환). 되돌리기 경로는 "파일 → 사용 중으로 변경"(작업 완료 시트 되돌리기 툴팁 문구). 작업 완료(workDoneAt)와 시트 보호(lockedAt/시트 및 범위 보호)는 분리된 별개 상태로, 완료 = workDoneAt + lockedAt(완료는 잠금 포함), 보호 = lockedAt만이다. 보호를 해제하면 완료 표시도 함께 풀린다(응답 workDoneCleared로 안내)
• 클릭 시: 시트 작업 완료 토글. title 원문 "완료하면 시트가 잠겨 수정과 반영이 막힙니다." / (완료 상태에서) "사용 중으로 바꾸면 잠금이 풀려 수정할 수 있어요."
 - CASE01 [작업 완료로 전환]: 파일 메뉴 "'{시트명}' 작업 완료로 변경" → 시트 view-only(잠금) 전환, 이후 셀 편집 차단
 - CASE02 [다시 토글]: "파일 → 사용 중으로 변경" → 편집 가능 상태로 복귀
sdk.sheetView.setWorkDone() · 파일 메뉴([[HBHR102_파일 메뉴]]) · 41 폴더 트리(상태 배지) · 64 수명주기 배지신규 (코드 반영: 7635459) · 완료/보호 분리(dbca988) · 배경: 7/21 베스트 요구(시트 작성중/완료 상태 표시) · 8/17 라이브 실사: 파일 메뉴 "작업 완료로 변경"·되돌리기 "사용 중으로 변경" 확정("작업 중" 잔존 표기 제거)
ㄴ5B시트 상태 표시 (완료·보호·편집 중)Badge• 시트 상태를 사이드바 배지 3종으로 구분 표시하는 기능. 완료 = green 점("완료로 잠김"), 보호만 걸린 시트 = 자물쇠 아이콘("보호 중"), 값이 바뀌었으나 아직 급여에 반영되지 않은 시트 = primary 점("편집 중"). 비공개는 눈 아이콘(ic-eye-off)으로 별도 표시
• 표시 전용. "편집 중" 판정은 목록 엔드포인트가 기간 단위로 집계
 - CASE01 [급여대장]: 자기 열이 아니라 반영을 기다리는 소스 시트가 남아 있을 때 "편집 중" 점 표시
sheet_views.workDoneAt/lockedAt · 41 폴더 트리신규 (코드 반영: 8fbb4c2) · 상태 3종 구분
ㄴ5C시트 편집 가드 (진입 시점)-• 잠긴/보호/작업 완료 시트의 편집을 저장 시점이 아니라 편집 진입 시점에 차단하는 가드. 더블클릭·Enter·바로 타이핑 등 모든 진입로가 단일 관문(_beginEdit)에서 막히며, Delete 값 지우기·헤더 색·열 메뉴 편집 계열도 같은 가드를 탄다. 원인(행 보호 / 작업 완료 / 시트 보호)에 따라 푸는 방법을 구분해 안내
 - CASE01 [시트 보호]: "보호 중인 시트입니다.\n수정을 하려면 데이터 > 시트 및 범위 보호에서 보호를 해제해 주세요."
 - CASE02 [행 보호]: "보호 중인 행 입니다.\n수정을 하려면 데이터 > 시트 및 범위 보호에서 보호를 해제해 주세요."
sheet-guard.ts · 5A 작업 완료 · [[HBHR106_데이터 메뉴]] 시트 및 범위 보호신규 (코드 반영: 8fbb4c2) · 편집 진입 시점 가드
ㄴ5D읽기 전용 셀 사유 안내 (토스트 + 바로가기)Toast• 읽기 전용 셀에서 편집을 시도(더블클릭 · Enter · 바로 타이핑)하면 조용히 막지 않고 왜 수정할 수 없는지 + 어디서 고치는지를 토스트로 안내하는 기능. 셀 종류별 메시지(원문)와, 조치 화면이 있으면 토스트 우측에 바로가기 버튼(예: "직원 마스터 시트 열기")이 붙는다(클릭 시 해당 시트 열림 + 토스트 닫힘, data-testid=sheet-toast-action)
 - CASE01 [연동 시트에서 가져오는 열]: "「{열}」 열은 {소스}에서 가져오는 값이라 이 시트에서는 수정할 수 없어요. {안내}" — 소스 라벨 = 직원 정보 / 소속 팀 / 근무 배정 / 근로계약 / 퇴사 기록 / 자격증 / 수당 / 공제 / 초과근무 / 인센티브 / 치료(일별). 직원 마스터 시트가 소스면 "직원 마스터 시트의 「{열}」 열에서 수정하면 여기에도 반영돼요." + 바로가기, 아니면 "직원 관리에서 수정하면 여기에도 반영돼요."
 - CASE02 [자동 계산 열]: "「{열}」 열은 자동으로 정해지는 값이라 이 시트에서는 수정할 수 없어요. {열 도움말 문장}"
 - CASE03 [직원 정보 파생 열]: "「{열}」 열은 직원 정보에서 가져오는 값이라 이 시트에서는 수정할 수 없어요. 직원 관리에서 수정하면 여기에도 반영돼요."
 - CASE04 [소계 행]: "소계 행은 위 행들을 합한 값이라 직접 수정할 수 없어요. 합산되는 행의 값을 고쳐 주세요."
 - CASE05 [치료(일별) 집계 행]: "치료(일별) 행은 여러 인센티브 기록을 합한 값이라 셀을 직접 수정할 수 없어요. 행을 더블클릭해 세션 편집 창에서 고쳐 주세요."
 - CASE06 [계산 모듈 열]: "이 열의 값은 계산 모듈이 채우기 때문에 직접 수정할 수 없어요. 원본 값을 수정하면 자동으로 다시 계산돼요."
 - CASE07 [반영 집계 열]: "이 열의 값은 반영된 레코드를 집계한 결과라 직접 수정할 수 없어요. 원본 시트에서 수정하고 다시 커밋하면 반영돼요."
 - CASE08 [미저장 행에 직원 연결 시도]: "이 행은 아직 시트에 저장되지 않아 직원을 연결할 수 없어요. 행을 먼저 추가한 뒤 사번이나 성명을 입력해 주세요."
 - 예외: 수식 열의 단일키 차단(ㄴ5C 계열, = 제외)은 편집 가능 열의 사고 방지라 안내 없이 조용히 무시 유지
uneditable-reason.ts · ㄴ5C 편집 가드 · [[HBHR200_급여대장 시트]] 연동 열신설 (코드 반영: f9ccac1, #790) · 배경: 2026-09-18 요청 "버그인지 원래 안 되는 건지 알 수 없음" · TBU: 라이브 실사 이월
ㄴ5E상시 시트 안내 배너 닫기Button• 상시(에버그린) 시트 상단 안내 배너에 닫기(✕) 버튼(title/aria-label "이 안내 닫기")이 생겨 사용자가 배너를 숨길 수 있는 기능
• 클릭 시: 이 시트 버전(slug + 시행월 단위)의 안내만 사용자별로 숨김(localStorage 저장, 핀과 같은 방식). 같은 시트라도 새 버전(시행월 변경)이면 배너가 한 번은 다시 보임
 - CASE01 [localStorage 사용 불가/가득 참]: 이 세션에서만 숨김
 - 배너를 닫아도 「이 달부터 새 버전」 기능은 사이드바 우클릭 메뉴로 계속 사용 가능(기능 손실 없음)
evergreen-notice · [[HBHR108_폴더·휴지통 사이드바]]신설 (코드 반영: 2433f1f, #788) · ⚠️ 상위 기능 「상시(에버그린) 시트」(#713, 958876c4 — 버전 이력·사이드바 핀) 자체가 사양서 미반영 갭 → 후속 이월 · TBU: 라이브 실사 이월
60스프레드시트 툴바-• "파일 ▾" / "수정 ▾"(예전 「편집」) / "보기 ▾" / "삽입 ▾" / "데이터 ▾" 메뉴(좌) + "반영" CTA / "설정 완료" CTA(우)를 담는 툴바. 레이아웃은 좌(메뉴)/우(CTA) 50:50 두 덩어리로 분할되어 넘칠 때 각 영역 내에서만 줄바꿈되고, 한쪽이 두 줄이 돼도 반대쪽은 제자리를 유지한다. (시트 수명주기 상태 배지(64)는 툴바가 아니라 시트 헤더(50) h3에 렌더된다 — 8/17 라이브 실사.) 각 메뉴 상세는 개별 문서에 위임
• 각 메뉴 클릭 시: 해당 드롭다운 오픈 → [[HBHR102_파일 메뉴]] / [[HBHR103_편집 메뉴·단축키]] / [[HBHR104_보기 메뉴]] / [[HBHR105_삽입 메뉴]] / [[HBHR106_데이터 메뉴]]
[[HBHR102_파일 메뉴]] / [[HBHR103_편집 메뉴·단축키]] / [[HBHR104_보기 메뉴]] / [[HBHR105_삽입 메뉴]] / [[HBHR106_데이터 메뉴]] 참조 · 수명주기 배지 64~64F · 50 시트 헤더메뉴명 「편집」→「수정」, 메뉴 버튼 title "수정 (Alt+E)" (ccea0b9e #831) · 좌/우 50:50 분할 (코드 반영: aed8800) · 설정 완료 CTA 추가 (PR #540) · 배지는 시트 헤더 위치(8/17 실사) · 각 메뉴 상세 위임
ㄴ60-F수식바 캐럿·강조 정렬-• 수식바 입력창 위에 구문 강조용 미러 레이어를 겹쳐 그리는 구조에서, 수식 열의 캐럿과 글자가 한 글자씩 어긋나던 결함을 수정
• 원인: 미러의 왼쪽 여백을 Tailwind pl-0으로 줬으나 미러 규칙이 레이어 밖(unlayered)이라 밀려 입력창(0px)과 미러(8px)가 어긋났고, 함수명 굵게(font-weight 600)가 글자폭을 넓혀 뒤로 갈수록 더 벌어졌다
• 수정: 수식 열 여백은 전용 수식어 클래스(--fx)로 주고, 강조 규칙은 글자 굵기 없이 색만 남겨 입력창과 글자폭을 맞춘다. 드래그·Shift 선택 등 선택 변경(select)에도 캐럿 위치를 다시 계산
60 스프레드시트 툴바(수식바) · 72 수식 적용 범위 하단 바 · 75 수식 함수수정 (코드 반영: 6457e48, #867 — CS-OKBEST-260923-0002) · TBU: 라이브 실사 이월
ㄴ60-B수식바 fx 「북마크한 열」·시트 전환 넘김-• 수식바 fx 팝오버 맨 위에 「북마크한 열」 칩 — 클릭 한 번으로 [시트!열] 참조 삽입(상세 [[HBHR107_컬럼 헤더 컨트롤]] ㄴ12-B)
• 수식바에서 수식을 고치다 다른 시트를 열면 초안이 헤더 수식 편집 팝오버로 넘어가 다른 시트 열 참조 후 원본으로 돌아와 저장(상세 [[HBHR107_컬럼 헤더 컨트롤]] ㄴ12-H)
60 수식바 · [[HBHR107_컬럼 헤더 컨트롤]] ㄴ12-B · ㄴ12-H · 30신규 (8284d800 #982, MED-845 · 99a24b42 #979, MED-844) · TBU: 라이브 실사
ㄴ61반영 (급여대장 반영)Button• 시트에 입력한 값을 급여(수당·공제 레코드)로 기록하는 CTA. title 원문 "시트에 입력한 값을 급여(수당·공제 레코드)로 기록합니다. 반영해야 급여대장과 급여 계산에 반영돼요." 반영 개념이 있는 시트면 버튼을 항상 노출하고, 못 누르는 시트는 disabled + 툴팁으로 사유를 밝힌다(사유 판정·툴팁 문구는 단일 게터 commit-gate.ts에서 결정)
• 클릭 시: 시트 값 → 수당·공제 레코드 기록
 - CASE01 [작업 완료]: disabled — "작업 완료된 시트는 반영할 수 없어요. 시트 상태를 '사용 중'으로 바꾼 뒤 반영해 주세요."
 - CASE02 [시트 보호]: disabled — "보호 중인 시트는 반영할 수 없어요. 데이터 > 시트 및 범위 보호에서 보호를 해제해 주세요."
 - CASE03 [대상 미지정]: disabled — "반영할 대상이 지정되지 않았어요. 열 헤더를 우클릭해 열 설정 → 대상 급여대장 항목을 지정하면 반영할 수 있어요."
 - CASE04 [변경 없음]: disabled — "마지막 반영 이후 변경된 내용이 없어 반영할 항목이 없어요."
commit-gate.ts · 62 열 헤더 메뉴 · 64C 설정 중 노출 제어 · [[HBHR201_전체 확정 (commit)]]신규 (코드 반영: aed8800) · "커밋→반영" 용어 통일 · 항상 노출 + disabled 사유 4종 · 8/17 라이브 실사: CASE01 워딩 "사용 중" 확정(PR #540 통일) · 설정 중엔 숨김(64C)
ㄴ62반영 상태 배지·칩Badge• 시트-급여대장 반영 상태를 배지·칩으로 표시. 배지 문구는 기존 「변경됨/최신」에서 **「반영 필요/반영됨」**으로 변경. 미반영 칩은 "급여대장 미반영", 반영 후엔 "마지막 급여 반영 {일시}"로 목적어를 붙여 표기. 배지는 .ds-label 규격으로 렌더
 - CASE01 [반영됨]: "시트 값이 급여대장에 반영된 값과 같습니다."
 - CASE02 [반영 필요]: "시트 값이 급여대장에 반영된 값과 다릅니다. 다시 반영하면 급여대장이 시트와 같아집니다." · 반영 후 실행 취소 시에도 「반영 필요」로 되돌림
sheet_views.lastCommittedAt · 58 실행취소/재실행신규 (코드 반영: aed8800·160de5a) · 「변경됨/최신」→「반영 필요/반영됨」
63서식 도구 모음-• 글자크기 9|18pt / "B" "I" "S" "U" / 색(글자·배경 분리) / 정렬 / "123"(fill) / 테두리 / "자간 (Letter spacing)" / "서식 지우기 (선택한 셀의 모든 서식 제거)" / "⊘"를 담는 서식 도구 모음. "123" 숫자형식 메뉴에 표시 형식 항목으로 「불리언」(63A) 포함보기 메뉴 "🎨 서식 도구 모음 표시" ([[HBHR104_보기 메뉴]] 참조) · 63A 불리언 표시 형식자간·서식 지우기 신규 · "123" 메뉴에 불리언 추가 (90bc68f) · 자간 버튼 숨김·도구 추가는 ㄴ63B (#831)
ㄴ63A불리언 표시 형식-• 열 표시 형식에 신설한 「불리언」 형식. 수식 엔진의 1/0 결과(비교·AND/OR/NOT·TRUE/FALSE 리터럴)를 True/False 텍스트로 표시한다(False는 회색, True는 파란 강조). 사람이 넣은 true/false 문자열도 매핑(0/"0"/"false" → False, 그 외 비어 있지 않으면 True). 편집은 텍스트 입력 그대로. 선택 위치는 두 곳: 열 설정 드로어(71 열 설정) + 서식 툴바 "123" 숫자형식 메뉴. "123" 숫자형식 메뉴 항목 원문 = 자동 / 텍스트 / 숫자 / 날짜 / 시간 / 기간 (HH:MM - HH:MM) / 불리언 (True/False) / 안내 "숫자 형식은 선택한 셀이 속한 열 전체에 적용됩니다. 글자·색·테두리 등 나머지 서식은 선택한 셀에만 적용됩니다."
• 표시 형식 「불리언」 선택 시: 1/0 값을 True/False 텍스트로 렌더
63 서식 도구 모음("123") · 71 열 헤더 메뉴(열 설정) · 75A 불리언 리터럴신규 (코드 반영: 90bc68f) · 열 설정 드로어 + "123" 메뉴 진입 · 1/0 → True/False 표시 · 8/17 라이브 실사: "123" 메뉴 항목·안내 원문 확정
ㄴ63B서식 도구 모음 확장-• 도구 추가: 서식 복사(붓) · 확대/축소(50~200%, 사용자별 기억) · 통화 형식(₩) · 퍼센트 형식 · 소수점 자릿수 늘리기/줄이기 · 셀 병합(▾ 병합 방식) · 링크 삽입 · 수정 기록 표시(시계) · 함수(Σ). 「자간」 버튼은 숨김
• 한 줄 유지: 넘치는 도구는 「⋮ 더보기」 패널로 이동
 - 병합 ▾: 전체 병합 / 세로로 병합 / 가로로 병합 / 병합 취소. 잠금·읽기 전용·보호 행은 차단
[[HBHR103_편집 메뉴·단축키]] · [[HBHR109_행 정보 패널·검색]] 변경 이력신규 (ccea0b9e #831) · TBU: 병합 확인창 문구·Σ 목록 라이브 확인
ㄴ63C메뉴 검색Search• 서식 도구 모음 맨 앞 돋보기(title "메뉴 검색 (Alt+/)"). 기능 이름을 쳐서 메뉴 항목을 바로 실행
• 입력 시: 일치 메뉴 목록, 없으면 "일치하는 메뉴가 없어요"
 - 맨 아래 「시트 내 검색」: 입력어로 찾기 막대(⌘F) 열기
60 툴바 메뉴 전체 · [[HBHR103_편집 메뉴·단축키]]신규 (ccea0b9e #831)
64시트 수명주기 상태 배지Badge• 시트의 수명주기 단계를 상태 배지 3종으로 표시하는 기능. 배지 텍스트 "설정 중" / "사용 중" / "작업 완료"이며, 각 배지 좌측에 SVG 아이콘(기어 / 진행 중 원형 / 체크)이 붙는다(이모지 문자 ⚙/◔/✓ 아님). 배지 위치는 툴바가 아니라 시트 헤더 h3(시트명 왼쪽 앞). data-testid=sheet-lifecycle-badge, ds-label--md·square·line 규격(설정 중=light-gray·semibold / 사용 중=primary / 완료=green). "설정 중" 단계에서는 배지와 함께 설정 중 안내 띠(오렌지 배너)를 노출
• 표시 전용(단계에 따라 하위 컨트롤 노출·잠금 분기)
 - CASE01 [설정 중]: "설정 중" 배지(좌측 SVG 기어) + 안내 띠 · 반영 버튼 숨김(64C, 직원 추가는 노출 — #978)
 - CASE02 [사용 중]: "사용 중" 배지(좌측 SVG 진행 중 원형) · 구조 잠금(64D)
 - CASE03 [작업 완료]: "작업 완료" 배지(좌측 SVG 체크)
 - 배지 호버 툴팁 3종: 설정 중 = "설정 중\n구조(컬럼·열 수식·반영 연결)를 자유롭게 바꿀 수 있어요.\n✓ 설정 완료를 누르면 실무자가 사용할 수 있습니다." / 사용 중 = "사용 중\n값 입력·행 추가 등 일상 작업만 가능해요.\n구조를 바꾸려면 파일 → 시트 재설정." / 작업 완료 = "작업 완료\n시트가 잠겨 수정과 반영이 막힙니다.\n파일 → 사용 중으로 변경으로 되돌릴 수 있어요."
 - 설정 중 안내 띠 원문: "시트를 설정 중 입니다. 구조를 자유롭게 바꿀 수 있어요. 완료하면 실무자가 사용할 수 있습니다.입력된 데이터 {N}행이 있어요 — 열 수식을 바꾸면 전체가 재계산됩니다."
5A 시트 작업 완료 · 64A 설정 완료 CTA · 64C·64D · 50 시트 헤더신규 (PR #540, 21cd1b8 — UP-008 R1·R2·R4·R8) · 워딩 "작업 중"→"사용 중" 통일 · 8/17 라이브 실사: SVG 아이콘·시트 헤더 위치·툴팁·안내 띠 확정
ㄴ64A설정 완료 CTAButton• 툴바 우측 끝에서 시트를 "설정 중"에서 "사용 중"으로 확정하는 [설정 완료] CTA. 설정 중 시트 툴바 우측에는 "설정 중엔 급여반영이 불가합니다." 안내 + [설정 완료] CTA만 노출된다. 클릭 시 확정 다이얼로그를 띄운다
• 클릭 시: 확정 다이얼로그 오픈(구조 요약 4행 + 잠금 안내). 확정 처리 중에는 화면에 화이트 딤 + 스피너
 - 확정 다이얼로그 원문: 제목 "설정을 완료하고 시트를 사용합니다." / 구조 요약 4행 = 컬럼 {n}개 · 수식 열 {m}개 / 급여 반영 연결 없음(또는 연결명) / 자동 행 생성 자동 — 규칙 설정됨 / 행 기준 자유 / 안내문 "사용 중에는 컬럼 구조·열 수식·반영 연결이 잠깁니다. 다시 바꾸려면 파일 → 시트 재설정." / 버튼 [취소] [설정 완료]
 - CASE01 [확정]: 시트 "사용 중" 전환, 구조 잠금(64D) 적용
 - CASE02 [권한 없음]: 노출 안 됨(canManageSetup, 비공개 시트는 생성자만)
64 상태 배지 · 64D 구조 잠금 · sdk.sheetView.finishSetup() (추정)신규 (PR #540, 21cd1b8) · 설정 중 → 사용 중 확정 · 8/17 라이브 실사: 확정 다이얼로그 원문 확정
ㄴ64B시트 재설정-• 확정된 시트를 다시 "설정 중"으로 되돌리는 「시트 재설정」. 파일 메뉴에서 진입 — 파일 메뉴 항목 "시트 재설정 하기" + 설명 "시트의 초기 설정을 변경합니다. 이력이 남습니다." 열 헤더 메뉴 하단에도 "구조 변경은 파일 → 시트 재설정에서" 안내가 붙는다
• 클릭 시: 시트 "설정 중"으로 복귀 → 구조 편집 잠금 해제, 설정 중 안내 띠 재노출
 - CASE01 [권한 없음]: 진입 불가(canManageSetup, 비공개 시트는 생성자만)
64 상태 배지 · 64C·64D · [[HBHR102_파일 메뉴]] · sdk.sheetView.reopenSetup() (추정)신규 (PR #540, 21cd1b8) · 8/17 라이브 실사: 진입 위치 = 파일 메뉴 "시트 재설정 하기"(사이드바 컨텍스트 아님)
ㄴ64C설정 중 노출 제어-• "설정 중" 단계에서 반영 버튼(61)을 숨기는 노출 게이트. 설정이 완료되기 전에는 급여 반영 동선을 감춰 구조 확정을 유도한다
• 설정 중 진입 시: 반영 버튼 숨김. 시트 상단 「직원 추가」(행 추가) 버튼은 설정 중에도 노출·동작(행 추가는 구조 변경이 아님 — 열 설정을 바꿔 가며 직원을 넣어 보는 흐름 지원)
61 반영 버튼 · 64 상태 배지 · [[HBHR202_직원 추가]]신규 (PR #540, 21cd1b8 — UP-008 R2) · 직원 추가 버튼 설정 중 노출로 변경(7170d1a6 #978, MED-843 — 종전: 설정 완료 후 재설정해야 직원 추가 가능) · 라이브 실사 확인(10/2): 설정 중 툴바에 「직원 추가」 + 안내 "설정 중엔 급여반영이 불가합니다." + 「설정 완료」
ㄴ64D사용 중 구조 잠금-• "사용 중" 시트에서 구조 편집(열 추가·수식·열 설정)을 게이트로 차단하는 잠금. 값 편집은 허용하되 시트 구조 변경 계열 동선만 막는다
• 사용 중 진입 시: 구조 편집 동선 게이트 차단
 - CASE01 [재설정]: 시트 재설정(64B)으로 "설정 중" 복귀 시 잠금 해제
71 열 헤더 메뉴(열 설정) · 64B 시트 재설정 · [[HBHR105_삽입 메뉴]] · [[HBHR107_컬럼 헤더 컨트롤]]신규 (코드 반영: 64c3b12) · 구조 편집 게이트
ㄴ64E히스토리 드로어Drawer• 시트의 완료·재설정 이력을 최신순으로 보여주는 「히스토리」 드로어. 드로어 헤더 = "히스토리" + 시트명. 우측 레일 상호 배제 합류(셀 상세·메모 레일과 같은 우측 레일 슬롯을 공유)
• 클릭 시: 우측 레일에 히스토리 드로어 노출(완료/재설정 이력 최신순)
 - 항목 포맷 = [상태 배지] + [날짜 시각] + [작성자]. 예: 설정 완료 · "2026. 08. 11. 13:31" · "안세희"
 - CASE01 [다른 레일 열림]: 우측 레일 상호 배제 — 기존 레일 대체
 - CASE02 [변경 세트 절]: 드로어에 변경 세트 절이 추가되어 해당 시트의 변경 세트를 출처 라벨 「AI 제안」/「예약 변경」/「직접」으로 구분해 나열하고, 항목에서 바로 되돌리기할 수 있다(70-AI-A) · 확인 대기 행은 [적용]/취소
56 셀 상세 레일 · 64 상태 배지 · 70-AI-A 변경 세트신규 (PR #540, 21cd1b8 — UP-008 R8) · 우측 레일 합류 · 8/17 라이브 실사: 헤더·항목 포맷 확정 · 변경 세트 절 추가(2204a6b, #821) · 출처 「예약 변경」 라벨(30fe6180, #1021)
ㄴ64F수명주기 승계·소스 제외-• 기간 복사(이전 월에서 가져오기) 시 소스 시트의 수명주기를 대상 시트가 승계하는 규칙. 또한 "설정 중" 소스 시트는 급여대장 "소스 전체 반영"에서 제외하고 제외 사유를 표시한다
• 기간 복사 시: 소스 수명주기 승계
 - CASE01 [소스가 설정 중]: "소스 전체 반영" 대상에서 제외 + 제외 사유 표시
22 이전 월 가져오기 · 64 상태 배지 · [[HBHR201_전체 확정 (commit)]]신규 (코드 반영: 388f810 승계 · 7633ebc 소스 제외 사유)
ㄴ64G히스토리 「값 변경」 절Drawer• 히스토리 드로어에 「값 변경」 절 추가: 한 동작(붙여넣기 한 번 등)이 한 줄, 줄마다 [되돌리기]. 되돌릴 때 그 사이 다른 사람이 고친 칸은 건너뛰고 건수 안내. 보관 1년
• 변경 세트 적용·되돌리기로 바뀐 칸도 기록
 - CASE01 [급여 관리 권한 없음]: "값 변경 기록은 급여 관리 권한이 있어야 볼 수 있어요." / CASE02 [불러오기 실패]: "연결이 느려 변경 기록을 불러오지 못했어요. 잠시 후 다시 시도해 주세요." + [다시 시도]
ㄴ64E · 70-AI-A 변경 세트 · [[HBHR109_행 정보 패널·검색]] 변경 이력 탭신규 (ccea0b9e #831, a39bce86 #955, fe029463 #968) · 잠금/작업 완료 시트는 되돌리기 없음 · 히스토리 버튼은 전체 조회 권한 없으면 흐림(title "급여 전체 조회 권한이 있어야 볼 수 있어요")
ㄴ64H히스토리 「변경 세트」 확인 대기 [적용]/[취소]Button• 「변경 세트」 절의 확인 대기(상태 「적용 대기」) 행 우측에 [적용]·[취소] 버튼 — 조직 설정 「확인 뒤 적용」으로 만들어진 셀 예약 변경(출처 「예약 변경」)과 카드가 닫힌 AI 제안을 여기서 처리
• [적용] 클릭 → 컨펌 "이 변경 세트를 적용할까요?\n{요약}"(위험 항목 있으면 "이 변경 세트를 적용할까요? 위험 항목(급여 반영 열·퇴직자·100행 초과)이 있어요.\n{요약}") → 적용, 칸·합계 즉시 다시 그림 + 토스트 "변경 세트를 적용했어요."(+「되돌리기») 1회
• [취소] 클릭 → 컨펌 "이 변경 세트를 취소할까요? 시트는 바뀌지 않아요." → 반려, 토스트 "변경 세트를 취소했어요." (예약은 다음 잡 tick에 취소됨으로 동기화)
ㄴ64E 히스토리 드로어 · 70-AI-A 변경 세트 · ㄴ70-RS 예약 변경 · [[HBAD270_설정 (조직 설정·내 정보)]] 시트 예약 변경 적용신규 (30fe6180, #1021 — MED-825 QA) · 적용·되돌리기 뒤 새로고침 없이 칸·합계 즉시 반영, 토스트 2번 뜨던 것 1회로(f3647829, #1025 — MED-876, AI 카드 [적용]도 같은 뒷처리) · 잠금·작업 완료 시트는 버튼 미노출 · 실패 "적용하지 못했어요: {사유}" / "취소하지 못했어요: {사유}" · TBU: 라이브 실사
70데이터 그리드Grid• 컬럼 헤더 + 행으로 구성된 데이터 그리드. 시스템 컬럼(#/사번/성명/팀/직급 등) + 유형별 항목 컬럼, 휴직/퇴사 행 회색 처리(추정). 그리드 셀 내 상태 배지(대기·승인·지급·취소)는 .ds-label 규격(xs·square·line)으로 렌더되며 색은 DS 의미 매핑(승인=green / 대기=yellow / 지급=blue / 취소=light-gray)을 따른다컬럼 헤더 [[HBHR107_컬럼 헤더 컨트롤]] 참조 / 시트 유형 HBHR200~270상태 배지 DS 라벨화 (코드 반영: 160de5a) · 컬럼 헤더 구조 위임
ㄴ70-C셀 입력 (칸 안 편집·한글)-• 칸 안에서 바로 편집(별도 입력창 없음). 칸을 고르고 글자·숫자 키를 치면 편집 시작, 첫 한글 음절도 자모가 갈라지지 않음
• 수식 열에 바로 타이핑 시: 8초 토스트 「수식 열이에요. Enter 나 더블클릭으로 열면 수식을 고칠 수 있어요.」
 - 금액 열 빈칸 복사 = 0이 아닌 빈칸 · 빈칸 붙여넣기 = 대상 비움
ㄴ5C 편집 가드 · ㄴ5D 읽기 전용 안내 · [[HBHR103_편집 메뉴·단축키]]신규 (ccea0b9e #831, 23000c37 #940, 4dbca86d #952) · TBU: macOS 한글 실측
ㄴ70-C1직원·항목 선택 즉시 표시-• 팝업형 편집기(직원 자동완성 사번/성명 · 항목 자동완성 · 구분 드롭다운 · 치료 카테고리 · 인센 유형 프리셋 · 빈 행 직원 선택)에서 고르고 확정하면 고른 값이 칸에 바로 표시, 저장·재조회 뒤 나머지 식별 열 채움
• 팝오버 편집기 클릭 유지(10/7, #1039, MED-886): 팝오버형 편집기(다중 선택 체크리스트·치료 횟수·직원 선택)의 체크박스·선택지 글자를 눌러도 닫히지 않고 눌림 — data-cell-editor-popover 표시로 렌더 미루기·IME 받이·표 포인터 처리가 물러나고, 글자·여백 클릭의 mousedown 기본 동작을 막아 포커스가 body로 가지 않음(종전: 클릭이 「열린 편집기 없음」으로 보여 재렌더·focusout 확정으로 닫히던 버그, CS-OKBEST-261002-0006)
 - CASE01 [저장 실패]: 칸을 원래 내용으로 되돌림
ㄴ70-C · [[HBHR231_근태 내역 시트 (근무시간 유형 집계)]]수정 (2c578aa5 #1010, MED-866) · 종전: 저장이 끝나도 입력칸이 남아 수 초 뒤에야 값 표시 · TBU: 라이브 실사
ㄴ70-C2기간·시각 열 자유 입력-• 기간 열(「HH:MM - HH:MM」) 편집기가 시계 피커 2개 → 글자 입력 한 칸(placeholder "09:00 - 18:00"). 「9-18」 「0900~1800」 「오후 1-5시」 등을 확정 시 「HH:MM - HH:MM」로 정리, 붙여넣기도 같은 규칙
• 시각 열은 네이티브 피커 유지, 확정·붙여넣기는 같은 해석(「9:30」「930」「오후 3시」「3pm」)
 - CASE01 [해석 불가 — 기간]: 토스트 "기간을 읽지 못했어요. 「9-18」「09:00 - 18:00」「9시30분~18시」처럼 입력해 주세요." + 값 유지
 - CASE02 [해석 불가 — 시각]: 토스트 "시각을 읽지 못했어요. 「9:30」「930」「오후 3시」처럼 입력해 주세요."
 - CASE03 [붙여넣기 해석 불가]: 원문 그대로 저장 · CASE04 [끝 < 시작]: 야간으로 그대로 저장
ㄴ70-C · [[HBHR103_편집 메뉴·단축키]] 붙여넣기 · [[HBHR230_출퇴근 내역 시트]] / [[HBHR231_근태 내역 시트 (근무시간 유형 집계)]]수정 (2c578aa5 #1010, MED-867) · 한쪽만 오전/오후면 다른 쪽도 따름(「오후 1-5시」=13:00 - 17:00) · TBU: 라이브 실사
ㄴ70-C3연도 없는 날짜 입력·붙여넣기-• 날짜 열에 연도를 뺀 날짜(「07월 20일」·「7/20」·「7.20」)를 입력·붙여넣으면 이 시트 기간의 연도로 읽어 yyyy-mm-dd로 저장(종전: 글자 그대로 저장)
• 날짜 열에 대시(-·ㅡ)를 넣으면 빈 칸으로 저장
 - CASE01 [이미 글자로 저장된 연도 없는 날짜]: 데이터는 그대로 두고 수식(DATEDIF·날짜 빼기)에서만 같은 규칙으로 날짜로 읽음 · CASE02 [상시 시트]: 조직 기준 오늘의 연도
ㄴ70-C · ㄴ70-C2 · ㄴ75C DATEDIF · [[HBHR103_편집 메뉴·단축키]] 붙여넣기수정 (a61b5dd7, #1028 — MED-877/878, CS-OKBEST-261002-0002·0003) · 시트 어시스턴트가 DATEDIF 제안 전 참조 열 실제 값 확인(프롬프트) · TBU: 라이브 실사
ㄴ70-L레일·목록 폭 조절 · 열기 실패-• 우측 레일(220~640px)과 좌측 시트 목록(최소 200px) 경계를 드래그해 폭 조절. 전체 화면 아이콘 ic-expand/ic-collapse로 교체
• 시트 자동 열기 실패 시: 목록 유지 + 「시트를 열지 못했어요. 목록에서 다시 골라 주세요.」
ㄴ23-A 전체화면 · [[HBHR108_폴더·휴지통 사이드바]]신규 (ccea0b9e #831)
ㄴ70-X권한 없는 시트 참조 셀Cell• 보는 사람이 읽을 수 없는 시트를 참조하는 수식 셀은 값 대신 회색 「권한 없음」으로 표시(합계 제외)
• 셀 호버 시: "권한이 없는 시트를 참조하는 수식이에요. 이 열의 값은 확인할 수 없어요." + 참조 시트(개인용이면 소유자)
 - 머리글 ⚠ 배지: "권한이 없는 시트를 참조해 확인할 수 없는 셀이 N개 있어요."
78 크로스시트 참조 · ㄴ50-T 권한신규 (3a6093fd #954) · TBU: 권한 분리 계정 실사
ㄴ70-F적용 필터 띠 · 숨긴 행-• 열 필터가 걸리면 수식바와 표 사이에 띠 노출: "필터 N개 · 14/279건 표시" + 열별 칩(클릭 = 조건 편집, × = 그 열 해제) + [필터 초기화]
• 숨긴 행이 있으면 같은 띠에 「숨긴 행 N개」(툴팁 "내가 숨긴 행이에요(다른 사용자·급여 반영에는 영향 없음)") + 모두 표시
[[HBHR106_데이터 메뉴]] 필터 초기화 · [[HBHR104_보기 메뉴]] 숨긴 행 모두 표시신규 (8aecd9c5 #881)
ㄴ70-F1필터 축소 시 스크롤 보정-• 시트를 아래로 스크롤한 채 열 필터·검색으로 행이 줄면 가상 스크롤 창을 마지막 페이지 안으로 당기고(스페이서 합 = 행 수 × 행 높이), 렌더 직후 scrollTop을 새 끝에 맞춤(clampScrollToContent, 자리 복원 중 제외) — 종전: 스크롤이 옛 자리에 남아 화면 하단이 비던 버그ㄴ70-F · 가상 스크롤 그리드신규 (c4fd9a2d, #1066, MED-936)
ㄴ70-P행 페이징 결정적 정렬·중복 제거-• 행 500건 초과 시트의 페이지 조회에 유일한 3차 정렬 키 id를 더해 순서를 결정적으로 만들고, 클라이언트 페이지 병합은 rowId로 중복을 걷어내며 다음 offset은 받은 건수로 셈 — 종전: 자동 채움 행은 sortOrder·createdAt이 전부 같아 동점 정렬 + OFFSET 페이징에서 같은 행이 두 페이지에 실리고 다른 행은 빠짐(운영 「출퇴근 내역 전체」 4,641행 중 고유 3,519 실측)데이터 그리드(70) 페이징신규 (94f83b0e, #1044, MED-899)
ㄴ70-R행 컨텍스트 메뉴 (다중 선택 대상)Menu• 행 번호(#) 열·데이터 셀 우클릭으로 여는 행 컨텍스트 메뉴. 여러 행을 선택한 뒤 우클릭해도 행 삭제·보호가 한 행만 처리되던 결함을 수정하고, 대상 판정을 엑셀 규칙으로 통일
• 우클릭 시: 대상 행 결정 → 메뉴 노출
 - CASE01 [선택 영역 안에서 우클릭]: 선택 유지 + 선택된 행 전부가 삭제·보호 대상. 메뉴 상단 안내 원문 "{N}개 행 선택됨 — 삭제·보호는 선택한 행 전체에, 행 추가는 우클릭한 행에 적용돼요"
 - CASE02 [선택 영역 밖에서 우클릭]: 그 셀로 선택이 옮겨가고 대상은 1행
 - CASE03 [대상 2행 이상]: 라벨이 「선택한 {N}개 행 삭제」 · 「선택한 {N}개 행 보호」(우클릭한 행이 보호 상태면 「선택한 {N}개 행 보호 해제」 — 방향은 우클릭한 행이 정함). 한 행에만 뜻이 있는 항목(직원 정보 수정 · 근태 기록 확인하기 · 행 정보 보기 · 셀 설정 · 메모 보기·추가 · 급여 확정·확정 취소 · 행 취소 · 행 삭제(레코드))은 숨기지 않고 :disabled + 사유 title 원문 "여러 행을 선택한 상태에서는 쓸 수 없어요"
 - 행 추가(위·아래)는 1행 단위라 우클릭한 행 기준 유지, 합계·치료(일별) 같은 합성 행은 대상에서 제외
• 여러 행 삭제·보호 실행 시: 확인 1회 + 다시 읽기 1회로 처리하고 실패·건너뜀 건수를 한 번에 안내(자동 행은 서버가 거부, 저장 안 된 행은 보호에서 건너뜀)
70 데이터 그리드 · [[HBHR103_편집 메뉴·단축키]] 행 메뉴 · [[HBHR109_행 정보 패널·검색]] 행 정보 · 56 셀 상세 레일수정 (코드 반영: 4d75d89, #868 — MED-705) · 라이브 실사 확인(2026-09-25): 3행 선택 후 우클릭 → 메뉴 상단 안내 원문 "3개 행 선택됨 — 삭제·보호는 선택한 행 전체에, 행 추가는 우클릭한 행에 적용돼요" + 「선택한 3개 행 보호」·「선택한 3개 행 삭제」 라벨 실측(CASE01·03). 단일 행 메뉴 항목 실측: 직원 정보 수정 / 근태 기록 확인하기 / 행 정보 보기 / 급여 확정 / 위에 행 추가 / 아래에 행 추가 / 행 취소 / 행 삭제 (레코드) / 이 행 보호 / 이 행 삭제
ㄴ70-RS예약 변경… / 계약 시행일 변경… (행·셀 메뉴)MenuItem• 데이터 칸 우클릭 「예약 변경…」 — title "고른 달의 시트부터 이 칸 값을 바꾸도록 예약해요. 그 전달 시트는 그대로예요." 클릭 → 셀 예약 변경 모달(시행월·값·메모 + 이 시트의 예약 목록)
• 행 우클릭 「계약 시행일 변경…」 — title "정해진 날부터 기본급·계약 조건이 바뀌도록 예약해요. 그 전달 시트 값은 그대로예요." 클릭 → 계약 시행일 변경 모달(시행일·바꿀 값·메모 + 이 직원의 예약 목록)
 - CASE01 [노출 조건]: 예약 변경 = 키(slug)가 있는 시트의 데이터 칸(행 번호 칸 제외) · 계약 시행일 변경 = 직원이 매핑된 행 + 계약(계약급여내역)·직원 기준 시트(직원 마스터·급여대장), 날짜 기준 시트 미노출
 - CASE02 [여러 행 선택]: 비활성 + title "여러 행을 선택한 상태에서는 쓸 수 없어요"
• (10/8, #1084, MED-827) 예약 창 목록 개편: 셀 예약 변경 모달의 목록을 진행 중(예약됨·확인 대기·실패)만 받아 두 묶음으로 나눔 — "이 칸에 걸린 예약 {N}건"(직원 행은 같은 직원·같은 열, 직원 없는 상시 시트 행은 같은 행·열) / "이 시트의 다른 진행 중 예약 {N}건"(종전 단일 "이 시트의 예약 변경")
 - 빈 묶음: "이 칸에 걸린 예약이 없어요." / "다른 칸의 진행 중 예약이 없어요."
 - "모든 예약 보기"(밑줄 글자 버튼, 「이 칸」 묶음 머리) → 관리자 「예약된 변경」 화면을 이 시트로 좁혀 엶. 계약 시행일 변경 모달의 같은 버튼은 이 직원으로 좁혀 엶. 끝난 예약 이력은 그 화면에서 봄
 - CASE03 [시트를 단독으로 연 경우(관리자 임베드 아님)]: "모든 예약 보기" 비노출
 - 같은 칸·같은 달 예약은 서버가 만들 때 막음: "같은 칸·같은 달({YYYY-MM})의 예약이 이미 있어요. 「예약된 변경」에서 기존 예약을 확인하고, 바꾸려면 기존 예약을 취소한 뒤 다시 만들어 주세요."
ㄴ70-R · 신규 모달(사양서 미작성 — 채번 대기) · [[HBHR210_계약급여내역 시트]] · scheduled_actions신규 (14c13f52 #974, MED-825 · a0298fde #962, MED-821) · 모달 목록의 「검사」(dry-run, fca2c067 #976)·「승인」(AI 제안, 85812e19 #983) 버튼은 모달 문서 몫 · 라이브 실사 확인(10/2): 셀 우클릭 메뉴에 「예약 변경…」 존재(DOM) · TBU: 메뉴 내 위치·「계약 시행일 변경…」·모달 내부 · 목록 두 묶음·「모든 예약 보기」(bee96793 · 서버 중복 차단 3d441c2e, #1084) — 코드 근거, TBU: 라이브 실사
ㄴㄴ70-RS1확인 뒤 적용 대기 — 예약 목록 「승인」Button• 조직 설정 「확인 뒤 적용」이면 시행월에 바로 쓰지 않고 확인 대기(변경 세트)로 남음 — 예약 목록(셀 예약 변경 모달)의 「승인」 또는 히스토리 적용으로 적용
• 「승인」 클릭 → 컨펌 "이 예약을 승인할까요? 확인 대기 중인 변경은 지금 내 권한으로 시트에 적용되고, AI 제안은 시행월에 적용돼요." → 확인 대기 변경 = 승인자 권한으로 즉시 적용·예약 「적용됨」 / AI 제안 = 예약됨
ㄴ70-RS · ㄴ64H · ㄴ70-AI-F · admin 「예약된 변경」(사양서 없음)수정 (30fe6180, #1021 — MED-825 QA) · 종전: 변경 세트가 붙은 대기는 「승인」 불가("이 예약은 변경 세트 카드에서 적용해 주세요.") · TBU: 모달 내부·라이브 실사
ㄴ70-AI시트 어시스턴트Widget• 시트 화면에 마운트되는 AI 위젯(「시트 어시스턴트」). 워크북이 **활성 시트의 구조·상태·선택 영역(값 없이 키만)**을 컨텍스트로 전달
 - CASE01 [조직 모듈 OFF]: 위젯 비노출(settings.ai.modules.sheet.enabled)
 - CASE02 [한도 초과]: 서버 거절 문구 노출
• 읽기 전용 도구 8종만 사용, 호출자 권한으로 payroll:read + 시트별 공유·grant 재검사
• 시트를 직접 바꾸는 도구는 두지 않는다 — 편집은 어시스턴트가 변경 세트로 제안하고 사용자가 카드에서 승인해야 서버가 적용한다(70-AI-A)
• 시트 임베드 중에는 관리자 패널 자기 AI 위젯이 숨되, 시트 어시스턴트 FAB은 남는다(70-AI-E)
[[HBAD110_AI 어시스턴트]] · [[HBAD100_App Shell·사이드바]] · 70-AI-A 변경 세트신설 (코드 반영: 1cfa01e #810 · 4829289 #812 · 18f766b #815) · 제안형 편집 도구 추가(2204a6b #821) · TBU: 라이브 실사 이월
ㄴ70-AI-A변경 세트 (제안 → 미리보기 → 적용 → 되돌리기)-• 시트 대량 편집을 곧바로 반영하지 않고 변경 세트로 묶어 「제안 → 미리보기 → 승인 → 적용 → 되돌리기」 순서로 처리하는 기능. 시트 셀 변경에 서버측 이력이 처음 생긴다(그전에는 클라이언트 실행취소뿐)
• 변경 세트 종류: 셀 값(cells) / 행 추가(rows) / 열 레이아웃(layout, 70-AI-C) / 업로드 임포트(import, ㄴ25-U)
• 각 세트는 상태 · 요약 · 영향(행·셀·열 합계 전→후 + 차이 목록 최대 50건) · 위험(급여 반영 대상 열 · 잠금 · 퇴직자 포함 · 100행 초과) · 적용 직전 원본 스냅샷 · 출처(AI/직접)를 갖는다. 사람이 직접 한 대량 편집도 같은 이력에 출처만 달리해 기록된다
• 제안 시 게이트: 편집 권한·보호·열 종류를 검사 — 보호 시트는 제안 단계에서 차단, 다른 화면으로 값이 돌아가는 연동 열은 거절
• 적용 시: 같은 게이트를 다시 검사 → 원본 스냅샷 저장 → 셀 저장(일반 편집과 동일 경로). 위험 배지가 붙은 세트는 확인 체크 없이는 적용 불가(2차 확인)
• 어시스턴트 제안 도구: 조건(팀·재직 여부·열 조건·선택 행)과 매핑표로 셀 값 일괄 수정 제안 · 행 추가 제안. 모델은 조건만 내고 대상 행은 서버가 확정한다
 - CASE01 [되돌리기]: 스냅샷으로 복원. 단, 적용 이후 사람이 다시 바꾼 셀은 충돌로 남겨 덮어쓰지 않는다
 - CASE02 [적용·되돌리기 직후]: 워크북 재로딩 + 실행취소 스택 초기화 + 「되돌리기」 토스트
70-AI 시트 어시스턴트 · 70-AI-B 변경 세트 카드 · 64E 히스토리 드로어 · 50 시트 헤더(최근 변경 칩) · 58 실행취소/재실행 · 61 반영 버튼신설 (코드 반영: 2204a6b, #821) · 서버측 셀 변경 이력 최초 도입 · TBU: 라이브 실사 이월
ㄴ70-AI-B변경 세트 카드Widget• 어시스턴트 답변에 붙는 변경 세트 카드. 구성 = 상태 · 요약 · 영향 · 위험 배지 · 합계 표(전→후) · 차이 목록 · 확인 체크 · [적용] [취소] [되돌리기] 버튼 · 문제 신고(신고 시 해당 변경 세트 식별자 첨부)
• 만들어진 변경 세트는 답변 메시지에 연결되어 대화를 다시 열어도 카드가 그대로 보인다
 - CASE01 [위험 배지 있음]: 확인 체크 전에는 [적용] 불가
 - CASE02 [대화 기록에서 되살린 카드]: 서버에서 받은 카드도 [적용]·[취소]·[되돌리기] 버튼이 정상 활성된다 — 처음부터 비활성으로 붙던 문제 수정(2026-09-22 QA)
70-AI-A 변경 세트 · [[HBAD110_AI 어시스턴트]]신설 (코드 반영: 2204a6b #821) · 서버 복원 카드 버튼 비활성 수정(c51d76d, #824) · TBU: 라이브 실사 이월
ㄴ70-AI-C열 레이아웃 변경 제안-• 어시스턴트가 열 추가 · 수정 · 삭제 · 이동 · 수식 열을 레이아웃 변경 세트로 제안하고, 사용자가 카드에서 적용·되돌리기 하는 기능
• 제안과 적용이 같은 계획기를 거쳐 같은 검사를 받고, 제안 때 정한 열 키를 그대로 적용에 사용해 제안과 결과가 어긋나지 않는다
• 시트가 기존 템플릿과 맞으면 추천 템플릿 경로를 함께 안내한다
• 선택지 동반·형식 diff 표시(10/7, #1038, MED-885): 도구 스키마에 selectOptions — 선택(select)·다중 선택(multiselect) 열 제안에 선택지가 담기고, 계획기는 선택 열에 선택지가 없으면 제안을 거절(다중 선택은 format에도 거울 기록). diff 설명에 표시 형식과 선택지 표기(종전: literal → literal로만 보이고 적용 뒤 고를 것 없는 열이 되던 버그). 프롬프트 sheet-explain-v10
 - CASE01 [도구 호출이 여러 턴 이어지는 대화]: 어시스턴트 응답 제한 시간을 따로 두어 도중에 끊기지 않는다
 - CASE02 [수식만 바꾸는 변경]: 수식이 있는 열은 열 종류를 「ƒ 수식」으로 유지한다(열 추가·수정 공통). 레이아웃 변경 세트가 수식만 고치는 수정에서 열 종류를 수식 → 값으로 뒤집던 결함 수정이며, 이미 뒤집힌 열은 적용된 변경 세트 스냅샷으로 자동 복구하되 사람이 손으로 고친 열은 그대로 둔다
70-AI-A 변경 세트 · 71 열 헤더 메뉴 · ㄴ71-A 열 설정 「종류」 · 64D 사용 중 구조 잠금 · [[HBHR107_컬럼 헤더 컨트롤]]신설 (코드 반영: cdc6685, #822) · 수식 열 종류 뒤집힘 수정(73f8bfc, #872 — CS-OKBEST-260923-0005) · TBU: 라이브 실사 이월
ㄴ70-AI-D급여 정산 도구 · 단계 그라운딩-• 시트 어시스턴트에 급여 정산 도구 5종을 추가: ① 급여 정산 진행 상태 조회 ② 아직 반영되지 않은 시트 목록 ③ 급여대장 셀 값의 출처 설명 ④ 계산 과정 설명 ⑤ 이상 징후 탐지
• 어시스턴트 프롬프트에 7단계 정산 모델과 각 단계의 버튼 위치를 그라운딩해, 답변이 실제 화면 동선을 가리키도록 한다
• 급여대장 값의 출처는 수당·공제 기록의 원본/대상 정보를 직접 읽어 설명한다
 - CASE01 [실행 요청]: 반영·확정·발송·내보내기를 실행하는 도구는 두지 않는다 — 어시스턴트는 설명·탐지까지만 하고 실행은 사용자가 화면에서 수행
70-AI 시트 어시스턴트 · 61 반영 버튼 · [[HBHR200_급여대장 시트]] · [[HBHR201_전체 확정 (commit)]]신설 (코드 반영: b590afa, #827) · 읽기·설명 전용 · TBU: 라이브 실사 이월
ㄴ70-AI-E관리자 패널 임베드 FAB 노출Button• 관리자 패널 「급여 관리 › 시트」(시트 화면을 iframe으로 끼워 넣는 화면)에서 시트 어시스턴트(반짝이) FAB이 보이지 않던 문제를 해소. 임베드 화면에서는 시트 쪽 AI FAB을 화면을 맡는 어시스턴트 예외로 두어 숨김 대상에서 제외한다(관리자 패널 자기 AI 위젯은 계속 숨김 — 진입점이 하나도 없던 상태 해소)
 - CASE01 [도크로 열기]: iframe 안에서 어시스턴트를 도크로 열면 도크 폭을 부모(관리자 패널)에 알려 관리자 패널 채팅 FAB이 좌측 레일 폭과 합산해 비킨다
70-AI 시트 어시스턴트 · [[HBAD100_App Shell·사이드바]] · [[HBAD110_AI 어시스턴트]]수정 (코드 반영: 9d73c12, #853) · CS-OKBEST-260922-0002 QA 재검증 · 배경: 2026-09-04 도크 작업 + #850이 서로 상대가 그린다고 가정 · TBU: 라이브 실사 이월
ㄴ70-AI-F예약 변경 제안 (AI → 사람 승인)-• 「OO 다음 달부터 기본급 300만원」처럼 특정 날부터 바뀌는 값을 말하면 어시스턴트가 열 종류로 경로를 갈라 예약 변경을 제안(항상 확인 대기 · AI 제안). 사람이 예약 목록의 「승인」(title "제안을 예약으로 바꿔요(시행월이 왔으면 바로 적용)")을 눌러야 예약됨
 - CASE01 [계약 식별 열(기본급·시급 등)]: 계약 시행일 변경 제안 · CASE02 [손 입력 열]: 칸 예약 제안
 - CASE03 [수식·집계 열]: 예약 대신 수식 제안(PERIODEND) · CASE04 [상시 시트]: 새 버전 안내 · CASE05 [원천 기록 열·지난달]: 거절
ㄴ70-AI · ㄴ70-RS 예약 메뉴 · [[HBAD110_AI 어시스턴트]] · admin 「예약된 변경」신규 (85812e19 #983, MED-828) · 제안 직후 dry-run 영향·확인 사유를 답변에 포함 · 시트 모듈 턴만(직원 앱 AI 제외) · TBU: 라이브 실사
ㄴ70-AI-G붙여넣기 첨부 칩 (표·긴 글)Chip• 입력줄에 표(시트·엑셀 복사)나 긴 글(1,500자·8줄 이상)을 붙여 넣으면 입력줄에 풀지 않고 입력줄 위 첨부 칩으로 받음. 칩 = 「붙여넣기」 + "표 {N}행 × {M}열 · {시트 이름}"(긴 글은 "텍스트 {N}자", 상한 초과 시 " (잘림)") + 미리보기 3행 + 제거(title "첨부 제거")
• 우리 시트에서 복사한 표는 열 이름·시트 이름까지 붙음. 첨부만으로도 전송 가능(placeholder "첨부에 대해 물어보세요 (비워도 전송돼요)")
 - CASE01 [짧은 한 줄]: 종전대로 입력줄 · CASE02 [응답 done 미수신]: 4초마다 저장된 답변을 찾아 복원(실패 말풍선 대신)
ㄴ70-AI · [[HBAD110_AI 어시스턴트]](공용 위젯)신규 (70d9a7df #1005, MED-859 · MED-861) · 상한 300행 × 60열 · 셀 500자 · 텍스트 30,000자 · TBU: 라이브 실사
ㄴ70-AI-H시트 위치 안내 (기능 바로가기 · 열 위치)-• (10/8, #1043) 시트 어시스턴트의 「기능 바로가기」·답변 속 「화면에서 위치 보기」([[HBAD110_AI 어시스턴트]] 35·ㄴ36·ㄴ76)로 시트 안 위치를 짚어 주는 기능. 관리자 패널 안에 임베드된 시트에서도 시트 자신의 어시스턴트가 안내
• 등록 기능 4종 → 강조 대상(제목 / 설명 원문)
 - "인사 시트 화면 구성": 시트 영역 / "이 영역에서 시트 정보를 확인하세요."
 - "인사 시트 필터·정렬·찾기": 툴바 필터 버튼 "필터 만들기" / "이 버튼에서 열 필터 단추 표시를 켜거나 끌 수 있어요." — 좁은 툴바라 더보기 판으로 들어가 있으면 더보기 메뉴를 먼저 엶
 - "인사 시트 셀 편집·서식": 표 / "이 표에서 수정할 셀을 선택하세요."
 - "인사 시트 작업 상태 변경"(상태 배지는 가리키지 않음): CASE01 [설정 중] "설정 완료" / "이 버튼에서 설정 완료 내용을 확인할 수 있어요." · CASE02 [사용 중] 파일 메뉴를 열고 작업 완료·재설정 항목 "파일 · 시트 상태 변경" / "작업 완료 또는 시트 재설정 항목을 선택하세요." · CASE03 [작업 완료] "사용 중으로 변경" / "이 버튼으로 사용 중 상태로 되돌릴 수 있어요."
• 열 위치: 저장된 열 ID를 서버가 재확인 → 고정 열 폭을 빼고 가로 스크롤 → 열 머리글 강조(제목 = 열 이름, "이 열의 내용을 확인하세요.")
• 메뉴만 열고 필터 적용·상태 변경·셀 값 변경은 실행하지 않음 — 사용자가 직접 누름
 - 거절: [시트·기간 바뀜] "시트나 기간이 바뀌었어요. 현재 시트에서 다시 선택해 주세요." · [셀 편집·수식바 입력·저장 중·새 행 작성 중] "셀 편집과 저장을 마친 뒤 다시 선택해 주세요." · [열 숨김·삭제] "열이 숨겨졌거나 삭제되었어요. 목록을 다시 열어 주세요." · [그리드 준비 전] "시트가 아직 준비되지 않았어요. 잠시 후 다시 선택해 주세요." · [상태 변경 안내인데 설정 관리 권한 없음] "시트 설정을 관리할 권한이 없어요. 목록을 다시 열어 주세요." · [시트 미열림] "먼저 안내받을 시트를 열어 주세요."
 - 안내 도중 시트 상태·설정 관리 권한이 바뀌면 표시 중단
ㄴ70-AI · 50 툴바 · 64 수명주기 · [[HBAD110_AI 어시스턴트]] ㄴ77·ㄴ78 · workbook/ai-context.ts navigateGuidance신설(#1043) · 동작 노트(9b5c1908, #1082): 시트 최초 로드 때 초기화 구문이 등록한 이동 함수를 인자 없이 한 번 자동 호출해 콘솔 오류가 나던 결함 수정 — 사용자가 위치 안내를 고를 때만 실행 · 범위: 저장된 열 정의 최대 200개(자동 생성 기본 열·동적 치료 항목 열 제외) · TBU: 라이브 실사
ㄴ71열 헤더 메뉴Menu• 열 헤더 우클릭·컨트롤로 여는 메뉴. "열 설정"을 메뉴 최상단으로 이동하고 설명 줄 "열 종류와 형식, 급여 반영 대상을 설정합니다"를 붙였다(반영 대상 지정 = 반영 버튼 활성 전제). 열 우클릭 시 해당 열이 선택되도록 변경해 메뉴 대상과 화면 선택을 일치시킴. 메뉴에 조건부 서식 진입을 추가(74 규칙 모달)
• "열 설정" 클릭 시: 열 종류 에디터 열림(열 종류·형식·대상 급여대장 항목 지정)
• "조건부 서식" 클릭 시: 규칙 모달 오픈(74)
 - CASE-E [중복 컬럼 키 저장 시도]: 서버가 columnLayout 저장(생성/수정/템플릿 저장 5개 경로 공통)을 거부 — 오류 문구 "컬럼 키가 중복되었어요: {키 목록} — 같은 키의 열은 시트에 하나만 있을 수 있어요." (중복 키 유입 시 Alpine x-for 키 충돌로 헤더가 조용히 사라지는 렌더 붕괴 재발 방지)
61 반영 버튼(대상 지정) · 74 조건부 서식 규칙 모달 · [[HBHR107_컬럼 헤더 컨트롤]] 상세신규 (코드 반영: aed8800) · "열 설정" 최상단 이동 + 설명 줄 · 우클릭 열 선택 · 조건부 서식 진입 추가(7be8937) · 헤더/행 컨텍스트 메뉴는 실측 렌더 크기 기준으로 뷰포트 안에 열림(넘침 방지, d2f9157) · 중복 키 서버 검증(91782a7 — 문구는 코드 확정값, 재현에 저장 실행이 필요해 라이브 실사 생략) · 메뉴 항목 「열 북마크 / 북마크 해제」 추가(8284d800 #982 — [[HBHR107_컬럼 헤더 컨트롤]] 30)
72수식 적용 범위 하단 바-• 셀 수식 편집 중 화면 하단에 상시 노출되는 적용 범위 바(formula-scope-bar). 기존 범위 선택 팝업을 제거하고, 엑셀 관습에 맞춰 Enter = 이 셀만 · Shift+Enter = 열 전체 두 경로를 키로 제공(기존 안내 배지 제거). 같은 두 경로를 바의 [이 셀만] · [열 전체] 버튼으로도 제공
• 셀 수식 편집 진입 시: 하단 바 노출 → Enter/Shift+Enter 또는 바 버튼으로 적용 범위 선택
 - 사용 중 시트 바 원문: 좌측 안내 "Enter → 이 셀만 적용 (사용 중에는 열 전체 적용 불가)" / 버튼 이 셀만 적용 · [Shift+Enter 전체 열에 적용 🔒](사용 중 시트에서 잠금/비활성)
 - CASE01 [사용 중 시트]: Shift+Enter(열 전체)도 [이 셀만]으로 처리하고, 적용 전 수정 사유 입력을 요구 → 입력 값을 셀 메모로 저장(마커·호버·이력 재사용)
 - CASE02 [메모 저장 실패]: 수식 적용은 유지 + 실패 토스트 안내
56 셀 상세 레일(메모) · 64D 사용 중 구조 잠금 · sheet_cells 메모신규 (코드 반영: 5f00544 — 2026-08-10 확정 · UP-008 F4) · 범위 선택 팝업 제거 · Enter/Shift+Enter 관습 · 8/17 라이브 실사: 바 안내·버튼 원문 확정
73하단 합계행Cell• 컬럼별 "∑" 합계 + "{n}명" 카운트를 표시하는 전 시트 공통 합계행
 - CASE01 [값 0]: 0 표기
집계(∑) [[HBHR107_컬럼 헤더 컨트롤]] 참조전 시트 공통
74조건부 서식 규칙 모달Modal• 열 헤더 우클릭 "🎨 조건부 서식"(71)으로 여는 규칙 모달. 셀 값 조건 + 색 프리셋 + 대상 셀 미리보기로 규칙을 구성하며, 값 조건 외에 수식 평가 조건도 지원한다. 모달 원문: 제목 "조건부 서식 — {열명}" / 설명 "조건에 맞는 셀이 스스로 색을 바꿔요. 규칙은 시트에 저장되고, 칩에서 켜고 끌 수 있어요." / 조건 옵션 = 다음보다 큼 / 다음보다 작음 / 같음 / 같지 않음 / 비어 있음 / 수식이 참일 때 / 값 입력 "값 또는 [열키]" + 힌트 "고정값(100000) 또는 다른 컬럼 참조([지급총액])를 넣을 수 있어요." / 색 프리셋 4종(무색·노랑·초록·파랑 등) + "굵게" 체크 / 미리보기 "값 — 현재 {n}개 셀 해당" / 버튼 [취소] [규칙 저장]
• 규칙 설정 시: 조건(값/수식) + 색 선택 → 대상 셀 미리보기로 확인
 - CASE01 [값 조건]: 다음보다 큼/작음/같음/같지 않음/비어 있음 등 셀 값 비교
 - CASE02 [수식 조건]: "수식이 참일 때" — 수식 평가 결과로 서식 적용
71 열 헤더 메뉴 · [[HBHR107_컬럼 헤더 컨트롤]]신규 (코드 반영: 7be8937 — UP-007) · 값/수식 조건 + 색 프리셋 + 미리보기 · 8/17 라이브 실사: 모달 원문·조건 옵션·색 프리셋 확정
75수식 함수 신설·IFERROR 감싸기-• 수식 함수 3종 신설: IFERROR / SUMIF / COUNTIF(fx 가이드·자동완성 등록). 헤더 수식 편집기·수식바에 「IFERROR로 감싸기」 버튼을 제공해 현재 수식을 IFERROR로 한 번에 감싼다. 수식바 우측 끝 버튼 원문 "🛡 IFERROR", 툴팁 "현재 수식을 IFERROR(수식, 0)로 감싸요 — 참조 미해결·0 나눗셈 같은 오류를 담당자가 정한 값으로 통제해요"
• "IFERROR로 감싸기" 클릭 시: 현재 수식을 IFERROR(…)로 래핑
 - CASE01 [이미 IFERROR로 감싸짐]: 버튼 비활성(disabled)
71 열 헤더 메뉴(헤더 수식 편집기) · 60 수식바 · fx 가이드·자동완성신규 (코드 반영: 2a18a41 — UP-006) · 함수 3종 등록 · IFERROR 감싸기 버튼 · 8/17 라이브 실사: 버튼·툴팁 원문 확정
ㄴ75A불리언 리터럴 (TRUE/FALSE)-• 수식에서 불리언 리터럴 TRUE / FALSE를 지원(맨 표기·함수형 TRUE()/FALSE() 둘 다). 내부 표현은 1/0으로, 기존 비교·논리(AND/OR/NOT) 연산자 결과와 동일한 표현이다. 수식 도구(fx) 카탈로그에 TRUE/FALSE 항목 등재. fx 팝오버 함수 카탈로그 원문: TODAY() DAY MONTH YEAR EOMONTH IF(c,t,e) ROUND ROUNDUP ROUNDDOWN FLOOR CEILING ABS MIN MAX SUM AVERAGE COUNT AND OR NOT TRUE FALSE IFERROR SUMIF COUNTIF SUMIFS COUNTIFS / 안내 "함수를 누르면 설명이 아래에 펼쳐져요. 읽어 보고 「함수 입력」으로 넣으세요." / 하단 "상수 (단가)" + [관리]
• 수식 입력 시: TRUE→1 / FALSE→0으로 평가. 열 표시 형식 「불리언」(63A)과 결합 시 True/False 텍스트로 표시
63A 불리언 표시 형식 · 75 수식 함수 · fx 카탈로그신규 (코드 반영: 90bc68f) · 맨 표기·함수형 · fx 카탈로그 등재 · 8/17 라이브 실사: fx 팝오버 함수 카탈로그·상수(단가) 관리 원문 확정
ㄴ75B엑셀식 비교 연산자 (=/<>)-• 수식 본식에서 엑셀 관습의 단일 등호 =([A]=[B])와 부등호 <>를 허용. 토크나이저가 내부 ==/!=로 정규화하며, 기존 ==/!= 표기도 그대로 동작한다. SUMIF/COUNTIF 조건 문자열 파서가 이미 두 표기를 받고 있어 같은 시트 안 문법이 통일됨
 - CASE01 [=/<> 입력]: 내부 ==/!=로 정규화해 평가
75 수식 함수(SUMIF/COUNTIF) · 79 수식 순환 감지 · 수식 엔진신규 (코드 반영: b862772 — QA-55) · =/<> 허용·내부 ==/!= 정규화 · SUMIF/COUNTIF와 문법 통일
ㄴ75C기간 함수·문자열 비교·TODAY 시간대-• 함수 신설: PERIODSTART()("이 시트 달의 첫날 — 지난달을 다시 열어도 그 달 기준") · PERIODEND()("이 시트 달의 말일 — 근속·기한 판정의 기준일") · DATEDIF(s, e, 단위)("두 날짜 사이 꽉 찬 연("Y")·월("M")·일("D") 수")
• 문자열 리터럴 "…" 비교 가능(예: [상태]="재직"), TODAY()는 조직 시간대 기준
 - 상시 시트: 오늘이 속한 달 기준
ㄴ75A fx 카탈로그 · 75 수식 함수신규 (d5aa87d9 #956) · 예시 원문 =DATEDIF([입사일], PERIODEND(), "Y")
ㄴ75DROUND 반올림 방식 (엑셀 일치)-• 수식 함수 ROUND의 반올림을 은행가 반올림(half-to-even, 2.5→2)에서 엑셀과 같은 half away from zero(2.5→3, −2.5→−3, ROUND(125, -1)→130)로 변경. ROUNDUP·ROUNDDOWN은 종전부터 엑셀과 동일
• 배경: 병원 급여는 엑셀 대조가 검증 기준 — OFF 수당 =ROUND(일급 × OFF일 × 1.5, -1)처럼 정확히 5로 끝나는 값에서 엑셀은 올리고 종전 구현은 짝수 쪽으로 내려 10원이 달랐고(MED-103 남은 이슈 ⑤), 병원에는 "계산이 틀렸다"로 보임
• 배포 전 영향 리포트: 같은 기간 시트를 두 방식으로 각각 해석해 ROUND 수식 셀의 값 차이를 셀 단위로 세는 읽기 전용 스크립트 동봉
75 수식 함수 · ㄴ75A fx 카탈로그수정 (코드 반영: 33ab86f9, #901) · half away from zero 통일
ㄴ75E함수 신설 QUOTIENT · WEEKDAY · ISHOLIDAY-• fx 카탈로그 신설: QUOTIENT(분자, 분모)("나눗셈의 몫 — QUOTIENT(분자, 분모)" — 정수 부분만, 0 방향 버림, 분모 0이면 0) · WEEKDAY(날짜, [유형])("날짜의 요일 번호 — 일=1 … 토=7 (유형 2는 월=1 … 일=7)", 유형 3 = 월=0…일=6) · ISHOLIDAY(날짜)("조직 휴일이면 1 — 공휴일·대체공휴일·병원 지정 휴일 (주말은 WEEKDAY 로)")
• 예시 원문 =QUOTIENT([실적합], [기준값]) * [지급단위] · =IF(WEEKDAY([근무일])=7, [연장시간], 0) · =IF(OR(WEEKDAY([근무일])=1, ISHOLIDAY([근무일])), [연장시간], 0)
ㄴ75A fx 카탈로그 · 75 수식 함수 · 엑셀 가져오기(QUOTIENT 허용) · 70-AI 시트 어시스턴트신규 (845fa997 #1029 MED-880 · 622b6663 #1031 MED-881) · ISHOLIDAY 달력 = 근태·연차와 같은 조직 휴일(국가 공휴일·대체공휴일 − 조직 제외 + 병원 지정 휴일), 토·일 제외 · TBU: 라이브 실사(자동완성·도움말)
76드로어 재편 (요약)-• 우측 드로어 중심으로 편집 UI를 재편(PR #528). 요약: ① 열 설정 모달 → 우측 드로어(진입점 6곳) ② 급여 반영 설정 분리 드로어 ③ 행 인스펙터 우측 레일 이관 ④ 상시 수식 바 + fx 팝오버·인수 가이드 ⑤ 선택 영역 합계 배지 "선택 N개 · 합계 · 평균" ⑥ 카테고리 점프바 숨김 처리(a946995) ⑦ 툴팁 소스 목록 가림 수정(d944d1e). 각 구역 상세는 하위 문서에 위임
• 상세 동선은 [[HBHR107_컬럼 헤더 컨트롤]] / [[HBHR109_행 정보 패널·검색]]에 위임
56 셀 상세 레일 · 60 수식바 · [[HBHR106_데이터 메뉴]] · [[HBHR107_컬럼 헤더 컨트롤]] · [[HBHR109_행 정보 패널·검색]]요약 반영 (PR #528, 8/8 머지) · 상세 위임 · 전면 재작성 별도 예정 · 열 설정 드로어 미저장 변경 확인창에서 [취소] 후 같은 확인이 재차 뜨던 문제 수정(188553a)
77급여대장 생성 진입점Button• 대상 급여대장 시트가 없을 때, 반영 동선에서 급여대장을 새로 생성하는 진입점을 제공하는 기능
• 클릭 시: 급여대장 시트 생성 → 반영 대상으로 연결
61 반영 버튼 · [[HBHR200_급여대장]] (추정)신규 (코드 반영: 87437af) · 급여대장 부재 시 생성 유도
78크로스시트 참조 순환 방지-• 시트 간 수식 참조(크로스시트 참조) 시 순환 참조를 방지하는 옵션72 수식 적용 범위 바 · 수식 엔진신규 (코드 반영: 995a0c6) · 순환 참조 방지 옵션
79수식 순환 감지·저장 차단-• 수식을 저장하기 직전, 크로스시트·동일 시트(자기 자신 포함) 참조를 따라가 편집 중인 열/셀로 되돌아오는 순환 경로가 생기는지 검사해 순환이면 저장을 차단하고 경고를 표시하는 가드. 셀 편집(셀 = 입력·수식바)과 헤더 수식 편집기 양쪽에 적용되며, 순환 검사에 걸리면 입력 초안을 그대로 남긴다. 이미 저장돼 있던 옛 순환은 검사하지 않는다(편집 열/셀을 지나는 경로만 판정)
• 저장 시: 순환 검사 → 순환 시 저장 중단 + 경고 팝업
 - CASE01 [순환 감지]: 저장 차단 · 경고 팝업 danger 톤 "서로 참조하는 수식이 있어 저장할 수 없어요." + "닫기" 버튼, 입력 초안 유지
72 수식 적용 범위 바 · 71 열 헤더 메뉴(헤더 수식 편집기) · 60 수식바 · 78 크로스시트 순환 방지 · 수식 엔진신규 (코드 반영: 471f3db·954fac5 — PR #545 QA-56) · 셀 편집·헤더 수식 편집기 양쪽 적용 · 저장 시점 차단 · 경고 문구(CASE01)는 저장 실행 필요로 8/17 실사 미검증(TBU)
7A채우기 핸들-• 셀을 이어서 채우는 채우기 핸들. 마우스 드래그(엑셀식 핸들 드래그)와 단축키 ⌘D(아래로 채우기)/⌘R(오른쪽으로 채우기)이 같은 채우기 로직을 공유해, 값 채우기 규칙(연속 값 감지 등)과 되돌리기 이력이 두 경로에서 동일하게 동작한다
• 드래그 또는 ⌘D/⌘R 시: 채우기 로직 적용(값 규칙·되돌리기 이력 공통)
58 실행취소/재실행 · [[HBHR103_편집 메뉴·단축키]] 채우기 단축키 · 71 열 헤더 메뉴신규 (코드 반영: 8d38bed — PR #548) · 드래그·단축키 채우기 로직 통일
70-EEmpty 상태-• 해당 기간 시트 없을 시 빈 상태를 노출해 새 시트 만들기를 유도하는 상태[[HBHR101_새 시트 만들기 모달]] 참조TBU: Empty 노출 문구 원문

단축키 카탈로그 포인터 ​

"단축키" 버튼(ㄴ23)이 여는 도움말 모달은 4카테고리로 구성되며, 전체 카탈로그는 [[HBHR103_편집 메뉴·단축키]]가 소유한다. 워크스페이스는 진입점만 제공 — 아래는 카테고리 요약 포인터이며 상세 항목은 103 참조.

카테고리대표 키 (요약)상세
탐색 (Navigation)↑↓←→ 셀 이동 / Alt+↑↓ 사이드바 시트 전환 / Alt+R 행 정보 / Alt+N 새 시트[[HBHR103_편집 메뉴·단축키]]
선택 (Selection)Shift+클릭 범위 선택 / ⌘+방향키 데이터 끝 이동 · ⌘⇧+방향키 범위 선택 / 우클릭(# 열) 행 메뉴 / ⌘⇧\ 우클릭 메뉴 열기[[HBHR103_편집 메뉴·단축키]]
편집 (Editing)Enter/Tab/Esc / ⌘C·X·V / ⌘⇧V 값만 · ⌘⌥V 서식만 / ⌘D·R 채우기 / ⌘Z·⇧Z[[HBHR103_편집 메뉴·단축키]]
메뉴·찾기Alt+F/E/I/D/V 메뉴 열기 / Alt+/ 메뉴 검색 / ⌘F·H 찾기·바꾸기 / ⌘/ 도움말 토글[[HBHR103_편집 메뉴·단축키]]

※ 수식어 없는 글자 단축키(j·k / "/" / i / ?)는 폐지(#831) — 글자·숫자 키는 선택 셀 편집 시작. 표기는 기기별(맥 ⌘·⌥·⇧ / 윈도우 Ctrl·Alt·Shift)

참조 요약 (하위 문서 트리) ​

구역상세 사양서
새 시트 만들기 모달[[HBHR101_새 시트 만들기 모달]]
파일 메뉴[[HBHR102_파일 메뉴]]
편집 메뉴·단축키 (전체 카탈로그)[[HBHR103_편집 메뉴·단축키]]
보기 메뉴[[HBHR104_보기 메뉴]]
삽입 메뉴[[HBHR105_삽입 메뉴]]
데이터 메뉴[[HBHR106_데이터 메뉴]]
컬럼 헤더 컨트롤[[HBHR107_컬럼 헤더 컨트롤]]
좌측 사이드바(폴더/휴지통) · 폴더 관리 모달[[HBHR108_폴더·휴지통 사이드바]]
시트 헤더 검색 · 행 정보 · 셀 상세 패널[[HBHR109_행 정보 패널·검색]]
시트 유형 화면HBHR200 ~ HBHR270

권한·상태 분기 요약 ​

시나리오트리거결과비고
CASE01 [미인증 진입]/hr-system 직접/hr-system/signin 리다이렉트
CASE02 [HR_ADMIN 진입]인증 세션최근 시트 /sheets/조건1 [HR_ADMIN]
CASE03 [SUPER_ADMIN 진입]인증 세션최근 시트 /sheets/조건2 [SUPER_ADMIN]
CASE04 [폴더 없음]folder 값 부재"(미분류)" fallback
CASE05 [시트 없음]sheet_list 0건Empty 상태(70-E)문구 TBU
CASE06 [팀 범위 조회자(팀장)]payroll:read.team팀 행만 표시 + 「팀 범위」 배지(ㄴ50-T) · 히스토리 흐림 · 값 변경 이력 안내만#916·#936·#930·#831

Open Question ​

  • 최근 작업 시트가 없을 때의 진입 동선 (TBU)
  • 계정 버튼(11) 표시 값 (TBU)
  • 알림(12) / 댓글(59) / 메모 이력(55) 버튼의 상세 동작 (TBU)
  • Empty 상태(70-E) 노출 문구 (TBU)
  • 시트 검색(52) 결과 없음 Empty 문구 (TBU)
  • 폴더 관리 모달 "+ 새 폴더" 상세 동작·에러 처리 — [[HBHR108_폴더·휴지통 사이드바]] 소유 (TBU)
  • 이전 월 가져오기(22) 에러·실패 동작 (TBU)
  • 폴더 관리 버튼(24) 에러·실패 동작 (TBU)
  • tRPC procedure · 권한 토큰 실제 키 — 현재 전부 추정 네이밍