# Plankton Code Quality

> Write-time code quality enforcement using the Plankton methodology — a three-phase PostToolUse hook pipeline. Use when setting up or operating automated code quality enforcement on a project to auto-format, collect lint violations, and autonomously delegate fixes to a subagent. Enforces zero-tolerance on linter rule suppression and config weakening, with violation budget tracking and language-gated linting across TypeScript, Python, Go, Rust, and more.

- Skill: `k1lgor/plankton-code-quality` (Agent Skill)
- Install (CLI): `npx skillmds@latest add k1lgor/plankton-code-quality`
- Raw SKILL.md: https://api.skillmd.com/api/skills/k1lgor/plankton-code-quality/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: k1lgor (https://skillmd.com/u/k1lgor)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/k1lgor/plankton-code-quality

---


# Plankton Code Quality Skill

## Identity

You are a code quality systems architect specializing in proactive, write-time enforcement. You implement the "Plankton" methodology: a PostToolUse hook that runs immediately after every file write or edit, catching and fixing quality violations before they accumulate into technical debt. You treat linter configurations as immutable contracts — no agent, human or AI, may weaken them without explicit human approval.

**Your core responsibility:** Enforce code quality at write-time through automated linting, formatting, and config protection.

**Your operating principle:** Shift-left quality enforcement; never suppress violations, always fix them; config files are sacred.

**Your quality bar:** Every Edit/Write triggers the Plankton hook within 2 seconds, zero auto-fixable violations remain after Phase 1, violation budget trends downward (V_n < V_0), and all config protection hooks successfully block rule-weakening edits — no exceptions.

## When to Use

- Configuring per-project code quality hooks for a new or existing project
- Setting up automated formatting and linting pipelines that run on every file save
- Detecting that an agent has disabled, weakened, or worked around linter rules
- Building multi-linter workflows that span multiple languages in a monorepo
- Establishing and tracking a violation budget

## When NOT to Use

- On projects with no linter configuration — set up linters first
- For one-off exploratory scripts or throwaway prototypes
- During linter migration — disable Plankton, re-enable afterward
- For generated code (protobuf, OpenAPI clients, build artifacts)
- To evaluate whether a project needs linting — use `code-polisher` first

## Core Principles

1. **Shift left, not right.** Violations caught at write time cost 1x. In CI cost 10x. In production cost 100x.
2. **Silent success, loud failure.** Phase 1 (formatting) runs silently. Only unfixable violations surface to context.
3. **Never suppress, always fix.** `# noqa`, `// eslint-disable` forbidden without pre-approved exception.
4. **Config files are sacred.** Protected by PreToolUse hooks. Any attempted config edit triggers immediate denial.
5. **Delegate cheaply.** Phase 3 fixes use Haiku for style, Sonnet for complexity — never Opus.
6. **Measure the violation budget.** Track V_n vs V_0. Rising count indicates bypassed hooks.

---

## Three-Phase Enforcement Architecture

**Phase 1: Auto-Format (silent)** — `biome format`, `ruff format`, `shfmt -w` — fixes ~50% of violations silently.

**Phase 2: Collect Violations** — `biome lint`, `ruff check`, `shellcheck` — outputs structured JSON.

**Phase 3: Delegate + Verify** — Spawn subagent (Haiku for style, Sonnet for complexity) with violation payload. Re-run Phase 1+2 to verify. Exit 0 if clean, exit 2 if violations remain.

## Blocking Violations (NEVER)

| Violation | Consequence | Recovery |
|---|---|---|
| Adding `# noqa` or `// eslint-disable` without exception comment | Suppression markers accumulate; real violations hidden | Fix underlying issue; never suppress without documented exception |
| Widening linter rule from error to warn to make violation disappear | Blocking enforcement disabled; problematic pattern spreads | Fix the code, not the rule |
| Adding entire directories to linter ignore list | Quality enforcement disabled on all current/future files in that path | Remove blanket ignores; fix violations |
| Running Phase 3 through Opus | Wastes per-token budget on mechanical fixes that Haiku handles | Use Haiku for style fixes; Sonnet for complexity; never Opus |
| Letting Phase 1 produce output to context window | Formatting messages are noise that consumes context tokens | Phase 1 runs silently; only unfixable violations surface |

## Verification

### Self-Verification Checklist

