---
title: "매칭 CRM(MVP) 완료 — 클린베테랑 시장콘솔 배포+검증"
from: claude-code
to: ["jadong"]
project: "clean-veteran"
date: 2026-07-03T09:16:18.744137+09:00
status: sent
type: report
---

# 매칭 CRM(MVP) — 클린베테랑 시장콘솔

**요청**: 병원(수요)↔청소업체(공급) 전략게임식 수동매칭 → 저장 → 일원화 관리 CRM. 저장은 localStorage(추상화 계층 — 추후 Supabase 교체 가능하게).

## 결과: 완료
- 브랜치 `feat/onboard-landing`, 커밋 `555a09a` (7 files changed, 251 insertions)
- 신규: `matches.js`(저장 추상화 CRUD — getMatches/addMatch/removeMatch/updateMatch), `matchpanel.js`(일원화 관리 패널)
- 수정: `card.js`(매칭행마다 배정 버튼), `map.js`(저장매칭 초록 실선 상시표시 — 자동추천 점선과 구분), `ui.js`(배선), `index.html`/`app.css`(CRM 패널 UI)

## 검증
- `node --check` 5개 파일 전부 에러 0, `node --test data/hospitals/tests/*.test.mjs` 16/16 회귀 0
- 헤드리스 브라우저(chrome-devtools-mcp) 실동작 검증 — 로컬+프로덕션 양쪽에서 동일 플로우:
  검색→병원선택→카드 '배정'클릭→localStorage 저장 확인→패널에 행 표시→지도에 초록선→상태변경(제안→계약)→삭제→중복배정 방지 확인→**새로고침 후에도 유지(영속성) 확인**→콘솔에러 0건(전 세션)

## 배포
- Vercel 재배포 완료: `https://cv-hospital-map.vercel.app` (READY), `js/matches.js`/`js/matchpanel.js` 등 신규파일 200 확인
- GitHub 푸시 완료: `feat/onboard-landing` (`68c6479..555a09a`)

## Concerns
1. **Supabase 교체 관련(핵심)**: 현재 4개 CRUD 함수가 전부 동기(sync)라 호출부(matchpanel.js/ui.js)도 await 없이 짜여있음. Supabase로 교체하면 네트워크 호출이라 필연적으로 비동기가 되므로, 함수 시그니처 이름은 유지되나 호출부 콜백들을 async/await로 바꿔야 함 — 후속 작업 시 유일한 리팩터 포인트.
2. Leaflet 팝업 기본 autoClose 때문에 패널 "지도" 버튼 클릭 시 병원+업체 팝업이 동시에 유지되진 않음(중간지점 flyTo 자체는 정상 동작, 사소한 시각 디테일).
3. 낙관적 업데이트/로딩상태는 넣지 않음(MVP 스코프).

[full report: /home/tlswk/projects/clean-veteran/.superpowers/sdd/mc-matchcrm-report.md]
