)]}'
{"HACKING.rst":[{"robot_id":"zuul","robot_run_id":"ad2c5aab9660470986e06b0b987b880e","url":"https://zuul.teim.app/t/main/buildset/ad2c5aab9660470986e06b0b987b880e","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":"15dc745f1bdbff89a5679892749e49da00b5779b","patch_set":1,"id":"ae25101a_ec2cedec","line":20,"updated":"2026-02-27 16:55:29.000000000","message":"HACKING.rst introduces WD001-WD009 rules but lacks a quick-reference table linking each rule to its documentation. Contributors must scan multiple sections.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Improved discoverability and faster navigation for contributors seeking specific rule guidance\n\n**Recommendation**:\nAdd table at HACKING.rst beginning with columns: Rule ID, Brief Description, Documentation Reference.","commit_id":"718ae63fb876e81b1bd0edc64120515f700d0d14"},{"robot_id":"zuul","robot_run_id":"ad2c5aab9660470986e06b0b987b880e","url":"https://zuul.teim.app/t/main/buildset/ad2c5aab9660470986e06b0b987b880e","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":"15dc745f1bdbff89a5679892749e49da00b5779b","patch_set":1,"id":"b3c36a93_364c42a2","line":47,"updated":"2026-02-27 16:55:29.000000000","message":"New WD008 and WD009 rules lack rationale sections explaining why these patterns are important. Future contributors may not understand architectural reasoning.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Preserved institutional memory and better adherence when rationale is understood\n\n**Recommendation**:\nAdd \u0027Rationale\u0027 subsection to each rule explaining historical context or architectural principles.","commit_id":"718ae63fb876e81b1bd0edc64120515f700d0d14"},{"robot_id":"zuul","robot_run_id":"ad2c5aab9660470986e06b0b987b880e","url":"https://zuul.teim.app/t/main/buildset/ad2c5aab9660470986e06b0b987b880e","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":"15dc745f1bdbff89a5679892749e49da00b5779b","patch_set":1,"id":"d492b970_e597b8af","line":195,"updated":"2026-02-27 16:55:29.000000000","message":"HACKING.rst:195 references `doc/source/contributor/contributing.rst` but the actual file created is `index.rst`. This broken cross-reference will cause documentation build failures.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Broken documentation link prevents readers from accessing contributor guidelines\n\n**Suggestion**:\nVerify the intended target. Update reference to `contributor/index.rst` if index.rst is the landing page, or ensure contributing.rst exists.","commit_id":"718ae63fb876e81b1bd0edc64120515f700d0d14"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"088aada6_2748a275","line":1,"updated":"2026-03-30 16:49:05.000000000","message":"HACKING.rst removes the links to the Gerrit review site and GitHub clone URL from the original Contributing section. The general contribution links are now orphaned with no obvious pointer to the contributing.rst page.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Preserves useful contributor onboarding information that was previously accessible from the top-level HACKING.rst file.\n\n**Recommendation**:\nAdd a brief \u0027Contributing\u0027 section at the bottom of HACKING.rst pointing to doc/source/contributor/contributing.rst and the upstream Gerrit workflow documentation.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"0553f710_2a53493d","line":164,"updated":"2026-03-30 16:49:05.000000000","message":"WD009 \u0027GOOD\u0027 example in HACKING.rst line 164 shows \u0027api.watcher.Audit.list(request)\u0027 as the recommended pattern, but per WD001 the recommended pattern should be a service-layer function call like \u0027api.watcher.audit_list(request)\u0027. The same issue exists in code-conventions-and-testing.rst line 145.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: WD009 and WD001 give contradictory guidance on calling convention. Contributors following WD009 will use class methods; those following WD001 will use service functions.\n\n**Suggestion**:\nUpdate the WD009 GOOD example in HACKING.rst to show a service-layer function call (e.g. \u0027api.watcher.audit_list(request)\u0027) and add a note clarifying that service-layer functions are the preferred entry point per WD001.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c51792e4ce2249708063aaefba32f221","url":"https://zuul.teim.app/t/main/buildset/c51792e4ce2249708063aaefba32f221","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":"d2d77ddfeb8276d79bb9efdd2a4cdbae5a807415","patch_set":5,"id":"ee7b556d_7c0b0925","line":12,"updated":"2026-04-04 02:50:25.000000000","message":"HACKING.rst contains inline URL references exceeding 79 characters (line 12: 96 chars, line 200: 109 chars). RST allows wrapping long URLs, and sphinx-build with -W may flag these.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Ensures HACKING.rst passes strict RST linting and is readable in terminal-width editors.\n\n**Recommendation**:\nUse RST reference syntax with separate target definitions, or break the URL into a named reference using an anchor at the bottom of the file.","commit_id":"7e53878165446f1f6cddec313f73b84ba0308457"}],"doc/source/contributor/code-conventions-and-testing.rst":[{"robot_id":"zuul","robot_run_id":"ad2c5aab9660470986e06b0b987b880e","url":"https://zuul.teim.app/t/main/buildset/ad2c5aab9660470986e06b0b987b880e","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":"15dc745f1bdbff89a5679892749e49da00b5779b","patch_set":1,"id":"c6465f23_db76efe8","line":1,"updated":"2026-02-27 16:55:29.000000000","message":"code-conventions-and-testing.rst could be enhanced with before/after code snippets showing common mistakes for WD008 and WD009 specifically.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Concrete examples reinforce learning and reduce common mistakes\n\n**Recommendation**:\nAdd subsections for WD008/WD009 with before/after examples showing logging and import patterns.","commit_id":"718ae63fb876e81b1bd0edc64120515f700d0d14"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"48220e54_c08b4da7","line":96,"updated":"2026-02-27 17:28:52.000000000","message":"The import convention documentation correctly shows the four-group import ordering (stdlib, third-party, OpenStack, project-local) which matches the actual code in api/watcher.py.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Clear import ordering guidance improves code consistency across the project\n\n**Recommendation**:\nConsider adding an example of how ruff\u0027s E4 rules enforce this automatically.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"7f80b9ae_0d28562d","line":172,"updated":"2026-02-27 17:28:52.000000000","message":"Documentation states line length is 79 characters per E501, but pyproject.toml shows ruff configured for line-length \u003d 79. The documentation should clarify that ruff enforces this automatically.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Minor inconsistency between documentation wording and actual enforcement mechanism\n\n**Suggestion**:\nUpdate the line length section to mention that ruff enforces the 79-character limit via pre-commit hooks, aligning with the project\u0027s use of ruff for formatting.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"78d2ebb6_8e9b2eb0","line":314,"updated":"2026-02-27 17:28:52.000000000","message":"The logging level guidance correctly distinguishes between LOG.info() for expected errors and LOG.exception() for unexpected ones, which matches actual usage in forms.py:224 and views.py:162.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Proper logging level guidance helps avoid noisy tracebacks for expected error conditions\n\n**Recommendation**:\nConsider adding a note about when to use LOG.debug() versus LOG.info() for even finer-grained control.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"1bc4004f_7098ac87","line":379,"updated":"2026-02-27 17:28:52.000000000","message":"The documentation for getattr with inline comments explaining API version additions is excellent and matches actual usage in api/watcher.py.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Clear documentation of reflection pattern with justification comments improves code maintainability\n\n**Recommendation**:\nNo change needed - this is well-documented and matches the actual implementation.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"fe73ed6e_4f4f7f40","line":502,"updated":"2026-02-27 17:28:52.000000000","message":"The testing structure documentation accurately describes the APITestBase class and its watcherclient stub pattern, which matches the actual implementation in test/helpers.py:37-53.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Accurate testing documentation helps contributors write effective unit tests\n\n**Recommendation**:\nConsider adding an example test case showing the full pattern from the test/api_tests/test_watcher.py file.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"ad7f8078287a4925a9eab2196326124e","url":"https://zuul.teim.app/t/main/buildset/ad7f8078287a4925a9eab2196326124e","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":"52712b7abd03ce640e6affa6387c4f4049fe1075","patch_set":3,"id":"1b1912aa_e65e64a3","line":89,"updated":"2026-02-28 12:35:23.000000000","message":"The code-conventions document mentions line length enforcement via \u0027tox -e pep8\u0027 but does not explicitly mention the ruff configuration (E501) that actually enforces the 79-character limit in this project.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Contributors may not understand the actual enforcement mechanism since this project uses ruff rather than the traditional flake8+pep8 toolchain. They may run tox without understanding what tool is checking line length.\n\n**Suggestion**:\nUpdate the line length section to explicitly mention \u0027ruff check --select\u003dE501\u0027 or note that ruff enforces the line length limit as configured in pyproject.toml. This aligns with the project\u0027s migration to ruff documented in recent commits.","commit_id":"7bbce7c4446dcd4df6aa57ded4763a44d808d1a2"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"ccaaaff3_83ad0051","line":555,"updated":"2026-03-30 16:49:05.000000000","message":"code-conventions-and-testing.rst test example at line 555 asserts \u0027self.watcherclient.audit.list.assert_called_once_with()\u0027 with no arguments, but the actual Audit.list() classmethod passes \u0027detail\u003dTrue\u0027 to the client (api/watcher.py line 171). The assertion would fail in practice.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: Contributors who copy this test pattern will write failing tests, or will add \u0027detail\u003dTrue\u0027 to the mock and hide a real assertion problem.\n\n**Priority**: Before merge\n**Why This Matters**: A test example that would fail when run against the actual codebase teaches incorrect testing patterns and could cause CI failures.\n\n**Recommendation**:\nUpdate the assertion to include the \u0027detail\u003dTrue\u0027 argument: \u0027self.watcherclient.audit.list.assert_called_once_with(detail\u003dTrue)\u0027. Consider updating the example to call the service function watcher.audit_list instead of the class method directly.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c51792e4ce2249708063aaefba32f221","url":"https://zuul.teim.app/t/main/buildset/c51792e4ce2249708063aaefba32f221","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":"d2d77ddfeb8276d79bb9efdd2a4cdbae5a807415","patch_set":5,"id":"048ef523_0959fb34","line":105,"updated":"2026-04-04 02:50:25.000000000","message":"RST files have lines exceeding 79 characters in code-block examples. While code-block content is typically not linted for line length, several code-block examples contain lines of 80-90+ chars that contributors may copy into production code where the 79-char limit is enforced.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Maintaining the 79-char limit in documentation code examples ensures that copy-pasted code passes tox -e pep8 without modification.\n\n**Recommendation**:\nReview code-block examples for lines exceeding 79 characters and wrap them to fit, particularly the docstring example at line 753 (83 chars), the logging example at line 381 (81 chars), and the reflection example at line 356 (81 chars).","commit_id":"7e53878165446f1f6cddec313f73b84ba0308457"},{"robot_id":"zuul","robot_run_id":"c51792e4ce2249708063aaefba32f221","url":"https://zuul.teim.app/t/main/buildset/c51792e4ce2249708063aaefba32f221","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":"d2d77ddfeb8276d79bb9efdd2a4cdbae5a807415","patch_set":5,"id":"d88d6798_8e517aa3","line":574,"updated":"2026-04-04 02:50:25.000000000","message":"assertEqual examples in code-conventions-and-testing.rst place actual before expected (e.g. assertEqual(result.uuid, new_audit.uuid)), contradicting the doc\u0027s own assertion style section which states expected value should be first.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: The doc explicitly teaches the (expected, actual) convention but the test examples violate it. Contributors copying these templates will produce code that fails the project\u0027s own review checklist.\n\n**Suggestion**:\nSwap the argument order: self.assertEqual(new_audit.uuid, result.uuid) and self.assertEqual(audits, result). This makes the examples consistent with the documented convention.","commit_id":"7e53878165446f1f6cddec313f73b84ba0308457"}],"doc/source/contributor/forms-and-validation.rst":[{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"138c3cce_71f3f2b0","line":164,"updated":"2026-02-27 17:28:52.000000000","message":"The YamlValidator documentation in forms-and-validation.rst correctly emphasizes using yaml.safe_load over yaml.load for security. This is excellent security guidance.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Proper security guidance prevents potential code execution vulnerabilities\n\n**Recommendation**:\nConsider adding a cross-reference to this security note from the service-layer-pattern document when discussing form validation patterns.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"ec0d8bf5_1353bc94","line":290,"updated":"2026-02-27 17:28:52.000000000","message":"The exception handling pattern documentation correctly shows using horizon.exceptions.handle() with redirect parameter, which matches actual usage in forms.py:226.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Consistent exception handling pattern improves user experience and debugging\n\n**Recommendation**:\nConsider documenting the difference between exceptions.handle() with and without the redirect parameter.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"ad7f8078287a4925a9eab2196326124e","url":"https://zuul.teim.app/t/main/buildset/ad7f8078287a4925a9eab2196326124e","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":"52712b7abd03ce640e6affa6387c4f4049fe1075","patch_set":3,"id":"84937463_5afdc0bc","line":340,"updated":"2026-02-28 12:35:23.000000000","message":"Cross-references between related patterns across different documents could be more explicit. For example, the relationship between form validation and service layer error handling is covered in separate documents without clear linkage.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: More explicit cross-references would help contributors understand the interconnected nature of these patterns and navigate the documentation more effectively when working on features that span multiple UI layers.\n\n**Recommendation**:\nAdd \u0027See also\u0027 references at the end of major sections linking to related patterns. For example, in the form validation section, add \u0027See also: Service Layer Error Handling (service-layer-pattern.rst#errors)\u0027 to connect validation exceptions with service error propagation patterns.","commit_id":"7bbce7c4446dcd4df6aa57ded4763a44d808d1a2"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"96c2201c_e89532ae","line":23,"updated":"2026-03-30 16:49:05.000000000","message":"The forms-and-validation.rst and tables-and-actions.rst docs reference Horizon classes without showing the required import statements. Adding a brief \u0027Required Imports\u0027 subsection would help new contributors get started faster.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Makes it immediately clear which modules need to be imported for the documented patterns, reducing trial-and-error for new contributors.\n\n**Recommendation**:\nAdd a brief \u0027Required Imports\u0027 subsection at the top of each document showing the exact import statements needed, similar to the file structure example in code-conventions-and-testing.rst.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"61c2a944_1a91bab4","line":80,"updated":"2026-03-30 16:49:05.000000000","message":"forms-and-validation.rst lines 80-98 show a \u0027_get_audit_template_list\u0027 helper that calls \u0027watcher.AuditTemplate.list()\u0027 directly and manually builds choices, but the actual codebase uses \u0027watcher.get_audit_template_choices()\u0027 -- a service-layer function that already returns pre-built choices.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Contributors may copy this lower-level pattern instead of using the existing service function, leading to duplicated choice-building logic and direct API calls from form code.\n\n**Suggestion**:\nUpdate the code example to call the actual service function: \u0027choices \u003d api.watcher.get_audit_template_choices(self.request)\u0027. Wrap the service function call in the exception-handling pattern to demonstrate proper error handling.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c51792e4ce2249708063aaefba32f221","url":"https://zuul.teim.app/t/main/buildset/c51792e4ce2249708063aaefba32f221","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":"d2d77ddfeb8276d79bb9efdd2a4cdbae5a807415","patch_set":5,"id":"19079bd1_3cdaf966","line":293,"updated":"2026-04-04 02:50:25.000000000","message":"forms-and-validation.rst shows watcher.Audit.create(request, **params) directly in the handle() code-block example (line 297), which is the pattern that WD002 prohibits. While the doc section is about exception handling rather than the service layer, the example could confuse contributors.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Clarity for contributors about what patterns are acceptable in production code.\n\n**Recommendation**:\nAdd a brief note above or below the code block explaining this example uses the class method directly for illustration, and that in production code per WD002 the call should go through a service function.","commit_id":"7e53878165446f1f6cddec313f73b84ba0308457"}],"doc/source/contributor/microversions.rst":[{"robot_id":"zuul","robot_run_id":"ad2c5aab9660470986e06b0b987b880e","url":"https://zuul.teim.app/t/main/buildset/ad2c5aab9660470986e06b0b987b880e","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":"15dc745f1bdbff89a5679892749e49da00b5779b","patch_set":1,"id":"40628a80_67c8aa47","line":37,"updated":"2026-02-27 16:55:29.000000000","message":"microversions.rst:37 contains a temporal note stating \u0027Versions 1.2-1.6 are not yet used\u0027. This will become stale when implemented, requiring manual updates.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Stale documentation could mislead contributors about version support status\n\n**Suggestion**:\nConsider adding Sphinx conditional directive or rephrase to indicate which versions are documented vs implemented.","commit_id":"718ae63fb876e81b1bd0edc64120515f700d0d14"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"303f08fd_c08347da","line":148,"updated":"2026-02-27 17:28:52.000000000","message":"In microversions.rst, the API microversion history table mentions version 1.6 added features in \u00272025.2 Flamingo maximum\u0027 - this date appears to be in the future from the current date (2026-02-27) which may cause confusion.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Future date reference may confuse readers about the current state of API support\n\n**Suggestion**:\nVerify the 1.6 release timing and either update the wording to reflect the actual release status or add clarification about the release schedule.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"9b1982da_95d4f98a","line":178,"updated":"2026-02-27 17:28:52.000000000","message":"The microversion implementation recipe is thorough and correctly describes the actual implementation in common/client.py and api/watcher.py.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Step-by-step recipe makes microversion additions straightforward for contributors\n\n**Recommendation**:\nConsider adding a reference to the test helpers in test/helpers.py that show how to mock microversioned API calls.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"ad7f8078287a4925a9eab2196326124e","url":"https://zuul.teim.app/t/main/buildset/ad7f8078287a4925a9eab2196326124e","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":"52712b7abd03ce640e6affa6387c4f4049fe1075","patch_set":3,"id":"e67ec4fd_46cbb1c8","line":250,"updated":"2026-02-28 12:35:23.000000000","message":"The microversions.rst document provides a comprehensive implementation recipe but could benefit from a troubleshooting section addressing common issues contributors encounter when adding new microversion support.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: A troubleshooting section would reduce review cycles by helping contributors self-diagnose and fix common microversion implementation issues before submitting patches.\n\n**Recommendation**:\nConsider adding a \u0027Common Issues and Solutions\u0027 section covering: 1) microversion negotiation header formatting errors, 2) incorrect method version bounds, 3) missing version class registration, 4) testing issues with fake_microversion fixtures, and 5) documentation sync requirements.","commit_id":"7bbce7c4446dcd4df6aa57ded4763a44d808d1a2"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"12059f7b_fd4ff087","line":233,"updated":"2026-03-30 16:49:05.000000000","message":"microversions.rst line 233 and code-conventions-and-testing.rst lines 538, 748 reference \u0027test/api_tests/\u0027 but the actual path is \u0027test/unit/api_tests/\u0027. The Target Layout section has the correct path but other references are inconsistent.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Contributors looking for test files at the documented path will not find them. The internal inconsistency in code-conventions-and-testing.rst between the Target Layout (correct) and the checklist (incorrect) is especially confusing.\n\n**Suggestion**:\nUpdate microversions.rst line 233 to \u0027watcher_dashboard/test/unit/api_tests/\u0027 and update code-conventions-and-testing.rst lines 538 and 748 to match the correct path from the Target Layout section.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"fbe05ed5_f8f28929","line":236,"updated":"2026-03-30 16:49:05.000000000","message":"microversions.rst Step 6 code example at line 236 uses \u0027mock.patch(...)\u0027 without \u0027autospec\u003dTrue\u0027, which contradicts the project\u0027s own H210 rule documented in code-conventions-and-testing.rst.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Maintains consistency across all documentation examples regarding mock best practices.\n\n**Recommendation**:\nAdd \u0027autospec\u003dTrue\u0027 to the mock.patch decorator in the Step 6 example.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c51792e4ce2249708063aaefba32f221","url":"https://zuul.teim.app/t/main/buildset/c51792e4ce2249708063aaefba32f221","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":"d2d77ddfeb8276d79bb9efdd2a4cdbae5a807415","patch_set":5,"id":"92f2458b_dba1335b","line":236,"updated":"2026-04-04 02:50:25.000000000","message":"microversions.rst Step 6 test example uses @mock.patch without autospec\u003dTrue, contradicting the project rule (H210/WD008) documented in code-conventions-and-testing.rst which states any @mock.patch decorator in new test code must include autospec\u003dTrue.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Contributors copying this test template will produce code that violates H210. Since this doc is meant to be authoritative, the inconsistency could propagate into real patches.\n\n**Suggestion**:\nAdd autospec\u003dTrue to the mock.patch decorator: @mock.patch(\u0027watcher_dashboard.api.watcher.watcherclient\u0027, autospec\u003dTrue)","commit_id":"7e53878165446f1f6cddec313f73b84ba0308457"}],"doc/source/contributor/service-layer-pattern.rst":[{"robot_id":"zuul","robot_run_id":"ad2c5aab9660470986e06b0b987b880e","url":"https://zuul.teim.app/t/main/buildset/ad2c5aab9660470986e06b0b987b880e","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":"15dc745f1bdbff89a5679892749e49da00b5779b","patch_set":1,"id":"66e4089b_e95a3145","line":1,"updated":"2026-02-27 16:55:29.000000000","message":"service-layer-pattern.rst provides excellent textual descriptions but would benefit from visual diagrams showing data flow between components.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Enhanced comprehension for visual learners and faster onboarding\n\n**Recommendation**:\nAdd Sphinx graphviz or PlantUML diagrams showing prohibited vs correct service-layer patterns.","commit_id":"718ae63fb876e81b1bd0edc64120515f700d0d14"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"d1fe4c60_df83a3fa","line":140,"updated":"2026-02-27 17:28:52.000000000","message":"The documentation correctly identifies that the existing codebase contains anti-patterns (e.g., direct API calls in table actions at tables.py:68-70, forms.py:132-137). This honest assessment helps contributors understand the current state.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Clear identification of existing technical debt helps prioritize refactoring work\n\n**Recommendation**:\nConsider adding a tracking section or TODO list for migrating these specific anti-patterns to the service layer pattern.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"67212147_1f42e6ef","line":148,"updated":"2026-02-27 17:28:52.000000000","message":"The Anti-Pattern Gallery in service-layer-pattern.rst references specific file paths like \u0027watcher_dashboard/content/audits/views.py\u0027 but these should use the relative path format consistent with other documentation.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Minor inconsistency in path reference format\n\n**Suggestion**:\nStandardize path references throughout documentation to use consistent format (either always relative from project root or always from a clear base).","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"ad7f8078287a4925a9eab2196326124e","url":"https://zuul.teim.app/t/main/buildset/ad7f8078287a4925a9eab2196326124e","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":"52712b7abd03ce640e6affa6387c4f4049fe1075","patch_set":3,"id":"ef1e9950_d6037f07","line":120,"updated":"2026-02-28 12:35:23.000000000","message":"Anti-pattern examples in service-layer-pattern.rst show direct API client usage inside forms/actions but don\u0027t clearly indicate if these are hypothetical examples or patterns found in legacy code. This could confuse new contributors about whether such patterns exist in the current codebase.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: New contributors may be unsure whether these anti-patterns are hypothetical or represent actual legacy code that needs cleanup, potentially leading to unnecessary code searches or confusion.\n\n**Suggestion**:\nAdd explicit language to anti-pattern examples indicating they are hypothetical illustrations of what NOT to do, or if based on real patterns, add references to the legacy code locations. Consider adding a note like \u0027The following example illustrates a prohibited pattern\u0027 before each anti-pattern code block.","commit_id":"7bbce7c4446dcd4df6aa57ded4763a44d808d1a2"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"784050bd_ab9be99d","line":86,"updated":"2026-03-30 16:49:05.000000000","message":"The directory structure diagram (line 86) and layer responsibilities section (line 98) in service-layer-pattern.rst reference \u0027api/client.py\u0027 as the API client location, but the actual file lives at \u0027common/client.py\u0027. The microversions.rst file correctly references \u0027common/client.py\u0027 at line 41.\n\n**Severity**: HIGH | **Confidence**: 1.0\n\n**Risk**: New contributors will look for the client code in the wrong location. The inconsistency with microversions.rst (which has the correct path) makes this more confusing.\n\n**Priority**: Before merge\n**Why This Matters**: Incorrect file paths in documentation undermine its authority and cause wasted time for new contributors trying to follow the patterns.\n\n**Recommendation**:\nChange the directory structure diagram to show \u0027common/client.py\u0027 under a \u0027common/\u0027 directory, and update the layer responsibilities section to reference \u0027common/client.py\u0027 instead of \u0027api/client.py\u0027. Align with the microversions.rst reference.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"d857f28f_da9669ac","line":351,"updated":"2026-03-30 16:49:05.000000000","message":"service-layer-pattern.rst \u0027Refactoring Reference\u0027 section (lines 351-427) substantially duplicates the \u0027Anti-Pattern Gallery\u0027 Pattern 1 (Fat View, lines 146-207). Both sections show the same Fat View anti-pattern and recommended fix with only minor wording differences.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Duplicate content wastes reader time and creates a maintenance burden. When one copy is updated, the other may be forgotten, leading to divergent information.\n\n**Suggestion**:\nRemove the \u0027Refactoring Reference\u0027 section entirely and add a cross-reference from the Anti-Pattern Gallery to the Decision Framework table instead. Alternatively, replace the duplicated code with a brief summary pointing back to the Anti-Pattern Gallery.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"ab085af7_294cdd15","line":393,"updated":"2026-03-30 16:49:05.000000000","message":"service-layer-pattern.rst recommended examples use direct class method calls (watcher.Audit.list) instead of service functions (audit_list). tables-and-actions.rst has the same issue at lines 395 and 429.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: New contributors following these examples will write code that contradicts the service-layer pattern the rest of the documentation establishes.\n\n**Priority**: Before merge\n**Why This Matters**: The documentation presents itself as the authoritative reference for the service-layer pattern. If the recommended code examples show direct class method calls rather than service functions, contributors will copy those patterns and introduce code that violates WD001-WD003.\n\n**Recommendation**:\nUpdate the recommended code examples to use the actual service-layer functions. For example, change \u0027watcher.Audit.list(self.request, **self.get_filters())\u0027 to \u0027watcher.audit_list(self.request, **self.get_filters())\u0027 and \u0027watcher.Audit.get(self.request, audit_uuid)\u0027 to \u0027watcher.audit_get(self.request, audit_uuid)\u0027. Similarly update the Refactoring Reference to use \u0027common_client.get_client(request)\u0027 and service functions instead of \u0027api_base.get_watcher_client(request)\u0027.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c2492cc24ad24b83b8806170756731b0","url":"https://zuul.teim.app/t/main/buildset/c2492cc24ad24b83b8806170756731b0","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":"54eaccff8636155cff07824c0d994b28cf0a1e34","patch_set":4,"id":"c2642d38_78547d84","line":400,"updated":"2026-03-30 16:49:05.000000000","message":"The service-layer-pattern.rst uses \u0027api_base.get_watcher_client(request)\u0027 in the Refactoring Reference (line 400) but \u0027api_base\u0027 is not a module in this project. The correct reference would be \u0027common_client\u0027 as used in api/watcher.py.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Prevents confusion for contributors trying to understand the actual codebase module structure.\n\n**Recommendation**:\nChange \u0027api_base.get_watcher_client(request)\u0027 to \u0027common_client.get_client(request)\u0027 to match the actual import alias used in api/watcher.py.","commit_id":"cc03108ea909a5de17382d1a74af9f0bd8ab3125"},{"robot_id":"zuul","robot_run_id":"c51792e4ce2249708063aaefba32f221","url":"https://zuul.teim.app/t/main/buildset/c51792e4ce2249708063aaefba32f221","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":"d2d77ddfeb8276d79bb9efdd2a4cdbae5a807415","patch_set":5,"id":"c1fd6fcc_7e23ef27","line":353,"updated":"2026-04-04 02:50:25.000000000","message":"service-layer-pattern.rst has a Refactoring Reference section (starting around line 353) that largely duplicates the content of the Anti-Pattern Gallery section (lines 142-351). Both sections show Fat View before/after examples with nearly identical code.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Removing the duplicated content makes the document more concise and easier to navigate.\n\n**Recommendation**:\nConsider merging the Anti-Pattern Gallery and Refactoring Reference into a single section, or replace the duplicated code in Refactoring Reference with a brief cross-reference to the Anti-Pattern Gallery.","commit_id":"7e53878165446f1f6cddec313f73b84ba0308457"},{"robot_id":"zuul","robot_run_id":"c51792e4ce2249708063aaefba32f221","url":"https://zuul.teim.app/t/main/buildset/c51792e4ce2249708063aaefba32f221","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":"d2d77ddfeb8276d79bb9efdd2a4cdbae5a807415","patch_set":5,"id":"213bcc4c_d91cb5a8","line":436,"updated":"2026-04-04 02:50:25.000000000","message":"The Decision Framework table in service-layer-pattern.rst uses plain-text grid syntax which may not render correctly in all RST/Sphinx configurations.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Ensures the table renders correctly in the built HTML documentation.\n\n**Recommendation**:\nVerify the table renders correctly with tox -e docs. If it does not render as a proper table, convert to list-table syntax as used in other docs in this patch.","commit_id":"7e53878165446f1f6cddec313f73b84ba0308457"}],"doc/source/contributor/tables-and-actions.rst":[{"robot_id":"zuul","robot_run_id":"8d3ea780a37b4606bdaea5a379e6da33","url":"https://zuul.teim.app/t/main/buildset/8d3ea780a37b4606bdaea5a379e6da33","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":"dc4b351d2214efdfa016fbb880a9f1e64748b97b","patch_set":2,"id":"be536ca3_71bc3f36","line":319,"updated":"2026-02-27 17:28:52.000000000","message":"The documentation shows example code in tables-and-actions.rst line 320 that still has direct API calls to watcher.ActionPlan.list() from within a table action\u0027s single() method, which contradicts WD003 stated earlier in the same document.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: The example in the \u0027Custom Action (single)\u0027 section shows direct API calls that should be delegated to the service layer per WD003\n\n**Suggestion**:\nUpdate the GoToActionPlan.single() example to delegate to a service function like api.watcher.get_action_plan_for_audit() instead of calling watcher.ActionPlan.list() directly, or add a note explaining this is an existing anti-pattern being documented.","commit_id":"66152a6e2da3e6af287d1f76a0895ec3cbec1be8"},{"robot_id":"zuul","robot_run_id":"ad7f8078287a4925a9eab2196326124e","url":"https://zuul.teim.app/t/main/buildset/ad7f8078287a4925a9eab2196326124e","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":"52712b7abd03ce640e6affa6387c4f4049fe1075","patch_set":3,"id":"3938244c_7f047fc2","line":285,"updated":"2026-02-28 12:35:23.000000000","message":"The tables-and-actions.rst documentation describes the allowed() method pattern for determining action visibility but does not explicitly address how to handle None datum values, which can occur in certain table states.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Contributors implementing table actions may encounter unexpected behavior when datum is None, leading to actions appearing/disappearing incorrectly in certain table states (e.g., empty tables, loading states).\n\n**Suggestion**:\nAdd explicit guidance on handling None datum in the allowed() method, such as \u0027def allowed(self, request, datum\u003dNone):\u0027 and explain the expected behavior when datum is None (typically: return False to hide action, or check request.user/project for permission-based visibility).","commit_id":"7bbce7c4446dcd4df6aa57ded4763a44d808d1a2"},{"robot_id":"zuul","robot_run_id":"c51792e4ce2249708063aaefba32f221","url":"https://zuul.teim.app/t/main/buildset/c51792e4ce2249708063aaefba32f221","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":"d2d77ddfeb8276d79bb9efdd2a4cdbae5a807415","patch_set":5,"id":"aeb1375d_ed9e46b5","line":271,"updated":"2026-04-04 02:50:25.000000000","message":"tables-and-actions.rst action-type examples (DeleteAction.delete, BatchAction.action, Custom Action.single) call watcher.Audit.delete/cancel and ActionPlan.list directly without noting these violate WD001/WD003 service-layer rules.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: These examples appear under the recommended action-type documentation sections, not the anti-pattern gallery. A contributor following these patterns would violate WD001 and WD003.\n\n**Suggestion**:\nEither replace watcher.Audit.delete(request, obj_id) with a service-layer call (e.g. api.watcher.archive_audit(request, obj_id)), or add an explicit note before each code block stating these are simplified examples and that WD001/WD003 require delegation to service functions. The DeleteAction and BatchAction examples at lines 271 and 298 are particularly misleading because they are presented as canonical patterns.","commit_id":"7e53878165446f1f6cddec313f73b84ba0308457"}]}
