2026-04-24
세션 PC: dm. 본 DevLog 는 2026-04-26 chyj1 복귀 시 누락분 복원 (커밋/파일 기준 재구성). 시간대별 디테일은 dm 세션 메모리에만 존재할 수 있음.
배경
- 2026-04-23 저녁 chyj1 PC 에서 12 hardening 이슈 + 6 추가 리스크(C~H) 처리 + 3 repo 커밋. prod 배포는 미실행 상태로 종료 (project_current_state.md @4/23 저녁).
- 4/24 dm PC 가 prod 배포 + 추가 트랙 진행. 그 결과 chyj1 부재 동안 w-ai-agents 24 commits / board 50 commits 누적.
w-ai-agents 24 commits (4/24)
A. board dual-mount (B0~B6.5) — claude-bridge 분리
| 커밋 | 라우트 | 노출 |
|---|---|---|
102a2aa B0 | claude-bridge.js API 체인 분리 (501→471) | refactor |
fac3cc7 B1 | /scores GET admin-only (ADR-002 Option A) | super_admin |
c6b58eb B2 | /board/scores dual-mount | super_admin |
c03fbb1 B3 | /board/dashboard/* + /board/overview/* dual-mount | tenant-aware |
369985d B4 | /board/cost/* dual-mount | super_admin platform-wide |
0911e9e B5 | /board/brief + /board/activity + /board/search dual-mount | tenant |
9f9b7c9 B6 | /board/agents/:id/detail + /board/agents/:id/run + /board/feedback | tenant |
0fbc9e8 B6.5 | dual-mount dispatch → resources/bridge-dual.js 분리 | refactor |
의도: 단일 process 안에서 /api/* (Bridge) + /api/board/* (Board) 동거. Board 가 Bridge 의 메모리/캐시/뉴런을 그대로 활용. ADR-001 Option A (통합).
B. ADR — 설계 결정 기록
| 커밋 | ADR | 핵심 |
|---|---|---|
7ec8016 | ADR 폴더 신설 | Bridge vs Board (ADR-001) + Agent Scores 정책 (ADR-002) |
5c2838b | ADR-001 | Loren 선호 Option A (통합) — Tentatively Accepted |
044e4dd | ADR-003 | 고객사 Per-Tenant 풀 시범 운영 — DB+Brain 공유, 프로세스 분리 |
4488637 | ADR-003 후속 | "DB + Brain 공유, 프로세스만 분리" 로 설계 수정 |
23b1ebc | ADR-002 | Accepted — Option A (B1 backend 완료 반영) |
C. 자율성 / 영업 트랙 (그리스 문자 시리즈)
| 커밋 | 코드 | 한 줄 |
|---|---|---|
67c8c08 | ο-1 | Slack Gateway scaffold (Phase A 기업 접점) |
3e5e6ab | ξ-2 | conversation-memory 5단계 대화 압축 (nexus-level-up Phase A P1) |
d3187f2 | ν-1 | brain-auditor agent_metrics ALTER 를 insertMetric prepare 이전으로 (치명 버그 fix) |
d60b9a2 | ν-1 추가 | response_snippet/prompt_snippet column 추가 (SQLite column 버그) |
7498bec | ν-2 | 시군구별 사업자 현황 bulk wrapper (biz-stats) |
b561968 | π-1 | router 사업자번호 자동 pre-fetch → agent prompt 주입 |
D. M9 사업자가입 완료 (Track A 매출 마일스톤)
project_execution_plan.md 의 Milestone 9 가 외부 의존 (국세청 API 5~7영업일) 으로 대기 중이었으나 4/24 에 키 발급 + 연결 완료.
| 커밋 | 변경 |
|---|---|
2047aea | signup 사업자번호 진위확인 연결 (TODO 1-E, biz-lookup) |
11f73b1 | signup biz-lookup 검증 엄격화 — 01 (계속사업자) 외 전부 거부 |
cba5f44 | docs(TODO): 1-E 사업자번호 진위확인 완료 마킹 |
→ Track A Phase 1 "첫 매출 가능" 상태에 가까워짐. 남은 외부 의존: AWS SES (이메일 인증) + Aligo (M11 알림톡).
E. debt 정리 (4건)
| debt # | 커밋 | 해결 |
|---|---|---|
| #9 | 60fffbf 60b3499 REFAC λ-1 | board /posts/* + /deliveries/* 15 라우트 → posts-routes.js |
| #17 | 7e2a3ba | deploy-bridge.sh 자동화 (deploy-frontend 와 페어) |
| #23 | 2198368 | router SIGTERM → 5s 후 SIGKILL 강제 (openclaw 좀비 방지) |
| #27 | 17caf70 | cascade + config: openclaw gateway 자동 복구 |
board 50 commits (4/24)
본 DevLog 작성 시점 chyj1 PC 는 master..origin/master 52 commits behind. 그 중 4/24 분 50건. 트랙별 묶음:
RF — api.js 도메인 분리 (510 → 53줄)
| 커밋 | 도메인 |
|---|---|
49ec28b RF-1 | api/http.js 코어 분리 |
042f31f RF-2a | auth/users/posts/comments/deliveries 분리 |
9ee798d RF-2b | notifications/companies/billing/stats 분리 |
b500f70 RF-2c + RF-3 | agents/insights/bridge/polling 분리 + api.js → barrel only (53줄) |
→ lib/api/ 13 도메인 + lib/api.js 53 라인 barrel re-export. 외부 컴포넌트의 import * as api 호환 유지 (이름 변경 0).
DX — 디자인 토큰 재정립 (10단계)
5baeef9 DX-1 토큰 재정립 → 65a1bf6 DX-2 Button/Input → f9af13a DX-3 Card system → 1e425e1 DX-4 Dashboard 하드코드 정리 → e75f462 DX-5 PostList card-interactive → 1366607 DX-6 PostDetail admin action → 6e19d3c DX-7 Sidebar/브랜드 → 7325f74 DX-8/10 TabBar/EmptyState dark.
추가: cfc5dc9 DEBT-1 text-title 34파일 일괄 치환 + legacy alias 제거.
AG — AgentChat 보드 proxy 전환
| 커밋 | 변경 |
|---|---|
3a253f6 16e98e6 AG-01 | chatWithAgent / chatWithAgentStream 을 /board/agent/execute proxy 로 전환 |
371fc65 AG-02-1 | api: getAssignedAgents wrapper 추가 |
a3d5789 AG-02-2 | AgentChat: getAssignedAgents 전환 |
63f4f30 AG-02-5 | Dashboard: getAssignedAgents 전환 |
822f00b AG-02-6 | CostDashboard: getAssignedAgents 전환 |
bda9f49 AG-02-7 | agentStore: getAssignedAgents 전환 |
9b173de AG-02-8 | db/index.js: RxDB agent sync 를 tenant-aware 로 |
09822b4 AG-02-8b | AgentOverridesPanel: getAssignedAgents 전환 |
e02b367 AG-02-9 | api: getAgents 를 admin-only 로 재문서화 |
RB — 권한 가드 + UX 4상태 분리
| 커밋 | 변경 |
|---|---|
7f13e42 RB-02 | PostDetail sticky fallback 제거 |
9670458 RB-03 | page access policy 공통화 (canAccessPage helper) |
9e667f7 RB-04 | settings 민감 panel entry guard |
66d5a8c RB-05 | ai-team / brain hub defensive guard |
8500dbb RB-06 | CommentThread author_role legacy 비교 제거 |
72ffce6 RB-07 | OwnerDashboard usage chart contract 정리 |
a0a3ba4 RB-09 | Profile dark mode placeholder 대비 보정 |
d96102b RB-10 | BillingPage 4상태 분리 (permission/loading/error/ok) |
LOGIN — 실패 사유 분기 + cooldown
76773c8 LOGIN-1 api.login 상태코드 분기 → 0fbe94a LOGIN-2 LoginForm 실패 사유 분기 + Enter 1초 cooldown → 6346802 LOGIN-3 i18n ko/ja 메시지 분화.
UX-X/Y/Z — 사용자 노출 용어 친화화
df45c34 UX-X2 signup/permission-denied → 3b26c18 UX-X3-1 MaintenanceWindow → 7c6dc43 UX-X3-2 Activity feed raw JSON 노출 수정 → dc65b7a UX-X3-4 Watchdog 경고 배너 개발 메타데이터 제거 → 5ca846f UX-Y2 AgentChat 22 에이전트 친화 이름 + 이모지 → a5a452b UX-Z1 CompanyManager 영구 삭제 UI + 타이핑 확인 → b1a800f UX-Z2 InvitePanel 만료된 초대 숨김 토글.
기타
3a253f6 AG-01 / 1fa25dd BUG-1 vite manualChunks 제거 (chunk cycle 해소) / 9e8f23c SWEEP-1 AgentChat tenant 미배정 fallback / 87f7db7 SWEEP-11 API 키 panel 대표/팀장 / 59bf703 SWEEP-8 vite React vendor 분리 (1.39MB → 1.13MB) / a3fdac5 PHASE-A2 PostDetail 4상태 / 6b42a68 PHASE-B vite recharts lazy split / 4d5fb9e fix(kanban) CategoryBadge import 누락 / 4828396 B8 api.js bridgeRequest → request 이관.
DB 마이그 prod 적용
/home/openclaw/w-ai-agents/.env mtime 2026-04-24 16:18 — 4/24 prod 가동 환경 갱신. 이 무렵 또는 직후 마이그 4종 적용된 것으로 추정 (4/26 점검 시 schema 전부 반영 확인).
| 마이그 | 검증 |
|---|---|
2026-04-11-role-4tier.sql | users.role enum 6값 + status enum 3값 |
2026-04-11-nexus-credits.sql | companies.token_balance_krw / subscription_status / billing_info / auto_topup_enabled + billing_transactions 테이블 |
2026-04-23-dead-column-cleanup.sql | users.trial_runs_remaining DROP 됨 |
2026-04-23-schema-baseline-fixup.sql | chain_executions 테이블 존재 |
검증 안 된 것 (chyj1 부재)
- 4/24 deploy 의 회귀 테스트 결과 — dm PC 측 메모리에만 있을 가능성
- self-managed 토큰 (BRIDGE/GATEWAY/WEBHOOK/ADMIN_KEY/TOKEN_SECRET/DEFAULT_PASSWORD) rotation 미실행 —
/etc/nginx/snippets/wai-proxy.confmtime 2026-04-20 22:50 (4/23 이후 미수정) - [company] 잔액 변동: 4/26 실측 ₩104,309,999. billing_transactions 조회 결과 4/12 테스트 충전 6건만 존재 (dev_* + test_mode). 4/12 이후 변동 0 → 4/11 desk "99,999,999" 기록은 잘못됐고 4/12 충전으로 정착한 값이 그대로 유지
의사결정 / 정책
- ADR-001 Option A (Bridge+Board 통합) Tentatively Accepted → B1~B6.5 로 구현
- ADR-002 Agent Scores admin-only Accepted → Nexus Credits 단일 브랜드 원칙 (개별 agent 점수는 super_admin 의 /ai-team 만)
- ADR-003 Per-Tenant 풀 — DB+Brain 공유, 프로세스만 분리. 시범 운영 단계
- M9 외부 의존 해제 → 다음 마일스톤은 M11 (Aligo 알림톡, 외부 발급 대기)
후속 (chyj1 복귀 후)
- self-managed 6 토큰 rotation 실행 (.env + nginx wai-proxy.conf + board 동기 갱신, bridge restart)
- staging 정지 (1754308 @ 4/12) 재가동 또는 폐기 결정
- 4/24 prod 배포 회귀 테스트 (login/posts/stats/mfa) 사후 검증
- ADR 3건 wai-vault 동기화 (현재 w-ai-agents/docs/adr/ 만)