{"record":{"id":"1a438a2c4a7a73f8","repo":"HKUDS/Vibe-Trading","slug":"modelartifact-model-name-must-be-one-of-model-na","errorCode":null,"errorMessage":"ModelArtifact.model_name must be one of {_MODEL_NAMES}, got {self.model_name!r}","messagePattern":"ModelArtifact\\.model_name must be one of (.+?), got (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/quantlib/valuation/artifact.py","lineNumber":256,"sourceCode":"    schema_version: str\n    generated_at: datetime\n    input_hash: str\n    inputs: Mapping[str, Any]\n    outputs: Mapping[str, Any]\n    assumptions: tuple[AssumptionRecord, ...]\n    result: Any\n    excluded: tuple[str, ...]\n    warnings: tuple[str, ...]\n\n    def __post_init__(self) -> None:\n        \"\"\"Check the artifact's own invariants.\n\n        Raises:\n            ValueError: If ``model_name`` is not one of :data:`_MODEL_NAMES`,\n                or ``input_hash`` is not a 64-character hex sha256 digest.\n        \"\"\"\n        if self.model_name not in _MODEL_NAMES:\n            raise ValueError(\n                f\"ModelArtifact.model_name must be one of {_MODEL_NAMES}, \"\n                f\"got {self.model_name!r}\"\n            )\n        if len(self.input_hash) != 64 or any(\n            c not in \"0123456789abcdef\" for c in self.input_hash\n        ):\n            raise ValueError(\n                f\"ModelArtifact.input_hash must be a 64-character sha256 hex \"\n                f\"digest, got {self.input_hash!r}\"\n            )\n\n\n@dataclass(frozen=True)\nclass FieldChange:\n    \"\"\"One field that differs between two artifacts' inputs or outputs.\n\n    Attributes:\n        path: The dotted/bracket path that changed.","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/quantlib/valuation/artifact.py#L238-L274","documentation":"ModelArtifact's frozen dataclass __post_init__ validates that model_name is one of the known _MODEL_NAMES (dcf, comps, three_statement). This keeps artifacts self-describing so diffing and export dispatch can rely on the field.","triggerScenarios":"ModelArtifact(model_name='DCF', ...) with wrong casing; a typo like 'dcfs'; or introducing a new model type without registering its name in _MODEL_NAMES.","commonSituations":"Constructing artifacts manually instead of via build_*_artifact; renaming model identifiers during a refactor; copy-pasting artifact construction code.","solutions":["Use one of the exact names in _MODEL_NAMES: 'dcf', 'comps', 'three_statement'.","Prefer the build_dcf_artifact / build_comps_artifact / build_three_statement_artifact factories, which set model_name for you.","If adding a genuinely new model, extend _MODEL_NAMES and its dispatch sites."],"exampleFix":"// before\nModelArtifact(model_name=\"DCF\", ...)\n// after\nModelArtifact(model_name=\"dcf\", ...)  # or use build_dcf_artifact(...)","handlingStrategy":"type-guard","validationCode":"from quantlib.valuation.artifact import _MODEL_NAMES\nassert model_name in _MODEL_NAMES, f\"unknown model_name {model_name!r}\"","typeGuard":"def is_known_model_name(name: str) -> bool:\n    from quantlib.valuation.artifact import _MODEL_NAMES\n    return name in _MODEL_NAMES","tryCatchPattern":null,"preventionTips":["Always build artifacts via build_dcf_artifact/build_comps_artifact/build_three_statement_artifact.","Reference model names via constants, never hardcoded strings."],"tags":["python","dataclass","validation","artifact"],"backgroundTag":"enum-value-validation","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}