)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"7e839acd25216cc94f6f2adb89de0c6013d9e131","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"55029a5d_d227dc8c","updated":"2026-10-29 11:54:20.000000000","message":"just nits and a question about continous audits, otherwise lgtm","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"45f5751ef324a2de9a5be01f4b19fe379db6626d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"422a6ddd_5df2a046","updated":"2026-11-09 19:11:23.000000000","message":"W+1: in case of any other reviewer change request, we can upload a nee change\nthanks Joan","commit_id":"b306aabd278a1a7707b36f3eead6e3b8e27b40bf"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"3d53e0df366664f92288e8d52b7279ed9733c462","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"9ab1cf7b_f8d60a3e","updated":"2026-11-03 13:50:01.000000000","message":"lgtm, lets give other reviwers a bit more time before we merge?","commit_id":"b306aabd278a1a7707b36f3eead6e3b8e27b40bf"}],"specs/2027.1/approved/use_openstacksdk.rst":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"b631e062d95dbf6a5ad5725b9f52ecb2881f0887","unresolved":false,"context_lines":[{"line_number":310,"context_line":"   * Submit a specification/patch to the OpenStackSDK project for the"},{"line_number":311,"context_line":"     ``resource-optimization`` proxy"},{"line_number":312,"context_line":"   * Implement the ``resource-optimization`` service proxy in OpenStackSDK"},{"line_number":313,"context_line":"   * Add resource models for ``Audit``, ``AuditTemplate``, ``ActionPlan``,"},{"line_number":314,"context_line":"     ``Action``, ``Goal``, ``Strategy``, and ``EfficacyIndicator``"},{"line_number":315,"context_line":"   * Implement CRUD operations for each resource following OpenStackSDK"},{"line_number":316,"context_line":"     patterns"}],"source_content_type":"text/x-rst","patch_set":1,"id":"463d1108_edcb671d","line":313,"updated":"2026-09-15 15:37:49.000000000","message":"The Proposed Change (Phase 2, step 3) says resource models will be added for Audit, AuditTemplate, ActionPlan, Action, Goal, Strategy, ScoringEngine, Service, and DataModel, and states the models \u0027must mirror the existing Watcher REST API\u0027. The Work Items section for the same phase lists Audit, AuditTemplate, ActionPlan, Action, Goal, Strategy, and EfficacyIndicator - dropping ScoringEngine, Service, and DataModel, and adding EfficacyIndicator. Repo history shows efficacy indicators are exposed through audit/action plan efficacy data (global_efficacy), not as a standalone REST resource, so the Work Items list is the one that diverges from the stated REST-mirroring requirement.\n\n**Severity**: WARNING | **Confidence**: 0.92\n\n**Impact**: Implementers and reviewers of the Phase 2 SDK contribution cannot determine the authoritative resource set for the resource-optimization proxy. A proxy built from the Work Items list would implement an EfficacyIndicator resource with no matching Watcher REST endpoint and omit ScoringEngine, Service, and DataModel, failing the spec\u0027s own requirement that the SDK faithfully mirror the Watcher REST API.\n\n**Suggestion**:\nUse one authoritative resource list in both sections. Based on the Watcher REST API, keep Audit, AuditTemplate, ActionPlan, Action, Goal, Strategy, ScoringEngine, Service, and DataModel, and represent efficacy indicators via the audit/action plan efficacy fields rather than a standalone EfficacyIndicator model; if a standalone EfficacyIndicator resource is actually intended, state that explicitly and add it to the Proposed Change list.","commit_id":"3bd82e7d0d2694bda15113bab567702e4578db1b"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"7e839acd25216cc94f6f2adb89de0c6013d9e131","unresolved":true,"context_lines":[{"line_number":236,"context_line":"Other End User Impact"},{"line_number":237,"context_line":"---------------------"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"The Phase 1 deprecation is visible to operators who use the"},{"line_number":240,"context_line":"``saving_energy`` strategy or the baremetal data model collector: they will"},{"line_number":241,"context_line":"see deprecation warnings at runtime and must install python-ironicclient"},{"line_number":242,"context_line":"explicitly once it is removed from Watcher\u0027s hard dependencies."},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"The Phase 2 work has a positive end user impact: once the"},{"line_number":245,"context_line":"``resource-optimization`` proxy is available in OpenStackSDK, end users and"}],"source_content_type":"text/x-rst","patch_set":3,"id":"a4a539a2_13777555","line":242,"range":{"start_line":239,"start_character":0,"end_line":242,"end_character":63},"updated":"2026-10-29 11:54:20.000000000","message":"nit: You can also mention the Action itself, since Actuator allow users to select existing Action and their parameters.","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"3d53e0df366664f92288e8d52b7279ed9733c462","unresolved":false,"context_lines":[{"line_number":236,"context_line":"Other End User Impact"},{"line_number":237,"context_line":"---------------------"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"The Phase 1 deprecation is visible to operators who use the"},{"line_number":240,"context_line":"``saving_energy`` strategy or the baremetal data model collector: they will"},{"line_number":241,"context_line":"see deprecation warnings at runtime and must install python-ironicclient"},{"line_number":242,"context_line":"explicitly once it is removed from Watcher\u0027s hard dependencies."},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"The Phase 2 work has a positive end user impact: once the"},{"line_number":245,"context_line":"``resource-optimization`` proxy is available in OpenStackSDK, end users and"}],"source_content_type":"text/x-rst","patch_set":3,"id":"f4f823f8_b796b081","line":242,"range":{"start_line":239,"start_character":0,"end_line":242,"end_character":63},"in_reply_to":"8d257293_8ddecae2","updated":"2026-11-03 13:50:01.000000000","message":"Done","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"cb350e464e5d4a920239a06abdb85d987d45be91","unresolved":true,"context_lines":[{"line_number":236,"context_line":"Other End User Impact"},{"line_number":237,"context_line":"---------------------"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"The Phase 1 deprecation is visible to operators who use the"},{"line_number":240,"context_line":"``saving_energy`` strategy or the baremetal data model collector: they will"},{"line_number":241,"context_line":"see deprecation warnings at runtime and must install python-ironicclient"},{"line_number":242,"context_line":"explicitly once it is removed from Watcher\u0027s hard dependencies."},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"The Phase 2 work has a positive end user impact: once the"},{"line_number":245,"context_line":"``resource-optimization`` proxy is available in OpenStackSDK, end users and"}],"source_content_type":"text/x-rst","patch_set":3,"id":"8d257293_8ddecae2","line":242,"range":{"start_line":239,"start_character":0,"end_line":242,"end_character":63},"in_reply_to":"a4a539a2_13777555","updated":"2026-10-29 17:10:43.000000000","message":"good point, I added a mention to the action too","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"7e839acd25216cc94f6f2adb89de0c6013d9e131","unresolved":true,"context_lines":[{"line_number":254,"context_line":"Other Deployer Impact"},{"line_number":255,"context_line":"---------------------"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"Operators using the ``saving_energy`` strategy or the baremetal data model"},{"line_number":258,"context_line":"collector will see deprecation warnings at runtime. They must also install"},{"line_number":259,"context_line":"python-ironicclient explicitly once it is removed from Watcher\u0027s"},{"line_number":260,"context_line":"``requirements.txt``, as it will no longer be pulled in automatically. The"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ca8af201_117595ba","line":257,"range":{"start_line":257,"start_character":0,"end_line":257,"end_character":74},"updated":"2026-10-29 11:54:20.000000000","message":"ditto","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"cb350e464e5d4a920239a06abdb85d987d45be91","unresolved":false,"context_lines":[{"line_number":254,"context_line":"Other Deployer Impact"},{"line_number":255,"context_line":"---------------------"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"Operators using the ``saving_energy`` strategy or the baremetal data model"},{"line_number":258,"context_line":"collector will see deprecation warnings at runtime. They must also install"},{"line_number":259,"context_line":"python-ironicclient explicitly once it is removed from Watcher\u0027s"},{"line_number":260,"context_line":"``requirements.txt``, as it will no longer be pulled in automatically. The"}],"source_content_type":"text/x-rst","patch_set":3,"id":"4c1c3039_c6894c81","line":257,"range":{"start_line":257,"start_character":0,"end_line":257,"end_character":74},"in_reply_to":"ca8af201_117595ba","updated":"2026-10-29 17:10:43.000000000","message":"Done","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"7e839acd25216cc94f6f2adb89de0c6013d9e131","unresolved":true,"context_lines":[{"line_number":277,"context_line":"Upgrade Impact"},{"line_number":278,"context_line":"--------------"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"Operators using the Ironic integration must install python-ironicclient"},{"line_number":281,"context_line":"explicitly after this change, as it will no longer be a hard dependency of"},{"line_number":282,"context_line":"Watcher. A deprecation warning will guide them. The Phase 2 and Phase 3"},{"line_number":283,"context_line":"work requires no data migration."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"Implementation"},{"line_number":286,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"de5e53d8_f479512e","line":283,"range":{"start_line":280,"start_character":0,"end_line":283,"end_character":32},"updated":"2026-10-29 11:54:20.000000000","message":"How existing Continuous Audits would be impacted by that?","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"aeb580918c90bd4548b80b8fa3a2755f13d23f19","unresolved":true,"context_lines":[{"line_number":277,"context_line":"Upgrade Impact"},{"line_number":278,"context_line":"--------------"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"Operators using the Ironic integration must install python-ironicclient"},{"line_number":281,"context_line":"explicitly after this change, as it will no longer be a hard dependency of"},{"line_number":282,"context_line":"Watcher. A deprecation warning will guide them. The Phase 2 and Phase 3"},{"line_number":283,"context_line":"work requires no data migration."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"Implementation"},{"line_number":286,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bcf76cc7_0dbec3f9","line":283,"range":{"start_line":280,"start_character":0,"end_line":283,"end_character":32},"in_reply_to":"4be7f225_0e7bc8dc","updated":"2026-10-30 17:01:17.000000000","message":"IMO, given the status of the integration and the saving_energy strategy and the fact that is documented as experimental, i think it\u0027s fine to do the dependency optional.","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"3d53e0df366664f92288e8d52b7279ed9733c462","unresolved":false,"context_lines":[{"line_number":277,"context_line":"Upgrade Impact"},{"line_number":278,"context_line":"--------------"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"Operators using the Ironic integration must install python-ironicclient"},{"line_number":281,"context_line":"explicitly after this change, as it will no longer be a hard dependency of"},{"line_number":282,"context_line":"Watcher. A deprecation warning will guide them. The Phase 2 and Phase 3"},{"line_number":283,"context_line":"work requires no data migration."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"Implementation"},{"line_number":286,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"00a47f28_780ea4ce","line":283,"range":{"start_line":280,"start_character":0,"end_line":283,"end_character":32},"in_reply_to":"bcf76cc7_0dbec3f9","updated":"2026-11-03 13:50:01.000000000","message":"Done","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"cb350e464e5d4a920239a06abdb85d987d45be91","unresolved":true,"context_lines":[{"line_number":277,"context_line":"Upgrade Impact"},{"line_number":278,"context_line":"--------------"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"Operators using the Ironic integration must install python-ironicclient"},{"line_number":281,"context_line":"explicitly after this change, as it will no longer be a hard dependency of"},{"line_number":282,"context_line":"Watcher. A deprecation warning will guide them. The Phase 2 and Phase 3"},{"line_number":283,"context_line":"work requires no data migration."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"Implementation"},{"line_number":286,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"4be7f225_0e7bc8dc","line":283,"range":{"start_line":280,"start_character":0,"end_line":283,"end_character":32},"in_reply_to":"de5e53d8_f479512e","updated":"2026-10-29 17:10:43.000000000","message":"I\u0027ve expanded the section to cover that. If the operator install python-ironicclient, the audit will continue working fine, just showing deprecation warnings. If not, the audit will fail. Alternatively, we could decide to only deprecate the ironic integration but continue carrying it as a dependency until we remove it. In this case, considering the lack of coverage and existing bugs, it\u0027s unlikely that there is production usage, but if we want to be sure we can change the approach and keep the dependency.","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"8eee7065e784ad8f87f6b4c58430098c77e8057c","unresolved":false,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"* 2026.1 spec (implemented):"},{"line_number":343,"context_line":"  ``specs/2026.1/implemented/use_openstacksdk.rst``"},{"line_number":344,"context_line":"* 2026.2 spec (approved):"},{"line_number":345,"context_line":"  ``specs/2026.2/approved/use_openstacksdk.rst``"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"Phase 2 depends on acceptance by the OpenStackSDK project of the proposed"}],"source_content_type":"text/x-rst","patch_set":3,"id":"c71083b4_f7bbf880","line":344,"updated":"2026-10-16 15:09:02.000000000","message":"The new spec points readers to ``specs/2026.2/approved/use_openstacksdk.rst`` in both the Dependencies section (lines 344-345) and the References section (lines 402-403), and labels the 2026.2 spec \"(approved)\". That path no longer exists: the review base commit 8fb447a (\"Mark 2026.2 openstacksdk and dashboard specs implemented\") moved the file to ``specs/2026.2/implemented/use_openstacksdk.rst`` and added a redirects entry mapping the old approved path to implemented. The spec\u0027s own state summary (lines 71-76) confirms Keystone, Cinder, and Placement migrations were completed, so the approved label also misstates the status.\n\n**Severity**: WARNING | **Confidence**: 0.95\n\n**Impact**: Readers following the Dependencies or References sections land on a nonexistent path, and the \u0027(approved)\u0027 label misstates the 2026.2 spec\u0027s implemented status, which matters because this spec narrates cumulative migration state across cycles (2026.1, 2026.2, 2027.1). The same stale path is recorded permanently in the commit message history.\n\n**Suggestion**:\nUpdate lines 344-345 and 402-403 to reference ``specs/2026.2/implemented/use_openstacksdk.rst`` and describe the 2026.2 spec as implemented; if the patch is reworked before merge, also correct the \u00272026.2: specs/2026.2/approved/use_openstacksdk.rst\u0027 bullet in the commit message.","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"8eee7065e784ad8f87f6b4c58430098c77e8057c","unresolved":false,"context_lines":[{"line_number":357,"context_line":""},{"line_number":358,"context_line":"**Unit Testing**"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"The existing unit tests for the Ironic helper and the baremetal collector"},{"line_number":361,"context_line":"will be updated to verify that the deprecation warnings are emitted at the"},{"line_number":362,"context_line":"correct points and that the lazy import raises a clear ``ImportError`` when"},{"line_number":363,"context_line":"python-ironicclient is not installed."}],"source_content_type":"text/x-rst","patch_set":3,"id":"ff43dce2_f940b04d","line":360,"updated":"2026-10-16 15:09:02.000000000","message":"Phase 1 step 2 (lines 117-120) specifies moving ``import ironicclient`` to a lazy import and wrapping it with a clear ``UnsupportedError`` message directing operators to install python-ironicclient. The Unit Testing section (lines 360-363) instead requires tests verifying that \"the lazy import raises a clear ``ImportError``\". The spec never relates the two exception types, so the proposed behavior and its stated acceptance criteria name different failures for the same mechanism.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: Implementers and reviewers can build or accept tests against different contracts: if the lazy import is wrapped in UnsupportedError as the Proposed Change states, a test asserting a raised ImportError fails; if only ImportError is raised, the operator-directed UnsupportedError message never surfaces. The ambiguity invites rework during the 2027.1 cycle.\n\n**Recommendation**:\nState one behavior in both sections - for example, the lazy import raises ``UnsupportedError`` (wrapping ``ImportError``) with the install-guidance message, and the unit tests assert that exception type and message when python-ironicclient is absent.","commit_id":"0921dcf0959d60a37b9e4f19e6a549e3049a97d4"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"ca2ea91a5987a8671818a0bed2a7024281a54690","unresolved":false,"context_lines":[{"line_number":60,"context_line":"In addition to Watcher\u0027s own consumption of client libraries, Watcher is not"},{"line_number":61,"context_line":"yet exposed through the OpenStackSDK. Unlike most OpenStack services, there"},{"line_number":62,"context_line":"is no ``resource-optimization`` proxy in the SDK, so other projects and end"},{"line_number":63,"context_line":"users cannot interact with Watcher through the unified SDK and must instead"},{"line_number":64,"context_line":"depend"},{"line_number":65,"context_line":"on the standalone python-watcherclient library. This is inconsistent with the"},{"line_number":66,"context_line":"rest of the ecosystem and forces consumers such as watcher-dashboard and"}],"source_content_type":"text/x-rst","patch_set":4,"id":"f8aa10ff_d6538aee","line":63,"updated":"2026-10-29 17:23:44.000000000","message":"In the Problem Description paragraph explaining that Watcher is not exposed through OpenStackSDK, the single word \u0027depend\u0027 is stranded alone on its own line between \u0027...must instead\u0027 and \u0027on the standalone python-watcherclient library\u0027. The paragraph is visibly mis-wrapped in the spec source; the wrap looks accidental rather than deliberate and makes the sentence harder to scan during review.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: The spec source (the artifact reviewers and future editors read) contains a mid-sentence one-word line inside a plain prose paragraph, and the defect is carried into the published docs rendering; a future editor rewrapping the paragraph has to notice and clean up the stray line.\n\n**Recommendation**:\nReflow the sentence so line 63 ends with \u0027...and must instead\u0027 and the following line reads \u0027depend on the standalone python-watcherclient library. This is inconsistent with the\u0027.","commit_id":"a2b63ab483c40159e2881096e0e1f5ce56560075"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"ca2ea91a5987a8671818a0bed2a7024281a54690","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":"Operators using the Ironic integration must install python-ironicclient"},{"line_number":287,"context_line":"explicitly after this change, as it will no longer be a hard dependency of"},{"line_number":288,"context_line":"Watcher. A deprecation warning will guide them. Existing  continuous audit that"},{"line_number":289,"context_line":"rely on the Ironic integration (for example one running the"},{"line_number":290,"context_line":"``saving_energy`` strategy) keeps working as long as python-ironicclient is"},{"line_number":291,"context_line":"installed, emitting deprecation warnings on each run. If the now-optional"}],"source_content_type":"text/x-rst","patch_set":4,"id":"9b678997_a58fc544","line":288,"updated":"2026-10-29 17:23:44.000000000","message":"The new Upgrade Impact section states: \u0027Existing  continuous audit that rely on the Ironic integration (for example one running the ``saving_energy`` strategy) keeps working as long as python-ironicclient is installed\u0027. The sentence mixes a singular noun with a plural relative verb (\u0027audit that rely\u0027) and then uses a singular verb (\u0027keeps working\u0027), and it contains a doubled space after \u0027Existing\u0027. The intended meaning (existing continuous audits keep working) is recoverable, but the sentence is malformed in the permanent spec record.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Impact**: In this specs-only repository the prose is the deliverable, and the file is rendered into the published project documentation through doc/source/specs/2027.1/index.rst. The malformed operator-facing upgrade guidance is preserved permanently, reducing clarity about whether one audit or several continue to work after the deprecation.\n\n**Recommendation**:\nReword to: \u0027Existing continuous audits that rely on the Ironic integration (for example one running the ``saving_energy`` strategy) keep working as long as python-ironicclient is installed, emitting deprecation warnings on each run.\u0027","commit_id":"a2b63ab483c40159e2881096e0e1f5ce56560075"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"333c7b8cc9a89fffe9631788db8e55c08fff30a5","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Migrate Watcher to Use OpenStackSDK"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/watcher/+spec/watcher-openstacksdk"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Watcher currently uses individual Python client libraries (python-novaclient,"},{"line_number":14,"context_line":"python-cinderclient, etc.) to interact with other OpenStack services. These"}],"source_content_type":"text/x-rst","patch_set":5,"id":"91cc53b2_73888d9c","line":11,"updated":"2026-10-30 08:33:38.000000000","message":"Line 11 links the spec to blueprint \u0027watcher-openstacksdk\u0027, but the file is still named use_openstacksdk.rst, and both earlier iterations of this multi-cycle spec (2026.1 and 2026.2) link blueprint \u0027use-openstacksdk\u0027. The 2027.1 spec template explicitly requires the repository filename to match the launchpad blueprint URL slug. The slug change is not explained in the commit message or the History section, so either the URL is wrong or the filename no longer follows the documented rule.\n\n**Severity**: WARNING | **Confidence**: 0.85\n\n**Impact**: If \u0027watcher-openstacksdk\u0027 is a typo, the spec\u0027s blueprint link points to a Launchpad page that does not exist, breaking blueprint traceability for reviewers and release management. If the blueprint was deliberately renamed, the filename violates the documented template rule and the unexplained slug change obscures the link between the 2027.1 iteration and the effort tracked in 2026.1/2026.2.\n\n**Suggestion**:\nRestore the blueprint URL used by both prior iterations (\u0027https://blueprints.launchpad.net/watcher/+spec/use-openstacksdk\u0027) if the launchpad blueprint is unchanged. If a new \u0027watcher-openstacksdk\u0027 blueprint was intentionally created, rename the file to \u0027watcher_openstacksdk.rst\u0027 to satisfy the template rule and note the new blueprint in the History section.","commit_id":"c28fe9eade0348f840c355bba9febd1440c7a86a"}],"specs/2027.1/approved/watcher_openstacksdk.rst":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"d6f76060f5dc1319b40f8a42444c68ee82bd12c6","unresolved":false,"context_lines":[{"line_number":441,"context_line":"     - Re-proposed for Keystone, Cinder, Placement, and Ironic migration."},{"line_number":442,"context_line":"       Keystone, Cinder, and Placement completed; Ironic not completed."},{"line_number":443,"context_line":"   * - 2027.1"},{"line_number":444,"context_line":"     - Ironic migration dropped in favour of deprecating the Ironic"},{"line_number":445,"context_line":"       integration and making python-ironicclient optional. Added the"},{"line_number":446,"context_line":"       ``resource-optimization`` proxy to OpenStackSDK (Phase 2), and"},{"line_number":447,"context_line":"       (stretch goal) migrating python-watcherclient consumers to the new"}],"source_content_type":"text/x-rst","patch_set":6,"id":"a16e42be_eaf36c6f","line":444,"updated":"2026-10-30 08:50:32.000000000","message":"The 2027.1 row of the History revisions table spells \u0027in favour of\u0027 with the British \u0027u\u0027. The rest of this spec, the repository\u0027s published 2026.1/2026.2 specs, and standard OpenStack documentation style use American English spellings, so this single word is a permanent inconsistency in a document published to specs.openstack.org.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: Minor: one inconsistent spelling in a permanently published spec document; a reviewer or future editor would have to flag and fix it later.\n\n**Recommendation**:\nChange \u0027in favour of\u0027 to \u0027in favor of\u0027 on line 444.","commit_id":"24d937443e609bb576a828650ae4e282812373ef"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"aeb580918c90bd4548b80b8fa3a2755f13d23f19","unresolved":true,"context_lines":[{"line_number":308,"context_line":"1. **Deprecate Ironic Integration (Phase 1, required)**"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"   * Add deprecation warnings to ``ironic_helper.py`` and the baremetal data"},{"line_number":311,"context_line":"     model collector"},{"line_number":312,"context_line":"   * Convert ``import ironicclient`` to a lazy import inside the functions"},{"line_number":313,"context_line":"     that use it, with a clear ``UnsupportedError`` message"},{"line_number":314,"context_line":"   * Remove python-ironicclient from ``requirements.txt`` and add it as an"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ef30755f_79953cf3","line":311,"updated":"2026-10-30 17:01:17.000000000","message":"Nit, and saving_energy strategy?","commit_id":"b306aabd278a1a7707b36f3eead6e3b8e27b40bf"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"0c2c91edfb9afca75db363934cfd3e06a82edac2","unresolved":false,"context_lines":[{"line_number":308,"context_line":"1. **Deprecate Ironic Integration (Phase 1, required)**"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"   * Add deprecation warnings to ``ironic_helper.py`` and the baremetal data"},{"line_number":311,"context_line":"     model collector"},{"line_number":312,"context_line":"   * Convert ``import ironicclient`` to a lazy import inside the functions"},{"line_number":313,"context_line":"     that use it, with a clear ``UnsupportedError`` message"},{"line_number":314,"context_line":"   * Remove python-ironicclient from ``requirements.txt`` and add it as an"}],"source_content_type":"text/x-rst","patch_set":7,"id":"6dbe578c_3fab6517","line":311,"in_reply_to":"04deae75_efb45b07","updated":"2026-11-04 14:09:52.000000000","message":"Acknowledged","commit_id":"b306aabd278a1a7707b36f3eead6e3b8e27b40bf"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"cb934da389b5e277cb2e035ad90f6469d2122d8d","unresolved":true,"context_lines":[{"line_number":308,"context_line":"1. **Deprecate Ironic Integration (Phase 1, required)**"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"   * Add deprecation warnings to ``ironic_helper.py`` and the baremetal data"},{"line_number":311,"context_line":"     model collector"},{"line_number":312,"context_line":"   * Convert ``import ironicclient`` to a lazy import inside the functions"},{"line_number":313,"context_line":"     that use it, with a clear ``UnsupportedError`` message"},{"line_number":314,"context_line":"   * Remove python-ironicclient from ``requirements.txt`` and add it as an"}],"source_content_type":"text/x-rst","patch_set":7,"id":"04deae75_efb45b07","line":311,"in_reply_to":"ef30755f_79953cf3","updated":"2026-11-02 08:23:29.000000000","message":"I did not mention it here since Doug already has a patch for doing that https://review.opendev.org/c/openstack/watcher/+/1006323","commit_id":"b306aabd278a1a7707b36f3eead6e3b8e27b40bf"}]}
