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

인계 — LIVE STT 2차 (포트 게이트 · 웹 개편 · 화면 꺼도 녹음되는 폰 앱) · 26.9.11(금) 18:1x KST

이전 세션이 컨텍스트 50% 근접으로 넘긴다. 설계는 페페가 그릴링 4묶음으로 전부 확정했다 — 다시 묻지 마라. 계획 정본 = C:\dev\devplan\livestt-v2-plan.html (http://100.108.234.45:8799/livestt-v2-plan.html) — 확정표 · Fable 계획 · 코덱스 검토 10항목 반영표. 순서 = A 포트 게이트 → B LIVE STT 웹 → C 폰 앱. 착수 전 C:\dev\seedchain\rules\tooling.md 체크리스트+🆕 사전 읽기(규칙).

▶ 첫 일감 = 이것부터

✅[코디] 26.9.11 19:05 KST — 1·2 끝. portgate selftest 13/13 · check 8444=ok(tailscale 소유) · check 8445=ok · scan 불일치 2(8812·8815 다운, 기존 곁발견). ASK-487E28 「해제」(19:03) → unlock → INITIAL_RULES 에 port-unregistered + selftest 튜플 + 「규칙 12개」 + mark() 가 ledger detector:null 을 INITIAL_RULES 로 자동 연결 → --selftest 62/62 · 탐지기 15/15 · mode record(detector_ok 19:05, 26.9.12 00:07 KST 부터 block). C:\dev\tools\ruleguard\·portgate\ 는 tools 리포 미추적 폴더라 커밋 없음. ✅[코디] 20:1x KST — 3(B 웹) 끝. talklog fbacb57(26.9.9 신뢰성 코드 기준선) → b7b92eb(B) → 8c0854d(검수 보완). - API = GET /api/items · GET/PATCH /api/items/{ts}(부제 고치면 잠금) · POST /api/items/{ts}/continue(새 sid 발급, ts 유지) · POST /api/merge(202, 백그라운드) · ws start.continue_ts · ws watch(소리 없는 구독). 정본 = lecture-<ts>.json(md 는 파생). - 검증 = _test_live wav 40.0/40.0초·화자 2 · _test_items 이어녹음 40초·합치기 880000=640000+240000·원본 보존·잠금 유지·음성없음 400 · Playwright 412/1280 13px 미만 0·가로스크롤 0 · https://100.108.234.45:8445/ 200(서버 로그 IP 100.108.234.45). - 검수 보완 = 날짜 zero-pad(옛 json 제목 5건도) · 옛 항목 흐린 버튼·00:00 · 부제 말줄임 · 정리본 늦은 덮어쓰기(notes_loop, 26.9.9부터) · 테스트 teardown(자기 것만). - ⚠B 에이전트가 C:\dev\talklog\data\lectures 에서 rm -f lecture-20260911-* 2회(승인 없음) — transcript 대조로 지워진 건 자기 테스트뿐. 테스트 잔재 3건 = C:\dev_attic\2026-09-11\talklog-live-test\. ruleguard danger-delete-unapproved 등록·태그. - 서버 = PID 22044 후속 재기동(Start-Process 경유, 부모 = bat 의 cmd). 재기동 절차 = talklog rules.md 🆕. - 남은 것 = 페페 실기 육안(S25·노트북 — 크림 테마·색맹·폰트) · 합치기 결과 제목 규칙(지금 = 합친 시각, 명세 없음) · viewer 실시간 UI 는 C 에서. ➡️4(C 앱) = 새 인계문 C:\dev\seedchain\projects\talklog\relay-2026-09-11-livestt-c-app.md(20:5x S25 무선 ADB 연결 · 인증서 = tailscale serve 정식 8446, 페페 선택 · 환청 수정 2db27de 반영 뒤 넘김). ✅[코디] 20:31 KST — ruleguard 새 규칙 danger-delete-unapproved 연결 완료(ASK-491234 「해제」 → 아래 ①~④ 수행 · --selftest 63/63 · 탐지기 9개 전부 통과 · detector_ok 20:31 · mode record — judge 라 페페 confirm 전엔 차단 안 함). 이력: 탐지기 C:\dev\tools\ruleguard\detectors\danger-delete-unapproved.py 작성 · 단독 selftest 19/19(26.9.11 실사고 명령 차단 · Temp/scratchpad/pycache·단일 파일·mv attic·grep/echo 통과). kind=judge 라 연결돼도 페페 confirm 전엔 차단 안 함. 페페 「해제」 → ①python C:/dev/tools/ruleguard/ruleguard.py unlock C:\dev\tools\ruleguard\ruleguard.py --ask ASK-491234 ②ruleguard.py 두 곳: selftest 탐지기 튜플(≈1319행) → for rid in sorted(dets):(탐지기 파일 전부) · mark() 의 INITIAL_RULES 연결 줄 → if not r.get("detector") and rid in dets: r["detector"] = rid (다음부터 새 탐지기에 해제가 필요 없다) ③--selftest → report --rules 에서 detector_ok 확인 ④C:\dev\seedchain\rules\tooling.md ruleguard 🆕 줄(「INITIAL_RULES+튜플 필요」)을 새 동작으로 고친다.

  1. A 결과 확인(서브에이전트가 만들었다 — 결과 요약은 아래 「A 에이전트 보고」) PYTHONUTF8=1 python C:\dev\tools\portgate\portgate.py --selftest PYTHONUTF8=1 python C:\dev\tools\portgate\portgate.py check 8444 # tailscaled 선점 = shadow/tailscale 판정이어야 한다 PYTHONUTF8=1 python C:\dev\tools\portgate\portgate.py check 8445 # ok PYTHONUTF8=1 python C:\dev\tools\portgate\portgate.py scan # 남은 불일치 목록(숨기지 말고 보고) 산출 = C:\dev\tools\portgate\{PORTS.md, portgate.py, scan_daily.vbs, _scan.log} · 탐지기 C:\dev\tools\ruleguard\detectors\port-unregistered.py · 예약작업 \Cody\portgate-scan(매일 09:10).
  2. A 연결 — ruleguard 탐지기를 차단으로 올린다. ruleguard 는 탐지기 목록이 코드에 박혀 있다(ruleguard.py 의 INITIAL_RULES 딕셔너리 + --selftest 의 탐지기 튜플 ≈1319행). add-rule 로 만든 규칙은 detector: None 이라 절대 차단으로 안 올라간다. ⚠ruleguard.py 는 가드 파일 — 우회 금지. 절차: - cd C:\dev && PYTHONUTF8=1 python tools/notify.py ask "ruleguard.py 잠금해제 요청 — 포트 게이트 탐지기(port-unregistered) 연결용 30분. 규칙을 끄는 게 아니라 새 탐지기 1개 추가. 답: 해제 / 유지" - ✅질문은 이미 보냈다 = ASK-487E28(26.9.11 18:1x KST) — 다시 묻지 말고 답만 확인한다. 탐지기 자체검사 15/15 · ruleguard.py --selftest 61/61 통과, 규칙은 지금 nag(count 2 · detector 미연결 → 연결 전까지 매 턴 종료가 한 번씩 막힌다). - 페페 해제 → PYTHONUTF8=1 python C:/dev/tools/ruleguard/ruleguard.py unlock C:\dev\tools\ruleguard\ruleguard.py --ask ASK-487E28 - INITIAL_RULES 에 "port-unregistered": {"kind": "auto", "doc": "C:\\dev\\tools\\portgate\\PORTS.md#규칙", "detector": "port-unregistered", ...}(기존 항목 형식 그대로) + selftest 튜플에 id 추가. 장부(ledger.json)에 이미 add-rule 로 들어가 있으면 그 항목의 detector 도 맞춰야 한다 — unlock 창 안에서 ruleguard 자신의 명령/코드로. - PYTHONUTF8=1 python C:/dev/tools/ruleguard/ruleguard.py --selftest(detector_ok 기록) → ruleguard.py report --rules 에서 port-unregistered mode 확인(count≥2 + detector_ok + enforce_from 지남 → block).
  3. B LIVE STT 웹 구현 — 기준 = web-designer 목업 C:\dev\talklog\live\_design\{spec.md, mockup.html, 스크린샷} + 계획 페이지 B절. 서브에이전트 위임 권장(컨텍스트 절약) + Monitor 5분 생존감시(부수효과 = 산출 폴더 mtime). 끝나면 tailnet IP(https://100.108.234.45:8445/)로 실접속 검증 + Playwright 412/1280px + 기존 _test_live.py 통과 유지.
  4. C 폰 앱 — S25 감시가 텔레그램 「S25 ADB 연결됨」을 보내면 착수. 계획 페이지 C절 + 코덱스 반영표(인증서는 NSC 신뢰앵커 또는 tailscale serve 정식 인증서(추천) — 이 선택만 C 착수 때 결정, 포트는 게이트로 claim).

A 에이전트 보고 (이전 세션이 채움)

✅ 서브에이전트 완료(26.9.11 18:2x) — 연결(첫 일감 2번)만 남았다. - 생성 = C:\dev\tools\portgate\PORTS.md(51행, ## 규칙·## 알려진 문제) · portgate.py(check/claim/scan/free, selftest 13/13) · scan_daily.vbs · _scan.log · 탐지기 C:\dev\tools\ruleguard\detectors\port-unregistered.py(15/15) · 예약작업 \Cody\portgate-scan(1회 실행 → 텔레그램 1회 {"ok":true}) · add-rule port-unregistered --seed 2 등록(mode nag). - 수정 = C:\dev\tools\cdp-profiles\PORTS.md(표 제거·포인터·런처 절차 유지) · rules\tooling.md 🆕 1줄 · C:\dev\CLAUDE.md §4 포인터(메인 세션). - 검증 = check 8445 ok · claim 8445 거부(exit 2) · free 8446~8499 중 54개 · check 8444 = ok(tailscale 소유 — live 가 8445 로 옮겨 경쟁 리스너가 없으니 shadow 가 아니다) · scan 불일치 2건(8812·8815 다운) · 한 회차에 8917 일회성 리스너(곧 사라짐, 원인 미상). - 🔴알려진 문제 — C:\dev\korace 가 없다(26.9.2 C:\dev_attic\2026-09-02\korace 로 이동) → 예약작업·Run 키가 죽은 경로, 그런데 Funnel 8443 은 여전히 공개 · photoapp Run 키가 옛 경로(_inbox\안전평가-2025\…) · 8788 seedchain-mcp·serve 이중(서버에 사용중 건너뛰기 가드 있음) · 8801 기본값 중복 · CDP 9336 중복 · 9338 런처 없음. 전부 미조치 — 페페 판단.

B 목업 보고 (이전 세션이 채움)

✅ web-designer 완료(26.9.11 18:2x) — C:\dev\talklog\live\_design\spec.md · mockup.html · 스크린샷 7장(shot-list-412/1280 · shot-record-412/1280 · shot-record-disconnected-412 · shot-item-412/1280). 412·1280px 실측 PASS(13px 미만 0 · 가로스크롤 0 · 버튼 잘림 0). - 색 = 크림 #F7F0E2 · 카드 #FFFFFF · 본문 #2B2118(13.9:1) · 보조도 다크브라운 #5A4636(7.8:1, 연회색 금지) · 테라코타 #9C4425(흰글자 6.4:1). 상태 4색 = 파랑(정상)·호박(지연)·빨강(끊김)·초록(완료) + 아이콘·굵기 병기. 「끊김」만 배경색 칩(빨강 tint + pulse + ⚠️). - 레이아웃 = 모바일 1열 + 하단 고정 큰 버튼 · 데스크톱 카드 2열(1040px 컨테이너), 액션은 상단바로 · 녹음/항목 화면은 720px 리딩 컬럼. 탭 기본값이 화면마다 다르다(녹음 = STT 먼저, 항목 보기 = 정리본 먼저 — 의도). - 구현 시 필수 — ①그리드 아이템 min-width:0 + .list-body{width:100%}(목업에서 고친 P1 2건) ②app.js SPK_COLORS 를 spec 1-4절 6색으로 전면 교체(안 바꾸면 크림 바탕에서 대비 1~2:1) ③manifest.webmanifest theme/background 색 교체(FOUC) ④기존 DOM id(#tx #notes #status #rec)가 새 마크업과 안 맞음 → app.js 재배선 ⑤WebView edge-to-edge 없으면 safe-area-inset-bottom=0(C 에서 확인). - 사람 눈 = 색맹 시뮬레이션 · 실기 폰트 폴백 줄바꿈 · pulse 강도. 제안 = 날짜 헤더 「오늘 N건」 · 정지 후 이탈 시 완료 신호(진동/배지).

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

끝난 것 (26.9.11)

남은 것 · 페페 몫

손대면 안 되는 것

보고 마커

시드 포인터