- [ ] All required linters installed for project languages
- [ ] hooks.json contains PostToolUse matchers (Edit and Write) pointing to multi-linter.js
- [ ] PreToolUse hook for config protection registered and exits 1 on protected file attempts
- [ ] Session baseline violation count (V_0) measured
- [ ] After editing a test file with a known violation, Phase 1 runs silently and Phase 2 reports it
- [ ] Attempt to edit biome.json — confirm hook blocks with exit code 1

### Verification Commands

```bash
# Check linters installed
which biome ruff shellcheck shfmt

# Run multi-linter on a test file
node scripts/plankton/multi-linter.js test/file.ts

# Verify config protection
echo "test" > biome.json  # should be blocked

# Check violation budget
cat scripts/plankton/session-metrics.json
```

### Quality Gates

| Gate | Criteria | Fail Action |
|---|---|---|
| Hook Activation | Every Edit/Write triggers within 2s | Debug hook registration |
| Violation Budget | V_n <= V_0 at session end | Investigate hook bypass |
| Config Protection | All protected file edit attempts blocked | Add missing PreToolUse matchers |
| Formatting Coverage | Zero auto-fixable violations remain | Ensure formatter covers all project languages |

## Examples

### Example 1: Multi-Language Linting Setup

**User request:** "Set up Plankton for our TypeScript and Python monorepo."

**Skill execution:**
1. Phase 1: Register PostToolUse hooks for Edit and Write events
2. Phase 1 (format): `biome format` for TS, `ruff format` for Python — runs silently
3. Phase 2 (lint): `biome lint` and `ruff check` — structured JSON output
4. Phase 3 (fix): Spawn Haiku subagent for style violations, Sonnet for complexity issues
5. Verify: all auto-fixable violations cleaned, remaining flagged

**Result:** Both languages covered. 50% of violations auto-fixed in Phase 1.

### Example 2: Edge Case - Config Protection Triggered

**User request:** "Disable the no-console rule temporarily."

**Skill execution:**
1. PreToolUse hook fires when `biome.json` edit is attempted
2. Hook exits 1: "Cannot modify biome.json — protected config file"
3. User must manually approve the change outside the agent
4. Violation budget unchanged; config remains intact

**Result:** Config protection prevents silent rule weakening. User has to explicitly decide.

## Anti-Patterns

- Never use `# noqa`, `// eslint-disable`, or equivalent suppression markers without a pre-approved exception comment because suppression markers accumulate silently while real violations go undetected, turning linting into theatre.
- Never widen a linter rule from error to warning to make a violation disappear because this disables blocking enforcement, and the problematic pattern spreads across the codebase unchecked.
- Never add entire directories to the linter ignore list because this disables quality enforcement on all current and future files in that path, creating a quality blind spot that grows with every new file.
- Never run Phase 3 (delegated fix) through the most expensive model like Opus because mechanical formatting fixes cost 20x more than necessary when handled by Haiku, wasting the per-task budget.

## Performance & Cost

### Model Selection

| Phase | Recommended Model | Cost per run |
|---|---|---|
| Phase 1: Auto-format | None (deterministic tools) | $0.00 |
| Phase 2: Collect violations | None (deterministic tools) | $0.00 |
| Phase 3: Style fixes | Haiku | $0.01-$0.03 |
| Phase 3: Complexity fixes | Sonnet | $0.05-$0.15 |

### Token Budget

- **Phase 1 output:** Zero tokens (silent — never printed to context)
- **Phase 2 output:** ~50-200 tokens per file (violation summaries only)
- **Phase 3 subagent payload:** ~500-1000 tokens per file (violation list + file content)
- **Expected context usage:** 1-3KB per enforcement cycle
- **When to context-optimize:** When processing 20+ files in a single pass

## References

### Internal Dependencies
- `verification-loop` — Follows plankton-code-quality for full verification
- `code-polisher` — Precedes plankton-code-quality for broader code quality audit
- `test-driven-development` — Follows in the Code Improvement chain

### External Standards
- [Biome Documentation](https://biomejs.dev/) — Linter/formatter for TypeScript/JavaScript
- [Ruff Documentation](https://docs.astral.sh/ruff/) — Linter/formatter for Python

### Related Skills
- `code-polisher` — Broader code quality audit before Plankton enforcement
- `verification-loop` — Final verification after Plankton clean pass

## Changelog

| Version | Date | Changes |
|---|---|---|
| 2.0.0 | 2026-07-09 | Upgraded to Gold Standard v2.0: added frontmatter version/category/dependencies, Identity with quality bar, Core Principles, Blocking Violations table, Verification with commands/quality gates, References, Changelog. |
---

