Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f89496b
Implement environment variable expansion for configuration files and …
EffortlessSteven Feb 5, 2026
c9a8a2a
Add conformance tests and schema validation for sensor report
EffortlessSteven Feb 5, 2026
c188b79
feat: Add timing metrics to CheckReceipt and update related tests
EffortlessSteven Feb 5, 2026
c41517f
feat: Enhance configuration management and validation
EffortlessSteven Feb 5, 2026
8c936db
feat: Update fingerprint computation to use full SHA-256 hash and enh…
EffortlessSteven Feb 6, 2026
5c219f0
Add snapshot tests for JSON receipt and GitHub annotation formats
EffortlessSteven Feb 6, 2026
0c9d09f
Refactor verdict reasons handling in markdown rendering
EffortlessSteven Feb 7, 2026
d3e4d3a
feat: Refactor error handling and improve JSON schema drift diagnostics
EffortlessSteven Feb 7, 2026
8aaa6f0
Refactor code structure for improved readability and maintainability
EffortlessSteven Feb 9, 2026
bdac0d3
Refactor code structure for improved readability and maintainability
EffortlessSteven Feb 10, 2026
583d4ec
chore: remove accidental build artifacts and binaries
EffortlessSteven Feb 10, 2026
ccf0f41
chore: reorder imports for consistency and readability across multipl…
EffortlessSteven Feb 10, 2026
8325454
chore: fmt, clippy fixes and unsafe blocks
EffortlessSteven Feb 10, 2026
fdd81d1
chore: update authors and repository URLs in Cargo.toml
EffortlessSteven Feb 12, 2026
a53d5fa
feat: add directory rule overrides and related tests
EffortlessSteven Feb 17, 2026
31170b8
feat: Enhance rule configuration and CLI options for multi-base diff …
EffortlessSteven Feb 17, 2026
804b4ce
Implement LSP server for diffguard with document state management and…
EffortlessSteven Feb 17, 2026
4b39685
refactor(lsp): split into lib+bin targets, fix initialize handshake
EffortlessSteven Apr 5, 2026
d8a69f3
fix(xtask): cargo_bin_path fallback to target/debug when CARGO_BIN_EX…
EffortlessSteven Apr 5, 2026
b8e2532
fix: remove duplicate init_logging call (#10)
EffortlessSteven Apr 5, 2026
7ebce05
chore: add conveyor governance templates and CI gates
EffortlessSteven Apr 5, 2026
4cb1876
docs: add DESIGN.md — governance primitive layer positioning
EffortlessSteven Apr 5, 2026
fb13941
fix: LSP git diff timeout and cmd_validate ENV_LOCK race (#16)
EffortlessSteven Apr 5, 2026
3dd5155
Merge main into feat/v0.2-enhancements-v2
EffortlessSteven Apr 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/settings.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# .github/settings.yml
repository:
description: "Diff-scoped governance linter for PR automation"
homepage: "https://github.com/effortless-mgmt/diffguard"
homepage: "https://github.com/effortlessmetrics/diffguard"
topics: rust, linter, diff, git, ci, governance, devex

# Merge strategy settings
Expand All @@ -22,4 +22,4 @@ branches:
strict: true
contexts: [] # Add specific CI check names here if known (e.g., "ci (ubuntu-latest)")
enforce_admins: false
restrictions: null
restrictions: null
7 changes: 5 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ Cargo.lock
.DS_Store
artifacts/
.fuzz/
/fuzz/
/fuzz/*
!/fuzz/Cargo.toml
!/fuzz/fuzz_targets/
!/fuzz/fuzz_targets/*.rs
*.pdb
*.profraw
.tmp_*
.tmp_*
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,4 @@ Rules defined in `diffguard.toml`. See `diffguard.toml.example`. Key fields:

## MSRV

Rust 1.75 (Minimum Supported Rust Version)
Rust 1.92 (Minimum Supported Rust Version)
18 changes: 16 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Per-directory rule overrides via `.diffguard.toml` files:
- Rule disable/enable by subtree (`enabled`)
- Severity overrides by subtree (`severity`)
- Additional subtree-scoped excludes (`exclude_paths`)
- Dedicated `evaluate_lines` fuzz target (`fuzz/fuzz_targets/evaluate_lines.rs`)
- Scope expansion for diff analysis:
- `scope = "deleted"` to evaluate removed lines
- `scope = "modified"` for changed-only additions (with `changed` retained as compatibility alias)

## [0.2.0] - 2026-02-16

### Added

- **Sensor report** (`sensor.report.v1`) - R2 Library Contract entry point (`run_sensor()`) for Cockpit/BusyBox integration, with full JSON schema
- **SARIF 2.1.0 output** (`--sarif` flag, `diffguard sarif` subcommand) for integration with GitHub Code Scanning and other SARIF-compatible tools
- **Inline suppression directives**:
Expand Down Expand Up @@ -139,5 +152,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `diffguard-core`: Orchestration layer
- `diffguard`: CLI binary with I/O

[Unreleased]: https://github.com/effortless-mgmt/diffguard/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/effortless-mgmt/diffguard/releases/tag/v0.1.0
[Unreleased]: https://github.com/effortlessmetrics/diffguard/compare/v0.2.0...HEAD
[0.2.0]: https://github.com/effortlessmetrics/diffguard/compare/v0.1.0...v0.2.0
[0.1.0]: https://github.com/effortlessmetrics/diffguard/releases/tag/v0.1.0
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,4 @@ Rules defined in `diffguard.toml`. See `diffguard.toml.example`. Key fields:

## MSRV

Rust 1.75 (Minimum Supported Rust Version)
Rust 1.92 (Minimum Supported Rust Version)
Comment on lines 119 to +121
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Find the new crate directories and their Cargo.toml files
find crates -type d -name "diffguard-analytics" -o -name "diffguard-lsp" 2>/dev/null

Repository: EffortlessMetrics/diffguard

Length of output: 118


🏁 Script executed:

# List all Cargo.toml files to understand crate structure
git ls-files | grep -E "Cargo.toml$" | head -20

Repository: EffortlessMetrics/diffguard

Length of output: 383


🏁 Script executed:

# Read CLAUDE.md to check the architecture diagram
cat -n CLAUDE.md | grep -A 30 "architecture\|Architecture\|diagram"

Repository: EffortlessMetrics/diffguard

Length of output: 2337


🏁 Script executed:

# Check dependencies in diffguard-analytics
cat crates/diffguard-analytics/Cargo.toml

Repository: EffortlessMetrics/diffguard

Length of output: 914


🏁 Script executed:

# Check dependencies in diffguard-lsp
cat crates/diffguard-lsp/Cargo.toml

Repository: EffortlessMetrics/diffguard

Length of output: 1102


🏁 Script executed:

# Search for MSRV guidelines in project documentation
rg "MSRV|Minimum.*Rust|rust-version|1\.75|1\.92" --type md --type toml

Repository: EffortlessMetrics/diffguard

Length of output: 921


🏁 Script executed:

# Check if diffguard-lsp has main.rs or is a library/application
find crates/diffguard-lsp/src -type f -name "*.rs" | head -5

Repository: EffortlessMetrics/diffguard

Length of output: 206


🏁 Script executed:

# Check if there's mention of diffguard-lsp in workspace members or architecture docs
rg "diffguard-lsp|diffguard-analytics" CLAUDE.md AGENTS.md README.md 2>/dev/null || echo "Not found in docs"

Repository: EffortlessMetrics/diffguard

Length of output: 520


Update architecture diagram to include the two new crates.

The dependency hierarchy diagram in lines 29–51 currently shows five crates but omits diffguard-analytics and diffguard-lsp, which are now workspace members and documented in README.md. Add them to the diagram:

  • diffguard-lsp should appear as another I/O boundary application (alongside diffguard CLI) depending on diffguard-core, diffguard-domain, and diffguard-types
  • diffguard-analytics should appear at the diffguard-types level, as a pure domain utility crate with no I/O operations

This ensures readers can verify both new crates respect the documented downward-only dependency hierarchy.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CLAUDE.md` around lines 119 - 121, Update the architecture dependency diagram
(lines 29–51) to include the two new workspace crates: add diffguard-lsp as an
additional I/O boundary application node that depends on diffguard-core,
diffguard-domain, and diffguard-types (mirroring the existing diffguard CLI
node), and add diffguard-analytics as a node attached at the diffguard-types
level (a pure domain utility with no I/O edges). Ensure edges and placement
reflect the downward-only dependency rule and match the crate names
diffguard-lsp and diffguard-analytics used in README.md and the workspace.

4 changes: 3 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
[workspace]
resolver = "2"
members = [
"crates/diffguard-analytics",
"crates/diffguard",
"crates/diffguard-core",
"crates/diffguard-diff",
"crates/diffguard-domain",
"crates/diffguard-lsp",
"crates/diffguard-testkit",
"crates/diffguard-types",
"xtask",
Expand All @@ -13,7 +15,7 @@ members = [
default-members = ["crates/diffguard"]

[workspace.package]
version = "0.1.0"
version = "0.2.0"
authors = ["Steven Zimmerman, CPA <git@effortlesssteven.com>"]
edition = "2024"
license = "MIT OR Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion GEMINI.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ Configuration controls the linter behavior and rules.
```toml
[defaults]
base = "origin/main"
scope = "added" # added|changed
scope = "added" # added|changed|modified|deleted (changed kept for compatibility)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Stale "Key Features" and project overview descriptions still say "added or changed" only.

Line 5 says "applying rules only to added or changed lines" and Line 8 says "Scans only added/changed lines" — both omit modified and deleted, which are now valid scope values. As the authoritative AI context document, these stale descriptions may mislead LLM code generation.

Additionally, "(changed kept for compatibility)" is opaque without stating that changed is a deprecated alias for modified. A clearer note like "(changed is a deprecated alias for modified)" would be more precise.

📝 Suggested corrections
-**Diff-Aware:** Scans only added/changed lines (no repo-wide noise).
+**Diff-Aware:** Scans added, modified, and deleted lines in a diff (no repo-wide noise).
-diffguard is a diff-scoped governance linter written in Rust. It is designed for modern PR automation, applying rules only to added or changed lines in a Git diff.
+diffguard is a diff-scoped governance linter written in Rust. It is designed for modern PR automation, applying rules to added, modified, or deleted lines in a Git diff.
-scope = "added"       # added|changed|modified|deleted (changed kept for compatibility)
+scope = "added"       # added|modified|deleted|changed (changed is a deprecated alias for modified, kept for compatibility)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
scope = "added" # added|changed|modified|deleted (changed kept for compatibility)
scope = "added" # added|modified|deleted|changed (changed is a deprecated alias for modified, kept for compatibility)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@GEMINI.md` at line 58, Update the stale descriptions in GEMINI.md that
reference the scope behavior (e.g., the example "scope = \"added\"" and the "Key
Features" / project overview lines that say "applying rules only to added or
changed lines" or "Scans only added/changed lines") to list all valid values —
"added, modified, or deleted" (and include "changed" only as a deprecated alias)
so they read e.g., "applying rules only to added, modified, or deleted lines";
also replace the parenthetical "(changed kept for compatibility)" with an
explicit note like "(changed is a deprecated alias for modified)" to make
compatibility semantics clear.

fail_on = "error" # error|warn|never

[[rule]]
Expand Down
89 changes: 84 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@

[![Crates.io](https://img.shields.io/crates/v/diffguard.svg)](https://crates.io/crates/diffguard)
[![Documentation](https://docs.rs/diffguard/badge.svg)](https://docs.rs/diffguard)
[![CI](https://github.com/effortless-mgmt/diffguard/actions/workflows/ci.yml/badge.svg)](https://github.com/effortless-mgmt/diffguard/actions/workflows/ci.yml)
[![CI](https://github.com/effortlessmetrics/diffguard/actions/workflows/ci.yml/badge.svg)](https://github.com/effortlessmetrics/diffguard/actions/workflows/ci.yml)
[![License](https://img.shields.io/crates/l/diffguard.svg)](LICENSE-MIT)

A diff-scoped governance linter: **rules applied to added/changed lines** in a Git diff.
A diff-scoped governance linter: **rules applied to scoped lines** in a Git diff.

`diffguard` is designed for modern PR automation:

- **Diff-aware** by default (no repo-wide grep noise)
- Supports **git refs, staged diffs, or unified diff files/stdin**
- Emits a stable **JSON receipt** for bots/automation
- Can render a compact **Markdown summary** for PR comments
- Can emit **GitHub Actions annotations** (`::error` / `::warning`)
Expand All @@ -21,7 +22,7 @@ A diff-scoped governance linter: **rules applied to added/changed lines** in a G
cargo install diffguard

# From source
git clone https://github.com/effortless-mgmt/diffguard
git clone https://github.com/effortlessmetrics/diffguard
cd diffguard
cargo install --path crates/diffguard
```
Expand All @@ -36,6 +37,13 @@ diffguard init --preset minimal
diffguard check --base origin/main --head HEAD --github-annotations \
--out artifacts/diffguard/report.json \
--md artifacts/diffguard/comment.md

# Multi-base comparison (union of changed lines)
diffguard check --base origin/main --base origin/release/1.0 --head HEAD

# Non-git source: read unified diff from file or stdin
diffguard check --diff-file patch.diff
git diff --cached | diffguard check --diff-file -
```

Available presets: `minimal`, `rust-quality`, `secrets`, `js-console`, `python-debug`
Expand All @@ -54,7 +62,7 @@ Create `diffguard.toml`:
```toml
[defaults]
base = "origin/main"
scope = "added" # added|changed
scope = "added" # added|changed|modified|deleted (changed kept for compatibility)
fail_on = "error" # error|warn|never
max_findings = 200
diff_context = 0
Expand All @@ -77,6 +85,41 @@ You can point `diffguard` at a config file:
diffguard check --config diffguard.toml
```

### Advanced Rule Semantics

Rules can opt into richer matching behavior:

```toml
[[rule]]
id = "python.eval_untrusted"
severity = "warn"
message = "eval() with untrusted input is forbidden."
languages = ["python"]
patterns = ["\\beval\\s*\\("]
paths = ["**/*.py"]
ignore_comments = true
ignore_strings = true

# 8.1 Multi-line windows
multiline = true
multiline_window = 2

# 8.3 Require context near the primary match
context_patterns = ["\\buntrusted\\b"]
context_window = 2

# 8.4 Escalate severity when context is present
escalate_patterns = ["\\brequest\\.(GET|POST|data)\\b"]
escalate_window = 1
escalate_to = "error"

# 8.5 Only evaluate when dependency rules matched in the same file
depends_on = ["python.has_eval"]
```

Use `match_mode = "absent"` (8.2) to emit a finding when a pattern is missing
in a scoped file.

### Environment Variables

Config files support environment variable expansion:
Expand All @@ -102,6 +145,24 @@ message = "Project-specific check"
patterns = ["FIXME"]
```

### Per-Directory Overrides

Place `.diffguard.toml` in subdirectories to override rule behavior for that
directory subtree:

```toml
[[rule]]
id = "rust.no_unwrap"
enabled = false
```

Supported override fields:
- `enabled` (bool): enable/disable a rule for that subtree
- `severity` (`info|warn|error`): override severity by directory
- `exclude_paths` (`[]string`): extra excludes scoped to that directory

Deeper directories override parent directories.

### Inline Suppressions

Suppress specific findings with inline comments:
Expand Down Expand Up @@ -133,6 +194,9 @@ diffguard supports multiple output formats for different use cases:
| JUnit | `--junit` | CI/CD integration (Jenkins, GitLab CI) |
| CSV/TSV | `--csv` / `--tsv` | Spreadsheet import, data analysis |
| Sensor | `--sensor` | R2 Library Contract envelope (`sensor.report.v1`) |
| Rule Stats | `--rule-stats` | Per-rule hit aggregation for analytics |
| False-Positive Baseline | `--false-positive-baseline` / `--write-false-positive-baseline` | Acknowledge and track known false positives |
| Trend History | `--trend-history` / `trend` | Cross-run metrics and historical summaries |

## GitHub Actions example

Expand All @@ -154,6 +218,16 @@ diffguard supports multiple output formats for different use cases:
sarif_file: artifacts/diffguard/report.sarif
```

## Git Hook Samples

Sample hooks live in `docs/hooks/`:
- `docs/hooks/commit-msg.sample`

## IDE Integration

- VS Code extension scaffold: `editors/vscode-diffguard`
- LSP diagnostics/code-action server crate: `crates/diffguard-lsp`

## Repo layout

This repo uses a clean, microcrate workspace layout with strict dependency direction:
Expand All @@ -173,6 +247,9 @@ diffguard-domain diffguard-diff
diffguard-types
Pure DTOs

diffguard-analytics Analytics DTOs/helpers (false positives + trends)
diffguard-lsp LSP server: diff-scoped diagnostics + rule actions
```

| Crate | Purpose |
Expand All @@ -181,7 +258,9 @@ diffguard-domain diffguard-diff
| `diffguard-diff` | Parse unified diff format, detect binary/submodule/rename |
| `diffguard-domain` | Compile rules, evaluate lines, preprocess comments/strings |
| `diffguard-core` | Engine: check runs, sensor reports, verdicts, render outputs |
| `diffguard-analytics` | False-positive baselines and trend history helpers |
| `diffguard` | CLI binary: arg parsing, config loading, git invocation |
| `diffguard-lsp` | Language Server Protocol server (diagnostics, code actions, config-aware checks) |
| `diffguard-testkit` | Shared test utilities (proptest strategies, fixtures) |
| `xtask` | Repo automation (`ci`, `schema`, `conform`) |

Expand Down Expand Up @@ -225,7 +304,7 @@ cargo +nightly fuzz run rule_matcher # Rule evaluation

## Minimum Supported Rust Version (MSRV)

Rust 1.75 or later.
Rust 1.92 or later.

## License

Expand Down
42 changes: 21 additions & 21 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ Complete the remaining tasks from the comprehensive-test-coverage spec to ensure
| 1.9 | Markdown rendering property tests | P1 | S | **complete** |
| 1.10 | GitHub annotation format property tests | P1 | S | **complete** |
| 1.11 | Config parse fuzz target | P1 | M | **complete** |
| 1.12 | evaluate_lines fuzz target | P1 | M | planned |
| 1.12 | evaluate_lines fuzz target | P1 | M | **complete** |
| 1.13 | BDD integration tests for CLI workflows | P1 | M | **complete** |
| 1.14 | Snapshot tests for JSON receipt output | P2 | S | **complete** |
| 1.15 | Snapshot tests for GitHub annotation format | P2 | S | **complete** |
| 1.16 | Mutation testing analysis across all crates | P2 | L | planned |
| 1.16 | Mutation testing analysis across all crates | P2 | L | **complete** |

---

Expand Down Expand Up @@ -66,7 +66,7 @@ Improve rule flexibility and user experience.
| 3.4 | Rule testing framework (example inputs with expected matches) | P2 | L | **complete** |
| 3.5 | Environment variable expansion in config (`${VAR}`) | P3 | S | **complete** |
| 3.6 | Config inheritance/composition (`includes = ["base.toml"]`) | P3 | M | **complete** |
| 3.7 | Per-directory rule overrides (.diffguard.toml lookup) | P3 | M | in-progress |
| 3.7 | Per-directory rule overrides (.diffguard.toml lookup) | P3 | M | **complete** |

**Inline suppression format:**
```rust
Expand All @@ -89,7 +89,7 @@ Extend preprocessing support to additional languages.
| 4.4 | **Scala** preprocessing (// and /* */ nested comments) | P3 | S | **complete** |
| 4.5 | SQL preprocessing (-- comments, /* */ blocks) | P3 | M | **complete** |
| 4.6 | XML/HTML comment preprocessing (<!-- -->) | P3 | M | **complete** |
| 4.7 | YAML/TOML/JSON comment handling | P3 | M | planned |
| 4.7 | YAML/TOML/JSON comment handling | P3 | M | **complete** |
| 4.8 | Language override flag (`--language=rust` for non-standard extensions) | P2 | S | **complete** |

---
Expand Down Expand Up @@ -124,12 +124,12 @@ Improve developer workflow integration.
| Item | Description | Priority | Effort | Status |
|------|-------------|----------|--------|--------|
| 6.1 | **pre-commit hook integration** (pre-commit framework) | P1 | M | **complete** |
| 6.2 | Git commit-msg hook sample | P3 | S | planned |
| 6.2 | Git commit-msg hook sample | P3 | S | **complete** |
| 6.3 | GitHub Action reusable workflow | P1 | M | **complete** |
| 6.4 | GitLab CI template | P2 | S | **complete** |
| 6.5 | Azure DevOps pipeline template | P3 | S | **complete** |
| 6.6 | VS Code extension (basic) | P3 | XL | planned |
| 6.7 | LSP server for IDE integration | P3 | XL | planned |
| 6.6 | VS Code extension (basic) | P3 | XL | **complete** |
| 6.7 | LSP server for IDE integration | P3 | XL | **complete** |
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

LSP marked complete but the PR explicitly acknowledges it's unverified.

The PR objectives state: "LSP not verified with a real VS Code connection." If the roadmap tracks production-ready delivery rather than code merge, in-progress would more accurately reflect the current state.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ROADMAP.md` at line 132, Update the roadmap entry for "LSP server for IDE
integration" (section/item 6.7) to reflect that it is not production-verified by
changing the status from **complete** to **in-progress** (or similar), and add a
brief parenthetical note like "(not verified with real VS Code connection)" so
the roadmap accurately tracks delivery readiness rather than only merge status.


**pre-commit integration (6.1):**
```yaml
Expand All @@ -151,9 +151,9 @@ Add visibility into rule performance and effectiveness.
|------|-------------|----------|--------|--------|
| 7.1 | Verbose/debug logging (`--verbose`, `--debug`) | P2 | S | **complete** |
| 7.2 | Performance timing metrics in receipt | P3 | S | **complete** |
| 7.3 | Rule hit statistics aggregation | P3 | M | planned |
| 7.4 | False positive tracking mechanism | P3 | L | planned |
| 7.5 | Historical trend analysis (cross-run metrics) | P3 | XL | planned |
| 7.3 | Rule hit statistics aggregation | P3 | M | **complete** |
| 7.4 | False positive tracking mechanism | P3 | L | **complete** |
| 7.5 | Historical trend analysis (cross-run metrics) | P3 | XL | **complete** |

---

Expand All @@ -163,11 +163,11 @@ Enable more sophisticated matching patterns.

| Item | Description | Priority | Effort | Status |
|------|-------------|----------|--------|--------|
| 8.1 | Multi-line pattern matching (across consecutive lines) | P2 | L | planned |
| 8.2 | Negative patterns (flag if pattern NOT present) | P3 | M | planned |
| 8.3 | Context requirements (require pattern A near pattern B) | P3 | L | planned |
| 8.4 | Semantic severity escalation (warn→error based on context) | P3 | M | planned |
| 8.5 | Rule dependencies (if rule A matches, also check rule B) | P3 | M | planned |
| 8.1 | Multi-line pattern matching (across consecutive lines) | P2 | L | **complete** |
| 8.2 | Negative patterns (flag if pattern NOT present) | P3 | M | **complete** |
| 8.3 | Context requirements (require pattern A near pattern B) | P3 | L | **complete** |
| 8.4 | Semantic severity escalation (warn→error based on context) | P3 | M | **complete** |
| 8.5 | Rule dependencies (if rule A matches, also check rule B) | P3 | M | **complete** |

---

Expand All @@ -177,11 +177,11 @@ Extend diff analysis capabilities.

| Item | Description | Priority | Effort | Status |
|------|-------------|----------|--------|--------|
| 9.1 | `scope = "deleted"` - Flag removal of certain patterns | P2 | M | planned |
| 9.2 | `scope = "modified"` - Changed lines only, not pure additions | P3 | S | planned |
| 9.3 | Non-git diff sources (patch files, arbitrary diffs) | P3 | L | planned |
| 9.4 | Multiple base comparison (`--base main --base release/1.0`) | P3 | L | planned |
| 9.5 | Blame-aware filtering (by author, age) | P3 | XL | planned |
| 9.1 | `scope = "deleted"` - Flag removal of certain patterns | P2 | M | **complete** |
| 9.2 | `scope = "modified"` - Changed lines only, not pure additions | P3 | S | **complete** |
| 9.3 | Non-git diff sources (patch files, arbitrary diffs) | P3 | L | **complete** |
| 9.4 | Multiple base comparison (`--base main --base release/1.0`) | P3 | L | **complete** |
| 9.5 | Blame-aware filtering (by author, age) | P3 | XL | **complete** |

---

Expand Down Expand Up @@ -235,4 +235,4 @@ To propose additions to this roadmap:

---

*Last updated: 2026-02-05*
*Last updated: 2026-02-17*
2 changes: 1 addition & 1 deletion azure-pipelines/diffguard-example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# This file demonstrates how to use the diffguard template in your pipelines
#
# Copy this file to your repository's root as `azure-pipelines.yml` and customize as needed
# For more information, see: https://github.com/effortless-mgmt/diffguard
# For more information, see: https://github.com/effortlessmetrics/diffguard

trigger:
branches:
Expand Down
Loading
Loading