)]}'
{"watcher_dashboard/api/watcher.py":[{"robot_id":"zuul","robot_run_id":"7b688c6e8e7f4fc48a4c4fa2c23f9a77","url":"https://zuul.teim.app/t/main/buildset/7b688c6e8e7f4fc48a4c4fa2c23f9a77","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":"ed4f22f20f49d2c10362f5850df68339a38f8bec","patch_set":2,"id":"31db5553_30f6cae9","line":544,"updated":"2026-02-27 07:03:56.000000000","message":"Consider applying the same pattern to Goal objects for consistency\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: Codebase has similar display_name + name patterns for Goal objects. Creating get_goal_display_name() helper would provide consistency.\n\n**Recommendation**:\nIf multiple places use goal.display_name with fallback to goal.name, consider creating get_goal_display_name() helper for API layer consistency.","commit_id":"cbcdde4d0dee39faa9096d26d844a411140a951e"},{"robot_id":"zuul","robot_run_id":"7b688c6e8e7f4fc48a4c4fa2c23f9a77","url":"https://zuul.teim.app/t/main/buildset/7b688c6e8e7f4fc48a4c4fa2c23f9a77","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":"ed4f22f20f49d2c10362f5850df68339a38f8bec","patch_set":2,"id":"b05a04f4_842c0db4","line":544,"updated":"2026-02-27 07:03:56.000000000","message":"Consider using getattr() in the helper for more defensive programming\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: Current implementation uses direct attribute access for immediate error detection. getattr would be more defensive.\n\n**Recommendation**:\nIf defensive behavior preferred: return getattr(strategy, \u0027display_name\u0027, None) or getattr(strategy, \u0027name\u0027, \u0027\u0027). Keep current approach for fail-fast design.","commit_id":"cbcdde4d0dee39faa9096d26d844a411140a951e"},{"robot_id":"zuul","robot_run_id":"e43e381c95a34b31908c8fcf309232a1","url":"https://zuul.teim.app/t/main/buildset/e43e381c95a34b31908c8fcf309232a1","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":"aa20621f36cd58791409dc98b1e2a86703989b9b","patch_set":3,"id":"102e404b_eb2c56f2","line":544,"updated":"2026-02-27 08:32:42.000000000","message":"New helper function lacks explicit type checking or validation for the strategy parameter\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Adding input validation would provide clearer error messages and help catch programming errors earlier in the development cycle.\n\n**Recommendation**:\nConsider adding a type check or docstring clarification that the function expects a watcherclient Strategy resource object. Alternatively, add an isinstance check to provide a more informative error if an unexpected type is passed.","commit_id":"0aaae03acc8126881dd87eb33ee3ef072f95a3bc"},{"robot_id":"zuul","robot_run_id":"e43e381c95a34b31908c8fcf309232a1","url":"https://zuul.teim.app/t/main/buildset/e43e381c95a34b31908c8fcf309232a1","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":"aa20621f36cd58791409dc98b1e2a86703989b9b","patch_set":3,"id":"681fcbf0_69e9f6e4","line":544,"updated":"2026-02-27 08:32:42.000000000","message":"The new helper function could be added as a method on the Strategy class for better object-oriented design\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Moving the function to be a method on the Strategy class would improve encapsulation and make the API more intuitive by following object-oriented design principles.\n\n**Recommendation**:\nConsider adding get_display_name() as an instance method on the Strategy class (which inherits from base.APIDictWrapper) instead of a standalone function. This would be called as strategy.get_display_name() rather than get_strategy_display_name(strategy).","commit_id":"0aaae03acc8126881dd87eb33ee3ef072f95a3bc"},{"robot_id":"zuul","robot_run_id":"9c1950ba727d485882ca6c314cf65243","url":"https://zuul.teim.app/t/main/buildset/9c1950ba727d485882ca6c314cf65243","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":"960f669e23e3c1ce4b30bbbb9eea2e4d6218dcdf","patch_set":4,"id":"d8820fcb_ef63268e","line":307,"updated":"2026-02-27 13:10:05.000000000","message":"Consider whether similar helper methods would benefit other resources (ActionPlan, Action, EfficacyIndicator) that may have display_name fields.\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: Consistent API patterns across all resources would improve code maintainability and reduce potential for similar code duplication.\n\n**Recommendation**:\nReview other resource classes to see if they have similar display_name-with-fallback patterns. If so, consider applying the same helper method pattern for consistency.","commit_id":"d6d1add8f5a47411700e695452059fbcfb557359"},{"robot_id":"zuul","robot_run_id":"9c1950ba727d485882ca6c314cf65243","url":"https://zuul.teim.app/t/main/buildset/9c1950ba727d485882ca6c314cf65243","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":"960f669e23e3c1ce4b30bbbb9eea2e4d6218dcdf","patch_set":4,"id":"3c4c98b0_27eb0a8f","line":437,"updated":"2026-02-27 13:10:05.000000000","message":"Goal class missing display_name() helper method while Strategy class has one. The templates use goal.display_name directly (in templates/infra_optim/goals/details.html) which could benefit from the same helper pattern for consistency.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Inconsistent API design between Goal and Strategy classes. The Goal class is used in templates with direct display_name access without the same helper method that Strategy now has.\n\n**Suggestion**:\nConsider adding get_display_name() method to the Goal class as well for API consistency across resources. Alternatively, document why Goal doesn\u0027t need this helper (e.g., if Goal always has display_name populated).","commit_id":"d6d1add8f5a47411700e695452059fbcfb557359"},{"robot_id":"zuul","robot_run_id":"9c1950ba727d485882ca6c314cf65243","url":"https://zuul.teim.app/t/main/buildset/9c1950ba727d485882ca6c314cf65243","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":"960f669e23e3c1ce4b30bbbb9eea2e4d6218dcdf","patch_set":4,"id":"edbabb37_3952afa8","line":524,"updated":"2026-02-27 13:10:05.000000000","message":"Consider adding a docstring note about the performance characteristics of get_display_name() vs to_dict() for future maintainers.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Documents the performance optimization reasoning for future developers who might be tempted to use getattr() with default or to_dict() approaches.\n\n**Recommendation**:\nExpand the docstring to include: \u0027This method uses direct attribute access rather than getattr() or to_dict() to avoid overhead and surface missing attributes immediately as errors.\u0027","commit_id":"d6d1add8f5a47411700e695452059fbcfb557359"},{"robot_id":"zuul","robot_run_id":"9c1950ba727d485882ca6c314cf65243","url":"https://zuul.teim.app/t/main/buildset/9c1950ba727d485882ca6c314cf65243","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":"960f669e23e3c1ce4b30bbbb9eea2e4d6218dcdf","patch_set":4,"id":"7a66ca25_003d5bab","line":524,"updated":"2026-02-27 13:10:05.000000000","message":"The get_display_name() method could be added as a @property instead of a regular method for more Pythonic access (strategy.display_name instead of strategy.get_display_name()).\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: Would allow cleaner syntax like strategy.display_name while still providing the fallback behavior. However, this would shadow the actual display_name attribute.\n\n**Recommendation**:\nKeep as a method to avoid shadowing the underlying attribute and to make the fallback logic explicit. The current method approach is clearer and avoids potential confusion.","commit_id":"d6d1add8f5a47411700e695452059fbcfb557359"},{"robot_id":"zuul","robot_run_id":"8b299e7aade14fdf9b2c375acc764d32","url":"https://zuul.teim.app/t/main/buildset/8b299e7aade14fdf9b2c375acc764d32","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":"4a045ec4efcac09c64f7297eecf31a3be39a4633","patch_set":5,"id":"ac905b62_9d823c17","line":544,"updated":"2026-03-02 06:18:32.000000000","message":"Consider adding type hints to the get_strategy_display_name function for improved documentation\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Type hints improve IDE support, documentation clarity, and enable static type checking\n\n**Recommendation**:\nAdd type hints: def get_strategy_display_name(strategy) -\u003e str: or def get_strategy_display_name(strategy: \u0027Strategy\u0027) -\u003e str:","commit_id":"2c8d13ccd3e09083098d487b81b173e18b3522e7"}],"watcher_dashboard/content/audit_templates/forms.py":[{"robot_id":"zuul","robot_run_id":"7b688c6e8e7f4fc48a4c4fa2c23f9a77","url":"https://zuul.teim.app/t/main/buildset/7b688c6e8e7f4fc48a4c4fa2c23f9a77","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":"ed4f22f20f49d2c10362f5850df68339a38f8bec","patch_set":2,"id":"5956b1d5_0334a5b0","line":117,"updated":"2026-02-27 07:03:56.000000000","message":"Consider using list comprehension for consistency with idiomatic Python style\n\n**Severity**: SUGGESTION | **Confidence**: 0.6\n\n**Benefit**: Current implementation uses explicit for loop with append. List comprehension would be more idiomatic Python.\n\n**Recommendation**:\nConsider changing back to list comprehension: choices \u003d [(s.uuid, watcher.get_strategy_display_name(s)) for s in strategies]. Minor style preference.","commit_id":"cbcdde4d0dee39faa9096d26d844a411140a951e"}],"watcher_dashboard/test/api_tests/test_watcher.py":[{"robot_id":"zuul","robot_run_id":"7b688c6e8e7f4fc48a4c4fa2c23f9a77","url":"https://zuul.teim.app/t/main/buildset/7b688c6e8e7f4fc48a4c4fa2c23f9a77","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":"ed4f22f20f49d2c10362f5850df68339a38f8bec","patch_set":2,"id":"a9b16958_1c11f338","line":465,"updated":"2026-02-27 07:03:56.000000000","message":"Missing test edge case for strategy object without name attribute when display_name is falsy\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Helper uses direct attribute access which raises AttributeError if strategy has neither display_name nor name. Tests don\u0027t cover this edge case.\n\n**Suggestion**:\nAdd a test case creating a Strategy object without display_name and name attributes to verify AttributeError is raised, or document expected behavior for malformed objects.","commit_id":"cbcdde4d0dee39faa9096d26d844a411140a951e"},{"robot_id":"zuul","robot_run_id":"e43e381c95a34b31908c8fcf309232a1","url":"https://zuul.teim.app/t/main/buildset/e43e381c95a34b31908c8fcf309232a1","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":"aa20621f36cd58791409dc98b1e2a86703989b9b","patch_set":3,"id":"cd241348_fa546e58","line":465,"updated":"2026-02-27 08:32:42.000000000","message":"Missing test case for AttributeError scenario when strategy object lacks both display_name and name attributes\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: The new helper function uses direct attribute access which will raise AttributeError if both attributes are missing. While the commit message explains this is intentional to surface bugs immediately, there is no test verifying this behavior occurs as expected.\n\n**Suggestion**:\nAdd a test case that verifies AttributeError is raised when a strategy object has neither display_name nor name attributes, confirming the intended error handling behavior described in the commit message.","commit_id":"0aaae03acc8126881dd87eb33ee3ef072f95a3bc"},{"robot_id":"zuul","robot_run_id":"9c1950ba727d485882ca6c314cf65243","url":"https://zuul.teim.app/t/main/buildset/9c1950ba727d485882ca6c314cf65243","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":"960f669e23e3c1ce4b30bbbb9eea2e4d6218dcdf","patch_set":4,"id":"db30d884_ec8cf6db","line":495,"updated":"2026-02-27 13:10:05.000000000","message":"Test data in watcher_data.py uses \u0027display_name\u0027 for strategies but the test for missing attributes expects AttributeError to be raised when \u0027name\u0027 is also missing.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: The test_get_display_name_missing_attrs test creates a Strategy with only uuid, which would cause AttributeError on both self.display_name and self.name. This tests the error surface but may not reflect real API responses.\n\n**Suggestion**:\nConsider adding a test case that mimics more realistic API response scenarios (e.g., display_name present but empty string, display_name\u003dNone, etc.). The current test is valid but may not cover edge cases that could occur in production.","commit_id":"d6d1add8f5a47411700e695452059fbcfb557359"}]}
