Files
our-claude-skills/custom-skills/96-ourdigital-estimate-engine/scope.schema.json
Andrew Yim c9bdbb57f7 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>
2026-05-28 01:54:11 +09:00

64 lines
2.4 KiB
JSON

{
"$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"}
}
}
}
}
}