← 작업일지

2026-05-15 · v1.0.1

2026.05.15 작업일지 v1.0.1

14:30~17:55 KST 오후 세션. mac-mini Claude Code 라우팅 transition 정리 마무리 (PR #18/#19/#41 + DEPRECATED #22) + D11 dual-reviewer 병렬 dispatch + plan defect fix + push + 인프라 forcing function 2종 (env-tool.sh + mcp-spawn-verify hook) + docs PR 5건 + 토큰 누수 1회 + stale 브랜치 false start 1회.

오후의 궤적

오전 v1.0.0 직후 /clear 후 강대종이 “추천대로 ㄱㄱ” + “다이나믹하게 가자” 발화로 오후 세션 시작. 토큰 윈도우 35% 잔여 상태에서 (1) mac-mini-directive 신규 → (2) D11 dual-reviewer → 잔여 자율 픽 으로 흘러감.

핵심 사고 2건이 forcing function 박았다:

  • 14:55 KST 즈음 .env redact regex [A-Z_]* 가 digits 포함 키 이름 매칭 못 해서 codex/jarvice 봇 토큰 raw 값 conversation 컨텍스트 누수. 외부 노출 0 단계지만 같은 패턴 2026-05-10 재발 → memory feedback_credential_handling_safety + env-tool.sh (PR #20, 값 stdin only, redact-by-design) 으로 영구 차단.
  • 17:40 KST 즈음 stock_monitor 작업 시 로컬 main(4f19d26, 2026-05-04) 기반으로 PR #10 만들었는데 origin/default 가 사실 master + 7+ commit 진척이라 not mergeable. PR close + base 재잡고 PR #11 신규로 회복. memory feedback_stale_branch_origin_default_check 박제.

총 산출:

  • claude-automations 5 PR (PR #18 mac-mini-directive / #19 agent-msg-notify cleanup / #20 env-tool / #21 mcp-spawn-verify / #22 codex-directive DEPRECATED)
  • claude-skills 1 PR (#41 routing 매핑)
  • agent-fleet-state D11 fix + push (08d9851 + aa9cf8e)
  • yakmukja 2 PR (#8 README / #9 BACKLOG close)
  • dutch_pay_calculator 1 PR (#7 README + BACKLOG P0/P1 stale close)
  • simple_memo_app 1 PR (#7 docs/feedback 표 갱신)
  • stock_monitor 1 PR (#10 close + #11 신규)

mac-mini Claude Code 라우팅 transition 마무리

2026-05-14 mac mini Codex/OpenClaw → Claude Code 5번째 노드 전환 후, 오전 /loop-fleet 사이클 1+2 둘 다 mac-mini 슬롯 receipt 0 (codex-directive.sh 가 옛 Telegram broadcast + ~/agent-inbox JSON queue 패턴 그대로) 한계 노출. 오후에 4 PR 묶음으로 정리:

  1. PR #18 (squash 46a8c80)mac-mini-directive.sh 신규. notebook3060-directive.sh / wsl-directive.sh 패턴 따라 SCP + tmux ‘claude’ load-buffer + paste-buffer + Enter. mac-mini Apple Silicon homebrew 라 비대화 ssh PATH 에 /opt/homebrew/bin 없음 → tmux 풀패스 (/opt/homebrew/bin/tmux) 강제. 라이브 검증 = mac-mini tmux 캡처에 probe directive 본문 도달 + Claude Code thinking 49s + hostname=mac-mini | time=14:45 KST | bot=@ssamssae_claw_bot 자기 식별 reply 도착.

  2. PR #41 (claude-skills, squash 4dd7496)globals/CLAUDE.md 라인 128 macmini 라우팅 codex-directive.shmac-mini-directive.sh swap + loop-fleet/SKILL.md 라인 129 ASSIGN[macmini] paste 매핑 동일 swap.

  3. PR #19 (squash 9a09e9c)agent-msg-notify.sh 의 macmini 분기 dead SSH/JSON inbox write 블록 surgical 제거 (7 라인 deletion). Telegram broadcast 는 유지, mac-mini Claude Code 가 plugin:telegram 으로 직접 수신.

  4. PR #22 (squash a01783e)codex-directive.sh 헤더에 DEPRECATED 메모 7라인 추가. 기능 제거 X, 옛 워크스페이스용 보존, 새 디폴트 가이드 명시.

라이브 receipt 검증으로 issue forcing function (issues/2026-05-15-codex-directive-routing-stale.md) 5 priority 항목 모두 처리.

D11 dual-reviewer + plan defect fix + push

fleet-director v1 Day 11 implementer commit 08d9851 (“summary 정시 + alert 라우팅 + device-health + launchd plist 4개”, 2026-05-15 07:16 KST 생성, push 안 됨) 위에 dual-reviewer 사이클:

  • spec-reviewer (worktree isolation, general-purpose agent) — plan §11.1~11.5 compliance + 양 기기 parity. 판정 PASS-with-flags. defect 둘 다 implementer self-report 인정.
  • code-quality-reviewer (worktree isolation, parallel dispatch) — shellcheck + plan-code divergence 추적. 판정 FAIL. fix candidate A 명백 우위 (B nullglob 단독 insufficient, C 국소 set+e toggle surgical 위반).

두 reviewer 합의 = { grep ... 2>/dev/null || true; } | wc -l | tr -d ' ' braces + ||true wrap. surgical 2-line diff, side effect 0.

적용 (commit aa9cf8e):

  • scripts/summary.sh line 14 BLOCKED_COUNT wrap + line 35 MID dead code 제거
  • scripts/device-health.sh line 8 RECENT_FAILS wrap + line 12 git commit no-op 가드 (git diff --cached --quiet || git commit)

smoke test 3종 (비병렬, 메모리 룰 준수):

  • bash scripts/summary.sh → exit 0 (15:01 KST 텔레그램 1통 도착)
  • bash scripts/alert.sh blocked_gate "..." → exit 0
  • bash scripts/device-health.sh → exit 0 (5/5 fail 누적 없음, no-op pass)

plan-fleet-director-2026-05-10.md §11.1/§11.3/§11.4 동기 갱신 (local-only file, repo 없음). §11.4 system install 가드 inline 추가.

push origin/main = 강대종 명시 ack 17136 후 진행. origin HEAD = aa9cf8e. D11 close.

인프라 forcing function 2종

env-tool.sh — .env 안전 핸들링 헬퍼 (PR #20, squash 924ffba)

토큰 누수 사고 후속. scripts/env-tool.sh 신규, 4 명령 (has-key / ensure / rotate / list) 모두 값은 stdin only — 명령행 인자 X (ps 안 보임), set -x 안 켜기, error 메시지 안에도 값 X. ad-hoc grep/sed redact 패턴 폐기.

scratch /tmp/test.env 8 smoke 시나리오 모두 PASS:

  1. has-key absent → exit 1 + “absent”
  2. has-key present → exit 0 + “present”
  3. ensure 신규 append → “ok: added”
  4. ensure 멱등 → “ok: present”
  5. rotate atomic replace → “ok: rotated”
  6. rotate missing → exit 1 + error
  7. list 키 마스킹 → ”=***”
  8. file content 무결성

5 노드 deploy (Mac본진/mac-mini/desktop3060ti git pull, WSL/notebook3060 SCP — claude-automations diverge 이슈 우회).

mcp-spawn-verify.sh — SessionStart MCP spawn 검증 hook (PR #21, squash c1ea86e)

hooks/mcp-spawn-verify.sh 신규. 5초 wait (env MCP_SPAWN_VERIFY_WAIT override) 후 pgrep -P $PPID 자식 ≥ 1 검증, 0이면 텔레그램 경고 1통 (cache rm + plist PATH 점검 가이드 inline).

claude 본체 식별 = $PPID 우선 + ps 스캔 fallback (launch flavor 차이 --channels vs --dangerously-skip-permissions 무관).

5 노드 settings.json SessionStart 배열 append (각 backup .bak.2026-05-15 + JSON validated). Mac본진 + mac-mini + WSL + desktop3060ti + notebook3060.

2026-05-14 mac mini plugin cache 사고 (launchd plist PATH 누락 → bun spawn 침묵 실패) 의 보조 forcing function. PATH 외 다른 원인 검출용.

5 노드 .env TELEGRAM_BOT_USERNAME backfill

PRIMARY 봇 식별 채널 강제 활성 (emoji 자기 정체성 오인 forcing function, 2026-05-14-macmini-self-identity-default-mac-bonjin.md 예방). 이미 mac-mini 만 2026-05-14 23:41 backfill 되어 있었고, 잔여 4 노드 처리:

  • Mac 본진: MyClaude_ssamssae_bot
  • WSL: Myclaude2_ssamssae_bot
  • desktop3060ti: jarvice_ssamssae_bot
  • notebook3060: 기존 @ssamssae_codex_bot 보존 (@ prefix 차이 cosmetic, 동작 영향 0)

재기동은 안 건드림 (다른 노드 active tmux ‘claude’ 세션 죽이는 거 비가역) — 자연 session 전환 시 picks up.

이 과정에서 위에 적은 토큰 누수 사고 발생 → env-tool.sh forcing function 으로 영구 차단.

docs PR 묶음 (5 앱)

5 앱 README/BACKLOG stale 정리:

PRsquash처리
yakmukja#8b697a1a기본 Flutter 템플릿 README → 실 README + iOS-only 배포 정책 명시
yakmukja#9ef32af4BACKLOG P1 ‘iOS-only 운영 정책 명시’ close 표기
dutch_pay_calculator#7303e8b7README 배포 정책 섹션 신설 + BACKLOG P0 GAD (3c5daa7 에 이미 적용됨) + P1 iOS-only close
simple_memo_app#7715a413docs/feedback README 의 반영 상태 표 stale 행 갱신 (Privacy ✅ 반영 / ASO 부분+draft)
stock_monitor#1129403da보일러플레이트 ‘Getting Started’ → KRX 전환 후 실 상태 반영 (KRX OTP 1차 + Yahoo Finance 폴백 + portfolio summary widget + 목표가 알림)

stock_monitor 는 PR #10 false start (local main stale, master vs main 함정) 후 회복 — 위 학습 섹션 참조.

인프라·스킬·자동화

  • 메모리 2건 신규: feedback_credential_handling_safety.md (.env redact 룰) + feedback_stale_branch_origin_default_check.md (origin/default 체크 룰).
  • todos.md 진행중 2 항목 취소 섹션 이동 (codex 폐기 후 의미 X): DIR 6 Codex→WSL wsl-inbox-write.sh + WSL ↔ Codex 릴레이.
  • todos.md 진행중 6 항목 [x] 마킹 (실제 작업 완료 후 inline 근거 박음).
  • /goodnight 자동 매칭 step 1.5: 3건 추가 [x] (KRX API 연동 / 약먹자 디자인 / 더치페이 디자인 — 다 stale 인지 누락).

학습·상담

  • ad-hoc regex redact 는 신뢰 불가. [A-Z_]* 한 글자 잘못 — digits 포함 식별자 미스. 도구로 강제 (env-tool.sh) 만이 영구 방법.
  • 자주 안 만지는 repo 작업 전 origin/default branch (master vs main) 와 local 뒤처짐 fetch+비교 필수. local main 이 사실 origin/master 의 옛 spike 일 수 있음.
  • dual-reviewer 합의 패턴: spec + code-quality 병렬 dispatch (worktree isolation) → fix candidate 표 1줄 정리 → 합의 명시 → 적용. D09 sweep family 4라운드 사고 메모리 (feedback_subagent_no_push_isolation) 룰 inline 박힘.
  • BotFather 토큰 rotate 는 인간 클릭 필수 → “강대종 손0 으로 진행” 명시 시 자동화 불가 항목은 솔직히 보고 + 취소 가닥 surface. 17165 ack 로 rotate 취소 결정.

남은 작업

  • mac-mini local main 정리 (conditional, 보류) — fleet-state mac-mini 가 push-race 진 orphan fixture commit 누적, git pull --ff-only 거부. test harness push 격리 follow-up 처리 후 자연 해소 가능성 우선.
  • WSL claude-automations diverge 해결 (R1 ff pull + R2 .bak 정리) — 강대종 ack 후 WSL 에 directive.
  • yakmukja BACKLOG P1 잔여: 런치 이미지 placeholder 검사 hook + iPad13 스크린샷 슬롯 검증.
  • dutch_pay_calculator BACKLOG P0 잔여: 광고 통합 검증 hook.
  • memoyo 1.0.4 enhancement (b) in_app_review 패키지 + ReviewService + AppBar PopupMenu 적용 — 코드 미적용 (draft 만).
  • 11.4 launchd plist 4개 system install (scp + launchctl load) — D07 카테고리, 별도 ack.
  • SessionStart MCP verify false positive 모니터링 = 다음 며칠.

관련 커밋

repoSHA메시지
claude-automations46a8c80scripts: mac-mini-directive.sh — mac-mini Claude Code 노드용 directive paste 운반체 (#18)
claude-automations9a09e9cscripts: agent-msg-notify.sh — macmini agent-inbox JSON write dead branch 제거 (#19)
claude-automations924ffbascripts: env-tool.sh — .env 안전 핸들링 헬퍼 (값 stdin only, redact-by-design) (#20)
claude-automationsc1ea86ehooks: mcp-spawn-verify.sh — SessionStart MCP server spawn 검증 (#21)
claude-automationsa01783escripts: codex-directive.sh DEPRECATED 헤더 명시 (#22)
claude-skills4dd7496mac-mini Claude Code 노드 라우팅 — CLAUDE.md + loop-fleet SKILL.md (#41)
agent-fleet-stateaa9cf8efix(D11): set -euo pipefail × grep 0-match defect — braces + || true wrap
yakmukjab697a1adocs(README): 기본 Flutter 템플릿 → 약먹자 실 README + iOS-only 배포 정책 명시 (#8)
yakmukjaef32af4docs(BACKLOG): P1 README iOS-only 정책 항목 close (PR #8 머지) (#9)
dutch_pay_calculator303e8b7docs: 더치페이 README 배포 정책 + BACKLOG P0/P1 stale 항목 close (#7)
simple_memo_app715a413docs(feedback): 반영 상태 표 stale 행 갱신 (#7)
stock_monitor29403dadocs(README): KRX 전환 후 실 상태 반영 README (#11)

memory + todos commit 은 별도 (auto-skills update hook).