)]}'
{"watcher/db/sqlalchemy/api.py":[{"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":"f2634f1771056d84ec7aa9e7a914aa97ef76a4f4","unresolved":false,"context_lines":[{"line_number":967,"context_line":"            )"},{"line_number":968,"context_line":"        except exception.ResourceNotFound:"},{"line_number":969,"context_line":"            raise exception.AuditPipelineNotFound("},{"line_number":970,"context_line":"                audit_pipeline\u003daudit_pipeline_id"},{"line_number":971,"context_line":"            )"},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"    def soft_delete_audit_pipeline(self, audit_pipeline_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"23e07963_1a70e208","line":970,"updated":"2026-07-10 20:41:00.000000000","message":"The AuditPipeline.soft_delete() object method calls self.dbapi.soft_delete_audit_pipeline(self.uuid), passing a UUID string. Inside the DB API method, this UUID is used directly as the filter value for the audit_pipeline_id column (Integer) when looking up stages to cascade soft-delete. A UUID st...\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: When a pipeline is soft-deleted through the object layer (the normal production path), its stages remain with deleted_at\u003dNULL while the parent pipeline is marked as deleted. This creates orphaned, apparently-active stage records. Queries for active stages will return stages belonging to a deleted...\n\n**Priority**: Before merge\n**Why This Matters**: When a pipeline is soft-deleted through the object layer (the normal production path), its stages remain with deleted_at\u003dNULL while the parent pipeline is marked as deleted. This creates orphaned, apparently-active stage records. Queries for active stages will return stages belonging to a deleted...\n\n**Recommendation**:\nResolve the integer ID before querying for stages, mirroring destroy_audit_pipeline. For example, first query the pipeline by identity (id or uuid) to get pipeline_ref[\u0027id\u0027], then use that integer ID in the stage filter. Alternatively, filter stages by audit_pipeline_uuid using the join_fieldmap already defined in _add_audit_pipeline_stages_filters.","commit_id":"4907103b961a2c7c6bf2d69ba8d10a85cee3f914"}],"watcher/objects/audit_pipeline.py":[{"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":"f2634f1771056d84ec7aa9e7a914aa97ef76a4f4","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    @classmethod"},{"line_number":221,"context_line":"    @base.remotable"},{"line_number":222,"context_line":"    def get(cls, context, stage_id, eager\u003dFalse):"},{"line_number":223,"context_line":"        \"\"\"Find a pipeline stage based on its id or uuid.\"\"\""},{"line_number":224,"context_line":"        if utils.is_int_like(stage_id):"},{"line_number":225,"context_line":"            return cls.get_by_id(context, stage_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"85794306_e56b6183","line":222,"updated":"2026-07-10 20:41:00.000000000","message":"The AuditPipelineStage.get() classmethod includes eager\u003dFalse in its signature but never passes the value to get_by_id or get_by_uuid. The underlying DB API methods _get_audit_pipeline_stage and get_audit_pipeline_stage_by_id/by_uuid also lack an eager parameter and hardcode eager\u003dFalse. Callers...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: A caller calling AuditPipelineStage.get(context, stage_id, eager\u003dTrue) will not receive eagerly-loaded relationship objects (audit_pipeline, goal, strategy). The API contract is silently violated, which can cause N+1 query problems or unexpected None values for relationship fields at runtime.\n\n**Recommendation**:\nEither thread the eager parameter through get_by_id, get_by_uuid, and the DB API methods (adding eager support to _get_audit_pipeline_stage, get_audit_pipeline_stage_by_id, get_audit_pipeline_stage_by_uuid, and the BaseConnection abstract methods), or remove the eager parameter from the get() method signature to avoid misleading callers.","commit_id":"4907103b961a2c7c6bf2d69ba8d10a85cee3f914"}]}
