Skip to content

quality-workflow v0.2.1 — honor skylos suppressions

Choose a tag to compare

@schuettc schuettc released this 22 May 20:57
· 122 commits to main since this release
0ea9180

Bug fix: suppressed findings no longer inflate active counts

The bug

v0.2.0's skylos adapter ingested every finding in skylos's JSON output without checking the reason field. When skylos honors an inline # skylos: ignore directive, it still emits the finding in JSON — just with "reason": "inline ignore comment". The adapter counted these as active, so a project with 54 honored suppressions snapshotted as 180 active findings when only 126 were genuinely active.

This was surfaced while dogfooding in now-playing during an autopilot run — the sql-injection-history-queries feature appeared to need work, but the suppression at queries.py:75 was already correct and skylos already honored it; the snapshot just didn't reflect that.

The fix

  • QualityFinding gains suppressed: bool and suppression_reason: Optional[str] fields (default False/None — backward compatible).
  • skylos_adapter reads item.get("reason"). Non-empty → suppressed=True + stored reason.
  • fallow_adapter explicitly leaves suppressed=False (fallow doesn't surface per-finding suppression state; its // fallow-ignore-next-line directives drop findings from JSON output entirely).
  • QualitySnapshot gains .active_findings() / .suppressed_findings() helpers.
  • SnapshotDiff gains .active_new / .active_resolved / .active_persisting properties.

Snapshots retain BOTH active and suppressed findings, so a finding that gains or loses its suppression between snapshots is observable as movement. Only the headlines and delta tables in /quality-audit filter to active-only.

Tests

  • 8 new tests (4 adapter, 4 snapshot) covering inline-ignore detection, missing-reason → active, empty-reason → active edge case, mixed payloads, helper filtering, roundtrip preservation, and active-view diffing.
  • 73/73 total tests passing.

Backward compatibility

  • Older snapshot JSONs load without modification — QualityFinding.from_dict() defensively drops unknown keys.
  • Call sites that don't pass suppressed keep working (defaults match prior behavior).

To install

/plugin update quality-workflow@schuettc-claude-code-plugins

Then re-run /quality-audit to take a snapshot under v0.2.1. Active counts should drop dramatically in any project that has been disciplined about inline suppressions.

PR: #12