Skip to content
Development
Skill

/night-market-change-control

Classify, gate, and review changes. Use when landing a PR, releasing, or amending rules. Do not use for failure triage; use night-market-debugging-playbook.

From plugin
claude-night-market
337200 skills59 agents162 commands1 MCP
Install
$ npx -y skills add athola/claude-night-market --skill night-market-change-control --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/night-market-change-control

Context preview

The summary Claude sees to decide when to auto-load this skill.

Classify, gate, and review changes. Use when landing a PR, releasing, or amending rules. Do not use for failure triage; use night-market-debugging-playbook.

SKILL.md

night-market-change-control.SKILL.md
name: night-market-change-control
description: 'Classify, gate, and review changes. Use when landing a PR, releasing, or amending rules. Do not use for failure triage; use night-market-debugging-playbook.'

Night Market Change Control

Every change to this repo passes through a fixed law stack, a classification step, and a gauntlet of automated gates. This skill tells you which class your change is, which gates it must pass, and which rules are non-negotiable because a past incident made them so. Nothing here may be routed around: if a gate fails, fix the cause, never the gate.

Jargon used below: a "gate" is any automated check that can block a commit, PR, or release. An "ADR" is an Architecture Decision Record in `docs/adr/`. The "Iron Law" is constitution rule 3: no implementation without a failing test first.

The law stack

When two documents conflict, the higher one wins.

| Rank | Source | Contents | |------|--------|----------| | 1 | `CONSTITUTION.md` | 10 immutable rules, override and amendment process | | 2 | `.claude/rules/` | 8 project rules (markdown style, read budgets, slop gates, invariants) | | 3 | `docs/adr/` | 17 numbered decision records (0001 to 0017) | | 4 | Guides in `docs/` | quality-gates, testing-guide, plugin-development-guide |

A skill, hook, or agent instruction that says "skip rule N" without an explicit user grant or a merged amendment is itself a defect (CONSTITUTION.md, Override mechanism section).

The ten constitution rules

One line each. Where a rule was written in blood, the incident column names the blood.

| # | Rule | Motivating incident | |---|------|---------------------| | 1 | Disclose AI involvement in every PR; never strip real or add fake AI attribution | Enforced by hook `plugins/imbue/hooks/vow_no_ai_attribution.py` | | 2 | AI commits over 200 changed lines need a spec, ADR, or plan doc first (lockfiles, fixtures, snapshots excluded) | Size = scrutiny principle; see the unbloat incident under non-negotiables | | 3 | Iron Law TDD: failing test before implementation for plugin Python. Skills and prose need structural tests (`test_skill_<name>.py`) | Design principle, no single incident | | 4 | One identity leak ("As a large language model") in any committed artifact is an automatic revert | Pattern catalog in scribe slop-detector | | 5 | Quality claims ("fast", "production-ready") need in-repo evidence or deletion | Design principle | | 6 | No bypassing gates: no `--no-verify`, no `SKIP=hook`, no unauthorized force push, no bare suppression comments without a stated reason | Neutered-mypy incident (CHANGELOG 1.9.12); bulk-ignore revert `06b9b1db` | | 7 | New dependencies need justification; 18 months unmaintained is presumed abandoned; verify AI-suggested package names against the registry | Slopsquatting defense; hook `guard_package_hallucination.py` (imbue) | | 8 | Docs cost reader-time (audience x frequency x per-read time); writing effort must match | Design principle | | 9 | Prefer deletion over rewriting; AI slop is overwhelmingly additive | Design principle | | 10 | Errors are not optional: propagate by default, no bare except, safe-to-discard needs an inline "why" comment | Silent-failure sweep `666171c3`; ecosystem bare-except campaign |

Change classification

Classify before the first commit. The class decides the paperwork.

| Change | Required process | |--------|------------------| | AI-generated diff, 200 changed lines or fewer | Plain PR through the standard gates | | AI-generated diff over 200 changed lines | Spec, ADR, or planning doc BEFORE the code (rule 2) | | Load-bearing design decision | Numbered ADR in `docs/adr/` (next number after 0017) | | New project-wide rule | New file in `.claude/rules/` via plain PR; existing rules cite an origin issue or discussion (#454, #457) | | Constitution amendment | PR titled `constitution: amend rule N`, a summary of what changes and why, sign-off from the repo owner | | Release | Version bump, changelog section, v-prefixed tag (lifecycle below) |

The change lifecycle

1. Branch

Branch from `master` (the main branch) using `<topic>-<version>`:

git checkout master && git pull
git checkout -b my-topic-1.9.16

Live examples in `git branch -a`: `ai-slop-1.9.4`, `bugfixes-1.9.5`, `discussions-fix-1.9.14`. Never delete `backup/unbloat-*` branches. They are the recovery points for past deletion campaigns (`backup/unbloat-20260328` is how the 2026-03-28 over-deletion was undone).

2. Local gates before committing

make lint          # ruff format + ruff check --fix + bandit
make typecheck     # per-plugin strict mypy (all plugins)
make test          # per-plugin pytest via scripts/run-plugin-tests.sh
make validate-all  # plugin structure validation

Plugin tests MUST run per plugin (`make <plugin>-test` or `make -C plugins/<plugin> test`). Root pytest excludes `plugins/*` to avoid import-path collisions.

3. The pre-commit gauntlet

`git commit` runs `.pre-commit-config.yaml` hooks in this order (verified 2026-07-02):

1. Suppression guards: `check-noqa` (blocks bare inline lint suppressions), `check-docstring-quality`, `check-json-utils-drift`, `check-per-file-ignores`. 2. Hook registration: `check-hook-registrations`, `check-plugin-hooks`. 3. Code gates: `run-plugin-typecheck --all` (strict mypy on every plugin, not just changed ones), `run-plugin-tests --changed`. 4. Skill and plugin validation: `validate-skill-descriptions`, one `validate-<plugin>-plugin` hook per plugin, `check-context-optimization`, `validate-description-budget`, `check-markdown-links`, `capabilities-sync-check`, `check-skill-graph-drift`, `check-skill-exit-criteria-drift`. 5. Standard file hygiene (trailing whitespace, YAML/TOML/JSON syntax, merge conflicts, debug statements). 6. `bandit` security scan. 7. `ruff-format`, `ruff-fix`, `ruff-check`. 8. Pin freshness: `check-ruff-version`, `check-pinned-versions`.

The typecheck gate

Read more
Ships withclaude-night-market

A plugin marketplace for Claude Code. Install only the plugins you need to run git workflows, code review, spec-driven development, and autonomous agents from inside your Claude Code session.

Get the whole plugin

Other skills on claude-night-market.