SKILL.md orchestration (8 gated stages), references (rate_card.yaml, findings_to_service rubric, competitor sets), findings.schema.json contract, and scripts: kg_query.py (generalized KG examination), estimate.py (findings→rate-card 견적 md/xlsx/json), build_deck.py (9-slide branded PPTX), render_pdf.sh (Korean PDF via headless Chrome), plus client_brief.html template. Validated on Sono Hotels & Resorts findings: estimate OD-2026-001 (23-47M KRW) and a 9-slide deck generated cleanly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
27 lines
1.8 KiB
Markdown
27 lines
1.8 KiB
Markdown
# Findings → service rubric
|
|
|
|
How `estimate.py` maps detected findings (from `findings.json`) to `rate_card.yaml`
|
|
service lines. The script reads the structured signals below; this file is the
|
|
human-readable source of truth for the rules.
|
|
|
|
| Trigger (signal in findings.json) | Service line(s) | Scope driver |
|
|
|---|---|---|
|
|
| `discovery.sitemap_status != 200` OR `discovery.robots_sitemap_declared == false` OR `discovery.discoverable_urls` low vs `estimated_pages` | `technical_audit` + `technical_remediation` | site size / # templates |
|
|
| `technical.cwv.perf < 0.5` OR `cls > 0.1` OR `lcp_ms > 2500` OR `ttfb_ms > 600` | `technical_audit` (if not already) + `technical_remediation` | # templates |
|
|
| `technical.schema.org == "bare"/"none"` OR `entity.panel != "hotel"` OR `entity.name_split` OR `entity.legacy_contamination` OR `entity.subbrands_with_entity == 0` | `schema_build` (one-time) + `onpage_entity` (retainer) | # sub-brands + # properties |
|
|
| `entity.properties_with_entity == 0` OR `url_hygiene` contains GBP/local mismatch | `local_seo` | # properties |
|
|
| `findings[].class` includes measurement gap / no GSC-GA4 | `ga4_impl` and/or `dashboard` (+ `gtm_setup` if tag gaps) | — |
|
|
| `technical.meta_dupe` OR `technical.title_i18n_mismatch` OR `technical.hreflang == "incomplete"` | `onpage_entity` | # templates |
|
|
|
|
**Severity → priority** (for the brief/deck ordering, not pricing):
|
|
- `critical`: crawl/index blocking, CWV failing, entity mistyped
|
|
- `high`: entity/sub-brand gaps, duplicate URLs, meta dupes
|
|
- `medium`: hreflang, H1, hygiene
|
|
|
|
**Quantity rules**
|
|
- `monthly` line items use `rate_card.defaults.retainer_months` (default 6).
|
|
- `local_seo` scope note scales with property count (`entity` / discovery counts).
|
|
- One-time items counted once even if triggered by multiple findings.
|
|
|
|
Edit this file and `rate_card.yaml` together when rates or rules change.
|