mistake-to-constraint · git:20261006.876cce4 · 2026-10-06 · sha256 55cfb475729bdaf8

mistake-to-constraint git:20261006.876cce4A

Immutable. This exact content never changes and is served at /api/v1/blob/55cfb475729bdaf8.

---
name: mistake-to-constraint
description: Use when a mistake repeats. Encode it as the strongest guard — type or runtime, lint, test, directory convention, then a rules line — and log it in CONSTRAINTS.md.
license: MIT
disable-model-invocation: true
---

# Mistake to constraint

A repeated mistake is an environment bug. Do not add another prompt paragraph first.

## Order (strongest first)

1. **Type narrowing or runtime guard** — make the illegal state unrepresentable. See `templates/runtime-guard.py`.
2. **Lint rule** — copy `templates/eslint-rule.cjs` or `templates/semgrep-rule.yml`. Prefer an existing ruff selector from `templates/ruff-snippet.toml` before a new plugin.
3. **Test** — a regression that fails if the mistake returns.
4. **Directory convention** — put the dangerous thing in a folder that review and CI already treat as special.
5. **Rules line** — last. Only when 1–4 cannot hold the line.

## Ledger

Keep `CONSTRAINTS.md` at the repo root of the consuming project. Start from the template next to this skill.

Each row: date, mistake, guard added, kind (`type` / `runtime` / `lint` / `test` / `directory` / `rules`).

## Rules

- One mistake, one guard. Do not stack a lint rule and a rules line for the same bug unless the lint cannot see it.
- Do not install ESLint, ruff, or semgrep. Wire the template into tools the repo already runs.
- Do not file tracker issues. Open a draft PR with the guard and a verify-loop command.