)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"efed5a8c9a4ae425429f55dae7c1cee338eb2c97","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b9f71a13_0ce4e644","updated":"2025-05-15 22:24:11.000000000","message":"recheck grenade job break fix merged","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"}],"ironic/api/controllers/v1/firmware.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dc94018670ca5e595f1d5d3f49c1fd023c1d2faa","unresolved":true,"context_lines":[{"line_number":67,"context_line":"        min_version\u003dversions.MINOR_86_FIRMWARE_INTERFACE,"},{"line_number":68,"context_line":"        message\u003d_(\u0027The API version does not allow node firmware\u0027),"},{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"}],"source_content_type":"text/x-python","patch_set":2,"id":"b75c5aea_9c5e01fb","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":74},"updated":"2025-04-01 13:23:12.000000000","message":"1.86 is our min version, not our max version, right?\n\n```suggestion\n    @validation.request_query_schema(schema.index_request_query, 86)\n    @validation.response_body_schema(schema.index_response_body, 86)\n```\n\nI\u0027m almost certain I had a test written _somewhere_ that would ensured there were schema for each version covered by the `@validation.api_version` decorator but heck if I can find it now 😕 It should relatively easy to add though. We keep track of the supported versions for an API via `min_version` and `max_version` attributes on the API function, and we keep track of supported versions for a schema via the `Schemas` class accessible via attributes like `request_query_schemas` on same, making it a mere set equality check. I\u0027ll likely copy-paste it elsewhere if you do end up writing it 😉","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"65c365c0dc3b11052333f7638f2a70a88f6cae5d","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        min_version\u003dversions.MINOR_86_FIRMWARE_INTERFACE,"},{"line_number":68,"context_line":"        message\u003d_(\u0027The API version does not allow node firmware\u0027),"},{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"}],"source_content_type":"text/x-python","patch_set":2,"id":"7070f4b6_f969c70c","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":74},"in_reply_to":"b75c5aea_9c5e01fb","updated":"2025-05-01 14:46:51.000000000","message":"Fix applied.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dc94018670ca5e595f1d5d3f49c1fd023c1d2faa","unresolved":true,"context_lines":[{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":75,"context_line":"    # a separate, simpler decorator."},{"line_number":76,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":77,"context_line":"    def get_all(self, detail\u003dNone, fields\u003dNone):"},{"line_number":78,"context_line":"        \"\"\"List node firmware components.\"\"\""},{"line_number":79,"context_line":"        node \u003d api_utils.check_node_policy_and_retrieve("}],"source_content_type":"text/x-python","patch_set":2,"id":"c499500b_983ad336","line":76,"range":{"start_line":72,"start_character":0,"end_line":76,"end_character":43},"updated":"2025-04-01 13:23:12.000000000","message":"I think you want to place these *before* the schema handlers so that they run first (decorators go from outside in, but you already knew that). That lets us write schemas so that, in this case, it works with arrays of strings rather than a CSV string, since that\u0027s how OpenAPI models querystring parameters.\n\nhttps://swagger.io/docs/specification/v3_0/serialization/#query-parameters\n\n(this page is linked from schema file)\n\nCoincidentally, the fact this is passing suggests we are missing a unit or functional test...? We might also want a check in the `args.validate` function to ensure none of the variables associated with the schema decorators (e.g. `request_parameter_schemas`) is set, since that would imply the decorator has already run.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"14c03ccb2a2313c94ca02fc7b953cef5d5045b42","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":75,"context_line":"    # a separate, simpler decorator."},{"line_number":76,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":77,"context_line":"    def get_all(self, detail\u003dNone, fields\u003dNone):"},{"line_number":78,"context_line":"        \"\"\"List node firmware components.\"\"\""},{"line_number":79,"context_line":"        node \u003d api_utils.check_node_policy_and_retrieve("}],"source_content_type":"text/x-python","patch_set":2,"id":"8c1678ee_7d5102aa","line":76,"range":{"start_line":72,"start_character":0,"end_line":76,"end_character":43},"in_reply_to":"1855670d_e9f263cf","updated":"2025-05-05 13:16:29.000000000","message":"Done","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"975f0b714b1b10b4f99860dbd71ebe36550f13d9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":75,"context_line":"    # a separate, simpler decorator."},{"line_number":76,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":77,"context_line":"    def get_all(self, detail\u003dNone, fields\u003dNone):"},{"line_number":78,"context_line":"        \"\"\"List node firmware components.\"\"\""},{"line_number":79,"context_line":"        node \u003d api_utils.check_node_policy_and_retrieve("}],"source_content_type":"text/x-python","patch_set":2,"id":"0b15b6b1_70fd2407","line":76,"range":{"start_line":72,"start_character":0,"end_line":76,"end_character":43},"in_reply_to":"50c0ed08_05745643","updated":"2025-05-15 12:40:00.000000000","message":"Done","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"ab823b95dc95086d2ea0b92bd86340192c274698","unresolved":true,"context_lines":[{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":75,"context_line":"    # a separate, simpler decorator."},{"line_number":76,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":77,"context_line":"    def get_all(self, detail\u003dNone, fields\u003dNone):"},{"line_number":78,"context_line":"        \"\"\"List node firmware components.\"\"\""},{"line_number":79,"context_line":"        node \u003d api_utils.check_node_policy_and_retrieve("}],"source_content_type":"text/x-python","patch_set":2,"id":"1855670d_e9f263cf","line":76,"range":{"start_line":72,"start_character":0,"end_line":76,"end_character":43},"in_reply_to":"551fff55_12ee31ff","updated":"2025-05-05 12:56:08.000000000","message":"Ah okay, yes that is essentially the change I had done. I will put that in here.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"325f3e0d0e4d928464dfc024e100e305bb983020","unresolved":true,"context_lines":[{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":75,"context_line":"    # a separate, simpler decorator."},{"line_number":76,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":77,"context_line":"    def get_all(self, detail\u003dNone, fields\u003dNone):"},{"line_number":78,"context_line":"        \"\"\"List node firmware components.\"\"\""},{"line_number":79,"context_line":"        node \u003d api_utils.check_node_policy_and_retrieve("}],"source_content_type":"text/x-python","patch_set":2,"id":"50c0ed08_05745643","line":76,"range":{"start_line":72,"start_character":0,"end_line":76,"end_character":43},"in_reply_to":"5ad01972_aaddfa64","updated":"2025-05-15 12:18:25.000000000","message":"That\u0027s because I had this - and subsequently my logic - backwards 😅\n\n\u003e (decorators go from outside in, but you already knew that)\n\nThey\u0027re called from the outside in, but they are executed from outside in and the decorator wrap.\n\nLet me rework that decorator again.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"f2731c9a325e7c141279d46cb38cf631e119099e","unresolved":true,"context_lines":[{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":75,"context_line":"    # a separate, simpler decorator."},{"line_number":76,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":77,"context_line":"    def get_all(self, detail\u003dNone, fields\u003dNone):"},{"line_number":78,"context_line":"        \"\"\"List node firmware components.\"\"\""},{"line_number":79,"context_line":"        node \u003d api_utils.check_node_policy_and_retrieve("}],"source_content_type":"text/x-python","patch_set":2,"id":"5ad01972_aaddfa64","line":76,"range":{"start_line":72,"start_character":0,"end_line":76,"end_character":43},"in_reply_to":"8c1678ee_7d5102aa","updated":"2025-05-15 00:46:33.000000000","message":"Hey Stephen, so I changed the order to what you suggested, and actually started getting the runtime errors. I reverted back to this.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"e839865bb04afc00d787fc1fd204aabc3af99117","unresolved":true,"context_lines":[{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":75,"context_line":"    # a separate, simpler decorator."},{"line_number":76,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":77,"context_line":"    def get_all(self, detail\u003dNone, fields\u003dNone):"},{"line_number":78,"context_line":"        \"\"\"List node firmware components.\"\"\""},{"line_number":79,"context_line":"        node \u003d api_utils.check_node_policy_and_retrieve("}],"source_content_type":"text/x-python","patch_set":2,"id":"fe526af8_61ae8ff2","line":76,"range":{"start_line":72,"start_character":0,"end_line":76,"end_character":43},"in_reply_to":"c499500b_983ad336","updated":"2025-05-04 13:15:47.000000000","message":"Yes, there are node firmware unit tests missing, I identified this in other work. I am not 100% sure where to begin on that, and imagine it is not urgent?\n\nTo answer the latter part, I will admit my experience with decorators at this level of complication is limited, but I think I understand what you are asking. I am unsure if there is a more efficient way to do this than have to cross-check between all the decorators we have defined that they run in the right order.\n\nFor now, I am going to make sure that validate runs before request_query_schema and response_body_schema. Let me know if that is enough.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"af39f1f859b8d4978a63d8bccdd204e7040c7f2b","unresolved":true,"context_lines":[{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    @validation.request_query_schema(schema.index_request_query, None, 86)"},{"line_number":71,"context_line":"    @validation.response_body_schema(schema.index_response_body, None, 86)"},{"line_number":72,"context_line":"    # TODO(adamcarthur, stephenfin): We are currently using this for"},{"line_number":73,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":74,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":75,"context_line":"    # a separate, simpler decorator."},{"line_number":76,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":77,"context_line":"    def get_all(self, detail\u003dNone, fields\u003dNone):"},{"line_number":78,"context_line":"        \"\"\"List node firmware components.\"\"\""},{"line_number":79,"context_line":"        node \u003d api_utils.check_node_policy_and_retrieve("}],"source_content_type":"text/x-python","patch_set":2,"id":"551fff55_12ee31ff","line":76,"range":{"start_line":72,"start_character":0,"end_line":76,"end_character":43},"in_reply_to":"fe526af8_61ae8ff2","updated":"2025-05-05 12:00:21.000000000","message":"https://review.opendev.org/c/openstack/ironic/+/948795","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"27e933395d7233f827acf5d0d795cc4f39c777bb","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":68,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":69,"context_line":"    # a separate, simpler decorator."},{"line_number":70,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":71,"context_line":"    @validation.api_version("},{"line_number":72,"context_line":"        min_version\u003dversions.MINOR_86_FIRMWARE_INTERFACE,"},{"line_number":73,"context_line":"        message\u003d_(\u0027The API version does not allow node firmware\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"43e786fd_224bd668","line":70,"updated":"2025-05-15 17:12:40.000000000","message":"Unit test failures indicate this needs to be the first decorator (directly above get_all) in order to be correct.","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6ea430ef7051751901c0b074484d1354975a5e89","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":68,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":69,"context_line":"    # a separate, simpler decorator."},{"line_number":70,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":71,"context_line":"    @validation.api_version("},{"line_number":72,"context_line":"        min_version\u003dversions.MINOR_86_FIRMWARE_INTERFACE,"},{"line_number":73,"context_line":"        message\u003d_(\u0027The API version does not allow node firmware\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"77c2dc82_cd80eac5","line":70,"in_reply_to":"43e786fd_224bd668","updated":"2025-05-15 22:11:47.000000000","message":"I think you\u0027re looking at old results? Unit tests seem to be passing now?","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"f9456eaafe0d761f70c91e17dcfc10ef01af847b","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":68,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":69,"context_line":"    # a separate, simpler decorator."},{"line_number":70,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":71,"context_line":"    @validation.api_version("},{"line_number":72,"context_line":"        min_version\u003dversions.MINOR_86_FIRMWARE_INTERFACE,"},{"line_number":73,"context_line":"        message\u003d_(\u0027The API version does not allow node firmware\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fcac3b7_d1eb4e27","line":70,"in_reply_to":"723c1635_4abeeb6e","updated":"2025-06-04 17:37:27.000000000","message":"Done","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"07a61d6280c9e7bfc14873aa841b0df4e6ee1cb7","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    # side-effects to e.g. convert a CSV string to an array or a string"},{"line_number":68,"context_line":"    # to an integer. We should probably rename this decorator or provide"},{"line_number":69,"context_line":"    # a separate, simpler decorator."},{"line_number":70,"context_line":"    @args.validate(fields\u003dargs.string_list)"},{"line_number":71,"context_line":"    @validation.api_version("},{"line_number":72,"context_line":"        min_version\u003dversions.MINOR_86_FIRMWARE_INTERFACE,"},{"line_number":73,"context_line":"        message\u003d_(\u0027The API version does not allow node firmware\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"723c1635_4abeeb6e","line":70,"in_reply_to":"77c2dc82_cd80eac5","updated":"2025-05-16 16:39:26.000000000","message":"Yeah, was looking at an old patchset with Adam when I posted this","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"}],"ironic/api/schemas/v1/firmware.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dc94018670ca5e595f1d5d3f49c1fd023c1d2faa","unresolved":true,"context_lines":[{"line_number":48,"context_line":"        \u0027created_at\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027format\u0027: \u0027date-time\u0027},"},{"line_number":49,"context_line":"        \u0027updated_at\u0027: {\u0027type\u0027: [\u0027string\u0027, \u0027null\u0027], \u0027format\u0027: \u0027date-time\u0027},"},{"line_number":50,"context_line":"    },"},{"line_number":51,"context_line":"    # NOTE(adamcarthur, stephenfin): The \u0027fields\u0027 parameter"},{"line_number":52,"context_line":"    # means nothing is required"},{"line_number":53,"context_line":"    \u0027required\u0027: [],"},{"line_number":54,"context_line":"    \u0027additionalProperties\u0027: False,"}],"source_content_type":"text/x-python","patch_set":2,"id":"cb2ebc05_799245d2","line":51,"range":{"start_line":51,"start_character":22,"end_line":51,"end_character":34},"updated":"2025-04-01 13:23:12.000000000","message":"Feel free to drop me from these assuming you understand/agree them. They could get a bit out of hand otherwise.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"e839865bb04afc00d787fc1fd204aabc3af99117","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \u0027created_at\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027format\u0027: \u0027date-time\u0027},"},{"line_number":49,"context_line":"        \u0027updated_at\u0027: {\u0027type\u0027: [\u0027string\u0027, \u0027null\u0027], \u0027format\u0027: \u0027date-time\u0027},"},{"line_number":50,"context_line":"    },"},{"line_number":51,"context_line":"    # NOTE(adamcarthur, stephenfin): The \u0027fields\u0027 parameter"},{"line_number":52,"context_line":"    # means nothing is required"},{"line_number":53,"context_line":"    \u0027required\u0027: [],"},{"line_number":54,"context_line":"    \u0027additionalProperties\u0027: False,"}],"source_content_type":"text/x-python","patch_set":2,"id":"4c66a1ff_54618321","line":51,"range":{"start_line":51,"start_character":22,"end_line":51,"end_character":34},"in_reply_to":"cb2ebc05_799245d2","updated":"2025-05-04 13:15:47.000000000","message":"Done","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dc94018670ca5e595f1d5d3f49c1fd023c1d2faa","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":55,"context_line":"}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"index_response_body \u003d {"},{"line_number":58,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":59,"context_line":"    \u0027properties\u0027: {"},{"line_number":60,"context_line":"        \u0027firmware\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"22a89022_2cbdcd22","line":57,"updated":"2025-04-01 13:23:12.000000000","message":"nit: I tend to suffix these with a version if that version is anything other than 0. It just gives you a prod that versions are different.\n\n```suggestion\nindex_response_body_v86 \u003d {\n```\n\nditto fro the query schema below","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"44700bda08f56466645b42a4fb21b72f38efece7","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":55,"context_line":"}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"index_response_body \u003d {"},{"line_number":58,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":59,"context_line":"    \u0027properties\u0027: {"},{"line_number":60,"context_line":"        \u0027firmware\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"be602e60_de872d30","line":57,"in_reply_to":"22a89022_2cbdcd22","updated":"2025-05-04 12:29:11.000000000","message":"Fix applied.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"14c03ccb2a2313c94ca02fc7b953cef5d5045b42","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":55,"context_line":"}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"index_response_body \u003d {"},{"line_number":58,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":59,"context_line":"    \u0027properties\u0027: {"},{"line_number":60,"context_line":"        \u0027firmware\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"2b6d97a3_bc2725a5","line":57,"in_reply_to":"73f9a9e3_e7b48f7f","updated":"2025-05-05 13:16:29.000000000","message":"Done","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"af39f1f859b8d4978a63d8bccdd204e7040c7f2b","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":55,"context_line":"}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"index_response_body \u003d {"},{"line_number":58,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":59,"context_line":"    \u0027properties\u0027: {"},{"line_number":60,"context_line":"        \u0027firmware\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"fe787fb3_b39b79ad","line":57,"in_reply_to":"aaa200ab_fdb0e066","updated":"2025-05-05 12:00:21.000000000","message":"You\u0027re right: I didn\u0027t do that there either. That was an oversight on my part. However - having thought on this more - there\u0027s only one schema here so the suffix is probably superfluous. We could probably leave it out after all (i.e. undo the change you just made). If we keep it, we should suffix `index_request_query` also.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"e839865bb04afc00d787fc1fd204aabc3af99117","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":55,"context_line":"}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"index_response_body \u003d {"},{"line_number":58,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":59,"context_line":"    \u0027properties\u0027: {"},{"line_number":60,"context_line":"        \u0027firmware\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"aaa200ab_fdb0e066","line":57,"in_reply_to":"be602e60_de872d30","updated":"2025-05-04 13:15:47.000000000","message":"I was following the pattern of shard... which doesn\u0027t have this? Happy to apply it here but we probably should be consistent. Unless I am missing something completely?","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"ab823b95dc95086d2ea0b92bd86340192c274698","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":55,"context_line":"}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"index_response_body \u003d {"},{"line_number":58,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":59,"context_line":"    \u0027properties\u0027: {"},{"line_number":60,"context_line":"        \u0027firmware\u0027: {"}],"source_content_type":"text/x-python","patch_set":2,"id":"73f9a9e3_e7b48f7f","line":57,"in_reply_to":"fe787fb3_b39b79ad","updated":"2025-05-05 12:56:08.000000000","message":"Sounds good, thank you for getting back so quickly 😊","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dc94018670ca5e595f1d5d3f49c1fd023c1d2faa","unresolved":true,"context_lines":[{"line_number":59,"context_line":"    \u0027properties\u0027: {"},{"line_number":60,"context_line":"        \u0027firmware\u0027: {"},{"line_number":61,"context_line":"            \u0027type\u0027: \u0027array\u0027,"},{"line_number":62,"context_line":"            \u0027items\u0027: copy.deepcopy(_firmware_response_body),"},{"line_number":63,"context_line":"        },"},{"line_number":64,"context_line":"    },"},{"line_number":65,"context_line":"    \u0027required\u0027: [\u0027firmware\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"da46738b_57aaa057","line":62,"updated":"2025-04-01 13:23:12.000000000","message":"nit: I am as guilty of this as anyone, but you probably don\u0027t need the `copy` if you\u0027re not modifying this.","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"e839865bb04afc00d787fc1fd204aabc3af99117","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    \u0027properties\u0027: {"},{"line_number":60,"context_line":"        \u0027firmware\u0027: {"},{"line_number":61,"context_line":"            \u0027type\u0027: \u0027array\u0027,"},{"line_number":62,"context_line":"            \u0027items\u0027: copy.deepcopy(_firmware_response_body),"},{"line_number":63,"context_line":"        },"},{"line_number":64,"context_line":"    },"},{"line_number":65,"context_line":"    \u0027required\u0027: [\u0027firmware\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"74df9001_817e3c1a","line":62,"in_reply_to":"da46738b_57aaa057","updated":"2025-05-04 13:15:47.000000000","message":"Done","commit_id":"6821bf729466184c4899bf7b30dedd51a67f0e4d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8928eae7dc14235f32dc76dc9ca67995a646faa6","unresolved":true,"context_lines":[{"line_number":19,"context_line":"            \u0027items\u0027: {"},{"line_number":20,"context_line":"                \u0027enum\u0027: ["},{"line_number":21,"context_line":"                    \u0027created_at\u0027,"},{"line_number":22,"context_line":"                    \u0027updated_at,\u0027"},{"line_number":23,"context_line":"                    \u0027component\u0027,"},{"line_number":24,"context_line":"                    \u0027initial_version\u0027,"},{"line_number":25,"context_line":"                    \u0027current_version\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"8b8a3ce0_3c4460c3","line":22,"updated":"2025-05-15 12:35:50.000000000","message":"whoops (spotted while adding a test)\n\n```suggestion\n                    \u0027updated_at\u0027,\n```","commit_id":"0301ae3f8b92246a99ccfeb10f0c8d66baadc862"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"975f0b714b1b10b4f99860dbd71ebe36550f13d9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"            \u0027items\u0027: {"},{"line_number":20,"context_line":"                \u0027enum\u0027: ["},{"line_number":21,"context_line":"                    \u0027created_at\u0027,"},{"line_number":22,"context_line":"                    \u0027updated_at,\u0027"},{"line_number":23,"context_line":"                    \u0027component\u0027,"},{"line_number":24,"context_line":"                    \u0027initial_version\u0027,"},{"line_number":25,"context_line":"                    \u0027current_version\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"81e760fd_c2985ec2","line":22,"in_reply_to":"8b8a3ce0_3c4460c3","updated":"2025-05-15 12:40:00.000000000","message":"Done","commit_id":"0301ae3f8b92246a99ccfeb10f0c8d66baadc862"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3ba79a2ba2f7e10cc2498056fb572b7570d22e7d","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    },"},{"line_number":50,"context_line":"    # NOTE(adamcarthur, stephenfin): The \u0027fields\u0027 parameter"},{"line_number":51,"context_line":"    # means nothing is required"},{"line_number":52,"context_line":"    \u0027required\u0027: [],"},{"line_number":53,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":54,"context_line":"}"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"331980ed_beda4273","line":52,"updated":"2025-05-15 12:43:56.000000000","message":"I actually don\u0027t know if this is true. From the looks of it, `created_at` and `updated_at` will always be included. I don\u0027t know if this is intentional or not.","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7eb21f01cabd84826c01993fdf271c80d0e48c62","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    },"},{"line_number":50,"context_line":"    # NOTE(adamcarthur, stephenfin): The \u0027fields\u0027 parameter"},{"line_number":51,"context_line":"    # means nothing is required"},{"line_number":52,"context_line":"    \u0027required\u0027: [],"},{"line_number":53,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":54,"context_line":"}"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"c529e1ec_702af3bf","line":52,"in_reply_to":"331980ed_beda4273","updated":"2025-06-02 13:56:58.000000000","message":"Yeah, looks like it based upon the base object used to store each component. It actually kind of makes sense even though it could also quickly be perceived by a human as noise. It helps one understand what the state is.","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b1c15d0ddd443418a5d9472c7b28c2f18fa768f3","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    },"},{"line_number":50,"context_line":"    # NOTE(adamcarthur, stephenfin): The \u0027fields\u0027 parameter"},{"line_number":51,"context_line":"    # means nothing is required"},{"line_number":52,"context_line":"    \u0027required\u0027: [],"},{"line_number":53,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":54,"context_line":"}"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"cca9ec2c_164a3251","line":52,"in_reply_to":"c529e1ec_702af3bf","updated":"2025-06-03 12:02:26.000000000","message":"Okay, if this is intentional, we probably want to update this (in a follow-up: let\u0027s just get this merged now)?","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"f70ee5397c2d5c8799f80b59b734fcee42ed6fbb","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    },"},{"line_number":50,"context_line":"    # NOTE(adamcarthur, stephenfin): The \u0027fields\u0027 parameter"},{"line_number":51,"context_line":"    # means nothing is required"},{"line_number":52,"context_line":"    \u0027required\u0027: [],"},{"line_number":53,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":54,"context_line":"}"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"b120cf8b_9f34fbd9","line":52,"in_reply_to":"cca9ec2c_164a3251","updated":"2025-06-04 17:37:38.000000000","message":"I will follow-up with this fix","commit_id":"5730b0405cfcd5b32f38578467a96372f183f34f"}]}
