Rebuild estimate engine to effort-based SOW model

Replace flat per-service ranges with OurDigital's real quoting model
(role_rate × billing_rate 0.70 × standard hours), sourced from the
06_Working Template quotes:
- rate_card.yaml: role rate card, billing/basis/terms, tools, scaling bands
- sow_templates.yaml: basic + treatment task-hour templates
- estimate.py: assemble SOW from findings, scale Technical/On-page hours by
  properties_total, 제안가 = 합계 floored to 500k
- build_deck.py: estimate slide shows module 소계 + 제안가 (point)
- findings_to_service.md / SKILL.md / DESIGN.md: synced to new model

Validated: reproduces real Basic ₩10.5M and Treatment ₩25.0M exactly;
SHR (25 properties) scales to ₩71.5M, L'Escape (1) = ₩25.0M.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-28 00:51:52 +09:00
parent 01201ee4a2
commit 5f66f57a8e
7 changed files with 343 additions and 269 deletions

View File

@@ -1,63 +1,57 @@
# OurDigital service rate card — single source for estimate.py
# Mirrors the ourdigital-backoffice quote ranges. Values are KRW, treated as
# pre-sales estimate RANGES (finalize after a precise diagnostic with access).
quote_prefix: OD # quote number format: OD-YYYY-NNN
# OurDigital / D.intelligence — rate card (effort-based)
# Source of truth: 06_Working Template 견적서 (Google Drive), 2026-05.
# Model: 비용 = 시간단가(role) × 청구율(billing_rate) × 표준 업무시간(hours).
# Estimates are assembled bottom-up from sow_templates.yaml. Keep PRIVATE.
company:
legal_name: "(주)디인텔리전스 (D.intelligence Lab)"
brand: "OurDigital"
ceo: "임명재"
contact: "info@ourdigital.org"
address: "경기도 성남시 수정구 창업로 43 판교글로벌비즈센터 업무동 1층 128호"
quote_prefix: OD # OD-YYYY-NNN
currency: KRW
services:
technical_audit:
label_ko: "Technical Audit / 기술 SEO 진단"
unit: one_time # one_time | monthly | project
min: 3000000
max: 5000000
technical_remediation:
label_ko: "기술 개선 실행 (sitemap/CWV/SSR)"
unit: project
min: 3000000
max: 8000000
onpage_entity:
label_ko: "On-Page / Entity Optimization (월 운영)"
unit: monthly
min: 1500000
max: 3000000
schema_build:
label_ko: "구조화 데이터(Schema) 구축 (1회)"
unit: one_time
min: 2000000
max: 4000000
local_seo:
label_ko: "Local SEO (프로퍼티 로컬 최적화)"
unit: monthly
min: 1000000
max: 2000000
gtm_setup:
label_ko: "GTM Setup / 태그 관리 구축"
unit: project
min: 2000000
max: 4000000
ga4_impl:
label_ko: "GA4 Implementation / 분석 환경 구축"
unit: project
min: 1500000
max: 3000000
dashboard:
label_ko: "Dashboard Development / 대시보드 개발"
unit: project
min: 3000000
max: 6000000
billing_rate: 0.70 # 청구율 표준 70%
billing_rate_floor: 0.60 # 협상 시 -10%p 까지(>10%p 조정은 CEO/CFO 승인)
basis:
hours_per_day: 8 # 일 8시간
weeks_per_month: 4 # 월 4주
procurement_markup: 0.15 # 조달-관리 수수료 15% (외부 조달 물품/서비스)
rounding_unit: 500000 # 제안가 = 합계 절사. 50만원 단위가 실제 견적(25,340,000→25,000,000;
# 10,612,000→10,500,000)을 재현. 필요시 100000/1000000 으로 조정.
defaults:
retainer_months: 6 # default contract length for monthly line items
disclaimer_ko: "본 견적은 공개 데이터 기반 사전 추정 범위이며, Search Console/Analytics 권한 확보 후 정밀 진단을 통해 확정됩니다."
terms:
vat: "부가세 별도"
validity_days: 14 # 견적 유효기간(약 2주)
payment: "현금"
# Scope scaling — monthly line items scale (sub-linearly) by portfolio size.
# driver: a count under findings.entity (properties_total | subbrands_total).
# bands: ordered [max_count, multiplier]; first band whose max_count >= count wins.
# A 25-property chain costs more to run than a single hotel, but not 25x.
# 시간 단가 (KRW/hr) — 직급 기준. sow_templates.yaml의 task.role 이 이 키를 참조.
role_rates:
ceo: 180000 # 대표
evp: 150000 # 전무
svp: 120000 # 상무
technical_advisor: 120000 # 기술고문
director: 100000 # 이사 / 본부장
senior_manager: 90000 # 부장 (Senior SEO·PM·Senior Analyst·Account Director(국장))
deputy_manager: 80000 # 차장
manager: 70000 # 과장 (SEO·Data Analyst·Data Engineer·Engineer|Developer)
assistant_manager: 60000 # 대리
junior: 50000 # 주임
associate: 30000 # 사원
intern: 12000 # 인턴
# 포트폴리오 규모에 따른 '시간' 스케일(서브선형). scale:true 인 task 에만 적용.
# driver: findings.entity 의 카운트. bands: [최대값, 배수]; count <= 최대값 인 첫 밴드.
scaling:
local_seo:
driver: properties_total
bands: [[1, 1.0], [5, 1.6], [15, 2.8], [30, 4.5], [999999, 6.5]]
onpage_entity:
driver: subbrands_total
bands: [[1, 1.0], [3, 1.6], [6, 2.2], [999999, 3.2]]
driver: properties_total
bands: [[1, 1.0], [5, 1.6], [15, 2.8], [30, 4.5], [999999, 6.5]]
# 별도 조달 항목(인력비와 분리). 청구 시 procurement_markup 적용 가능.
tools:
semrush_guru:
label: "Advanced SEO Tools — SEMrush Guru"
unit: "월간 구독"
price_usd: 249.95
note: "고객사 별도 구독(TBD), 사용자별 과금"