Skip to content
Back to skills

Batched Remediation

ASecurity

Batched remediation pipeline. Reads audit findings.json, filters one severity tier (--batch P0-P3), groups by root cause, validates --max-files (default 10), creates branch pilot/fix-<tier>-<n>, applies fixes, verifies with build/tests, rolls back on failure. Updates finding statuses and writes a PR-ready description. Hard rules: never mix tiers; never exceed --max-files; API-surface changes need explicit human sign-off first.

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 6, 2026
developmentangulargitapisecurity

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 6, 2026

npx -y skills add AgenticPawan/FullStack-Pilot --skill batched-remediation --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Batched Remediation?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Batched Remediation
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/agenticpawan-batched-remediation/badge)](https://www.skillsdirectory.com/skills/agenticpawan-batched-remediation)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
user-invocable: false
name: batched-remediation
description: "Batched remediation pipeline. Reads audit findings.json, filters one severity tier (--batch P0-P3), groups by root cause, validates --max-files (default 10), creates branch pilot/fix-<tier>-<n>, applies fixes, verifies with build/tests, rolls back on failure. Updates finding statuses and writes a PR-ready description. Hard rules: never mix tiers; never exceed --max-files; API-surface changes need explicit human sign-off first."
when_to_use: Invoke via /fsp-fix. Use when the user asks to fix, remediate, or patch findings from a prior audit. Requires findings.json produced by /fsp-audit.
disable-model-invocation: true
---

<!-- HARD RULES — enforce at every step, no exceptions -->
<!-- RULE 1: Never mix severity tiers in one branch/PR -->
<!-- RULE 2: Never exceed --max-files across all groups in the batch -->
<!-- RULE 3: Build or test failure → rollback branch completely, never force-complete -->
<!-- RULE 4: API surface change (adding [Authorize], changing endpoint signature, removing endpoint) → STOP and ask for human sign-off before writing any code -->
<!-- RULE 5: No mega-PRs. If batch exceeds --max-files after grouping, split into sub-batches and ask which to run first -->

See `fix-strategies.md` (same directory) for per-CWE fix recipes.

---

## Step 0 — Parse arguments and load state

**Arguments** (extracted from the user's invocation):
- `--batch <tier>`: required. One of `P0`, `P1`, `P2`, `P3`.
- `--max-files <n>`: optional, default `10`. Maximum distinct files modified across the whole batch.

Read `PROJECT_ROOT/.claude/pilot/audit/findings.json`. If absent, tell the user to run `/fsp-audit` first and stop.

Record `startBranch` (current git branch: `git rev-parse --abbrev-ref HEAD`).

---

## Step 1 — Filter findings

Select findings where:
- `severity == <tier>` (exact match — **never mix tiers**)
- `status` is absent, `null`, or `"open"`
- `batchable == true`

If no findings match: report "No open batchable <tier> findings — nothing to do." and stop.

List excluded findings separately (status already set, batchable: false, different severity).

---

## Step 2 — Group by root cause

Collapse the filtered list into **root-cause groups** before counting files:

| Root cause | Grouping rule |
|------------|---------------|
| Package vulnerability | All findings citing the same `<Package>@<version>` → one group, one `.csproj` edit |
| Same CWE, same file | Multiple findings in the same file with the same CWE → one group (fix together) |
| IDOR (CWE-639) | Each endpoint is its own group — cross-endpoint IDOR fixes are not atomic |
| Missing auth (CWE-862) | Controller-level vs method-level are separate groups |
| All others | One group per finding |

Assign each group a `groupId` (e.g., `G01`, `G02`). Record the finding IDs each group covers.

---

## Step 3 — Batch validation

Count **distinct files** that would be modified across all groups.

**If count > --max-files:**
- Print a table of groups vs files
- Suggest the first N groups that fit within `--max-files` as sub-batch 1
- Ask the user: "This batch touches <M> files, exceeding --max-files=<n>. Run sub-batch 1 (<groups>)? Or adjust --max-files?"
- **Stop and wait.** Do not proceed until the user responds.

**If count ≤ --max-files:** proceed.

**API surface check** — before writing any code, scan each group's proposed fix:
- Does the fix add `[Authorize]`/`[RequireAuthorization]` to a previously public endpoint?
- Does the fix remove or rename a public endpoint or DTO field?
- Does the fix change a public method signature in a shared library?

If YES for any group: print a **breaking-change warning** for each affected group listing the endpoint/type and the callers that would break. Ask: "These fixes change the public API surface. Confirm you want to proceed with each group (Y/N per group)." Stop and wait. Do not write any code until the user responds for every flagged group. Mark any group where the user says N as `status: "deferred"` with `deferReason: "API surface change — human sign-off declined"`.

---

## Step 4 — Capture baseline build status

Before touching any files, run a build to establish baseline:

```
dotnet build <solution-or-project> --no-restore -warnaserror:false 2>&1
```

Record `baselineBuildPassed: true/false`. If baseline build is already failing, note it — this does **not** block remediation, but the rollback trigger in Step 7 changes: roll back only if post-fix build introduces *new* errors not present at baseline.

For Angular projects, run `npx tsc --noEmit` if `angular` is non-null in the stack profile. Record `baselineTscPassed: true/false`.

---

## Step 5 — Create remediation branch

Determine the branch suffix: count existing `pilot/fix-<tier>-*` branches and increment.

```
git checkout -b pilot/fix-<tier>-<n>
```

If this command fails (e.g., uncommitted changes on current branch), report the error and stop. Do not stash without asking.

---

## Step 6 — Apply fixes

For each group, in order:

1. Read the current file(s).
2. Apply the fix using the recipe from `fix-strategies.md` for the group's CWE.
3. Write the file back using the Edit tool (prefer targeted edits over full rewrites).
4. Note the edit: `{ groupId, findingIds, file, linesChanged, fixSummary }`.

**Fix application constraints:**
- Edit only lines cited in the finding plus the minimum surrounding context needed for the fix.
- Do not reformat unrelated code (whitespace, style) — keep the diff reviewable.
- Do not add comments explaining the fix unless the fix itself would be non-obvious to a reviewer.
- If a fix requires a new dependency or import, add only what is needed and no more.

After all groups are applied, run `git diff --stat HEAD` and record `filesModified` and `linesChanged`.

---

## Step 7 — Verify: build + test

### Build verification

```
dotnet build <solution-or-project> --no-restore -warnaserror:false 2>&1
```

**Rollback trigger:** post-fix build has errors that were not present at baseline → trigger rollback (Step 8).

For Angular: `npx tsc --noEmit`. Rollback trigger: new TS errors not present at baseline.

### Test verification

Identify affected test projects: any test project in `dotnet.projects` that references the modified source projects.

**If `dotnet-test` plugin skill is installed** (check with `dotnet skills list 2>/dev/null | grep dotnet-test`):
```
/run dotnet-test --project <affectedTestProject>
```

**Otherwise:**
```
dotnet test <affectedTestProject> --no-build --logger "console;verbosity=normal" 2>&1
```

**Rollback trigger:** any test that was passing at baseline now fails → trigger rollback (Step 8).

If no test projects exist: note "no test projects found — build-only verification" and continue.

---

## Step 8 — Rollback protocol

Triggered when build or tests introduce new failures (not present at baseline).

```
git checkout <startBranch>
git branch -D pilot/fix-<tier>-<n>
```

After rollback, print:

```
## Rollback: pilot/fix-<tier>-<n>

Build/test verification failed — branch deleted, no files changed.

Failure: <error summary>
Baseline status: build=<pass/fail>, tests=<pass/fail/skipped>
Post-fix status: build=<pass/fail>, tests=<pass/fail>

Groups that were applied before failure:
  <groupId>: <files edited>

Recommended action: <targeted advice per failure type>
```

Do not update findings.json statuses. Stop.

---

## Step 9 — Update findings.json

For each finding covered by a group that was successfully fixed, update its entry in findings.json:

```json
{
  "status": "fixed",
  "fixedIn": "pilot/fix-<tier>-<n>",
  "fixSummary": "<one-line description of what was changed>"
}
```

For any finding that was excluded from the batch (deferred or wontfix):

```json
{
  "status": "deferred",
  "deferReason": "<reason>"
}
```

Write the updated findings.json back to `PROJECT_ROOT/.claude/pilot/audit/findings.json`.

---

## Step 10 — Generate PR description

Write to `PROJECT_ROOT/.claude/pilot/audit/PR-<tier>-<n>.md`:

```markdown
## Security: fix <tier> findings (<date>)

**Branch:** pilot/fix-<tier>-<n>  
**Findings fixed:** <count> of <total open>  
**Files changed:** <M>  
**Build:** pass · **Tests:** pass (<N> tests, <P> passed)

### Changes

| ID | Title | File | Fix |
|----|-------|------|-----|
| VULN-NNN | <title> | <file>:<line> | <one-line fix description> |

### Verification

For each finding: how to confirm it is resolved (e.g., "run the search endpoint with `name=' OR 1=1--` and confirm 400 Bad Request").

### Breaking changes

<List any API surface changes, or "None.">

### Deferred / out of scope

<List any findings excluded with reason, or "None.">
```

---

## Step 11 — Final output

Print in chat:

```
## pilot/fix-<tier>-<n> — ready for review

Branch:      pilot/fix-<tier>-<n>
Files:       <M> changed, <L> insertions, <D> deletions
Build:       pass
Tests:       <N> passed, 0 failed

Fixed findings:
  VULN-NNN  <title>  (<file>:<line>)
  ...

PR description → .claude/pilot/audit/PR-<tier>-<n>.md

Run /fsp-audit to verify the updated P<tier> count.
```

Print the `git diff --stat HEAD` output so the user can review the scope without opening files.

Files in this skill

  • SKILL.md9.1 KB
  • fix-strategies.md10 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.