Skip to content
Merged
Show file tree
Hide file tree
Changes from 18 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_*
164 changes: 164 additions & 0 deletions .hermes/plans/001-conformance-test-fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
# Plan: Fix xtask Test Failures

**Created:** 2026-04-04
**Updated:** 2026-04-04
**Priority:** P0 (blocking CI / PR #5)
**Status:** ready-for-execution

## Problem

3 tests in `xtask` fail, blocking CI and PR #5 merge:```
tests::run_with_args_dispatches_ci_with_fake_cargo - FAIL
tests::run_with_args_dispatches_conform_quick - FAIL
tests::run_with_args_dispatches_mutants_with_fake_cargo - FAIL
```
Comment on lines +10 to +14
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

Fix markdown formatting for the code fence.

The code fence should be surrounded by blank lines and have a language specified for proper rendering.

📝 Proposed fix for markdown formatting
-3 tests in `xtask` fail, blocking CI and PR `#5` merge:```
+3 tests in `xtask` fail, blocking CI and PR `#5` merge:
+
+```text
 tests::run_with_args_dispatches_ci_with_fake_cargo - FAIL
 tests::run_with_args_dispatches_conform_quick - FAIL
 tests::run_with_args_dispatches_mutants_with_fake_cargo - FAIL
🧰 Tools
🪛 LanguageTool

[typographical] ~11-~11: To join two clauses or introduce examples, consider using an em dash.
Context: ..._with_args_dispatches_ci_with_fake_cargo - FAIL tests::run_with_args_dispatches_con...

(DASH_RULE)


[typographical] ~12-~12: To join two clauses or introduce examples, consider using an em dash.
Context: ...::run_with_args_dispatches_conform_quick - FAIL tests::run_with_args_dispatches_mut...

(DASH_RULE)


[typographical] ~13-~13: To join two clauses or introduce examples, consider using an em dash.
Context: ..._args_dispatches_mutants_with_fake_cargo - FAIL ``` ## Root Cause Analysis ### Is...

(DASH_RULE)

🪛 markdownlint-cli2 (0.22.0)

[warning] 14-14: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


[warning] 14-14: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

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

In @.hermes/plans/001-conformance-test-fix.md around lines 10 - 14, Update the
markdown code fence so it has blank lines before and after the fenced block and
specify the language label `text`; replace the current inline fence with a
fenced block like ```text followed by the three test lines
(`tests::run_with_args_dispatches_ci_with_fake_cargo - FAIL`,
`tests::run_with_args_dispatches_conform_quick - FAIL`,
`tests::run_with_args_dispatches_mutants_with_fake_cargo - FAIL`) and then
closing ``` on its own line, ensuring a blank line above the opening fence and
below the closing fence for correct rendering.


## Root Cause Analysis

### Issue 1: Missing Binary for Conformance Tests

`run_with_args_dispatches_conform_quick` calls `conform::run_conformance(true)` which runs conformance tests. Tests 3 (Survivability) and 9 (Tool error code) need the `diffguard` binary, but:

- `CARGO_BIN_EXE_diffguard` is set by `cargo test` to point to the xtask binary, not diffguard
- `cargo_bin_path()` returns wrong path
- `run_diffguard()` fails to find the binary

### Issue 2: Mutex Poisoning Cascade

When `run_with_args_dispatches_conform_quick` panics, subsequent tests that use `ENV_LOCK.lock().unwrap()` fail with `PoisonError`.

The panic happens in `main.rs::tests` but doesn't use `ENV_LOCK`. However, the panic still affects test state.

### Issue 3: `cargo_bin_path()` Resolution

In `conform_real.rs`, `cargo_bin_path()` prefers `CARGO_BIN_EXE_diffguard` env var, but when running `cargo test -p xtask`, this points to the xtask test binary, not diffguard.

## Solution

### Task 1: Fix Binary Path Resolution

**File:** `xtask/src/conform_real.rs`
**Lines:** 1296-1330

Modify `cargo_bin_path()` to:
1. Check for `CARGO_BIN_EXE_diffguard` env var first
2. Fall back to workspace-relative `target/debug/diffguard` path
3. Build binary if missing

```rust
fn cargo_bin_path() -> String {
// Prefer env var if set and valid (points to actual diffguard binary)
if let Ok(bin) = std::env::var("CARGO_BIN_EXE_diffguard") {
// Verify it's the diffguard binary, not xtask
if bin.contains("diffguard") && !bin.contains("xtask") {
return bin;
}
}
// Fall back to workspace-relative path
workspace_root()
.join("target")
.join("debug")
.join(if cfg!(windows) { "diffguard.exe" } else { "diffguard" })
.to_str()
.unwrap()
.to_string()
}
```
Comment on lines +48 to +66
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 | 🔴 Critical

Proposed binary path validation has critical flaws.

The string-based check on line 53 is fragile and can fail in valid scenarios:

  1. False negative risk: A path like /home/user/diffguard-xtask-project/target/debug/diffguard contains both "diffguard" and "xtask", causing the valid diffguard binary to be rejected.

  2. Panic risk (line 63): The .unwrap() on to_str() will panic if the path contains invalid UTF-8 characters.

Consider a path-based approach instead:

🔧 Proposed fix using Path-based validation
 fn cargo_bin_path() -> String {
     // Prefer env var if set and valid (points to actual diffguard binary)
     if let Ok(bin) = std::env::var("CARGO_BIN_EXE_diffguard") {
-        // Verify it's the diffguard binary, not xtask
-        if bin.contains("diffguard") && !bin.contains("xtask") {
-            return bin;
+        // Verify it's actually the diffguard binary by checking the filename
+        let path = std::path::Path::new(&bin);
+        if let Some(filename) = path.file_name().and_then(|n| n.to_str()) {
+            let expected = if cfg!(windows) { "diffguard.exe" } else { "diffguard" };
+            if filename == expected && path.exists() {
+                return bin;
+            }
         }
     }
     // Fall back to workspace-relative path
     workspace_root()
         .join("target")
         .join("debug")
         .join(if cfg!(windows) { "diffguard.exe" } else { "diffguard" })
-        .to_str()
-        .unwrap()
-        .to_string()
+        .to_string_lossy()
+        .to_string()
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.hermes/plans/001-conformance-test-fix.md around lines 48 - 66, The
cargo_bin_path function's string-based checks are fragile and can panic; replace
the fragile contains-based validation in cargo_bin_path by parsing the env var
as a Path and validating using path components: use
Path::new(&bin).file_name().and_then(|n| n.to_str()) to get the filename (or
file_stem) and compare it to "diffguard" (or "diffguard.exe" on Windows) rather
than searching the whole path for "xtask"; additionally verify the candidate
path exists/is a file (std::fs::metadata or .exists()) and avoid
.to_str().unwrap() by returning a String via to_string_lossy().into_owned() (or
better, change the function to return PathBuf) when falling back to
workspace_root().join(...).


### Task 2: Add Build Step in `run_conformance`

**File:** `xtask/src/conform_real.rs`

At the start of `run_conformance()`, call `ensure_diffguard_built()`:

```rust
pub fn run_conformance(quick: bool) -> Result<()> {
ensure_diffguard_built()?; // Add this line
// ... rest of function
}
```

### Task 3: Implement `ensure_diffguard_built`

```rust
fn ensure_diffguard_built() -> Result<()> {
let binary = cargo_bin_path();
if !std::path::Path::new(&binary).exists() {
eprintln!("Building diffguard binary for conformance tests...");
let status = Command::new("cargo")
.args(["build", "--bin", "diffguard"])
.current_dir(workspace_root())
.status()
.context("cargo build --bin diffguard")?;
if !status.success() {
bail!("Failed to build diffguard binary");
}
}
Ok(())
}
```

### Task 4: Handle Poisoned Mutex

**Files:** `xtask/src/main.rs`, `xtask/src/conform_real.rs`

Replace `.unwrap()` with recovery pattern:

```rust
// Before:
let _guard = ENV_LOCK.lock().unwrap();

// After:
let _guard = ENV_LOCK.lock().unwrap_or_else(|e| {
// Clear poison and continue
e.into_inner()
});
```

This allows tests to continue even if a previous test panicked while holding the lock.

### Task 5: Fix Test Isolation

**File:** `xtask/src/main.rs`

The test `run_with_args_dispatches_conform_quick` should not panic when conformance fails. It should return a result or handle the error gracefully:

```rust
#[test]
fn run_with_args_dispatches_conform_quick() {
// Build first
let binary = workspace_root()
.join("target")
.join("debug")
.join(if cfg!(windows) { "diffguard.exe" } else { "diffguard" });
if !binary.exists() {
let status = Command::new("cargo")
.args(["build", "--bin", "diffguard"])
.status()
.expect("cargo build");
assert!(status.success(), "Failed to build diffguard");
}

run_with_args(["xtask", "conform", "--quick"]).expect("run conform");
}
Comment on lines +126 to +143
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider using a test setup function instead of inline build logic.

The test still uses .expect() which can panic, though this is more acceptable in test code. For better test isolation and reusability, consider extracting the binary build logic into a shared test setup function.

♻️ Optional refactor for better test isolation
// In a test utils module or at top of test module
fn ensure_test_binary_built() -> std::path::PathBuf {
    let binary = workspace_root()
        .join("target")
        .join("debug")
        .join(if cfg!(windows) { "diffguard.exe" } else { "diffguard" });
    
    if !binary.exists() {
        let status = Command::new("cargo")
            .args(["build", "--bin", "diffguard"])
            .status()
            .expect("cargo build");
        assert!(status.success(), "Failed to build diffguard");
    }
    binary
}

#[test]
fn run_with_args_dispatches_conform_quick() {
    let _binary = ensure_test_binary_built();
    run_with_args(["xtask", "conform", "--quick"]).expect("run conform");
}

This makes the setup reusable across multiple tests that need the binary.

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

In @.hermes/plans/001-conformance-test-fix.md around lines 126 - 143, The inline
build/check logic in the test run_with_args_dispatches_conform_quick should be
extracted into a reusable test setup function (e.g., ensure_test_binary_built)
so other tests can reuse it and keep the test body focused; move the
workspace_root + target/debug binary path resolution and the
Command::new("cargo").args(["build", "--bin", "diffguard"]).status() logic into
ensure_test_binary_built (placed in a test utils module or top of the test
module), have it return the PathBuf for the binary after asserting success, and
replace the inline block in run_with_args_dispatches_conform_quick with a call
to ensure_test_binary_built() before invoking run_with_args([...]).

```

## Verification Steps

1. Run `cargo build --bin diffguard`
2. Run `cargo test -p xtask -- --test-threads=1`
3. Run `cargo run -p xtask -- conform`
4. Run `cargo run -p xtask -- ci`

## Success Criteria

- [ ] All 13 xtask tests pass
- [ ] All 15 conformance tests pass
- [ ] `cargo run -p xtask -- ci` passes
- [ ] No changes to actual diffguard logic (only test harness)

## Notes

- This is blocking PR #5
- The fix is isolated to xtask test infrastructure
- No production code changes needed
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

Add trailing newline.

The file should end with a single newline character per markdown conventions.

📝 Proposed fix
 - No production code changes needed
+
📝 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
- No production code changes needed
- No production code changes needed
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)

[warning] 164-164: Files should end with a single newline character

(MD047, single-trailing-newline)

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

In @.hermes/plans/001-conformance-test-fix.md at line 164, Add a single trailing
newline character to the end of the markdown file so the file ends with one
newline; specifically, append a newline after the final line that currently
reads "No production code changes needed" in the document to satisfy markdown
conventions.

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
Loading
Loading