)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"2c4ba002edad9c19877726881c46167c24997521","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"827d6d61_7831c33f","updated":"2026-03-27 15:46:06.000000000","message":"First pass, looking good!","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"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":"24f3d1508f1d52e5fbd1cca4662d3c3858237d16","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"52cbbf4b_f66e0d27","updated":"2026-03-27 16:52:40.000000000","message":"Other than the specific microversion, which just feels like an AI artifact, the idea itself is solid. If this lands without revision, please remove the specific mentioned microversions in a follow-up.","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"b3f5da482e7b84ce3b33fcc1ccc3e0f99ce63939","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"0ca872c9_9cdc785f","in_reply_to":"52cbbf4b_f66e0d27","updated":"2026-04-02 14:42:17.000000000","message":"Done","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"982ee49ac99e88dcd5c17fec018d2890be92fd48","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"a3dcc5cd_b058cdd8","updated":"2026-04-03 13:37:17.000000000","message":"LGTM, Thanks!","commit_id":"7ecc5edd03b7fd373da61200453ea13c228c0839"}],"specs/approved/runbook-multi-traits.rst":[{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"2c4ba002edad9c19877726881c46167c24997521","unresolved":true,"context_lines":[{"line_number":45,"context_line":"  runbooks harder to document and discover compared with other Ironic"},{"line_number":46,"context_line":"  objects (nodes, ports, etc.) which all carry a ``description``."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Proposed change"},{"line_number":49,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"1. **Add a ``traits`` field to runbooks.**  A runbook\u0027s ``traits`` is"}],"source_content_type":"text/x-rst","patch_set":1,"id":"298ba049_3d0dd4c4","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":15},"updated":"2026-03-27 15:46:06.000000000","message":"Some parts of the commit description will make sense as a summary of the proposed change here before the bullet points.","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"b3f5da482e7b84ce3b33fcc1ccc3e0f99ce63939","unresolved":false,"context_lines":[{"line_number":45,"context_line":"  runbooks harder to document and discover compared with other Ironic"},{"line_number":46,"context_line":"  objects (nodes, ports, etc.) which all carry a ``description``."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Proposed change"},{"line_number":49,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"1. **Add a ``traits`` field to runbooks.**  A runbook\u0027s ``traits`` is"}],"source_content_type":"text/x-rst","patch_set":1,"id":"af2640aa_3f5401d9","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":15},"in_reply_to":"298ba049_3d0dd4c4","updated":"2026-04-02 14:42:17.000000000","message":"Done","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"2c4ba002edad9c19877726881c46167c24997521","unresolved":true,"context_lines":[{"line_number":48,"context_line":"Proposed change"},{"line_number":49,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"1. **Add a ``traits`` field to runbooks.**  A runbook\u0027s ``traits`` is"},{"line_number":52,"context_line":"   a set of trait strings (same format as node traits).  When a user"},{"line_number":53,"context_line":"   requests execution of a runbook, the system checks that the target"},{"line_number":54,"context_line":"   node carries *at least one* trait that appears in the runbook\u0027s"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bd8ba153_f39d9999","line":51,"range":{"start_line":51,"start_character":0,"end_line":51,"end_character":69},"updated":"2026-03-27 15:46:06.000000000","message":"Let\u0027s be explicit that any non-standard traits simply need to have a prefix of ``CUSTOM_``","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"b3f5da482e7b84ce3b33fcc1ccc3e0f99ce63939","unresolved":false,"context_lines":[{"line_number":48,"context_line":"Proposed change"},{"line_number":49,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"1. **Add a ``traits`` field to runbooks.**  A runbook\u0027s ``traits`` is"},{"line_number":52,"context_line":"   a set of trait strings (same format as node traits).  When a user"},{"line_number":53,"context_line":"   requests execution of a runbook, the system checks that the target"},{"line_number":54,"context_line":"   node carries *at least one* trait that appears in the runbook\u0027s"}],"source_content_type":"text/x-rst","patch_set":1,"id":"6a44cead_36f49e62","line":51,"range":{"start_line":51,"start_character":0,"end_line":51,"end_character":69},"in_reply_to":"8b7d4bef_5a15fb38","updated":"2026-04-02 14:42:17.000000000","message":"Done","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"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":"24f3d1508f1d52e5fbd1cca4662d3c3858237d16","unresolved":true,"context_lines":[{"line_number":48,"context_line":"Proposed change"},{"line_number":49,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"1. **Add a ``traits`` field to runbooks.**  A runbook\u0027s ``traits`` is"},{"line_number":52,"context_line":"   a set of trait strings (same format as node traits).  When a user"},{"line_number":53,"context_line":"   requests execution of a runbook, the system checks that the target"},{"line_number":54,"context_line":"   node carries *at least one* trait that appears in the runbook\u0027s"}],"source_content_type":"text/x-rst","patch_set":1,"id":"8b7d4bef_5a15fb38","line":51,"range":{"start_line":51,"start_character":0,"end_line":51,"end_character":69},"in_reply_to":"bd8ba153_f39d9999","updated":"2026-03-27 16:52:40.000000000","message":"I\u0027d go a step further: these must be custom traits (I do not think any of the non-custom traits \"fit\" for this purpose)","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"2c4ba002edad9c19877726881c46167c24997521","unresolved":true,"context_lines":[{"line_number":55,"context_line":"   ``traits`` set.  Any non-empty intersection is sufficient."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"2. **Remove the trait-name constraint from runbook names.**  From"},{"line_number":58,"context_line":"   API v1.112 onwards, a runbook ``name`` may be any valid logical"},{"line_number":59,"context_line":"   name string (the same format accepted for node names), not just a"},{"line_number":60,"context_line":"   trait-formatted string.  Names remain unique and are still used to"},{"line_number":61,"context_line":"   look up runbooks by name."}],"source_content_type":"text/x-rst","patch_set":1,"id":"6ed6fa36_614acff4","line":58,"range":{"start_line":58,"start_character":7,"end_line":58,"end_character":14},"updated":"2026-03-27 15:46:06.000000000","message":"nit: It\u0027s never certain what micro-version a feature lands.","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"b3f5da482e7b84ce3b33fcc1ccc3e0f99ce63939","unresolved":false,"context_lines":[{"line_number":55,"context_line":"   ``traits`` set.  Any non-empty intersection is sufficient."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"2. **Remove the trait-name constraint from runbook names.**  From"},{"line_number":58,"context_line":"   API v1.112 onwards, a runbook ``name`` may be any valid logical"},{"line_number":59,"context_line":"   name string (the same format accepted for node names), not just a"},{"line_number":60,"context_line":"   trait-formatted string.  Names remain unique and are still used to"},{"line_number":61,"context_line":"   look up runbooks by name."}],"source_content_type":"text/x-rst","patch_set":1,"id":"792fbb01_9fae2339","line":58,"range":{"start_line":58,"start_character":7,"end_line":58,"end_character":14},"in_reply_to":"140225b7_5b087a55","updated":"2026-04-02 14:42:17.000000000","message":"Done","commit_id":"0819e75a38b5558579275248652bf9388d71e290"},{"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":"24f3d1508f1d52e5fbd1cca4662d3c3858237d16","unresolved":true,"context_lines":[{"line_number":55,"context_line":"   ``traits`` set.  Any non-empty intersection is sufficient."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"2. **Remove the trait-name constraint from runbook names.**  From"},{"line_number":58,"context_line":"   API v1.112 onwards, a runbook ``name`` may be any valid logical"},{"line_number":59,"context_line":"   name string (the same format accepted for node names), not just a"},{"line_number":60,"context_line":"   trait-formatted string.  Names remain unique and are still used to"},{"line_number":61,"context_line":"   look up runbooks by name."}],"source_content_type":"text/x-rst","patch_set":1,"id":"140225b7_5b087a55","line":58,"range":{"start_line":58,"start_character":7,"end_line":58,"end_character":14},"in_reply_to":"6ed6fa36_614acff4","updated":"2026-03-27 16:52:40.000000000","message":"++","commit_id":"0819e75a38b5558579275248652bf9388d71e290"}]}
