)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"017ca4d09eff7b414a87cc66e90cc6f84ea0ca53","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"c93f1aa2_6389bde6","updated":"2026-05-02 02:56:50.000000000","message":"recheck CI issues","commit_id":"98717015d6930ec55710d32de181b475a4f6c4f5"}],"neutron/conf/plugins/ml2/drivers/driver_type.py":[{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"89711419450ec6ee5c4a234d366e9c30d4f32e94","unresolved":true,"context_lines":[{"line_number":66,"context_line":"                      \"enable sending all broadcast traffic to this multicast \""},{"line_number":67,"context_line":"                      \"group. When left unconfigured, will disable multicast \""},{"line_number":68,"context_line":"                      \"VXLAN mode.\")),"},{"line_number":69,"context_line":"    cfg.StrOpt(\u0027tenant_physical_network\u0027,"},{"line_number":70,"context_line":"               default\u003dNone,"},{"line_number":71,"context_line":"               help\u003d_(\"Optional physical network name to tag on all \""},{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fba275d_ad785979","line":69,"range":{"start_line":69,"start_character":0,"end_line":69,"end_character":41},"updated":"2026-04-23 08:26:26.000000000","message":"Instead of adding new API fields, we can just remove the current limitation to support physical_network for VXLAN networks. Right?","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1bc65a639bef8bae94140de60cb0a2251c6e1198","unresolved":true,"context_lines":[{"line_number":66,"context_line":"                      \"enable sending all broadcast traffic to this multicast \""},{"line_number":67,"context_line":"                      \"group. When left unconfigured, will disable multicast \""},{"line_number":68,"context_line":"                      \"VXLAN mode.\")),"},{"line_number":69,"context_line":"    cfg.StrOpt(\u0027tenant_physical_network\u0027,"},{"line_number":70,"context_line":"               default\u003dNone,"},{"line_number":71,"context_line":"               help\u003d_(\"Optional physical network name to tag on all \""},{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""}],"source_content_type":"text/x-python","patch_set":2,"id":"31ed836c_f8a906f1","line":69,"range":{"start_line":69,"start_character":16,"end_line":69,"end_character":22},"updated":"2026-04-22 19:37:29.000000000","message":"Neutron is deprecating the usage of \u0027tenant\u0027 everywhere, please use \u0027project\u0027 here and else where.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"9d481d1dc5b6ba7c9d6ef9789656175d00e4bf7f","unresolved":true,"context_lines":[{"line_number":66,"context_line":"                      \"enable sending all broadcast traffic to this multicast \""},{"line_number":67,"context_line":"                      \"group. When left unconfigured, will disable multicast \""},{"line_number":68,"context_line":"                      \"VXLAN mode.\")),"},{"line_number":69,"context_line":"    cfg.StrOpt(\u0027tenant_physical_network\u0027,"},{"line_number":70,"context_line":"               default\u003dNone,"},{"line_number":71,"context_line":"               help\u003d_(\"Optional physical network name to tag on all \""},{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""}],"source_content_type":"text/x-python","patch_set":2,"id":"99b50f3f_a1c55178","line":69,"range":{"start_line":69,"start_character":16,"end_line":69,"end_character":22},"in_reply_to":"31ed836c_f8a906f1","updated":"2026-04-27 21:53:15.000000000","message":"I see you\u0027ve called it `project_network_types` for the former `tenant_network_types`. I\u0027ll call this `project_physical_network` and I\u0027ll only register it for the vxlan type.\n\nI can honestly leave this out if you\u0027d prefer. Today there\u0027s no option for this for vlan network type because when a self-service network (non-provider) is created the physical_network defaults to None as far as I can tell.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"9d481d1dc5b6ba7c9d6ef9789656175d00e4bf7f","unresolved":true,"context_lines":[{"line_number":66,"context_line":"                      \"enable sending all broadcast traffic to this multicast \""},{"line_number":67,"context_line":"                      \"group. When left unconfigured, will disable multicast \""},{"line_number":68,"context_line":"                      \"VXLAN mode.\")),"},{"line_number":69,"context_line":"    cfg.StrOpt(\u0027tenant_physical_network\u0027,"},{"line_number":70,"context_line":"               default\u003dNone,"},{"line_number":71,"context_line":"               help\u003d_(\"Optional physical network name to tag on all \""},{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""}],"source_content_type":"text/x-python","patch_set":2,"id":"e75d2321_b9d93d10","line":69,"range":{"start_line":69,"start_character":0,"end_line":69,"end_character":41},"in_reply_to":"3fba275d_ad785979","updated":"2026-04-27 21:53:15.000000000","message":"This isn\u0027t a new API field. It was to make configurable fallbacks. But look at my comment to Brian. I\u0027m happy to drop this field.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"f8d712c7061182cb802608534c767eaf8336c890","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                      \"enable sending all broadcast traffic to this multicast \""},{"line_number":67,"context_line":"                      \"group. When left unconfigured, will disable multicast \""},{"line_number":68,"context_line":"                      \"VXLAN mode.\")),"},{"line_number":69,"context_line":"    cfg.StrOpt(\u0027tenant_physical_network\u0027,"},{"line_number":70,"context_line":"               default\u003dNone,"},{"line_number":71,"context_line":"               help\u003d_(\"Optional physical network name to tag on all \""},{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""}],"source_content_type":"text/x-python","patch_set":2,"id":"f5a096f9_3b3fff55","line":69,"range":{"start_line":69,"start_character":16,"end_line":69,"end_character":22},"in_reply_to":"99b50f3f_a1c55178","updated":"2026-04-30 22:53:56.000000000","message":"Done","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"f8d712c7061182cb802608534c767eaf8336c890","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                      \"enable sending all broadcast traffic to this multicast \""},{"line_number":67,"context_line":"                      \"group. When left unconfigured, will disable multicast \""},{"line_number":68,"context_line":"                      \"VXLAN mode.\")),"},{"line_number":69,"context_line":"    cfg.StrOpt(\u0027tenant_physical_network\u0027,"},{"line_number":70,"context_line":"               default\u003dNone,"},{"line_number":71,"context_line":"               help\u003d_(\"Optional physical network name to tag on all \""},{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""}],"source_content_type":"text/x-python","patch_set":2,"id":"be22fab0_da461e2e","line":69,"range":{"start_line":69,"start_character":0,"end_line":69,"end_character":41},"in_reply_to":"e75d2321_b9d93d10","updated":"2026-04-30 22:53:56.000000000","message":"Done","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1bc65a639bef8bae94140de60cb0a2251c6e1198","unresolved":true,"context_lines":[{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""},{"line_number":73,"context_line":"                      \"Used in multi-fabric deployments where VXLAN segments \""},{"line_number":74,"context_line":"                      \"must be associated with a specific underlay fabric. \""},{"line_number":75,"context_line":"                      \"Defaults to None, which preserves existing behavior.\")),"},{"line_number":76,"context_line":"]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"vlan_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"e8bbc6bb_d374d3c6","line":75,"range":{"start_line":75,"start_character":23,"end_line":75,"end_character":39},"updated":"2026-04-22 19:37:29.000000000","message":"Setting default\u003dNone above should add what the default is, so this shouldn\u0027t be added. But maybe \"When set to None existing behavior is preserved\" if we really think we need it.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"f8d712c7061182cb802608534c767eaf8336c890","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""},{"line_number":73,"context_line":"                      \"Used in multi-fabric deployments where VXLAN segments \""},{"line_number":74,"context_line":"                      \"must be associated with a specific underlay fabric. \""},{"line_number":75,"context_line":"                      \"Defaults to None, which preserves existing behavior.\")),"},{"line_number":76,"context_line":"]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"vlan_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"bcd7dce5_8ee8c9af","line":75,"range":{"start_line":75,"start_character":23,"end_line":75,"end_character":39},"in_reply_to":"ade03132_cc36b363","updated":"2026-04-30 22:53:56.000000000","message":"Done","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"9d481d1dc5b6ba7c9d6ef9789656175d00e4bf7f","unresolved":true,"context_lines":[{"line_number":72,"context_line":"                      \"automatically allocated VXLAN tenant network segments. \""},{"line_number":73,"context_line":"                      \"Used in multi-fabric deployments where VXLAN segments \""},{"line_number":74,"context_line":"                      \"must be associated with a specific underlay fabric. \""},{"line_number":75,"context_line":"                      \"Defaults to None, which preserves existing behavior.\")),"},{"line_number":76,"context_line":"]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"vlan_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"ade03132_cc36b363","line":75,"range":{"start_line":75,"start_character":23,"end_line":75,"end_character":39},"in_reply_to":"e8bbc6bb_d374d3c6","updated":"2026-04-27 21:53:15.000000000","message":"See the above comment to see if I should drop this option entirely.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"}],"neutron/plugins/ml2/drivers/type_vxlan.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1bc65a639bef8bae94140de60cb0a2251c6e1198","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                          \u0027tunnel\u0027: segment.get(api.NETWORK_TYPE)})"},{"line_number":72,"context_line":"                raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def allocate_tenant_segment(self, context, filters\u003dNone):"},{"line_number":75,"context_line":"        filters \u003d filters or {}"},{"line_number":76,"context_line":"        alloc \u003d self.allocate_partially_specified_segment(context, **filters)"},{"line_number":77,"context_line":"        if not alloc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fb7b4db1_adc3723d","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":31},"updated":"2026-04-22 19:37:29.000000000","message":"fyi: once we bump requirements this can change to allocate_project_segment","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"dbc26c69e63a8ab5323b059c99a08f705d6155f6","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                          \u0027tunnel\u0027: segment.get(api.NETWORK_TYPE)})"},{"line_number":72,"context_line":"                raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def allocate_tenant_segment(self, context, filters\u003dNone):"},{"line_number":75,"context_line":"        filters \u003d filters or {}"},{"line_number":76,"context_line":"        alloc \u003d self.allocate_partially_specified_segment(context, **filters)"},{"line_number":77,"context_line":"        if not alloc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"c83c2307_224b76b3","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":31},"in_reply_to":"e31d766f_f09a5f30","updated":"2026-05-05 18:30:13.000000000","message":"No, that\u0027s fine, just mentioning in case that happens before this merges","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"9d481d1dc5b6ba7c9d6ef9789656175d00e4bf7f","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                          \u0027tunnel\u0027: segment.get(api.NETWORK_TYPE)})"},{"line_number":72,"context_line":"                raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def allocate_tenant_segment(self, context, filters\u003dNone):"},{"line_number":75,"context_line":"        filters \u003d filters or {}"},{"line_number":76,"context_line":"        alloc \u003d self.allocate_partially_specified_segment(context, **filters)"},{"line_number":77,"context_line":"        if not alloc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"e31d766f_f09a5f30","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":31},"in_reply_to":"fb7b4db1_adc3723d","updated":"2026-04-27 21:53:15.000000000","message":"I can wait for that bump to land if you\u0027d prefer.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1bc65a639bef8bae94140de60cb0a2251c6e1198","unresolved":true,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def get_mtu(self, physical_network\u003dNone):"},{"line_number":105,"context_line":"        mtu \u003d super().get_mtu()"},{"line_number":106,"context_line":"        return mtu - p_const.VXLAN_ENCAP_OVERHEAD if mtu else 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"ca07f914_e771e2e5","line":106,"updated":"2026-04-22 19:37:29.000000000","message":"This method actually never uses physical_network like the vlan version, so an update is needed here.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"f8d712c7061182cb802608534c767eaf8336c890","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def get_mtu(self, physical_network\u003dNone):"},{"line_number":105,"context_line":"        mtu \u003d super().get_mtu()"},{"line_number":106,"context_line":"        return mtu - p_const.VXLAN_ENCAP_OVERHEAD if mtu else 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"586cd1af_cea0e0ff","line":106,"in_reply_to":"90d23c1a_2a820670","updated":"2026-04-30 22:53:56.000000000","message":"Done","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"9d481d1dc5b6ba7c9d6ef9789656175d00e4bf7f","unresolved":true,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def get_mtu(self, physical_network\u003dNone):"},{"line_number":105,"context_line":"        mtu \u003d super().get_mtu()"},{"line_number":106,"context_line":"        return mtu - p_const.VXLAN_ENCAP_OVERHEAD if mtu else 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"90d23c1a_2a820670","line":106,"in_reply_to":"ca07f914_e771e2e5","updated":"2026-04-27 21:53:15.000000000","message":"I\u0027ll clean it up.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"dbc26c69e63a8ab5323b059c99a08f705d6155f6","unresolved":true,"context_lines":[{"line_number":91,"context_line":"        else:"},{"line_number":92,"context_line":"            segmentation_id \u003d segment.get(api.SEGMENTATION_ID)"},{"line_number":93,"context_line":"            alloc \u003d self.allocate_fully_specified_segment("},{"line_number":94,"context_line":"                context, **{self.segmentation_key: segmentation_id})"},{"line_number":95,"context_line":"            if not alloc:"},{"line_number":96,"context_line":"                raise n_exc.TunnelIdInUse(tunnel_id\u003dsegmentation_id)"},{"line_number":97,"context_line":"        physical_network \u003d segment.get(api.PHYSICAL_NETWORK)"}],"source_content_type":"text/x-python","patch_set":4,"id":"686ac873_1781fdd2","line":94,"updated":"2026-05-05 18:30:13.000000000","message":"So we don\u0027t pass the other filters here? I\u0027m just comparing this to type_vlan.py and figured it would be almost identical","commit_id":"98717015d6930ec55710d32de181b475a4f6c4f5"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"a116cd22955f22bda31b0e1e4e45884c5846be9f","unresolved":true,"context_lines":[{"line_number":91,"context_line":"        else:"},{"line_number":92,"context_line":"            segmentation_id \u003d segment.get(api.SEGMENTATION_ID)"},{"line_number":93,"context_line":"            alloc \u003d self.allocate_fully_specified_segment("},{"line_number":94,"context_line":"                context, **{self.segmentation_key: segmentation_id})"},{"line_number":95,"context_line":"            if not alloc:"},{"line_number":96,"context_line":"                raise n_exc.TunnelIdInUse(tunnel_id\u003dsegmentation_id)"},{"line_number":97,"context_line":"        physical_network \u003d segment.get(api.PHYSICAL_NETWORK)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ef34378_50b030b5","line":94,"in_reply_to":"686ac873_1781fdd2","updated":"2026-05-11 22:31:09.000000000","message":"No cause we don\u0027t have \"physical_network\" as a column in the VxlanAllocation table. It\u0027s only in the VlanAllocation table. This patch series keeps the concept of a global unique VNI range. But uses \"physical_network\" to divide up allocation requests. As a result additional filters would not be valid. Future follow ups can expand this and then filters will be valid.","commit_id":"98717015d6930ec55710d32de181b475a4f6c4f5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"dbc26c69e63a8ab5323b059c99a08f705d6155f6","unresolved":true,"context_lines":[{"line_number":94,"context_line":"                context, **{self.segmentation_key: segmentation_id})"},{"line_number":95,"context_line":"            if not alloc:"},{"line_number":96,"context_line":"                raise n_exc.TunnelIdInUse(tunnel_id\u003dsegmentation_id)"},{"line_number":97,"context_line":"        physical_network \u003d segment.get(api.PHYSICAL_NETWORK)"},{"line_number":98,"context_line":"        return {api.NETWORK_TYPE: self.get_type(),"},{"line_number":99,"context_line":"                api.PHYSICAL_NETWORK: physical_network,"},{"line_number":100,"context_line":"                api.SEGMENTATION_ID: getattr(alloc, self.segmentation_key),"}],"source_content_type":"text/x-python","patch_set":4,"id":"b6ce4bd8_dc57ac08","line":97,"updated":"2026-05-05 18:30:13.000000000","message":"Same with physical_network being a filter.","commit_id":"98717015d6930ec55710d32de181b475a4f6c4f5"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"a116cd22955f22bda31b0e1e4e45884c5846be9f","unresolved":true,"context_lines":[{"line_number":94,"context_line":"                context, **{self.segmentation_key: segmentation_id})"},{"line_number":95,"context_line":"            if not alloc:"},{"line_number":96,"context_line":"                raise n_exc.TunnelIdInUse(tunnel_id\u003dsegmentation_id)"},{"line_number":97,"context_line":"        physical_network \u003d segment.get(api.PHYSICAL_NETWORK)"},{"line_number":98,"context_line":"        return {api.NETWORK_TYPE: self.get_type(),"},{"line_number":99,"context_line":"                api.PHYSICAL_NETWORK: physical_network,"},{"line_number":100,"context_line":"                api.SEGMENTATION_ID: getattr(alloc, self.segmentation_key),"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6d1e4c_f02ea04f","line":97,"in_reply_to":"b6ce4bd8_dc57ac08","updated":"2026-05-11 22:31:09.000000000","message":"Same answer as above.","commit_id":"98717015d6930ec55710d32de181b475a4f6c4f5"}],"releasenotes/notes/vxlan-physnet-support-03866d079f8e2b11.yaml":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1bc65a639bef8bae94140de60cb0a2251c6e1198","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"99d2063e_d2dcf931","line":28,"updated":"2026-04-22 19:37:29.000000000","message":"These 3 items show up in two different sections of the release notes, making it a little confusing. These last two look like should be in the docs instead?","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"f8d712c7061182cb802608534c767eaf8336c890","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"99bc2e8f_4bb973c9","line":28,"in_reply_to":"040a98b2_e9413c70","updated":"2026-04-30 22:53:56.000000000","message":"Done","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"9d481d1dc5b6ba7c9d6ef9789656175d00e4bf7f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"040a98b2_e9413c70","line":28,"in_reply_to":"99d2063e_d2dcf931","updated":"2026-04-27 21:53:15.000000000","message":"I\u0027ll clean it up.","commit_id":"0e0eb258e9a6a9182cc0038442a7c0d6c6fc1db4"}]}
