"""Schemas for the Smart Onboarding Advisor — the onboarding RUNTIME step. DTOs only. The Advisor ORCHESTRATES the existing engines (Company 2A, RS-005, optimization, completeness) — no new reasoning engine, no new capability registry, no new meta-model. Welt-1 discipline: a certificate yields PROBABLE capabilities (verification required), never "erfüllt". Python 3.9 compatible (no `|` unions). """ from __future__ import annotations from typing import List, Optional from pydantic import BaseModel, Field class OnboardingInput(BaseModel): company: str = "" industry: Optional[str] = None products: List[str] = Field(default_factory=list) markets: List[str] = Field(default_factory=list) certifications: List[str] = Field(default_factory=list) known_evidence: List[str] = Field(default_factory=list) target: List[str] = Field(default_factory=list) # informational; the delta uses injected requirements class InferredAssumption(BaseModel): certification: str capabilities: List[str] = Field(default_factory=list) # RELEVANT-to-target caps the cert probably provides verification_required: bool = True # Welt-1: never auto-satisfied statement: str = "" class RejectedAssumption(BaseModel): certification: Optional[str] = None statement: str = "" reason: str = "" # e.g. "relevance(evidence, target) = 0" class AdvisorQuestion(BaseModel): capability_id: str question_intent: str why: str # every question explains itself information_value: float = 0.0 # deterministic rank score priority: str = "medium" class AdvisorMeasure(BaseModel): capability_id: str leverage: int = 0 closes: List[str] = Field(default_factory=list) class AdvisorResult(BaseModel): inferred_assumptions: List[InferredAssumption] = Field(default_factory=list) rejected_assumptions: List[RejectedAssumption] = Field(default_factory=list) auto_detected: List[str] = Field(default_factory=list) # detected (concrete artifact): recognised w/o asking indications: List[str] = Field(default_factory=list) # partial signal: raises assumption strength, STILL asked next_best_questions: List[AdvisorQuestion] = Field(default_factory=list) # max 5 capability_delta: List[str] = Field(default_factory=list) top_measures: List[AdvisorMeasure] = Field(default_factory=list) evidence_requests: List[str] = Field(default_factory=list) unsupported_domains: List[str] = Field(default_factory=list) completeness_summary: str = "" headline: str = "" # "N erkannt, M wahrscheinlich abgedeckt, K zu klären"