)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"5de38554e8bdee569f62706964755a9a0d58f354","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6160b9b5_95e6e2ab","updated":"2026-01-27 10:26:58.000000000","message":"Good to get such information for retry logic: if we know the failing chunk we can choose another chunk combination","commit_id":"7f1acb6dab8b2285d67acee26b991d4875b01326"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e2cfa137b9dba15839a0120f46ae292d68dbc52e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6840b846_44bfe938","in_reply_to":"6160b9b5_95e6e2ab","updated":"2026-01-27 21:34:43.000000000","message":"Acknowledged","commit_id":"7f1acb6dab8b2285d67acee26b991d4875b01326"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fc0a61c385fe9eda5ad97f73009b165b6255aa0a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"343eba59_630d7daf","updated":"2026-01-27 17:09:54.000000000","message":"Change makes a lot of sense -- more/better error information is always appreciated. Tests need updating, though, and I had a thought on tactics.","commit_id":"94894cb6fb4d44c41155438993ab2a44d01ce2ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e2cfa137b9dba15839a0120f46ae292d68dbc52e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5ef5f1e4_a2a8c6ec","updated":"2026-01-27 21:34:43.000000000","message":"Sorry, I might be getting into some bikeshedding now, feel free to push back on it -- I\u0027m just aware that this new error represents a new interface, so I want to make sure we\u0027re reasonably happy with it.","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d43e91dcd312fd8a98e1a0ed2d3e32fff50fbfbc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"713bf141_e27e75bd","updated":"2026-01-28 18:16:22.000000000","message":"Thanks!","commit_id":"119cbc796104ad6c22746d99b2dd1a230a707244"}],"pyeclib/core.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fc0a61c385fe9eda5ad97f73009b165b6255aa0a","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    def encode(self, data_bytes):"},{"line_number":78,"context_line":"        return pyeclib_c.encode(self.handle, data_bytes)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _validate_and_return_fragment_size(self, fragments):"},{"line_number":81,"context_line":"        if len(fragments) \u003d\u003d 0:"},{"line_number":82,"context_line":"            return -1"},{"line_number":83,"context_line":"        if len(fragments[0]) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9de268a3_2712f951","line":80,"updated":"2026-01-27 17:09:54.000000000","message":"I feel like we\u0027d be happier just raising from here:\n```\nif len(fragments) \u003d\u003d 0:\n    raise ECDriverError(\"No fragments payload in ...\")\n\nif len(fragments[0]) \u003d\u003d 0:\n    raise ECDriverErrorWithId(\"Invalid fragment payload in ...\", 0)\n    ...\n```\nThen\n\n1. we don\u0027t need to remember how to map negative returns to `fragments` indexes and\n2. we get similar handling in `reconstruct` almost for free.\n\nDownside is that we\u0027d want to plumb in some `func` arg or something to interpolate, but that seems pretty manageable.","commit_id":"94894cb6fb4d44c41155438993ab2a44d01ce2ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e2cfa137b9dba15839a0120f46ae292d68dbc52e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def encode(self, data_bytes):"},{"line_number":78,"context_line":"        return pyeclib_c.encode(self.handle, data_bytes)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _validate_and_return_fragment_size(self, fragments):"},{"line_number":81,"context_line":"        if len(fragments) \u003d\u003d 0:"},{"line_number":82,"context_line":"            return -1"},{"line_number":83,"context_line":"        if len(fragments[0]) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9ae1ff_40a96037","line":80,"in_reply_to":"6fd225ea_c8463f18","updated":"2026-01-27 21:34:43.000000000","message":"Done","commit_id":"94894cb6fb4d44c41155438993ab2a44d01ce2ca"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"bd59e4736d5927e1c8998f72217e3005789601f3","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    def encode(self, data_bytes):"},{"line_number":78,"context_line":"        return pyeclib_c.encode(self.handle, data_bytes)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _validate_and_return_fragment_size(self, fragments):"},{"line_number":81,"context_line":"        if len(fragments) \u003d\u003d 0:"},{"line_number":82,"context_line":"            return -1"},{"line_number":83,"context_line":"        if len(fragments[0]) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"6fd225ea_c8463f18","line":80,"in_reply_to":"9de268a3_2712f951","updated":"2026-01-27 19:06:12.000000000","message":"Yes better than my version","commit_id":"94894cb6fb4d44c41155438993ab2a44d01ce2ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e2cfa137b9dba15839a0120f46ae292d68dbc52e","unresolved":true,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        fragment_len \u003d len(fragments[0])"},{"line_number":91,"context_line":"        idx \u003d 0"},{"line_number":92,"context_line":"        for fragment in fragments[1:]:"},{"line_number":93,"context_line":"            idx +\u003d 1"},{"line_number":94,"context_line":"            if len(fragment) !\u003d fragment_len:"},{"line_number":95,"context_line":"                raise ECDriverErrorWithId("}],"source_content_type":"text/x-python","patch_set":4,"id":"6c6b635e_237930d0","line":92,"updated":"2026-01-27 21:34:43.000000000","message":"nit: `for idx, fragment in enumerate(fragments[1:], start\u003d1):`","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"31ee36620f63648a800408a0b65ad9a2ea5a334b","unresolved":true,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        fragment_len \u003d len(fragments[0])"},{"line_number":91,"context_line":"        idx \u003d 0"},{"line_number":92,"context_line":"        for fragment in fragments[1:]:"},{"line_number":93,"context_line":"            idx +\u003d 1"},{"line_number":94,"context_line":"            if len(fragment) !\u003d fragment_len:"},{"line_number":95,"context_line":"                raise ECDriverErrorWithId("}],"source_content_type":"text/x-python","patch_set":4,"id":"b2c968ce_f794e366","line":92,"in_reply_to":"6c6b635e_237930d0","updated":"2026-01-28 08:15:17.000000000","message":"I think of using generate but \"fleme\"","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d43e91dcd312fd8a98e1a0ed2d3e32fff50fbfbc","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        fragment_len \u003d len(fragments[0])"},{"line_number":91,"context_line":"        idx \u003d 0"},{"line_number":92,"context_line":"        for fragment in fragments[1:]:"},{"line_number":93,"context_line":"            idx +\u003d 1"},{"line_number":94,"context_line":"            if len(fragment) !\u003d fragment_len:"},{"line_number":95,"context_line":"                raise ECDriverErrorWithId("}],"source_content_type":"text/x-python","patch_set":4,"id":"b05ff0fe_b2c580c2","line":92,"in_reply_to":"b2c968ce_f794e366","updated":"2026-01-28 18:16:22.000000000","message":"Done","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e2cfa137b9dba15839a0120f46ae292d68dbc52e","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        _fragment_payloads \u003d list(fragment_payloads)"},{"line_number":115,"context_line":"        fragment_len \u003d self._validate_and_return_fragment_size("},{"line_number":116,"context_line":"            \"reconstruct\", _fragment_payloads)"},{"line_number":117,"context_line":"        if fragment_len \u003c 0:"},{"line_number":118,"context_line":"            raise ECDriverError("},{"line_number":119,"context_line":"                \"Invalid fragment payload in ECPyECLibDriver.reconstruct\")"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"89a2ba1a_f1973d96","line":117,"updated":"2026-01-27 21:34:43.000000000","message":"Bonus: we can drop this check now!","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"31ee36620f63648a800408a0b65ad9a2ea5a334b","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        _fragment_payloads \u003d list(fragment_payloads)"},{"line_number":115,"context_line":"        fragment_len \u003d self._validate_and_return_fragment_size("},{"line_number":116,"context_line":"            \"reconstruct\", _fragment_payloads)"},{"line_number":117,"context_line":"        if fragment_len \u003c 0:"},{"line_number":118,"context_line":"            raise ECDriverError("},{"line_number":119,"context_line":"                \"Invalid fragment payload in ECPyECLibDriver.reconstruct\")"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fe1400ee_c47408c1","line":117,"in_reply_to":"89a2ba1a_f1973d96","updated":"2026-01-28 08:15:17.000000000","message":"good catch","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d43e91dcd312fd8a98e1a0ed2d3e32fff50fbfbc","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        _fragment_payloads \u003d list(fragment_payloads)"},{"line_number":115,"context_line":"        fragment_len \u003d self._validate_and_return_fragment_size("},{"line_number":116,"context_line":"            \"reconstruct\", _fragment_payloads)"},{"line_number":117,"context_line":"        if fragment_len \u003c 0:"},{"line_number":118,"context_line":"            raise ECDriverError("},{"line_number":119,"context_line":"                \"Invalid fragment payload in ECPyECLibDriver.reconstruct\")"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"8e9bf9d5_ad25d78f","line":117,"in_reply_to":"fe1400ee_c47408c1","updated":"2026-01-28 18:16:22.000000000","message":"Done","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"}],"pyeclib/ec_iface.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fc0a61c385fe9eda5ad97f73009b165b6255aa0a","unresolved":true,"context_lines":[{"line_number":448,"context_line":"        self.id_failing \u003d idx"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def __str__(self):"},{"line_number":451,"context_line":"        return f\"{self.error_str} {self.id_failing}\""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"# More specific exceptions, mapped to liberasurecode error codes"}],"source_content_type":"text/x-python","patch_set":2,"id":"ee0d0a37_c01ae380","line":451,"range":{"start_line":451,"start_character":15,"end_line":451,"end_character":52},"updated":"2026-01-27 17:09:54.000000000","message":"Maybe better as\n```\nreturn f\"{self.error_str} (index {self.id_failing})\"\n```\nor\n```\nreturn f\"{self.error_str} (position {self.id_failing})\"\n```","commit_id":"94894cb6fb4d44c41155438993ab2a44d01ce2ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e2cfa137b9dba15839a0120f46ae292d68dbc52e","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        self.id_failing \u003d idx"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def __str__(self):"},{"line_number":451,"context_line":"        return f\"{self.error_str} {self.id_failing}\""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"# More specific exceptions, mapped to liberasurecode error codes"}],"source_content_type":"text/x-python","patch_set":2,"id":"f00b78ca_28f82daa","line":451,"range":{"start_line":451,"start_character":15,"end_line":451,"end_character":52},"in_reply_to":"b5dfb550_b26d842f","updated":"2026-01-27 21:34:43.000000000","message":"Done","commit_id":"94894cb6fb4d44c41155438993ab2a44d01ce2ca"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"bd59e4736d5927e1c8998f72217e3005789601f3","unresolved":true,"context_lines":[{"line_number":448,"context_line":"        self.id_failing \u003d idx"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def __str__(self):"},{"line_number":451,"context_line":"        return f\"{self.error_str} {self.id_failing}\""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"# More specific exceptions, mapped to liberasurecode error codes"}],"source_content_type":"text/x-python","patch_set":2,"id":"b5dfb550_b26d842f","line":451,"range":{"start_line":451,"start_character":15,"end_line":451,"end_character":52},"in_reply_to":"ee0d0a37_c01ae380","updated":"2026-01-27 19:06:12.000000000","message":"agree","commit_id":"94894cb6fb4d44c41155438993ab2a44d01ce2ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e2cfa137b9dba15839a0120f46ae292d68dbc52e","unresolved":true,"context_lines":[{"line_number":442,"context_line":"        return self.error_str"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"class ECDriverErrorWithId(ECDriverError):"},{"line_number":446,"context_line":"    def __init__(self, error, idx):"},{"line_number":447,"context_line":"        super().__init__(error)"},{"line_number":448,"context_line":"        self.id_failing \u003d idx"}],"source_content_type":"text/x-python","patch_set":4,"id":"571fbc69_01895f2e","line":445,"range":{"start_line":445,"start_character":6,"end_line":445,"end_character":25},"updated":"2026-01-27 21:34:43.000000000","message":"Maybe better as `ECDriverErrorWithIndex`? IDK, I\u0027m struggling to think of a name I *really* **like**...","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d43e91dcd312fd8a98e1a0ed2d3e32fff50fbfbc","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        return self.error_str"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"class ECDriverErrorWithId(ECDriverError):"},{"line_number":446,"context_line":"    def __init__(self, error, idx):"},{"line_number":447,"context_line":"        super().__init__(error)"},{"line_number":448,"context_line":"        self.id_failing \u003d idx"}],"source_content_type":"text/x-python","patch_set":4,"id":"99caf86a_6a0b113b","line":445,"range":{"start_line":445,"start_character":6,"end_line":445,"end_character":25},"in_reply_to":"571fbc69_01895f2e","updated":"2026-01-28 18:16:22.000000000","message":"Done","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e2cfa137b9dba15839a0120f46ae292d68dbc52e","unresolved":true,"context_lines":[{"line_number":445,"context_line":"class ECDriverErrorWithId(ECDriverError):"},{"line_number":446,"context_line":"    def __init__(self, error, idx):"},{"line_number":447,"context_line":"        super().__init__(error)"},{"line_number":448,"context_line":"        self.id_failing \u003d idx"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def __str__(self):"},{"line_number":451,"context_line":"        return f\"{self.error_str} (position {self.id_failing})\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9eeed448_601a186a","line":448,"range":{"start_line":448,"start_character":13,"end_line":448,"end_character":23},"updated":"2026-01-27 21:34:43.000000000","message":"Maybe better named `position`? Or `index`?","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"31ee36620f63648a800408a0b65ad9a2ea5a334b","unresolved":true,"context_lines":[{"line_number":445,"context_line":"class ECDriverErrorWithId(ECDriverError):"},{"line_number":446,"context_line":"    def __init__(self, error, idx):"},{"line_number":447,"context_line":"        super().__init__(error)"},{"line_number":448,"context_line":"        self.id_failing \u003d idx"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def __str__(self):"},{"line_number":451,"context_line":"        return f\"{self.error_str} (position {self.id_failing})\""}],"source_content_type":"text/x-python","patch_set":4,"id":"b2416130_ca904e85","line":448,"range":{"start_line":448,"start_character":13,"end_line":448,"end_character":23},"in_reply_to":"9eeed448_601a186a","updated":"2026-01-28 08:15:17.000000000","message":"position seems better","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d43e91dcd312fd8a98e1a0ed2d3e32fff50fbfbc","unresolved":false,"context_lines":[{"line_number":445,"context_line":"class ECDriverErrorWithId(ECDriverError):"},{"line_number":446,"context_line":"    def __init__(self, error, idx):"},{"line_number":447,"context_line":"        super().__init__(error)"},{"line_number":448,"context_line":"        self.id_failing \u003d idx"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def __str__(self):"},{"line_number":451,"context_line":"        return f\"{self.error_str} (position {self.id_failing})\""}],"source_content_type":"text/x-python","patch_set":4,"id":"05c013fa_22880e5b","line":448,"range":{"start_line":448,"start_character":13,"end_line":448,"end_character":23},"in_reply_to":"b2416130_ca904e85","updated":"2026-01-28 18:16:22.000000000","message":"Done","commit_id":"c1aa13b739288e83b4195b9f1ae22749a7b6271e"}]}
