7.9 KB · 수정 2026-09-23 02:10
목차

인계 — LIVE STT 2차 C · 폰 앱 「LIVE STT」(화면 꺼도 녹음) · 26.9.11(금) 21:0x KST

이전 세션(컨텍스트 40.8%)이 C 착수 직전을 끊는 지점으로 잡고 넘긴다. 설계는 확정 — 다시 묻지 마라. 계획 정본 = C:\dev\devplan\livestt-v2-plan.html(http://100.108.234.45:8799/livestt-v2-plan.html) 「C. 폰 앱」 절 + 「코덱스 검토」 표(10항목 반영). A(포트 게이트)·B(웹) 완료. 앞 인계문 = C:\dev\seedchain\projects\talklog\relay-2026-09-11-livestt-v2.md.

▶ 첫 일감 = 이것부터

  1. 사전 읽기 — C:\dev\seedchain\rules\tooling.md 「자주 실수 체크리스트」+🆕 · C:\dev\seedchain\projects\talklog\rules.md 🆕 맨 위 6줄(26.9.11: 환청·정리본 덮어쓰기·테스트 teardown·재기동) · 계획 페이지 C절·코덱스 표.
  2. S25 연결 확인 — C:\dev\tools\platform-tools\adb.exe devices -l → SM_S937N 이 device 여야 한다(26.9.11 20:56 = 100.106.4.88:37941, 무선이라 포트는 재연결마다 바뀐다 — 현재값은 C:\dev\talklog\data\_s25_watch.log 의 serial=). 노트20 = R3CR103JBBY(USB).
  3. 서버 먼저(C:\dev\talklog\live\live_server.py) — 계획 C절 그대로: - POST /ingest?sid=&seq= — 폰이 5초 청크를 올린다. (sid, seq, hash) 를 디스크에 영속한 뒤 ACK · 같은 seq 다른 hash = 오류 · 빠진 seq 면 409 + 기대 seq · 중복은 무시(멱등). 받은 PCM 은 기존 Session.add_pcm 경로(= wav 실시간 저장 · 전사 루프)로 넣는다. - 세션 정지 API(앱 알림의 「정지」 버튼용) · /version + /app.apk(자가업데이트, 통화앱 UpdateChecker 방식 참고). - 이어 녹음 규약 유지 = 항상 새 sid + 기존 ts(POST /api/items/{ts}/continue). 기존 신뢰성 장치(SESSIONS 600초·heartbeat·tlock·finalize=create_task·notes_loop 마감 후 폐기) 건드리지 마라. - 검증 = 신규 C:\dev\talklog\live\_test_ingest.py(순서 뒤섞기·중복·빠짐 409·재시작 후 복구 → wav 프레임 = 보낸 프레임) + 기존 _test_live.py·_test_items.py 통과 유지. 테스트는 자기가 만든 ts 만 지운다(날짜 glob rm 금지).
  4. 인증서 = tailscale serve 정식 인증서(페페 선택 26.9.11 20:5x): - python C:/dev/tools/portgate/portgate.py claim 8446 "LIVE STT 앱(tailscale serve 정식 인증서)" tailscaled → tailscale serve --bg --https=8446 https+insecure://127.0.0.1:8445(tailnet 전용 · Funnel 아님 · 기존 serve/funnel 항목은 절대 안 건드린다). 26.9.11 check 8446 = free. - 앱·노트북 주소 = https://poin-mini.tailc5d3c1.ts.net:8446/ → 경고 0, 앱에 지문 핀 불필요. wss 가 serve 를 통과하는지 먼저 실측(_test_live.py 를 이 주소로 한 번). - ruleguard port-unregistered 가 26.9.12 00:07 KST 부터 claim 안 된 포트의 tailscale serve 를 막는다 — claim 먼저.
  5. 앱 = 서브에이전트 위임 권장(컨텍스트 절약) + Monitor 생존감시(신호 = ...\subagents\agent-<id>.jsonl mtime + 산출 폴더). 🔴브리프에 「삭제 금지(필요하면 목록만 보고) · 테스트는 자기 것만 teardown」 명시(26.9.11 B 에이전트 무승인 rm 사고). - 새 프로젝트 C:\dev\talklog\livestt-app, 패키지 com.poin.livestt, target/compile SDK 34(사내 사이드로드). - WebView = 위 8446 주소 그대로(웹 화면 재사용) + JS 브리지 LiveNative(addWebMessageListener, onReceivedSslError 에서 proceed 금지). - 포그라운드 서비스(마이크) — RECORD_AUDIO 승인 후 Activity RESUMED 중에만 시작 · 즉시 startForeground · 부팅 자동시작 없음 · START_STICKY 에 기대지 않음 · 알림에 녹음 상태 + 정지 버튼. - AudioRecord 16k mono → 전용 읽기 스레드 → 5초 청크 .part 연속기록 → fsync → close → 원자적 rename → 저널 · 재실행 시 복구. 업로더 = 녹음 스레드를 안 기다린다, 최선노력 + 재시도, 서버 ACK 후에만 삭제. - AudioRecordingCallback.isClientSilenced()(전화 선점) → GAP 구간 기록·화면 표시 · DEAD_OBJECT 는 AudioRecord 재생성. 수동 PARTIAL_WAKE_LOCK 기본 금지(dumpsys 로 누락 확인 후에만). - 첫 실행 온보딩 = 배터리 「제한 없음」 + 「절전하지 않는 앱」 안내(삼성 수면·딥슬립). 자가업데이트. - 네이티브 화면(온보딩·알림)이 생기면 web-designer 상담 먼저(폰트 하한 13px). WebView edge-to-edge 에서 safe-area-inset-bottom 이 0 이 아닌지 확인(B 목업 지적 ⑤). - 빌드 = JAVA_HOME=/c/dev/tools/jdk-17 /c/dev/tools/gradle-8.7/bin/gradle -p /c/dev/talklog/livestt-app :app:assembleDebug --no-daemon(gradlew 없음 · SDK C:\dev\tools\android-sdk platform 34 · build-tools 34). - 설치 = adb -s <S25 serial> install -r <apk> → 권한 부여 확인.
  6. 수용 기준(계획 C절) — S25 화면 끈 채 30분+ 녹음 → wav 길이 = 실제 시간(±2초) · 비행기모드 5분 끼워도 갭 0 · 전화가 마이크를 뺏었다 돌려줘도 이어짐. 「유실 0」은 절대값이 아니라 손실 상한(강제 종료 시 기록 중 조각 1초 이내). ⚠화면 끄기·비행기모드·전화는 페페 물리 조작 — 절차를 텔레그램(notify.py ask)으로 보내고 결과는 서버 로그·wav 로 코디가 판정.
  7. 끝나면 계획 페이지 C절 진행 ✅ · C:\dev\seedchain\projects\talklog\handoff.md · C:\dev\seedchain\HANDOFF.md 26.9.11 절 · 함정은 rules.md 🆕.

확정 규약 (페페 결정 — 다시 묻지 말 것)

끝난 것 (26.9.11)

남은 것 · 페페 몫

손대면 안 되는 것

보고 마커

시드 포인터