{
  "path": "/AIWK_COMMON/test/aiwk_manual_tests.json",
  "version": "v047",
  "title": "AIWK EXT4 v043 수동 테스트 항목",
  "items": [
    {
      "id": "boot-root-v030",
      "group": "core",
      "win_id": "test-launcher-win",
      "module": "dev.test_launcher",
      "title": "부팅/root/version 확인",
      "action": "run_win",
      "expected": "RESULT: OK, AIWK.version=v033, root data-version=v033가 확인되어야 한다.",
      "manual_steps": "수행 버튼을 누른 뒤 결과에 ok=1과 version/root_version 값을 확인한다.",
      "status": "test"
    },
    {
      "id": "manual-test-manager-open",
      "group": "dev",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "수동 테스트 관리창 열기",
      "action": "open_win",
      "expected": "수동 테스트 관리창이 열리고 항목 추가/완료/휴지통/완료숨김 UI가 보여야 한다.",
      "manual_steps": "수행 버튼을 누른 뒤 새 창이 뜨는지 확인한다.",
      "status": "test"
    },
    {
      "id": "hello-selftest",
      "group": "sample",
      "win_id": "hello-win",
      "module": "sample.hello",
      "title": "hello 창 selftest",
      "action": "selftest_win",
      "expected": "PRINT: 정상, RESULT: OK가 표시되어야 한다.",
      "manual_steps": "수행 버튼을 눌러 hello 창을 만들고 selftest 결과를 확인한다.",
      "status": "test"
    },
    {
      "id": "auth-run",
      "group": "auth",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "접속/Auth 창 run",
      "action": "run_win",
      "expected": "ok=1 또는 현재 role/profile 정보가 JSON으로 반환되어야 한다.",
      "manual_steps": "수행 버튼을 누른 뒤 role과 profile 상태를 확인한다.",
      "status": "test"
    },
    {
      "id": "win-registry-list",
      "group": "win",
      "win_id": "registry-win",
      "module": "win.registry",
      "title": "창 목록 registry",
      "action": "open_win",
      "expected": "Win Registry 창이 열리고 창 목록 새로고침이 가능해야 한다.",
      "manual_steps": "수행 버튼을 눌러 registry 창을 열고 목록 새로고침을 누른다.",
      "status": "test"
    },
    {
      "id": "comm-bus-open",
      "group": "comm",
      "win_id": "bus-test-win",
      "module": "comm.bus_test",
      "title": "BUS 통신 테스트창 열기",
      "action": "open_win",
      "expected": "BUS 통신 테스트창이 열리고 BUS 상태 표시가 보여야 한다.",
      "manual_steps": "수행 버튼을 눌러 창을 열고 상태 표시를 확인한다.",
      "status": "test"
    },
    {
      "id": "comm-wss-open",
      "group": "comm",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "WSS 통신 테스트창 열기",
      "action": "open_win",
      "expected": "WSS 통신 테스트창이 열리고 연결 설정/상태 표시가 보여야 한다.",
      "manual_steps": "수행 버튼을 눌러 창을 열고 상태 표시를 확인한다.",
      "status": "test"
    },
    {
      "id": "comm-nr-open",
      "group": "comm",
      "win_id": "nr-test-win",
      "module": "comm.nr_test",
      "title": "Node-RED 통신 테스트창 열기",
      "action": "open_win",
      "expected": "Node-RED 통신 테스트창이 열리고 요청/응답 UI가 보여야 한다.",
      "manual_steps": "수행 버튼을 눌러 창을 열고 상태 표시를 확인한다.",
      "status": "test"
    },
    {
      "id": "v030-client-id-badge",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "창 헤더 client_id 배지 표시",
      "action": "open_win",
      "expected": "WSS 통신 테스트창 헤더 맨앞쪽에 A1 같은 client_id 배지가 예쁘게 표시되어야 한다.",
      "manual_steps": "popup에서 client_id=A1로 접속 후 WSS 통신 테스트창을 열고 헤더 배지를 확인한다.",
      "status": "test"
    },
    {
      "id": "v030-popup-window-controls",
      "group": "popup",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "접속 후 전체 창 제어 버튼",
      "action": "open_win",
      "expected": "접속창에서 접속 후 접기/펼침/숨김/보임/아이콘/종료 버튼이 보이고 전체 창에 적용되어야 한다.",
      "manual_steps": "접속 버튼을 누른 뒤 popup을 닫지 않고 전체 제어 버튼을 하나씩 누른다.",
      "status": "test"
    },
    {
      "id": "v030-reload-restore-sequential",
      "group": "layout",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "새로고침 후 열린 창 순차 복원",
      "action": "open_win",
      "expected": "페이지 새로고침 후 이전에 열려 있던 창이 저장 순서대로 0.1~0.5초 간격으로 복원되어야 한다.",
      "manual_steps": "auth/wss/manual test 창을 연 뒤 웹페이지를 새로고침하고 순차 복원 효과를 확인한다.",
      "status": "test"
    },
    {
      "id": "v030-collapse-3-icon-node-ready",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "3단 접기 아이콘 위치 별도 저장",
      "action": "open_win",
      "expected": "창 접기 버튼을 3번 누르면 아이콘 1개 형태가 되고, 드래그 이동 가능하며 3단 위치가 별도 저장되어야 한다.",
      "manual_steps": "WSS 창에서 접기 버튼을 3회 눌러 아이콘 모드로 만든 뒤 위치를 옮기고 새로고침한다.",
      "status": "test"
    },
    {
      "id": "v030-placeholder-tooltip",
      "group": "ui",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "placeholder 자동 툴팁",
      "action": "open_win",
      "expected": "input/textarea에 기본값이 들어가 placeholder가 안 보여도 마우스를 올리면 title 툴팁으로 placeholder가 보여야 한다.",
      "manual_steps": "수동 테스트 관리창의 입력란 위에 마우스를 올려 placeholder 툴팁을 확인한다.",
      "status": "test"
    },
    {
      "id": "plan-d3-node-editor",
      "group": "plan",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "D3.js 노드화 단계 플랜 반영",
      "action": "open_win",
      "expected": "/AIWK_COMMON/plan/aiwk_ext4_plan.json에 D3.js 노드화/워크플로우 편집기 단계가 명시되어 있어야 한다.",
      "manual_steps": "ZIP 안의 plan JSON을 열어 p07-d3-node-editor 항목을 확인한다.",
      "status": "test"
    },
    {
      "id": "v030-reward-duration",
      "group": "test",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "완료 시점/소요시간/레벨 보상 기록",
      "action": "open_win",
      "expected": "수행 후 완료 체크 시 done_at, duration_sec, 축하 메시지와 레벨 정보가 저장/표시되어야 한다.",
      "manual_steps": "아무 테스트 항목을 수행한 뒤 완료 체크하고 결과창의 축하 메시지와 소요시간을 확인한다.",
      "status": "test"
    },
    {
      "id": "v031-fold-recovery-menu",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "접힌 창 복구 메뉴",
      "action": "manual",
      "expected": "2단 접기 상태에서 ⋯/② 또는 버전 배지를 눌렀을 때 펼침/1단/2단/3단 메뉴가 보여야 한다.",
      "manual_steps": "WSS 창을 2단으로 접고 헤더의 ⋯/② 또는 v033 배지를 눌러 메뉴를 확인한 뒤 펼침을 누른다.",
      "status": "test"
    },
    {
      "id": "v031-double-click-expand-icon",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "3단 아이콘 더블클릭 펼침",
      "action": "manual",
      "expected": "3단 아이콘 상태에서 헤더/아이콘을 더블클릭하면 정상 창으로 펼쳐져야 한다.",
      "manual_steps": "전체3단 또는 창별 3단 후 아이콘을 더블클릭한다.",
      "status": "test"
    },
    {
      "id": "v031-popup-collapse-levels",
      "group": "popup",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "접속창 전체 1/2/3단 제어",
      "action": "manual",
      "expected": "접속창에서 전체1단, 전체2단, 전체3단, 전체펼침 버튼이 각각 동작해야 한다.",
      "manual_steps": "여러 창을 연 뒤 접속창 버튼을 차례대로 눌러 전체 상태 변화를 확인한다.",
      "status": "test"
    },
    {
      "id": "v031-skin-template-plan",
      "group": "plan",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "스킨/템플릿 생성 계획 반영",
      "action": "manual",
      "expected": "plan JSON에 전체 > zone > window 스킨 상속, 스킨추가, 템플릿생성, 창별 선택 항목이 있어야 한다.",
      "manual_steps": "수동 테스트 관리창에서 계획 관련 항목과 README를 확인한다.",
      "status": "test"
    },
    {
      "id": "v031-palette-package-plan",
      "group": "plan",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "팔레트/패키지/Node-RED 계획 반영",
      "action": "manual",
      "expected": "기본 패키지, 추가 패키지, 차트/D3/기존 기능 패키지화, 팔레트 추가 방식이 계획에 들어 있어야 한다.",
      "manual_steps": "계획 JSON 또는 README 관리 항목에서 팔레트/패키지 단계를 확인한다.",
      "status": "test"
    },
    {
      "id": "v033-resize-hidden-folded",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "축소 단계 resize 핸들 숨김",
      "action": "manual_check",
      "expected": "1단/2단/3단 접기 상태에서 우하단 ㄴ resize 핸들이 보이지 않고 메뉴 클릭을 방해하지 않아야 한다.",
      "manual_steps": "WSS 창을 1단, 2단, 3단으로 바꾸며 우하단 크기조절 핸들이 사라지는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v033-stable-window-menu",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "좌측 창 메뉴 고정/클릭 가능",
      "action": "manual_check",
      "expected": "맨좌측 ☰ 창 메뉴가 열리고, 마우스를 메뉴로 이동해도 사라지지 않으며 펼침/1단/2단/3단/TEST/JS/디자인/닫기 선택이 가능해야 한다.",
      "manual_steps": "2단 접기 상태에서 ☰ 메뉴를 열고 메뉴 항목을 클릭한다.",
      "status": "test"
    },
    {
      "id": "v033-popup-remains-after-connect",
      "group": "popup",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "접속 후 접속창 유지와 전체 제어",
      "action": "manual_check",
      "expected": "접속 버튼을 눌러도 popup이 바로 닫히지 않고 전체1단/전체2단/전체3단/전체펼침/숨김/보임/종료 버튼을 사용할 수 있어야 한다.",
      "manual_steps": "EXT 아이콘 popup에서 접속을 누른 뒤 전체 제어 버튼들을 순서대로 눌러 확인한다.",
      "status": "test"
    },
    {
      "id": "v033-global-command-tick",
      "group": "core",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "전역 명령 tick 구조",
      "action": "manual_check",
      "expected": "전체1단/전체2단/전체3단/숨김/보임 명령이 중앙 명령으로 발행되고 각 창이 tick으로 반영해야 한다.",
      "manual_steps": "여러 창을 연 뒤 popup 전체 제어 버튼을 눌러 모든 창이 같은 단계로 변하는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v033-d3-node-connection-plan",
      "group": "plan",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "D3 노드 선긋기 계획 반영",
      "action": "manual_check",
      "expected": "계획 JSON에 2단 노드 연결, 3단 아이콘 팔레트, D3.js/Node-RED workflow 항목이 있어야 한다.",
      "manual_steps": "수동 테스트 관리창 또는 plan JSON에서 p12, p13 항목을 확인한다.",
      "status": "test"
    },
    {
      "id": "v036-collapse2-overflow-clip",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "2단 노드 글자 줄바꿈 방지",
      "action": "manual",
      "expected": "2단 노드 상태에서 제목이 줄바꿈되지 않고 앞 몇 글자만 보이며 디자인이 깨지지 않아야 한다.",
      "manual_steps": "WSS/BUS/TEST 창을 2단 노드로 접고 제목 영역이 2줄로 내려가지 않는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v036-collapse3-icon-order",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "3단 아이콘+order 표시",
      "action": "manual",
      "expected": "3단 아이콘 상태에서 A1 client_id는 숨겨지고 기능 이모지와 order 번호가 보여야 한다.",
      "manual_steps": "전체3단 또는 창 메뉴 3단 아이콘을 실행한 뒤 아이콘과 번호가 보이는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v036-package-palette-json",
      "group": "package",
      "win_id": "main-control-win",
      "module": "win.registry",
      "title": "패키지/팔레트 JSON 후보 등록",
      "action": "manual",
      "expected": "AIWK_COMMON/packages/aiwk_packages.json에 ApexCharts, dashboard, Instagram/TikTok, D3 node graph 후보가 있어야 한다.",
      "manual_steps": "ZIP 내부 packages JSON을 확인하고 제어창 팔레트 단계의 기본 후보가 들어갔는지 확인한다.",
      "status": "module"
    },
    {
      "id": "v036-window-menu-structure-stubs",
      "group": "win",
      "win_id": "main-control-win",
      "module": "win.registry",
      "title": "창 메뉴 JS/CSS/패키지 계획 진입점",
      "action": "manual",
      "expected": "☰ 메뉴에 JS 구조, CSS 구조, 패키지/팔레트, Apex차트, 후킹/인스타 항목이 보이고 클릭 시 상태줄에 PLAN 메시지가 떠야 한다.",
      "manual_steps": "창 메뉴를 열고 각 항목을 클릭해서 실제 동작 대신 계획 메시지가 나오는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v036-window-menu-meta-edit",
      "group": "window-menu",
      "win_id": "any-window",
      "module": "AIWK.winMenu",
      "title": "☰ 메뉴의 메뉴 수정에서 창 제목/2단 제목/icon/order 저장",
      "action": "수동: 창 ☰ → 메뉴 수정 → 제목, 2단 제목, 이모지, order 입력",
      "expected": "헤더 제목, 2단 짧은 제목, 3단 아이콘, order 번호가 즉시 반영되고 새로고침 후에도 유지된다.",
      "manual_steps": [
        "창을 하나 연다.",
        "☰ 메뉴에서 메뉴 수정을 누른다.",
        "짧은 2단 제목과 이모지/order를 입력한다.",
        "2단/3단으로 접어서 표시 상태를 확인한다.",
        "새로고침 후 복원 상태를 확인한다."
      ],
      "status": "todo"
    },
    {
      "id": "v036-collapse2-short-title-clip",
      "group": "window-fold",
      "win_id": "any-window",
      "module": "AIWK.AIWKWin",
      "title": "2단 노드 상태 짧은 제목/overflow clip 확인",
      "action": "수동: 2단 접기 실행 후 제목 줄바꿈 여부 확인",
      "expected": "2단에서 제목이 줄바꿈되지 않고 한 줄로만 보인다.",
      "manual_steps": [
        "긴 제목 창을 만든다.",
        "2단 노드로 접는다.",
        "제목 영역이 한 줄로 잘리는지 확인한다."
      ],
      "status": "todo"
    },
    {
      "id": "v039-popup-tab-token-pair",
      "group": "popup",
      "win_id": "popup-connect",
      "module": "ext.popup",
      "title": "tab_id별 client_id/token 세트 저장/로드/삭제",
      "action": "manual",
      "expected": "저장된 client_id를 선택하면 해당 token이 같이 로드되고, 삭제 버튼으로 해당 tab_id/client_id/token 항목이 삭제되어야 한다.",
      "manual_steps": "접속창에서 client_id와 token을 입력 후 저장한다. 저장된 탭별 client_id 목록에서 선택해 token이 복원되는지 확인한다. 삭제 버튼을 눌러 목록에서 제거되는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v040-web-index-load",
      "group": "web",
      "win_id": "AIWK_WEB",
      "module": "AIWK_WEB.index",
      "title": "home.yjm.kr/aiwk/index.php WEB 진단 콘솔 로딩",
      "action": "manual",
      "expected": "AIWK WEB v040 화면이 열리고 진단결과 생성/복사/ChatGPT 탭에 입력 버튼이 보인다.",
      "manual_steps": "home.yjm.kr/aiwk/index.php를 열어 v040 WEB 콘솔이 표시되는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v040-chatgpt-domain-folder",
      "group": "domain",
      "win_id": "chatgpt-tab",
      "module": "domains.chatgpt.chatgpt.com.chatGPT.yjm_chatgpt_diagnostic",
      "title": "ChatGPT 도메인 폴더 구조 확인",
      "action": "manual",
      "expected": "domains/chatgpt/chatgpt.com/folders/chatGPT/ 하위에 yjm_chatgpt_* 파일이 존재한다.",
      "manual_steps": "ZIP 내부 도메인 폴더와 파일명을 확인한다.",
      "status": "test"
    },
    {
      "id": "v040-chatgpt-prompt-insert",
      "group": "chatgpt",
      "win_id": "chatgpt-tab",
      "module": "yjm_chatgpt_copy_report",
      "title": "ChatGPT #prompt-textarea 진단 JSON 입력",
      "action": "manual",
      "expected": "ChatGPT 탭의 #prompt-textarea에 AIWK_DIAG_JSON_START/END 텍스트가 입력된다. 전송 버튼은 자동 클릭하지 않는다.",
      "manual_steps": "ChatGPT 탭을 열고 WEB 콘솔에서 ChatGPT 탭에 입력 버튼을 누른다.",
      "status": "test"
    },
    {
      "id": "v040-token-masking",
      "group": "security",
      "win_id": "diagnostic",
      "module": "yw-diagnostic",
      "title": "진단 JSON 토큰 원문 제외",
      "action": "manual",
      "expected": "진단 JSON에는 token 원문이 없고 has_token/token_masked/token_len 정도만 표시된다.",
      "manual_steps": "진단결과 생성 후 token 원문이 포함되지 않았는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v040-instagram-account-metrics-plan",
      "group": "instagram",
      "win_id": "plan",
      "module": "instagram.account.yjm_account_metrics_collect",
      "title": "인스타 계정 게시물 지표 수집 MVP 계획 등록",
      "action": "manual",
      "expected": "instagram/instagram.com/folders/account/modules.json과 yjm_account_metrics_collect.rule.json이 존재한다.",
      "manual_steps": "기존 EXT 추출 모듈 연결 전, 폴더/모듈/규칙 자리만 있는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v041-domain-index-scan",
      "group": "domain",
      "win_id": "popup",
      "module": "domain-loader",
      "title": "현재 도메인 index.json 자동 감지",
      "action": "popup_scan_domain",
      "expected": "팝업 도메인검사 클릭 시 현재 host에 맞는 representative_domain과 모듈 수가 표시되어야 한다.",
      "manual_steps": "www.instagram.com 또는 chatgpt.com 탭에서 EXT4 팝업을 열고 도메인검사를 누른다.",
      "status": "test"
    },
    {
      "id": "v041-domain-module-install-use",
      "group": "domain",
      "win_id": "popup",
      "module": "module-install",
      "title": "도메인 모듈 설치/사용 체크 저장",
      "action": "popup_module_toggle",
      "expected": "설치/사용 체크 후 탭에저장하면 tab_id별 도메인 모듈 설정에 저장되어야 한다.",
      "manual_steps": "감지된 yjm_ 모듈에서 설치/사용을 체크하고 탭에저장을 누른 뒤 팝업을 다시 열어 상태를 확인한다.",
      "status": "test"
    },
    {
      "id": "v041-domain-tab-clone-delete",
      "group": "domain",
      "win_id": "popup",
      "module": "tab-settings",
      "title": "탭 설정 복제/삭제",
      "action": "popup_tab_setting_clone_delete",
      "expected": "저장된 탭 모듈 설정을 현재탭복제로 복제할 수 있고 X 또는 탭 설정삭제로 제거할 수 있어야 한다.",
      "manual_steps": "저장된 탭 모듈 설정 목록에서 항목 선택 후 현재탭복제/X/탭 설정삭제를 각각 테스트한다.",
      "status": "test"
    },
    {
      "id": "v041-domain-module-run-inject",
      "group": "domain",
      "win_id": "content",
      "module": "domain-inject",
      "title": "도메인 모듈 수동 실행 주입",
      "action": "popup_run_module",
      "expected": "실행 버튼 클릭 시 현재 탭에 도메인 모듈 JS가 주입되고 중복 주입 시 already loaded가 반환되어야 한다.",
      "manual_steps": "www.instagram.com 탭에서 yjm_인스타 계정 지표 수집 모듈 실행을 누르고 콘솔/이벤트 상태를 확인한다.",
      "status": "test"
    },
    {
      "id": "v041-final-test-structure",
      "group": "web-ext",
      "win_id": "AIWK_WEB",
      "module": "diagnostic",
      "title": "최종 테스트 구조 선언 확인",
      "action": "read_plan",
      "expected": "WEB(home.yjm.kr/aiwk)+EXT4+ChatGPT 탭 입력+2차 Tab BUS 관제 경로가 plan/README에 기록되어야 한다.",
      "manual_steps": "README_EXT4_v041.txt와 관리 README의 v041 테스트 구조를 확인한다.",
      "status": "test"
    },
    {
      "id": "v043-domain-folder-inheritance-home",
      "group": "domain",
      "win_id": "popup",
      "module": "yw-domain-loader",
      "title": "home.yjm.kr 도메인 폴더 상속 검사",
      "action": "manual",
      "expected": "도메인검사 결과 loaded_levels에 domains, yjm, yjm.kr, home.yjm.kr 중 실제 존재 폴더만 상위→하위 순서로 표시되어야 한다.",
      "manual_steps": "home.yjm.kr/aiwk/index.php 탭에서 EXT4 popup의 도메인검사를 누르고 도메인상속 표시를 확인한다.",
      "status": "test"
    },
    {
      "id": "v043-domain-folder-inheritance-instagram",
      "group": "domain",
      "win_id": "popup",
      "module": "yw-domain-loader",
      "title": "www.instagram.com 도메인 폴더 상속 검사",
      "action": "manual",
      "expected": "도메인검사 결과 domains → instagram → instagram.com → www.instagram.com 후보 중 존재 폴더가 순서대로 로드되고 yjm_account_metrics_collect 모듈이 보여야 한다.",
      "manual_steps": "www.instagram.com 계정 페이지에서 도메인검사를 누른다.",
      "status": "test"
    },
    {
      "id": "v043-ai-read-files",
      "group": "docs",
      "win_id": "none",
      "module": "docs.ai_read",
      "title": "ai_read.md 폴더 안내 파일 확인",
      "action": "manual",
      "expected": "AIWK_COMMON/domains, domains/home.yjm.kr, domains/www.instagram.com, domains/chatgpt.com 등 주요 폴더에 ai_read.md가 존재해야 한다.",
      "manual_steps": "ZIP 내부 주요 폴더에서 ai_read.md가 있는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v043-progress-display",
      "group": "popup",
      "win_id": "popup",
      "module": "popup.progress",
      "title": "접속창 진행률 표시 확인",
      "action": "manual",
      "expected": "AIWK EXT4 접속창 상단에 전체 62% / MVP 74% 진행률 문구가 보여야 한다.",
      "manual_steps": "EXT4 popup을 열고 제목 아래 진행률 줄을 확인한다.",
      "status": "test"
    }
  ],
  "tests": [
    {
      "id": "v033-header-simplified-menu",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "헤더 v배지/동그라미 접기메뉴 제거",
      "action": "manual_check",
      "expected": "창 헤더에 v033 배지와 ⋯/①/②/③ 동그라미 접기 메뉴가 보이지 않고, 맨좌측 ☰ 메뉴만 창 메뉴 진입점으로 남아야 한다.",
      "manual_steps": "WSS 통신 테스트창을 열고 정상/1단/2단 상태에서 헤더를 확인한다.",
      "status": "test"
    },
    {
      "id": "v033-folded-menu-nowrap",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "접힌 상태 메뉴 줄바꿈 방지",
      "action": "manual_check",
      "expected": "1단/2단 접기 상태에서 ☰ 메뉴의 텍스트가 줄바꿈되지 않고 넘치는 글자는 말줄임/숨김 처리되어야 한다.",
      "manual_steps": "창을 1단과 2단으로 접고 ☰ 메뉴를 열어 항목 폭과 줄바꿈 여부를 확인한다.",
      "status": "test"
    },
    {
      "id": "v033-icon-mode-no-drag-arrow",
      "group": "win",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "3단 아이콘 상태 ↕ 숨김",
      "action": "manual_check",
      "expected": "3단 아이콘 상태에서 ↕ 문자는 보이지 않아야 하지만 아이콘 자체는 드래그 이동 가능해야 한다.",
      "manual_steps": "창을 3단 아이콘 상태로 만든 뒤 ↕ 표시가 사라졌는지, 드래그 이동이 되는지 확인한다.",
      "status": "test"
    },
    {
      "id": "v033-skin-template-menu",
      "group": "design",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "☰ 메뉴 스킨/템플릿 변경 항목",
      "action": "manual_check",
      "expected": "☰ 메뉴에 스킨 변경, 템플릿 변경 항목이 있고 editor 권한에서 클릭 시 창별 선택값이 저장되어야 한다.",
      "manual_steps": "Auth에서 editor/dev 권한을 준 뒤 ☰ 메뉴에서 스킨 변경/템플릿 변경을 눌러 status 메시지를 확인한다.",
      "status": "test"
    },
    {
      "id": "v036-window-fold-restore",
      "group": "v036",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "새로고침 후 1/2/3단 접기 상태 복원",
      "action": "수동: 창을 2단 또는 3단으로 접고 새로고침한다.",
      "expected": "같은 창이 같은 fold_level과 위치로 복원된다.",
      "manual_steps": [
        "전체2단 또는 전체3단 실행",
        "페이지 새로고침",
        "창 상태 확인"
      ],
      "status": "todo"
    },
    {
      "id": "v036-route-naming-rules",
      "group": "v036",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "net.room.client_id#endpoint/project/stage1/stage2/win/port 규칙 확인",
      "action": "수동: README와 route JSON을 확인한다.",
      "expected": "WSS scope와 route scope가 분리되어 있다.",
      "manual_steps": [
        "AIWK_COMMON/routes/aiwk_route_rules.json 확인",
        "AIWK_COMMON/rules/aiwk_naming_rules.json 확인"
      ],
      "status": "todo"
    },
    {
      "id": "v036-window-state-export",
      "group": "v036",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "모든 창 속성 일괄 저장/복원 관리자 확인",
      "action": "콘솔 또는 JS 실행창에서 AIWK.win.exportState() 실행",
      "expected": "project_id/stage1_id/stage2_id/fold_level/visible/route가 포함된다.",
      "manual_steps": [
        "창 몇 개 열기",
        "접기/숨김 상태 변경",
        "AIWK.win.exportState() 실행"
      ],
      "status": "todo"
    },
    {
      "id": "v037-hamburger-two-level-menu",
      "group": "v037",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "각 창 ☰ 햄버거 2단 메뉴 확인",
      "action": "수동: 창의 맨앞 ☰ 메뉴를 열고 접기/기능/구조/패키지 2단 메뉴를 확인한다.",
      "expected": "2단 메뉴가 줄바꿈 없이 열리고, 접기 하위 메뉴에서 3단 아이콘을 선택할 수 있다.",
      "manual_steps": [
        "WSS 테스트창 열기",
        "☰ 메뉴 열기",
        "접기 하위 메뉴 확인",
        "3단 아이콘 선택"
      ],
      "status": "todo"
    },
    {
      "id": "v037-folder-route-terms",
      "group": "v037",
      "win_id": "manual-test-manager-win",
      "module": "dev.manual_test_manager",
      "title": "group 유지 + 폴더식 route 용어 확인",
      "action": "수동: route/naming JSON 확인",
      "expected": "group→net 일괄 치환 금지, /뒤쪽은 folder_route로 설명되어야 한다.",
      "manual_steps": [
        "AIWK_COMMON/routes/aiwk_route_rules.json 확인",
        "AIWK_COMMON/rules/aiwk_naming_rules.json 확인"
      ],
      "status": "todo"
    },
    {
      "id": "v037-function-setting-menu",
      "group": "v037",
      "win_id": "wss-test-win",
      "module": "comm.wss_test",
      "title": "기능 설정 메뉴 확인",
      "action": "수동: ☰ > 기능 > 기능 설정 실행",
      "expected": "module/singleton/folder_route를 입력하고 저장하면 상태줄과 저장 목록에 반영된다.",
      "manual_steps": [
        "editor 권한 상태 확인",
        "☰ > 기능 > 기능 설정 클릭",
        "기본값 그대로 저장",
        "AIWK.win.exportState() 확인"
      ],
      "status": "todo"
    },
    {
      "id": "v039-wss-token-tabid",
      "group": "comm",
      "title": "WSS 테스트창에서 token/tab_id 표시 확인",
      "manual_steps": [
        "접속창에서 token 입력 후 접속",
        "WSS 통신 테스트창 열기",
        "상단 tab_id/token/auth 표시 확인",
        "상태 JSON의 profile.authToken이 ***인지 확인",
        "last_register.token이 *** 또는 실제 전송 후 서버 auth가 바뀌는지 확인"
      ],
      "expected": "tab_id가 비어 있지 않고 🔐으로 표시된다.",
      "status": "todo"
    },
    {
      "id": "v042-client-token-profile-vault",
      "group": "auth",
      "win_id": "popup",
      "module": "popup",
      "title": "client_id/token 지속 프로필 저장",
      "action": "접속창에서 token/client_id 저장 후 다른 탭으로 이동하여 저장 목록에서 프로필을 선택한다.",
      "expected": "프로필 항목이 도메인과 무관하게 남아 있고, 선택 시 현재 tab_id로 client_id/token/group/project/room이 로드된다.",
      "manual_steps": "토큰 입력→저장→다른 탭에서 EXT popup 열기→저장된 client_id/token 프로필 선택",
      "status": "todo"
    },
    {
      "id": "v042-home-selftest-popup",
      "group": "diagnostic",
      "win_id": "popup",
      "module": "home_selftest",
      "title": "home.yjm.kr 셀프테스트 버튼",
      "action": "home.yjm.kr/aiwk/index.php 탭에서 EXT popup의 home 셀프테스트를 누른다.",
      "expected": "WEB 콘솔 EXT4 수신 진단 영역에 JSON이 표시되고 localStorage/서버 로그 저장이 시도된다.",
      "manual_steps": "home.yjm.kr/aiwk/index.php 열기→EXT popup→home 셀프테스트",
      "status": "todo"
    },
    {
      "id": "v042-chatgpt-log-relay",
      "group": "diagnostic",
      "win_id": "popup",
      "module": "chatgpt_relay",
      "title": "ChatGPT 로그전달 버튼",
      "action": "ChatGPT 탭을 열어둔 뒤 EXT popup에서 ChatGPT 로그전달을 누른다.",
      "expected": "ChatGPT #prompt-textarea에 AIWK_DIAG_JSON_START/END 형식 JSON이 입력되고 자동 전송은 되지 않는다.",
      "manual_steps": "ChatGPT 탭 열기→검사 대상 탭에서 popup→ChatGPT 로그전달→입력창 확인",
      "status": "todo"
    },
    {
      "id": "v042-home-domain-module-detect",
      "group": "domain",
      "win_id": "popup",
      "module": "domain_loader",
      "title": "home.yjm.kr 대표도메인 모듈 감지",
      "action": "home.yjm.kr/aiwk에서 도메인검사를 누른다.",
      "expected": "WEB+EXT4 셀프 크로스 테스트 모듈이 감지되고 설치/사용/실행 버튼이 보인다.",
      "manual_steps": "home.yjm.kr/aiwk/index.php→popup→도메인검사",
      "status": "todo"
    },
    {
      "id": "v045-popup-button-guide",
      "group": "debug",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "접속창 버튼 설명/툴팁 확인",
      "action": "manual_check",
      "expected": "WEB1 자가진단, WEB1로 로그전달, ChatGPT 입력 버튼과 설명/툴팁이 명확히 보여야 한다.",
      "manual_steps": "popup을 열고 버튼 설명 / 디버그 영역을 펼쳐 세 버튼 설명과 권장 client_id 규칙을 확인한다.",
      "status": "test"
    },
    {
      "id": "v045-comm-pulse",
      "group": "comm",
      "win_id": "bus-test-win",
      "module": "comm.bus_test",
      "title": "통신 송수신 시 창 테두리 펄스",
      "action": "manual_check",
      "expected": "WSS/BUS/NR 송수신 이벤트가 발생하면 열린 AIWK 창들이 1회 테두리 펄스로 깜빡여야 한다. 1단/2단/3단에서도 보여야 한다.",
      "manual_steps": "BUS 통신 테스트창을 열고 메시지 전송/수신을 실행한 뒤 창 테두리 펄스를 확인한다.",
      "status": "test"
    },
    {
      "id": "v045-popup-debug-hub",
      "group": "debug",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "popup 디버그 갱신/복사",
      "action": "manual_check",
      "expected": "디버그 갱신 버튼이 tab_id, client_id, 도메인 감지, 모듈 상태 JSON을 만들고 디버그 복사가 가능해야 한다.",
      "manual_steps": "popup의 버튼 설명 / 디버그 영역에서 디버그 갱신과 디버그 복사를 누른다.",
      "status": "test"
    },
    {
      "id": "v046-popup-comm-controls",
      "group": "comm",
      "title": "접속창 WSS/BUS/NR 제어",
      "status": "test",
      "manual_steps": "토큰 로그인 후 WSS/BUS/NR 접속/끊기/접속유지 버튼이 활성화되고 상태 색상이 바뀌는지 확인한다.",
      "expected": "토큰 전 disabled, 토큰 후 enabled, 각 통신 상태가 요약 표시된다."
    },
    {
      "id": "v047-popup-button-layout-clean-restore",
      "group": "popup",
      "win_id": "auth-win",
      "module": "auth.panel",
      "title": "접속창 버튼 배치와 테스트 완료 창 자동복원 제외 확인",
      "action": "manual_check",
      "expected": "token 입력 바로 아래에 저장/접속/종료가 있고, 그 아래 WSS/BUS/NR 접속 제어가 보인다. 새로고침 후 test-launcher/hello/registry 등 완료 테스트창은 자동 복원되지 않는다.",
      "manual_steps": "v047 적용 후 ChatGPT 또는 home 탭 새로고침 → EXT4 접속창 확인 → 저장/접속/종료 위치 확인 → 페이지 새로고침 후 자동 복원 창 목록 확인",
      "status": "test",
      "version": "v047"
    }
  ],
  "updated_at": "2026-06-02T00:00:00+09:00"
}