)]}'
{"watcher_dashboard/api/watcher.py":[{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"ae09d4f3_a90c32eb","line":94,"updated":"2026-02-27 13:15:12.000000000","message":"Inconsistent api_version parameter support - Some API methods accept api_version parameter while others do not.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: Developers may incorrectly assume all methods support versioning, leading to inconsistent API behavior and bugs.\n\n**Priority**: Next sprint\n**Why This Matters**: Partial implementation of versioning support creates confusion about which operations are versioned.\n\n**Recommendation**:\nEither add api_version parameter to all API methods for consistency, document which methods support versioning.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"256c9d1abf9a46ba8f729db0d968d6b8","url":"https://zuul.teim.app/t/main/buildset/256c9d1abf9a46ba8f729db0d968d6b8","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":"0a99f5d977e5365ba94a533880b9bb917a55a57e","patch_set":3,"id":"67a0e47d_e3f54edb","line":150,"updated":"2026-02-27 14:37:58.000000000","message":"API methods like Audit.delete() and Audit.cancel() don\u0027t accept api_version parameter but might benefit from version-aware behavior in the future\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: Would provide consistency across all API methods and prepare for future microversion requirements\n\n**Recommendation**:\nConsider adding api_version parameter to remaining Audit methods (delete, cancel) and ActionPlan/Action methods for consistency, even if not currently needed","commit_id":"701bd46b813fa60cbc8c9ba789c360be9d221df1"}],"watcher_dashboard/common/client.py":[{"robot_id":"zuul","robot_run_id":"ad7ef7d09ea547dba0f43424bc6fc199","url":"https://zuul.teim.app/t/main/buildset/ad7ef7d09ea547dba0f43424bc6fc199","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":"349dac04dfb625db5f8245500ce55120040c4f30","patch_set":1,"id":"395101d0_ef4f57d3","line":33,"updated":"2026-02-27 11:00:10.000000000","message":"The get_client() function signature for \u0027required\u0027 parameter could be clarified in documentation to indicate microversion string format\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: Improved documentation helps future maintainers understand expected parameter formats.\n\n**Recommendation**:\nUpdate docstring to explicitly show example microversion strings and explain the relationship between \u0027required\u0027 and os_infra_optim_api_version.","commit_id":"049e166c2e6da638f422cc54c3ce8081dd3135a2"},{"robot_id":"zuul","robot_run_id":"ad7ef7d09ea547dba0f43424bc6fc199","url":"https://zuul.teim.app/t/main/buildset/ad7ef7d09ea547dba0f43424bc6fc199","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":"349dac04dfb625db5f8245500ce55120040c4f30","patch_set":1,"id":"d8233c41_39710b65","line":98,"updated":"2026-02-27 11:00:10.000000000","message":"is_microversion_supported() could use a more specific exception catch instead of catching generic TypeError alongside UnsupportedVersion\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Catching TypeError alongside UnsupportedVersion provides safety but may mask unexpected issues. More specific exception handling would improve debuggability.\n\n**Recommendation**:\nConsider splitting the exception handling to catch api_versioning.APIVersionError (or equivalent) separately, and log unexpected TypeErrors at warning level for better debugging.","commit_id":"049e166c2e6da638f422cc54c3ce8081dd3135a2"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"c7b7fae5_520a484a","line":1,"updated":"2026-02-27 13:15:12.000000000","message":"Inconsistent Apache license header format - client.py has abbreviated single-line comment rather than full multi-line header format.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: New files should use full header format as specified in style guide.\n\n**Suggestion**:\nFor consistency with OpenStack standards, consider updating to full Apache 2.0 header format, especially when creating new files.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"e01ec7eb_81b99c80","line":28,"updated":"2026-02-27 13:15:12.000000000","message":"Consider adding configuration option to override discovered max microversion for testing or emergency purposes.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Provides workaround for version discovery bugs and enables testing of specific API versions without deploying different Watcher versions.\n\n**Recommendation**:\nAdd CONF option like [api] override_microversion that bypasses automatic discovery. Document as testing/emergency option.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"6e9a8091_2e38eccc","line":28,"updated":"2026-02-27 13:15:12.000000000","message":"Unclear caching behavior from method naming - Method is named get_max_version() but uses @memoized.memoized_method decorator.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Developers may not realize it\u0027s cached per-request, leading to potential misunderstandings about cache behavior.\n\n**Suggestion**:\nConsider adding comment explaining @memoized.memoized_method behavior or documenting caching in docstring.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"365a3295_890670d8","line":30,"updated":"2026-02-27 13:15:12.000000000","message":"Incomplete docstring documentation - get_max_version() lacks documentation for return value format and error conditions.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Developers may not understand that None is returned on failure or what format the version string takes.\n\n**Suggestion**:\nUpdate docstring to include \u0027:returns: Maximum microversion as string (e.g. \"1.1\") or None if discovery fails\u0027.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"9f3ebc9b_93027665","line":40,"updated":"2026-02-27 13:15:12.000000000","message":"Consider adding metrics/monitoring for version discovery success/failure rates for operational visibility.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Provides operational visibility into version discovery behavior and enables detection of API endpoint issues.\n\n**Recommendation**:\nIf project uses oslo.metrics, emit counter metric for discovery attempts and failures. Even statsd counter would be valuable.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"032de242_4c83ffea","line":40,"updated":"2026-02-27 13:15:12.000000000","message":"Insufficient logging context for debugging - When version discovery succeeds, there\u0027s no log indicating which version was discovered.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Operators have limited visibility into which microversion the dashboard is using, making version mismatch diagnosis harder.\n\n**Suggestion**:\nAdd INFO-level log when version discovery succeeds: LOG.info(\u0027Discovered Watcher API maximum microversion: %s\u0027, max_version).","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"134c80f6_c5854d0c","line":40,"updated":"2026-02-27 13:15:12.000000000","message":"No cross-request caching of discovered microversion - every HTTP request triggers additional API call to Watcher root endpoint.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: Increased load on Watcher API service and slower dashboard response times in high-traffic deployments.\n\n**Priority**: Next sprint\n**Why This Matters**: Every dashboard page view triggers additional API call for version discovery, which is inefficient when API version rarely changes.\n\n**Recommendation**:\nAdd configurable cache (oslo_cache, TTL-based) to store discovered max version across requests with 5-15 minute TTL.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"e8ba724c_1e7f6d40","line":40,"updated":"2026-02-27 13:15:12.000000000","message":"Silent exception handling in get_max_version() - Exception caught, logged as debug, returns None. When discovery fails, None propagates to API calls causing confusing downstream failures.\n\n**Severity**: CRITICAL | **Confidence**: 0.9\n\n**Risk**: Operators cannot diagnose why version discovery failed - debug logs may not be visible in production.\n\n**Priority**: Before merge\n**Why This Matters**: When API root endpoint is unreachable, implementation silently fails and returns None, causing confusing downstream API call errors.\n\n**Recommendation**:\nLog failures at WARNING level with clear context. Consider raising VersionDiscoveryError for unrecoverable failures.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"2b6dd601_fdb0593f","line":52,"updated":"2026-02-27 13:15:12.000000000","message":"The is_microversion_supported() function is defined but appears unused in current implementation.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Either clarifies API surface by removing unused code, or enables proper version-gating of features.\n\n**Recommendation**:\nIf version-gating planned soon, add TODO comment with planned use case. If not, consider removing function to keep API minimal.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"c56d5b2e_26bab825","line":52,"updated":"2026-02-27 13:15:12.000000000","message":"is_microversion_supported() returns False when max_ver is None, but calling code passes None directly to api_version parameter.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: API calls fail with cryptic errors when version discovery fails, because None gets passed as api_version parameter.\n\n**Priority**: Before merge\n**Why This Matters**: The gap between get_max_version() returning None and is_microversion_supported() handling creates path where None propagates to API calls.\n\n**Recommendation**:\nEither raise VersionDiscoveryError when max_ver is None, modify calling code to check for None, or add default version fallback.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"256c9d1abf9a46ba8f729db0d968d6b8","url":"https://zuul.teim.app/t/main/buildset/256c9d1abf9a46ba8f729db0d968d6b8","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":"0a99f5d977e5365ba94a533880b9bb917a55a57e","patch_set":3,"id":"46d8d23a_86b3fee8","line":34,"updated":"2026-02-27 14:37:58.000000000","message":"Docstring in get_client() has outdated reference to \u0027latest\u0027 which is not mentioned in the actual parameter documentation\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Would improve documentation accuracy and prevent confusion about supported parameter values\n\n**Recommendation**:\nUpdate docstring to remove the reference to \u0027latest\u0027 or clarify that only specific version strings like \u00271.0\u0027, \u00271.1\u0027 are supported","commit_id":"701bd46b813fa60cbc8c9ba789c360be9d221df1"},{"robot_id":"zuul","robot_run_id":"256c9d1abf9a46ba8f729db0d968d6b8","url":"https://zuul.teim.app/t/main/buildset/256c9d1abf9a46ba8f729db0d968d6b8","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":"0a99f5d977e5365ba94a533880b9bb917a55a57e","patch_set":3,"id":"98ead2d1_eab498d2","line":55,"updated":"2026-02-27 14:37:58.000000000","message":"The get_max_version function could cache results per request to avoid repeated API calls, similar to how views cache with @memoized.memoized_method\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Would reduce redundant API calls when multiple forms/views call get_max_version() in the same request\n\n**Recommendation**:\nAdd request-level caching using a cache key on the request object (e.g., request.watcher_max_version) to avoid redundant HTTP requests within the same request lifecycle","commit_id":"701bd46b813fa60cbc8c9ba789c360be9d221df1"},{"robot_id":"zuul","robot_run_id":"256c9d1abf9a46ba8f729db0d968d6b8","url":"https://zuul.teim.app/t/main/buildset/256c9d1abf9a46ba8f729db0d968d6b8","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":"0a99f5d977e5365ba94a533880b9bb917a55a57e","patch_set":3,"id":"6b769e26_3b9a25a9","line":83,"updated":"2026-02-27 14:37:58.000000000","message":"is_microversion_supported returns False for both max_ver\u003dNone and actual unsupported versions, making it impossible to distinguish between \u0027discovery failed\u0027 and \u0027server too old\u0027\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Would allow better error handling and user feedback when version discovery fails vs server genuinely being too old\n\n**Recommendation**:\nConsider raising a specific exception or returning a tri-state value (True/False/None) to distinguish discovery failure from unsupported version. Current behavior is safe but loses diagnostic information.","commit_id":"701bd46b813fa60cbc8c9ba789c360be9d221df1"},{"robot_id":"zuul","robot_run_id":"dc649ee4e4964719acdce5a19455103b","url":"https://zuul.teim.app/t/main/buildset/dc649ee4e4964719acdce5a19455103b","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":"4c9c2dcfdfce06989e4dbe64c421a2319ebddf78","patch_set":5,"id":"f64a7b13_d4811469","line":55,"updated":"2026-03-02 07:30:41.000000000","message":"Docstring for get_max_version() could document what exceptions are caught and suppressed (ClientException).\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Improved maintainability and clearer API contract for developers.\n\n**Recommendation**:\nAdd note: \u0027Returns None if version discovery fails (network errors, ClientException). Failure logged at DEBUG.\u0027","commit_id":"e6edaba67f6f9d333ad8151be6f7650cc0a53e95"},{"robot_id":"zuul","robot_run_id":"dc649ee4e4964719acdce5a19455103b","url":"https://zuul.teim.app/t/main/buildset/dc649ee4e4964719acdce5a19455103b","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":"4c9c2dcfdfce06989e4dbe64c421a2319ebddf78","patch_set":5,"id":"22b3ef49_3eac7939","line":83,"updated":"2026-03-02 07:30:41.000000000","message":"is_microversion_supported() catches UnsupportedVersion and TypeError but could document why TypeError might occur.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Future maintainers understand defensive programming approach.\n\n**Recommendation**:\nAdd inline comment: \u0027# TypeError can occur if version strings are malformed or None\u0027","commit_id":"e6edaba67f6f9d333ad8151be6f7650cc0a53e95"}],"watcher_dashboard/content/action_plans/views.py":[{"robot_id":"zuul","robot_run_id":"dc649ee4e4964719acdce5a19455103b","url":"https://zuul.teim.app/t/main/buildset/dc649ee4e4964719acdce5a19455103b","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":"4c9c2dcfdfce06989e4dbe64c421a2319ebddf78","patch_set":5,"id":"0b2cd341_67a4c58d","line":128,"updated":"2026-03-02 07:30:41.000000000","message":"Variable \u0027efficacy_indicators\u0027 may be referenced before assignment in get_related_efficacy_indicators_data(). Exception path doesn\u0027t initialize the variable, causing UnboundLocalError.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: Runtime error causing page crash when viewing action plan details if efficacy indicators fail to load.\n\n**Priority**: Before merge\n**Why This Matters**: Classic Python anti-pattern causing UnboundLocalError. Except block catches exception but fails to initialize the returned variable.\n\n**Recommendation**:\nInitialize \u0027efficacy_indicators \u003d []\u0027 before the try block, or add initialization in the except block before the return statement.","commit_id":"e6edaba67f6f9d333ad8151be6f7650cc0a53e95"}],"watcher_dashboard/content/audits/forms.py":[{"robot_id":"zuul","robot_run_id":"ad7ef7d09ea547dba0f43424bc6fc199","url":"https://zuul.teim.app/t/main/buildset/ad7ef7d09ea547dba0f43424bc6fc199","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":"349dac04dfb625db5f8245500ce55120040c4f30","patch_set":1,"id":"798f83a7_60dc8139","line":216,"updated":"2026-02-27 11:00:10.000000000","message":"get_max_version() returns None on failure but callers don\u0027t always validate the return value before passing to API calls\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If get_max_version() fails due to API unavailability, None is passed to Audit.create() as api_version. While this is handled (defaults to MIN_DEFAULT\u003d\u00271.0\u0027), silent fallback may mask API connectivity issues.\n\n**Suggestion**:\nConsider adding a warning log when get_max_version() returns None, or explicitly check and use MIN_DEFAULT rather than None for clarity. This would make the fallback behavior more explicit in the code.","commit_id":"049e166c2e6da638f422cc54c3ce8081dd3135a2"},{"robot_id":"zuul","robot_run_id":"256c9d1abf9a46ba8f729db0d968d6b8","url":"https://zuul.teim.app/t/main/buildset/256c9d1abf9a46ba8f729db0d968d6b8","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":"0a99f5d977e5365ba94a533880b9bb917a55a57e","patch_set":3,"id":"c7f4290d_15ffc28d","line":131,"updated":"2026-02-27 14:37:58.000000000","message":"Form performs API call during __init__ for version discovery, which may execute on GET requests (form display) as well as POST\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: API discovery call runs even when form is just being displayed, adding unnecessary latency to GET requests\n\n**Suggestion**:\nConsider lazy version discovery - only call get_max_version() in handle() method when form is being submitted, or cache at request level to avoid repeated API calls","commit_id":"701bd46b813fa60cbc8c9ba789c360be9d221df1"}],"watcher_dashboard/content/audits/views.py":[{"robot_id":"zuul","robot_run_id":"ad7ef7d09ea547dba0f43424bc6fc199","url":"https://zuul.teim.app/t/main/buildset/ad7ef7d09ea547dba0f43424bc6fc199","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":"349dac04dfb625db5f8245500ce55120040c4f30","patch_set":1,"id":"2137cc2d_e0fda652","line":47,"updated":"2026-02-27 11:00:10.000000000","message":"The memoized_method decorator for max_version() could potentially cache None values, preventing retries within the same request if the API becomes temporarily available\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: This is a minor concern since requests are short-lived, but understanding the caching behavior helps with troubleshooting.\n\n**Recommendation**:\nConsider documenting that max_version() is cached per-request and returns None (which defaults to 1.0) if the API root endpoint fails. This is acceptable behavior since the request is short-lived.","commit_id":"049e166c2e6da638f422cc54c3ce8081dd3135a2"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"897b0854_bf5eb7a3","line":80,"updated":"2026-02-27 13:15:12.000000000","message":"Unused is_microversion_supported() function in views - Feature detection exists but isn\u0027t utilized in current view code.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: The is_microversion_supported() function exists but isn\u0027t called in view code, suggesting incomplete implementation.\n\n**Suggestion**:\nEither use is_microversion_supported() for version-based feature gating, add TODO comment for planned use, or remove if not needed.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"dc649ee4e4964719acdce5a19455103b","url":"https://zuul.teim.app/t/main/buildset/dc649ee4e4964719acdce5a19455103b","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":"4c9c2dcfdfce06989e4dbe64c421a2319ebddf78","patch_set":5,"id":"16c1c9dd_46c940a4","line":47,"updated":"2026-03-02 07:30:41.000000000","message":"max_version() makes HTTP call to discover server version. @memoized_method caches per request but not across instances.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Minor performance overhead from potential redundant API calls. Impact limited by per-request caching.\n\n**Suggestion**:\nConsider session-level cache for max_version in high-traffic scenarios. Current implementation acceptable.","commit_id":"e6edaba67f6f9d333ad8151be6f7650cc0a53e95"},{"robot_id":"zuul","robot_run_id":"dc649ee4e4964719acdce5a19455103b","url":"https://zuul.teim.app/t/main/buildset/dc649ee4e4964719acdce5a19455103b","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":"4c9c2dcfdfce06989e4dbe64c421a2319ebddf78","patch_set":5,"id":"cf2c1362_ba15f269","line":77,"updated":"2026-03-02 07:30:41.000000000","message":"Bare Exception clause catches all exceptions including KeyboardInterrupt and SystemExit. Consider catching more specific exceptions.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: May mask unexpected errors and make debugging difficult. Could catch system-level exceptions.\n\n**Suggestion**:\nCatch more specific exception types (watcherclient exceptions) where possible, consistent with Horizon conventions.","commit_id":"e6edaba67f6f9d333ad8151be6f7650cc0a53e95"}],"watcher_dashboard/test/api_tests/test_client.py":[{"robot_id":"zuul","robot_run_id":"ad7ef7d09ea547dba0f43424bc6fc199","url":"https://zuul.teim.app/t/main/buildset/ad7ef7d09ea547dba0f43424bc6fc199","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":"349dac04dfb625db5f8245500ce55120040c4f30","patch_set":1,"id":"585a5eb2_a4ae2d3c","line":26,"updated":"2026-02-27 11:00:10.000000000","message":"Test mocks do not use autospec\u003dTrue, which is the recommended OpenStack practice for ensuring mock objects match the real API signatures\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Without autospec, mock objects may allow calling methods that don\u0027t exist on the real object, reducing test effectiveness and potentially hiding bugs during refactoring.\n\n**Suggestion**:\nAdd autospec\u003dTrue to all mock.patch() or Mock() calls. For example: `with mock.patch(\u0027watcher_dashboard.api.watcher.watcherclient\u0027, autospec\u003dTrue) as wc:`. This ensures mock objects match the real API\u0027s signature.","commit_id":"049e166c2e6da638f422cc54c3ce8081dd3135a2"},{"robot_id":"zuul","robot_run_id":"ad7ef7d09ea547dba0f43424bc6fc199","url":"https://zuul.teim.app/t/main/buildset/ad7ef7d09ea547dba0f43424bc6fc199","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":"349dac04dfb625db5f8245500ce55120040c4f30","patch_set":1,"id":"5154b4af_f04119f8","line":101,"updated":"2026-02-27 11:00:10.000000000","message":"Tests for is_microversion_supported() could include edge cases like malformed version strings\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Additional test coverage for edge cases would ensure robustness when handling unexpected API responses.\n\n**Recommendation**:\nAdd test cases for: malformed version strings (\u0027invalid\u0027, \u00271.x\u0027), empty strings, None max_ver with None required, and boundary conditions.","commit_id":"049e166c2e6da638f422cc54c3ce8081dd3135a2"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"ae62f4ff_84aea8df","line":27,"updated":"2026-02-27 13:15:12.000000000","message":"Test coverage should include error conditions for get_max_version() - endpoint failures, unexpected data, HTTP errors.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Ensures version discovery failures are handled gracefully. Tests for error paths are critical for production reliability.\n\n**Recommendation**:\nAdd test cases for: watcherclient.get_instance() raising exceptions, empty/invalid API data, HTTP errors, timeout scenarios.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"94e904a991d84e4397dd5baf54235616","url":"https://zuul.teim.app/t/main/buildset/94e904a991d84e4397dd5baf54235616","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":"02dfc95fee3c8372bbde78791813185a34b22fe3","patch_set":2,"id":"522b3a1b_19d63afc","line":28,"updated":"2026-02-27 13:15:12.000000000","message":"Test mocks missing autospec\u003dTrue parameter - Per OpenStack H210 guideline, @mock.patch decorators should include autospec\u003dTrue.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Mocks without autospec may allow tests to pass even if mocked function signature changes, reducing test effectiveness.\n\n**Suggestion**:\nAdd autospec\u003dTrue to all @mock.patch decorators. This is recommended practice, though exceptions exist for maintaining consistency.","commit_id":"01a52b8a86e3e9771bb72f355ca1d2a14d727d81"},{"robot_id":"zuul","robot_run_id":"256c9d1abf9a46ba8f729db0d968d6b8","url":"https://zuul.teim.app/t/main/buildset/256c9d1abf9a46ba8f729db0d968d6b8","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":"0a99f5d977e5365ba94a533880b9bb917a55a57e","patch_set":3,"id":"1b0112ba_843ba3eb","line":26,"updated":"2026-02-27 14:37:58.000000000","message":"Tests use mock.patch() without autospec\u003dTrue parameter, which is a recommended OpenStack practice for new code to ensure proper mock signatures\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Without autospec, mocks won\u0027t validate that the real objects have the same attributes/arguments, potentially hiding interface mismatches\n\n**Suggestion**:\nAdd autospec\u003dTrue to all @mock.patch() decorators in the new tests. However, note that existing codebase uses @mock.patch.object() without autospec, so this follows local patterns. For consistency with new code guidelines, consider adding autospec\u003dTrue, but this is not required for existing code patterns.","commit_id":"701bd46b813fa60cbc8c9ba789c360be9d221df1"},{"robot_id":"zuul","robot_run_id":"256c9d1abf9a46ba8f729db0d968d6b8","url":"https://zuul.teim.app/t/main/buildset/256c9d1abf9a46ba8f729db0d968d6b8","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":"0a99f5d977e5365ba94a533880b9bb917a55a57e","patch_set":3,"id":"d7961231_e0a76dc4","line":101,"updated":"2026-02-27 14:37:58.000000000","message":"Tests for is_microversion_supported could include additional edge cases like malformed version strings and version comparison edge cases\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Would improve robustness of version comparison logic and catch potential parsing issues\n\n**Recommendation**:\nAdd test cases for: malformed version strings (\u0027invalid\u0027, \u00271.x\u0027), boundary conditions (\u00270.9\u0027 vs \u00271.0\u0027), and future versions (\u00272.0\u0027, \u00271.10\u0027 vs \u00271.9\u0027)","commit_id":"701bd46b813fa60cbc8c9ba789c360be9d221df1"},{"robot_id":"zuul","robot_run_id":"dc649ee4e4964719acdce5a19455103b","url":"https://zuul.teim.app/t/main/buildset/dc649ee4e4964719acdce5a19455103b","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":"4c9c2dcfdfce06989e4dbe64c421a2319ebddf78","patch_set":5,"id":"aa29701c_71f877ba","line":27,"updated":"2026-03-02 07:30:41.000000000","message":"Mock objects in test_client.py do not use autospec\u003dTrue, recommended by OpenStack testing guidelines.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Tests may pass even if actual API contract changes. Mocks won\u0027t catch signature mismatches.\n\n**Suggestion**:\nAdd autospec\u003dTrue to mock.Mock() calls for better test fidelity. Best practice for new tests.","commit_id":"e6edaba67f6f9d333ad8151be6f7650cc0a53e95"},{"robot_id":"zuul","robot_run_id":"dc649ee4e4964719acdce5a19455103b","url":"https://zuul.teim.app/t/main/buildset/dc649ee4e4964719acdce5a19455103b","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":"4c9c2dcfdfce06989e4dbe64c421a2319ebddf78","patch_set":5,"id":"f71edcfd_61cdb9a8","line":79,"updated":"2026-03-02 07:30:41.000000000","message":"Tests could be enhanced to cover get_max_version() function directly, including error cases.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Better test coverage for version discovery edge cases.\n\n**Recommendation**:\nAdd tests for: get_max_version() success, network error, malformed response, and invalid version strings.","commit_id":"e6edaba67f6f9d333ad8151be6f7650cc0a53e95"}]}
