Extract ourdigital-estimate-engine; presales-seo now calls it
New skill 96-ourdigital-estimate-engine: method-aware quoting engine (effort / coaching / procurement) with universal rate_card + per-service catalog. Real catalogs: seo (effort), education (coaching); stubs: digital_ads, digital_branding. Validated to reproduce real quotes — SEO basic ₩10.5M / treatment ₩25.0M, SHR chain ₩29.5M, L'Escape basic ₩10.5M, GA4/GTM coaching ₩1,570,000, procurement +15%. Refactor 95-ourdigital-presales-seo: remove rate_card.yaml, sow_templates.yaml, estimate.py (migrated to engine); add findings_to_scope.py; Stage 5 now maps findings→scope.json and calls the engine CLI. build_deck/kg_query unchanged; end-to-end validated on SHR (29.5M) + deck renders engine estimate.json. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
55
custom-skills/96-ourdigital-estimate-engine/SKILL.md
Normal file
55
custom-skills/96-ourdigital-estimate-engine/SKILL.md
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
name: ourdigital-estimate-engine
|
||||
description: Method-aware estimate/견적 engine for OurDigital / D.intelligence professional services (SEO, GA4/GTM, education/coaching, digital ads, branding, …). Generates a Korean 견적 (md/xlsx/json) from a generic scope.json using the real company rate card. Use for "OurDigital 견적", "estimate", "quote", "proposal pricing", "cost estimate", "견적서 생성", or when another skill needs to price a service. Costing methods: effort (role×billing×hours), coaching (lesson×hours), procurement (+15%).
|
||||
---
|
||||
|
||||
# OurDigital Estimate Engine
|
||||
|
||||
Single source of truth for OurDigital/D.intelligence pricing. Consuming skills map their
|
||||
context into a `scope.json` and call the engine CLI; the engine owns the rate card + service
|
||||
catalog and renders the 견적.
|
||||
|
||||
## Costing methods (catalog entry declares its `method`)
|
||||
- **effort** — `role_rate × 청구율(0.70) × 표준 업무시간`, by module; auto-tier (smb/basic/treatment)
|
||||
by portfolio size + premium-vertical floor; On-page hours scale by sub-brands (cap ×2.0);
|
||||
제안가 = 합계 절사. Reproduces real SEO quotes (basic ₩10.5M / treatment ₩25.0M).
|
||||
- **coaching** — `Σ(lesson_type_price × hours)` over a lesson plan; student discount opt-in.
|
||||
Reproduces real GA4/GTM 코칭 (₩1,570,000). Base prices default; subject×level matrix optional.
|
||||
- **procurement** — `unit_cost × qty × (1 + 0.15)` for non-labor items.
|
||||
|
||||
## Files
|
||||
- `references/rate_card.yaml` — universal: role rates, billing, basis, terms, tiering, scaling,
|
||||
procurement, coaching prices/levels/discounts, tools. **Private.**
|
||||
- `catalog/<service>.yaml` — per-service: `service`, `method`, body. Real: `seo` (effort),
|
||||
`education` (coaching). Stubs: `digital_ads`, `digital_branding` (effort — `_stub: true`).
|
||||
- `scripts/estimate.py` — CLI dispatcher; `scripts/methods/{effort,coaching,procurement}.py`;
|
||||
`scripts/render.py` (md/xlsx/json). `scope.schema.json` — input contract.
|
||||
|
||||
## Usage
|
||||
```
|
||||
python scripts/estimate.py \
|
||||
--rate-card references/rate_card.yaml --catalog-dir catalog \
|
||||
--scope scope.json --out-dir <engagement> [--seq N]
|
||||
```
|
||||
`scope.json` examples (see `scope.schema.json`):
|
||||
- effort: `{"service":"seo","tier":"auto","signals":{"properties_total":25,"subbrands_total":5,"vertical":"hotel_resort"},"prospect":{"name":"…","audit_date":"YYYY-MM-DD"}}`
|
||||
- coaching: `{"service":"education","course":"ga4_gtm_intermediate","students":1,"prospect":{…}}`
|
||||
- procurement: `{"service":"seo","method":"procurement","items":[{"label":"SEMrush Guru","unit_cost":330000,"qty":6}]}`
|
||||
|
||||
Outputs `05_estimate_ko.md`, `05_estimate.xlsx`, `data/estimate.json`. The effort `estimate.json`
|
||||
shape is consumed by `ourdigital-presales-seo/build_deck.py`.
|
||||
|
||||
## Consuming from another skill (CLI)
|
||||
1. Map your context → `scope.json` (service, tier signals or lessons, prospect).
|
||||
2. Call `estimate.py`. 3. Use the rendered 견적; for SEO, feed `data/estimate.json` to the deck.
|
||||
Example consumer: `ourdigital-presales-seo` (`findings_to_scope.py` → engine → 견적 + deck).
|
||||
|
||||
## Adding / editing services
|
||||
- New real service: add `catalog/<service>.yaml` with `method` + body from a **real quote**.
|
||||
- Stubs (`digital_ads`, `digital_branding`) carry `_stub: true` and placeholder hours — replace
|
||||
with real quote data before client use (the 견적 prints a ⚠STUB banner).
|
||||
- Rates change in `rate_card.yaml` only (single source). Validate against a known real quote.
|
||||
|
||||
## Conventions
|
||||
Korean-first output · 부가세 별도 · 유효기간 14d · 현금 · `OD-YYYY-NNN`. Don't invent rates —
|
||||
stub and flag instead. Legal entity (주)디인텔리전스 / info@ourdigital.org.
|
||||
Reference in New Issue
Block a user