refactor(reasoning): enforce ClaimCoverage (Welt 1) vs ComplianceStatus (Welt 2) boundary [F1]
Architecture-validation finding: the implementation mode produced compliance-
flavored output ("teilweise erfüllt", "covered") from a mere customer claim,
blurring the line to the Execution layer. This is a design decision, not a text
fix — the reasoning layer judges only the customer's STATEMENT, never conformity.
- CoverageStatus -> ClaimCoverage; values are claim-relative + carry "potential":
potentially_addresses / partially_addresses / does_not_address /
insufficient_information.
- ImplementationAssessment -> ClaimObligationMapping (coverage_status ->
claim_coverage); ImplementationResponse -> ImplementationReasoningResponse
(assessments -> mappings, + explicit `disclaimer`); request renamed; engine
entry assess_implementation -> reason_implementation_claim.
- Endpoint /reasoning/implementation-assessment -> /reasoning/implementation-reasoning.
- Summary/explanations reworded: "adressiert wahrscheinlich N Pflichten … für
eine Bewertung der tatsächlichen Umsetzung sind Nachweise erforderlich (keine
Konformitätsaussage)". No "erfüllt"/"abgedeckt" leaks.
- New guard test asserts no compliance verdict leaks (no "erfüllt"; disclaimer
separates ClaimCoverage from ComplianceStatus). 23 tests green, mypy clean.
Discovery (scope/obligations) was already structurally claim-free and unaffected.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -15,8 +15,8 @@ from pydantic import BaseModel, Field
|
||||
from .enums import (
|
||||
ApplicabilityStatus,
|
||||
AuthorityLevel,
|
||||
ClaimCoverage,
|
||||
Confidence,
|
||||
CoverageStatus,
|
||||
InterpretationVerdict,
|
||||
ManufacturerRole,
|
||||
MarketModel,
|
||||
@@ -140,10 +140,17 @@ class CustomerImplementationClaim(BaseModel):
|
||||
evidence_refs: List[str] = Field(default_factory=list)
|
||||
|
||||
|
||||
class ImplementationAssessment(BaseModel):
|
||||
class ClaimObligationMapping(BaseModel):
|
||||
"""One row of Welt-1 reasoning: how a customer claim relates to an obligation.
|
||||
|
||||
Layers (spec / architect): claim -> interpretation (on the claim object) ->
|
||||
*potential* obligation coverage (`claim_coverage`) -> evidence required.
|
||||
Carries NO compliance verdict.
|
||||
"""
|
||||
|
||||
claim_id: str
|
||||
obligation_id: str
|
||||
coverage_status: CoverageStatus
|
||||
claim_coverage: ClaimCoverage
|
||||
missing_elements: List[str] = Field(default_factory=list)
|
||||
required_evidence: List[str] = Field(default_factory=list)
|
||||
explanation: str
|
||||
@@ -188,16 +195,19 @@ class ObligationsResponse(BaseModel):
|
||||
evidence_for_multiple: Dict[str, List[str]] = Field(default_factory=dict)
|
||||
|
||||
|
||||
class ImplementationRequest(BaseModel):
|
||||
class ImplementationReasoningRequest(BaseModel):
|
||||
product_profile: ProductProfile
|
||||
customer_claim: str
|
||||
|
||||
|
||||
class ImplementationResponse(BaseModel):
|
||||
class ImplementationReasoningResponse(BaseModel):
|
||||
claim: CustomerImplementationClaim
|
||||
assessments: List[ImplementationAssessment] = Field(default_factory=list)
|
||||
mappings: List[ClaimObligationMapping] = Field(default_factory=list)
|
||||
missing_evidence: List[str] = Field(default_factory=list)
|
||||
summary: str = ""
|
||||
# Makes the Welt-1 boundary explicit: this is advisory claim-mapping, not a
|
||||
# conformity verdict (that is ComplianceStatus in the Execution Graph).
|
||||
disclaimer: str = ""
|
||||
|
||||
|
||||
class InterpretationRequest(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user