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>
1.8 KiB
1.8 KiB
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 mistypedhigh: entity/sub-brand gaps, duplicate URLs, meta dupesmedium: hreflang, H1, hygiene
Quantity rules
monthlyline items userate_card.defaults.retainer_months(default 6).local_seoscope 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.