Recalibrate estimate for SMB acceptability

Real-world feedback: list-rate calc overshot SMB-acceptable levels.
- scaling: driver properties_total -> subbrands_total (chains share templates),
  cap x6.5 -> x2.0, applied to On-page only (Technical now fixed site-wide)
- add 'smb' entry tier (lean hours @ 0.55 billing); 3-tier auto-select
  (smb/basic/treatment) by portfolio size; per-tier billing; --baseline smb enabled
- docs (findings_to_service.md, SKILL.md) synced to 3-tier model

Effect: SHR 25-property chain 71.5M -> 29.5M; SMB single hotel ~3.0M;
basic/treatment still reproduce real 10.5M/25.0M at 1 property.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-28 01:13:38 +09:00
parent e519a49cc4
commit 60734dbde7
6 changed files with 107 additions and 60 deletions

View File

@@ -1,19 +1,22 @@
# Findings → estimate mapping (effort-based)
# Findings → estimate mapping (effort-based, SMB-aware)
`estimate.py` builds the 견적 from `sow_templates.yaml` priced via `rate_card.yaml`:
**cost = role_rate × billing_rate (0.70) × standard_hours**, grouped by module;
제안가 = 합계 floored to `rounding_unit`. This mirrors OurDigital/D.intelligence's
real SOW-based quoting.
**cost = role_rate × billing_rate × standard_hours**, grouped by module; 제안가 = 합계
floored to `rounding_unit`. Mirrors OurDigital/D.intelligence's real SOW-based quoting.
## Baseline selection (basic vs treatment)
- `treatment` if any finding `severity == critical` **OR** `entity.properties_total > 3`
- else `basic`
- override with `--baseline`.
## Tier selection (smb / basic / treatment)
- `treatment` if `properties_total > 5` OR `subbrands_total > 3` (multi-brand / chain)
- `smb` if `properties_total <= 1` AND `subbrands_total == 0` (single-property SMB)
- `basic` otherwise (small multi-property / mid)
- override with `--baseline`. **Note:** tiering is by portfolio size only — quote a
single *premium* property as `basic`/`treatment` manually.
Per-tier billing: `smb` uses `billing_rate: 0.55` (set in sow_templates); `basic`/
`treatment` use `rate_card.billing_rate` (0.70). Override with `--billing`.
## Module inclusion
Each baseline carries the standard module set (P&M · Technical SEO · On-page SEO ·
SEO Growth), matching real quotes. Findings justify modules via the `trigger` field
in `sow_templates.yaml`:
Each tier carries its standard module set (P&M · Technical SEO · On-page SEO ·
SEO Growth). Findings annotate modules via the `trigger` field:
| Module | trigger finding classes |
|---|---|
@@ -23,18 +26,21 @@ in `sow_templates.yaml`:
| SEO Growth | measurement, always |
## Hours scaling (portfolio)
Tasks marked `scale: true` (Technical SEO + On-page SEO) have their **hours**
multiplied sub-linearly by `entity.properties_total` per `rate_card.scaling.bands`.
P&M and SEO Growth stay fixed (management/KPI overhead is ~flat). A single-property
prospect → ×1.0, which reproduces the real single-site quotes exactly.
Only **On-page** tasks (`scale: true`) scale, sub-linearly, by the
`rate_card.scaling.driver` (= `subbrands_total`, i.e. distinct brands/templates),
capped at **×2.0**. Rationale: chains share page templates, so on-page work grows
with template variety, not raw property count. **Technical SEO is fixed** site-wide
work (`scale: false`); P&M and SEO Growth are fixed too. Single-brand → ×1.0.
## Tools & terms
`tools` (e.g. SEMrush Guru) are listed separately — client-subscribed, with +15%
procurement markup if billed through us. VAT 별도 · 유효기간 14d · 현금 · 절사 from
`rate_card.terms`.
`tools` (e.g. SEMrush Guru) listed separately — client-subscribed, +15% procurement
markup if billed through us. VAT 별도 · 유효기간 14d · 현금 · 절사 from `rate_card.terms`.
## Validated reproduction (2026-05-28)
## Validated (2026-05-28)
- `basic` ×1.0 → 합계 10,612,000 → 제안가 **10,500,000** (real Basic quote)
- `treatment` ×1.0 → 합계 25,340,000 → 제안가 **25,000,000** (real Treatment quote)
- `basic` ×1.0 → 합계 10,612,000 → 제안가 **10,500,000** (real Basic quote)
- `smb` single property → ~**3,000,000** (lean × 55% billing)
- chain example (SHR, 5 sub-brands ×1.6, treatment) → ~**29,500,000** (vs naive 71.5M)
Edit `rate_card.yaml` and `sow_templates.yaml` together when rates or standard hours change.
Edit `rate_card.yaml` + `sow_templates.yaml` together when rates, hours, tiers, or
scaling change.