talklog 아카이브 — 검토·폐기된 수집 경로 이력 (2026-06-11)
전용 앱(접근성 화면 스크랩) 방향 확정 전까지의 탐색 이력. 원문 보존(요약 아님). 현재 방향은 handoff.md·design.md.
✅ 26.9.20 · talklog · LIVE STT 정리본 주기 25초 → 60초(1분 간격) — [페페] 토큰 결정
- [페페] 「Live stt 토큰 소비량 실감했다. 상당히 많이 먹는다. 1분 간격 정리본 수정으로 변경」 → 26.9.19 에 열어 둔 ⏳
TALK_NOTES_SEC판단이 60초로 닫혔다. - 고친 건 기본값 한 개(
C:\dev\talklog\live\live_server.py:62TALK_NOTES_SEC25→60).start_live.bat에 env 오버라이드가 없어 이 기본값이 곧 운영값이다. 코드 로직은 안 건드렸다. - 효과 = 26.9.19 실측 곡선(
_bench_notes_cost.py표) 위 재시뮬(claude 호출 0회) 1시간 회의 44회 → 31회 · 2.24M → 1.61M tok · $18.95 → $13.69 = 약 28% 감(API 환산 · 구독이라 실청구 0원). - 🔑절감이 2.4배가 아닌 이유 = 한 주기가 「sleep + 동기 호출시간(37~92초)」이라 sleep 만 25→60 으로 올려도 주기는 62~117초 → 97~152초, 즉 1.3배쯤밖에 안 는다. 「1분 간격」은 sleep 값 기준이고 실제 갱신 간격은 1.6~2.5분이다.
- 더 줄일 레버 2개(안 했다 — 지시 밖) = ①120초면 다시 ~30% 감 ②증분 방식(전사 전문 대신 직전 정리본 + 새 구간만 보내 「수정」시킨다) — 회당 입력이 전사 길이에 비례해 커지는 근본을 없애지만 프롬프트·검증 재설계라 큰 공사다.
- 검증 = 서버 재기동(
schtasks /Run /TN "\Cody\livestt-server"· 기존 pid 5876 종료 → 새 pid 26468) 후 venv 파이썬으로NOTES_SEC = 60실측 ·/api/health={"server":"ok","stt":"ready","recording":0}· 폰 경로https://poin-mini.tailc5d3c1.ts.net:8446/version200(versionCode 3). 재기동 시점recording:0이라 끊긴 회의 없다. - 같이 갱신 =
C:\dev\devplan\live-meeting-stt.html(한 줄·흐름도·env 표·토큰 절·미결 목록) ·C:\dev\devplan\projects.json+ 허브 재빌드 ·C:\dev\talklog\live\README_LIVE.md.
✅ 26.9.17 · talklog · 03:0x~03:3x KST — [페페] 「정리본 생성 실패 rc=3221225794 · 원인 파악·시스템 보완 · 화자분리 옵션 버튼 · 시스템 로딩 표시」 → [코디] 4건 전부 완료
① 사고 — 무엇이 날아갔나
lecture-20260916-095810(26.9.16 09:58 · 22분20초 · 362발화 · 6명)의notes_md가 통째로(정리본 생성 실패 rc=3221225794 ). 전사·wav(42.8MB)는 무사했다.- 복구 완료 — 신설 엔드포인트로 다시 만들어 부제 「노동부 안전점검 현장 안내 · 화자 6명」 · 본문 1,701자(실내용 = 고용노동부 안산지청 근로감독관 현장 산업안전 점검 대화).
② 원인 3겹 — 겉이 아니라 안쪽이 진짜였다(규칙 = rules.md 🆕 26.9.17 일곱 줄)
- 프로세스 기동 실패 — 정리본이
claude.cmd(=cmd.exe 한 겹)를 불렀고 그 cmd.exe 가 0xC0000142 로 기동 실패. 이벤트로그System/Id 26에 09:59:01·10:02:26·10:05:51·10:20:49 네 건. 같은 오류가 9/10·9/11·9/15 에codex-command-runner-*.exe로도 수십 건 = 이 PC 공통 증상(AppInit_DLLs·AppCertDlls·IFEO·Verifier 전부 비었고 자원고갈 이벤트도 없다 → 주입 DLL 아님). - 🔴80분을 삼킨 진짜 범인 = 윈도우 stdin 파이프 — CPython 윈도우
_communicate는_stdin_write를 timeout 자리보다 먼저 무제한 blocking 으로 한다. 40KB 전사 + 모달 앞에 선 자식 → 10:20:49~11:40:08(80분) 정지. 팝업 간격 205초(=timeout 180 +NOTES_SEC25)가 결정적 단서였다. 우리는 이 80분을 처음에 「화자분리가 느린 것」으로 오진했다 — 화자분리는 12초였다(그 오진 상태로 1차 구현을 했고, Fable 계획 에이전트가 잡아냈다). - 실패가 성공을 덮었다 — 오류 문구를 «본문»으로 돌려줘 호출부가
notes_md에 썼다 → 중간 정리본까지 전손. 로그·알림·재생성 수단 전부 없었다.
③ 고친 것 — C:\dev\talklog\live\live_server.py
- 전사를 stdin 파이프 → 임시파일(timeout 이 진짜로 든다) ·
SetErrorMode로 기동실패 모달 억제 ·claude.cmd→claude.exe직접 +CREATE_NO_WINDOW· 재시도 3회는 0xC0000142·spawn 예외에만 · claude 동시 기동 1개(_NOTES_LOCK, 코덱스 권고). - 실패해도 기존 정리본을 안 덮는다 +
notes_error별 필드 + 로그 + 텔레그램 +POST /api/items/{ts}/notes(되살리기 · 항목 화면 「다시 만들기」 배너). finalize단계별 소요시간을saved줄에 박는다(꼬리전사 3.2s · 화자분리 11.8s · 정리본 31.0s).
④ 화자분리 on/off — 녹음 시작 직전에 한 번(녹음 시작시 결정 요구 그대로)
- 시작 시트 하나를 새 녹음·이어 녹음이 같이 쓴다(세그먼트 2버튼). 이어 녹음은 그 항목의 지난 선택을 미리 골라 둬 1·2부가 갈리는 사고를 기본값으로 막는다.
- APK 재빌드·재설치 없음 — 웹이 sid 를 만들므로
await POST /api/prefs {sid, diarize}를nativeCmd앞에 끼웠다. 시작 뒤 변경 409. - 끄면 마감에서 화자분리를 건너뛴다(실측 말소리 30초 항목 정지→저장 15초). 녹음화면 배지 · 목록 카드 배지 · 항목 부제 「· 화자분리 안 함」.
- 한 방향 문이 아니다 —
POST /api/items/{ts}/diarize로 나중에 돌린다(실측:diarized=true·정리본 라벨 재생성까지 확인).
⑤ 시스템 로딩·정상작동 표시
- 진짜 문제는 부팅 후 28.7초 동안 포트를 아예 안 열었다는 것(모델 로드가 import 시점 전역) → 폰엔 「목록을 불러오지 못했어요」뿐. 백그라운드 스레드로 내려 즉시 listen(실측 기동 2.6초에
/api/health응답 · 로딩 중에도 목록 20건 정상). GET /api/health=stt: loading|ready|fail·notes: unknown|ok|fail· 모델·로드시간·녹음중·처리중·uptime(enum 고정 — 프론트가 else 로 뭉개지 않게).- 목록 상단바 상태 점(초록/노랑점멸/빨강)은 항상, 배너는 로딩·고장일 때만. 로딩 중에도 녹음을 막지 않는다(소리는 wav·버퍼에 쌓여 준비되면 전사된다). 막는 건
stt=fail뿐. - 곁에 고친 것 =
--selftest-hallu가 쓰지도 않는 모델을 올리던 것 ·stopProgress에role=status(수십 분 단계 변화를 스크린리더가 못 듣던 기존 결함) · 화자분리 안 한 항목 전사에화자?가 전 줄 박히던 것 ·PROCESSING단계 문구를 항목 화면이 그대로 받게(processing_msg).
⑥ 검증
--selftest-notes(신설) 3/3 — 특히 200KB + stdin 안 읽는 자식이 3.0초에 반환(고치기 전 코드면 영원히 멈춘다 = 사고 재현).--selftest-hallu9/9(모델 로드 줄 안 찍힘) ·_test_diar_health.py(신설) 21/21(health enum · prefs · 실제 말소리 30초 화자분리 off 종단 · 시작 뒤 409 · 재생성 202 · 없는 항목 404).- 화면 = Playwright 412×915 / 1280×900 — 시트 256px 뷰포트 안 · 세그 44px · 13px 미만 글자 0 · JS 오류 0 · 데스크톱 정중앙 420px. 증거 =
C:\dev\talklog\live\_design\livestt-{list,sheet,sheet-off}-412.png. - 상담 = web-designer(UI 착수 전 필수 · 시트·상태점 처방 채택) · Fable Plan(stdin 정체 정정 = 이번 작업의 핵심) · codex exec(exe 직접·NO_WINDOW·동시 1개·재시도 조건).
- 시험 산출물은 삭제 대신
C:\dev_attic\2026-09-17\talklog-livestt-diar-test\(항목 2건 × json/md/wav) ·…\playwright-mcp-artifacts\.
⑦ 남은 것
- ⏳[페페] 폰에서 시작 시트 1회 육안(꺼짐 → 30초 → 정지 → 라벨 없음·배지 · 목록 점 초록). APK 재설치 필요 없다(웹 화면).
- [코디] 며칠 뒤
Get-WinEvent -FilterHashtable @{LogName='System';Id=26}로 cmd.exe·claude.exe 팝업이 더 안 쌓이는지(SetErrorMode·exe 직접 효과 확인). - 🔴0xC0000142 의 «PC 차원» 원인은 아직 열려 있다 — 코드 방어는 끝났지만 프로세스 churn(cmd 36·conhost 40 잔류) 감축은 별건. 코덱스가 준 후속 확인 = 데스크톱 힙·핸들 추이 폴링,
gflags +slsLoader Snaps 로 실패 DLL 특정. - devplan =
C:\dev\devplan\live-meeting-stt.html갱신 + 허브 카드ub: talklog연결(허브 프로젝트 표26.9.17(목)최상단 확인).
2026-09-16 이관 — HANDOFF NOW 8000자 캡 (원문 그대로)
✅ 26.9.11(금) 17:1x KST — 라이브 전사(talklog live) 폰 접속 복구 → 새 링크 https://100.108.234.45:8445/
페페 「8444 모바일 접속 안 됨(보안 연결 페이지) + 화면 끄면 계속 녹음되나」. 원인 = 재부팅으로 서버 꺼짐 + 8444 를 photoapp 의 tailscale serve 가 tailnet IP 에서 선점(폰은 tailscaled 로 가서 TLS 실패).
처방 = 포트 8445 + 재기동. 검증 = tailnet IP 200 · 페페 S25 가 17:13 KST 에 실제 접속 200. ⚠자동기동 없음(재부팅하면 wscript C:\dev\talklog\live\start_live_hidden.vbs) · photoapp 백엔드 8812 도 꺼져 502(미조치).
🔴화면 끄면 녹음 멈춤(실측 노트20) = 끈 뒤 약 60초 후 0, 켜면 이어지지만 그 사이 소리 유실 → 화면 켜둔 채 사용. 끄고도 녹음 = 네이티브 앱(⏳페페 판단).
⏳18:2x 후속 = LIVE STT 2차 착수(그릴링 4묶음 확정 · 포트 게이트 A 완료 · B 목업 완료 · 앱 C 대기) — 이어받기 인계문 = projects/talklog/relay-2026-09-11-livestt-v2.md(✅19:05 ruleguard 탐지기 port-unregistered 연결 완료 — 26.9.12 00:07 KST 부터 차단 · ✅20:1x B 웹 완료 = 카드 목록·이어 녹음·합치기·부제 잠금·테라코타, talklog b7b92eb+8c0854d, 테스트 전부 통과·tailnet 200 · ✅20:5x 환청·AI 편향 수정 2db27de · ⏳C 앱 = 새 세션 인계 projects/talklog/relay-2026-09-11-livestt-c-app.md(S25 연결됨 · 인증서 = tailscale serve 정식) · ⏳페페 = 폰·노트북 실기 육안). 🆕21:2x C 서버 완료 = /ingest(장부 fsync 후 ACK · 재시작 복구) talklog 122f2e6 · _test_ingest 24/24 · 운영 8445 재기동 · 새 주소 https://poin-mini.tailc5d3c1.ts.net:8446/(정식 인증서 · wss 통과) · ✅22:0x 앱 v0.2 S25 설치(C:\dev\talklog\livestt-app · talklog 92f44a7 · 66.1초 녹음 = 서버 66.1초) · ✅22:2x v0.3 = 상단 타이틀 상태바 가림 수정(edge-to-edge 끔) — [페페] 실기 확인 「가려지는 부분 없음」 · ⏳페페 = 수용 시험(화면 끈 채 30분+ · 비행기모드 5분 · 전화) → 상세 projects/talklog/handoff.md 맨 위. 계획 = http://100.108.234.45:8799/livestt-v2-plan.html · 포트 장부 = C:\dev\tools\portgate\PORTS.md.
상세 = projects/talklog/handoff.md 맨 위 · 함정 = projects/talklog/rules.md 🆕 맨 위.
폐기된 수집 방안 비교 (탐색 이력)
| 방안 | 정책 | 자동화 | 폐기 사유 |
|---|---|---|---|
| ① 공식 내보내기 + 폴더감시 | 안전 | 수집만 수동(방당 ~30초) | 자동화 아님(수동 트리거). 단 처리부는 채택·재사용 |
| ②' VM 카톡PC + UI 자동화 | 회색(매크로) | 전자동 | 카톡 PC 동시로그인 1대 제한 → 페페 PC 강제 로그아웃, 주간 상시 충돌 |
| ② Android 알림 리스너 | 회색(서버 미접촉) | 전자동 | 내 발화 누락(수신 위주)·푸시끈방/장문잘림 유실 → 양방향 요건 미달 |
| ③ 카카오워크/채널 전환 | 공식 | 전자동 | 거래처가 옮겨와야 함 → 외부 단톡 부적합 |
| ④ 카톡 내장 카나나 요약 | 공식 | — | 인앱 한정·외부 반출 불가 |
| ⑤ 부계정 + VM | 회색(매크로) | 전자동 | 단톡만(1:1 불가)·실회선 필요·거래처 양해. 1:1 포함 요건에 미달 |
| 톡드라이브 채팅방 저장소 | 안전 | 반자동 | 전체 통째만 저장(부분 불가) + 톡클라우드 300GB 미디어 용량 한계 → 정기 수집 부적합 |
| 모바일 미러링(보조폰) | 회색 | 전자동 | 카톡 모바일도 1대 원칙 → 주력폰과 충돌 |
외부 AI 도구 평가 (도입 안 함)
- 공통: 어떤 도구가 카톡 UI 조작해도 매크로 범주·계정 리스크 동일. 반복 정형은 "AI로 제작"(코디 스크립트+스케줄러)이 맞고 LLM은 요약만(Claude API).
- 커서(Cursor)=코드 에디터, 코디 중복. 마누스(Manus)=클라우드 VM, 윈도우 카톡PC+모바일 인증 실행 불가·데이터 외부전송 부담. 헤르메스(Hermes)=로컬 상주 에이전트지만 카톡 연동 없음, 처리역할은 기존 스택 중복.
핵심 제약 (방향 결정의 근거)
- 요건: 1:1 포함 + 본계정 + 주간 상시 + 가급적 전자동 + 정책 안전.
- 카톡 PC·모바일 모두 계정당 1기기 동시 로그인 제한 → 별도 기기/VM 전부 페페 본인 사용과 충돌.
- 정책안전+완전전자동+양방향은 동시 만족 불가 → 페페 폰 1대 접근성 화면 스크랩 + 중단/재개로 귀결(폰 점유는 [작업 중단] 버튼으로 통제).
정책 조사 사실 (2026-06-11)
- 카카오 운영정책: 프로토콜·API 악용 봇/매크로 개발·제작·유포, 기술적 보호조치 무력화 금지. 영구정지 시 카카오 전 서비스 상실(계정 단위).
- 톡클라우드(구 톡서랍플러스): PC 클라이언트 없음·웹(talkcloud.kakao.com)만. 자동백업=카톡 내 복원용. 채팅방 저장소(톡드라이브)=저장 실행 시점 스냅샷(자동 아님).
- 카톡 25.9.0+: 카나나·ChatGPT 내장 요약(인앱 한정).
로그인 운영 사실
- 카톡 PC 로그인: 최초 기기 인증 1회 후 자동 로그인 세션 유지("매번 승인" 아님). 재인증은 비번변경·보안이벤트·장기미사용 등 간헐적.
2026-07-24 이관 — 루트 HANDOFF NOW 완료건 (원문 그대로)
- 🔐조사완료·미착수(talklog 보안잠금 PIN/패턴 앱 자동해제, 코디 2026-06-30): 일반 앱(루트X)은 보안 keyguard를 비번 직접입력으로 못 푼다(안드 의도적 차단) — KeyguardManager 비번API 없음·Device Owner setKeyguardDisabled는 PIN있으면 무효·접근성 bouncer조작은 One UI서 불안정·생체/resetPassword 불가·루트는 Knox손상. 유일 작동경로=ADB(PC→폰)
input text "<PIN>"(이미 Tailscale·무선ADB 인프라 있음). 권장=앱 isDeviceLocked시 PC/unlock호출→ADB로 PIN입력→수집→재잠금, PIN은 PC쪽 .env(폰분실 노출0), 패턴보다 PIN 안정적. ⚠재부팅하면 무선ADB 꺼져 그밤 skip→신뢰장소 우선+ADB fallback. 구현 페페 지시 대기. 상세=projects/talklog/handoff.mdNOW. - talklog(2026-06-20): 적재복원·수집관리 정렬·사용자구분 운영배포. 상세 =
projects/talklog/handoff.md.
완료(2026-08-03) — 수집기 진단+업데이트 (HANDOFF에서 원문 cut, 2026-08-05)
- talklog [코디] 26.8.3 수집기 진단+업데이트(페페 S25 유선연결) — 통화수집 ✅정상(MediaStore, 잠금무관), 카톡 야간수집 매번 실패 2대 원인 근본수정. ①3am 보안잠금: 앱은 보안 PIN 못 푼다(안드 보안) → 페페 결정 S25 잠금 스와이프전용 완화(⏳페페 몫)로 deviceLocked=0 유지 → 기존 앱 로직 3am 작동. ②
<queries>누락으로 야간getLaunchIntentForPackage(kakao)=null→카톡 전면 안 뜸 → APK v0.27에<queries>추가·재빌드. 키스토어 소실(07-25 마이그레이션)로 uninstall→install + adb 재프로비저닝(perms·accessibility·night_auto=true·알람 08-04 03:00 무장) 검증완료. KB 게이트 수정:night_worklog.pyP3가 통화지식을practice/*_calls.md에 무검토 직접 append하던 것 →learn_candidates.jsonpending(승인 게이트)로 변경, devplanfurniture-learn.html에 🆕 최근 추가 탭 신설(페페가 뭐 들어갔는지 확인+승인/거부). + 과거 무검토 직접적립 28블록(07-29~08-03) 백필(페페 지시) = approved로 등록해 최근추가·승인 탭에 노출 + practice 헤더 정규화로 복원(수정) 가능. ⏳페페 몫 = ①S25 잠금 완화 ②devplan 8799 서버 재시작(상승권한 — app.py 승인/복원 라우팅 반영; 재시작 전엔 열람만 되고 practice 후보 승인·복원 버튼은 실패). →projects/talklog/rules.md·projects/furniture-expert/rules.md
2026-08-08 — 통화 재수집 차단(fail-closed) + 코디 cmd 창 전수조사 ✅
🆕talklog 통화 재수집 차단 + 코디 cmd 창 전수조사 [코디] 26.8.8 ✅둘 다 완료·실측 검증. ①S25가 과거 통화 586건을 재업로드한 원인 = 증분 조회 fail-open — /calls-have를 못 받으면 빈 맵 = 전부 신규로 진행하는 코드였다(S25를 미니PC에 유선연결한 직후 서버 미도달). 🔴로그가 정상처럼 보인 이유 = 업로드 실패를 catch {}로 삼켜 night_audio uploaded=586 **skipped=0 실패 0**이었는데, 실은 알파벳 앞쪽 506건은 업로드조차 못 하고 24건이 PC에서 통째로 누락돼 있었다(파일 mtime 프리픽스 패턴으로 특정). 수정 = fail-closed(조회 실패 시 수집 중단·예외로 텔레메트리에 남김) + failed 카운터 + 서버 /upload-audio가 같은 이름+크기면 안 쓴다(앱 재설치·타 클라이언트까지 커버). APK v0.29 빌드·S25 설치(adb, 미니PC USB) + 서버 재기동. 검증 = 트리거 2회 → uploaded 25 / skipped 1069 / failed 0(누락분 회수) → uploaded 0 / skipped 1094 / failed 0(완전 멱등). ②cmd 창 = pipeline_worker.py가 부르는 claude.cmd가 범인(50ms 폴링 감시기로 현행범 확보). 🔑부모에 건 CREATE_NO_WINDOW는 손자에게 안 간다 — talklog_server(pythonw)→워커(pythonw)→claude.cmd. 전수조사 = 예약작업 41·HKCU/HKLM Run·시작프로그램·vbs 창스타일·C:\dev 전 .py(콘솔앱 spawn 40건) → 실제 위험은 pythonw 계열 3건(pipeline_worker.py·ytmine.py·게이트웨이 runner.py)로 좁혀 import nowin 삽입, 나머지는 숨김 vbs(콘솔 상속)라 무해 확인. A/B 실측(Start-Process, 리다이렉션 없이) = 대조군 창 뜸 / 실험군 0. ⏳남은 것 = 오피스PC 동일 점검(C:\dev 사본이 따로라 이 수정이 안 간다). → projects/talklog/rules.md · rules/tooling.md
2026-08-09 — C드라이브·dev 정리 + Autodesk Access 누수 차단 ✅
- 🆕C드라이브·dev 정리(48.5GB 휴지통) [코디] 26.8.9 ✅완료 — 단 휴지통은 안 비웠다(페페 승인 사안). 순서 = 재수집 차단 먼저, 삭제는 그 다음. ①통화 원장 신설
data/mobile/_calls_seen.json—/calls-have를 (디스크 ∪ 원장)으로 답하게 바꿔 전사 끝난 m4a를 지워도 폰이 다시 안 올린다(7/23 삭제분 829개가 7/24에 그대로 복귀했던 구조를 끊음). 검증 = 파일 1개 삭제 후/calls-have가 여전히 1094 + 폰 로직(have[f]==size) 시뮬레이션 SKIP. ②삭제 = 전부 휴지통(매니페스트talklog/data/_purged_2026-08-08.tsv·C:\dev\_cleanup_2026-08-08.tsv): A 통화원본 1,093개 1.35GB(전사본 1,095개는 보존) · B_trash(hermes 폐기 잔재)·_cleanup_20260623·.old·android-build zip 2개 = 2.06GB · C%TEMP%46GB. 🔴C의 정체 = Autodesk Access가 같은pkg.odis.tar(427MB)를 108번 받아 쌓은 것 — 하루 몇 번씩 다시 쌓이는 누수다. 🆕같은 날 후속 = ODIS 누수 원천 차단(페페 지시 "autodesk access 자동 업데이트·재부팅 자동시작 모두 꺼버려") ✅ — 서비스Autodesk Access Service Host= Disabled·Stopped(자기 안에TASK_SELFUPDATE_STEP1등 주기 작업을 갖고 있어 이게 다운로더의 본체다.servicehost.ini값은 전부 암호화라 손편집 불가 → 서비스를 끄는 게 유일한 knob) + HKLM Run 「Autodesk Access」 삭제(로그온 자동시작) + 실행중 프로세스 종료. ⚠AdskLicensingService는 그대로 둔다 — AutoCAD 라이선스가 그걸 쓴다. 비상승 세션이라Start-Process -Verb RunAs로 UAC 1회 승인 받아 실행. 스크립트·백업·원복 두 줄 =C:\dev\_autodesk_access_off.ps1(로그_autodesk_access_off.log). 검증 = 서비스 Disabled/Stopped · Run키 잔여 3개에 Access 없음 · Access 프로세스 0 · odis 캐시 재생성 0. ⚠부작용 = Autodesk 제품 업데이트가 자동으로 안 온다(수동 설치 시 원복 후 진행). ❓별건 =Autodesk Genuine Service(WOW6432Node Run)도 자동시작 중 — 끌지는 미결. ⏳페페 결정 2개 = ①휴지통 비우기(=48GB 실제 회수) ②Genuine Service 자동시작도 끌지. 안 건드린 것 =Downloads5.5GB(페페 파일)·C:\dev\_dlFPGA 설치본 244MB(8/7 다운로드)·pw-chrome-profile(28개 프로세스가 사용중). 결과 =%TEMP%47.7GB→1.47GB,talklog3.0GB→1.63GB, free 611.8→617.9GB(나머지 42GB는 휴지통에 있다). 함정 =rules/tooling.md🆕 「휴지통 삭제」절. →projects/talklog/rules.md
🧹 루트 HANDOFF NOW 이관 (2026-08-19 대청소 — pncad 외 전량, 페페 지시)
루트
HANDOFF.md를 pncad 만 남기고 비웠다. 아래는 그때 옮겨온 원문(문구 무변경).
- C드라이브·dev 정리(48.5GB 휴지통) [코디] 26.8.9 ✅완료(원문 cut →
projects/talklog/archive.md). 요약 = 통화 재수집 차단 원장 신설 + 휴지통 삭제 3묶음(통화원본 1.35GB·잔재 2.06GB·%TEMP%46GB) + 🔴누수 원천Autodesk Access Service HostDisabled·HKLM Run 삭제(원복C:\dev\_autodesk_access_off.ps1, ⚠Autodesk 자동업데이트 중단됨). ⏳페페 결정 2개 = ①휴지통 비우기(=48GB 실제 회수) ②Autodesk Genuine Service자동시작도 끌지. →projects/talklog/archive.md - talklog 통화 재수집 차단 + cmd 창 전수조사 [코디] 26.8.8 ✅완료(원문 cut →
projects/talklog/archive.md). 핵심 = ①/calls-have실패 시 fail-open → fail-closed(S25 가 과거 586건 재업로드한 원인,catch {}가 실패를 삼켜 로그는 정상처럼 보였다) + 서버가 같은 이름+크기면 안 쓴다, APK v0.29 로 멱등 실측 ②cmd 창 범인 = 부모의 CREATE_NO_WINDOW 는 손자에게 안 간다(pythonw→워커→claude.cmd) → pythonw 계열 3건에import nowin. ⏳남은 것 = 오피스PC 동일 점검(C:\dev 사본이 따로라 이 수정이 안 간다). →projects/talklog/{archive,rules}.md
🧹 루트 HANDOFF 이관 (2026-09-07) — 원문 그대로
✅ 26.9.4 21:5x KST — 모임 녹취 4파일 종합 정리 페이지 — http://100.108.234.45:8799/meetup-20260904-nakseong.html
페페 「오늘 모임 정리파일 텍스트 4개 텔레그램으로 보냈어, 중간에 끊겨서 분산됐다. 종합해서 정리해줘. html 로」.
🔑실은 4개가 아니라 세션 2개였다 — 텔레그램 도착분 5개 중 해시 동일 1건, 전사 길이 대조로 앞선 짧은 판 1건이 걷혔다
(세션1 전사 13,339자 / 세션2 9,059자 · 세션2는 회의록 판이 둘이라 문구가 다른 두 판을 다 반영).
회의록만 이어붙이는 안은 버렸다 — 각 판은 자기 조각만 커버해 세션 경계가 빈다 → 전사 원문을 다시 읽어 종합.
산출 = C:\dev\devplan\meetup-20260904-nakseong.html(87.7KB · 세션1 사내 AI 시스템 시연 11절 · 세션2 AI격차·낙성사업·도구운용 7절 ·
참석자 논의 4절 · 결정 13 · 액션 12 · 전사 전문 2건 접이식) · 빌더 _mk_meetup_20260904.py · 원본 사본 devplan\media\meetup-20260904\.
착수 전 web-designer 상담(상시 지시) 처방대로 = Bootstrap 미적용(읽기 문서엔 과설계) · 본문 780px · 스티키 목차 200px ·
세션 구분 색+라벨 병기 · 전사 4문장 단락. 🔴선례 lecture-20260627-claude-code.html 은 13px 하한 위반 6곳 + hex 재선언이라 복붙 금지(규칙 확정 전 유물).
검증 = check_font.py/check_theme.py FAIL 0 · build_hub.py --selftest 11항목 OK · Playwright 실측(목차 sticky 60px·본문 780px·깨진 앵커 0·폰 412px 헤더 겹침 해소) ·
허브 3개소 = 📌최근 등록·작업 보드 26.9.4(금) 행 노출 · 🕒최근 작업 진행 맨 위 · 🗂️미생성 세션 = 해당 없음(카드 있음).
부수 = 매니페스트 교착 해소 — 남이 두고 간 고아(ai-study/session-2026-09-04-dev-portfolio.md) 때문에 등록이 서로 롤백돼
둘을 직접 append 후 validate_manifest 1회로 통과(313건). 규칙 = projects/devplan/rules.md 🆕 맨 위 2줄.
✅같은 날 22:2x 추가 지시 = 화자분리 재작성(신동승 · 조영탁 대표(케이라운지) · 목기찬(대학 행정직)).
🔴녹음 파일은 없다 — live_server.py 는 lecture-*.md 만 쓰고 ws PCM 은 전사 후 버린다(오디오 원본 미보존).
미니PC·노트20(USB)·텔레그램 수신함 전부 그 시간대 오디오 0건 · S25 는 무선디버깅 꺼짐(포트스캔 결과 adb 거부)이라 확인 불가
→ pyannote 화자분리 실행 불가 → ⏳페페가 폰 녹음을 텔레그램으로 보내면 stt 경로로 진짜 분리로 교체한다.
대신 내용 기반 추정 화자분리로 재작성 = 63턴(세션0 1·세션1 28·세션2 34), 확신 낮은 10턴은 이름 뒤 ?, 화면 재생음 2구간은 「(영상·나레이션 소리)」.
방식 = 앵커 방식(턴 시작 문자열만 표에 적고 스크립트가 원문을 자른다 → 원문 재타이핑 0 · 앵커 0회·2회면 빌드 FAIL).
🔑부수확 2건 = ①data/lectures/ 를 날짜로 훑어 페페가 안 보낸 19:16 세션(501자 = 모임 도입부, 조영탁 대표 결재·계약 화면 시연)을 찾아 세션 0으로 편입
②그 도입부와 이어 보니 기존 정리본의 「세팅→판매→지분 남기고 빠짐」이 신동승이 아니라 조영탁 대표 것이었다 — 오배정 교정.
규칙 = projects/talklog/rules.md 🆕 맨 위 2줄(오디오 미보존 · 전사 파일은 보낸 것만 보지 말고 data/lectures/ 를 날짜로 훑을 것).
📮카톡 발송 완료(페페 지시) — 노트20 → 「신동승」 방, phone.py sendlong 2버블 1,247자(요약 + 링크 + 화자분리 상태 안내).
📎HTML 파일도 카톡 발송(추가 지시) — phone.py sendfile 로 단일 파일본 106,042B 첨부(폰 /sdcard/Download/ 크기 대조 일치, 70.5초).
단일 파일본 = 빌더 standalone() 신설(theme.css 인라인 + qahelper 제거) — 첨부만 보내면 /assets/* 가 안 붙어 맨몸 HTML 이 된다. 규칙 = projects/devplan/rules.md 🆕 맨 위.
⏳목소리 기준 화자분리는 파이프라인이 이미 있다(tools/stt/stt.py → gpubox 집PC 4070 → WhisperX+pyannote) — 막힌 건 오직 오디오 원본이다.
선택지 = ①폰 녹음을 텔레그램으로 → stt 로 교체 ②앞으로를 위해 live_server.py 가 WAV 도 남기게(≈10줄, 16k 모노 115MB/시간) — 페페 지시 대기.
✅ 26.9.4 19:0x KST — 실시간 전사·회의록 페이지(talklog live) 복구 — 폰 링크 https://100.108.234.45:8444/
페페 「실시간 전사 정리 페이지 복구해줘, 테일스케일로 접속한다」. 서버는 꺼져 있었고 옛 포트 8443·8793 을 남이 다 잡고 있었다
(8443 = tailscaled Funnel → 127.0.0.1:8815 · 8793 = tools\furniture-voice\server.py) → 8444 로 옮겨 기동.
방화벽은 포트가 아니라 프로그램 단위 허용(python39.exe) 이라 포트 변경만으로 폰 도달은 그대로다.
기동 = wscript C:\dev\talklog\live\start_live_hidden.vbs(창 0 · 로그 C:\dev\talklog\live\_live.log).
🔴함정 = 한글 주석이 든 .bat 을 UTF-8 로 저장하면 cmd(cp949)가 조용히 깨뜨린다('CE'은(는) …) → bat 주석은 ASCII 로 재작성,
start /b prog > log 2>&1 도 안 먹어 start /b cmd /c "…" 로 감쌌다.
검증 = GET https://100.108.234.45:8444/ 200(자체서명, SAN 에 100.108.234.45 · 만료 2027-06) ·
rehearse.py 로 실제 ws 스트리밍 E2E → 전사 「아빠가 올라오래」 + 저장 C:\dev\talklog\data\lectures\lecture-20260904-190011.md ·
회의록 쪽 claude -p(opus, 구독 OAuth) 단독 호출도 정상 산출. 규칙 = projects/talklog/rules.md 🆕 맨 위.
2026-10-14 이관 — HANDOFF NOW 20000자 캡 (원문 그대로)
(기록) 26.9.30 · S25 야간수집 OFF 대기 — ADB 연결 시 자동
- [페페] 「S25 야간 통화 수집이 상시 수집으로 인해서 의미가 없다. ADB 연결되면 수집 중지 해줘.」 → [코디] 폰 앱(
com.poin.talklog)의 03:00 야간알람(NightRunner = 통화녹음 업로드 + 카톡 순회)을 S25 가 ADB 에 잡히는 첫 순간 끈다. 지금 S25 는 무선디버깅이 꺼져 있어(tailscale 경로는 office 와이파이로 잡힘, 접속포트 스캔 0건) 대기 중. 노트20(R3CR103JBBY)은 모델 검사(ro.product.model= SM-S93*)로 절대 안 건드린다. - 장치 = 예약작업
\Cody\s25-nightoff-once(3분 주기 · wscript+숨김 vbs+pythonw · 창 0) →C:\dev\talklog\server\s25_nightoff_once.py(vbs =s25_nightoff_once_hidden.vbs). 탐색 = adb 기연결 → 캐시포트 → (와이파이면) mDNS/포트스캔 10분 1회. 전송 =am broadcast -n com.poin.talklog/.TriggerReceiver --es action nightoff(explicit) → 검증 =run-as … shared_prefs/talklog.xmlnight_auto=false +dumpsys alarm에poin.talklog.NIGHT없음. 성공하면 텔레그램 1회 + 마커C:\dev\talklog\data\_s25_nightoff.DONE기록 + 자기 예약작업 비활성. 로그 =_s25_nightoff.log, 멈춤 =_s25_nightoff.STOP파일. - 페페 몫(선택) = S25 를 와이파이에 두고 설정 > 개발자 옵션 > 무선 디버깅 ON(또는 USB 로 미니PC 에 연결) 하면 3분 안에 자동 처리된다.
\Cody\s25-adb-watch(2분 감시)는 페페가 꺼둔 그대로 두었다(재활성 안 함) — 이 작업은 자체 탐색을 쓴다. - 되돌리기 =
adb -s <S25> shell am broadcast -n com.poin.talklog/.TriggerReceiver --es action nighton(알람 재무장) · 앱이 죽어 있으면 먼저am start -n com.poin.talklog/.MainActivity. 검사 =python s25_nightoff_once.py --selftest(7) /--dry-run(찾기만).
✅ 26.9.22 · talklog · 폰 앱도 같이 고친다(상시) — livestt-app v0.4 = 일시정지를 앱이 안다
- [페페] 「폰 어플도 같이 수정을 기본으로 해줘」 → 규칙화 + 그동안 앱 쪽에 남아 있던 부채 1건 해소. (같은 시각 로그에 SM-S937N(S25) 이 00:12~00:15 짧은 녹음 4건 = 페페가 앱을 쓰며 낸 지시다.)
- 🔑APK 소스는 있다 =
C:\dev\talklog\livestt-app\(Kotlin·Gradle 8.7). 26.9.19 규칙의 「APK 소스가 이 리포에 없다」는 틀린 전제였고 정정했다(rules.md). 앱은 WebView 로 서버(8446)를 로드하므로 화면(live\static\*)만 고친 건 앱에 자동 반영 = 재빌드 불필요. 웹↔네이티브 계약·마이크·업로드·알림·권한이 걸리면 앱도 같이 고친다. - v0.4 내용 =
ACTION_PAUSE/RESUME신설 → 일시정지 중엔 캡처 루프가 읽은 버퍼를 버린다(파일에 안 쓰니 업로드 조각이 아예 안 생긴다 = 서버의 「없던 일」 규약과 뜻이 같아진다. 전엔 앱이 계속 올리고 서버가 버렸다) · 알림이 「일시정지 중 — 기록하지 않음」 + 알림에서 재개/일시정지 토글(잊고 방치가 최대 위험) ·livenative:state에paused· 웹togglePause는 서버 먼저(진실) →nativeCmd(옛 APK 는 무시해도 안전). - 배포 = 빌드(
gradle :app:assembleDebug) →C:\dev\talklog\live\apk\livestt.apk교체 +version.jsonversionCode 4 → 앱 열면/version보고 1탭 업데이트. 서명 동일 확인(SHA-256e3d73c60…) — 다르면 자가업데이트가 막힌다. - 검증 = 빌드 성공 · 서명 동일 · 노트20 설치 성공(versionCode 4) · CDP 로 앱 WebView 실측(폭 384px → 어제 넣은 1행 액션바·「⋯ 더보기」가 앱에서도 그대로 ·
window.LiveNative생존) ·/version=4·/app.apk200 · 웹 회귀_test_rec_layout.py17/17 ·--selftest-notes12/12. - 🔴자동 실기 검증은 여기서 멈춘다(설계가 맞다) — 앱은 「Activity 가 화면에 떠 있을 때만 녹음 시작」(
if (!resumed) return)이고am start-foreground-service로 띄운 FGS 엔 안드로이드가 마이크를 안 준다(allowWhileInUsePermissionInFgs=false). 화면 꺼진 폰으로는 시작 자체가 안 된다 → 스크립트는_test_app_pause.py(화면 켠 상태에서만 유효)로 남겼다. - ⏳[페페] 몫 1회 = 앱 열어 업데이트 1탭(v0.4) → 녹음 중 일시정지 → ①알림이 「일시정지 중」으로 바뀌는지 ②알림 「재개」가 먹는지 ③재개 후 이어 기록되는지.
✅ 26.9.22 · talklog · LIVE STT 녹음화면 폰 본문 확보 — 액션바 1행 + 「⋯ 더보기」 시트
- [페페] 「녹음 화면을 모바일로 볼 때 버튼들을 더 줄여야 한다. 메인 텍스트 화면이 작아져 많은 내용 보기가 어렵다」 → web-designer 실측 상담 후 적용.
- 실측(412×915) = 본문 가시높이 475px(51.9%) → 576px(63.0%). 내역 = 액션바 133 → 77px(유틸 3개를 시트로) + 정리본 없을 때 탭바 숨김 45px + 토큰칩 카드 크롬 제거(≈40px, 칩이 떠 있을 때).
- 구성 = 1행에
■ 정지·⏸ 일시정지·⋯(44px) /⋯누르면Claude 정리·내보내기·🔗 공개 링크가 기존 시트 관례(startSheet·shareSheet)로 올라온다. 백드롭·ESC·포커스 복귀 포함. - 🔑안전한 쪽은 안 건드렸다 — 정지·일시정지는 바깥에 남고 폭이 오히려 156px 로 커졌다(전 184px 였지만 유틸은 90~117px 였다). 일시정지 3중 신호(상단 점·버튼·배너)도 그대로. ⛒5개를 한 줄로 압축하는 안은 기각 — 평균 66px 로 쪼그라들며 「빨간 큰 정지」가 나머지와 구별되지 않는다(공간과 바꿀 것이 아니다).
- 정리본이 아직 없으면 탭바를 감춘다(빈 판이라 정보손실 0) → 첫 정리본이 오면
notes-empty클래스를 떼고 복귀. PC(1024px+)는 예전 그대로 5개 한 줄(실측 832,832,832,832,832). - 검증 =
_test_rec_layout.py신설 17/17(액션바 높이·본문 px·⋯ 44px·시트 열림/ESC·탭바 복귀·13px 하한·PC 무변화) ·_test_share_ui.py는 새 규칙(「공개링크는 ⋯ 안에서 보인다」)으로 고쳐 전부 통과. 커밋 talklog241b90a. - ⏳[페페] 몫 = 폰 실기 1회 — ⋯ 시트가 엄지에 닿는지, 회의 중 「Claude 정리」가 한 탭 더 들어간 게 불편한지.
✅ 26.9.21 · talklog · LIVE STT 토큰 다이어트 — [페페] 3단 구성 결정 → 구현·배포 완료
- [페페] 「지난주 LIVE STT 토큰 소비로 사용량 만료가 빨리 됐다. 심각하다. 토큰 아끼며 실시간 정리 30초 안, 아니면 실시간 정리를 버튼으로 필요할 때만」 → 레버를 하나씩 실제로 재고, [페페] 선택 = 3단 구성(실시간 Gemini 증분 30초 · 「Claude 정리」 버튼 · 마감 1회) → 같은 세션에 구현·서버 재기동까지 끝냈다.
- 적용 = 실시간 30초 = Gemini
gemini-3.1-flash-lite증분(Claude 소비 0·무료) · 버튼 =claude -psonnet 전문(≈39k tok·40~50초) · 마감 1회 = 같은 claude 전문. 1시간 회의 Claude 소비 1.61M → 40~70k(≈96% 감) 이면서 화면 갱신은 60초 → 30초. - 🔑버튼을 HTTP 창구로 새로 뺐다 —
POST /api/items/{ts}/notes_now. 옛 wsnotes_now는 폰 앱 녹음 중엔 서버가 무시했고(웹이 watch 소켓뿐 → 앱 모드에선 버튼을 숨기고 있었다) 정작 페페 주 경로가 폰 앱이다. 이제 앱·PC 둘 다 먹고 버튼도 항상 보인다. 겹눌림 = 409 busy. - 화면(web-designer 실측 처방) = 라벨 「Claude 정리」(「지금 Claude로 정리」는 412px 여유 0px라 탈락) · 카운트업(「정리 중 12초」, 60초+ 「아직 정리 중…」) · 정리본 카드 배지 「Claude 정리 · 12:33」/「자동 정리 · 12:31」 · 수동 실패는 칩이 아니라 배너+다시 시도 · 6번째 버튼은 안 만들었다(2행→3행 접힘).
- 노브 =
TALK_NOTES_SEC(30) ·TALK_NOTES_GEMINI(빈 값이면 실시간도 claude = 되돌리기) ·TALK_NOTES_MODEL(sonnet·버튼·마감. opus 로 올리면 사용량 5배) ·TALK_NOTES_FULL_SEC(900 = 증분 표류 방지 전문 재동기화, 무료) ·TALK_NOTES_GEMINI_TIMEOUT(60). - 검증 =
--selftest-notes12/12(기존 3+신규 9) ·--selftest-pub35/35 ·--selftest-hallu9/9 ·_test_diar_health.py21/21 ·_test_pause.py·_test_items.py·_test_live.py·_test_share_ui.py전부 통과(액션바 412px 380/380 = 새 라벨로도 안 넘침). - 🔑실통화 1건 왕복 실측(297초 재생 → 마감까지,
_probe_e2e_notes.py6/6) = 자동 정리본(Gemini) 붙음 · healthnotes_engine=gemini· 버튼 202 · 겹눌림 409 busy · Claude 는 딱 2회 = 10,875 tok($0.0515)(버튼 4,032 + 마감 6,843). 껍데기가 2.8k 로 줄어든 게 회당 숫자에 그대로 보인다(예전엔 회당 3만+). 비교 = 같은 서버의 26.9.20 실제 65분 회의 항목 = 36회 · 1,860,736 tok · $15.99. - ⚠도중에 Gemini 503(
This model is currently experiencing high demand)이 1회 났고 설계대로 흘렀다 — 정리본·last_notes_len안 건드리고 다음 30초 턴에 더 큰 델타로 성공(health 최종 ok). 즉시 재시도는 안 넣었다(429=쿼터면 재시도가 오답이라 주기 재시도가 맞다). - ⏳[페페] 몫 = 실제 회의 1회 — ①30초 갱신이 체감되나 ②「Claude 정리」 버튼 눌러 40~50초 기다리는 흐름이 쓸 만한가 ③폰(안드로이드 실기)에서 버튼 라벨·배지 육안 ④무료 엔진 정리본 품질이 회의록으로 충분한가(모자라면
TALK_NOTES_MODEL=opus는 마감만 올린다). - 아래 실측 = 결정 근거(원문 유지).
- 🔑제일 큰 낭비는 정리본 내용이 아니라 «호출 껍데기»였다.
claude -p를C:\dev\talklog\live에서 부르니 매 호출에C:\dev\CLAUDE.md(21.8KB) + MCP 도구 스키마 + 설정이 통째로 실린다. 빈 질문으로 실측 = 34,382 tok → cwd=%TEMP% 24,520 →--strict-mcp-config --tools "" --setting-sources ""까지 2,405 tok. 정리본은 도구가 0개 필요한 순수 텍스트 작업이라 전부 순손실이었다. - 회당 실측(60분 시점 = 전사 30,000자) — 지금 opus+전문 69,286 tok/$0.64/37~92초 · sonnet+전문+싼플래그 38,892/$0.2252/70.4초 · sonnet+증분 10,068/$0.0608/44.5초 · Gemini 3.1 flash-lite 증분 = Claude 소비 0 · 무료 · 3.5초. Groq 는 ❌(무료 TPM 8,000 — 전문 19.8k 요청이 413, 증분만 되고 30초 주기면 또 초과).
- 증분이 핵심 = 지금은 매 호출에 전사 전문이 들어가 총량이 O(n²)다. 증분(이전 정리본+새 발화)은 회의 길이와 무관하게 평탄하고, 배관도 이미 있다(
sess.last_notes_len이 곧 델타 시작점). - 🔴「30초 안」은 Claude 로는 구조적으로 못 지킨다 —
claude -p는 기동+생성에 44~92초(증분도 44.5초). 30초를 지키는 건 Gemini flash-lite(3.5초)뿐이다. 품질 육안 = 같은meeting_system.txt로 형식 그대로 + 화자 실명 3명 정확(신동승·정진욱·조수은). - 권고 3단 = ①실시간 30초 = Gemini 증분(Claude 0) ②「지금 Claude 로 정리」 버튼 = sonnet 증분 1회(10k) ③마감 1회만
claude -p전문 → 1시간 회의 Claude 소비 1.61M → 40~70k(≈96% 감) 이면서 갱신은 60초→30초. 코드 손 안 대고 지금 줄이는 것만(플래그+cwd+sonnet) 골라도 회당 44% 감. - 측정 스크립트 =
C:\dev\talklog\live\_probe_cheap_notes.py·_probe_gemini_notes.py·_probe_groq_notes.py(일회성, 결론 나면 삭제 가능) · devplanlive-meeting-stt.html「2026-09-21 토큰 다이어트 실측」.
✅ 26.9.19 · LIVE STT 일시정지/재개 + 공개 링크를 폰에서도
- [페페] 「녹음 정지, 일시정지 버튼 추가 / 퍼널 링크 모바일·PC 모든 양식에서 볼 수 있게」 → 둘 다 완료(같은 날 아침 「모바일엔 안 보이게」를 뒤집은 지시다).
- 🔑한 줄 = 일시정지는 서버가 끊는다. APK 소스가 이 리포에 없어 앱은 pause 를 모른 채 계속 올린다 →
Session.paused→add_pcm()이 버린다. 창구 =POST /api/items/{ts}/pause(HTTP — 폰 앱 녹음 중 PC 는 watch 로만 붙어 있다). 웹은 거기 더해 보내지도 않는다. - 잊고 회의 날리는 걸 막는 3중 신호 = 상단 점 주황 정지 · 「▶ 재개」 강조색 버튼 · 최상단 배너(+마이크 칩이 «일시정지 경과»를 센다, 2분 30초에 진동).
- 액션바는 폰에서 2행(정지·일시정지 / 정리본·내보내기·공개링크) — 5개 한 줄은 412px 에서 141px 넘친다(web-designer 실측). PC 는
display:contents로 한 줄 유지. - 곁에서 고침 =
GET /api/items/{ts}가 녹음 시작 직후 404 였다(json 은 첫 전사 확정에야 쓰인다) →api_patch_item이 쓰던 「세션 먼저」로 맞췄다. - 검증 =
_test_pause.py(신설) 전부 통과 — 일시정지 중 올린 3초가 wav 에 안 들어가는 걸 바이트로 확인(64,044→64,044), 재개하면 자라고(→128,044), 최종 4.0초(7초−3초)._test_share_ui.py전부 통과(2행 380/380·5버튼 1줄·하단여백 148>133·3중 신호·1280 한 줄 유지). 회귀 35/35·3/3·9/9·21/21. - ⏳[페페] 몫 = 안드로이드 실기 1회(한글 폰트 폴백에서 버튼 폭 · 네이티브 WebView 에서
display:contents) · 정지(빨강)↔재개(테라코타) 색약 구분.
✅ 26.9.19 · LIVE STT 회의 참석자용 공개 링크 + 화자 이름 필터 + 토큰 소비량
- [페페] 「PC 버전에만 공개 funnel 링크 · 모바일엔 안 보이게 · 링크는 라이브 정리본만 보여준다 · 화자가 파악되면 상단에 화자 이름 필터 버튼을 실시간 반영 · 녹음 페이지엔 5분 간격 토큰 소비량, 완료본엔 최종 총량」 + 같은 턴 「모바일 페이지도 필요하겠다」 → 전부 완료.
- 🔴한 줄 = 8445 를 funnel 에 걸면 안 됐다. funnel proxy 는 마운트 접두어를 떼고 넘겨
/mtg/api/items가/api/items로 도착한다 = 전 회의 목록·전사 전문·/ws·/ingest가 통째로 인터넷에 열린다. 공개 라우트 2개만 가진 별도 앱(127.0.0.1:8448) 을 같은 프로세스에 띄우고 funnel 은 거기만 본다 — 사설 API 는 «막은» 게 아니라 그 앱에 없다. 실측/mtg/api/items404. - 링크 =
https://poin-mini.tailc5d3c1.ts.net/mtg/pub/<22자 토큰>(128비트) · 48시간 자동 만료 · 즉시 폐기 · 발급 버튼은.desktop-only(PC 에만). - 화자 이름 = 라이브엔 화자분리가 없어 정리본 LLM 이 호칭에서 뽑는다. 함정 = 한국어 호명은 대개 청자라 근거를 「자기소개 / 호명 직후 대답」 둘로 못박았다. 실측 라벨 유·무 둘 다 3명 정확.
- 토큰 실측(정정판) — 회당 비용은 전사 길이에 비례한다: 8분 40,432 tok/$0.31 → 60분 69,286 tok/$0.64. 호출이 37~92초 걸리고
notes_loop는 sleep 뒤 동기 호출이라 한 주기 = 25초+호출시간 → 1시간 회의 = 43회 · 2.2M tok · $18.66 API 환산 · 구독이라 실청구 0원. ⚠첫 보고의 「100회·수십 달러」는 짧은 시험 전사(바닥값)에 25초 주기를 곱한 과장이었다 — [페페] 「그렇게 많이 든다는 느낌은 없었어」가 맞았고C:\dev\talklog\live\_bench_notes_cost.py로 다시 쟀다. ⏳[페페] 판단 =TALK_NOTES_SEC를 올릴지(화면 5분 구간표가 근거). - 검증 =
--selftest-pub35/35(신설) · 회귀--selftest-notes3/3 ·--selftest-hallu9/9 ·_test_diar_health.py21/21 · 실화면_test_pub_ui.py·_test_share_ui.py전부 통과 · 실제 funnel 왕복 OK. - ⏳[페페] 몫 = ①실제 회의에서 공개 링크 1회 시험(특히 카톡 인앱 브라우저) ②회의 초반 칩이 「전체」뿐일 때 어색한지·이름 오인이 나는지 ③
TALK_NOTES_SEC판단. - 원문 =
session-2026-09-19-live-stt-public-link.md· 규칙 6줄 =rules.md🆕 맨 위 · devplan =C:\dev\devplan\live-meeting-stt.html
✅ 26.9.17 · talklog · LIVE STT 정리본 사고 규명·복구 + 화자분리 스위치 + 시스템 상태 표시
- [페페] 「정리본 생성 실패 rc=3221225794 · 원인 파악·보완 · 화자분리 옵션 버튼(녹음 시작시 결정) · 시스템 로딩 표시」 → 4건 전부 완료.
- 한 줄 = rc=3221225794(0xC0000142)은 겉이고, 80분을 삼킨 진짜 범인은 윈도우
subprocess의 stdin 파이프 쓰기가 timeout 을 무시하는 것이었다(화자분리는 12초 — 처음엔 화자분리로 오진했다). 날아간lecture-20260916-095810정리본은 복구 완료(부제 「노동부 안전점검 현장 안내 · 화자 6명」). - 검증 =
--selftest-notes3/3(사고 재현 케이스 포함) ·--selftest-hallu9/9 ·_test_diar_health.py21/21 · Playwright 412·1280 화면 실측. - ⏳[페페] 몫 = 폰에서 시작 시트 1회 육안(꺼짐 → 30초 → 정지 → 라벨 없음·배지 · 목록 점 초록). APK 재설치 필요 없다(웹 화면).
- 🔴열린 것 = 0xC0000142 의 «PC 차원» 원인(코드 방어는 끝. 프로세스 churn 감축·Loader Snaps 추적은 별건).
- 규칙 7줄 =
projects/talklog/rules.md🆕 26.9.17 · 원문 =projects/talklog/archive.md「✅ 26.9.17 · talklog」 · devplan =C:\dev\devplan\live-meeting-stt.html
✅ 2026-09-15(화) 05:0x KST — [페페] 「LIVE STT 가 미니PC 재부팅으로 죽었다 · 재부팅 스케줄러 + 상시 오픈」 → [코디] 자동기동 완료
- 원인 =
live_server.py(8445)에 자동기동이 없었다(26.9.14 rules 에 적힌 그대로 재발). 8446 tailscale serve 는 살아 있어 붙긴 하는데 빈 화면. 오늘 04:16 재부팅(자동로그인 delix) 뒤 8445 죽은 채였다. - 처방 = 예약작업
\Cody\livestt-server신설 — 액션wscript C:\dev\talklog\live\start_live_hidden.vbs· 트리거 ①delix 로그온 +1분 ②5분마다 반복(감시 겸용) · Interactive/delix · MultipleInstances=IgnoreNew. - 중복 기동 가드 =
start_live.bat첫 줄netstat … LISTENING … :8445매치면 즉시 종료 → 5분마다 불려도 서버는 하나. - 검증 = 작업 실행 → 15초 내
0.0.0.0:8445 LISTENING(pid 17580) · 재실행해도 프로세스 1개(가드 동작) ·https://poin-mini.tailc5d3c1.ts.net:8446/version200(versionCode 3) = 폰 앱 경로 살아 있음 ·LastTaskResult 0. - 미검증 = 실제 재부팅 뒤 로그온 트리거(재부팅은 안 했다). 안 먹어도 5분 반복이 안전망이라 로그온 후 최대 5분이면 뜬다.
- 장부 =
C:\dev\tools\portgate\PORTS.md8445 「수동 → 상주 · 예약작업」 · 8446 비고 갱신. - 재부팅의 원인은 윈도우 업데이트였다(04:14
MoUsoCoreWorker→ KB5129195) → 같은 날 자동재부팅 자체를 정책으로 막고 알림을 붙였다 =projects/remote-access/handoff.md맨 위.
✅ 2026-09-14(일) 11:3x~11:45 KST — [페페] 「노트20에 LIVE STT 설치」 → [코디] 설치·실기검증 완료
- 앱 =
C:\dev\talklog\live\apk\livestt.apk(v0.3 · versionCode 3) → 노트20(R3CR103JBBY · SM-N981N · Android 13/SDK 33 ≥ minSdk 26)adb install -rSuccess. - 🔴막힌 곳 = 노트20이 tailnet 밖이었다 — 앱 BASE 가
https://poin-mini.tailc5d3c1.ts.net:8446(정식 인증서 · SSL 예외 금지 규약)라 WebView 가ERR_CONNECTION_ABORTED. LAN 우회(8445)는 방화벽 규칙도 없고 자체서명이라 규약 위반 → [페페] 승인 받고 Tailscale 설치+로그인 선택. - Tailscale = Play Store 설치 → VPN 연결 요청 확인 → Sign in with Google(delix0731@gmail.com, 폰에 이미 로그인) → Connect. 편입 =
galaxy-note20-5g100.91.196.11. 집 LAN 정상(게이트웨이 ping 2 received = 서브넷 하이재킹 없음). - 곁에서 고친 것 =
live_server(8445)가 죽어 있었다(26.9.14 절전·재부팅 여파 · 자동기동 없음).start_live_hidden.vbs로 기동 → 8446/version200. - 권한 = adb 로
RECORD_AUDIO·POST_NOTIFICATIONSgrant +deviceidle whitelist +com.poin.livestt(배터리 제한없음). 삼성 「절전 제외 앱 등록」은 사람 확인 플래그(samsungAck)라 미처리 — 장시간 녹음 전에 페페가 앱 온보딩에서 「했어요」 한 번. - 실기 검증 = 새 녹음 → 화면 끈 채 45초 포함 총 87.8초 ·
RecordingService포그라운드 생존 · 서버 wav 87.8초 ·gaps=[](유실 0) · 마이크/연결 칩 「녹음중·연결됨」. - 정리(삭제 아님) = 시험 항목
lecture-20260914-114342.{wav,json,md}+ 장부ac4b0f21….jsonl→C:\dev_attic\2026-09-14\talklog-note20-test\(FILES.tsv). - 남은 판단 = 노트20으로 장시간 수용 시험(30분+·비행기모드·전화)을 S25 대신 돌릴지 — 현재 HANDOFF 의 「LIVE STT 폰 앱 수용 시험」은 S25 기준.
✅ 2026-09-12(토) 16:2x KST — [코디] 노트북 인터넷 끊김 중 LIVE STT 웹 세션 자동복구 실증(유실 0)
페페 「노트북 인터넷이 끊겼었다. 라이브 STT 중단 — 현재 화면에서 다시 녹음 진행시켜줘」 → 점검해 보니 이미 스스로 이어붙어 녹음 중이었다. 조치 없이 확인만.
- 항목 = lecture-20260912-092654(제목 「26.9.12(토) 09:26」 · 부제 「AI 바이브코딩 스터디 실습 하루」) · 세션 3c4eb8cb · 클라이언트 = 노트북 poin-lap 100.122.253.61 Chrome 153.
- 끊긴 구간 = 16:11:40 → 16:20:43 KST(약 9분). 서버는 세션을 600초 살려두고 기다렸고(SESSIONS[sid]), 브라우저가 붙자마자 쌓아둔 오디오를 208초·198초·127초 덩어리로 몰아 올렸다(whisper 로그의 긴 duration 이 그 증거).
- 유실 판정 = 0 — wav 25,036초 vs 세션 시작(09:26:54)부터의 벽시계 24,966초 → 오히려 +70초(백로그 재전송 겹침). 항목 json gaps = [].
- 실시간 복귀 확인 = wav 실측 10초에 10초분 유입 · whisper 청크가 2~8초짜리로 돌아옴(백로그 따라잡음) · tailscale ping poin-lap 4ms.
- ⚠끊김 총 103회(하루 누적) — 25~30초짜리 짧은 재접속이 대부분이라 소리는 안 잃었지만, 9분짜리 장기 끊김도 백로그가 버텼다는 게 이번 실측의 새 사실(26.9.9 안전망 설계가 실전에서 통했다). 사람이 할 일 = 아무것도 없다. 새로고침·새 녹음 금지(새 항목이 생겨 갈라진다).
✅ 2026-09-11(금) 17:1x KST — [코디] 라이브 전사 폰 접속 불가 복구 — 새 링크 https://100.108.234.45:8445/
페페 「https://100.108.234.45:8444/ 모바일 접속 안 된다. 보안 연결 페이지 뜨고 접속 안 됨. 폰 화면 껐을 때도 계속 녹음되나」.
- 원인 2겹 — ①26.9.10 02:33 재부팅으로 live 서버가 꺼져 있었다(자동기동 없음) ②켜도 소용없었다: 26.9.8 photoapp 의
tailscale serve --https=8444가100.108.234.45:8444를 tailscaled 가 직접 잡는다 → 폰은 tailscaled 로 가고, IP 접속엔 인증서가 없어 TLS 실패(curl 재현SEC_E_INTERNAL_ERROR) = 폰의 「보안 연결」 오류. 26.9.9 검증은 전부 127.0.0.1 이라 못 잡았다. - 처방 = live 포트 8444 → 8445(
C:\dev\talklog\live\start_live.batTALK_PORT· 주석 ASCII) + 재기동(start_live_hidden.vbs). photoapp 은 안 건드렸다(그 링크https://poin-mini.tailc5d3c1.ts.net:8444/유지 — 단 백엔드 8812 도 재부팅으로 꺼져 502, 미조치). - 검증 = tailnet IP 로
GET https://100.108.234.45:8445/200 · 서버 로그에 페페 폰(galaxy-s25-edge 100.106.4.88) 이 17:13·17:14 KST 에/·sw.js200. - 문서 =
C:\dev\talklog\live\README_LIVE.md(포트·재부팅 주의) · 함정 =rules.md🆕 맨 위. - 화면 꺼짐 실측(노트20) = 끈 뒤 약 60초만 녹음, 이후 0 → 켜면 같은 파일에 이어짐. 끊긴 동안 소리는 유실(백로그로 못 살림).
답 = 화면 켜둔 채(전원 버튼 금지). ⏳페페 판단 = 화면 끄고도 녹음이 필요하면 네이티브 녹음(기존 talklog 안드로이드 앱에 마이크 포그라운드 서비스) — 원하면 그릴링부터.
테스트 녹음(무음 142초)은
C:\dev\talklog\data\lectures\_selftest\로 옮김.
✅ 2026-09-09(수) KST — 라이브 회의 전사에 음향 화자분리 + 끊김 복구 (devplan 등록 완료)
페페 「실시간 stt 회의 정리 프로그램 devplan 에 올리고 화자분리 사운드에서부터 할 수 있는 기능 추가. 문맥으로 분리 안 하고 목소리로 분리한다. 그리고 중간에 휴대폰을 끄면 녹음이 중단되는 경우가 있는 것 같다. 이 부분도 보완」.
- devplan =
devplan/live-meeting-stt.html· 허브 카드live-meeting-stt(배포·AI·자동화) 등록·빌드·육안 확인 완료(26.9.9 표에 노출, 79건). - 화자분리 = 발화단위 화자임베딩(3D-Speaker campplus ONNX·CPU) 군집. 엔진 신규 개발 0 — 통화가 쓰는
talklog/server/stt_groq.py를 재사용하고 회의용cluster()(인원 자동 AHC /TALK_SPEAKERS고정)만 얹었다. 라벨은 정지 시 일괄 배정 → 최종 회의록·저장본에만 붙는다.meeting_system.txt에 라벨 해석 규칙 1줄 추가. - 원본 wav 실시간 저장(
lecture-<ts>.wav, 16k mono s16, 시간당 115MB) — 26.9.4 에 「원본이 없어 화자분리를 못 한다」던 구멍이 메워졌다. 이 파일로 집PC 4070 정밀 재처리(tools/stt/stt.py run <wav>)도 그냥 된다. - 끊김 복구 = 세션을 소켓에서 분리(
SESSIONS[sid]·600초 생존) + 폰 백로그 5분 + 자동 재접속 +track.onended마이크 재획득 - 서버 무응답 25초 감지 + 90초 무입력 텔레그램 알림 + 10분 뒤 서버 단독 마감.
- 🔴덤으로 실결함 2개 — ①heartbeat 가 최종 회의록 전송을 죽이던 건(파일은 저장되는데 폰만 못 받음) ②마감·전사루프 이중 전사.
- 검증 실측 = 군집 로직 self-check OK · 임계값 보정(정답 통화 4건, 0.355 채택) · 실오디오 83초 → 40발화·화자 2명(정답 2명) ·
끊김→재접속 자체검사 통과(
live/_test_live.py --sec 60:restored=true· wav 60.0초 = 보낸 60.0초 · 파일 1개) · UI 실브라우저 확인(화자 3색·라벨 13px·끊김 빨강·내보내기 라벨 유지).
⏳페페 몫 3건 = ①실제 회의 1건으로 폰 실기 확인(끊김 배너·복구 진동·화자 라벨 가독성)
②폰 Chrome 배터리 「제한 없음」 + 절전 예외(화면 꺼짐 생존율을 올리는 건 코드가 아니라 이쪽이다)
③회의 녹음이 생기면 TALK_SPK_THRESH 재측정(지금 값은 전화 대역 기준).
⚠보장하지 않는 것 = 「화면 끄고 장시간」은 웹으로 보장 못 한다(코덱스 확인 — 확실히 하려면 네이티브 AudioRecord +
마이크 포그라운드 서비스). 이번 작업은 끊겨도 안 잃게 하는 안전망이지 안 끊기게 하는 보장이 아니다. 네이티브는 안 만들었다.
규칙·함정 = projects/talklog/rules.md 🆕 맨 위 4건. 매뉴얼 = C:\dev\talklog\live\README_LIVE.md.
📜 26.6.18~7.24 인용 블록 — 원래 handoff 의 26.9.9 절 아래에 붙어 있던 상태 기록 (원문 그대로)
🔎 카톡 collector 해결방안 조사 완료(2026-07-23, 워크플로 25에이전트 2회전·6축 조사+적대검증). 페페 질문 = "ADB 끊김·잠금화면일 때 카톡 수집 가능한 방법". - 결론: "ADB 끊김 + PIN 잠금" 동시 상황에서 카톡 UI를 읽어 텍스트를 뽑는 방법은 없다(Android 보안모델 — 잠금화면 위엔 어떤 앱 UI도 렌더되지 않음 = AccessibilityService 구조적 불가. 코드 버그 아님). 대신 잠금과 무관한 경로 3개를 조합한다. - 🔴중요 정정(적대검증서 반증): 현
kakao-listener(note20)는 알림을 logcat으로 emit만 한다 —KListener.java에 HTTP 업로드·로컬 영속화 코드 0건, 매니페스트에 INTERNET 권한도 없음. 즉 "알림리스너 = ADB 없이도 수집된다"는 캡처 단계까지만 참이고, PC 도달은 여전히adb logcat에 의존. ADB 무관 완성하려면 HTTP 직송 개조(INTERNET 권한+로컬 큐+재시도) 신규 개발 필요. - 생존 옵션: ①PC 카톡 풀스캔(collect_full.py, 폰·ADB 완전 무관·967방 전체이력, 이미 실증) ②PC 증분(collect_all.py컷오프+스케줄) ③알림리스너 HTTP 직송 개조 ④S25(페페 본계정)에 리스너 설치(1:1 업무대화까지 커버) ⑤장문 전문읽기(readlong, ADB 필요·저빈도) ⑥USB 상시연결 주전략화 ⑦PC 워치독+텔레그램 경보 ⑧라우터 AP격리 해제/전용 AP 추가 ⑨Note20을 업무 단톡방 초대(그룹방만). - 탈락(반증): 잠금 뒤 AccessibilityService 읽기(OS 차단) · DevicePolicyManager PIN 우회(비-owner SecurityException, 공장초기화 필요) · Tailscale+mDNS 무선ADB 자동복구(Tailscale은 tun P2P라 멀티캐스트 미전달 — 공식 이슈 확정, 재부팅마다 포트 랜덤이라 사람이 화면 봐야 하는 순환의존) · logcat 백로그 소급덤프로 야간 갭 회수(Note20 링버퍼 실측 1시간52분에 wrap) · 자가부팅 재무장 APK(Google TV 전용 검증) · 삼성 "16일 딥슬립" 수치(공식문서 근거 없음=허구). - 기존 모바일앱 야간 스윕 = 신뢰도 사실상 0: 텔레메트리 실측sweep_done12/12 rooms=0(100% 실패),night_kakao_launch=1건뿐인데 err=0 → 예외가 아니라getLaunchIntentForPackage가 조용히 null(AndroidManifest에<queries>선언 0건, targetSdk 34 = Android11+ 패키지 가시성 필터링 대상)이 유력 원인. 단 통화녹음 수집(MediaStore)은 같은 야간 실행에서 정상 동작(오디오 5~830건) = 잠금 무관 경로임이 원시 데이터로 확인. - 권고 조합 = 상시(PC 풀스캔 주1회) + 실시간 보완(알림리스너 HTTP 직송, S25 설치) + 백필(장문 readlong, ADB 붙어 있을 때). 착수는 페페 지시 대기. - 페페 확인 필요: 카톡 "알림에 메시지 내용 표시" ON 여부(꺼지면 알림 경로 전멸) · PC 야간 상시로그인·언락 수용 여부(잠긴 PC에서 GUI 자동화 성공 여부 이 PC 미실측) · 오피스 공유기 관리자 접근권(AP격리 해제 가능하면 무선ADB 정상화). - ⚠조사 에이전트가 "text_full 원본 967개 소실 원인 불명"이라 보고했으나 실제 원인은 같은 날 페페 지시로 코디가 삭제한 것(위 🧹 항목). 재수집하려면text_full/_state.json먼저 삭제.♻️ 위 "되돌릴 수 없음"은 통화 음성에 한해 사실이 아니었음 — 831개 중 829개 자동 재수집 확인(2026-07-24 코디 실측): 현
data/calls/m4a 855개(mtime 전부 07-24)를_purged_2026-07-23.tsv와 파일명 정규화 대조 → 삭제분 829개가 동일 파일명으로 복귀(미복귀 2·신규 26). 원인 = 폰이 원본 보관(통화녹음 MediaStore 경로, 잠금 무관 수집) → PC에서 지워도 다음 수집 때 그대로 재업로드. 즉 PC 삭제는 반영구 삭제가 아니다(카톡text_full은_state.jsonresume 때문에 스킵되어 미복귀 — 통화와 다름). ⚠매니페스트 대조 시 경로 구분자가C:/dev/talklog/data\calls\…로 혼합돼 있어 basename split이 실패함 → (번호,날짜,시각) 정규화 키로 비교할 것(단순 basename 비교하면 교집합 0이라는 오판이 난다 — 실제로 1회 발생). 전사본은 애초에 삭제 대상 아님:calls/transcripts_medium857개 .txt 보존(파일명에 발화자 이름 포함)..segments.json은 통화엔 없음(전체 5개=강의·미팅용).🎯 worklog-triage 매핑 실측(2026-07-24): 목업 129건 중 122건(95%)이 원본 음성+전사본 모두 존재(48통). 미보유 7건=5통(전사본도 없음).
raw문장 → 전사본 역매핑 작동 확인(피앤알 07-22 6건 중 4건 정확 매칭, 2건은 요약 변형으로 문자열 불일치). ⚠판단단위 교정: worklogreg는 통화 시각이 아니라 파이프라인 적재 배치 시각 — 목업이 1그룹 6건으로 본 것이 실제로는 5통의 개별 통화였다. 진짜 통화 단위 = 음성 파일 1개. ("129항목→48통"은 배치 기준이라 부정확.) 정확도 병목 = STT 자체(실측 오인식: 천심·피피언·여섯 호텔·권치하시면서). 개선 순서 = ①전사 전문을 통화단위로 매핑(비용0) ②Claude 후교정(도메인 사전, 재전사 불필요) ③재전사(transcribe_meeting.pyWPROMPT재사용, CPU 부담·large-v3는 환청 이력 → 최후수단).🧹 원본 정리(2026-07-23 페페 지시, 되돌릴 수 없음): 전사 완료 음성 원본 + 마이닝 완료 카톡 원본 텍스트 1,911개 1,395MB 삭제 —
data/1.8G→405M. 내역 = 통화 m4a 831(1002MB, 조건=transcripts_medium/<파일>.txt존재 AND_pipeline_state.jsonloaded:true=PFS worklog 적재완료) + 스터디 녹음 2(356MB) + 미팅 record 1(9.7MB) + 카톡 exporttext_full/*.txt967(24MB, 마이닝_synth18모듈 산출 완료) + 구 수집분text/*.txt110(3.6MB). 보존: 전사본calls/transcripts_medium832개·.segments.json·정리본(*.corrected.txt·스터디 md)·마이닝 파생 전부(text_full/_chunks20M·_extract_merged·_dedup_*·_synth)·photos/(368M, 요청 밖)·collector/_discarded·_cleanup_testsaves(이미지라 대상 아님). 미삭제 1건 =월드유재열사장님_01053791490_20260707103348.m4a(18KB, 전사본 없음 → 보류). 삭제 매니페스트(경로·바이트) =C:\dev\talklog\data\_purged_2026-07-23.tsv. ⚠재수집하려면text_full/_state.json(collect_full resume done목록)을 먼저 지워야 스킵 안 됨.목표: 카카오 정책 위반 없이 업무 카카오톡 대화(1:1·단톡, 내 발화 포함)를 AI로 자동 정리해 현장별·상대별·날짜별 누적(노션 또는 seedchain 로컬). 비용 소액 허용. 상태: PoC 전부 통과(양방향 화면 추출 확인) · 전용 앱 제작 진입 직전 · 결정 3건 대기 (2026-06-11) PC 분기(2026-06-14): PC 2주 수집 + 처리부(현장별 1차분류) 완료 → pfs 웹 "현장 내용" 페이지로 운영 통합·배포 완료. 아이폰 확대 설계 확정(2026-06-15): 신동혁(poin03) 수집머신=Windows 확정(Mac/VM 배제). 카톡=데스크톱+kakao-collector 거의무인, 통화=iOS26 보안폴더라 "오디오 저장 탭 1회" 반자동 상한(웹조사 확정). 착수시점 미정·페페 지시 대기. 상세=design#9 +
talklog\server\IPHONE_COLLECTION_RESEARCH.md. ✅ 카톡 다중방 자동순회 구현·검증 완료(2026-06-15, app v0.17880e7a4·b4ec65e): '채팅목록 활동순' [전체 순회] — 변화있는 수집대상(37)만 진입→증분수집→업로드→다음. 온디바이스 클로즈드루프 검증 PASS(7방·5업로드, 제외 스킵, 재실행 멱등). 핵심함정 해결=Kotlin 데몬 UTF-8(한글리터럴 깨짐), force-stop 금지(접근성 비활성), 트리거 시 카톡 포그라운드. 상세=design#10. ✅ [전체순회] 통화통합(v0.18)+소리알림(v0.19)+야간 03:00 무음스케줄(v0.20). 현재 ON·무장. 🔧 수집불능 핵심버그 해결(2026-06-18, v0.21e286ed6): 폰 Tailscale 끊겨 PC(100.108.234.45) 도달불가→targets0→순회 무동작·0개였음.Config.resolveServer폴백[Tailscale→로컬WiFi 192.168.45.2 ping선택]로 해결(같은WiFi면 동작). 검증 PASS(targets37·방진입·통화78건 catch-up). Smart Lock 신뢰장소=집 등록됨→야간 카톡도 수집(locked:False). ⚠로컬IP DHCP변경시 폴백깨짐→Tailscale 상시연결 권장. 상세=design#12. 🔧 신규방 수집누락 해결(v0.22ecec9ff, 2026-06-18): 순회가 '수집'대상만 받고 신규방 스킵했음→제외만빼고 신규도 수집+PC가 신규방 '수집' 자동등록. 자동회전 범인=테스트용 monkey(앱은 무관)→껐고 am start만 씀. ⚠카톡 순회는 카톡 전면 필요(폰에서 Claude앱 쓰면 sweep_no_kakao). 상세=design#13. 🎙️ 미팅 녹음 STT→노션 플로우 1회 실행(2026-06-18, 코디):data\record\음성 260618_111137.m4a(10분25초·모아 모델하우스 발주·결제 협의)를server\transcribe_meeting.py(구축 STT=Whisper medium·ko·vad·beam5,.segments.json보존)로 전사 → 플라우드식 화자 선정(사용자 확인 A=모아 이영애 대표/B=포인 신해철 대표) → 미팅노트 구조화 → 노션 새 페이지 "2026-06-18 모아 미팅"(전체 전사 토글+STT 주의문) 저장. ⚠pyannote(화자분리) 미설치=내용기반 추정. pfs 미업로드(사용자 지시). 통화 파이프라인과 별개의 '미팅 녹음→노션' 1회성 경로. 🎙️➕ STT 정확도 향상 후속(2026-06-18, 코디):transcribe_meeting.py에WMODEL/WPROMPT(initial_prompt)/WSUFFIX지원 추가 → large-v3 + 도메인 initial_prompt 재전사(CPU int8 1.45x실시간·908s). medium 대비 고유명사 개선(포스프→포스코·단독줄게→단독주택·타우나스→타운하우스·620세대 등). 단 large-v3는 "홍보관이" 환청 반복 아티팩트 발생→medium 교차대조+도메인 교정으로 최종본*.corrected.txt작성, 노션 페이지 전사 토글·메타·주의문 갱신(화자 마커 (모아)/(포인) 부여). 산출 3종 로컬 보존(.medium/.large-v3/.corrected). 의정부는 두 모델 모두 '위정부' 오인식→교정. 교훈=large-v3가 고유명사↑이나 반복환청 위험→교정 단계 필수. 🔓 야간 화면 자동해제 구현·실기기 검증 완료(v0.26app, 2026-06-20): 야간 카톡 수집이 화면 꺼짐 상태에서 안 되던 문제 해결. Smart Lock 신뢰장소(집)면 자격증명 불필요(isDeviceLocked=0)하나 화면 재점등 시 잠금화면(keyguard)은 표시(isKeyguardLocked=true)돼 기존 게이트!isKeyguardLocked가 카톡을 건너뛰고(실측 03:36 "카톡 생략: 폰 잠금") wake lock만으론 잠금화면이 카톡을 덮었음. 신규WakeUnlockActivity(투명·showWhenLocked·turnScreenOn)가 화면 켠 뒤isDeviceLocked확인→false면requestDismissKeyguard로 무프롬프트 해제 후 카톡 순회, true(보안잠금)면 통화만.NightRunner게이트를 isDeviceLocked로 전환. 카톡 전면 함정: 잠금해제는 됐으나 카톡이 전면에 안 옴(Android14 BAL이 백그라운드 startActivity의 태스크를 전면으로 안 올림 + showWhenLocked 액티비티가 위에 고정)→v0.26 수정=액티비티 전면일 때 그 컨텍스트로 포그라운드 런치 + showWhenLocked 해제 + RESET_TASK_IF_NEEDED. ✅ 무선ADB 실기기(Galaxy S25 Android14) 화면OFF+잠금표시 상태에서 종단 검증: 화면 ON→잠금해제→카톡 전면→순회 6개 방 수집·업로드. 백그라운드 자동실행=오버레이 권한(② '다른 앱 위에 표시') 필요. publish=server/apkvc26(http://100.108.234.45:8792/app.apk 자동업데이트). 상세=app/STATUS.md2026-06-20 로그. 🔧 적재 누락 진단·복원 + 수집관리 정렬(2026-06-20, 코디): ①진단 — 06-16 이후 수집분이 PFS(worklog)에 적재 안 됨. 원인=pipeline_worker.py가 전사(Whisper)→분류(claude)→끝에 한번 적재→끝에 한번 상태저장 구조라 1800초 타임아웃에 죽으면 적재·상태저장 모두 실패→다음 실행도 처음부터 반복(악순환). state상 202통화 중 loaded 40개뿐(미적재 162=전부 06-16+). ②워커 수정 — 증분(매건 상태저장 + N건마다 flush 적재 + 0건 즉시 loaded + 분류실패만 재시도 +--since필터),talklog_server타임아웃 1800→5400. ③운영 worklog 백로그 재적재 진행(--since 20260616 --env live, 45건 전사 포함). ⚠카톡 모바일 수집(33세션/21방)은 worklog 적재 경로가 워커에 아예 없음(06-14 일괄분만 별도 1회)—구조적 공백, 추후 카톡 분류기 신설 필요. ④대화방 수집관리 정렬 — kakao_room에last_collect(폰 sweep시각) 컬럼 추가(테스트 RDS만, 운영 승인대기),gen_room_syncv3가 checkpoints.json updatedAt로 채움, pfs DAOORDER BY COALESCE(last_collect,last_active,regist_date) DESC+'최근수집' 열(master6d3b985→test). 운영은 페페 승인 후 컬럼추가+deploy-live. 상세=session-2026-06-20. ✅ 정렬 운영배포 완료 + 사용자별 개인 수집관리 분리(2026-06-20, 코디, 페페 승인): ①정렬 운영반영 — 운영 RDSlast_collect컬럼추가+동기화 채움, deploy-live3235ba1(cherry-pick, 미배포 dispatch SQL 제외). ②사용자 구분 — kakao_roomowner_user컬럼+인덱스 추가(test/live, 기존 전부 poin01=1 백필), pfs DAO 목록·통계·수집변경·비고변경을owner_user=세션 user_no로 필터(타 직원 수집 안 보임=개인 수집관리),gen_room_sync/pipeline_worker/talklog_server가 owner_user 유지(신규방=업로드 payload owner). deploy-liveb516f8c. 운영 Playwright 검증 PASS(poin01 111방·최근수집열·06-20 최신순·타사용자0). pfs master50ecb43. 함정=ssm_run원격인자 미전달→env 박은 _LIVE 변형 / pw-chrome-profile 락=chrome.exe taskkill / 워커 cp949 stdout 크래시→UTF-8 reconfigure. ✅ 통화 백로그 재적재 완료(2026-06-20, 코디): 워커 증분화 후--since 20260616 --env live백그라운드 2회(1차 SSM타임아웃+em-dash크래시→UTF-8수정 후 재실행) → loaded 202/202(미적재0, 분류실패2=비업무추정·차회재시도). 운영 worklog 161→456건(통화 49→344, 06-16~19 누락 295건 복원, regist 06-20). 재적재가 만든 owner=NULL 통화방 26개 → owner=1 백필 완료(kakao_room 137방 전부 owner=1, NULL 0). 통화 worklog는 review_status='확정'으로 적재(build_load_script 기존동작). ⚠여전히 카톡 모바일→worklog 경로 없음(구조적 공백, 별도).🎓 라이브 강의 회의록 신규(2026-06-27, 코디):
talklog\live\— 폰 브라우저(PWA)→ws PCM→faster-whisper 실시간 한국어 전사 + 주기적claude -p(구독OAuth·무과금, 통화분류와 동일방식) 회의록(주제/핵심/결정/액션). 신규 aiohttp 서버 8793(운영 8792 무손상), AudioWorklet PCM 스트리밍, VAD 세그먼트 확정/임시 분리, Wake Lock 화면꺼짐 방지. ✅ 검증=통화녹음파일 리허설(rehearse.py --realtime로 .m4a를 ws 스트리밍, 실제 서버 경로 통과) E2E 성공: medium/cpu 실시간 전사+회의록 구조화+data\lectures\lecture-*.md저장 확인. ✅ large-v3 동작확인(CPU 1.93x=실시간보다 느림→GPU 전용; 전환=envTALK_MODEL/DEVICE/COMPUTE,deploy_gpu.md). ✅ 폰 종단 검증 완료: 갤럭시 Chrome서 마이크 녹음→실시간 전사→claude 회의록 생성까지 라이브 동작 확인. 🔑 핵심 함정=Windows 방화벽(새 포트 8793/8443 인바운드 차단→폰 요청 도달 0, loopback PC만 통과; devplan 8799는 규칙있어 됐던 것). UAC/관리자 막혀 규칙추가 불가→방화벽 허용된python39(C:\Users\delix\AppData\Local\Programs\Python\Python39\python.exe, 프로그램단위 allow)로 서버 실행해 우회(venv python은 차단). 마이크=보안컨텍스트 필요→자체서명 HTTPS 8443(고급→이동1회). 기동=live\start_live.bat(python39+https8443), 폰=https://100.108.234.45:8443/. 상세=live\README_LIVE.md. 전사엔진=기존transcribe_meeting.py재사용.🔐 보안잠금(PIN/패턴) 자동해제 조사 결론(2026-06-30, 코디·vff-analyst): 일반 사이드로딩 앱(루트X)은 보안 keyguard를 비번 직접입력으로 못 푼다(안드 의도적 차단). 막힌 길=① KeyguardManager에 비번 넘기는 공개 API 없음(requestDismissKeyguard는 사람 입력 UI만) ② Device Owner
setKeyguardDisabled는 PIN 걸려있으면 무효(비번 먼저 제거 필요=닭/달걀)+삼성 Knox 제약 ③ 접근성으로 bouncer(PIN창) 직접 누르기=이론상 가능(스파이웨어 경로)하나 Android14+One UI에서 노드 가려질 수 있어 불안정·삼성 업뎃에 깨짐→야간 무인 부적합 ④ 생체인증 자동화·resetPassword=불가 ⑤ 루트=S25 Knox 영구손상 리스크. 유일 작동확인 경로=ADB(PC→폰):adb shell input keyevent 82 && input text "<PIN>" && input keyevent 66(패턴은 input swipe 좌표체인). 이미 PC-Tailscale·무선ADB 인프라 있어 적합. 권장 구조=앱이 isDeviceLocked=true면 PC에 해제요청(talklog_server에/unlock신설)→PC가 ADB로 PIN입력→수집→input keyevent 26재잠금. PIN은 PC쪽 .env에 저장(폰 앱 아님=폰 분실시 노출0). 패턴보다 PIN(숫자)이 안정적(input text 한줄 vs 좌표스와이프 기종변수). ⚠전제=무선ADB 1회 PC키 승인+상시활성, 폰 재부팅하면 무선ADB 꺼져 그 밤 해제불가→skip(재부팅 후 무인 재활성 불가). 그래서 현 Smart Lock 신뢰장소 우선 유지하고 신뢰장소 밖/재부팅후 PIN강제일 때만 ADB fallback. 구현 미착수=페페 지시 대기. 작업단위=①폰 무선ADB 상태확인 ②talklog_server/unlock+PIN env ③WakeUnlockActivityskip("deviceLocked")자리서 PC/unlock호출 ④재잠금.🎓 첫 실강 취합·devplan 등록(2026-06-27, 코디): 오늘 라이브 강의(Claude Code 비개발자 자동화, GSD 32기) 녹음 8개 중 강의 본편 4개(
lecture-20260627-080739·080804·082623·085655, talklog\data\lectures)를 취합·정리 →C:\dev\devplan\lecture-20260627-claude-code.html(강사소개·도입배경·진입장벽·참가자 니즈표·도구생태계·윈도우 설치 6단계) 생성. devplan 대시보드 상단 헤더에📚 강의노트pagetab 등록(build_dashboard.py헤더 수정 후 재빌드, index.html 241408B). http://localhost:8799/lecture-20260627-claude-code.html. 배송통화·마이크테스트(011927·022614·023323)는 강의 외라 제외. ⚠ 8793 라이브 서버가 강의 중반 일부 구간만 캡처(녹음이 8개로 쪼개진 것=세션 단절/재시작 흔적)—연속 캡처 안정성은 추후 점검.
🆕 NOW (2026-08-21(금)) — 수시·주기 통화수집 상시화 + 9일치 백로그 회수 + 통합현장 현장별 반영 ✅운영 반영 완료
페페 지시 = "S25 에서 지난번 규칙대로 수시 통화수집·주기적 통화수집 되게 설정 / field·worklog 통합현장에 수집된 통화내용 현장별 반영 처리 / 운영배포".
- 막혀 있던 진짜 원인 3개(전부 실측)
1. 무선 adb 접속 포트가 5555 로 하드코딩(
run_fusion30.WIRELESS) → 30분 배치가 6일간 노트20만 두드리고 있었다. 접속 포트는 부팅·무선디버깅 토글마다 바뀌는 랜덤 포트이고 페어링 포트와도 다르다(페페가 준35011·37207은 페어링용 —adb pair만 되고connect는 offline). → 캐시(data/_s25_adb.json) → 포트스캔(30000~50000, 61초, 30분 1회 상한) 순으로 찾는다. 실측100.106.4.88:41625로 접속·역터널·트리거 OK. 2. Groq 전사가 배포 이래 한 번도 안 돌았다 — 워커는 Python39 인데requests·sherpa_onnx가 Python312 에만 있었다(transcribe_err: No module named 'requests'가 매 통화마다, 조용히 medium 폴백). Py39 에 두 패키지 설치로 복구 → 실측engine=groq+speaker_label정상,transcripts_segs가 3 → 115. 3. 적재된 통화는field_no가 비어 통합현장 카드에 안 뜬다 — 이번주 통화 143건 전부 「현장 미연결」, 현장 카드 items 0 이었다. - 한 것 = ①수시 = 예약작업
PFS-CallCollect-5m(5분,run_collect5.vbs→run_fusion30.py --no-post --no-scan= 트리거만) ②주기 = 기존PFS-Fusion-30m유지 + autolink 를 정리본 직전에 편입 ③백로그 회수 =uploaded 143 / skipped 1110 / failed 1(8/12~8/21, 폰에만 쌓여 있던 9일치) → 전사·분류·PFS 적재까지 완주 ④현장별 반영 =_wl_autolink_run.py prod apply→ 27건 연결(현대 포항 13·롯데 화성 향남 5·넥서스 4·현대 청량리 2·삼성물산 2·고양 행신동 1) →fusion_post --live(전체) → 정리본 19행 생성(현대 포항 10·넥서스 4·현대 청량리 2·롯데 화성 향남 1·삼성물산 1·고양 행신동 1), 전사본 27건 업로드. - 검증 = 운영 브라우저
field/worklog🧩통합현장 = 현장 카드 16·통화 배지·「대기중」 배지 렌더, 콘솔 오류 0. 커밋8c1d058·2918517. PFS 제품코드 변경 0 → deploy-live 없음(1차·2차와 동일 — 데이터 반영이 곧 운영 반영). - ✅추가 지시(같은 날 13:30, 페페) = "adb 다시 연결 + 통화종료 트리거 추가" → 둘 다 완료.
- 재연결 = 포트가
41625→41041로 바뀌어 있었다(스캔 73초로 자동 발견·캐시 갱신). 포트 회전은 이제 실측 2회 — 사람이 화면 볼 필요 없다. - APK v0.30 배포 =
CallEndReceiver(PHONE_STATE) 신설 → 통화 종료 45초 뒤 기존TriggerReceiver(audio/new)알람. 매니페스트 리시버라 앱이 죽어 있어도 시스템이 깨운다 = adb·망 무관.READ_PHONE_STATE추가·pm grant완료(granted=true), 리시버 등록 확인. 서버/version도 30 으로 올려 자가업데이트 경로 일치. 커밋d739f56. - 같이 잡은 함정 = 30분 배치가 폰 prefs 에
setserver 127.0.0.1(역터널)을 눌러 놓고 가므로 adb 없는 경로가 그대로면 업로드 0건이 된다 →TriggerReceiveraudio 분기에Config.resolveServer()추가. 실측server_resolved = Tailscale,uploaded 4 / skipped 1253 / failed 0. - ⏳남은 검증 = 실통화 1건 —
PHONE_STATE는 보호된 브로드캐스트라am broadcast로 흉내낼 수 없다. 다음 통화가 끝나면 텔레메트리에call_end_armed→audio_collect가 찍힌다(감시 중). - ⏳남은 것 / 결정 필요
- 자동연결률 27/143 의 병목은 매칭기가 아니라 분류 LLM 이 쓰는 현장명(「한샘넥서스(추정)」·「광주 현장」 = 회사·지역 문구). 분류 프롬프트에 현장명 규칙을 넣는 쪽이 임계값 낮추기보다 안전하다. → 착수 지시 대기.
- 미연결 잔여 116건은 규칙대로 사람 몫(통합현장 「현장 미연결」 묶음에서 🔗 연결).
🗂 2026-06-15 폴더 통합 — 경로 전면 변경 (코디, 최우선 확인)
C:\dev에 흩어진 talklog 관련 4폴더를 C:\dev\talklog\ 하나로 통합 + git init(로컬, 커밋 b7b4a89). 구 폴더명(talklog-android·talklog-server·kakao-inbox·kakao-collector)은 더 이상 없음 — 옛 문서·명령의 그 경로는 아래 매핑으로 읽을 것:
- talklog-android → talklog\app (앱 소스, STATUS.md·MORNING_GUIDE.md 여기)
- talklog-server → talklog\server (수집서버 talklog_server.py 8792·전사스크립트·apk\)
- kakao-collector → talklog\collector (카톡 일회성 수집기·room_status_server.py 8790)
- kakao-inbox → talklog\data (수집 데이터 mobile·calls·photos·text·sites, git 제외=대용량)
- 두 서버 새 위치에서 재기동·검증(8792 /version vc14, 8790 /api/rooms 200), 시작프로그램 VBS 사본도 새 경로 반영. 빌드/실행 시 경로는 전부 talklog\*. 구 빈 폴더 kakao-inbox·kakao-collector는 OS 잠금으로 삭제 대기(무해, 승인 후 제거).
🤖 자동 파이프라인 운영 가동 (2026-06-15, 코디) — 최상위 NOW
폰 통화 → 자동수집 → 자동분석 → 운영 PFS 미검수 적재 → 검수가 무인으로 가동 중. 설계·구현 단일출처 = design-auto-pipeline.md(P1~P6 완료 기록). 핵심:
- 워커 talklog\server\pipeline_worker.py(전사 Whisper medium → 분류 claude -p(OAuth, SARA .env) → SSM 적재, 멱등). 자동트리거 = talklog_server.py 백그라운드 auto_worker_loop(업로드→instant/batch). config env=live(운영 적재).
- 앱 v0.16: 통화 4모드 수집·오디오우선·처리트리거 설정. 서버 /upload-audio·/calls-have·/config.
- pfs 검수UI(현장 내용): 미검수↔확정 토글·미검수만 필터(deploy-live ce5ee6d). 운영 통화 worklog 54건 미검수.
- STT=Whisper medium 확정(별도 Claude STT 불필요). 남은=폰 실수집 1회 운영 E2E 자연확인.
▶▶ 다음 세션 즉시 이어갈 지점 (NOW — 2026-06-14 말)
- 완료(운영 LIVE): talklog 처리부가 pfs 웹 "현장 내용" 페이지(
/field/worklog)로 통합·운영배포됨. 카톡 35방→18현장 1차분류한 worklog 112건이 운영 RDS에 적재돼 직원과 공유 가능. 상세 =projects/pfs/handoff.md(worklog 항목 5건). - 페이지 기능: 본건/AS 섹션 → 업체별 그룹 → 업체내 상차일 내림차순, 항목별 상태(진행/대기/완료/보류/제외)·비고(통합반영), 완료현장 묶음 폴드, 현장 연결/변경(미연결·오연결 재지정·인라인 검색·중복 자동취합). 사이드메뉴 현장목록 아래 "현장 내용" 링크.
- 코드: pfs
api/pfs/worklog/(dao·service·controller·model)·web/templates/basic/field/field_worklog.html·field_list.html(💬버튼)·menu_catalog field_worklog(order 215). worklog 테이블 스키마에source(kakao/call)·is_private·review_status이미 반영. - ✅✅ 1차+3차 운영배포 완료(2026-06-14, pfs master
4b3e2e6→deploy-live727f754, RDS 테스트+운영 적용·검증 PASS): - RDS 마이그레이션 완료(테스트+운영 양쪽):
kakao_room테이블 생성 + 62방 시드 적재(수집37·제외25),worklog.owner_user컬럼 추가(INSTANT·112행 유지·private 0). 메뉴field_kakao_rooms(order 216) 양쪽 INSERT. 함정:ssm_run.py는 원격 스크립트에 인자를 전달 안 함 → env path를 sed로 baked한_LIVE변형으로 운영 적용(처음 4번째 인자 무시되어 테스트로 재실행된 것을 발견·정정). - 운영 배포·검증 PASS: deploy-live Actions 성공,
pfs.poin.co.kr신규 5라우트 200 OK(/api/kakao-room/list·stat,/api/worklog/owners,/field/kakao-rooms). 운영 데이터 = kakao-room/stat{수집37·제외25}, worklog/owners 112건(진행43·대기8·완료60·보류1·private0). 운영 배포 파일·_privacy_clause반영·is_super_admin분기 0 확인. 로그인 UI E2E(브라우저)는 미수행(라우트·데이터·접근제어 컬럼은 API·정적검증으로 확인). - 남은 미검증: 실제 로그인 상태에서 (a) 비공개 토글→다른 계정 로그인 시 숨김 (b) 직원별 뷰 펼침 — 운영 Playwright 또는 페페 육안. owner_user는 전부 NULL(공용)이라 비공개 동작은 사용자가 항목을 비공개 지정한 뒤에 발생.
- ✅ 1차+3차 코드 구현 완료(2026-06-14, pfs master
4b3e2e6— 위 운영배포로 적용 완료): - 1차 = 수집여부 관리 pfs 이전: 로컬 사이드카(
room_status_server.py·:8790·대화방목록.csv·room_status.json) → pfs RDSkakao_room테이블 +/field/kakao-rooms페이지. 백엔드api/pfs/kakao_room/(model/dao/service/controller)·/api/kakao-room(list·stat·{no}/collect·{no}/note)·메뉴field_kakao_rooms(order 216). 프론트field_kakao_rooms.html(Bootstrap 검색·필터·수집/제외/보류 토글·비고). 62방 시드 SQL =kakao-collector/_kakao_room_insert.sql(_gen_kakao_room_insert.py로 CSV+json→멱등 upsert). 마이그레이션 =pfs/scripts/codi_kakao_room_migrate.py(SSM·멱등, schema+menu+seed 3 SQL). - 3차 = 직원별 통합 + 개인 접근제어:
worklog.owner_user신규 컬럼(codi_worklog_owner_alter.py·멱등 ALTER). 접근제어 =_privacy_clause:is_private=1항목은owner_user==session.user_no본인만 조회/수정, super_admin도 예외 없음(DAO에 is_super_admin 분기 0·쿼리 레벨 차단). 전 SELECT/UPDATE(단건·묶음)에 적용. 신규 API/worklog/{no}/private(토글)·/worklog/owners(소유자 요약)·/worklog/owner-items. 프론트field_worklog.html에 현장별/직원별 뷰 토글 + 항목별 🔒비공개 토글. - 검증(로컬): Python 전수 컴파일 OK · worklog DAO 14쿼리
%s/param 정합 · 접근제어 행동 테스트 PASS(user7=본인 비공개 보임·타인 비공개 숨김, user9 반대, super_admin 분기 없음). - 미적용·승인 대기(위험작업): ① RDS 마이그레이션(테스트→운영,
codi_kakao_room_migrate.py·codi_worklog_owner_alter.py) ② 62방 시드 적재 ③ deploy-live 배포. 페페 승인 후 진행. - ✅ 모바일 앱 핵심 검증 완료 (2026-06-15 01:30 KST, 코디 야간 loop): 무선ADB(Tailscale 폰100.106.4.88) 클로즈드루프로 온디바이스 추출 검증. 앱 com.poin.talklog v0.10(repo
C:\dev\talklog-android)이 카톡 대화방을 접근성으로 읽어 증분수집→PC업로드. 닫힌루프로 실버그 5개 자율수정: ①cleartext차단(usesCleartextTraffic) ②메시지=text아닌 content-desc(resource-idmessage)·nickname/time_line/toolbar_default_title_text분류 ③수집 전 바닥스크롤 ④체크포인트 날짜경계(당일이하 제외) ⑤checkpoint 첫캡처 전 확정(findRoomTitle). 동혁이방 신규델타만 정확추출(나/상대·날짜 정확)→kakao-inbox/mobile/<방>/session_*.txt(owner=poin01) 생성검증. PC서버C:\dev\talklog-server\talklog_server.py(8792 tailnet·token tlk_9f3a2c7b1e: version/app.apk/rooms/checkpoints/upload/telemetry·autostart). 트리거=adb -s 100.106.4.88:36067 shell am broadcast -n com.poin.talklog/.TriggerReceiver --es action collect|upload. 단일진실원=C:\dev\talklog-android\STATUS.md. 전부 완료(v0.14): A3세션검토(SessionStore+MainActivity 목록)·A5로컬저장/일괄삭제·B⑤대화방현황(/rooms·/history)·연락처 1838명(/contacts)·통화녹음 18건 메타(/calls, 파일명=이름_번호_일시)+오디오 12MB(kakao-inbox/calls). 앱 기능 ①접근성~⑦통화녹음+세션관리. PC서버 8792에 upload/telemetry/rooms/checkpoints/contacts/calls. 매칭·전사는 PC측 후처리(연락처+kakao_room+user 조인, 통화 전사). - ✅ 통화 전사·분석 완료 (2026-06-15 02:30, 사용자 지시 "실사용 수준까지 loop"): 로컬 faster-whisper(small·CPU)로 통화녹음 18건 한국어 전사(
kakao-inbox/calls/transcripts/) → 현장/작업 분류 17건 call worklog(kakao-inbox/calls/_call_worklog.json, source=call·owner_user=1·site·work·status·speaker·work_date·excerpt). 스크립트=talklog-server/{transcribe_calls,build_call_worklog,organize_calls}.py. pfs worklog는 이미 source[kakao/call] 지원. STT 정정: Claude는 음성전사 불가 → 전사=Whisper, 분류/요약/교정 고도화=Claude(계획). - ✅✅ 통화↔카톡 출처구분 운영반영 완료 (2026-06-15 02:50, 사용자 승인 "sql·운영배포 승인"): ① W3 적재: 통화 worklog 17건 test+prod RDS 적재(source=call·owner_user=1·미검수, 멱등
_load_call_worklog.py). ② 현장내용(/field/worklog): 출처 배지 💬카톡/📞통화 +.wl-srcCSS. ③ 대화수집여부(/field/kakao-rooms):kakao_room.source컬럼 ALTER ADD(기본 kakao) + 통화상대 11명 시드(source=call·room_type=통화·note=번호, 멱등·room_name UNIQUE 충돌안전) + dao SELECT source + 방이름앞 배지 +.kr-srcCSS. 배포: master4edc420(test) → deploy-liveed31df9(prod). ALTER를 dao배포보다 먼저 실행해 페이지깨짐 방지(핵심 순서). 검증 PASS: prod/api/kakao-room/listhttp200·call11+kakao62, worklog call17+kakao112, sample call행(피앤알남태욱상무·신동혁 등) note=번호·수집 정상. 스크립트=talklog-server/{gen_kakao_call_seed,gen_load_script,gen_call_worklog_sql}.py(calls.json→번호집계 11명). 남은=W4 Claude STT 고도화(계획)·선택 Whisper medium 재전사. 06:00 KST 폰설정 복구·대기(알람보호: stayon false·timeout원복·adb disconnect). - ▶▶ 모바일 앱 v2 확장 — 야간 자율 loop 진행 중 (2026-06-15~, 코디): 설치기기=신동승 폰, 수집 owner=poin01/user_no1(업로드·히스토리·Phase C worklog.owner_user=1 포함). 사용자 결정 5건(① 업로드=PC HTTP/Tailscale ② 방설정=pfs kakao_room/room_status 동기화 ③ Phase A→B + 앱 자동업데이트 + 야간 loop 자율작업 ④ 체크포인트=기수집 kakao-inbox/text 기반·이후 증분, 새 방="지금부터" ⑤ 로컬삭제=업로드분+전체). 재설계=증분(자동스크롤+체크포인트+디둡)→업로드전 확인→PC kakao-inbox 자동업로드→로컬 일괄삭제. 단일 진실원=
C:\dev\talklog-android\STATUS.md(loop가 매 iteration 갱신, 컨텍스트 리셋 대비). 환경: PC 100.108.234.45·폰 galaxy-s25-edge 100.106.4.88(USB 미연결). 자율규칙: 위험작업(RDS쓰기·배포) 금지·아침 승인. 아침=자동업데이트 1탭→권한→4테스트. - ✅ 모바일 앱 Phase0+Phase1 완료 (2026-06-14, 코디 직접): 결정 확정(① 트리거=반자동 [이 화면 수집] 버튼 ② 저장처=pfs worklog 공통처리부 ③ 환경=커맨드라인 도구). 개발환경 설치(JDK17·Android SDK android-34·Gradle8.7, 전부
C:\dev\tools\하위; 영속 env JAVA_HOME/ANDROID_HOME) + Phase1 수집기 APK 빌드 성공(repoC:\dev\talklog-android·com.poin.talklog·minSdk26/target34·androidx없이 806KB·APK=C:\dev\talklog-android\talklog-collector-debug.apk). 구성=MainActivity(권한안내+수집패널 트리거)+CollectorAccessibilityService(접근성 오버레이 패널 [이 화면 수집]/[중단] +rootInActiveWindow로 카톡 말풍선 DFS 텍스트 추출·bounds centerX 좌우로 상대/나 구분 →getExternalFilesDir("captures")/session_*.txtappend). 오버레이=TYPE_ACCESSIBILITY_OVERLAY(오버레이 권한 불요). 빌드=gradle -p C:/dev/talklog-android :app:assembleDebug(JDK17·약1분). ▶▶ 다음=페페 S25 설치·온디바이스 테스트(설치→접근성 ON[안드13+ '제한된 설정' 해제]→카톡 대화방에서 [이 화면 수집]→session_*.txt 확인; 검증=오버레이 표시·추출 정확도·좌/우 화자구분) → 결과 보고 후 Phase1 보정 → Phase2(증분 체크포인트·다중방·PC 전송). - ▶▶ 다음 작업(페페 지시 2026-06-14): 모바일 환경 주기적 카톡 대화 수집 구축. PC 일회성 수집·처리부·pfs 통합이 끝났으니, 이제 talklog 원래 메인 줄기 = 모바일 상시 수집으로 진입. 방향은 이미 PoC 통과(접근성 화면 스크랩, 양방향 추출) — 설계 단일 출처 =
projects/talklog/design.md(전용 안드로이드 앱: AccessibilityService + 오버레이 + 중단/재개 체크포인트, 읽기전용·발신 금지). 착수 전 결정 3건(아래 '모바일 상시 앱' 절): ① 트리거 반자동/완전자동 ② 저장처 노션/seedchain 로컬 ③ PC 안드로이드 개발환경 유무. 수집 후 처리부는 PC 분기와 공통(현장별 1차분류 워크플로_classify_workflow.js+ pfs worklog 적재 — owner_user 반드시 채울 것). 주기적 수집 = 페페 폰에서 [지금 수집] 또는 유휴 배치로 증분 수집 → PC 전송 → 분류 → worklog. 다음 세션: 결정 3건 확정 → Phase1 코디 지시문(CODI_talklog_phase1_*.md) 작성. - 통화녹음(call) 통합(추후):
source='call'로 worklog 적재(스키마 이미 반영). 갤럭시 자동녹음→텍스트변환→분류 파이프라인은 모바일 분기와 공통. - 데이터/도구: 1차분류 결과 =
kakao-inbox/_classify_sites.json(18현장·112건), 현장사전 =kakao-inbox/pfs_fields_live.json(101현장,/api/field/search운영). 워크플로 =kakao-collector/_classify_workflow.js(재실행 가능). RDS는 SSM send-command + base64(한글 LIKE는 FROM_BASE64). 운영 pfs.field가 진짜 현장 마스터(field_no 2098=GS오산).
▶ 처리부 — 현장별 1차분류 (2026-06-14 신규, 진행 중)
- 목표: 수집 카톡(수집여부 '수집'·실내용 ~35방)을 현장 단위로 재조립 → 현장별 요약 + 작업 진행건은 작업트래커 후보로 추출. 추후 통화녹음 통합(이번엔 카톡만,
sourcekakao/call 구분 필드 미리 설계). - 확정 사실/결정(이 세션):
- pfs
field테이블(426행)은 현장 마스터로 미사용 — 모든 regist/modify_date가 2026-04-23(데이터 이관)에 멈춤, 최신 현장(GS오산 등 5월말~6월) 미등록. → 현장명은 카톡 내용에서 추출, pfs 현장명 426개는kakao-inbox/pfs_fields.tsv(+.json)로 받아 페이지 인라인 자동완성 검색으로 사용자가 정식현장 연결·보완(페페 결정). RDS는 SSM send-command+base64로 읽기조회(한글 LIKE는 FROM_BASE64; AWS MCP 미연결 세션이라 CLI 경로). - 한 현장이 여러 방에 조각남(GS오산=9방: 메인단톡·동혁이·포인01·효산·효산엘피엘·선재·조운·오엠씨·제일) + 한 방에 여러 현장 섞임(동혁이·오엠씨 등에 이천AS·쌍용홍은동·포스코군산·대보파주·봉적대구MBC 동시) → 1차분류 = 방 횡단 재조립이 핵심.
- GS오산은 노션 기존 정리됨: 페이지
3739512d…e6cee5d61446+ 작업트래커 DB27573f47…(스키마: 작업명·발화자·비고·상태[진행중/대기/완료/보류]·처리담당·날짜). → 완료 제외, 6.8 이후 신규/진전만 중복대조해 추출. - 작업트래커는 pfs RDS 신규 스키마(페페 결정):
worklog(site_name·field_no NULL·source[kakao/call]·source_room·work_name·status·speaker·handler·work_date·excerpt·note). 적용은 승인 후. - 공개 경로: 사생활 가능성 → 개인(비공개) 페이지 1차 필터링 후 pfs 웹 공용 전환. 산출은 로컬 md 먼저(검토용)+HTML 프리뷰.
- ✅ 샘플 완성·Playwright 검증(2026-06-14):
kakao-inbox/sites/=_SAMPLE_GS오산양산4구역MH.md(9방 재조립·6.8후 신규11건·중복⟳표기)·_SAMPLE_봉적_대구MBC어나드범어.md(단일방 1:1 견적)·_PREVIEW_현장별정리.html(다크테마, room_manager 톤; 현장카드+출처방칩+작업트래커표[상태배지·신규/업데이트·카톡/통화 배지·날짜·방]+pfs현장 인라인 자동완성 "위례"→426개 매칭 드롭다운 실동작). 생성기=kakao-collector/_make_preview.py. - ✅ 전체 1차분류 완료(2026-06-14, 멀티에이전트 워크플로 36에이전트·77초): 페페 승인(워크플로·DB작업·라이트=일반밝은테마). 결과 35방 → 18현장 · 작업항목 112건. 산출=
kakao-inbox/sites/<field_no>_<현장>.md18개 +_PREVIEW_현장별정리.html(다크기본+라이트토글). 주요: GS오산#2098(33건·9방 재조립·6.8후만), 쌍용홍은동#2105(25건·7방), 대구MBC#2104·포스코군산#2111(각9), IS동서울산#2106(6). 워크플로=kakao-collector/_classify_workflow.js(방별 에이전트 동일 COMMON지침+현장사전+GS오산 노션중복대조, StructuredOutput, 현장키 머지), 결과=_classify_sites.json, 렌더기=_build_sites_data.py·_make_preview.py. - ✅ 핵심 확정: 운영 pfs.field가 진짜 현장 마스터(2006행·최대 field_no 2111·2098=GS오산). 초기 SSM 조회 544는 오판. 카톡 방↔라이브현장 자동매핑(업체+담당자) → GS오산=넥서스 서예진, 대구MBC=봉적 김양훈 등 정확 매칭. 현장사전 101개 =
kakao-inbox/pfs_fields_live.json(/api/field/search응답·상차일 25.12~27.06 범위). 인라인검색은 현장명+업체+담당 매칭, GS오산 자동연결 #2098 검증. - ✅ worklog RDS 스키마 적용(테스트+운영 양쪽 생성, rows=0):
worklog(worklog_no PK·field_no NULL·site_name·**source[kakao/call] default kakao**·source_room·work_name·status[진행중/대기/완료/보류]·work_date·speaker·excerpt·note·dedup_status[신규/업데이트]·review_status[미검수/확정/보류/제외]·is_private·regist/modify·remove_yn). DDL=kakao-collector/_worklog_schema.sql. 적재는 사용자 검토·필터 후(112건 미적재). - pfs UI 톤: 라이트 Bootstrap(흰 배경+다크네이비 사이드바+파란 강조), 대기=노랑·진행=파랑 배지(작업트래커와 동일 컬러). pfs 자동로그인=poin01(Chrome 프로필 자동완성→로그인 클릭→/field/list).
- 다음: 페페가 18현장 HTML 검토 → 개인(비공개) 필터링(is_private·review_status) → worklog 112건 적재 → pfs 웹 페이지(다크/라이트 토글·인라인 현장검색) 통합·공용 공개. 통화녹음 통합은 그 후(source='call', 스키마 이미 반영).
▶ PC 일회성 수집 분기 (2026-06-13 신규 — 진행 중, 모바일 상시와 별개)
- 페페 지시: 상시 모바일(S25 엣지)은 추후. 지금은 현재 PC에서 최근 2주 대화 일회성 수집(방별 텍스트+사진 원본, 동영상 제외, AI요약 없음, 대화방 목록 작성→추후 업무외 방 사용자 지정).
- 확정 결정: 공식 "대화 내보내기" 자동화 / 사진 원본 일괄 저장 / 1:1+단톡 전부(오픈채팅·채널·나와의채팅 제외) / 1방 시범 후 확대. 코워크(카카오워크)=별 플랫폼 반출불가 폐기.
- ✅ 방법 완전 확정 + 텍스트 PoC 실증(신동승 1방): 방 더블클릭→방창(title=방이름)→Ctrl+S→표준 "다른이름으로저장"(#32770) UIA제어 저장→185KB UTF-8 .txt→
parse_kakao_export.py2주필터 9건 정상. 상세 역공학(창클래스·좌표·AutomationId·내보내기 형식·안전장치)=design.md "PC 일회성 수집기" 절(단일출처). - 코드=
C:\dev\kakao-collector\(STATUS.md 참조), 산출물=C:\dev\kakao-inbox\. 환경=카톡 v26.4.0.5128·Python3.9·uiautomation 등 설치 완료. - ✅ 사진 원본 + 전체 파이프라인 완료(2026-06-14): 채팅방 서랍 역공학(≡→채팅방 서랍▶→사진/동영상→서랍창 그리드, 썸네일 우클릭→저장=앨범통째→
OneDrive\문서\카카오톡 받은 파일\KakaoTalk_YYYYMMDD_id.jpg, 저장후 모달 WM_CLOSE 필수=핵심함정). 구현:collect_photos.py(사진·신동승 7장 검증) +collect_all.py(오케스트레이터=목록행 위→아래 열기[방명=창제목]·텍스트 export·2주필터·사진·대화방목록.csv·--resume·핀 대비 연속컷오프 종료·2방 검증) +parse_kakao_export.py. 상세=design.md "PC 일회성 수집기" 절(단일출처)·kakao-collector\STATUS.md. - ✅ 전체 실행 완료(2026-06-14, 순차 서브에이전트 분할): 55방 텍스트·42방 사진·189장·제외7방. 컷오프 05-31 연속3방 초과 시 자동종료. 라이브중 2함정 수정(≡메뉴 가변→첫▶서브항목 자동탐지 / 방·서랍창 보조모니터→MoveWindow 정규화) +
--build-csv(디스크스캔 CSV 재생성, 실행중 CSV는 스크롤로 누락 가능). 산출=kakao-inbox\{text\<방>.txt(+.filtered),photos\<방>\,대화방목록.csv}, 컷오프밖 신규분_discarded\(132장·가역). - 다음(사용자):
대화방목록.csv수집여부열에서 업무외/개인방 제외표시(개인방 일부 수집됨: 외갓집 남조카방 46장·아빠 등). 영구 제외는 collect_all.pyEXCLUDE추가. 추가/재수집=--resume. 후속 = 처리부(요약 파이프라인)는 모바일 분기와 공통. - ✅ 수집여부 관리 페이지(Evidence 임베드, 2026-06-14): Evidence 사이드바 "대화방 수집관리"(
report/pages/talklog-rooms.md) → iframe →room_status_server.py(kakao-collector, 0.0.0.0:8790, stdlib 사이드카)가room_manager.html서빙 +대화방목록.csv읽어 행별 [수집/제외/보류] 토글, 결정을kakao-inbox/room_status.json에 영속(결정만 기록, 기수집 데이터 미변경). 접속 = Evidence와 동일 Tailscale IP(PC·폰). 자동시작 =room_status_server_hidden.vbs(python.exe 직접 기동, 시작프로그램 등록). 상세 =kakao-collector\STATUS.md. 추후 '현장별 내용 정리'를 이 페이지에서 확장 예정(현장 태그·메모는 다음 단계).
▶ 다음 세션 즉시 이어갈 지점 (NOW) — 모바일 상시 앱(별개 분기)
- 검증 끝. 전용 안드로이드 앱(접근성 화면 스크랩) 제작 단계로 진입. 방향 = 페페 폰 1대 + 접근성 텍스트 추출 + 오버레이 안내화면 + 중단/재개 체크포인트. 읽기 전용(발신 절대 금지).
- 착수 전 결정 3건 → 정하면 바로 Phase1 코디 지시문 작성:
- ① 트리거: 반자동([지금 수집] 버튼, 권장 — 폰 점유·리스크 통제) vs 완전자동(유휴 감지).
- ② 저장처: 노션 3-DB(현장/연락처/기록, GS건설 패턴) vs seedchain 로컬(노션 미사용 기조) vs 둘 다.
- ③ 페페 PC 안드로이드 개발환경(Android Studio/SDK) 유무 — 없으면 Phase0=환경설치.
- 권장 단계 분할: Phase1 최소 수집기(접근성 추출+오버레이+중단/재개 → 한 방 텍스트 파일 저장, UI·정책·추출 실증) → Phase2 증분·다중방·PC 전송 → Phase3 처리부(폴더감시→Claude요약→저장처).
- 설계 단일 출처 =
projects/talklog/design.md(앱 구성요소·상태머신·빌드·리스크·단계). 폐기된 탐색 이력·정책 조사 원문 =projects/talklog/archive.md.
✅ PoC 검증 전부 통과 (2026-06-11 — MacroDroid로 실증)
- 1단계 ✅ 접근성 권한 켠 상태에서 카톡 정상 동작(경고·차단 없음).
- 2단계 ✅ 카톡 대화방 화면 말풍선 텍스트를 외부 접근성 앱이 읽음 — "화면 텍스트 확인"으로 실제 대화의 "테스트" 검색 true / 없는 "aaa" false. FLAG_SECURE 차단 없음 = 화면 본문 추출 가능.
- 3단계 ✅ 양방향 확정 — "테스트"가 페페(내) 말풍선(오른쪽)에 있었고 true. 내 발화도 읽힘 → 알림 리스너 약점(내 발신 누락) 해소. talklog 기술 전제 완전 성립.
- 매크로 앱은 "검사(true/false)"만 → 전용 앱은 "전체 텍스트 변수 추출" 구현(검사 가능 = 추출 거의 확실). MacroDroid는 PoC 도구일 뿐, 본 구현은 전용 앱.