Skip to content
Agentmart
Submit a tool

ccr-summary

CCR summary, summarize a CCR, Consumer Confidence Report PDF, water quality report PDF, 40 CFR 141.156, § 141.156 summary

Skill by KroniK907

IndexedMIT
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/kronik907-ccr-summary

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

CCR summary, summarize a CCR, Consumer Confidence Report PDF, water quality report PDF, 40 CFR 141.156, § 141.156 summary

Use cases: documents

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/ccr-summary

What's inside

Skill name
ccr-summary
Description
CCR summary, summarize a CCR, Consumer Confidence Report PDF, water quality report PDF, 40 CFR 141.156, § 141.156 summary
License
MIT
Instructions
269 lines in SKILL.md · view on GitHub

Files (3)

  • SKILL.md
  • example.md
  • requirements.md

SKILL.md (first lines)

# CCR Summary (40 CFR § 141.156)

Generate the **opening summary** for a CCR by reading the full report PDF and mapping findings to [40 CFR § 141.156](https://www.law.cornell.edu/cfr/text/40/141.156). The summary is **not** a rewrite of the whole report. It states what consumers need first.

**Scope note:** This workflow **excludes § 141.156(c)(2)** (limited English proficiency / translated reports). Only include that block if the user explicitly asks and the system is subject to § 141.153(h)(3).

**Local references** (in this repo): `40 CFR § 141.153…html`, `40 CFR § 141.155…html`, `40 CFR § 141.156…html`.

For the full regulatory checklist and PDF search patterns, read [requirements.md](requirements.md). For a worked small-system example, read [example.md](example.md).

---

## Heading rule (do not skip)

**All subsection headings in summary output MUST be h5 - five hash marks (`#####`) in markdown.**

| Correct | Wrong |
|-----------|---------|
| `##### Your water at a glance` | `## Your water at a glance` |
| `##### How to get more information` | `### How to get more information` |
| `##### Paper copy of this report` | `#### Paper copy of this report` |

- **Opening paragraphs:** no heading (the printed report supplies the title).
- **Subsections below the opening:** `#####` only - never `#`, `##`, `###`, or `####`.
- **§ 141.156(f) sharing block:** omit the heading if the layout supplies it; if you include one, it must still be `##### Please share this report`.

This matches the CCR layout template. Using `##` or other levels will break formatting.

---

## Workflow

Copy this checklist and mark items as you go:

```
CCR summary progress:
- [ ] Step 1: Extract full PDF text
- [ ] Step 2: Identify system metadata and delivery context
- [ ] Step 3: Scan for violations/compliance (required sources)
- [ ] Step 4: Extract contact information
- [ ] Step 5: Evaluate conditional § 141.156(c) and (e) items
- [ ] Step 6: Draft summary using template (**subsection headings = `#####` / h5 only**)
- [ ] Step 7: Compliance self-check (**verify h5 headings before sending**)
```

### Step 1: Extract full PDF text

Do not rely on partial reads. Extract **every page** to a UTF-8 text file (avoids Windows console encoding errors):

```python
from pypdf import PdfReader

path = r"<absolute-path-to-ccr.pdf>"
out = r"<absolute-path-to-extract.txt>"
reader = PdfReader(path)
with open(out, "w", encoding="utf-8") as f:
    for i, page in enumerate(reader.pages):
        f.write(f"--- PAGE {i+1} ---\n")
        f.write(page.extract_text() or "")
        f.write("\n\n")
```

If `pypdf` is missing: `pip install pypdf`. If extraction is empty or garbled, tell the user the PDF may be scanned - OCR will be needed before summarizing.

### Step 2: System metadata and delivery context

Record from the report (usually cover, footer, or “System Contact”):

| Field | Where to look |
|-------|----------------|
| System name | Title / header |
| PWSID | Header or contact block |
| Report year / monitoring period | Title (“For The Year Of …”) |
| Population served | Sometimes in header or certification (not always in PDF) |
| Delivery method | Cover “online version,” QR code, website URL, mail/email notices |

**Delivery drives conditionals:**

- **Paper mail/hand delivery only** → § 141.156(c)(1) usually **not** needed.
- **Website link, email link, or other electronic delivery** (§ 141.155(a)(1)(ii)-(iv)) → summary **must** include directions to request a **paper copy** per § 141.155(a)(2). Use the system’s actual request process if stated; otherwise use the regulatory minimum (contact phone/email/mail).

**Biannual / 6-month update (§ 141.156(e)):** Required only if the system serves **≥ 10,000 persons** and distributes twice per year (§ 141.155(j)(2)). Small systems like mobile home parks typically **skip (e)** unless the report itself states biannual delivery.

### Step 3: Violations and compliance summary (§ 141.156(b)(1))

Summarize **only what appears in the report** for the monitoring period covered. Source sections in the **full report** (not only the summary you are writing):

| CFR source | What to find in the PDF |
|------------|-------------------------|
| **§ 141.153(d)(6)** | Contaminant tables: `Violation` = Y/Yes; values over MCL/MRDL/TT; narrative “violation,” “exceeded,” “failed to meet.” Include length, health effects language, and corrective actions if provided. |
| **§ 141.153(d)(8)** | Lead **action level** exceedance: 90th percentile or `Samples > AL` > 0; lead exceedance explanation; consumer steps to reduce exposure; corrective actions. |
| **§ 141.153(f)** | NPDWR compliance violations **other than** contaminant-level exceedances already in (d)(6): monitoring/reporting failures, filtration/disinfection (subpart H), lead/copper **rule** violations (failure to complete required actions - not the same as AL exceedance in (d)(8)), subpart K, recordkeeping, §§ 141.40/141.41 monitoring, variance/exemption/order violations. |
| **§ 141.153(h)(6)** | Groundwater Rule (subpart S): uncorrected **significant deficiency**, fecal indicator-positive source, state-approved correction plan - often a dedicated section. |
| **§ 141.153(h)(7)** | Revised Total Coliform Rule (subpart Y): Level 1/2 assessments, E. coli MCL, missed assessments/corrective actions - often a dedicated section. |

**If no violations in any category:** State clearly that the report shows **no violations** of drinking water standards for the period covered (still required content for (b)(1)).

**Do not treat as violations:**

- Educational arsenic/lead text when MCL/AL are met
- Monitoring **waivers** (e.g., SOC, asbestos) unless the report says a violation occurred
- Detected contaminants **below** MCL/AL with `Violation` = N

**Testing waivers (optional one-sentence summary):** If the report has a “Testing Waivers” (or similar) section and the system had **no violations**, you may add **one short plain-language sentence** in **Your water at a glance** so readers know skipped tests are not problems. **Do not** name EPA, the state, primacy agency, or any regulator as who granted the waiver - the report may say “EPA,” “State,” or “ADEC,” but the summary must stay **agency-neutral**.

| Avoid | Use instead |
|-------|-------------|
| “when EPA allowed us to skip tests” | “we were not required to run some tests” |
| “EPA granted a waiver” | “some tests do not apply to our system” |
| “ADEC/the State approved…” | (omit agency name entirely) |

**Example (plain language):** “We also did not run some tests (for example, asbestos and certain chemicals) because they do not apply to our system. Skipping those tests is **not** a violation.”

See [requirements.md](requirements.md) for subsection detail and search keywords.

### Step 4: Contact information (§ 141.156(b)(2) / § 141.153(h)(2))

Include **telephone** (required) for owner, operator, or designee. Also include name, email, and address when present. Prefer the block labeled “System Contact,” “Operator Contact,” or end-of-report contact.

From KroniK907/agent-config, MIT.

More from KroniK907/agent-config

Signals

Stars
0
Forks
0
Open issues
7
Last commit (this folder)
Sep 26, 2026 (1 month ago)
Last release
Sep 23, 2026 (1 month ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from KroniK907

Cite this page

ccr-summary skill. Agent Mart. https://agentmart.dev/skills/kronik907-ccr-summary (last updated 2026-10-24)