)]}'
{".pre-commit-config.yaml":[{"robot_id":"zuul","robot_run_id":"02887086535a457c9372977d6624d20b","url":"https://zuul.teim.app/t/main/buildset/02887086535a457c9372977d6624d20b","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":"a9814d8b9423e02bb443dc808d75e8e241d4a508","patch_set":3,"id":"9065233d_32933778","line":42,"updated":"2026-02-28 12:36:30.000000000","message":"Ruff version v0.15.4 in pre-commit-config.yaml could be pinned more strictly or documented with minimum version requirements for consistency\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Ensures all developers and CI systems use the same ruff version, preventing inconsistent formatting results\n\n**Recommendation**:\nDocument minimum required ruff version in contributor documentation or use more specific version pin for reproducibility","commit_id":"4b502b880a85c258ed1a9b0b2c9a938b5f818db7"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"076b0d3bc61f7d928224324bbc40a8959353476d","patch_set":6,"id":"ac50013c_3cb2caad","line":5,"updated":"2026-04-04 01:08:42.000000000","message":"The trailing-whitespace hook was removed from .pre-commit-config.yaml but no replacement was explicitly documented. While ruff-format does not add trailing whitespace, it also does not detect or fix existing trailing whitespace.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If any existing files in the repository have trailing whitespace, the removal of the trailing-whitespace hook means pre-commit will no longer catch or auto-fix those cases. New trailing whitespace introduced by edits could also go undetected.\n\n**Suggestion**:\nVerify that no files in the repository currently have trailing whitespace. If any are found, clean them in this change. Alternatively, add the trailing-whitespace hook back or document the rationale for its removal.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"3d1576b5dcc85aa417be748c9fb8d127fc73e816","patch_set":6,"id":"d59599b6_e025779b","line":5,"updated":"2026-04-04 01:08:02.000000000","message":"The trailing-whitespace hook was removed from .pre-commit-config.yaml but no replacement was explicitly documented. While ruff-format does not add trailing whitespace, it also does not detect or fix existing trailing whitespace.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If any existing files in the repository have trailing whitespace, the removal of the trailing-whitespace hook means pre-commit will no longer catch or auto-fix those cases. New trailing whitespace introduced by edits could also go undetected.\n\n**Suggestion**:\nVerify that no files in the repository currently have trailing whitespace. If any are found, clean them in this change. Alternatively, add the trailing-whitespace hook back or document the rationale for its removal.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"a666c9dd3fc44c9bd6c61459b4ce65bff8aa56f5","patch_set":6,"id":"e54b7a77_98fe112e","line":5,"updated":"2026-04-04 01:09:32.000000000","message":"The trailing-whitespace hook was removed from .pre-commit-config.yaml but no replacement was explicitly documented. While ruff-format does not add trailing whitespace, it also does not detect or fix existing trailing whitespace.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If any existing files in the repository have trailing whitespace, the removal of the trailing-whitespace hook means pre-commit will no longer catch or auto-fix those cases. New trailing whitespace introduced by edits could also go undetected.\n\n**Suggestion**:\nVerify that no files in the repository currently have trailing whitespace. If any are found, clean them in this change. Alternatively, add the trailing-whitespace hook back or document the rationale for its removal.","commit_id":"2442c365140114098fdc30a377529105014ec973"}],"doc/source/contributor/code-conventions-and-testing.rst":[{"robot_id":"zuul","robot_run_id":"4e59e27923844a54baf755d0e51e9df1","url":"https://zuul.teim.app/t/main/buildset/4e59e27923844a54baf755d0e51e9df1","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":"339b4fe5576bd68841243a2be11a545154faf524","patch_set":1,"id":"f502a887_b9deb50c","line":184,"updated":"2026-02-27 20:12:31.000000000","message":"Consider documenting the ruff-check and ruff-format command-line usage for contributors without pre-commit\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Improves contributor experience by providing alternative workflows for developers who cannot or prefer not to use pre-commit hooks, making the project more accessible\n\n**Recommendation**:\nAdd a section documenting manual commands such as \u0027ruff format .\u0027 and \u0027ruff check --fix .\u0027 as alternatives to pre-commit, similar to how the old autopep8 workflow was documented. This helps contributors on systems where pre-commit may not be available or practical.","commit_id":"c61492eacb3e4d32edb9936bf03e642f38fa8fbd"},{"robot_id":"zuul","robot_run_id":"0e60a7ed8e19449a8bde7fca1ef4053e","url":"https://zuul.teim.app/t/main/buildset/0e60a7ed8e19449a8bde7fca1ef4053e","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":"f871fec5625d4b699d1613144116245de5662bc8","patch_set":4,"id":"5f260315_16cba1f9","line":4,"updated":"2026-03-30 13:38:16.000000000","message":"The new code-conventions-and-testing.rst references a service-layer-pattern.rst document. If that companion document has not been merged yet, the cross-reference will produce a broken link in the built docs.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Ensuring cross-references resolve prevents broken documentation links that confuse contributors and fail doc build jobs.\n\n**Recommendation**:\nVerify that doc/source/contributor/service-layer-pattern.rst exists either in this patch, in a dependent change, or in master. If it is in a dependent change, the doc build may still pass in the gate, but the :doc: reference will produce a warning.","commit_id":"0570f6ad113f264425c598e157831640d9357cf5"},{"robot_id":"zuul","robot_run_id":"0e60a7ed8e19449a8bde7fca1ef4053e","url":"https://zuul.teim.app/t/main/buildset/0e60a7ed8e19449a8bde7fca1ef4053e","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":"f871fec5625d4b699d1613144116245de5662bc8","patch_set":4,"id":"29e8593e_6230c5c2","line":756,"updated":"2026-03-30 13:38:16.000000000","message":"The code-conventions-and-testing.rst documentation describes ConfigMemoizedCache using memoized.memoized.invalidate_all(), but the actual implementation in fixtures.py uses functools.lru_cache\u0027s cache_clear() method. These are incompatible caching mechanisms.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Developers following the documentation to create ConfigMemoizedCache-based tests will be confused by the discrepancy between the documented API (memoized.memoized.invalidate_all) and the actual implementation (attr.cache_clear).\n\n**Suggestion**:\nUpdate the documentation in code-conventions-and-testing.rst to match the actual implementation. Replace the memoized.memoized.invalidate_all() references with the actual pattern used in fixtures.py (iterating over module attributes and calling cache_clear() on callable attributes that have it).","commit_id":"0570f6ad113f264425c598e157831640d9357cf5"},{"robot_id":"zuul","robot_run_id":"042564e4741741a392dcb2798ed419f8","url":"https://zuul.teim.app/t/main/buildset/042564e4741741a392dcb2798ed419f8","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":"741695410bf28ff44200e736b717395fdb75c0b1","patch_set":5,"id":"8bfb77ff_f16deca0","line":8,"updated":"2026-03-30 14:41:09.000000000","message":"The new contributor documentation references :doc:`service-layer-pattern` but this file does not exist under doc/source/contributor/. This broken cross-reference will cause a Sphinx build warning or error.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: Sphinx will emit a warning or fail the docs build (tox -e docs uses -W flag) when encountering the dangling :doc:`service-layer-pattern` reference.\n\n**Priority**: Before merge\n**Why This Matters**: The tox -e docs target runs sphinx-build with -W (warnings as errors). A broken :doc: reference will cause the documentation build to fail in CI, blocking this and dependent patches.\n\n**Recommendation**:\nEither create the service-layer-pattern.rst document under doc/source/contributor/, or remove/comment out the :doc:`service-layer-pattern` reference and the related .. seealso:: block at the end of the file until the document is written. If removing, also remove the code-review checklist item that references it.","commit_id":"13d1bd2278d1c750f352723bcccb8f1e0de97def"}],"pyproject.toml":[{"robot_id":"zuul","robot_run_id":"afa4c4b11db540eb91dde224c4729893","url":"https://zuul.teim.app/t/main/buildset/afa4c4b11db540eb91dde224c4729893","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":"4fb69ebfab71428eaa49b15f4f19885e468e3230","patch_set":2,"id":"1985f647_d4ba456e","line":75,"updated":"2026-02-27 20:28:29.000000000","message":"Consider adding a TODO comment or tracking issue for future f-string migration work (UP031, UP032 rules currently deferred).\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Provides visibility into planned future improvements and helps track technical debt related to the f-string migration that was intentionally deferred in this change.\n\n**Recommendation**:\nAdd a comment in pyproject.toml near the UP031/UP032 deferrals explaining these are planned for future work, or create a tracking bug/story. This ensures the deferred work is not forgotten and provides context for why these specific modernizations are skipped.","commit_id":"89328eecce2c999a45eed1be687ea60a1250752c"},{"robot_id":"zuul","robot_run_id":"02887086535a457c9372977d6624d20b","url":"https://zuul.teim.app/t/main/buildset/02887086535a457c9372977d6624d20b","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":"a9814d8b9423e02bb443dc808d75e8e241d4a508","patch_set":3,"id":"2e0ce93c_d5652c9c","line":47,"updated":"2026-02-28 12:36:30.000000000","message":"[tool.ruff.lint] select includes \u0027G\u0027 (logging) and \u0027LOG\u0027 rules without documentation about which specific rules are enforced\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Improved developer experience by making linting rules transparent and discoverable\n\n**Recommendation**:\nAdd section to code-conventions-and-testing.rst documenting ruff rules being enforced, particularly G and LOG rules","commit_id":"4b502b880a85c258ed1a9b0b2c9a938b5f818db7"},{"robot_id":"zuul","robot_run_id":"042564e4741741a392dcb2798ed419f8","url":"https://zuul.teim.app/t/main/buildset/042564e4741741a392dcb2798ed419f8","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":"741695410bf28ff44200e736b717395fdb75c0b1","patch_set":5,"id":"38324787_c9a19447","line":45,"updated":"2026-03-30 14:41:09.000000000","message":"S-rules are now only ignored for test/* via per-file-ignores; G-rule (logging) was added to the select list without explanatory comment.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Explicitly noting that S-rules and G-rules are newly enforced in production code helps reviewers understand the behavioral change.\n\n**Recommendation**:\nConsider adding a brief comment in pyproject.toml explaining the G (logging) rule addition, similar to the comments for the UP031/UP032 ignores. This aids future maintainers in understanding why certain rule groups were selected.","commit_id":"13d1bd2278d1c750f352723bcccb8f1e0de97def"},{"robot_id":"zuul","robot_run_id":"042564e4741741a392dcb2798ed419f8","url":"https://zuul.teim.app/t/main/buildset/042564e4741741a392dcb2798ed419f8","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":"741695410bf28ff44200e736b717395fdb75c0b1","patch_set":5,"id":"d6507fb5_62a33515","line":68,"updated":"2026-03-30 14:41:09.000000000","message":"The ruff.lint.isort section-order in pyproject.toml is missing the \u0027openstack-third-party\u0027 grouping that the contributor documentation describes as the standard four-group import order (stdlib, third-party, OpenStack, project-local).\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Consistent import grouping would match the documented convention and improve readability by visually separating OpenStack dependencies from other third-party libraries.\n\n**Recommendation**:\nConsider adding an \u0027openstack-third-party\u0027 section to the isort section-order to match the four-group convention documented in code-conventions-and-testing.rst. This would require configuring the [tool.ruff.lint.isort] section with known-third-party or a custom section. This can be done in a follow-up patch.","commit_id":"13d1bd2278d1c750f352723bcccb8f1e0de97def"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"a666c9dd3fc44c9bd6c61459b4ce65bff8aa56f5","patch_set":6,"id":"294cd6af_5d206dc8","line":45,"updated":"2026-04-04 01:09:32.000000000","message":"The ruff lint configuration enables the G (logging) rule group (flake8-logging-format) but the LOG rule group (logging) is also enabled. Verify that the G rules do not conflict with existing LOG.xxx call patterns in the codebase.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Prevents potential future lint failures from the G rule group that were not tested in this change.\n\n**Recommendation**:\nConfirm that tox -e pep8 passes with the new G rules enabled. If G rules produce warnings or errors not caught by the existing LOG rules, document or ignore them appropriately.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"3d1576b5dcc85aa417be748c9fb8d127fc73e816","patch_set":6,"id":"4f1b52fa_71ce1a18","line":45,"updated":"2026-04-04 01:08:02.000000000","message":"The ruff lint configuration enables the G (logging) rule group (flake8-logging-format) but the LOG rule group (logging) is also enabled. Verify that the G rules do not conflict with existing LOG.xxx call patterns in the codebase.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Prevents potential future lint failures from the G rule group that were not tested in this change.\n\n**Recommendation**:\nConfirm that tox -e pep8 passes with the new G rules enabled. If G rules produce warnings or errors not caught by the existing LOG rules, document or ignore them appropriately.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"076b0d3bc61f7d928224324bbc40a8959353476d","patch_set":6,"id":"6774c33d_4c37fd67","line":45,"updated":"2026-04-04 01:08:42.000000000","message":"The ruff lint configuration enables the G (logging) rule group (flake8-logging-format) but the LOG rule group (logging) is also enabled. Verify that the G rules do not conflict with existing LOG.xxx call patterns in the codebase.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Prevents potential future lint failures from the G rule group that were not tested in this change.\n\n**Recommendation**:\nConfirm that tox -e pep8 passes with the new G rules enabled. If G rules produce warnings or errors not caught by the existing LOG rules, document or ignore them appropriately.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"3d1576b5dcc85aa417be748c9fb8d127fc73e816","patch_set":6,"id":"228e9108_237615e7","line":47,"updated":"2026-04-04 01:08:02.000000000","message":"S-rule ignores (S101, S104, S105, S106, S110, S311) were removed from pyproject.toml with no explicit migration plan. These bandit security checks are now enforced across all non-test files.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Previously suppressed bandit rules (e.g., S101 assert use, S104/S105/S106 hardcoded password patterns, S110 try-except-pass, S311 random module) will now trigger failures if any production code triggers them. While the format change was presumably validated with tox -e pep8, future patches adding patterns matching these rules could face unexpected failures.\n\n**Suggestion**:\nAdd a brief comment in pyproject.toml explaining the deliberate removal of S-rule ignores and the rationale for now enforcing them. This prevents future contributors from re-adding them without understanding the context. Consider noting that force-single-line imports were also enabled to satisfy H301.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"076b0d3bc61f7d928224324bbc40a8959353476d","patch_set":6,"id":"8252fba0_7c5d24e7","line":47,"updated":"2026-04-04 01:08:42.000000000","message":"S-rule ignores (S101, S104, S105, S106, S110, S311) were removed from pyproject.toml with no explicit migration plan. These bandit security checks are now enforced across all non-test files.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Previously suppressed bandit rules (e.g., S101 assert use, S104/S105/S106 hardcoded password patterns, S110 try-except-pass, S311 random module) will now trigger failures if any production code triggers them. While the format change was presumably validated with tox -e pep8, future patches adding patterns matching these rules could face unexpected failures.\n\n**Suggestion**:\nAdd a brief comment in pyproject.toml explaining the deliberate removal of S-rule ignores and the rationale for now enforcing them. This prevents future contributors from re-adding them without understanding the context. Consider noting that force-single-line imports were also enabled to satisfy H301.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"a666c9dd3fc44c9bd6c61459b4ce65bff8aa56f5","patch_set":6,"id":"e7a93c7e_9f2ac5d4","line":47,"updated":"2026-04-04 01:09:32.000000000","message":"S-rule ignores (S101, S104, S105, S106, S110, S311) were removed from pyproject.toml with no explicit migration plan. These bandit security checks are now enforced across all non-test files.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Previously suppressed bandit rules (e.g., S101 assert use, S104/S105/S106 hardcoded password patterns, S110 try-except-pass, S311 random module) will now trigger failures if any production code triggers them. While the format change was presumably validated with tox -e pep8, future patches adding patterns matching these rules could face unexpected failures.\n\n**Suggestion**:\nAdd a brief comment in pyproject.toml explaining the deliberate removal of S-rule ignores and the rationale for now enforcing them. This prevents future contributors from re-adding them without understanding the context. Consider noting that force-single-line imports were also enabled to satisfy H301.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"3d1576b5dcc85aa417be748c9fb8d127fc73e816","patch_set":6,"id":"09d6c7d4_4d691aec","line":48,"updated":"2026-04-04 01:08:02.000000000","message":"The UP (pyupgrade) rule group was added to ruff lint select, but UP031 and UP032 are explicitly ignored. This is a good pattern, but consider documenting a follow-up task to remove these ignores.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Setting expectations for when the migration to modern string formatting should occur helps project planning.\n\n**Recommendation**:\nAdd a comment noting that UP031/UP032 are deferred for a dedicated modernization change, which is already partially done. Consider filing a tracking bug or blueprint.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"076b0d3bc61f7d928224324bbc40a8959353476d","patch_set":6,"id":"1627959d_bab4d697","line":48,"updated":"2026-04-04 01:08:42.000000000","message":"The UP (pyupgrade) rule group was added to ruff lint select, but UP031 and UP032 are explicitly ignored. This is a good pattern, but consider documenting a follow-up task to remove these ignores.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Setting expectations for when the migration to modern string formatting should occur helps project planning.\n\n**Recommendation**:\nAdd a comment noting that UP031/UP032 are deferred for a dedicated modernization change, which is already partially done. Consider filing a tracking bug or blueprint.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"a666c9dd3fc44c9bd6c61459b4ce65bff8aa56f5","patch_set":6,"id":"9a6d85ac_40ac17fe","line":48,"updated":"2026-04-04 01:09:32.000000000","message":"The UP (pyupgrade) rule group was added to ruff lint select, but UP031 and UP032 are explicitly ignored. This is a good pattern, but consider documenting a follow-up task to remove these ignores.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Setting expectations for when the migration to modern string formatting should occur helps project planning.\n\n**Recommendation**:\nAdd a comment noting that UP031/UP032 are deferred for a dedicated modernization change, which is already partially done. Consider filing a tracking bug or blueprint.","commit_id":"2442c365140114098fdc30a377529105014ec973"}],"watcher_dashboard/content/audit_templates/forms.py":[{"robot_id":"zuul","robot_run_id":"02887086535a457c9372977d6624d20b","url":"https://zuul.teim.app/t/main/buildset/02887086535a457c9372977d6624d20b","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":"a9814d8b9423e02bb443dc808d75e8e241d4a508","patch_set":3,"id":"2af24c10_85c5ea9a","line":28,"updated":"2026-02-28 12:36:30.000000000","message":"Pre-existing import order issue in audit_templates/forms.py: \u0027yaml\u0027 import appears after Django imports when it should be positioned before them (stdlib -\u003e third-party -\u003e Django -\u003e local)\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Minor code style inconsistency that violates standard Python import ordering convention. Ruff I-rules should catch this in future runs\n\n**Suggestion**:\nMove \u0027import yaml\u0027 to appear after \u0027import logging\u0027 and before \u0027from django.core...\u0027 imports. Let ruff I-rules handle ordering automatically","commit_id":"4b502b880a85c258ed1a9b0b2c9a938b5f818db7"}],"watcher_dashboard/content/audits/forms.py":[{"robot_id":"zuul","robot_run_id":"0e60a7ed8e19449a8bde7fca1ef4053e","url":"https://zuul.teim.app/t/main/buildset/0e60a7ed8e19449a8bde7fca1ef4053e","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":"f871fec5625d4b699d1613144116245de5662bc8","patch_set":4,"id":"2f1b24ce_4ac0621b","line":34,"updated":"2026-03-30 13:38:16.000000000","message":"ruff-format inadvertently merged two implicit string concatenation segments, dropping a space between \u0027cron\u0027 and \u0027format\u0027 in the interval field help_text. The original was two string literals: \u0027Interval in seconds or cron\u0027 and \u0027format for CONTINUOUS audit\u0027. The formatted output joined them as \u0027cronformat\u0027 (no space).\n\n**Severity**: HIGH | **Confidence**: 1.0\n\n**Risk**: User-visible typo in the audit creation form help text. Operators will see \u0027cronformat\u0027 instead of \u0027cron format\u0027, which is confusing and unprofessional in a production UI.\n\n**Priority**: Before merge\n**Why This Matters**: This is not a formatting change -- it is a semantic regression in a user-facing string. The help text is displayed in the Horizon dashboard when creating audits.\n\n**Recommendation**:\nRestore the missing space. Replace \u0027cronformat\u0027 with \u0027cron format\u0027. Consider using a parenthesised string to prevent ruff-format from collapsing implicit concatenation in the future: help_text\u003d_(\"Interval in seconds or cron format for CONTINUOUS audit\")","commit_id":"0570f6ad113f264425c598e157831640d9357cf5"}],"watcher_dashboard/test/local_fixtures/fixtures.py":[{"robot_id":"zuul","robot_run_id":"0e60a7ed8e19449a8bde7fca1ef4053e","url":"https://zuul.teim.app/t/main/buildset/0e60a7ed8e19449a8bde7fca1ef4053e","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":"f871fec5625d4b699d1613144116245de5662bc8","patch_set":4,"id":"99e6a745_98a4ef69","line":52,"updated":"2026-03-30 13:38:16.000000000","message":"The ConfigMemoizedCache fixture in fixtures.py catches ImportError silently when watcher_dashboard.config does not exist. Since config.py is explicitly documented as not yet existing, the ImportError catch is always triggered, making the mixin a no-op in the current codebase.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Making the placeholder nature of the fixture explicit in the docstring or adding a log message would prevent confusion for contributors who add this mixin expecting it to actually clear caches.\n\n**Recommendation**:\nConsider adding a brief note in the docstring that the fixture is a placeholder until config.py is created. Alternatively, emit a debug log when ImportError is caught.","commit_id":"0570f6ad113f264425c598e157831640d9357cf5"},{"robot_id":"zuul","robot_run_id":"042564e4741741a392dcb2798ed419f8","url":"https://zuul.teim.app/t/main/buildset/042564e4741741a392dcb2798ed419f8","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":"741695410bf28ff44200e736b717395fdb75c0b1","patch_set":5,"id":"d1fbc495_038dbe1d","line":41,"updated":"2026-03-30 14:41:09.000000000","message":"The ConfigMemoizedCache fixture in fixtures.py references @functools.lru_cache and calls cache_clear(), but the code-conventions-and-testing.rst documents it using @horizon.utils.memoized.memoized with invalidate_all(). These are incompatible caching mechanisms.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If config.py uses @memoized.memoized as documented, the fixture\u0027s lru_cache-based cache_clear() approach will not work correctly.\n\n**Suggestion**:\nAlign the fixture implementation with the documented pattern. Either update the fixture to use horizon.utils.memoized.memoized.invalidate_all() as documented in code-conventions-and-testing.rst, or update the documentation to reflect the lru_cache approach used in the actual fixture. Pick one canonical approach and be consistent.","commit_id":"13d1bd2278d1c750f352723bcccb8f1e0de97def"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"076b0d3bc61f7d928224324bbc40a8959353476d","patch_set":6,"id":"0e045080_ada4eea2","line":1,"updated":"2026-04-04 01:08:42.000000000","message":"The new file watcher_dashboard/test/local_fixtures/fixtures.py introduces a ConfigMemoizedCache mixin but it does not appear to be used anywhere in this patch or the existing codebase.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Clarifies the purpose of the new file and avoids dead code in the repository.\n\n**Recommendation**:\nIf this mixin is intended for a follow-up patch, add a comment or docstring note indicating that. If it was added in error, remove it from this change.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"3d1576b5dcc85aa417be748c9fb8d127fc73e816","patch_set":6,"id":"11f58e19_baa9e830","line":1,"updated":"2026-04-04 01:08:02.000000000","message":"The new file watcher_dashboard/test/local_fixtures/fixtures.py introduces a ConfigMemoizedCache mixin but it does not appear to be used anywhere in this patch or the existing codebase.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Clarifies the purpose of the new file and avoids dead code in the repository.\n\n**Recommendation**:\nIf this mixin is intended for a follow-up patch, add a comment or docstring note indicating that. If it was added in error, remove it from this change.","commit_id":"2442c365140114098fdc30a377529105014ec973"},{"robot_id":"zuul","robot_run_id":"aa6fec3b55dc4cdca8c5e722729b29ad","url":"https://zuul.teim.app/t/main/buildset/aa6fec3b55dc4cdca8c5e722729b29ad","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":"a666c9dd3fc44c9bd6c61459b4ce65bff8aa56f5","patch_set":6,"id":"f73f382a_dab42c58","line":1,"updated":"2026-04-04 01:09:32.000000000","message":"The new file watcher_dashboard/test/local_fixtures/fixtures.py introduces a ConfigMemoizedCache mixin but it does not appear to be used anywhere in this patch or the existing codebase.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Clarifies the purpose of the new file and avoids dead code in the repository.\n\n**Recommendation**:\nIf this mixin is intended for a follow-up patch, add a comment or docstring note indicating that. If it was added in error, remove it from this change.","commit_id":"2442c365140114098fdc30a377529105014ec973"}],"watcher_dashboard/test/unit/api_tests/test_client.py":[{"robot_id":"zuul","robot_run_id":"0e60a7ed8e19449a8bde7fca1ef4053e","url":"https://zuul.teim.app/t/main/buildset/0e60a7ed8e19449a8bde7fca1ef4053e","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":"f871fec5625d4b699d1613144116245de5662bc8","patch_set":4,"id":"799f7cd3_bdce86b7","line":23,"updated":"2026-03-30 13:38:16.000000000","message":"The first test in test_client.py has an unused stub_watcherclient() call (line 24-25) that does nothing because the test then immediately replaces watcherclient via mock.patch.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Removing dead code improves test readability and prevents confusion about which mock is actually being used.\n\n**Recommendation**:\nRemove the unused watcherclient \u003d self.stub_watcherclient() and watcherclient.audit.create \u003d mock.Mock(return_value\u003d{}) lines from the first test method (lines 24-25), since the test uses mock.patch to replace watcherclient entirely.","commit_id":"0570f6ad113f264425c598e157831640d9357cf5"},{"robot_id":"zuul","robot_run_id":"0e60a7ed8e19449a8bde7fca1ef4053e","url":"https://zuul.teim.app/t/main/buildset/0e60a7ed8e19449a8bde7fca1ef4053e","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":"f871fec5625d4b699d1613144116245de5662bc8","patch_set":4,"id":"c2e71503_ab4fc8bc","line":26,"updated":"2026-03-30 13:38:16.000000000","message":"The new test file watcher_dashboard/test/unit/api_tests/test_client.py uses mock.patch without autospec\u003dTrue in two test methods, violating the project\u0027s H210 rule and the documented requirement in code-conventions-and-testing.rst.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Without autospec, the mock accepts any call signature, so refactoring mistakes in the watched function\u0027s signature will not be caught by tests.\n\n**Suggestion**:\nAdd autospec\u003dTrue to both mock.patch calls: with mock.patch(\u0027watcher_dashboard.api.watcher.watcherclient\u0027, autospec\u003dTrue) as wc: Note that this may require adjusting the mock setup since autospec mirrors the real function\u0027s signature.","commit_id":"0570f6ad113f264425c598e157831640d9357cf5"},{"robot_id":"zuul","robot_run_id":"042564e4741741a392dcb2798ed419f8","url":"https://zuul.teim.app/t/main/buildset/042564e4741741a392dcb2798ed419f8","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":"741695410bf28ff44200e736b717395fdb75c0b1","patch_set":5,"id":"bc2c7584_23e6e333","line":22,"updated":"2026-03-30 14:41:09.000000000","message":"The new unit test file watcher_dashboard/test/unit/api_tests/test_client.py duplicates the WatcherClientAPITests class name already present in watcher_dashboard/test/api_tests/test_client.py, which could cause confusion.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Unique class names prevent confusion when reading test output and debugging test failures.\n\n**Recommendation**:\nConsider renaming the class in the new file to differentiate it, for example UnitWatcherClientAPITests, to avoid ambiguity with the existing WatcherClientAPITests in test/api_tests/test_client.py.","commit_id":"13d1bd2278d1c750f352723bcccb8f1e0de97def"},{"robot_id":"zuul","robot_run_id":"042564e4741741a392dcb2798ed419f8","url":"https://zuul.teim.app/t/main/buildset/042564e4741741a392dcb2798ed419f8","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":"741695410bf28ff44200e736b717395fdb75c0b1","patch_set":5,"id":"8330d8fa_2b206c3e","line":27,"updated":"2026-03-30 14:41:09.000000000","message":"New test file watcher_dashboard/test/unit/api_tests/test_client.py uses mock.patch without autospec\u003dTrue on both test methods. The project-specific guidelines (H210) require autospec\u003dTrue on all new @mock.patch decorators.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: Mock accepts any call signature, so refactoring mistakes in the real watcherclient function could go undetected in tests.\n\n**Priority**: Before merge\n**Why This Matters**: This is a new test file being introduced in this patch. The project\u0027s own code-conventions-and-testing.rst explicitly mandates autospec\u003dTrue for all new mock.patch decorators (H210). Existing tests are grandfathered, but new code must follow the rule.\n\n**Recommendation**:\nAdd autospec\u003dTrue to both mock.patch decorators in this file. For example: `mock.patch(\u0027watcher_dashboard.api.watcher.watcherclient\u0027, autospec\u003dTrue) as wc:`. Note that when using autospec\u003dTrue, the return value of the mocked function may need adjustment since the mock will mirror the real signature.","commit_id":"13d1bd2278d1c750f352723bcccb8f1e0de97def"}]}
