- 틈: 내용 파일 (blob) 열쇠를 그 파일 머리의 id 로 만들고 목록 항목에는 id 가 없어, B 의 내용 파일을 A 의 것으로 덮거나 같은 항목의
예전 내용 파일로 되돌려도 오류 없이 다른 내용을 B 이름으로 꺼냈다
- 고침: 목록 항목에 내용 파일 id (16B, 16진) - 꺼내기 · 메모리로 풀기 (그림 보기) 에서 머리 id 가 목록과 다르거나 (모르면) 풀린 크기가
목록 크기와 다르면 VaultAuthException, 결과 · .jjvtmp 는 남기지 않음. 머리 (id 포함) 는 이미 조각마다 AAD 라 내용 쪽은 id 에 묶여 있음
- 형식 번호 3: 1 · 2 는 비밀번호 (열쇠) 가 맞은 뒤 목록에 지금 내용 파일의 id 를 채워 다시 쓰고 3 으로 (아직 어느 판에도 나가지 않아 지금 것을 믿음)
- 꺼내기의 "이름.jjvtmp" (받는 폴더의 평문): 쓰기 시작할 때 앱 전용 폴더의 기록 (jj_vault_exporting.txt) 에 적고 끝나면 (성공 · 실패) 지움.
앱을 켤 때 기록에 남은 .jjvtmp 만 지움 (사용자 폴더를 뒤지지 않음, .jjvtmp 가 아닌 줄은 지우지 않음)
- 시험: 다른 항목 내용 파일로 덮기 · 같은 원본의 다른 내용 파일로 되돌리기 · 목록 크기 다름 → 셋 다 실패 · 남은 파일 0,
형식 2 → 3 (id 채움 뒤 꺼내기 됨), 꺼내기 기록 (끝나면 지움 · 끊긴 뒤 켤 때 기록의 .jjvtmp 만 지움). vault 22개 통과
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 어두운 화면 값은 같음 - 두 캡처 묶음 78장을 바꾸기 전 · 뒤로 찍고 한 번 더 찍은 흔들림 기준 밖 차이 0
- 밝은 화면 캡처 (mkvdetail 18 · bigtext 60) 를 직접 봄: 읽기 어려운 곳 없음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
둘 다 1b31609 (v2026.10.20_001) 바탕. 충돌:
- assets/l10n en · ja · zh-Hans: 열쇠별 3방향 합치기 (양쪽이 같은 열쇠를 다르게 바꾼 것 0)
- lib/ui/home_page.dart 자막 줄: after_1020 의 새 배치 (좁으면 두 줄) 를 따르고, xplore_p3b 의 JjColors (테마 색) 쪽 const 빼기를 다시 적용
- lib/ui/settings_page.dart 설명 글: after_1020 의 테마 글자색 (bodyMedium · onSurfaceVariant - 밝은 화면에서도 맞음)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 10/21:
- 캡처가 없던 화면 캡처 시험 (windows_vault_shot_test · windows_misc_shot_test), Wi-Fi 공유 · 화면 보정 캡처에도 JJ_SHOT_THEME
- 662 캡처 흔들림: 크기마다 새 Navigator (앞 크기에서 밀어 연 화면이 남아 다음 첫 캡처가 다른 화면이 됨) · 밀기 그림이 끝날 때까지 기다림
- 확인: 밝은 화면 캡처를 보고 읽기 어려운 곳 없음, 어두운 화면은 0a9a2d0 과 픽셀로 견줘 흔들림 밖 차이 0, 662 는 두 번 찍어 같음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 10/21 (⑦ (나) 둘째 이후):
- 보기 화면 · 재생 막대는 밝은 화면에서도 어두운 띠 (그림 · 동영상 위 - 사진 보기 앱처럼, 내 판단).
그 띠 위 강조 (켜진 단추 · 쪽 슬라이더 · 썸네일 테두리 · 재생 위치) 는 어두운 화면의 청록, 검은 바탕의 흐린 글자도 어두운 값
- 시간줄: 재생 위치 선 · 고른 칸 글자 (밝은 화면), AI 보라 (aiColor) 는 밝은 화면에서 진하게,
다운로드 진행 막대 글자는 밝은 화면에서 진한 글자 + 흰 테두리
- 캡처 시험: 보기 화면 캡처 (windows_reader_shot_test) 를 새로 · 662 · i18n (앱 전체는 설정 화면 밝기) · check · magnet 에도 JJ_SHOT_THEME
- 시험 흔들림: 보관함 2단계 시험 정리 때 폴더를 잠깐 잡고 있으면 (errno 32) 몇 번 더 지움
- 확인: 어두운 화면 캡처를 808300b 와 픽셀로 견줘 (같은 커밋 두 번 찍은 흔들림 밖) 차이 0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 10/21 (⑦ (나) 화면마다 차례로 - 첫째 파일 탐색기):
- 주황 · 빨강 · 노랑 · 초록 (orangeAccent · redAccent · amber · greenAccent) 을 테마 색 warning · alert · amber · positive 로.
어두운 화면은 예전 Material 값 그대로, 밝은 화면만 진하게 (글자 4.5:1 · 노랑 아이콘 3:1, 노랑 글자는 amberText)
- 탐색기: 흰 바탕에서 옅은 회색 파일 아이콘을 밝은 화면일 때만 진하게, 저장 공간 그림 "이 폴더의 파일" 칸 글자 (밝은 화면)
- 통합 캡처 시험에 JJ_SHOT_THEME=light (어두운 것과 견줌)
- 설정 설명 글을 새 이름 (밝은 화면 · 기기 따라) 에 맞춤
- 확인: 어두운 화면 캡처 95장을 9324e41 과 픽셀로 견줘 실행마다 바뀌는 곳 (시각 · CPU 숫자 · 임시 이름) 밖의 차이 0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 10/21 (⑦ (가) 바탕): 처음 값은 어둡게 (예전 색 그대로), 설정 "화면 밝기: 어두운 화면 / 밝은 화면 / 기기 따라" 에 "시험" 표시.
- JjColors 를 두 벌 (JjPalette.dark = 예전 값 그대로 · light) 에서 고르는 값으로. 그래서 JjColors 를 쓰던 const 는 뺐다 (기계적으로, 62개 파일 294곳)
- 밝기를 바꾸면 테마와 함께 화면 조각 전체를 다시 그림 (상태는 그대로) - JjColors 를 직접 읽는 곳도 바로 새 색
- 기기 따라: 기기 밝기가 바뀌면 따라감. 모르는 값 · 없는 값은 어둡게
- 밝은 색은 바탕 · 칸 위 글 · 흐린 글 · 강조 · 경고 · 성공 대비 4.5:1 이상 (시험으로 확인)
- 화면별 맞추기 ((나): 탐색기 → 보기 → 설정 → 나머지) 는 다음 커밋들에서
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 10/21: Shizuku 와 같은 틀 - 처음 끔 · 경고 두 번 (켤 때 · 앱을 켠 뒤 처음 열 때) · 주황 띠 · 고정 명령 셋 · 쓰기 길 없음.
- su 를 Dart 에서 바로 (Kotlin 없음), 경로는 shz://root/… - 시스템 폴더와 같은 읽기 전용 막기 (탐색기 · 클라이언트 둘 다)
- su 가 없거나 거절하면 안내만 (들어가지 않음). 있는지 볼 때는 허락 창을 띄우지 않고, 탭을 누를 때 su 앱의 허락 창
- 처음 여는 곳 "/" (관리자 3a 결정: 다른 앱의 개인 자료가 있는 /data 를 고르기 전에 펼치지 않음), 경고 창에 "다른 앱의 개인 자료도 보일 수 있습니다"
- 셸 경로는 절대 경로만 · 줄바꿈 · \0 거절 · 작은따옴표로 감쌈
- 설정의 켜기 경고 창을 시스템 폴더 · 루트가 같이 씀 (confirmReadOnlyView)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 3a 지시 (10/21): 1단계 형식만 아는 판이 2단계 보관함을 열면 '새 판으로' 를 알리게. 열쇠가 맞은 뒤에만 vault.json 의 format 만 바꾼다 (솔트 · 감싼 열쇠는 그대로).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 지시 10/21 (보관함 2단계):
- 폴더째 넣기: 안의 구조 · 빈 폴더 그대로, 폴더 이름도 암호화한 목록에만 (바깥 보관함 폴더에는 무작위 이름 파일뿐)
- 원격 (WebDAV · SFTP · SMB · FTP · 시스템 폴더) 파일: 앱 전용 폴더 (jj_vault_view_in_…) 에 받아 넣고 받은 것은 바로 지움
- 보관함 안 새 폴더 · 파일 · 폴더 옮기기 · 폴더 이름 바꾸기 · 폴더째 꺼내기 · 폴더째 지우기 (확인 창에 파일 수), ← 는 위 폴더로
- [원본 지우기 (이동)] 는 다 들어간 것만 (폴더는 안의 것이 모두 들어갔을 때만, 읽지 못한 폴더는 반만 넣지 않음)
- 보관함 비밀번호 바꾸기는 1단계에 있음 (열쇠만 다시 감쌈)
- 버그 수정: 이름 묻는 창이 닫히는 중에 글자 칸을 버려 오류 → 창과 함께 버림
- 내 판단: 폴더 정보는 1단계 판과 맞게 - 맨 위 파일은 목록 모양 그대로, 빈 폴더 목록은 따로 (folders.jjd, 1단계의 정리가 지우지 않음).
1단계 판으로 되돌려 쓰면 파일은 다 보이지만 폴더 구조는 그 판이 목록을 다시 쓸 때 풀린다 (내용은 잃지 않음)
- 내 판단: 넣는 폴더 이름이 지금 폴더에 있으면 합치지 않고 " (2)"
- 내 판단: 같은 폴더에 같은 이름 파일을 넣으면 " (2)" (전에는 겹친 이름이 그대로 둘)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- F7: 폰 가로 (900×412) 에서 떠 있는 [이동] 이 [자막 파일 추가] 를 반쯤 가렸다 (잘못 누를 수 있음) → 높이 < 500 × 글자 배율 이면
206 의 배치 (칩 줄 아래) 를 씀. 처음에 높이 < 500 만 봤더니 960×600 · 글자 1.6 (ja) 에서도 가려 글자 배율을 곱함. 높이가 넉넉하면 그대로
- F8: 다운로드 화면 ja 412 글자 1.6 에서 제목이 넓어 주소 칸이 「動画...」 만큼으로 눌렸다 → 주소 칸이 200 보다 좁아질 때만 주소 칸 · [추가] 를
제목 아래 한 줄로 (글 폭은 지금 글꼴 · 배율로 잼). 이를 위해 AppTopBar 의 좁은 배치 아래 줄을 "높이 48 고정" 에서 "48 이상" 으로
(한 줄이면 예전처럼 48 가운데, 폭은 그대로 다 씀 - app_top_bar_test 201). 한 줄 막대 (넓은 화면) 에서는 늘 한 줄
- 214 c (move_settled_test): 전체 시험에서 한 번 실패 - 250ms 안에 원본 목록을 아직 읽지 않으면 새 파일까지 옮겨져 거짓 실패였다.
보내기가 실제로 시작된 뒤 새 파일을 만들고, "새 파일을 잃지 않음 (원본 또는 받는 쪽)" 을 따로 확인
- 시험: windows_mkvdetail_shot_test 에 900×412 (1.0 · 1.6) · 1280×480 과 [자막 파일 추가] 겹침 확인을 더해 18개 통과,
windows_bigtext_shot_test 60개 통과 (release\test\shots_f1), 전체 단위 1150개 통과, 214 c 혼자 5번 통과
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관리자 결정 10/21: 1단계는 Shizuku 만 · 읽기 전용 · 처음 끔 · 경고 두 번 (켤 때 · 앱을 켠 뒤 처음 열 때).
- Shizuku API 13.1.5 (MIT - 3a 지시의 "Apache-2.0" 이 아니라 실제 라이선스는 MIT, 고지에 MIT 원문)
- shz://sys/<기기 경로>: 목록 · 정보 · 내용 읽기 (임시로 받아 읽고 지움) 만, 쓰기 · 지우기 · 옮기기 · 새 폴더는 막음
- 셸 명령은 고정된 셋 (목록 · stat · cat), 경로는 절대 경로만 · 따옴표 처리
- 탐색기 탭 [시스템 (읽기 전용)] → Android 폴더, 주황 띠, 꺼짐 · 허락 없음 안내
- 내 판단: Shizuku API 13 의 newProcess 는 숨겨져 있어 반사로 부름 (널리 쓰는 방법, 버전이 바뀌면 다시 확인)
- 내 판단: 시스템 폴더 오류 띠에는 [서버 설정 고치기] 를 두지 않음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- windows_mkvportrait_shot_test: test/mkv_portrait_detail_test 를 실제 글꼴로 - 412×869 · 작업 기록 켬 · 감지한 언어 줄 · DNS 닿지 않음 줄에서
[AI 자막 만들기] 가 스크롤 없이 보이고 DNS 줄은 한 줄 · [시스템 DNS 로 바꾸기] 도 같은 줄. ko · ja × 글자 1.0 · 1.6 × 3가지 = 12개
- 정식 판 후보 1b31609 로 12개 통과 (release\test\shots_v20261020_001 mkvportrait_*)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- windows_bigtext_shot_test: test/large_text_test 의 화면 6개 (MKV · 파일 탐색기 · Rsync · 모니터링 · 다운로드 · 환경 설정) 를 실제 글꼴로,
글자 1.6배 (412×900 · 900×412 · 1280×800) · 글자 1.0 (412×900 · 900×412) × ko · ja = 60개. 넘침 없음 · 누르는 것이 화면 폭 안 (가로로 넘기는 막대 안은 뺌).
MKV 는 동영상 5개 · 작업 기록 3줄 (256: 폰 가로에서 기록을 켜도 목록이 3줄 보임)
- 정식 판 후보 1b31609 로 60개 통과 (release\test\shots_v20261020_001 bigtext_*)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 원인: 자막 줄은 한 줄 Row 라 좁은 폭 · 큰 글자 · 일본어에서 오른쪽으로 넘쳐 (1b31609: ja 412 글자 1.0 에서 65px, 외부 자막 + 1.6 에서 219px)
끝의 편집 · 지우기 단추가 잘려 누를 수 없었다
- 고침: 한 줄에 드는 폭 (내장 표 · 이름 최소 60 · 언어 고르기 · 문자셋 · 단추) 을 지금 글꼴 · 글자 배율로 잰다 (고르기는 가장 긴 항목 글의 폭 -
DropdownButton 이 그 폭을 씀). 모자랄 때만 두 줄, 아래 줄은 Wrap. 언어 이름은 "…" 로 줄이지 않음 (무엇을 골랐는지 보이게, 3a 결정).
넓을 때는 예전 한 줄 그대로. 오디오 트랙은 줄이 없고 칩 (음성 n개) 뿐이라 해당 없음
- windows_mkvdetail_shot_test: 412 · 960×600 · 1280×720 × 글자 1.0 · 1.6 × ko · ja (내장 + 외부 자막). 넘침 없음 · 처음 자리에서 칩과
[이동] 단추가 겹치지 않음 (206) · 끝까지 내리면 출력 줄이 단추 위 (F5 - 이미 있던 목록 끝 여백으로) 를 자리로 잰다.
1b31609 에서는 6개 실패 (넘침), 이 고침으로 12개 모두 통과. HomePage 를 쓰는 단위 11파일 111개 통과
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- l10n/tr.dart joinSentences: 한국어 · 영어는 빈칸, ja · zh 는 붙여서 (「移動しました。1 件は…」). 빈 조각은 뺌
- 파일 탐색기의 끝 알림 5곳 (복사 · 이동 끝, 긴 경로 영구 삭제, 휴지통 보내기, 휴지통 되돌리기, 끌어 놓아 옮긴 뒤) 이 이것으로 잇는다
- 시험: i18n_test (ko · en · ja · zh-Hans), moveleft 캡처 ja 960 직접 봄 - 빈칸 없음
- 262: windows_mkvend_shot_test - 가짜 FFmpeg 로 2개 묶음, 첫 동영상이 끝나는 순간 그 줄의 ■ 자리를 눌러도 ⟳ · ✕ 가 먹지 않고
둘 다 성공. ko · en · ja × 412 · 960, 정식 판 후보 1b31609 로 6개 통과 (release\test\shots_v20261020_001 mkvend_*), after_1020 으로도 6개.
i18n · explorer_conflict · batch 55개 통과
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- F3: "1개 항목을 옮겼습니다. · 1개는 원본에 남음 (건너뜀)" 처럼 마침표 뒤에 " · " 가 붙었다 → 뒤 조각도 문장 ("1개는 원본에 남았습니다 (건너뜀).",
"받는 쪽이 더 새것이라 n개를 건너뛰었습니다." 등 5개) 으로 쓰고 빈칸으로 잇기 (en · ja · zh). 같은 꼴을 찾아보니 다른 끝 알림 (지우기 ·
되돌리기) 은 이미 빈칸으로 이어 그대로. 옛 조각 글은 작업 기록 · 모니터링 · 확인 창에서도 써 열쇠는 남김
- F4: 키를 고른 뒤 안내가 창 맨 아래인데 "아래에 키 암호를" 이었다 → "위의 [개인 키 암호] 칸에 키 암호를 넣으세요" (칸 이름은 실제 칸 이름)
- 185: windows_dlcancel_shot_test - [다운로드 취소] 묻는 창 → [계속 받기] 면 그대로 받음 (가짜 백엔드), ko · en · ja × 412 · 960.
정식 판 후보 1b31609 로 6개 통과 (release\test\shots_v20261020_001 dlcancel_*), after_1020 으로도 6개 통과
- 확인: analyze · l10n 빠진 것 0, explorer_conflict · move_settled · sftp 48개, moveleft · sshkey 캡처 통과 (release\test\shots_f1),
ja 960 이동 알림 · en 412 키 안내 · ja 412 취소 창 직접 봄
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- windows_move_left_shot_test: 폴더를 합쳐 옮긴 뒤 알림 "n개는 원본에 남음 (건너뜀)" · 펼쳐 둔 원본 D 를 다시 읽어 남은 것만, ko · en · ja × 960 · 1400.
정식 판 후보 1b31609 로 6개 통과 (캡처 release\test\shots_v20261020_001 moveleft_*)
- windows_sshkey_shot_test: [개인 키 파일 고르기] 를 가짜 고르기로, 실제 시험 서버 (paramiko) · ssh-keygen 키로 .ppk 안내 · 고른 뒤 안내 ·
암호 필요 · 암호 틀림 · 서버 거부를 ko · en · ja × 412 로 (9f6c5c0 의 글, after_1020 으로 3개 통과, 캡처 release\test\shots_f1 sshkey_*).
[저장] 은 누르지 않음 (설정 메모리만)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 이미 있던 것 (그대로): 서버 설정 [개인 키 파일 고르기] · 키 암호 칸, 키 내용은 안전 저장소 (sftp.key.<id> · sftp.kp.<id>) 에 두고
파일 경로는 저장하지 않음, 설정 파일 · .bak · 보관본에는 평문 없음 (redactSecrets). "개인 키 붙여넣기" 는 없어 합칠 것 없음. 셸은 넣지 않음
- 더한 것: SftpFailure 에 keyFormat · keyPassphrase · keyRejected
· checkPrivateKey: OpenSSH · PEM RSA · PEM EC (dartssh2 4.1.0 이 읽는 꼴) 인지, 암호가 걸렸는지. PuTTY (.ppk) 는 PuTTYgen 으로 바꾸는 법,
PKCS#8 · 공개 키 (.pub) · 다른 파일은 고를 꼴을 알림 - [개인 키 파일 고르기] 에서 바로 (암호가 걸린 키면 "아래에 키 암호를 넣으세요")
· parsePrivateKey: 암호가 걸렸는데 비었으면 "키 암호를 넣으세요", 못 풀면 "암호가 맞지 않습니다" (PEM 의 다른 오류도), 그 밖은 꼴
· 키만으로 들어가다 SSHAuthError 면 "서버가 이 키를 받지 않습니다 (authorized_keys · 아이디)", 비밀번호도 있으면 "모두 거부"
- 시험 (실제 paramiko 서버 · Windows ssh-keygen): ed25519 OpenSSH (암호 · 없음) · rsa OpenSSH 암호 · rsa PEM · ecdsa OpenSSH 암호 ·
ecdsa PEM 6종으로 로그인, 짝이 없는 키 = keyRejected, 암호 없음 = keyPassphrase, PuTTY · PKCS#8 · 공개 키 · 다른 파일 = keyFormat.
틀린 키 암호 시험은 kind 를 keyPassphrase 로. sftp · sftp_stream 14개 통과, l10n 빠진 것 0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 412 ja 에서 주소 예시가 한 줄로 잘려 "--api 로 켠 …" (어떤 옵션으로 켜야 하는지) 가 보이지 않았다 - helperMaxLines 3 (다른 창의 도움 글과 같게)
- 같은 창의 모델 도움 글 (ComfyUI 체크포인트 이름) 도 3줄까지
- 캡처: windows_f1_shot_test 에 ComfyUI 로 바꾼 창 (ai_comfy) 을 더함. ko · en · ja × 412 · 960 의 6개 통과, ja 412 · en 412 ComfyUI 직접 봄 - 잘림 없음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- F1: 412 폭 en · ja 에서 👁 자리 때문에 칸 이름이 "…" 로 잘렸다 (SFTP 추가 창 "Password (leave empty if usin…")
· SFTP 비밀번호 "비밀번호" + 도움 글 "개인 키만 쓰면 비웁니다", 개인 키 암호 "개인 키 암호" + "없으면 비웁니다"
· AI 인터넷 서비스 "API 키" / "API 키 또는 아이디:비밀번호" + "넣지 않아도 됩니다"
· ZIP 으로 묶기 "비밀번호" (도움 글 "넣으면 AES-256 … 비우면 보통 ZIP" 이 선택임을 알림)
· WebDAV · SMB · FTP · 마스터 · OpenSubtitles 는 칸 이름이 이미 "비밀번호" 뿐이라 그대로. 옛 열쇠 4개 지움 (en · ja · zh)
- 131: 쿠키 안내 글 12px 흐린 회색 → ListTile 부제목과 같은 bodyMedium · onSurfaceVariant
- 시험: windows_f1_shot_test (ZIP · AI 서비스 창, ko · en · ja × 412 · 960) 추가. f1 · trunc · cookie 캡처 각 6개 통과,
72장 release\test\shots_f1 - 직접 봄 (en 412 SFTP · ja 412 AI · en 412 ZIP · ja 960 쿠키): 칸 이름 잘림 없음
- 이 고침은 다음 판 (10.20_001 노트에는 넣지 않음, 관리자 결정)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 전체 시험 부하에서만 가끔 실패하고 콘솔 끝줄만 남아 원문을 못 잡았다 - 시험 이름 · 까닭 · 걸린 시간 · 포트 · 옵션마다 시작 · 걸린 시간 · 같음/다름 ·
다른 점 · 목록 (크기 · 바뀐 시각) 을 파일로. 몸통이 시간 초과로 끊겨도 tearDown 에서 어디까지 갔는지 씀. 성공하면 쓰지 않음
- 확인: 혼자 돌려 통과 · 파일 0개
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- windows_cookie_shot_test: 시험 폴더의 가짜 cookies_youtube.txt 로 앱 안 브라우저 로그인 안내 · 넘길 사이트 칩 · [쿠키 파일 지우기] 를 찍고,
고르기를 [사용 안 함] 으로 바꾸면 파일이 지워지고 안내가 숨는지 확인 (설정은 메모리만)
- 정식 판 후보 코드 1b31609 로 6개 통과, 캡처 12장 release\test\shots_v20261020_001 (cookie_*)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- [앱 설정 전체] 둘째 줄: "다른 판에서 만든 설정도 지웁니다 (다른 판이 넣은 비밀번호는 [저장된 실제 비밀번호 · API 키] 를
함께 골라야 지워집니다)." (en · ja · zh 같은 뜻, 체크 이름은 각 언어의 실제 이름으로)
- 두 설명 첫 줄 끝에 마침표 (ko · en ".", ja · zh "。") - 창 안 설명 줄이 모두 마침표로 끝남. 체크 · 창 제목은 이름이라 그대로
- 캡처 shots_145 다시 (ko · en · ja × 412 · 960 의 6개 통과, ja 412 넘침 없음). l10n 빠진 것 0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 틈: _writeSecrets 가 머리글 (os. · dav. · ai. · sftp. · smb. · ftp.) 만 보고 지금 설정에 없는 열쇠를 지웠다. 새 판이 같은 머리글로
새 종류의 열쇠를 쓰면 예전 판으로 되돌려 저장할 때 사용자 비밀번호를 잃을 수 있었다 (40 의 비밀 값 쪽)
- SettingsStore.ownsSecret 을 정확한 꼴로: os.key · os.user · os.password · dav.servers ·
dav.pw.<id> · sftp.pw|key|kp.<id> · smb.pw.<id> · ftp.pw.<id> · ai.key.<id> ([_secretsOf] 가 만드는 것과 같음).
지우는 것은 이 꼴 중 그 서버 · 항목이 설정에서 없어지거나 비운 것만
- 초기화의 [저장된 실제 비밀번호 · API 키] (clearForeignSecrets) 는 그대로 sec. 밖을 모두 지움
- 시험 settings_store_test: 모르는 꼴 (dav.token.d1 · sftp.cert.s1 · nfs.pw.n1) 은 보통 저장 · 다시 켜 저장 뒤에도 남음,
서버 s1 을 지우면 s1 의 pw · key · kp 만 없어지고 s2 · 모르는 꼴 · sec. 은 그대로, clearForeignSecrets 는 3개 지우고 sec. 만 남김.
관련 9파일 81개 통과
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ① 시작 전에 -NewZip 안의 en.json 에 시작 메뉴 막기 (121dd43) 의 글이 있는지 본다. 없으면 (10.20_001 과 그 전 판) 아무것도
만들지 않고 멈춤 (exit 3) - 예전에는 머리 주석만 "먼저 판을 본다" 였고 코드에 없었다
- ② 시작 전에 사용자 바로 가기 (.lnk 사본) 와 HKCU\Software\Classes\jjmkvmaker (reg export) 를 시험 폴더 밖
%TEMP%\jj_updtest_backup_<표> 에 보관. 끝에 (시험 폴더를 지우기 전) 다르면 되돌리고 같은지 다시 보며 크게 알림 (실패로 셈).
같으면 보관본을 지우고, 되돌리지 못하면 남김 (그러면 jj_updtest_* 0개 검사도 실패)
- 머리 주석을 코드와 같게
- 확인 (10/21): 10.20_001 zip → 멈춤 (시험 폴더 · 보관본 없음). 2026.10.20_990 시험 빌드 zip → 16개 모두 통과, 바꾸지 않아
되돌리기 없음, 보관본 지움, jj_updtest_* 0개. 되돌리기 길 자체는 사용자 영역을 바꿔야 해서 일부러 돌리지 않음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 까닭 (3a): 사용자가 직접 "전체" 를 골랐고, 새 판으로 돌아갔을 때 예전 값이 되살아나면 더 헷갈린다.
모르는 키를 남기는 규칙 (40) 은 보통 저장 때만 - resetAllSettings 는 AppSettings()..extra = {} 로 (뜻을 드러냄)
- 안전 저장소: 이 판이 맡지 않는 열쇠 (os. · dav. · ai. · sftp. · smb. · ftp. · sec. 밖 = 다른 판이 쓴 것) 는
[저장된 실제 비밀번호 · API 키] 를 골랐을 때만 지움 (SettingsStore.clearForeignSecrets, clearStoredSecrets 끝에서). 마스터 · 최상 (sec.) 은 남김
- 초기화 창 설명에 한 줄씩: "다른 판에서 넣은 비밀번호 · 키도 지웁니다." · "다른 판에서 만든 설정도 지웁니다." (en · ja · zh, 새 줄로)
- 시험: master_lock_test - 모르는 키 · 다른 판 열쇠가 있는 설정 → 보통 저장은 남김 → 전체 초기화는 키 없음 · 열쇠는 남음 →
저장된 비밀번호 지우기는 열쇠도 지움 · sec. 남김. 초기화 창 캡처 다시 (ko · en · ja × 412 · 960, 넘침 없음)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- windows_reset_shot_test: 마스터 · 최상 비밀번호를 가짜 저장소 (MemorySecretStore) 에 정하고 askMaster 창에 최상 비밀번호를 넣어
초기화 창으로 (예전에는 showSuperReset 을 바로 불렀다). 체크 3개 · 처음 값 [마스터만] 을 확인하고 마스터 입력 창도 찍음 (0_master)
- [초기화] 는 끝까지 누르지 않음 (정말? 창에서 닫음) - 끝에 마스터 · 최상이 그대로인지 확인
- 결과 (after_1020 024d6e0 + 이것): ko · en · ja × 412 · 960 의 6개 모두 통과, 넘침 없음, 30장 (release\test\shots_145)
- 문구 = 실제로 지우는 것: "저장된 실제 비밀번호 · API 키" = clearStoredSecrets (WebDAV · SFTP 비밀번호 · 키 · 키 암호 · SMB · FTP ·
AI API 키 · OpenSubtitles 키 · 비밀번호, 아이디 · 서버 목록 남김), "앱 설정 전체" = AppSettings() 저장 (서버 목록과 그 비밀번호 -
저장할 때 지운 서버의 열쇠를 안전 저장소에서도 지움 - 파일 탐색기 즐겨찾기 포함, videos.json · bookmarks.json 은 따로라 그대로)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- %TEMP%\jj_updtest_<표> 에 예전 판 (기본 release\stage_v2026.10.18_001) 배포 폴더와 그 판이 남겼을 데이터
(settings.json · 이 판이 모르는 키 · WebDAV 가짜 서버 jj_updtest_dav · videos.json · DPAPI secrets.dat 의 가짜 비밀번호) 를 만든다
- 통합 시험이 앱 안 업데이트 길 (시험 길 JJ_UPDATE_LOCAL_ZIP) 로 최신 확인 → [지금 설치] (가짜 누르기) → 받기 · SHA256 · 풀기 →
설정 보관 → 교체 예약
- flutter test 는 끝날 때 시험 앱이 띄운 교체 스크립트까지 끝낸다 (기록 없음 · 도는 것 0 으로 확인 - 사용자 판은 앱이 스스로 끝나
그런 일이 없음) - 그래서 앱이 써 둔 교체 스크립트를 앱이 넘긴 것과 같은 인수 · 환경으로 바깥에서 띄움
- 확인: 프로그램 교체 · 새 판이 저절로 켜짐 (따로 데이터라 시작 메뉴를 건드리지 않음) · lastRunVersion · 모르는 키 · WebDAV 서버 ·
동영상 목록 · 비밀번호 (안전 저장소) · 평문 비밀번호 없음 (설정 · .bak · 보관본 · 기록) · 예전 판 보관본 · 사용자 바로 가기 그대로 ·
시험 폴더 · 가짜 자격 증명 0개
- 결과 (10/21, 2026.10.18_001 → 2026.10.20_990 시험 빌드 = after_1020 5057267): 모두 통과
- 실제 GitHub · 사용자 %APPDATA% · 시작 메뉴 · 실행 중인 앱은 건드리지 않음. 환경 변수가 없으면 통합 시험은 건너뜀
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- JJ_UPDATE_LOCAL_ZIP=<zip 경로>;<sha256> - 시험용 데이터 폴더 (JJ_MKVMAKER_DATA) 로 켰을 때만 받음 (사용자 판에서는 무시)
- 최신 확인 · 버전 목록 · 받기가 그 zip 을 씀 (GitHub 를 부르지 않음). 판은 zip 이름 (JJ_MKVMaker_v<판>_win64.zip) 에서.
그 뒤 SHA256 검사 · 풀기 · 교체 스크립트 · 다시 켜기는 정식 길 그대로
- 화면: 이름 "[시험 길] v<판>", 바뀐 내용 첫 줄에 시험 길 설명과 zip 경로 (en · ja · zh)
- 거절: sha256 이 없거나 꼴이 틀림 · zip 과 다름 · 시험 길이 아닌데 file: 주소
- 시험: update_test (따로 데이터 없음 = 무시, sha256 없음 · 틀림 거절, 닿지 않는 apiBase 로 확인 · 목록 · 받기, 원래 zip 그대로)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 원인: 앱은 켤 때마다 StartMenu.ensure() (설정을 끄면 remove()) 로 사용자 시작 메뉴의 JJ_MKVMaker.lnk 와
HKCU\Software\Classes\jjmkvmaker 를 지금 실행 파일로 바꾼다. JJ_MKVMAKER_DATA (시험판 · 시험의 따로 데이터) 로 켜도 그랬다
- 시험 폴더의 판을 켜면 사용자 바로 가기 · 알림 누르기가 그 판을 가리키고, 시험 폴더를 지우면 깨졌다 (10.18_001 도 같음)
- "따로 데이터" 는 코드에서 JJ_MKVMAKER_DATA 하나뿐 (시험판 표시 파일 없음) - 그때 StartMenu 가 사용자 영역을 건드리는
ensure (바로 가기 · 주소 연결) · remove 를 막음. 시험이 따로 준 바로 가기 파일만 쓰는 부름은 그대로.
켤 때 작업 기록에 한 줄, 환경 설정의 [시작 메뉴에 등록] 아래 글도 그 사실로 (en · ja · zh)
- 사용자 판 (JJ_MKVMAKER_DATA 없음) 동작은 그대로
- 시험: 명령 실행을 가짜로 바꿔 (StartMenu.run) 막힌 동안 아무것도 부르지 않음 · 바로 가기 파일도 시험 폴더로
(shortcutPathOverride - 시험이 잘못돼도 사용자 것을 지우지 않게). 시험 전후 사용자 바로 가기 · 주소 연결이 그대로인지 확인함
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>