# 10 · 결정 기록 (Decision Record) > 확정 사항은 DR-n 표에 고정. 대안 비교가 필요한 큰 결정은 별도 ADR 문서(`NN-adr-000N-*.md`)로 남기고 여기 색인한다. > 변경 시 과거 기록을 지우지 않고 **새 항목으로 정정**한다("정정" 명기). ## 1. 확정 결정 (DR) | # | 일자 | 결정 | | --- | --- | --- | | DR-1 | 2026-08-07 | 라이선스 = **PolyForm Noncommercial 1.0.0** — 개인·비상업 무료, 상업 사용은 유료 라이선스(문의 kiros33@sosomlab.com). `nexa-dir2`와 동일 정책. 정본 영문 [LICENSE.md](../LICENSE.md) + 비공식 한글본 [LICENSE.ko.md](../LICENSE.ko.md) | | DR-2 | 2026-08-07 | 문서·git 규약 = **`nexa-dir2` 검증 표준 전면 계승** — 4층 문서 체계·작성 규칙 8·커밋/브랜치/푸시 규칙. SSOT = [docs/16](16-doc-git-conventions.md) | | DR-3 | 2026-08-07 | **프로그램 목적 확정(사용자 확정)** — 트레이 상주 초경량 메모리 최적화 도구: 지속 관찰·회수, 상주부 최소화·기능부 온디맨드 회수, Top 5 팝업·프로세스 트리 뷰(쓰레드)·선택 종료/회수·간단 설정. 상세 [docs/00](00-vision.md)·[docs/05](05-requirements.md) | | DR-4 | 2026-08-07 | **판단 우선순위 = 성능·동작 안정성 > 개발·배포 편의성(사용자 확정)** — 모든 기술 결정(ADR)의 트레이드오프 판정 기준. 편의성 근거만으로 성능·안정성 열세안을 선택하지 않는다. 이 기준으로 ADR-0003 권고를 정정(§2) | | DR-5 | 2026-08-07 | **스택 = Rust + windows-rs, Win32 직접 호출·커스텀 드로잉**(ADR-0001 채택, 사용자 승인 "다음 진행"). 관리 런타임·GC·UI 프레임워크 금지. 외부 crate 기본 0 지향(`windows`/`windows-core` 제외) — 추가는 §3 원장에 건별 기록 | | DR-6 | 2026-08-07 | **관찰·회수 기법 = ADR-0002 채택** — 열거는 `NtQuerySystemInformation` 1콜, 회수 영역 ①~⑥ API 매핑, 권한 asInvoker+온디맨드 승격, 미문서 API 폴백 규칙([07 §5](07-adr-0002-memory-reclaim.md)) | | DR-7 | 2026-08-07 | **상주 구조 = 하이브리드**(ADR-0003 정정판 채택) — 상주 셸(트레이·관찰·Top 5 팝업) + 온디맨드 워커 프로세스(트리 뷰·정리 엔진, `--worker` 재기동·종료 시 OS 전량 회수) | | DR-8 | 2026-08-07 | **예산 게이트 확정**([00 §3](00-vision.md) 승격) — 유휴 RSS ≤**5MB** · 단일 exe ≤**3MB** · 외부 DLL **0**(OS 인박스만) · 유휴 CPU ~0% · 기능 종료 후 유휴 복귀(NFR-3). 마일스톤마다 실측([18](18-build-and-test.md)), 초과 시 main 병합 금지 | | DR-10 | 2026-08-07 | **목록 창 = 메인 화면(사용자 확정)** — 상단 메뉴바(파일·메모리·설정·도움말) + 프로세스 **트리 그리드**(확장 버튼으로 자식 프로세스·쓰레드 전개, 헤더 클릭 정렬, 2초 자동 갱신) + 선택 항목의 **프로세스/트리/쓰레드 종료**. 구조는 DR-7 유지 — 메인 화면도 온디맨드 워커 프로세스로 뜬다(닫으면 OS가 전량 회수) | | DR-11 | 2026-08-07 | **자동 실행 = `HKCU\…\Run` 등록(사용자 확정)** — [00 §2-5](00-vision.md) "레지스트리 없이" 원칙의 **명시적 예외**: 사용자가 메뉴에서 켤 때만 1개 값을 쓰고, 끄면 지운다. 그 외 어떤 상태도 레지스트리에 남기지 않는다(설정은 `data\settings.ini`) | | DR-15 | 2026-08-07 | **앱 묶음에 도우미 프로세스 포함, 단 셸은 제외(사용자 확인)** — 앱 항목 = 앱 프로세스 + 창 없는 자손(작업 관리자 `터미널(3)`), 자손은 백그라운드에서 제외. `explorer.exe`는 시작프로그램·바탕화면 실행분의 부모라 자식을 거느리지 않는 것으로 본다. 표시 이름은 버전 리소스 `FileDescription`(PID 캐시) | | DR-14 | 2026-08-07 | **목록 기본 보기 = 작업 관리자 기준(사용자 확정)** — 앱/백그라운드/Windows 3분류 + 같은 실행 파일 묶음(개수·합산 메모리), 앱 행에 창 제목. 분류 기준: 보이는 최상위 창 = 앱, 세션 0·의사 프로세스 = Windows, 나머지 = 백그라운드. PPID 트리·평면 목록은 보기 옵션으로 유지 | | DR-13 | 2026-08-07 | **다국어 처리 + 기본 언어 = 영어(사용자 확정)** — 코드에 영어 원문을 쓰고 `mk-core/i18n.rs`의 표에서 한국어를 찾는 방식(키 없음 → 번역 누락 시 영어로 자연 폴백). 설정 `lang = en`(기본)/`ko`/`auto`(OS 언어). 언어 변경은 재시작 후 적용 | | DR-12 | 2026-08-07 | **exe 파일명·버전 리소스** — 배포 파일명 `NexaMemKeeper.exe`, `FileDescription=Nexa MemKeeper`(빌드 스크립트가 SDK `rc.exe`로 임베드). 알림·작업 관리자에 내부 crate명(`mk-app.exe`)이 노출되지 않게 하기 위함 | | DR-9 | 2026-08-07 | **배포 2채널(사용자 확정)** — ① **설치형 exe**(Inno Setup): 제어판 프로그램 목록 등록 + 설치 마법사에서 "시스템 시작 시 자동 실행" **질문(기본값 = 체크됨)** ② **포터블 ZIP**: 무서명 exe의 다운로드 차단·SmartScreen 오탐 회피용 병행 채널. 구현은 M5([02](02-roadmap.md)) | ## 2. ADR 색인 | ADR | 문서 | 결정 대상 | 상태 | | --- | --- | --- | --- | | ADR-0001 | [06 스택](06-adr-0001-stack.md) | 언어·UI = Rust + windows-rs Win32 직접 — 후보 5안 비교 | ✅ 채택(08-07 → DR-5) | | ADR-0002 | [07 회수 기법](07-adr-0002-memory-reclaim.md) | 관찰·열거·회수 시스템 콜 매핑(정리 영역 ①~⑥) + 권한 전략 | ✅ 채택(08-07 → DR-6) | | ADR-0003 | [08 상주 구조](08-adr-0003-resident-architecture.md) | ~~단일 프로세스 권고~~ → **정정(08-07, DR-4 기준): 하이브리드** — 셸+팝업 상주 / 트리 뷰·정리 엔진 = 온디맨드 워커(100% 회수·크래시 격리) | ✅ 채택(08-07 → DR-7) | ## 3. 외부 crate 원장 (DR-5 — 추가는 건별 기록) | crate | 사용 크레이트 | 용도 | 근거 | | --- | --- | --- | --- | | `windows` 0.62.2 | mk-app | Win32/NT 바인딩(런타임 아님 — 선언만). features: Foundation·Gdi·LibraryLoader·ProcessStatus·SystemInformation·Threading·Shell·WindowsAndMessaging | DR-5 기본 허용. M0-1에서 도입(08-07) |