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:
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "ourdigital-estimate-engine scope input",
|
||||
"description": "Generic estimate request. Consuming skills map their context into this.",
|
||||
"type": "object",
|
||||
"required": ["service"],
|
||||
"properties": {
|
||||
"service": {"type": "string", "description": "catalog entry name, e.g. seo | education | digital_ads"},
|
||||
"method": {"type": "string", "enum": ["effort", "coaching", "procurement"], "description": "optional; defaults to the catalog entry's method"},
|
||||
"prospect": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string"}, "domain": {"type": "string"},
|
||||
"audit_date": {"type": "string"}, "account_code": {"type": "string"}
|
||||
}
|
||||
},
|
||||
"seq": {"type": "integer", "default": 1},
|
||||
|
||||
"tier": {"type": "string", "description": "effort: smb|basic|treatment|auto (default auto)"},
|
||||
"billing_rate": {"type": ["number", "null"], "description": "effort: override billing rate"},
|
||||
"signals": {
|
||||
"type": "object",
|
||||
"description": "effort auto-tiering inputs",
|
||||
"properties": {
|
||||
"properties_total": {"type": "integer"},
|
||||
"subbrands_total": {"type": "integer"},
|
||||
"vertical": {"type": "string"},
|
||||
"severity": {"type": "array", "items": {"type": "string"}}
|
||||
}
|
||||
},
|
||||
|
||||
"course": {"type": "string", "description": "coaching: named course in catalog (else use lessons)"},
|
||||
"lessons": {
|
||||
"type": "array",
|
||||
"description": "coaching: explicit lesson plan",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["type", "hours"],
|
||||
"properties": {
|
||||
"subject": {"type": "string"}, "title": {"type": "string"},
|
||||
"type": {"type": "string", "enum": ["화상", "대면", "실습", "워크숍", "트리트먼트"]},
|
||||
"hours": {"type": "number"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"students": {"type": "integer", "default": 1},
|
||||
"pricing_mode": {"type": "string", "enum": ["base", "matrix"]},
|
||||
"apply_student_discount": {"type": "boolean"},
|
||||
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "procurement: non-labor line items",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["label", "unit_cost"],
|
||||
"properties": {
|
||||
"label": {"type": "string"}, "unit_cost": {"type": "number"},
|
||||
"qty": {"type": "number", "default": 1}, "currency": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user