{"record":{"id":"2bf5e9e8ef6b414f","repo":"HKUDS/Vibe-Trading","slug":"coupon-frequency-0-marks-a-zero-coupon-bond-but-c","errorCode":null,"errorMessage":"coupon_frequency=0 marks a zero-coupon bond, but coupon_rate={self.coupon_rate!r} is non-zero","messagePattern":"coupon_frequency=0 marks a zero-coupon bond, but coupon_rate=(.+?) is non-zero","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/entities/models.py","lineNumber":381,"sourceCode":"            object.__setattr__(self, \"face_value\", face)\n        if self.coupon_rate is not None:\n            rate = float(self.coupon_rate)\n            if rate < 0:\n                raise ValueError(f\"coupon_rate cannot be negative, got {rate!r}\")\n            if rate > 1.0:\n                raise ValueError(\n                    f\"coupon_rate must be a decimal fraction (0.05 means 5%), \"\n                    f\"got {rate!r}; a value above 1.0 is almost certainly a \"\n                    \"percentage\"\n                )\n            object.__setattr__(self, \"coupon_rate\", rate)\n        frequency = int(self.coupon_frequency)\n        if frequency < 0:\n            raise ValueError(\n                f\"coupon_frequency cannot be negative, got {self.coupon_frequency!r}\"\n            )\n        if self.coupon_rate and frequency == 0:\n            raise ValueError(\n                f\"coupon_frequency=0 marks a zero-coupon bond, but coupon_rate=\"\n                f\"{self.coupon_rate!r} is non-zero\"\n            )\n        object.__setattr__(self, \"coupon_frequency\", frequency)\n        if self.maturity_date is not None:\n            object.__setattr__(\n                self,\n                \"maturity_date\",\n                normalize_date(self.maturity_date, field_name=\"maturity_date\"),\n            )\n            if self.inception_date is not None and self.maturity_date < self.inception_date:\n                raise ValueError(\n                    f\"maturity_date {self.maturity_date} precedes inception_date \"\n                    f\"{self.inception_date}\"\n                )\n","sourceCodeStart":363,"sourceCodeEnd":397,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/entities/models.py#L363-L397","documentation":"Bond.__post_init__ enforces consistency: coupon_frequency=0 marks a zero-coupon bond, so a non-zero coupon_rate alongside frequency 0 is contradictory and rejected. A truthy coupon_rate with frequency 0 triggers the error.","triggerScenarios":"Bond(..., coupon_rate=0.05, coupon_frequency=0) — e.g. a defaulted frequency of 0 combined with a real coupon from the data, or coupon_rate=0.0 with frequency 2 is fine but the inverse combination is not.","commonSituations":"Constructor defaults setting coupon_frequency=0 while caller supplies coupon_rate; partial updates where one field is refreshed and the other left at its zero-coupon default; merging records from sources with different conventions.","solutions":["Set coupon_frequency to the actual pay frequency (>=1) when coupon_rate is non-zero","Or set coupon_rate=None/0.0 when the bond truly is zero-coupon","Avoid defaults that pick frequency=0; make both fields explicit at construction"],"exampleFix":"# before\nBond(instrument_id='b1', coupon_rate=0.05, coupon_frequency=0)\n\n# after\nBond(instrument_id='b1', coupon_rate=0.05, coupon_frequency=2)","handlingStrategy":"validation","validationCode":"cr = row.get('coupon_rate')\nfreq = int(row.get('coupon_frequency', 0) or 0)\nif cr and freq == 0:\n    freq = 2  # or raise: inconsistent source data\nBond(..., coupon_rate=cr, coupon_frequency=freq)","typeGuard":"def coupon_fields_consistent(rate, freq) -> bool:\n    return rate is None or not rate or int(freq) != 0","tryCatchPattern":null,"preventionTips":["Set coupon_rate and coupon_frequency together, never via partial defaults","Avoid constructor defaults of frequency=0 when coupon data may be supplied"],"tags":["python","dataclass","bond","cross-field-validation"],"backgroundTag":"cross-field-consistency-validation","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}