Skip to content

/add

Register a deferred decision in the debt registry. Trigger by judgment, not a marker scan, whenever a future reader would ask "why this way?": an unmade decision, stub, loosened type, bypassed check, swallowed error, a default picked "for now", or a TODO/FIXME/HACK/XXX marker.

shell
$ npx -y skills add bcanfield/agentic-tech-debt --skill add --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.
  • You can call itInvoke it directly when you want it.
  • Slash command/add
How auto-invocation works

Context preview

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

Register a deferred decision in the debt registry. Trigger by judgment, not a marker scan, whenever a future reader would ask "why this way?": an unmade decision, stub, loosened type, bypassed check, swallowed error, a default picked "for now", or a TODO/FIXME/HACK/XXX marker.

SKILL.md

add.SKILL.md
name: add
description: 'Register a deferred decision in the debt registry. Trigger by judgment, not a marker scan, whenever a future reader would ask "why this way?": an unmade decision, stub, loosened type, bypassed check, swallowed error, a default picked "for now", or a TODO/FIXME/HACK/XXX marker. Trigger immediately whenever you defer work, or when the user invokes /debt-ops:add. Over-register freely; the developer drops with "drop A", "drop A,C", or "drop all".'
allowed-tools: Bash(python3 *), Bash(rm *)
# Hidden from `npx skills` discovery — this copy ships in the Claude Code plugin (uses ${CLAUDE_PLUGIN_ROOT}); the portable skills/ copy is the one for the skills CLI.
metadata:
  internal: true

/debt-ops:add — register a tech-debt entry

Call `register.py` via Bash. The helper writes the entry under the repo's detected registry dir (default `docs/debt/`), assigns a short batch letter (A, B, C…), and prints exactly one line: `+1 entry: <slug> (<letter>)`. That stdout IS the user-facing announcement — add no commentary before or after.

The call

python3 ${CLAUDE_PLUGIN_ROOT}/skills/add/scripts/register.py \
  --slug <slug> \
  --principal <effort, e.g. 2d, 1w, unknown> \
  --interest <ongoing cost, e.g. "+30min/incident", unknown> \
  --hotspot <path or module, e.g. pricing/engine.ts, unknown> \
  --business-capability <e.g. checkout, billing, unknown> \
  --payoff-trigger <concrete trigger, or "unknown"> \
  --quadrant <reckless-inadvertent|reckless-deliberate|prudent-inadvertent|prudent-deliberate> \
  --category <migration|documentation|testing|code_quality|dead_code|code_rot|expertise|release|infrastructure|planning> \
  --ai-authored <true|false> <<'EOF'
<body: 2-5 sentences — what the debt is, why it exists, observed symptoms>
EOF

The helper:

  • Generates the timestamp `id` itself (no `date` call needed).
  • Resolves filename collisions when two registrations land in the same second.
  • Tracks the letter mapping in `$CLAUDE_PLUGIN_DATA/cache/<repo-hash>/current-turn.txt` so the user can drop by letter.

Slug

1–4 word kebab-case label of what the debt is. Examples: `cancelled-promotion-callback`, `legacy-auth-shim`, `unfinished-rate-limiter`. Keep it short — the body carries the context.

Schema notes

  • **Quadrant** (Fowler): `reckless-inadvertent` (didn't know better), `reckless-deliberate` (knew, did it anyway), `prudent-inadvertent` (learned afterward), `prudent-deliberate` (deliberate, with a payoff plan).
  • **Category** (Google / Jaspan-Green): pick the closest match.
  • **payoff_trigger: unknown** is first-class. Don't manufacture a trigger to fill the field — `unknown` ages into stale review and that's the point.
  • **ai_authored: true** is the leading behavioral signal — be honest.

Drops

  • `drop A`, `drop A,C`, `drop all` — the user types this; a UserPromptSubmit hook deletes the matching entries and surfaces a one-line confirmation. You don't act on those.
  • `drop it` or `drop <slug>` — you delete it yourself: `rm <registry-dir>/<id>-<slug>.md` (the registry dir named in Discipline 3; default `docs/debt/`). Treat dropping as cheap — over-registering is the intended posture.

Don't

  • Don't ask the developer for confirmation before writing. Discipline 1 says "no permission prompt; just do it."
  • Don't use the `Write` tool to create the file directly — letter assignment depends on going through `register.py`.
  • Don't echo or paraphrase the helper's output. The Bash tool result is already visible to the user.
  • Don't fill `payoff_trigger` with a guess to seem certain.
Read more
Read it on GitHub ↗
Ships withagentic-tech-debt

Catches AI-introduced tech debt at write-time Works with any coding agent. Any stack. Two decades of tech-debt research, distilled into a plugin and validated across dozens of codebases.

Get the whole plugin, auto-invoked
Stats
9
Stars
0
Views
1
Forks
Active
Maintenance
Python
Language
MIT
License
1d ago
Last commit
3mo ago
Created

Repo: bcanfield/agentic-tech-debt

Other skills on agentic-tech-debt.