# STATUS — 현재 상태 한 장 > 최신이 맨 위(시간 역순, 같은 날 여러 건이면 "N차"로 스택). 상세는 [journal/](journal/), 여기는 요약만. ## 2026-08-21 2차 — 승인 가능성 재검토: **막을 요소 없음** - 모더레이션 기준 문서 + validator 규칙 76건(CPMR0001~0076)과 제출물을 대조([20 §7-9](20-packaging.md)). - ✅ **1차 수정이 문서화된 규칙 위반이었음을 확인** — chocolatey 문서가 *"PowerShell scripts need to be saved in **UTF-8 with BOM**"*을 명시한다. 제거 실패도 모더레이터 확인 항목(*"Does the package uninstall correctly? (this means the **package**, not the underlying software)"*)에 그대로 있다. - ✅ **이름 구조는 문제 없음** — 기준은 *"flag on '.' in name (unless `.portable`/`.install`)"*뿐. 바깥 id를 메타 패키지로 만들라는 요구는 없다(신규 패키지는 이름이 어긋나면 즉시 거부 대상이라 확인했다). - ✅ 다운로드 출처 검증 가능(`sosomlab.com` → `/apps/nexa-memkeeper` → GitHub Releases 0.7.0 링크 실재) · iconUrl jsDelivr/PNG/본인 저장소 · 유료 라이선스 명시 · owners=authors는 "관리자=제작자" 예외에 해당. - 🟡 새로 고침: 설치형 nuspec의 **`portable` 태그 제거**(사실과 다르고 "tags 남용" 항목에 걸릴 여지). - 🟡 남긴 것: `license` 태그(Guideline — 승인 저지 아님) · VirusTotal 1~5건(chocolatey-ops가 *"not enough detections to prevent the approval"* 명시, 무서명 오탐). - **결론: 자동 검사로 잡히는 문제 0. 사람 검토에서 걸릴 만했던 2건을 제거했다.** 재제출 시 큐 재진입, 자동 단계는 08-11 실측 약 4시간. - 상세 → [journal/2026-08-21](journal/2026-08-21.md) ## 직전(2026-08-21 1차) — 저장소 최신화 · 심사 재점검에서 **제거 스크립트 버그** 발견 - **저장소는 최신** — 원격·로컬 동일(f515496), 08-11 이후 새 커밋 0건. - **winget 2건 변화 없음**(`Validation-Completed`, 조치 라벨 없음). 앞선 미처리 PR **234건** — 08-19 대량 병합은 대부분 상시 기여자 건이고, **우리 번호 옆 #413828·#413831도 그때 병합**됐다. 최초 기여자는 사람 검토를 따로 받는다. **할 일 없음.** - **choco 2건은 배지 `Ready`** = 자동 검증·테스트·스캔 전부 통과, 사람 모더레이션 대기. 08-11 이메일 지적은 해소 확인. - 🔴 **그런데 검증 로그에 진짜 버그가 있었다** — `chocolateyuninstall.ps1`의 `"$packageName: …"`을 PS 5.1이 스코프 한정 변수로 읽어 **파싱 실패** → **`choco uninstall nexa-memkeeper`가 항상 exit -1**. 설치형만 해당(포터블은 제거 스크립트가 없어 통과). - 조치: `${packageName}:`으로 수정 · 패키징 `.ps1` 4개 **UTF-8 BOM** 통일(5.1이 ANSI로 읽어 한글이 깨졌다) · 워크플로에 `-Encoding utf8BOM` · **CI에 구문·BOM 게이트 추가**. PS 5.1로 세 분기 모두 exit 0 확인. - **남은 판단** = choco **동일 버전 재제출** 여부([20 §7-6](20-packaging.md)) — push는 사용자 지시 대기. - 상세 → [journal/2026-08-21](journal/2026-08-21.md) ## 직전(2026-08-11 2차) — winget 재확인 · 빨간 `✗ 1/19`의 정체 - **winget 2건 변화 없음** — 자동 검증 완료(`Validation-Completed`), 리뷰어 미배정, 수정 요청 라벨 없음. **할 일 없음.** - PR 목록의 **빨간 `✗ 1/19`은 우리 문제가 아니다** — 19개 중 실행되어 실패한 체크는 **0개**(SUCCESS 1·SKIPPED 15·CANCELLED 3). 취소된 셋은 winget-pkgs **자체 봇 워크플로**의 후속 job(스텝 0개 실행). - 근거: 08-10 **병합된** 남의 PR에도 같은 CANCELLED 11건 · 초록으로 보이던 #413830도 롤업은 똑같이 `FAILURE`. → **판단 기준은 아이콘이 아니라 라벨**([20 §7-7](20-packaging.md)). - 지연 이유 = **큐 순번**(우리보다 앞선 미처리 `New-Package` 238건). 큐는 살아 있다(08-10 병합분은 07-14~08-05 제출). - 상세 → [journal/2026-08-11](journal/2026-08-11.md) ## 직전(2026-08-11 1차) — 심사 2차 점검 · Chocolatey 지적 대응 - 🔴 **Chocolatey 2건은 "유지관리자 조치 대기"**였다 — nuspec 설명의 **이메일 주소**가 필수 항목(Requirement) 위반. 08-07 17:37에 이미 실패해 있었는데 08-08 점검(피드 조회)으로는 보이지 않았다. - 조치: 설명의 상업 라이선스 문의처를 **LICENSE.md 링크로 교체**(연락처는 라이선스 문서에 그대로) → `choco pack` 2건 성공 · nupkg 내 이메일 **0건** 확인. - **`choco-resubmit.yml` 추가** — 태그 없이 **같은 버전**을 다시 올린다(규정상 새 버전 금지). 릴리스 자산을 다시 받아 해시를 계산한다. - ✅ **재제출 완료**([run](https://github.com/SosomLab/nexa-memkeeper/actions/runs/31462904180)) — 2패키지 모두 push 성공, 페이지 상태 **`Waiting for Maintainer` → `Pending automated review`** 확인. - **winget PR 2건은 검증 통과 · 사람 승인 대기**(`Validation-Completed`) — 할 일 없음. - 다음 = 양쪽 채널 심사 결과 대기. 지적이 또 오면 같은 워크플로를 다시 돌린다. - 상세 → [journal/2026-08-11](journal/2026-08-11.md) ## 직전(2026-08-08 12차) — 패키지 심사 상태(첫 점검) - **winget PR 2건 자동 검증 통과**(`checks=SUCCESS`) — 이제 **사람 승인** 대기. 라벨 미배정. - **Chocolatey 2건은 공개 피드에 아직 없음** = 심사 진행 중(거부 시 이메일로 사유). - 지적이 오기 전까지 할 일 없음 — 오면 매니페스트 수정 후 재제출. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 11차) — winget PR 2건 제출 완료 - **[#413829](https://github.com/microsoft/winget-pkgs/pull/413829)(설치형) · [#413830](https://github.com/microsoft/winget-pkgs/pull/413830)(포터블)** — 매니페스트 검증 통과 후 PR 생성. - 막혔던 원인은 공용 포크 동기화 권한(`workflow` 스코프) — 토큰 갱신으로 해소(같은 계정을 쓰는 nexa-dir2도 함께 풀림). - **두 채널 모두 심사 대기**: Chocolatey 2패키지(9차) · winget 2패키지(11차). - 다음 버전부터는 릴리스 워크플로가 winget 갱신 PR을 자동으로 연다. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 10차) — winget 등록 시도(토큰 스코프에서 막힘) - 첫 등록용 `winget submit` 워크플로 추가 — **매니페스트 검증은 통과**했다(설치형·포터블 2건). - 🔴 **PR 생성 실패**: `WINGET_TOKEN`에 **`workflow` 스코프**가 없어 `winget-pkgs` 포크를 upstream과 동기화하지 못한다. - 조치: PAT를 `repo`+`workflow`로 재발급 → 시크릿 갱신 → `winget submit` 재실행(코드 수정 불필요). - Chocolatey는 9차에서 이미 등록 완료(심사 대기). - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 9차) — Chocolatey 등록 - **`nexa-memkeeper`(설치형) · `nexa-memkeeper.portable`(포터블) 0.7.0 push 완료** → 자동 검사·모더레이션 대기([큐](https://ch0.co/moderation)). - 게시 스위치 `CHOCO_PUSH=true`를 켰다 — **이후 태그부터는 새 버전이 자동으로 올라간다**(태그 전 확인이 더 중요해짐). - winget은 최초 PR 2건이 남아 있다(M5-5b) — 그 뒤 `WINGET_PUBLISH`를 켜면 자동. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 8차) — `0.7.0` 배포 - **[0.7.0 릴리스](https://github.com/SosomLab/nexa-memkeeper/releases/tag/0.7.0)** — 08-08 기능 7건 묶음(E-1~E-3 · M3-4 · X-1~X-3). - 자산 4종(설치본 exe·설치본 ZIP·포터블 ZIP·SHA256SUMS)을 워크플로가 자동 첨부. - 패키지 매니저 자동 게시는 계속 **꺼짐**(변수 미설정). - 실측: exe 0.64MB · 유휴 RSS 1.34MB · 테스트 **57 green** · 외부 DLL 0. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 7차) — X-3: 정리 히스토리 - 정리할 때마다 `history.csv`에 **시각·계기·회수 MB·Active 감소분·부분성공**을 남긴다(최근 200줄). - 계기를 구분해 기록한다: `manual`·`hotkey`·`threshold`·`interval`·`lowmem` — 없으면 나중에 해석할 수 없다. - 메인 화면 [메모리] > [정리 기록]에서 연다(기록이 없으면 안내). - 검증: 임계 50%로 유도한 자동 정리가 `threshold,838,5076,false`로 기록됨. 테스트 **57 green**. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 6차) — X-1: 워치리스트 표적 트림 - `[watch] entries = chrome.exe:1500` 형식으로 **지정 프로세스만** 임계 초과 시 트림. 전역 정리의 비용 없이 비대화된 앱만 겨냥한다. - 꺼져 있으면 **열거조차 하지 않는다**(유휴 비용 0). 켜면 가벼운 열거(시스템 콜 1회) + 프로세스별 쿨다운 + 보호 목록 준수. - 검증: `code.exe:300`으로 첫 주기에 표적 포착 → 다음 주기에 임계 아래(트림 성공). 테스트 **57 green**. - UI는 미구현(파일 설정) — 목록 편집 UI는 후속. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 5차) — X-2: 전체화면 억제 - **게임·발표가 전체화면이면 자동 정리를 보류**한다(`suppress_fullscreen`, 기본 on). 수동 정리·핫키는 그대로. - 판단 기준은 Windows가 알림을 미룰지 정할 때 쓰는 `SHQueryUserNotificationState` — 알림을 미룰 상황이면 정리도 미룬다. - 팝업 뒤 유휴 RSS가 11MB로 남는 것처럼 보였으나 **측정 오류**였다(팝업이 실제로는 열린 상태). 닫으면 **11.2 → 2.7MB** 복귀 확인. - 실측: 테스트 **56 green** · 유휴 RSS 1.34MB. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 4차) — E-3: 고압력 구간 재측정 - **압력을 걸어도 결론 동일** — 앱 기동 341 → 365ms(+7.0%), 읽기 40.3 → 46.1ms(+14.4%). 정리한 쪽이 항상 느리거나 같았다. - 회수 자체는 압력 구간에서도 컸다(`active −5.8GB`) — **걷히지만 속도로 이어지지 않는다**. - 첫 측정은 **압력이 1~2분 만에 풀려 폐기**(점유 프로세스가 첫 바이트만 만짐) → 접촉 루프를 C#으로 고쳐 재측정. - 한계: 수백 MB 스래싱은 미검증, 인공 점유가 [정리] 조건에 불리하게 작용할 여지([21 §11-2](21-effectiveness-measurement.md)). - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 3차) — M3-4: 열 폭 조절 · 창 위치 기억 - 헤더 경계를 끌어 **열 폭 조절**(커서 변경, 놓을 때 저장) · **창 위치·크기**와 **보기 모드**를 기억한다. - 복원 전에 **그 자리에 모니터가 있는지 확인** — 외부 모니터를 뽑았을 때 창이 화면 밖으로 사라지지 않게. - 설정 키 추가: `[ui] win_x/win_y/win_w/win_h`, `col_w`([09](09-settings-schema.md)). - 검증: 창 123,77 900×500 저장→복원 확인 · 열 폭 95→135 저장 확인 · 테스트 55 green · 유휴 RSS 1.33MB. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 2차) — E-2: 주기 정리 비권장 근거 표시 - 설정 창 `주기 정리` 아래에 **"권장하지 않음 — 앱이 14초 안에 되찾아갑니다."** 한 줄. 옵션은 유지(이유를 알고 고르게). - 창 628 → 650(설명 한 줄 추가). 좌표 조회로 겹침 0 · 최하단 626 확인. - 문구가 폭을 넘겨 잘리던 것 2건(신규 + 기존 정리 영역 안내)을 **스크린샷 확인 후** 짧게 정정. - 남은 후속 = E-3(고압력 재측정). - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-08 1차) — E-1: 알림에 Active 감소분 병기 - 알림이 **두 숫자를 함께** 보여 준다 — `935MB reclaimed · apps released 5519MB`(이번 실행 실측). - 기존 표기(Avail 차)는 트림이 Modified로 밀어낸 몫을 놓쳐 **실제의 1/5도 설명하지 못했다**([21 §2-1](21-effectiveness-measurement.md)). - 워커가 `Active = Total − Avail − Modified`를 전후로 재고, 종료 코드에 15비트씩 두 값을 싣는다. - Active 감소분이 표시값과 비슷하면 병기하지 않는다(숫자 나열 방지). 측정 실패 시에도 병기 생략. - 실측: 테스트 **55 green** · 유휴 RSS 1.35MB. 남은 후속 = E-2·E-3. - 상세 → [journal/2026-08-08](journal/2026-08-08.md) ## 직전(2026-08-07 27차) — 메모리 정리 효용성 실측 ([21](21-effectiveness-measurement.md)) - **결론: 평상시 주기적 정리는 성능에 도움이 되지 않는다.** 실험 5종·통제 측정으로 확인. - 정리 효과는 진짜(**Active −3,870MB**)지만 **반감기 14초**, 273초에 **96% 원위치** — 걷어낸 페이지를 프로세스가 곧바로 되찾아간다(VS Code 667 → 40 → **717MB**). - 주기 정리(60초): Available +688MB를 얻는 대신 앱 기동 **+4.3%**, 파일 읽기 **+12.6%** 악화. 개선된 성능 지표는 **하나도 없음**. 압력 하 선제 정리도 무의미(4GB 할당 차이 1.2% < 편차 1/12). - **"회수 MB" 표시는 실제의 1/5에 못 미친다** — 같은 정리에서 표시 +679MB vs Active −3,870MB. - **③ 기본 off가 실측으로 정당화**됨(같은 코퍼스 읽기 60.5 → 265.4ms, **4.4배** 악화). - **바꿀 기본값 없음** — `interval_ms` 0·영역 ③④⑤ off·임계 90%가 이미 이 결론과 일치. 후속 3건만 TODO(E-1 알림에 Active 감소분 병기, E-2 비권장 근거 문구, E-3 고압력 구간 재측정). - 재현 스크립트 `scripts/measure/` + 원시 CSV `results/`. 상주 셸 재기동 확인(유휴 1.34MB). - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 26차) — `0.6.2` 재배포 · winget 포터블 패키지 - **[0.6.2 릴리스](https://github.com/SosomLab/nexa-memkeeper/releases/tag/0.6.2)** — 자산 4종을 워크플로가 자동 첨부(0.6.1에서 설치본 ZIP이 목록 누락으로 빠졌던 것 수정). - **winget 2패키지 체계** — `SosomLab.NexaMemKeeper`(설치형·machine) / `SosomLab.NexaMemKeeper.Portable`(zip+portable·user, `nexamemkeeper` 별칭). choco와 동일 구도. - 게시는 계속 **꺼짐**(변수 미설정) — 켜면 두 패키지에 각각 PR이 만들어진다. - 릴리스 이력: | 태그 | 무엇 | 자산 | | --- | --- | --- | | `0.6.0` | 첫 공개 릴리스(M5) | 4종(설치본 ZIP은 수동 업로드) | | `0.6.1` | 포장 파이프라인 검증 | 3종 — **설치본 ZIP 첨부 누락**(워크플로 목록 빠짐) | | **`0.6.2`** | 누락 정정 + winget 포터블 패키지 | **4종 전부 자동 첨부** | - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 25차) — `0.6.1` 재배포 - **[0.6.1 릴리스](https://github.com/SosomLab/nexa-memkeeper/releases/tag/0.6.1)** — 포장 파이프라인 검증 목적. ⚠️ **결과는 자산 3종**이었다: `pack.ps1`은 설치본 ZIP을 만들었으나 워크플로 첨부 목록에 그 줄이 빠져 있었다(26차에서 정정 → `0.6.2`). - 앱 동작 변경 없음 — 포장 파이프라인 검증이 목적. - 패키지 매니저 자동 게시는 계속 **꺼짐**(변수 미설정). - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 24차) — 배포 완료 · Wiki 공개 - **[0.6.0 릴리스](https://github.com/SosomLab/nexa-memkeeper/releases/tag/0.6.0)** — 자산 4종(설치본 exe·설치본 ZIP·포터블 ZIP·SHA256SUMS). - **[Wiki](https://github.com/SosomLab/nexa-memkeeper/wiki) 7쪽 공개** — 기능·정리 영역·설정·설치·구조·문제 해결 + 스크린샷 4종. - 스크린샷은 [scripts/capture-shots.ps1](../scripts/capture-shots.ps1)로 재현 가능(UI 변경 시 재촬영). - 패키지 매니저 자동 게시는 여전히 **꺼짐**(변수 미설정) — 등록 절차는 [20 §7-4](20-packaging.md). - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 23차) — `0.6.0` 릴리스 - **버전 `0.6.0` 승격** — 태그 push로 GitHub Actions가 설치본·포터블 ZIP·`SHA256SUMS.txt`를 Release에 첨부. - 게시 스위치 확인: 시크릿 2종 등록됨, **변수 `CHOCO_PUSH`·`WINGET_PUBLISH`는 미설정 → 자동 게시 없음**(지시대로). - 언어 전역 상태로 **간헐 실패하던 i18n 테스트**를 공용 락으로 직렬화(5회 연속 green). - 실측: exe **0.64MB** · ZIP **356KB** · 외부 DLL **0** · 테스트 **55 green** · 유휴 RSS 1.30MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 22차) — CI/CD · 패키지 매니저 등록 자산 - **GitHub Actions 2종**: `ci.yml`(push·PR — fmt·clippy·test·예산 게이트), `release.yml`(태그 push — 포장 → Release 첨부). - **winget·Chocolatey 자산 완비**(choco 2패키지 + winget 매니페스트 3종). 바이너리 미동봉, Release 자산을 URL+SHA256으로 참조. - 🔴 **자동 게시는 꺼져 있다** — 저장소 변수 `CHOCO_PUSH`·`WINGET_PUBLISH`가 `true`일 때만 게시(사용자 지시 08-07). - **DLL 게이트가 실제로 동작하게 됐다**(그동안 dumpbin 미탐지로 건너뜀) — 외부 DLL **0** 확인. - 실측: exe 0.64MB · ZIP 356KB · 테스트 55 green · 유휴 RSS 1.30MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 21차) — M5-1 영역 ⑥ · 저메모리 이벤트 - **단계: M0~M4 + M5-1·M5-2 완료.** M5 잔여 = 설치본 실검증(M5-3, Inno 설치 필요). - **정리 영역 ⑥(페이지 결합)** 구현 — 일반 권한에서도 성공(실측 349MB 결합 · Available **+365MB**). ADR의 권한 표기 정정. - **저메모리 이벤트 트리거**(`auto.low_memory_event`, 기본 on) — OS가 부족을 알리면 임계값 미만이어도 정리(쿨다운은 유지). - 설정 창에 체크박스 1줄 추가(창 628px) — 컨트롤 좌표 조회로 겹침 0 확인. - 실측: 테스트 **55 green** · exe 0.64MB · 유휴 RSS 1.30MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 20차) — M5-2 배포 2채널 구현 - **단계: M0~M4 완료 + M5-2(배포 2채널) 구현 완료.** 남은 M5 = 영역 ⑥·저메모리 이벤트(M5-1), 설치본 실검증(M5-3). - `pwsh packaging\pack.ps1` 하나로 **릴리스 빌드 → 예산 게이트 → 포터블 ZIP → 설치본**까지. 절차 SSOT = [20 배포](20-packaging.md). - 설치형은 **사용자별 설치**(승격 없음) + 자동 실행 질문 **기본 체크**, 설정은 포터블과 같은 `data\settings.ini`. - 실측: exe **0.64MB** · 포터블 ZIP **355KB** · 테스트 54 green · 유휴 RSS 1.30MB. - ⚠️ 이 PC에 Inno Setup 6이 없어 **setup.exe 실생성은 미검증** — 설치하면 같은 명령으로 만들어진다. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 19차) — 검색 지우기 일원화 - 메뉴·지우기 단추·Esc가 **모두 같은 경로**(`clear_search`)로 검색칸을 비운다 — 목록만 돌아오고 글자가 남던 문제 해결. - 검색 입력 상태의 단일 원천 = 하단 검색칸(옛 `set_filter` 제거). - 실측: 테스트 **54 green** · exe 0.64MB · 유휴 RSS 1.30MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 18차) — 검색 지우기 단추 손보기 - 지우기(✕)가 **눌린다** — 표준 BUTTON을 직접 그리는 창으로 바꿔 겹침(z-순서) 문제를 없앴다. - 모양도 검색칸에 맞게: 평소엔 글리프만, **호버·누름일 때만 둥근 회색 배경**(MDL2 ChromeClose). - 실측: 테스트 **54 green** · exe 0.64MB · 유휴 RSS 1.34MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 17차) — 묶음 접기 수정 · 검색 중 임시 펼침 - **접기/펼치기가 사용자 조작대로 유지된다** — 기본 펼침(자식 1개 묶음)은 묶음이 처음 나타날 때 한 번만 심는다. - 검색 중에는 접힌 묶음도 펼쳐 그려 일치 항목이 가려지지 않는다(검색을 지우면 접힘 복원). - 실기 재기동은 반드시 `NexaMemKeeper.exe` — 낡은 `mk-app.exe`를 띄우면 옛 코드가 뜬다([18 §3-1](18-build-and-test.md)). - 실측: 테스트 **54 green** · 유휴 RSS 1.32MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 16차) — 친숙한 이름 · 앱 도우미 프로세스 · 창 제목 검색 - **단계: M0~M4 완료 — 실기 QA 후 `0.5.0` 승격, 다음은 M5(배포 2채널).** - 목록이 작업 관리자와 같은 이름(`Sublime Text`)·같은 묶음(`터미널(3)` = 앱 + 도우미 프로세스)으로 보인다. - **셸(`explorer.exe`)의 자식은 앱 하위로 넣지 않는다** — 시작프로그램이 탐색기 밑으로 들어가는 문제(DR-15). - 검색이 **창 제목**까지 찾고 앱→창 구조를 유지한다(`2026` → 앱 행 + 해당 창 행). - 실측: 테스트 **54 green** · 유휴 RSS ~1.3MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 15차) — 작업 관리자식 목록 · 알림 자동 닫힘 - **단계: M0~M4 완료 — 실기 QA 후 `0.5.0` 승격, 다음은 M5(배포 2채널).** - **목록 기본 보기 = 작업 관리자와 같은 기준**(DR-14): 앱 / 백그라운드 프로세스 / Windows 프로세스 3구획 + 같은 프로그램 묶음(`Code.exe (25)`), 앱 행에는 창 제목. 보기 메뉴에서 프로세스 트리·평면 목록으로 전환. - **알림**: 6초 뒤 자동으로 사라짐(Windows가 `uTimeout`을 무시하므로 직접 배너 제거). - 실측: 테스트 **51 green** · exe 0.56MB · 유휴 RSS ~2.2MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 14차) — 트리 기본 보기 · 쓰레드 옵션 · 종료 UI 멈춤 수정 - **단계: M0~M4 완료 — 실기 QA 후 `0.5.0` 승격, 다음은 M5(배포 2채널).** - **보기**: 기본 = **프로세스 트리**(부모-자식, 자식 있는 노드는 자동 펼침) · 평면 목록은 보기 메뉴 옵션 · **쓰레드 표시**는 옵션(기본 off). - **안정성**: 프로세스(트리) 종료를 백그라운드 스레드로 옮겨 "응답 없음" 해소(24차). - 실측: 테스트 **51 green** · exe 0.55MB · 유휴 RSS 2.22MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 13차) — 하단 검색창 · 문서 최신화 - **단계: M0~M4 완료 — 실기 QA 후 `0.5.0` 승격, 다음은 M5(배포 2채널).** - **검색**: 목록 하단 입력 칸에서 **실시간 검색**(이름 + **PID**), 값이 있으면 우측 **✕ 지우기** 버튼, 안내 문구는 언어별. Esc로도 비운다. - 실측(재측정): exe **0.55MB** ≤3 · 유휴 RSS **2.22MB** ≤5 · CPU 0.031s/60s · 임포트 OS 인박스만 · 테스트 **50 green**. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 12차) — 핫키·헤더 수정·다국어(기본 영어) - **단계: M0~M4 완료(핫키 포함) — 실기 QA 후 `0.5.0` 승격, 다음은 M5(배포 2채널).** - **다국어(DR-13)**: 기본 **영어**, 설정에서 `ko`·`auto` 선택(재시작 후 적용). 코드는 영어 원문 + 한국어 표(번역 누락 시 영어 폴백). - **전역 핫키(M4-2)**: 설정 창에서 조합을 직접 눌러 지정 → 어디서나 '지금 정리'. 충돌 시 알림. - **헤더 렌더 수정**: 제목 폭 실측·화살표 분리·좁은 창에서 열 비례 축소(470px에서 5개 열 모두 표시 확인). - QA 수정(22차): 메뉴 토글(의사 프로세스 숨김·보기 전환·갱신 주기·자동 실행) 시 목록 창이 즉시 종료되던 버그 — `RefCell` 이중 대여 패닉. 트레이는 별도 프로세스라 무사(DR-7 격리 확인). - 실측: 테스트 **49 green** · exe 0.53MB · 상주 RSS ~1.3MB. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 11차) — M4 설정 완료 - **단계: M0~M4 구현 완료 — 실기 QA 후 `0.5.0` 승격, 다음은 M4-2(핫키)·M5(배포).** - **설정**: 트레이 우클릭 → [설정…] 창(자동 정리·정리 영역·일반, [기본값] 포함). 저장 시 `data\settings.ini`(폴백 `%LOCALAPPDATA%`)에 쓰고 상주 셸이 **즉시 반영**. - **자동 정리 동작**: 사용률 ≥ 임계값(기본 90%)이고 쿨다운(기본 5분) 경과 시 자동 실행 + 주기 정리 옵션. - **정리 영역 ③④⑤ 구현**(⑥은 M5). 설정에서 끈 영역은 실행하지 않음 — 실측 확인(①만 켜면 트림만 461건, ②③만 켜면 퍼지만). - 앱 매니페스트 추가(공용 컨트롤 v6·asInvoker). DPI 인식은 레이아웃 비례화(M3-4) 후로 보류. - **시간 단위 ms 통일**(18차): `poll_ms`·`cooldown_ms`·`interval_ms`·`list_refresh_ms` — 구 키(초·분)는 읽어서 자동 환산 후 새 키로 저장(1회 마이그레이션, 실기 확인). - QA 반영(19차): 설정 창 라벨이 2줄로 접히던 문제 — 라벨/입력 규격 통일(218/232/96), 실제 텍스트 폭 실측으로 확인(최대 173px < 218px). - 실측: exe **0.51MB** ≤3 · 상주 RSS **1.32MB** ≤5 · 테스트 **38 green**. - **다음**: M4-2(전역 핫키) → M5(배포 2채널 — 설치형 Inno + 포터블 ZIP). 실기 QA 통과 시 `0.5.0` 승격. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 10차) — 목록 탐색성 회복 · 앱 아이콘 - **단계: M0~M3 + 사용자 요청 반영 — 실기 QA 후 `0.4.0` 승격, 다음은 M4(설정).** - **회귀 해결**: 트리 기본 보기에서 `explorer.exe` 등 부모가 접히면 자식(예: NexaMarkdownViewer)이 보이지 않던 문제 → **기본 평면 목록** + 보기 메뉴(평면/트리·모두 펼치기/접기) + **타이핑 즉시 검색**(Esc 지움). - **앱 아이콘 신규**: nexa-dir2 계열(둥근 사각·파랑 외곽·남색 바디) + 80% 게이지·RAM 모듈·회수 화살표. `scripts/make-icon.ps1`로 재현 생성, exe 임베드(0.47MB). - 실측: exe 0.47MB ≤3 · 상주 RSS 1.31MB ≤5 · 테스트 26 green. - 문서 정합성 점검 완료(16차) — README·CLAUDE·MILESTONES·TODO·05·09 불일치 6건 정정. - **다음**: M4 설정(`settings.ini` 저장/로드·설정 창·임계값 자동 정리·핫키) — 브랜치 먼저 생성 후 착수. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 9차) — 권한 실측·의사 프로세스 숨김 - **단계: M0~M3 완료 + 사용자 요청 반영 — 실기 QA 후 `0.4.0` 승격, 다음은 M4(설정).** - **권한**: 관리자 필수 아님 — 일반 권한 +322MB(트림 115개) vs 관리자 +847MB(466개, 스탠바이 퍼지 성공). 표·근거 [07 §4](07-adr-0002-memory-reclaim.md). - **자동 시작**: `HKCU\…\Run`은 정책상 **일반 권한 시작**. 승격 자동 시작은 작업 스케줄러 방식 필요(미구현 — [07 §4-1](07-adr-0002-memory-reclaim.md)). - **의사 프로세스 숨김**(사용자 확정): 기본 on. 설정 메뉴에서 토글, Top 5 팝업도 동일 적용. - 절차 정정: 재기동은 **중지 → 빌드 → 실행**([18 §3-1](18-build-and-test.md) — 실행 중 exe 잠금으로 빌드 실패 경험). - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 8차) — 메인 화면(M3) 완성 - **단계: M0~M3 구현 완료 — 실기 QA 후 `0.4.0` 승격, 다음은 M4(설정 창·자동 정리).** - **메인 화면**(트레이 좌클릭 팝업 [목록 보기] 또는 우클릭 메뉴): 메뉴바 4개 · 프로세스 **트리 그리드**(▸ 클릭으로 자식·쓰레드 전개) · **헤더 클릭 정렬** · 2초 갱신(1/2/5초 선택) · **프로세스/트리/쓰레드 종료** · 자동 실행 토글(DR-11). - 팝업은 [지금 정리]·[목록 보기] 2개 버튼으로 정리(설정은 트레이 우클릭 전용). - 알림·작업 관리자 표기를 `Nexa MemKeeper`로 수정(DR-12 — 버전 리소스 + exe 파일명). - **실측**: exe 0.41MB · 상주 셸 유휴 **1.71MB** · 열거 500 프로세스 7.5ms · 목록 창은 워커라 닫으면 전량 회수. - 문의 대응: "Memory Compression이 왜 1위인가 / 작업 관리자와 왜 다른가" → [19 §4-5](19-memory-measurement-and-reclaim.md)에 근거 정리(버그 아님 — 정렬 지표·의사 프로세스 숨김 차이). - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 7차) — M2 Top 5 팝업 완료 - **단계: M0·M1·M2 구현 완료 — 실기 QA 후 `0.3.0` 승격, 다음은 M3(프로세스 트리 뷰).** - 동작: 트레이 **좌클릭 → Top 5 팝업**(사용률 요약+바, 이름·PID·프라이빗 워킹셋, **2000ms 자동 갱신**), 항목 우클릭 → 메모리 회수/프로세스 종료(확인 후, 워커 위임), [지금 정리] 버튼. 보호 프로세스는 메뉴 차단. - **실측**: 열거 **482 프로세스 6.5ms**(NFR-4 100ms 대비 여유) · exe **0.36MB** · 유휴 RSS **2.23MB** → 팝업 열림 6.94MB → **닫은 후 0.74MB**(NFR-3 복귀 확인). - 규약 정정: [15 §4](15-dev-methodology.md) — 읽기 전용 NT 조회는 셸 허용(ADR-0003과 정합), 버퍼 경계 검사 의무화. - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 6차) — M1 정리 엔진 v1 완료 · 원격 push - **단계: M0·M1 구현 완료 — 사용자 실기 QA 후 `0.2.0` 승격, 다음은 M2(Top 5 팝업).** - 원격 반영: `origin/main` 최초 push 완료(커밋 10건, 태그 없음). - 동작: 트레이 "지금 정리" → 워커 프로세스가 **전 프로세스 워킹셋 트림 + 우선순위 0 스탠바이 퍼지** → 풍선 알림(회수 MB)·툴팁에 마지막 정리 기록. 비승격 시 "관리자 권한으로 재시작" 메뉴 노출. - **실측**: 트림 461건·퍼지 성공(NTSTATUS 0)·**1회차 +209MB / 2회차 +44MB**. 예산 유지(exe 0.34MB·유휴 RSS 2.20MB·CPU ~0.1%). - 문서: [19 해설서](19-memory-measurement-and-reclaim.md) 작성(측정·선정·회수 원리) · Top 5/트리 뷰 **자동 갱신 2000ms 설정화**([09 §6](09-settings-schema.md) `list_refresh_ms`) · 기능 후보 X-1~X-7([05 §5](05-requirements.md), 판단 대기). - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 5차) — M0-1 트레이 상주 셸 완료(게이트 전 항목 통과) - **단계: M0 구현 완료 — 사용자 실기 QA·24h 상주 확인 후 `0.1.0` 승격(M0-2).** - 트레이 상주 셸 동작: 사용률 % 아이콘(색 단계 80/90)·툴팁·우클릭 종료 메뉴·5초 폴링·자기 트림·explorer 재시작 복구. - **실측(DR-8)**: exe **0.23MB** ≤3 · 유휴 RSS **1.56MB** ≤5 · 임포트 **OS 인박스 7종만** · 유휴 CPU **~0.03%** — 전 게이트 통과. (과정: RSS 11.14 → 자기 트림 2.45 → 정적 CRT 1.56) - **DR-9 확정(사용자)**: 배포 2채널 — 설치형(프로그램 목록 등록·자동 실행 질문 **기본 체크**) + 포터블 ZIP(무서명 오탐 회피). - 상세 → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 4차) — 기술 기반 확정·크레이트 골격 green - DR-5~8 확정(스택·기법·구조·예산) · 02/15/18 작성 · mk-core/mk-app 골격 테스트 5 green. → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 3차) — 우선순위 확정(DR-4)·ADR-0003 정정 - DR-4(성능·안정성 > 편의성, 사용자 확정) → ADR-0003 권고를 하이브리드로 정정, ADR-0001 논거 재정리. → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 2차) — 개발 목표·기술 기반 문서화 - 프로그램 목적 확정(DR-3, 사용자 확정) — [00 비전](00-vision.md)·[05 요구사항](05-requirements.md)(FR/NFR·설정 스펙·차용표)·ADR-0001~0003 작성. → [journal/2026-08-07](journal/2026-08-07.md) ## 직전(2026-08-07 1차) — 저장소 부트스트랩 - **단계: 준비 — 기본 문서 골격 완료, 프로젝트 정의 대기.** - `nexa-dir2`의 문서·git 규약([16](16-doc-git-conventions.md))과 PolyForm NC 라이선스(DR-1·DR-2) 이식. 4층 문서 골격 생성. - 다음 순서(사용자 예고): ① 프로젝트 구성 방식 정리 → ② 개발 목표·기술 기반 정리. - 상세 → [journal/2026-08-07](journal/2026-08-07.md)